This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[patch@27529] thread.h - VMS needs more stack
[perl5.git] / sv.c
CommitLineData
a0d0e21e 1/* sv.c
79072805 2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
b94e2f88 4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 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
JH
32#ifdef PERL_UTF8_CACHE_ASSERT
33/* The cache element 0 is the Unicode offset;
34 * the cache element 1 is the byte offset of the element 0;
35 * the cache element 2 is the Unicode length of the substring;
36 * the cache element 3 is the byte length of the substring;
37 * The checking of the substring side would be good
38 * but substr() has enough code paths to make my head spin;
39 * if adding more checks watch out for the following tests:
40 * t/op/index.t t/op/length.t t/op/pat.t t/op/substr.t
41 * lib/utf8.t lib/Unicode/Collate/t/index.t
42 * --jhi
43 */
44#define ASSERT_UTF8_CACHE(cache) \
bb7bbd9c 45 STMT_START { if (cache) { assert((cache)[0] <= (cache)[1]); } } STMT_END
e23c8137
JH
46#else
47#define ASSERT_UTF8_CACHE(cache) NOOP
48#endif
49
f8c7b90f 50#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 51#define SV_COW_NEXT_SV(sv) INT2PTR(SV *,SvUVX(sv))
607fa7f2 52#define SV_COW_NEXT_SV_SET(current,next) SvUV_set(current, PTR2UV(next))
b5ccf5f2 53/* This is a pessimistic view. Scalar must be purely a read-write PV to copy-
765f542d 54 on-write. */
765f542d 55#endif
645c22ef
DM
56
57/* ============================================================================
58
59=head1 Allocation and deallocation of SVs.
60
d2a0f284
JC
61An SV (or AV, HV, etc.) is allocated in two parts: the head (struct
62sv, av, hv...) contains type and reference count information, and for
63many types, a pointer to the body (struct xrv, xpv, xpviv...), which
64contains fields specific to each type. Some types store all they need
65in the head, so don't have a body.
66
67In all but the most memory-paranoid configuations (ex: PURIFY), heads
68and bodies are allocated out of arenas, which by default are
69approximately 4K chunks of memory parcelled up into N heads or bodies.
93e68bfb
JC
70Sv-bodies are allocated by their sv-type, guaranteeing size
71consistency needed to allocate safely from arrays.
72
d2a0f284
JC
73For SV-heads, the first slot in each arena is reserved, and holds a
74link to the next arena, some flags, and a note of the number of slots.
75Snaked through each arena chain is a linked list of free items; when
76this becomes empty, an extra arena is allocated and divided up into N
77items which are threaded into the free list.
78
79SV-bodies are similar, but they use arena-sets by default, which
80separate the link and info from the arena itself, and reclaim the 1st
81slot in the arena. SV-bodies are further described later.
645c22ef
DM
82
83The following global variables are associated with arenas:
84
85 PL_sv_arenaroot pointer to list of SV arenas
86 PL_sv_root pointer to list of free SV structures
87
d2a0f284
JC
88 PL_body_arenas head of linked-list of body arenas
89 PL_body_roots[] array of pointers to list of free bodies of svtype
90 arrays are indexed by the svtype needed
93e68bfb 91
d2a0f284
JC
92A few special SV heads are not allocated from an arena, but are
93instead directly created in the interpreter structure, eg PL_sv_undef.
93e68bfb
JC
94The size of arenas can be changed from the default by setting
95PERL_ARENA_SIZE appropriately at compile time.
645c22ef
DM
96
97The SV arena serves the secondary purpose of allowing still-live SVs
98to be located and destroyed during final cleanup.
99
100At the lowest level, the macros new_SV() and del_SV() grab and free
101an SV head. (If debugging with -DD, del_SV() calls the function S_del_sv()
102to return the SV to the free list with error checking.) new_SV() calls
103more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
104SVs in the free list have their SvTYPE field set to all ones.
105
ff276b08 106At the time of very final cleanup, sv_free_arenas() is called from
645c22ef 107perl_destruct() to physically free all the arenas allocated since the
6a93a7e5 108start of the interpreter.
645c22ef
DM
109
110Manipulation of any of the PL_*root pointers is protected by enclosing
111LOCK_SV_MUTEX; ... UNLOCK_SV_MUTEX calls which should Do the Right Thing
112if threads are enabled.
113
114The function visit() scans the SV arenas list, and calls a specified
115function for each SV it finds which is still live - ie which has an SvTYPE
116other than all 1's, and a non-zero SvREFCNT. visit() is used by the
117following functions (specified as [function that calls visit()] / [function
118called by visit() for each SV]):
119
120 sv_report_used() / do_report_used()
f2524eef 121 dump all remaining SVs (debugging aid)
645c22ef
DM
122
123 sv_clean_objs() / do_clean_objs(),do_clean_named_objs()
124 Attempt to free all objects pointed to by RVs,
125 and, unless DISABLE_DESTRUCTOR_KLUDGE is defined,
126 try to do the same for all objects indirectly
127 referenced by typeglobs too. Called once from
128 perl_destruct(), prior to calling sv_clean_all()
129 below.
130
131 sv_clean_all() / do_clean_all()
132 SvREFCNT_dec(sv) each remaining SV, possibly
133 triggering an sv_free(). It also sets the
134 SVf_BREAK flag on the SV to indicate that the
135 refcnt has been artificially lowered, and thus
136 stopping sv_free() from giving spurious warnings
137 about SVs which unexpectedly have a refcnt
138 of zero. called repeatedly from perl_destruct()
139 until there are no SVs left.
140
93e68bfb 141=head2 Arena allocator API Summary
645c22ef
DM
142
143Private API to rest of sv.c
144
145 new_SV(), del_SV(),
146
147 new_XIV(), del_XIV(),
148 new_XNV(), del_XNV(),
149 etc
150
151Public API:
152
8cf8f3d1 153 sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
645c22ef 154
645c22ef
DM
155=cut
156
157============================================================================ */
158
4561caa4
CS
159/*
160 * "A time to plant, and a time to uproot what was planted..."
161 */
162
77354fb4
NC
163/*
164 * nice_chunk and nice_chunk size need to be set
165 * and queried under the protection of sv_mutex
166 */
167void
168Perl_offer_nice_chunk(pTHX_ void *chunk, U32 chunk_size)
169{
97aff369 170 dVAR;
77354fb4
NC
171 void *new_chunk;
172 U32 new_chunk_size;
173 LOCK_SV_MUTEX;
174 new_chunk = (void *)(chunk);
175 new_chunk_size = (chunk_size);
176 if (new_chunk_size > PL_nice_chunk_size) {
177 Safefree(PL_nice_chunk);
178 PL_nice_chunk = (char *) new_chunk;
179 PL_nice_chunk_size = new_chunk_size;
180 } else {
181 Safefree(chunk);
182 }
183 UNLOCK_SV_MUTEX;
184}
cac9b346 185
fd0854ff 186#ifdef DEBUG_LEAKING_SCALARS
22162ca8 187# define FREE_SV_DEBUG_FILE(sv) Safefree((sv)->sv_debug_file)
fd0854ff
DM
188#else
189# define FREE_SV_DEBUG_FILE(sv)
190#endif
191
48614a46
NC
192#ifdef PERL_POISON
193# define SvARENA_CHAIN(sv) ((sv)->sv_u.svu_rv)
194/* Whilst I'd love to do this, it seems that things like to check on
195 unreferenced scalars
196# define POSION_SV_HEAD(sv) Poison(sv, 1, struct STRUCT_SV)
197*/
198# define POSION_SV_HEAD(sv) Poison(&SvANY(sv), 1, void *), \
199 Poison(&SvREFCNT(sv), 1, U32)
200#else
201# define SvARENA_CHAIN(sv) SvANY(sv)
202# define POSION_SV_HEAD(sv)
203#endif
204
053fc874
GS
205#define plant_SV(p) \
206 STMT_START { \
fd0854ff 207 FREE_SV_DEBUG_FILE(p); \
48614a46
NC
208 POSION_SV_HEAD(p); \
209 SvARENA_CHAIN(p) = (void *)PL_sv_root; \
053fc874
GS
210 SvFLAGS(p) = SVTYPEMASK; \
211 PL_sv_root = (p); \
212 --PL_sv_count; \
213 } STMT_END
a0d0e21e 214
fba3b22e 215/* sv_mutex must be held while calling uproot_SV() */
053fc874
GS
216#define uproot_SV(p) \
217 STMT_START { \
218 (p) = PL_sv_root; \
bb7bbd9c 219 PL_sv_root = (SV*)SvARENA_CHAIN(p); \
053fc874
GS
220 ++PL_sv_count; \
221 } STMT_END
222
645c22ef 223
cac9b346
NC
224/* make some more SVs by adding another arena */
225
226/* sv_mutex must be held while calling more_sv() */
227STATIC SV*
228S_more_sv(pTHX)
229{
97aff369 230 dVAR;
cac9b346
NC
231 SV* sv;
232
233 if (PL_nice_chunk) {
234 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
bd61b366 235 PL_nice_chunk = NULL;
cac9b346
NC
236 PL_nice_chunk_size = 0;
237 }
238 else {
239 char *chunk; /* must use New here to match call to */
d2a0f284 240 Newx(chunk,PERL_ARENA_SIZE,char); /* Safefree() in sv_free_arenas() */
2e7ed132 241 sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
cac9b346
NC
242 }
243 uproot_SV(sv);
244 return sv;
245}
246
645c22ef
DM
247/* new_SV(): return a new, empty SV head */
248
eba0f806
DM
249#ifdef DEBUG_LEAKING_SCALARS
250/* provide a real function for a debugger to play with */
251STATIC SV*
252S_new_SV(pTHX)
253{
254 SV* sv;
255
256 LOCK_SV_MUTEX;
257 if (PL_sv_root)
258 uproot_SV(sv);
259 else
cac9b346 260 sv = S_more_sv(aTHX);
eba0f806
DM
261 UNLOCK_SV_MUTEX;
262 SvANY(sv) = 0;
263 SvREFCNT(sv) = 1;
264 SvFLAGS(sv) = 0;
fd0854ff
DM
265 sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
266 sv->sv_debug_line = (U16) ((PL_copline == NOLINE) ?
267 (PL_curcop ? CopLINE(PL_curcop) : 0) : PL_copline);
268 sv->sv_debug_inpad = 0;
269 sv->sv_debug_cloned = 0;
fd0854ff 270 sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
fd0854ff 271
eba0f806
DM
272 return sv;
273}
274# define new_SV(p) (p)=S_new_SV(aTHX)
275
276#else
277# define new_SV(p) \
053fc874
GS
278 STMT_START { \
279 LOCK_SV_MUTEX; \
280 if (PL_sv_root) \
281 uproot_SV(p); \
282 else \
cac9b346 283 (p) = S_more_sv(aTHX); \
053fc874
GS
284 UNLOCK_SV_MUTEX; \
285 SvANY(p) = 0; \
286 SvREFCNT(p) = 1; \
287 SvFLAGS(p) = 0; \
288 } STMT_END
eba0f806 289#endif
463ee0b2 290
645c22ef
DM
291
292/* del_SV(): return an empty SV head to the free list */
293
a0d0e21e 294#ifdef DEBUGGING
4561caa4 295
053fc874
GS
296#define del_SV(p) \
297 STMT_START { \
298 LOCK_SV_MUTEX; \
aea4f609 299 if (DEBUG_D_TEST) \
053fc874
GS
300 del_sv(p); \
301 else \
302 plant_SV(p); \
303 UNLOCK_SV_MUTEX; \
304 } STMT_END
a0d0e21e 305
76e3520e 306STATIC void
cea2e8a9 307S_del_sv(pTHX_ SV *p)
463ee0b2 308{
97aff369 309 dVAR;
aea4f609 310 if (DEBUG_D_TEST) {
4633a7c4 311 SV* sva;
a3b680e6 312 bool ok = 0;
3280af22 313 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
53c1dcc0
AL
314 const SV * const sv = sva + 1;
315 const SV * const svend = &sva[SvREFCNT(sva)];
c0ff570e 316 if (p >= sv && p < svend) {
a0d0e21e 317 ok = 1;
c0ff570e
NC
318 break;
319 }
a0d0e21e
LW
320 }
321 if (!ok) {
0453d815 322 if (ckWARN_d(WARN_INTERNAL))
9014280d 323 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
324 "Attempt to free non-arena SV: 0x%"UVxf
325 pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
a0d0e21e
LW
326 return;
327 }
328 }
4561caa4 329 plant_SV(p);
463ee0b2 330}
a0d0e21e 331
4561caa4
CS
332#else /* ! DEBUGGING */
333
334#define del_SV(p) plant_SV(p)
335
336#endif /* DEBUGGING */
463ee0b2 337
645c22ef
DM
338
339/*
ccfc67b7
JH
340=head1 SV Manipulation Functions
341
645c22ef
DM
342=for apidoc sv_add_arena
343
344Given a chunk of memory, link it to the head of the list of arenas,
345and split it into a list of free SVs.
346
347=cut
348*/
349
4633a7c4 350void
864dbfa3 351Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
463ee0b2 352{
97aff369 353 dVAR;
0bd48802 354 SV* const sva = (SV*)ptr;
463ee0b2
LW
355 register SV* sv;
356 register SV* svend;
4633a7c4
LW
357
358 /* The first SV in an arena isn't an SV. */
3280af22 359 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
360 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
361 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
362
3280af22
NIS
363 PL_sv_arenaroot = sva;
364 PL_sv_root = sva + 1;
4633a7c4
LW
365
366 svend = &sva[SvREFCNT(sva) - 1];
367 sv = sva + 1;
463ee0b2 368 while (sv < svend) {
48614a46 369 SvARENA_CHAIN(sv) = (void *)(SV*)(sv + 1);
03e36789 370#ifdef DEBUGGING
978b032e 371 SvREFCNT(sv) = 0;
03e36789
NC
372#endif
373 /* Must always set typemask because it's awlays checked in on cleanup
374 when the arenas are walked looking for objects. */
8990e307 375 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
376 sv++;
377 }
48614a46 378 SvARENA_CHAIN(sv) = 0;
03e36789
NC
379#ifdef DEBUGGING
380 SvREFCNT(sv) = 0;
381#endif
4633a7c4
LW
382 SvFLAGS(sv) = SVTYPEMASK;
383}
384
055972dc
DM
385/* visit(): call the named function for each non-free SV in the arenas
386 * whose flags field matches the flags/mask args. */
645c22ef 387
5226ed68 388STATIC I32
055972dc 389S_visit(pTHX_ SVFUNC_t f, U32 flags, U32 mask)
8990e307 390{
97aff369 391 dVAR;
4633a7c4 392 SV* sva;
5226ed68 393 I32 visited = 0;
8990e307 394
3280af22 395 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
53c1dcc0 396 register const SV * const svend = &sva[SvREFCNT(sva)];
a3b680e6 397 register SV* sv;
4561caa4 398 for (sv = sva + 1; sv < svend; ++sv) {
055972dc
DM
399 if (SvTYPE(sv) != SVTYPEMASK
400 && (sv->sv_flags & mask) == flags
401 && SvREFCNT(sv))
402 {
acfe0abc 403 (FCALL)(aTHX_ sv);
5226ed68
JH
404 ++visited;
405 }
8990e307
LW
406 }
407 }
5226ed68 408 return visited;
8990e307
LW
409}
410
758a08c3
JH
411#ifdef DEBUGGING
412
645c22ef
DM
413/* called by sv_report_used() for each live SV */
414
415static void
acfe0abc 416do_report_used(pTHX_ SV *sv)
645c22ef
DM
417{
418 if (SvTYPE(sv) != SVTYPEMASK) {
419 PerlIO_printf(Perl_debug_log, "****\n");
420 sv_dump(sv);
421 }
422}
758a08c3 423#endif
645c22ef
DM
424
425/*
426=for apidoc sv_report_used
427
428Dump the contents of all SVs not yet freed. (Debugging aid).
429
430=cut
431*/
432
8990e307 433void
864dbfa3 434Perl_sv_report_used(pTHX)
4561caa4 435{
ff270d3a 436#ifdef DEBUGGING
055972dc 437 visit(do_report_used, 0, 0);
96a5add6
AL
438#else
439 PERL_UNUSED_CONTEXT;
ff270d3a 440#endif
4561caa4
CS
441}
442
645c22ef
DM
443/* called by sv_clean_objs() for each live SV */
444
445static void
e15faf7d 446do_clean_objs(pTHX_ SV *ref)
645c22ef 447{
97aff369 448 dVAR;
823a54a3
AL
449 if (SvROK(ref)) {
450 SV * const target = SvRV(ref);
451 if (SvOBJECT(target)) {
452 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(ref)));
453 if (SvWEAKREF(ref)) {
454 sv_del_backref(target, ref);
455 SvWEAKREF_off(ref);
456 SvRV_set(ref, NULL);
457 } else {
458 SvROK_off(ref);
459 SvRV_set(ref, NULL);
460 SvREFCNT_dec(target);
461 }
645c22ef
DM
462 }
463 }
464
465 /* XXX Might want to check arrays, etc. */
466}
467
468/* called by sv_clean_objs() for each live SV */
469
470#ifndef DISABLE_DESTRUCTOR_KLUDGE
471static void
acfe0abc 472do_clean_named_objs(pTHX_ SV *sv)
645c22ef 473{
97aff369 474 dVAR;
f7877b28 475 if (SvTYPE(sv) == SVt_PVGV && isGV_with_GP(sv) && GvGP(sv)) {
c69033f2
NC
476 if ((
477#ifdef PERL_DONT_CREATE_GVSV
478 GvSV(sv) &&
479#endif
480 SvOBJECT(GvSV(sv))) ||
645c22ef
DM
481 (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
482 (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
483 (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
484 (GvCV(sv) && SvOBJECT(GvCV(sv))) )
485 {
486 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
ec5f3c78 487 SvFLAGS(sv) |= SVf_BREAK;
645c22ef
DM
488 SvREFCNT_dec(sv);
489 }
490 }
491}
492#endif
493
494/*
495=for apidoc sv_clean_objs
496
497Attempt to destroy all objects not yet freed
498
499=cut
500*/
501
4561caa4 502void
864dbfa3 503Perl_sv_clean_objs(pTHX)
4561caa4 504{
97aff369 505 dVAR;
3280af22 506 PL_in_clean_objs = TRUE;
055972dc 507 visit(do_clean_objs, SVf_ROK, SVf_ROK);
4561caa4 508#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 509 /* some barnacles may yet remain, clinging to typeglobs */
055972dc 510 visit(do_clean_named_objs, SVt_PVGV, SVTYPEMASK);
4561caa4 511#endif
3280af22 512 PL_in_clean_objs = FALSE;
4561caa4
CS
513}
514
645c22ef
DM
515/* called by sv_clean_all() for each live SV */
516
517static void
acfe0abc 518do_clean_all(pTHX_ SV *sv)
645c22ef 519{
97aff369 520 dVAR;
645c22ef
DM
521 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
522 SvFLAGS(sv) |= SVf_BREAK;
0e705b3b 523 if (PL_comppad == (AV*)sv) {
7d49f689 524 PL_comppad = NULL;
4608196e 525 PL_curpad = NULL;
0e705b3b 526 }
645c22ef
DM
527 SvREFCNT_dec(sv);
528}
529
530/*
531=for apidoc sv_clean_all
532
533Decrement the refcnt of each remaining SV, possibly triggering a
534cleanup. This function may have to be called multiple times to free
ff276b08 535SVs which are in complex self-referential hierarchies.
645c22ef
DM
536
537=cut
538*/
539
5226ed68 540I32
864dbfa3 541Perl_sv_clean_all(pTHX)
8990e307 542{
97aff369 543 dVAR;
5226ed68 544 I32 cleaned;
3280af22 545 PL_in_clean_all = TRUE;
055972dc 546 cleaned = visit(do_clean_all, 0,0);
3280af22 547 PL_in_clean_all = FALSE;
5226ed68 548 return cleaned;
8990e307 549}
463ee0b2 550
5e258f8c
JC
551/*
552 ARENASETS: a meta-arena implementation which separates arena-info
553 into struct arena_set, which contains an array of struct
554 arena_descs, each holding info for a single arena. By separating
555 the meta-info from the arena, we recover the 1st slot, formerly
556 borrowed for list management. The arena_set is about the size of an
557 arena, avoiding the needless malloc overhead of a naive linked-list
558
559 The cost is 1 arena-set malloc per ~320 arena-mallocs, + the unused
560 memory in the last arena-set (1/2 on average). In trade, we get
561 back the 1st slot in each arena (ie 1.7% of a CV-arena, less for
d2a0f284
JC
562 smaller types). The recovery of the wasted space allows use of
563 small arenas for large, rare body types,
5e258f8c 564*/
5e258f8c 565struct arena_desc {
398c677b
NC
566 char *arena; /* the raw storage, allocated aligned */
567 size_t size; /* its size ~4k typ */
568 int unit_type; /* useful for arena audits */
5e258f8c
JC
569 /* info for sv-heads (eventually)
570 int count, flags;
571 */
572};
573
e6148039
NC
574struct arena_set;
575
576/* Get the maximum number of elements in set[] such that struct arena_set
577 will fit within PERL_ARENA_SIZE, which is probabably just under 4K, and
578 therefore likely to be 1 aligned memory page. */
579
580#define ARENAS_PER_SET ((PERL_ARENA_SIZE - sizeof(struct arena_set*) \
581 - 2 * sizeof(int)) / sizeof (struct arena_desc))
5e258f8c
JC
582
583struct arena_set {
584 struct arena_set* next;
585 int set_size; /* ie ARENAS_PER_SET */
586 int curr; /* index of next available arena-desc */
587 struct arena_desc set[ARENAS_PER_SET];
588};
589
645c22ef
DM
590/*
591=for apidoc sv_free_arenas
592
593Deallocate the memory used by all arenas. Note that all the individual SV
594heads and bodies within the arenas must already have been freed.
595
596=cut
597*/
4633a7c4 598void
864dbfa3 599Perl_sv_free_arenas(pTHX)
4633a7c4 600{
97aff369 601 dVAR;
4633a7c4
LW
602 SV* sva;
603 SV* svanext;
93e68bfb 604 int i;
4633a7c4
LW
605
606 /* Free arenas here, but be careful about fake ones. (We assume
607 contiguity of the fake ones with the corresponding real ones.) */
608
3280af22 609 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
610 svanext = (SV*) SvANY(sva);
611 while (svanext && SvFAKE(svanext))
612 svanext = (SV*) SvANY(svanext);
613
614 if (!SvFAKE(sva))
1df70142 615 Safefree(sva);
4633a7c4 616 }
93e68bfb 617
5e258f8c
JC
618 {
619 struct arena_set *next, *aroot = (struct arena_set*) PL_body_arenas;
620
621 for (; aroot; aroot = next) {
96a5add6 622 const int max = aroot->curr;
5e258f8c
JC
623 for (i=0; i<max; i++) {
624 assert(aroot->set[i].arena);
625 Safefree(aroot->set[i].arena);
626 }
627 next = aroot->next;
628 Safefree(aroot);
629 }
630 }
dc8220bf 631 PL_body_arenas = 0;
fdda85ca 632
232d1c15 633 for (i=0; i<PERL_ARENA_ROOTS_SIZE; i++)
93e68bfb 634 PL_body_roots[i] = 0;
93e68bfb 635
43c5f42d 636 Safefree(PL_nice_chunk);
bd61b366 637 PL_nice_chunk = NULL;
3280af22
NIS
638 PL_nice_chunk_size = 0;
639 PL_sv_arenaroot = 0;
640 PL_sv_root = 0;
4633a7c4
LW
641}
642
bd81e77b
NC
643/*
644 Here are mid-level routines that manage the allocation of bodies out
645 of the various arenas. There are 5 kinds of arenas:
29489e7c 646
bd81e77b
NC
647 1. SV-head arenas, which are discussed and handled above
648 2. regular body arenas
649 3. arenas for reduced-size bodies
650 4. Hash-Entry arenas
651 5. pte arenas (thread related)
29489e7c 652
bd81e77b
NC
653 Arena types 2 & 3 are chained by body-type off an array of
654 arena-root pointers, which is indexed by svtype. Some of the
655 larger/less used body types are malloced singly, since a large
656 unused block of them is wasteful. Also, several svtypes dont have
657 bodies; the data fits into the sv-head itself. The arena-root
658 pointer thus has a few unused root-pointers (which may be hijacked
659 later for arena types 4,5)
29489e7c 660
bd81e77b
NC
661 3 differs from 2 as an optimization; some body types have several
662 unused fields in the front of the structure (which are kept in-place
663 for consistency). These bodies can be allocated in smaller chunks,
664 because the leading fields arent accessed. Pointers to such bodies
665 are decremented to point at the unused 'ghost' memory, knowing that
666 the pointers are used with offsets to the real memory.
29489e7c 667
bd81e77b
NC
668 HE, HEK arenas are managed separately, with separate code, but may
669 be merge-able later..
670
671 PTE arenas are not sv-bodies, but they share these mid-level
672 mechanics, so are considered here. The new mid-level mechanics rely
673 on the sv_type of the body being allocated, so we just reserve one
674 of the unused body-slots for PTEs, then use it in those (2) PTE
675 contexts below (line ~10k)
676*/
677
bd26d9a3 678/* get_arena(size): this creates custom-sized arenas
5e258f8c
JC
679 TBD: export properly for hv.c: S_more_he().
680*/
681void*
682Perl_get_arena(pTHX_ int arena_size)
683{
5e258f8c 684 struct arena_desc* adesc;
476a1e16 685 struct arena_set *newroot, **aroot = (struct arena_set**) &PL_body_arenas;
5e258f8c
JC
686 int curr;
687
476a1e16
JC
688 /* shouldnt need this
689 if (!arena_size) arena_size = PERL_ARENA_SIZE;
690 */
5e258f8c
JC
691
692 /* may need new arena-set to hold new arena */
476a1e16 693 if (!*aroot || (*aroot)->curr >= (*aroot)->set_size) {
5e258f8c
JC
694 Newxz(newroot, 1, struct arena_set);
695 newroot->set_size = ARENAS_PER_SET;
476a1e16
JC
696 newroot->next = *aroot;
697 *aroot = newroot;
698 DEBUG_m(PerlIO_printf(Perl_debug_log, "new arenaset %p\n", *aroot));
5e258f8c
JC
699 }
700
701 /* ok, now have arena-set with at least 1 empty/available arena-desc */
476a1e16
JC
702 curr = (*aroot)->curr++;
703 adesc = &((*aroot)->set[curr]);
5e258f8c
JC
704 assert(!adesc->arena);
705
5e258f8c
JC
706 Newxz(adesc->arena, arena_size, char);
707 adesc->size = arena_size;
d2a0f284
JC
708 DEBUG_m(PerlIO_printf(Perl_debug_log, "arena %d added: %p size %d\n",
709 curr, adesc->arena, arena_size));
5e258f8c
JC
710
711 return adesc->arena;
5e258f8c
JC
712}
713
53c1dcc0 714
bd81e77b 715/* return a thing to the free list */
29489e7c 716
bd81e77b
NC
717#define del_body(thing, root) \
718 STMT_START { \
00b6aa41 719 void ** const thing_copy = (void **)thing;\
bd81e77b
NC
720 LOCK_SV_MUTEX; \
721 *thing_copy = *root; \
722 *root = (void*)thing_copy; \
723 UNLOCK_SV_MUTEX; \
724 } STMT_END
29489e7c 725
bd81e77b 726/*
d2a0f284
JC
727
728=head1 SV-Body Allocation
729
730Allocation of SV-bodies is similar to SV-heads, differing as follows;
731the allocation mechanism is used for many body types, so is somewhat
732more complicated, it uses arena-sets, and has no need for still-live
733SV detection.
734
735At the outermost level, (new|del)_X*V macros return bodies of the
736appropriate type. These macros call either (new|del)_body_type or
737(new|del)_body_allocated macro pairs, depending on specifics of the
738type. Most body types use the former pair, the latter pair is used to
739allocate body types with "ghost fields".
740
741"ghost fields" are fields that are unused in certain types, and
742consequently dont need to actually exist. They are declared because
743they're part of a "base type", which allows use of functions as
744methods. The simplest examples are AVs and HVs, 2 aggregate types
745which don't use the fields which support SCALAR semantics.
746
747For these types, the arenas are carved up into *_allocated size
748chunks, we thus avoid wasted memory for those unaccessed members.
749When bodies are allocated, we adjust the pointer back in memory by the
750size of the bit not allocated, so it's as if we allocated the full
751structure. (But things will all go boom if you write to the part that
752is "not there", because you'll be overwriting the last members of the
753preceding structure in memory.)
754
755We calculate the correction using the STRUCT_OFFSET macro. For
756example, if xpv_allocated is the same structure as XPV then the two
757OFFSETs sum to zero, and the pointer is unchanged. If the allocated
758structure is smaller (no initial NV actually allocated) then the net
759effect is to subtract the size of the NV from the pointer, to return a
760new pointer as if an initial NV were actually allocated.
761
762This is the same trick as was used for NV and IV bodies. Ironically it
763doesn't need to be used for NV bodies any more, because NV is now at
764the start of the structure. IV bodies don't need it either, because
765they are no longer allocated.
766
767In turn, the new_body_* allocators call S_new_body(), which invokes
768new_body_inline macro, which takes a lock, and takes a body off the
769linked list at PL_body_roots[sv_type], calling S_more_bodies() if
770necessary to refresh an empty list. Then the lock is released, and
771the body is returned.
772
773S_more_bodies calls get_arena(), and carves it up into an array of N
774bodies, which it strings into a linked list. It looks up arena-size
775and body-size from the body_details table described below, thus
776supporting the multiple body-types.
777
778If PURIFY is defined, or PERL_ARENA_SIZE=0, arenas are not used, and
779the (new|del)_X*V macros are mapped directly to malloc/free.
780
781*/
782
783/*
784
785For each sv-type, struct body_details bodies_by_type[] carries
786parameters which control these aspects of SV handling:
787
788Arena_size determines whether arenas are used for this body type, and if
789so, how big they are. PURIFY or PERL_ARENA_SIZE=0 set this field to
790zero, forcing individual mallocs and frees.
791
792Body_size determines how big a body is, and therefore how many fit into
793each arena. Offset carries the body-pointer adjustment needed for
794*_allocated body types, and is used in *_allocated macros.
795
796But its main purpose is to parameterize info needed in
797Perl_sv_upgrade(). The info here dramatically simplifies the function
798vs the implementation in 5.8.7, making it table-driven. All fields
799are used for this, except for arena_size.
800
801For the sv-types that have no bodies, arenas are not used, so those
802PL_body_roots[sv_type] are unused, and can be overloaded. In
803something of a special case, SVt_NULL is borrowed for HE arenas;
804PL_body_roots[SVt_NULL] is filled by S_more_he, but the
805bodies_by_type[SVt_NULL] slot is not used, as the table is not
806available in hv.c,
807
808PTEs also use arenas, but are never seen in Perl_sv_upgrade.
809Nonetheless, they get their own slot in bodies_by_type[SVt_NULL], so
810they can just use the same allocation semantics. At first, PTEs were
811also overloaded to a non-body sv-type, but this yielded hard-to-find
812malloc bugs, so was simplified by claiming a new slot. This choice
813has no consequence at this time.
814
29489e7c
DM
815*/
816
bd81e77b 817struct body_details {
0fb58b32 818 U8 body_size; /* Size to allocate */
10666ae3 819 U8 copy; /* Size of structure to copy (may be shorter) */
0fb58b32 820 U8 offset;
10666ae3
NC
821 unsigned int type : 4; /* We have space for a sanity check. */
822 unsigned int cant_upgrade : 1; /* Cannot upgrade this type */
823 unsigned int zero_nv : 1; /* zero the NV when upgrading from this */
824 unsigned int arena : 1; /* Allocated from an arena */
825 size_t arena_size; /* Size of arena to allocate */
bd81e77b 826};
29489e7c 827
bd81e77b
NC
828#define HADNV FALSE
829#define NONV TRUE
29489e7c 830
d2a0f284 831
bd81e77b
NC
832#ifdef PURIFY
833/* With -DPURFIY we allocate everything directly, and don't use arenas.
834 This seems a rather elegant way to simplify some of the code below. */
835#define HASARENA FALSE
836#else
837#define HASARENA TRUE
838#endif
839#define NOARENA FALSE
29489e7c 840
d2a0f284
JC
841/* Size the arenas to exactly fit a given number of bodies. A count
842 of 0 fits the max number bodies into a PERL_ARENA_SIZE.block,
843 simplifying the default. If count > 0, the arena is sized to fit
844 only that many bodies, allowing arenas to be used for large, rare
845 bodies (XPVFM, XPVIO) without undue waste. The arena size is
846 limited by PERL_ARENA_SIZE, so we can safely oversize the
847 declarations.
848 */
95db5f15
MB
849#define FIT_ARENA0(body_size) \
850 ((size_t)(PERL_ARENA_SIZE / body_size) * body_size)
851#define FIT_ARENAn(count,body_size) \
852 ( count * body_size <= PERL_ARENA_SIZE) \
853 ? count * body_size \
854 : FIT_ARENA0 (body_size)
855#define FIT_ARENA(count,body_size) \
856 count \
857 ? FIT_ARENAn (count, body_size) \
858 : FIT_ARENA0 (body_size)
d2a0f284 859
bd81e77b 860/* A macro to work out the offset needed to subtract from a pointer to (say)
29489e7c 861
bd81e77b
NC
862typedef struct {
863 STRLEN xpv_cur;
864 STRLEN xpv_len;
865} xpv_allocated;
29489e7c 866
bd81e77b 867to make its members accessible via a pointer to (say)
29489e7c 868
bd81e77b
NC
869struct xpv {
870 NV xnv_nv;
871 STRLEN xpv_cur;
872 STRLEN xpv_len;
873};
29489e7c 874
bd81e77b 875*/
29489e7c 876
bd81e77b
NC
877#define relative_STRUCT_OFFSET(longer, shorter, member) \
878 (STRUCT_OFFSET(shorter, member) - STRUCT_OFFSET(longer, member))
29489e7c 879
bd81e77b
NC
880/* Calculate the length to copy. Specifically work out the length less any
881 final padding the compiler needed to add. See the comment in sv_upgrade
882 for why copying the padding proved to be a bug. */
29489e7c 883
bd81e77b
NC
884#define copy_length(type, last_member) \
885 STRUCT_OFFSET(type, last_member) \
886 + sizeof (((type*)SvANY((SV*)0))->last_member)
29489e7c 887
bd81e77b 888static const struct body_details bodies_by_type[] = {
10666ae3
NC
889 { sizeof(HE), 0, 0, SVt_NULL,
890 FALSE, NONV, NOARENA, FIT_ARENA(0, sizeof(HE)) },
d2a0f284
JC
891
892 /* IVs are in the head, so the allocation size is 0.
893 However, the slot is overloaded for PTEs. */
894 { sizeof(struct ptr_tbl_ent), /* This is used for PTEs. */
895 sizeof(IV), /* This is used to copy out the IV body. */
10666ae3 896 STRUCT_OFFSET(XPVIV, xiv_iv), SVt_IV, FALSE, NONV,
d2a0f284
JC
897 NOARENA /* IVS don't need an arena */,
898 /* But PTEs need to know the size of their arena */
899 FIT_ARENA(0, sizeof(struct ptr_tbl_ent))
900 },
901
bd81e77b 902 /* 8 bytes on most ILP32 with IEEE doubles */
10666ae3 903 { sizeof(NV), sizeof(NV), 0, SVt_NV, FALSE, HADNV, HASARENA,
d2a0f284
JC
904 FIT_ARENA(0, sizeof(NV)) },
905
906 /* RVs are in the head now. */
10666ae3 907 { 0, 0, 0, SVt_RV, FALSE, NONV, NOARENA, 0 },
d2a0f284 908
bd81e77b 909 /* 8 bytes on most ILP32 with IEEE doubles */
d2a0f284
JC
910 { sizeof(xpv_allocated),
911 copy_length(XPV, xpv_len)
912 - relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
913 + relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
10666ae3 914 SVt_PV, FALSE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpv_allocated)) },
d2a0f284 915
bd81e77b 916 /* 12 */
d2a0f284
JC
917 { sizeof(xpviv_allocated),
918 copy_length(XPVIV, xiv_u)
919 - relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
920 + relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
10666ae3 921 SVt_PVIV, FALSE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpviv_allocated)) },
d2a0f284 922
bd81e77b 923 /* 20 */
10666ae3 924 { sizeof(XPVNV), copy_length(XPVNV, xiv_u), 0, SVt_PVNV, FALSE, HADNV,
d2a0f284
JC
925 HASARENA, FIT_ARENA(0, sizeof(XPVNV)) },
926
bd81e77b 927 /* 28 */
10666ae3 928 { sizeof(XPVMG), copy_length(XPVMG, xmg_stash), 0, SVt_PVMG, FALSE, HADNV,
d2a0f284
JC
929 HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
930
bd81e77b 931 /* 36 */
10666ae3 932 { sizeof(XPVBM), sizeof(XPVBM), 0, SVt_PVBM, TRUE, HADNV,
d2a0f284
JC
933 HASARENA, FIT_ARENA(0, sizeof(XPVBM)) },
934
bd81e77b 935 /* 48 */
10666ae3 936 { sizeof(XPVGV), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
d2a0f284
JC
937 HASARENA, FIT_ARENA(0, sizeof(XPVGV)) },
938
bd81e77b 939 /* 64 */
10666ae3 940 { sizeof(XPVLV), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
d2a0f284
JC
941 HASARENA, FIT_ARENA(0, sizeof(XPVLV)) },
942
943 { sizeof(xpvav_allocated),
944 copy_length(XPVAV, xmg_stash)
945 - relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
946 + relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
10666ae3 947 SVt_PVAV, TRUE, HADNV, HASARENA, FIT_ARENA(0, sizeof(xpvav_allocated)) },
d2a0f284
JC
948
949 { sizeof(xpvhv_allocated),
950 copy_length(XPVHV, xmg_stash)
951 - relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
952 + relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
10666ae3 953 SVt_PVHV, TRUE, HADNV, HASARENA, FIT_ARENA(0, sizeof(xpvhv_allocated)) },
d2a0f284 954
c84c4652 955 /* 56 */
4115f141 956 { sizeof(xpvcv_allocated), sizeof(xpvcv_allocated),
c84c4652 957 + relative_STRUCT_OFFSET(xpvcv_allocated, XPVCV, xpv_cur),
10666ae3 958 SVt_PVCV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvcv_allocated)) },
d2a0f284 959
4115f141 960 { sizeof(xpvfm_allocated), sizeof(xpvfm_allocated),
3038937b 961 + relative_STRUCT_OFFSET(xpvfm_allocated, XPVFM, xpv_cur),
10666ae3 962 SVt_PVFM, TRUE, NONV, NOARENA, FIT_ARENA(20, sizeof(xpvfm_allocated)) },
d2a0f284
JC
963
964 /* XPVIO is 84 bytes, fits 48x */
10666ae3 965 { sizeof(XPVIO), sizeof(XPVIO), 0, SVt_PVIO, TRUE, HADNV,
d2a0f284 966 HASARENA, FIT_ARENA(24, sizeof(XPVIO)) },
bd81e77b 967};
29489e7c 968
d2a0f284
JC
969#define new_body_type(sv_type) \
970 (void *)((char *)S_new_body(aTHX_ sv_type))
29489e7c 971
bd81e77b
NC
972#define del_body_type(p, sv_type) \
973 del_body(p, &PL_body_roots[sv_type])
29489e7c 974
29489e7c 975
bd81e77b 976#define new_body_allocated(sv_type) \
d2a0f284 977 (void *)((char *)S_new_body(aTHX_ sv_type) \
bd81e77b 978 - bodies_by_type[sv_type].offset)
29489e7c 979
bd81e77b
NC
980#define del_body_allocated(p, sv_type) \
981 del_body(p + bodies_by_type[sv_type].offset, &PL_body_roots[sv_type])
29489e7c 982
29489e7c 983
bd81e77b
NC
984#define my_safemalloc(s) (void*)safemalloc(s)
985#define my_safecalloc(s) (void*)safecalloc(s, 1)
986#define my_safefree(p) safefree((char*)p)
29489e7c 987
bd81e77b 988#ifdef PURIFY
29489e7c 989
bd81e77b
NC
990#define new_XNV() my_safemalloc(sizeof(XPVNV))
991#define del_XNV(p) my_safefree(p)
29489e7c 992
bd81e77b
NC
993#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
994#define del_XPVNV(p) my_safefree(p)
29489e7c 995
bd81e77b
NC
996#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
997#define del_XPVAV(p) my_safefree(p)
29489e7c 998
bd81e77b
NC
999#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
1000#define del_XPVHV(p) my_safefree(p)
29489e7c 1001
bd81e77b
NC
1002#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
1003#define del_XPVMG(p) my_safefree(p)
29489e7c 1004
bd81e77b
NC
1005#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
1006#define del_XPVGV(p) my_safefree(p)
29489e7c 1007
bd81e77b 1008#else /* !PURIFY */
29489e7c 1009
bd81e77b
NC
1010#define new_XNV() new_body_type(SVt_NV)
1011#define del_XNV(p) del_body_type(p, SVt_NV)
29489e7c 1012
bd81e77b
NC
1013#define new_XPVNV() new_body_type(SVt_PVNV)
1014#define del_XPVNV(p) del_body_type(p, SVt_PVNV)
29489e7c 1015
bd81e77b
NC
1016#define new_XPVAV() new_body_allocated(SVt_PVAV)
1017#define del_XPVAV(p) del_body_allocated(p, SVt_PVAV)
645c22ef 1018
bd81e77b
NC
1019#define new_XPVHV() new_body_allocated(SVt_PVHV)
1020#define del_XPVHV(p) del_body_allocated(p, SVt_PVHV)
645c22ef 1021
bd81e77b
NC
1022#define new_XPVMG() new_body_type(SVt_PVMG)
1023#define del_XPVMG(p) del_body_type(p, SVt_PVMG)
645c22ef 1024
bd81e77b
NC
1025#define new_XPVGV() new_body_type(SVt_PVGV)
1026#define del_XPVGV(p) del_body_type(p, SVt_PVGV)
1d7c1841 1027
bd81e77b 1028#endif /* PURIFY */
93e68bfb 1029
bd81e77b 1030/* no arena for you! */
93e68bfb 1031
bd81e77b 1032#define new_NOARENA(details) \
d2a0f284 1033 my_safemalloc((details)->body_size + (details)->offset)
bd81e77b 1034#define new_NOARENAZ(details) \
d2a0f284
JC
1035 my_safecalloc((details)->body_size + (details)->offset)
1036
10666ae3
NC
1037#ifdef DEBUGGING
1038static bool done_sanity_check;
1039#endif
1040
d2a0f284
JC
1041STATIC void *
1042S_more_bodies (pTHX_ svtype sv_type)
1043{
1044 dVAR;
1045 void ** const root = &PL_body_roots[sv_type];
96a5add6 1046 const struct body_details * const bdp = &bodies_by_type[sv_type];
d2a0f284
JC
1047 const size_t body_size = bdp->body_size;
1048 char *start;
1049 const char *end;
1050
1051 assert(bdp->arena_size);
10666ae3
NC
1052
1053#ifdef DEBUGGING
1054 if (!done_sanity_check) {
ea471437 1055 unsigned int i = SVt_LAST;
10666ae3
NC
1056
1057 done_sanity_check = TRUE;
1058
1059 while (i--)
1060 assert (bodies_by_type[i].type == i);
1061 }
1062#endif
1063
d2a0f284
JC
1064 start = (char*) Perl_get_arena(aTHX_ bdp->arena_size);
1065
1066 end = start + bdp->arena_size - body_size;
1067
d2a0f284
JC
1068 /* computed count doesnt reflect the 1st slot reservation */
1069 DEBUG_m(PerlIO_printf(Perl_debug_log,
1070 "arena %p end %p arena-size %d type %d size %d ct %d\n",
1071 start, end, bdp->arena_size, sv_type, body_size,
1072 bdp->arena_size / body_size));
d2a0f284
JC
1073
1074 *root = (void *)start;
1075
1076 while (start < end) {
1077 char * const next = start + body_size;
1078 *(void**) start = (void *)next;
1079 start = next;
1080 }
1081 *(void **)start = 0;
1082
1083 return *root;
1084}
1085
1086/* grab a new thing from the free list, allocating more if necessary.
1087 The inline version is used for speed in hot routines, and the
1088 function using it serves the rest (unless PURIFY).
1089*/
1090#define new_body_inline(xpv, sv_type) \
1091 STMT_START { \
1092 void ** const r3wt = &PL_body_roots[sv_type]; \
1093 LOCK_SV_MUTEX; \
1094 xpv = *((void **)(r3wt)) \
1095 ? *((void **)(r3wt)) : S_more_bodies(aTHX_ sv_type); \
1096 *(r3wt) = *(void**)(xpv); \
1097 UNLOCK_SV_MUTEX; \
1098 } STMT_END
1099
1100#ifndef PURIFY
1101
1102STATIC void *
1103S_new_body(pTHX_ svtype sv_type)
1104{
1105 dVAR;
1106 void *xpv;
1107 new_body_inline(xpv, sv_type);
1108 return xpv;
1109}
1110
1111#endif
93e68bfb 1112
bd81e77b
NC
1113/*
1114=for apidoc sv_upgrade
93e68bfb 1115
bd81e77b
NC
1116Upgrade an SV to a more complex form. Generally adds a new body type to the
1117SV, then copies across as much information as possible from the old body.
1118You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
93e68bfb 1119
bd81e77b 1120=cut
93e68bfb 1121*/
93e68bfb 1122
bd81e77b
NC
1123void
1124Perl_sv_upgrade(pTHX_ register SV *sv, U32 new_type)
cac9b346 1125{
97aff369 1126 dVAR;
bd81e77b
NC
1127 void* old_body;
1128 void* new_body;
1129 const U32 old_type = SvTYPE(sv);
d2a0f284 1130 const struct body_details *new_type_details;
bd81e77b
NC
1131 const struct body_details *const old_type_details
1132 = bodies_by_type + old_type;
cac9b346 1133
bd81e77b
NC
1134 if (new_type != SVt_PV && SvIsCOW(sv)) {
1135 sv_force_normal_flags(sv, 0);
1136 }
cac9b346 1137
bd81e77b
NC
1138 if (old_type == new_type)
1139 return;
cac9b346 1140
bd81e77b
NC
1141 if (old_type > new_type)
1142 Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
1143 (int)old_type, (int)new_type);
cac9b346 1144
cac9b346 1145
bd81e77b 1146 old_body = SvANY(sv);
de042e1d 1147
bd81e77b
NC
1148 /* Copying structures onto other structures that have been neatly zeroed
1149 has a subtle gotcha. Consider XPVMG
cac9b346 1150
bd81e77b
NC
1151 +------+------+------+------+------+-------+-------+
1152 | NV | CUR | LEN | IV | MAGIC | STASH |
1153 +------+------+------+------+------+-------+-------+
1154 0 4 8 12 16 20 24 28
645c22ef 1155
bd81e77b
NC
1156 where NVs are aligned to 8 bytes, so that sizeof that structure is
1157 actually 32 bytes long, with 4 bytes of padding at the end:
08742458 1158
bd81e77b
NC
1159 +------+------+------+------+------+-------+-------+------+
1160 | NV | CUR | LEN | IV | MAGIC | STASH | ??? |
1161 +------+------+------+------+------+-------+-------+------+
1162 0 4 8 12 16 20 24 28 32
08742458 1163
bd81e77b 1164 so what happens if you allocate memory for this structure:
30f9da9e 1165
bd81e77b
NC
1166 +------+------+------+------+------+-------+-------+------+------+...
1167 | NV | CUR | LEN | IV | MAGIC | STASH | GP | NAME |
1168 +------+------+------+------+------+-------+-------+------+------+...
1169 0 4 8 12 16 20 24 28 32 36
bfc44f79 1170
bd81e77b
NC
1171 zero it, then copy sizeof(XPVMG) bytes on top of it? Not quite what you
1172 expect, because you copy the area marked ??? onto GP. Now, ??? may have
1173 started out as zero once, but it's quite possible that it isn't. So now,
1174 rather than a nicely zeroed GP, you have it pointing somewhere random.
1175 Bugs ensue.
bfc44f79 1176
bd81e77b
NC
1177 (In fact, GP ends up pointing at a previous GP structure, because the
1178 principle cause of the padding in XPVMG getting garbage is a copy of
1179 sizeof(XPVMG) bytes from a XPVGV structure in sv_unglob)
30f9da9e 1180
bd81e77b
NC
1181 So we are careful and work out the size of used parts of all the
1182 structures. */
bfc44f79 1183
bd81e77b
NC
1184 switch (old_type) {
1185 case SVt_NULL:
1186 break;
1187 case SVt_IV:
1188 if (new_type < SVt_PVIV) {
1189 new_type = (new_type == SVt_NV)
1190 ? SVt_PVNV : SVt_PVIV;
bd81e77b
NC
1191 }
1192 break;
1193 case SVt_NV:
1194 if (new_type < SVt_PVNV) {
1195 new_type = SVt_PVNV;
bd81e77b
NC
1196 }
1197 break;
1198 case SVt_RV:
1199 break;
1200 case SVt_PV:
1201 assert(new_type > SVt_PV);
1202 assert(SVt_IV < SVt_PV);
1203 assert(SVt_NV < SVt_PV);
1204 break;
1205 case SVt_PVIV:
1206 break;
1207 case SVt_PVNV:
1208 break;
1209 case SVt_PVMG:
1210 /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1211 there's no way that it can be safely upgraded, because perl.c
1212 expects to Safefree(SvANY(PL_mess_sv)) */
1213 assert(sv != PL_mess_sv);
1214 /* This flag bit is used to mean other things in other scalar types.
1215 Given that it only has meaning inside the pad, it shouldn't be set
1216 on anything that can get upgraded. */
00b1698f 1217 assert(!SvPAD_TYPED(sv));
bd81e77b
NC
1218 break;
1219 default:
1220 if (old_type_details->cant_upgrade)
c81225bc
NC
1221 Perl_croak(aTHX_ "Can't upgrade %s (%" UVuf ") to %" UVuf,
1222 sv_reftype(sv, 0), (UV) old_type, (UV) new_type);
bd81e77b 1223 }
2fa1109b 1224 new_type_details = bodies_by_type + new_type;
645c22ef 1225
bd81e77b
NC
1226 SvFLAGS(sv) &= ~SVTYPEMASK;
1227 SvFLAGS(sv) |= new_type;
932e9ff9 1228
ab4416c0
NC
1229 /* This can't happen, as SVt_NULL is <= all values of new_type, so one of
1230 the return statements above will have triggered. */
1231 assert (new_type != SVt_NULL);
bd81e77b 1232 switch (new_type) {
bd81e77b
NC
1233 case SVt_IV:
1234 assert(old_type == SVt_NULL);
1235 SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
1236 SvIV_set(sv, 0);
1237 return;
1238 case SVt_NV:
1239 assert(old_type == SVt_NULL);
1240 SvANY(sv) = new_XNV();
1241 SvNV_set(sv, 0);
1242 return;
1243 case SVt_RV:
1244 assert(old_type == SVt_NULL);
1245 SvANY(sv) = &sv->sv_u.svu_rv;
1246 SvRV_set(sv, 0);
1247 return;
1248 case SVt_PVHV:
bd81e77b 1249 case SVt_PVAV:
d2a0f284 1250 assert(new_type_details->body_size);
c1ae03ae
NC
1251
1252#ifndef PURIFY
1253 assert(new_type_details->arena);
d2a0f284 1254 assert(new_type_details->arena_size);
c1ae03ae 1255 /* This points to the start of the allocated area. */
d2a0f284
JC
1256 new_body_inline(new_body, new_type);
1257 Zero(new_body, new_type_details->body_size, char);
c1ae03ae
NC
1258 new_body = ((char *)new_body) - new_type_details->offset;
1259#else
1260 /* We always allocated the full length item with PURIFY. To do this
1261 we fake things so that arena is false for all 16 types.. */
1262 new_body = new_NOARENAZ(new_type_details);
1263#endif
1264 SvANY(sv) = new_body;
1265 if (new_type == SVt_PVAV) {
1266 AvMAX(sv) = -1;
1267 AvFILLp(sv) = -1;
1268 AvREAL_only(sv);
1269 }
aeb18a1e 1270
bd81e77b
NC
1271 /* SVt_NULL isn't the only thing upgraded to AV or HV.
1272 The target created by newSVrv also is, and it can have magic.
1273 However, it never has SvPVX set.
1274 */
1275 if (old_type >= SVt_RV) {
1276 assert(SvPVX_const(sv) == 0);
1277 }
aeb18a1e 1278
bd81e77b
NC
1279 /* Could put this in the else clause below, as PVMG must have SvPVX
1280 0 already (the assertion above) */
6136c704 1281 SvPV_set(sv, NULL);
93e68bfb 1282
bd81e77b 1283 if (old_type >= SVt_PVMG) {
e736a858 1284 SvMAGIC_set(sv, ((XPVMG*)old_body)->xmg_u.xmg_magic);
bd81e77b 1285 SvSTASH_set(sv, ((XPVMG*)old_body)->xmg_stash);
bd81e77b
NC
1286 }
1287 break;
93e68bfb 1288
93e68bfb 1289
bd81e77b
NC
1290 case SVt_PVIV:
1291 /* XXX Is this still needed? Was it ever needed? Surely as there is
1292 no route from NV to PVIV, NOK can never be true */
1293 assert(!SvNOKp(sv));
1294 assert(!SvNOK(sv));
1295 case SVt_PVIO:
1296 case SVt_PVFM:
1297 case SVt_PVBM:
1298 case SVt_PVGV:
1299 case SVt_PVCV:
1300 case SVt_PVLV:
1301 case SVt_PVMG:
1302 case SVt_PVNV:
1303 case SVt_PV:
93e68bfb 1304
d2a0f284 1305 assert(new_type_details->body_size);
bd81e77b
NC
1306 /* We always allocated the full length item with PURIFY. To do this
1307 we fake things so that arena is false for all 16 types.. */
1308 if(new_type_details->arena) {
1309 /* This points to the start of the allocated area. */
d2a0f284
JC
1310 new_body_inline(new_body, new_type);
1311 Zero(new_body, new_type_details->body_size, char);
bd81e77b
NC
1312 new_body = ((char *)new_body) - new_type_details->offset;
1313 } else {
1314 new_body = new_NOARENAZ(new_type_details);
1315 }
1316 SvANY(sv) = new_body;
5e2fc214 1317
bd81e77b 1318 if (old_type_details->copy) {
f9ba3d20
NC
1319 /* There is now the potential for an upgrade from something without
1320 an offset (PVNV or PVMG) to something with one (PVCV, PVFM) */
1321 int offset = old_type_details->offset;
1322 int length = old_type_details->copy;
1323
1324 if (new_type_details->offset > old_type_details->offset) {
1325 int difference
1326 = new_type_details->offset - old_type_details->offset;
1327 offset += difference;
1328 length -= difference;
1329 }
1330 assert (length >= 0);
1331
1332 Copy((char *)old_body + offset, (char *)new_body + offset, length,
1333 char);
bd81e77b
NC
1334 }
1335
1336#ifndef NV_ZERO_IS_ALLBITS_ZERO
f2524eef 1337 /* If NV 0.0 is stores as all bits 0 then Zero() already creates a
e5ce394c
NC
1338 * correct 0.0 for us. Otherwise, if the old body didn't have an
1339 * NV slot, but the new one does, then we need to initialise the
1340 * freshly created NV slot with whatever the correct bit pattern is
1341 * for 0.0 */
1342 if (old_type_details->zero_nv && !new_type_details->zero_nv)
bd81e77b 1343 SvNV_set(sv, 0);
82048762 1344#endif
5e2fc214 1345
bd81e77b 1346 if (new_type == SVt_PVIO)
f2524eef 1347 IoPAGE_LEN(sv) = 60;
bd81e77b 1348 if (old_type < SVt_RV)
6136c704 1349 SvPV_set(sv, NULL);
bd81e77b
NC
1350 break;
1351 default:
afd78fd5
JH
1352 Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
1353 (unsigned long)new_type);
bd81e77b 1354 }
73171d91 1355
d2a0f284
JC
1356 if (old_type_details->arena) {
1357 /* If there was an old body, then we need to free it.
1358 Note that there is an assumption that all bodies of types that
1359 can be upgraded came from arenas. Only the more complex non-
1360 upgradable types are allowed to be directly malloc()ed. */
bd81e77b
NC
1361#ifdef PURIFY
1362 my_safefree(old_body);
1363#else
1364 del_body((void*)((char*)old_body + old_type_details->offset),
1365 &PL_body_roots[old_type]);
1366#endif
1367 }
1368}
73171d91 1369
bd81e77b
NC
1370/*
1371=for apidoc sv_backoff
73171d91 1372
bd81e77b
NC
1373Remove any string offset. You should normally use the C<SvOOK_off> macro
1374wrapper instead.
73171d91 1375
bd81e77b 1376=cut
73171d91
NC
1377*/
1378
bd81e77b
NC
1379int
1380Perl_sv_backoff(pTHX_ register SV *sv)
1381{
96a5add6 1382 PERL_UNUSED_CONTEXT;
bd81e77b
NC
1383 assert(SvOOK(sv));
1384 assert(SvTYPE(sv) != SVt_PVHV);
1385 assert(SvTYPE(sv) != SVt_PVAV);
1386 if (SvIVX(sv)) {
1387 const char * const s = SvPVX_const(sv);
1388 SvLEN_set(sv, SvLEN(sv) + SvIVX(sv));
1389 SvPV_set(sv, SvPVX(sv) - SvIVX(sv));
1390 SvIV_set(sv, 0);
1391 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1392 }
1393 SvFLAGS(sv) &= ~SVf_OOK;
1394 return 0;
1395}
73171d91 1396
bd81e77b
NC
1397/*
1398=for apidoc sv_grow
73171d91 1399
bd81e77b
NC
1400Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
1401upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
1402Use the C<SvGROW> wrapper instead.
93e68bfb 1403
bd81e77b
NC
1404=cut
1405*/
93e68bfb 1406
bd81e77b
NC
1407char *
1408Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
1409{
1410 register char *s;
93e68bfb 1411
5db06880
NC
1412 if (PL_madskills && newlen >= 0x100000) {
1413 PerlIO_printf(Perl_debug_log,
1414 "Allocation too large: %"UVxf"\n", (UV)newlen);
1415 }
bd81e77b
NC
1416#ifdef HAS_64K_LIMIT
1417 if (newlen >= 0x10000) {
1418 PerlIO_printf(Perl_debug_log,
1419 "Allocation too large: %"UVxf"\n", (UV)newlen);
1420 my_exit(1);
1421 }
1422#endif /* HAS_64K_LIMIT */
1423 if (SvROK(sv))
1424 sv_unref(sv);
1425 if (SvTYPE(sv) < SVt_PV) {
1426 sv_upgrade(sv, SVt_PV);
1427 s = SvPVX_mutable(sv);
1428 }
1429 else if (SvOOK(sv)) { /* pv is offset? */
1430 sv_backoff(sv);
1431 s = SvPVX_mutable(sv);
1432 if (newlen > SvLEN(sv))
1433 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1434#ifdef HAS_64K_LIMIT
1435 if (newlen >= 0x10000)
1436 newlen = 0xFFFF;
1437#endif
1438 }
1439 else
1440 s = SvPVX_mutable(sv);
aeb18a1e 1441
bd81e77b
NC
1442 if (newlen > SvLEN(sv)) { /* need more room? */
1443 newlen = PERL_STRLEN_ROUNDUP(newlen);
1444 if (SvLEN(sv) && s) {
1445#ifdef MYMALLOC
1446 const STRLEN l = malloced_size((void*)SvPVX_const(sv));
1447 if (newlen <= l) {
1448 SvLEN_set(sv, l);
1449 return s;
1450 } else
1451#endif
1452 s = saferealloc(s, newlen);
1453 }
1454 else {
1455 s = safemalloc(newlen);
1456 if (SvPVX_const(sv) && SvCUR(sv)) {
1457 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1458 }
1459 }
1460 SvPV_set(sv, s);
1461 SvLEN_set(sv, newlen);
1462 }
1463 return s;
1464}
aeb18a1e 1465
bd81e77b
NC
1466/*
1467=for apidoc sv_setiv
932e9ff9 1468
bd81e77b
NC
1469Copies an integer into the given SV, upgrading first if necessary.
1470Does not handle 'set' magic. See also C<sv_setiv_mg>.
463ee0b2 1471
bd81e77b
NC
1472=cut
1473*/
463ee0b2 1474
bd81e77b
NC
1475void
1476Perl_sv_setiv(pTHX_ register SV *sv, IV i)
1477{
97aff369 1478 dVAR;
bd81e77b
NC
1479 SV_CHECK_THINKFIRST_COW_DROP(sv);
1480 switch (SvTYPE(sv)) {
1481 case SVt_NULL:
1482 sv_upgrade(sv, SVt_IV);
1483 break;
1484 case SVt_NV:
1485 sv_upgrade(sv, SVt_PVNV);
1486 break;
1487 case SVt_RV:
1488 case SVt_PV:
1489 sv_upgrade(sv, SVt_PVIV);
1490 break;
463ee0b2 1491
bd81e77b
NC
1492 case SVt_PVGV:
1493 case SVt_PVAV:
1494 case SVt_PVHV:
1495 case SVt_PVCV:
1496 case SVt_PVFM:
1497 case SVt_PVIO:
1498 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1499 OP_DESC(PL_op));
1500 }
1501 (void)SvIOK_only(sv); /* validate number */
1502 SvIV_set(sv, i);
1503 SvTAINT(sv);
1504}
932e9ff9 1505
bd81e77b
NC
1506/*
1507=for apidoc sv_setiv_mg
d33b2eba 1508
bd81e77b 1509Like C<sv_setiv>, but also handles 'set' magic.
1c846c1f 1510
bd81e77b
NC
1511=cut
1512*/
d33b2eba 1513
bd81e77b
NC
1514void
1515Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
1516{
1517 sv_setiv(sv,i);
1518 SvSETMAGIC(sv);
1519}
727879eb 1520
bd81e77b
NC
1521/*
1522=for apidoc sv_setuv
d33b2eba 1523
bd81e77b
NC
1524Copies an unsigned integer into the given SV, upgrading first if necessary.
1525Does not handle 'set' magic. See also C<sv_setuv_mg>.
9b94d1dd 1526
bd81e77b
NC
1527=cut
1528*/
d33b2eba 1529
bd81e77b
NC
1530void
1531Perl_sv_setuv(pTHX_ register SV *sv, UV u)
1532{
1533 /* With these two if statements:
1534 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d33b2eba 1535
bd81e77b
NC
1536 without
1537 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
1c846c1f 1538
bd81e77b
NC
1539 If you wish to remove them, please benchmark to see what the effect is
1540 */
1541 if (u <= (UV)IV_MAX) {
1542 sv_setiv(sv, (IV)u);
1543 return;
1544 }
1545 sv_setiv(sv, 0);
1546 SvIsUV_on(sv);
1547 SvUV_set(sv, u);
1548}
d33b2eba 1549
bd81e77b
NC
1550/*
1551=for apidoc sv_setuv_mg
727879eb 1552
bd81e77b 1553Like C<sv_setuv>, but also handles 'set' magic.
9b94d1dd 1554
bd81e77b
NC
1555=cut
1556*/
5e2fc214 1557
bd81e77b
NC
1558void
1559Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
1560{
1561 sv_setiv(sv, 0);
1562 SvIsUV_on(sv);
1563 sv_setuv(sv,u);
1564 SvSETMAGIC(sv);
1565}
5e2fc214 1566
954c1994 1567/*
bd81e77b 1568=for apidoc sv_setnv
954c1994 1569
bd81e77b
NC
1570Copies a double into the given SV, upgrading first if necessary.
1571Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
1572
1573=cut
1574*/
1575
63f97190 1576void
bd81e77b 1577Perl_sv_setnv(pTHX_ register SV *sv, NV num)
79072805 1578{
97aff369 1579 dVAR;
bd81e77b
NC
1580 SV_CHECK_THINKFIRST_COW_DROP(sv);
1581 switch (SvTYPE(sv)) {
79072805 1582 case SVt_NULL:
79072805 1583 case SVt_IV:
bd81e77b 1584 sv_upgrade(sv, SVt_NV);
79072805 1585 break;
ed6116ce 1586 case SVt_RV:
79072805 1587 case SVt_PV:
79072805 1588 case SVt_PVIV:
bd81e77b 1589 sv_upgrade(sv, SVt_PVNV);
79072805 1590 break;
bd4b1eb5 1591
bd4b1eb5 1592 case SVt_PVGV:
bd81e77b
NC
1593 case SVt_PVAV:
1594 case SVt_PVHV:
79072805 1595 case SVt_PVCV:
bd81e77b
NC
1596 case SVt_PVFM:
1597 case SVt_PVIO:
1598 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1599 OP_NAME(PL_op));
2068cd4d 1600 }
bd81e77b
NC
1601 SvNV_set(sv, num);
1602 (void)SvNOK_only(sv); /* validate number */
1603 SvTAINT(sv);
79072805
LW
1604}
1605
645c22ef 1606/*
bd81e77b 1607=for apidoc sv_setnv_mg
645c22ef 1608
bd81e77b 1609Like C<sv_setnv>, but also handles 'set' magic.
645c22ef
DM
1610
1611=cut
1612*/
1613
bd81e77b
NC
1614void
1615Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
79072805 1616{
bd81e77b
NC
1617 sv_setnv(sv,num);
1618 SvSETMAGIC(sv);
79072805
LW
1619}
1620
bd81e77b
NC
1621/* Print an "isn't numeric" warning, using a cleaned-up,
1622 * printable version of the offending string
1623 */
954c1994 1624
bd81e77b
NC
1625STATIC void
1626S_not_a_number(pTHX_ SV *sv)
79072805 1627{
97aff369 1628 dVAR;
bd81e77b
NC
1629 SV *dsv;
1630 char tmpbuf[64];
1631 const char *pv;
94463019
JH
1632
1633 if (DO_UTF8(sv)) {
396482e1 1634 dsv = sv_2mortal(newSVpvs(""));
94463019
JH
1635 pv = sv_uni_display(dsv, sv, 10, 0);
1636 } else {
1637 char *d = tmpbuf;
551405c4 1638 const char * const limit = tmpbuf + sizeof(tmpbuf) - 8;
94463019
JH
1639 /* each *s can expand to 4 chars + "...\0",
1640 i.e. need room for 8 chars */
ecdeb87c 1641
00b6aa41
AL
1642 const char *s = SvPVX_const(sv);
1643 const char * const end = s + SvCUR(sv);
1644 for ( ; s < end && d < limit; s++ ) {
94463019
JH
1645 int ch = *s & 0xFF;
1646 if (ch & 128 && !isPRINT_LC(ch)) {
1647 *d++ = 'M';
1648 *d++ = '-';
1649 ch &= 127;
1650 }
1651 if (ch == '\n') {
1652 *d++ = '\\';
1653 *d++ = 'n';
1654 }
1655 else if (ch == '\r') {
1656 *d++ = '\\';
1657 *d++ = 'r';
1658 }
1659 else if (ch == '\f') {
1660 *d++ = '\\';
1661 *d++ = 'f';
1662 }
1663 else if (ch == '\\') {
1664 *d++ = '\\';
1665 *d++ = '\\';
1666 }
1667 else if (ch == '\0') {
1668 *d++ = '\\';
1669 *d++ = '0';
1670 }
1671 else if (isPRINT_LC(ch))
1672 *d++ = ch;
1673 else {
1674 *d++ = '^';
1675 *d++ = toCTRL(ch);
1676 }
1677 }
1678 if (s < end) {
1679 *d++ = '.';
1680 *d++ = '.';
1681 *d++ = '.';
1682 }
1683 *d = '\0';
1684 pv = tmpbuf;
a0d0e21e 1685 }
a0d0e21e 1686
533c011a 1687 if (PL_op)
9014280d 1688 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
1689 "Argument \"%s\" isn't numeric in %s", pv,
1690 OP_DESC(PL_op));
a0d0e21e 1691 else
9014280d 1692 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 1693 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
1694}
1695
c2988b20
NC
1696/*
1697=for apidoc looks_like_number
1698
645c22ef
DM
1699Test if the content of an SV looks like a number (or is a number).
1700C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1701non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
1702
1703=cut
1704*/
1705
1706I32
1707Perl_looks_like_number(pTHX_ SV *sv)
1708{
a3b680e6 1709 register const char *sbegin;
c2988b20
NC
1710 STRLEN len;
1711
1712 if (SvPOK(sv)) {
3f7c398e 1713 sbegin = SvPVX_const(sv);
c2988b20
NC
1714 len = SvCUR(sv);
1715 }
1716 else if (SvPOKp(sv))
83003860 1717 sbegin = SvPV_const(sv, len);
c2988b20 1718 else
e0ab1c0e 1719 return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
c2988b20
NC
1720 return grok_number(sbegin, len, NULL);
1721}
25da4f38 1722
180488f8
NC
1723STATIC char *
1724S_glob_2inpuv(pTHX_ GV *gv, STRLEN *len, bool want_number)
1725{
1726 const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1727 SV *const buffer = sv_newmortal();
1728
1729 /* FAKE globs can get coerced, so need to turn this off temporarily if it
1730 is on. */
1731 SvFAKE_off(gv);
1732 gv_efullname3(buffer, gv, "*");
1733 SvFLAGS(gv) |= wasfake;
1734
1735 if (want_number) {
1736 /* We know that all GVs stringify to something that is not-a-number,
1737 so no need to test that. */
1738 if (ckWARN(WARN_NUMERIC))
1739 not_a_number(buffer);
1740 /* We just want something true to return, so that S_sv_2iuv_common
1741 can tail call us and return true. */
1742 return (char *) 1;
1743 } else {
1744 return SvPV(buffer, *len);
1745 }
1746}
1747
25da4f38
IZ
1748/* Actually, ISO C leaves conversion of UV to IV undefined, but
1749 until proven guilty, assume that things are not that bad... */
1750
645c22ef
DM
1751/*
1752 NV_PRESERVES_UV:
1753
1754 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
1755 an IV (an assumption perl has been based on to date) it becomes necessary
1756 to remove the assumption that the NV always carries enough precision to
1757 recreate the IV whenever needed, and that the NV is the canonical form.
1758 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 1759 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
1760 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1761 1) to distinguish between IV/UV/NV slots that have cached a valid
1762 conversion where precision was lost and IV/UV/NV slots that have a
1763 valid conversion which has lost no precision
645c22ef 1764 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
1765 would lose precision, the precise conversion (or differently
1766 imprecise conversion) is also performed and cached, to prevent
1767 requests for different numeric formats on the same SV causing
1768 lossy conversion chains. (lossless conversion chains are perfectly
1769 acceptable (still))
1770
1771
1772 flags are used:
1773 SvIOKp is true if the IV slot contains a valid value
1774 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
1775 SvNOKp is true if the NV slot contains a valid value
1776 SvNOK is true only if the NV value is accurate
1777
1778 so
645c22ef 1779 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
1780 IV(or UV) would lose accuracy over a direct conversion from PV to
1781 IV(or UV). If it would, cache both conversions, return NV, but mark
1782 SV as IOK NOKp (ie not NOK).
1783
645c22ef 1784 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
1785 NV would lose accuracy over a direct conversion from PV to NV. If it
1786 would, cache both conversions, flag similarly.
1787
1788 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1789 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
1790 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1791 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 1792 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 1793
645c22ef
DM
1794 The benefit of this is that operations such as pp_add know that if
1795 SvIOK is true for both left and right operands, then integer addition
1796 can be used instead of floating point (for cases where the result won't
1797 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
1798 loss of precision compared with integer addition.
1799
1800 * making IV and NV equal status should make maths accurate on 64 bit
1801 platforms
1802 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 1803 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
1804 looking for SvIOK and checking for overflow will not outweigh the
1805 fp to integer speedup)
1806 * will slow down integer operations (callers of SvIV) on "inaccurate"
1807 values, as the change from SvIOK to SvIOKp will cause a call into
1808 sv_2iv each time rather than a macro access direct to the IV slot
1809 * should speed up number->string conversion on integers as IV is
645c22ef 1810 favoured when IV and NV are equally accurate
28e5dec8
JH
1811
1812 ####################################################################
645c22ef
DM
1813 You had better be using SvIOK_notUV if you want an IV for arithmetic:
1814 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1815 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
1816 ####################################################################
1817
645c22ef 1818 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
1819 performance ratio.
1820*/
1821
1822#ifndef NV_PRESERVES_UV
645c22ef
DM
1823# define IS_NUMBER_UNDERFLOW_IV 1
1824# define IS_NUMBER_UNDERFLOW_UV 2
1825# define IS_NUMBER_IV_AND_UV 2
1826# define IS_NUMBER_OVERFLOW_IV 4
1827# define IS_NUMBER_OVERFLOW_UV 5
1828
1829/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
1830
1831/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
1832STATIC int
645c22ef 1833S_sv_2iuv_non_preserve(pTHX_ register SV *sv, I32 numtype)
28e5dec8 1834{
97aff369 1835 dVAR;
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 */
1898 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 1899 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
1900 if (SvNVX(sv) == (NV) SvIVX(sv)
1901#ifndef NV_PRESERVES_UV
1902 && (((UV)1 << NV_PRESERVES_UV_BITS) >
1903 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
1904 /* Don't flag it as "accurately an integer" if the number
1905 came from a (by definition imprecise) NV operation, and
1906 we're outside the range of NV integer precision */
1907#endif
1908 ) {
1909 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
1910 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 1911 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
1912 PTR2UV(sv),
1913 SvNVX(sv),
1914 SvIVX(sv)));
1915
1916 } else {
1917 /* IV not precise. No need to convert from PV, as NV
1918 conversion would already have cached IV if it detected
1919 that PV->IV would be better than PV->NV->IV
1920 flags already correct - don't set public IOK. */
1921 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 1922 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
1923 PTR2UV(sv),
1924 SvNVX(sv),
1925 SvIVX(sv)));
1926 }
1927 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
1928 but the cast (NV)IV_MIN rounds to a the value less (more
1929 negative) than IV_MIN which happens to be equal to SvNVX ??
1930 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
1931 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
1932 (NV)UVX == NVX are both true, but the values differ. :-(
1933 Hopefully for 2s complement IV_MIN is something like
1934 0x8000000000000000 which will be exact. NWC */
d460ef45 1935 }
25da4f38 1936 else {
607fa7f2 1937 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
1938 if (
1939 (SvNVX(sv) == (NV) SvUVX(sv))
1940#ifndef NV_PRESERVES_UV
1941 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
1942 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
1943 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
1944 /* Don't flag it as "accurately an integer" if the number
1945 came from a (by definition imprecise) NV operation, and
1946 we're outside the range of NV integer precision */
1947#endif
1948 )
1949 SvIOK_on(sv);
25da4f38 1950 SvIsUV_on(sv);
1c846c1f 1951 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 1952 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 1953 PTR2UV(sv),
57def98f
JH
1954 SvUVX(sv),
1955 SvUVX(sv)));
25da4f38 1956 }
748a9306
LW
1957 }
1958 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 1959 UV value;
504618e9 1960 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
af359546 1961 /* We want to avoid a possible problem when we cache an IV/ a UV which
25da4f38 1962 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
1963 the same as the direct translation of the initial string
1964 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
1965 be careful to ensure that the value with the .456 is around if the
1966 NV value is requested in the future).
1c846c1f 1967
af359546 1968 This means that if we cache such an IV/a UV, we need to cache the
25da4f38 1969 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 1970 cache the NV if we are sure it's not needed.
25da4f38 1971 */
16b7a9a4 1972
c2988b20
NC
1973 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
1974 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
1975 == IS_NUMBER_IN_UV) {
5e045b90 1976 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
1977 if (SvTYPE(sv) < SVt_PVIV)
1978 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 1979 (void)SvIOK_on(sv);
c2988b20
NC
1980 } else if (SvTYPE(sv) < SVt_PVNV)
1981 sv_upgrade(sv, SVt_PVNV);
28e5dec8 1982
f2524eef 1983 /* If NVs preserve UVs then we only use the UV value if we know that
c2988b20
NC
1984 we aren't going to call atof() below. If NVs don't preserve UVs
1985 then the value returned may have more precision than atof() will
1986 return, even though value isn't perfectly accurate. */
1987 if ((numtype & (IS_NUMBER_IN_UV
1988#ifdef NV_PRESERVES_UV
1989 | IS_NUMBER_NOT_INT
1990#endif
1991 )) == IS_NUMBER_IN_UV) {
1992 /* This won't turn off the public IOK flag if it was set above */
1993 (void)SvIOKp_on(sv);
1994
1995 if (!(numtype & IS_NUMBER_NEG)) {
1996 /* positive */;
1997 if (value <= (UV)IV_MAX) {
45977657 1998 SvIV_set(sv, (IV)value);
c2988b20 1999 } else {
af359546 2000 /* it didn't overflow, and it was positive. */
607fa7f2 2001 SvUV_set(sv, value);
c2988b20
NC
2002 SvIsUV_on(sv);
2003 }
2004 } else {
2005 /* 2s complement assumption */
2006 if (value <= (UV)IV_MIN) {
45977657 2007 SvIV_set(sv, -(IV)value);
c2988b20
NC
2008 } else {
2009 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2010 I'm assuming it will be rare. */
c2988b20
NC
2011 if (SvTYPE(sv) < SVt_PVNV)
2012 sv_upgrade(sv, SVt_PVNV);
2013 SvNOK_on(sv);
2014 SvIOK_off(sv);
2015 SvIOKp_on(sv);
9d6ce603 2016 SvNV_set(sv, -(NV)value);
45977657 2017 SvIV_set(sv, IV_MIN);
c2988b20
NC
2018 }
2019 }
2020 }
2021 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2022 will be in the previous block to set the IV slot, and the next
2023 block to set the NV slot. So no else here. */
2024
2025 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2026 != IS_NUMBER_IN_UV) {
2027 /* It wasn't an (integer that doesn't overflow the UV). */
3f7c398e 2028 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8 2029
c2988b20
NC
2030 if (! numtype && ckWARN(WARN_NUMERIC))
2031 not_a_number(sv);
28e5dec8 2032
65202027 2033#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2034 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2035 PTR2UV(sv), SvNVX(sv)));
65202027 2036#else
1779d84d 2037 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 2038 PTR2UV(sv), SvNVX(sv)));
65202027 2039#endif
28e5dec8 2040
28e5dec8 2041#ifdef NV_PRESERVES_UV
af359546
NC
2042 (void)SvIOKp_on(sv);
2043 (void)SvNOK_on(sv);
2044 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2045 SvIV_set(sv, I_V(SvNVX(sv)));
2046 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2047 SvIOK_on(sv);
2048 } else {
bb263b4e 2049 /*EMPTY*/; /* Integer is imprecise. NOK, IOKp */
af359546
NC
2050 }
2051 /* UV will not work better than IV */
2052 } else {
2053 if (SvNVX(sv) > (NV)UV_MAX) {
2054 SvIsUV_on(sv);
2055 /* Integer is inaccurate. NOK, IOKp, is UV */
2056 SvUV_set(sv, UV_MAX);
af359546
NC
2057 } else {
2058 SvUV_set(sv, U_V(SvNVX(sv)));
2059 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2060 NV preservse UV so can do correct comparison. */
2061 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2062 SvIOK_on(sv);
af359546 2063 } else {
bb263b4e 2064 /*EMPTY*/; /* Integer is imprecise. NOK, IOKp, is UV */
af359546
NC
2065 }
2066 }
4b0c9573 2067 SvIsUV_on(sv);
af359546 2068 }
28e5dec8 2069#else /* NV_PRESERVES_UV */
c2988b20
NC
2070 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2071 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
af359546 2072 /* The IV/UV slot will have been set from value returned by
c2988b20
NC
2073 grok_number above. The NV slot has just been set using
2074 Atof. */
560b0c46 2075 SvNOK_on(sv);
c2988b20
NC
2076 assert (SvIOKp(sv));
2077 } else {
2078 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2079 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2080 /* Small enough to preserve all bits. */
2081 (void)SvIOKp_on(sv);
2082 SvNOK_on(sv);
45977657 2083 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2084 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2085 SvIOK_on(sv);
2086 /* Assumption: first non-preserved integer is < IV_MAX,
2087 this NV is in the preserved range, therefore: */
2088 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2089 < (UV)IV_MAX)) {
32fdb065 2090 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
2091 }
2092 } else {
2093 /* IN_UV NOT_INT
2094 0 0 already failed to read UV.
2095 0 1 already failed to read UV.
2096 1 0 you won't get here in this case. IV/UV
2097 slot set, public IOK, Atof() unneeded.
2098 1 1 already read UV.
2099 so there's no point in sv_2iuv_non_preserve() attempting
2100 to use atol, strtol, strtoul etc. */
40a17c4c 2101 sv_2iuv_non_preserve (sv, numtype);
c2988b20
NC
2102 }
2103 }
28e5dec8 2104#endif /* NV_PRESERVES_UV */
25da4f38 2105 }
af359546
NC
2106 }
2107 else {
f7877b28 2108 if (isGV_with_GP(sv)) {
b21a80ce 2109 return (bool)PTR2IV(glob_2inpuv((GV *)sv, NULL, TRUE));
180488f8 2110 }
180488f8 2111
af359546
NC
2112 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2113 if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
2114 report_uninit(sv);
2115 }
25da4f38
IZ
2116 if (SvTYPE(sv) < SVt_IV)
2117 /* Typically the caller expects that sv_any is not NULL now. */
2118 sv_upgrade(sv, SVt_IV);
af359546
NC
2119 /* Return 0 from the caller. */
2120 return TRUE;
2121 }
2122 return FALSE;
2123}
2124
2125/*
2126=for apidoc sv_2iv_flags
2127
2128Return the integer value of an SV, doing any necessary string
2129conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2130Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2131
2132=cut
2133*/
2134
2135IV
2136Perl_sv_2iv_flags(pTHX_ register SV *sv, I32 flags)
2137{
97aff369 2138 dVAR;
af359546 2139 if (!sv)
a0d0e21e 2140 return 0;
af359546
NC
2141 if (SvGMAGICAL(sv)) {
2142 if (flags & SV_GMAGIC)
2143 mg_get(sv);
2144 if (SvIOKp(sv))
2145 return SvIVX(sv);
2146 if (SvNOKp(sv)) {
2147 return I_V(SvNVX(sv));
2148 }
71c558c3
NC
2149 if (SvPOKp(sv) && SvLEN(sv)) {
2150 UV value;
2151 const int numtype
2152 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2153
2154 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2155 == IS_NUMBER_IN_UV) {
2156 /* It's definitely an integer */
2157 if (numtype & IS_NUMBER_NEG) {
2158 if (value < (UV)IV_MIN)
2159 return -(IV)value;
2160 } else {
2161 if (value < (UV)IV_MAX)
2162 return (IV)value;
2163 }
2164 }
2165 if (!numtype) {
2166 if (ckWARN(WARN_NUMERIC))
2167 not_a_number(sv);
2168 }
2169 return I_V(Atof(SvPVX_const(sv)));
2170 }
1c7ff15e
NC
2171 if (SvROK(sv)) {
2172 goto return_rok;
af359546 2173 }
1c7ff15e
NC
2174 assert(SvTYPE(sv) >= SVt_PVMG);
2175 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2176 } else if (SvTHINKFIRST(sv)) {
af359546 2177 if (SvROK(sv)) {
1c7ff15e 2178 return_rok:
af359546
NC
2179 if (SvAMAGIC(sv)) {
2180 SV * const tmpstr=AMG_CALLun(sv,numer);
2181 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2182 return SvIV(tmpstr);
2183 }
2184 }
2185 return PTR2IV(SvRV(sv));
2186 }
2187 if (SvIsCOW(sv)) {
2188 sv_force_normal_flags(sv, 0);
2189 }
2190 if (SvREADONLY(sv) && !SvOK(sv)) {
2191 if (ckWARN(WARN_UNINITIALIZED))
2192 report_uninit(sv);
2193 return 0;
2194 }
2195 }
2196 if (!SvIOKp(sv)) {
2197 if (S_sv_2iuv_common(aTHX_ sv))
2198 return 0;
79072805 2199 }
1d7c1841
GS
2200 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2201 PTR2UV(sv),SvIVX(sv)));
25da4f38 2202 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
2203}
2204
645c22ef 2205/*
891f9566 2206=for apidoc sv_2uv_flags
645c22ef
DM
2207
2208Return the unsigned integer value of an SV, doing any necessary string
891f9566
YST
2209conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2210Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
645c22ef
DM
2211
2212=cut
2213*/
2214
ff68c719 2215UV
891f9566 2216Perl_sv_2uv_flags(pTHX_ register SV *sv, I32 flags)
ff68c719 2217{
97aff369 2218 dVAR;
ff68c719 2219 if (!sv)
2220 return 0;
2221 if (SvGMAGICAL(sv)) {
891f9566
YST
2222 if (flags & SV_GMAGIC)
2223 mg_get(sv);
ff68c719 2224 if (SvIOKp(sv))
2225 return SvUVX(sv);
2226 if (SvNOKp(sv))
2227 return U_V(SvNVX(sv));
71c558c3
NC
2228 if (SvPOKp(sv) && SvLEN(sv)) {
2229 UV value;
2230 const int numtype
2231 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2232
2233 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2234 == IS_NUMBER_IN_UV) {
2235 /* It's definitely an integer */
2236 if (!(numtype & IS_NUMBER_NEG))
2237 return value;
2238 }
2239 if (!numtype) {
2240 if (ckWARN(WARN_NUMERIC))
2241 not_a_number(sv);
2242 }
2243 return U_V(Atof(SvPVX_const(sv)));
2244 }
1c7ff15e
NC
2245 if (SvROK(sv)) {
2246 goto return_rok;
3fe9a6f1 2247 }
1c7ff15e
NC
2248 assert(SvTYPE(sv) >= SVt_PVMG);
2249 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2250 } else if (SvTHINKFIRST(sv)) {
ff68c719 2251 if (SvROK(sv)) {
1c7ff15e 2252 return_rok:
deb46114
NC
2253 if (SvAMAGIC(sv)) {
2254 SV *const tmpstr = AMG_CALLun(sv,numer);
2255 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2256 return SvUV(tmpstr);
2257 }
2258 }
2259 return PTR2UV(SvRV(sv));
ff68c719 2260 }
765f542d
NC
2261 if (SvIsCOW(sv)) {
2262 sv_force_normal_flags(sv, 0);
8a818333 2263 }
0336b60e 2264 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2265 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2266 report_uninit(sv);
ff68c719 2267 return 0;
2268 }
2269 }
af359546
NC
2270 if (!SvIOKp(sv)) {
2271 if (S_sv_2iuv_common(aTHX_ sv))
2272 return 0;
ff68c719 2273 }
25da4f38 2274
1d7c1841
GS
2275 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2276 PTR2UV(sv),SvUVX(sv)));
25da4f38 2277 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 2278}
2279
645c22ef
DM
2280/*
2281=for apidoc sv_2nv
2282
2283Return the num value of an SV, doing any necessary string or integer
2284conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
2285macros.
2286
2287=cut
2288*/
2289
65202027 2290NV
864dbfa3 2291Perl_sv_2nv(pTHX_ register SV *sv)
79072805 2292{
97aff369 2293 dVAR;
79072805
LW
2294 if (!sv)
2295 return 0.0;
8990e307 2296 if (SvGMAGICAL(sv)) {
463ee0b2
LW
2297 mg_get(sv);
2298 if (SvNOKp(sv))
2299 return SvNVX(sv);
0aa395f8 2300 if ((SvPOKp(sv) && SvLEN(sv)) && !SvIOKp(sv)) {
041457d9 2301 if (!SvIOKp(sv) && ckWARN(WARN_NUMERIC) &&
504618e9 2302 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
a0d0e21e 2303 not_a_number(sv);
3f7c398e 2304 return Atof(SvPVX_const(sv));
a0d0e21e 2305 }
25da4f38 2306 if (SvIOKp(sv)) {
1c846c1f 2307 if (SvIsUV(sv))
65202027 2308 return (NV)SvUVX(sv);
25da4f38 2309 else
65202027 2310 return (NV)SvIVX(sv);
47a72cb8
NC
2311 }
2312 if (SvROK(sv)) {
2313 goto return_rok;
2314 }
2315 assert(SvTYPE(sv) >= SVt_PVMG);
2316 /* This falls through to the report_uninit near the end of the
2317 function. */
2318 } else if (SvTHINKFIRST(sv)) {
a0d0e21e 2319 if (SvROK(sv)) {
47a72cb8 2320 return_rok:
deb46114
NC
2321 if (SvAMAGIC(sv)) {
2322 SV *const tmpstr = AMG_CALLun(sv,numer);
2323 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2324 return SvNV(tmpstr);
2325 }
2326 }
2327 return PTR2NV(SvRV(sv));
a0d0e21e 2328 }
765f542d
NC
2329 if (SvIsCOW(sv)) {
2330 sv_force_normal_flags(sv, 0);
8a818333 2331 }
0336b60e 2332 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 2333 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2334 report_uninit(sv);
ed6116ce
LW
2335 return 0.0;
2336 }
79072805
LW
2337 }
2338 if (SvTYPE(sv) < SVt_NV) {
7e25a7e9
NC
2339 /* The logic to use SVt_PVNV if necessary is in sv_upgrade. */
2340 sv_upgrade(sv, SVt_NV);
906f284f 2341#ifdef USE_LONG_DOUBLE
097ee67d 2342 DEBUG_c({
f93f4e46 2343 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2344 PerlIO_printf(Perl_debug_log,
2345 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2346 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2347 RESTORE_NUMERIC_LOCAL();
2348 });
65202027 2349#else
572bbb43 2350 DEBUG_c({
f93f4e46 2351 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2352 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 2353 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2354 RESTORE_NUMERIC_LOCAL();
2355 });
572bbb43 2356#endif
79072805
LW
2357 }
2358 else if (SvTYPE(sv) < SVt_PVNV)
2359 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
2360 if (SvNOKp(sv)) {
2361 return SvNVX(sv);
61604483 2362 }
59d8ce62 2363 if (SvIOKp(sv)) {
9d6ce603 2364 SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
28e5dec8
JH
2365#ifdef NV_PRESERVES_UV
2366 SvNOK_on(sv);
2367#else
2368 /* Only set the public NV OK flag if this NV preserves the IV */
2369 /* Check it's not 0xFFFFFFFFFFFFFFFF */
2370 if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2371 : (SvIVX(sv) == I_V(SvNVX(sv))))
2372 SvNOK_on(sv);
2373 else
2374 SvNOKp_on(sv);
2375#endif
93a17b20 2376 }
748a9306 2377 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2378 UV value;
3f7c398e 2379 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
041457d9 2380 if (!SvIOKp(sv) && !numtype && ckWARN(WARN_NUMERIC))
a0d0e21e 2381 not_a_number(sv);
28e5dec8 2382#ifdef NV_PRESERVES_UV
c2988b20
NC
2383 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2384 == IS_NUMBER_IN_UV) {
5e045b90 2385 /* It's definitely an integer */
9d6ce603 2386 SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
c2988b20 2387 } else
3f7c398e 2388 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2389 SvNOK_on(sv);
2390#else
3f7c398e 2391 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2392 /* Only set the public NV OK flag if this NV preserves the value in
2393 the PV at least as well as an IV/UV would.
2394 Not sure how to do this 100% reliably. */
2395 /* if that shift count is out of range then Configure's test is
2396 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2397 UV_BITS */
2398 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 2399 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 2400 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
2401 } else if (!(numtype & IS_NUMBER_IN_UV)) {
2402 /* Can't use strtol etc to convert this string, so don't try.
2403 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
2404 SvNOK_on(sv);
2405 } else {
2406 /* value has been set. It may not be precise. */
2407 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2408 /* 2s complement assumption for (UV)IV_MIN */
2409 SvNOK_on(sv); /* Integer is too negative. */
2410 } else {
2411 SvNOKp_on(sv);
2412 SvIOKp_on(sv);
6fa402ec 2413
c2988b20 2414 if (numtype & IS_NUMBER_NEG) {
45977657 2415 SvIV_set(sv, -(IV)value);
c2988b20 2416 } else if (value <= (UV)IV_MAX) {
45977657 2417 SvIV_set(sv, (IV)value);
c2988b20 2418 } else {
607fa7f2 2419 SvUV_set(sv, value);
c2988b20
NC
2420 SvIsUV_on(sv);
2421 }
2422
2423 if (numtype & IS_NUMBER_NOT_INT) {
2424 /* I believe that even if the original PV had decimals,
2425 they are lost beyond the limit of the FP precision.
2426 However, neither is canonical, so both only get p
2427 flags. NWC, 2000/11/25 */
2428 /* Both already have p flags, so do nothing */
2429 } else {
66a1b24b 2430 const NV nv = SvNVX(sv);
c2988b20
NC
2431 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2432 if (SvIVX(sv) == I_V(nv)) {
2433 SvNOK_on(sv);
c2988b20 2434 } else {
c2988b20
NC
2435 /* It had no "." so it must be integer. */
2436 }
00b6aa41 2437 SvIOK_on(sv);
c2988b20
NC
2438 } else {
2439 /* between IV_MAX and NV(UV_MAX).
2440 Could be slightly > UV_MAX */
6fa402ec 2441
c2988b20
NC
2442 if (numtype & IS_NUMBER_NOT_INT) {
2443 /* UV and NV both imprecise. */
2444 } else {
66a1b24b 2445 const UV nv_as_uv = U_V(nv);
c2988b20
NC
2446
2447 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2448 SvNOK_on(sv);
c2988b20 2449 }
00b6aa41 2450 SvIOK_on(sv);
c2988b20
NC
2451 }
2452 }
2453 }
2454 }
2455 }
28e5dec8 2456#endif /* NV_PRESERVES_UV */
93a17b20 2457 }
79072805 2458 else {
f7877b28 2459 if (isGV_with_GP(sv)) {
180488f8
NC
2460 glob_2inpuv((GV *)sv, NULL, TRUE);
2461 return 0.0;
2462 }
2463
041457d9 2464 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
29489e7c 2465 report_uninit(sv);
7e25a7e9
NC
2466 assert (SvTYPE(sv) >= SVt_NV);
2467 /* Typically the caller expects that sv_any is not NULL now. */
2468 /* XXX Ilya implies that this is a bug in callers that assume this
2469 and ideally should be fixed. */
a0d0e21e 2470 return 0.0;
79072805 2471 }
572bbb43 2472#if defined(USE_LONG_DOUBLE)
097ee67d 2473 DEBUG_c({
f93f4e46 2474 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2475 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2476 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2477 RESTORE_NUMERIC_LOCAL();
2478 });
65202027 2479#else
572bbb43 2480 DEBUG_c({
f93f4e46 2481 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2482 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 2483 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2484 RESTORE_NUMERIC_LOCAL();
2485 });
572bbb43 2486#endif
463ee0b2 2487 return SvNVX(sv);
79072805
LW
2488}
2489
645c22ef
DM
2490/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2491 * UV as a string towards the end of buf, and return pointers to start and
2492 * end of it.
2493 *
2494 * We assume that buf is at least TYPE_CHARS(UV) long.
2495 */
2496
864dbfa3 2497static char *
aec46f14 2498S_uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
25da4f38 2499{
25da4f38 2500 char *ptr = buf + TYPE_CHARS(UV);
823a54a3 2501 char * const ebuf = ptr;
25da4f38 2502 int sign;
25da4f38
IZ
2503
2504 if (is_uv)
2505 sign = 0;
2506 else if (iv >= 0) {
2507 uv = iv;
2508 sign = 0;
2509 } else {
2510 uv = -iv;
2511 sign = 1;
2512 }
2513 do {
eb160463 2514 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
2515 } while (uv /= 10);
2516 if (sign)
2517 *--ptr = '-';
2518 *peob = ebuf;
2519 return ptr;
2520}
2521
9af30d34
NC
2522/* stringify_regexp(): private routine for use by sv_2pv_flags(): converts
2523 * a regexp to its stringified form.
2524 */
2525
2526static char *
2527S_stringify_regexp(pTHX_ SV *sv, MAGIC *mg, STRLEN *lp) {
97aff369 2528 dVAR;
00b6aa41 2529 const regexp * const re = (regexp *)mg->mg_obj;
9af30d34
NC
2530
2531 if (!mg->mg_ptr) {
2532 const char *fptr = "msix";
2533 char reflags[6];
2534 char ch;
2535 int left = 0;
2536 int right = 4;
00b6aa41 2537 bool need_newline = 0;
9af30d34
NC
2538 U16 reganch = (U16)((re->reganch & PMf_COMPILETIME) >> 12);
2539
2540 while((ch = *fptr++)) {
2541 if(reganch & 1) {
2542 reflags[left++] = ch;
2543 }
2544 else {
2545 reflags[right--] = ch;
2546 }
2547 reganch >>= 1;
2548 }
2549 if(left != 4) {
2550 reflags[left] = '-';
2551 left = 5;
2552 }
2553
2554 mg->mg_len = re->prelen + 4 + left;
2555 /*
2556 * If /x was used, we have to worry about a regex ending with a
2557 * comment later being embedded within another regex. If so, we don't
2558 * want this regex's "commentization" to leak out to the right part of
2559 * the enclosing regex, we must cap it with a newline.
2560 *
2561 * So, if /x was used, we scan backwards from the end of the regex. If
2562 * we find a '#' before we find a newline, we need to add a newline
2563 * ourself. If we find a '\n' first (or if we don't find '#' or '\n'),
2564 * we don't need to add anything. -jfriedl
2565 */
2566 if (PMf_EXTENDED & re->reganch) {
2567 const char *endptr = re->precomp + re->prelen;
2568 while (endptr >= re->precomp) {
2569 const char c = *(endptr--);
2570 if (c == '\n')
2571 break; /* don't need another */
2572 if (c == '#') {
2573 /* we end while in a comment, so we need a newline */
2574 mg->mg_len++; /* save space for it */
2575 need_newline = 1; /* note to add it */
2576 break;
2577 }
2578 }
2579 }
2580
2581 Newx(mg->mg_ptr, mg->mg_len + 1 + left, char);
2582 mg->mg_ptr[0] = '(';
2583 mg->mg_ptr[1] = '?';
2584 Copy(reflags, mg->mg_ptr+2, left, char);
2585 *(mg->mg_ptr+left+2) = ':';
2586 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
2587 if (need_newline)
2588 mg->mg_ptr[mg->mg_len - 2] = '\n';
2589 mg->mg_ptr[mg->mg_len - 1] = ')';
2590 mg->mg_ptr[mg->mg_len] = 0;
2591 }
2592 PL_reginterp_cnt += re->program[0].next_off;
2593
2594 if (re->reganch & ROPT_UTF8)
2595 SvUTF8_on(sv);
2596 else
2597 SvUTF8_off(sv);
2598 if (lp)
2599 *lp = mg->mg_len;
2600 return mg->mg_ptr;
2601}
2602
645c22ef
DM
2603/*
2604=for apidoc sv_2pv_flags
2605
ff276b08 2606Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
2607If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2608if necessary.
2609Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2610usually end up here too.
2611
2612=cut
2613*/
2614
8d6d96c1
HS
2615char *
2616Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
2617{
97aff369 2618 dVAR;
79072805 2619 register char *s;
79072805 2620
463ee0b2 2621 if (!sv) {
cdb061a3
NC
2622 if (lp)
2623 *lp = 0;
73d840c0 2624 return (char *)"";
463ee0b2 2625 }
8990e307 2626 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
2627 if (flags & SV_GMAGIC)
2628 mg_get(sv);
463ee0b2 2629 if (SvPOKp(sv)) {
cdb061a3
NC
2630 if (lp)
2631 *lp = SvCUR(sv);
10516c54
NC
2632 if (flags & SV_MUTABLE_RETURN)
2633 return SvPVX_mutable(sv);
4d84ee25
NC
2634 if (flags & SV_CONST_RETURN)
2635 return (char *)SvPVX_const(sv);
463ee0b2
LW
2636 return SvPVX(sv);
2637 }
75dfc8ec
NC
2638 if (SvIOKp(sv) || SvNOKp(sv)) {
2639 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
75dfc8ec
NC
2640 STRLEN len;
2641
2642 if (SvIOKp(sv)) {
e8ada2d0
NC
2643 len = SvIsUV(sv) ? my_sprintf(tbuf,"%"UVuf, (UV)SvUVX(sv))
2644 : my_sprintf(tbuf,"%"IVdf, (IV)SvIVX(sv));
75dfc8ec 2645 } else {
e8ada2d0
NC
2646 Gconvert(SvNVX(sv), NV_DIG, 0, tbuf);
2647 len = strlen(tbuf);
75dfc8ec 2648 }
b5b886f0
NC
2649 assert(!SvROK(sv));
2650 {
75dfc8ec
NC
2651 dVAR;
2652
2653#ifdef FIXNEGATIVEZERO
e8ada2d0
NC
2654 if (len == 2 && tbuf[0] == '-' && tbuf[1] == '0') {
2655 tbuf[0] = '0';
2656 tbuf[1] = 0;
75dfc8ec
NC
2657 len = 1;
2658 }
2659#endif
2660 SvUPGRADE(sv, SVt_PV);
2661 if (lp)
2662 *lp = len;
2663 s = SvGROW_mutable(sv, len + 1);
2664 SvCUR_set(sv, len);
2665 SvPOKp_on(sv);
e8ada2d0 2666 return memcpy(s, tbuf, len + 1);
75dfc8ec 2667 }
463ee0b2 2668 }
1c7ff15e
NC
2669 if (SvROK(sv)) {
2670 goto return_rok;
2671 }
2672 assert(SvTYPE(sv) >= SVt_PVMG);
2673 /* This falls through to the report_uninit near the end of the
2674 function. */
2675 } else if (SvTHINKFIRST(sv)) {
ed6116ce 2676 if (SvROK(sv)) {
1c7ff15e 2677 return_rok:
deb46114
NC
2678 if (SvAMAGIC(sv)) {
2679 SV *const tmpstr = AMG_CALLun(sv,string);
2680 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2681 /* Unwrap this: */
2682 /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
2683 */
2684
2685 char *pv;
2686 if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
2687 if (flags & SV_CONST_RETURN) {
2688 pv = (char *) SvPVX_const(tmpstr);
2689 } else {
2690 pv = (flags & SV_MUTABLE_RETURN)
2691 ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
2692 }
2693 if (lp)
2694 *lp = SvCUR(tmpstr);
50adf7d2 2695 } else {
deb46114 2696 pv = sv_2pv_flags(tmpstr, lp, flags);
50adf7d2 2697 }
deb46114
NC
2698 if (SvUTF8(tmpstr))
2699 SvUTF8_on(sv);
2700 else
2701 SvUTF8_off(sv);
2702 return pv;
50adf7d2 2703 }
deb46114
NC
2704 }
2705 {
75dfc8ec 2706 SV *tsv;
f9277f47 2707 MAGIC *mg;
d8eae41e
NC
2708 const SV *const referent = (SV*)SvRV(sv);
2709
2710 if (!referent) {
396482e1 2711 tsv = sv_2mortal(newSVpvs("NULLREF"));
042dae7a
NC
2712 } else if (SvTYPE(referent) == SVt_PVMG
2713 && ((SvFLAGS(referent) &
2714 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
2715 == (SVs_OBJECT|SVs_SMG))
2716 && (mg = mg_find(referent, PERL_MAGIC_qr))) {
c445ea15 2717 return stringify_regexp(sv, mg, lp);
d8eae41e
NC
2718 } else {
2719 const char *const typestr = sv_reftype(referent, 0);
2720
2721 tsv = sv_newmortal();
2722 if (SvOBJECT(referent)) {
2723 const char *const name = HvNAME_get(SvSTASH(referent));
2724 Perl_sv_setpvf(aTHX_ tsv, "%s=%s(0x%"UVxf")",
2725 name ? name : "__ANON__" , typestr,
2726 PTR2UV(referent));
2727 }
2728 else
2729 Perl_sv_setpvf(aTHX_ tsv, "%s(0x%"UVxf")", typestr,
2730 PTR2UV(referent));
c080367d 2731 }
042dae7a
NC
2732 if (lp)
2733 *lp = SvCUR(tsv);
2734 return SvPVX(tsv);
463ee0b2 2735 }
79072805 2736 }
0336b60e 2737 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2738 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2739 report_uninit(sv);
cdb061a3
NC
2740 if (lp)
2741 *lp = 0;
73d840c0 2742 return (char *)"";
79072805 2743 }
79072805 2744 }
28e5dec8
JH
2745 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
2746 /* I'm assuming that if both IV and NV are equally valid then
2747 converting the IV is going to be more efficient */
e1ec3a88
AL
2748 const U32 isIOK = SvIOK(sv);
2749 const U32 isUIOK = SvIsUV(sv);
28e5dec8
JH
2750 char buf[TYPE_CHARS(UV)];
2751 char *ebuf, *ptr;
2752
2753 if (SvTYPE(sv) < SVt_PVIV)
2754 sv_upgrade(sv, SVt_PVIV);
4ea1d550 2755 ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
5902b6a9
NC
2756 /* inlined from sv_setpvn */
2757 SvGROW_mutable(sv, (STRLEN)(ebuf - ptr + 1));
4d84ee25 2758 Move(ptr,SvPVX_mutable(sv),ebuf - ptr,char);
28e5dec8
JH
2759 SvCUR_set(sv, ebuf - ptr);
2760 s = SvEND(sv);
2761 *s = '\0';
2762 if (isIOK)
2763 SvIOK_on(sv);
2764 else
2765 SvIOKp_on(sv);
2766 if (isUIOK)
2767 SvIsUV_on(sv);
2768 }
2769 else if (SvNOKp(sv)) {
c81271c3 2770 const int olderrno = errno;
79072805
LW
2771 if (SvTYPE(sv) < SVt_PVNV)
2772 sv_upgrade(sv, SVt_PVNV);
1c846c1f 2773 /* The +20 is pure guesswork. Configure test needed. --jhi */
5902b6a9 2774 s = SvGROW_mutable(sv, NV_DIG + 20);
c81271c3 2775 /* some Xenix systems wipe out errno here */
79072805 2776#ifdef apollo
463ee0b2 2777 if (SvNVX(sv) == 0.0)
79072805
LW
2778 (void)strcpy(s,"0");
2779 else
2780#endif /*apollo*/
bbce6d69 2781 {
2d4389e4 2782 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 2783 }
79072805 2784 errno = olderrno;
a0d0e21e
LW
2785#ifdef FIXNEGATIVEZERO
2786 if (*s == '-' && s[1] == '0' && !s[2])
2787 strcpy(s,"0");
2788#endif
79072805
LW
2789 while (*s) s++;
2790#ifdef hcx
2791 if (s[-1] == '.')
46fc3d4c 2792 *--s = '\0';
79072805
LW
2793#endif
2794 }
79072805 2795 else {
f7877b28 2796 if (isGV_with_GP(sv)) {
180488f8
NC
2797 return glob_2inpuv((GV *)sv, lp, FALSE);
2798 }
2799
041457d9 2800 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
29489e7c 2801 report_uninit(sv);
cdb061a3 2802 if (lp)
00b6aa41 2803 *lp = 0;
25da4f38
IZ
2804 if (SvTYPE(sv) < SVt_PV)
2805 /* Typically the caller expects that sv_any is not NULL now. */
2806 sv_upgrade(sv, SVt_PV);
73d840c0 2807 return (char *)"";
79072805 2808 }
cdb061a3 2809 {
823a54a3 2810 const STRLEN len = s - SvPVX_const(sv);
cdb061a3
NC
2811 if (lp)
2812 *lp = len;
2813 SvCUR_set(sv, len);
2814 }
79072805 2815 SvPOK_on(sv);
1d7c1841 2816 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 2817 PTR2UV(sv),SvPVX_const(sv)));
4d84ee25
NC
2818 if (flags & SV_CONST_RETURN)
2819 return (char *)SvPVX_const(sv);
10516c54
NC
2820 if (flags & SV_MUTABLE_RETURN)
2821 return SvPVX_mutable(sv);
463ee0b2
LW
2822 return SvPVX(sv);
2823}
2824
645c22ef 2825/*
6050d10e
JP
2826=for apidoc sv_copypv
2827
2828Copies a stringified representation of the source SV into the
2829destination SV. Automatically performs any necessary mg_get and
54f0641b 2830coercion of numeric values into strings. Guaranteed to preserve
6050d10e 2831UTF-8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
2832sv_2pv[_flags] but operates directly on an SV instead of just the
2833string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
2834would lose the UTF-8'ness of the PV.
2835
2836=cut
2837*/
2838
2839void
2840Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
2841{
446eaa42 2842 STRLEN len;
53c1dcc0 2843 const char * const s = SvPV_const(ssv,len);
cb50f42d 2844 sv_setpvn(dsv,s,len);
446eaa42 2845 if (SvUTF8(ssv))
cb50f42d 2846 SvUTF8_on(dsv);
446eaa42 2847 else
cb50f42d 2848 SvUTF8_off(dsv);
6050d10e
JP
2849}
2850
2851/*
645c22ef
DM
2852=for apidoc sv_2pvbyte
2853
2854Return a pointer to the byte-encoded representation of the SV, and set *lp
1e54db1a 2855to its length. May cause the SV to be downgraded from UTF-8 as a
645c22ef
DM
2856side-effect.
2857
2858Usually accessed via the C<SvPVbyte> macro.
2859
2860=cut
2861*/
2862
7340a771
GS
2863char *
2864Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
2865{
0875d2fe 2866 sv_utf8_downgrade(sv,0);
97972285 2867 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771
GS
2868}
2869
645c22ef 2870/*
035cbb0e
RGS
2871=for apidoc sv_2pvutf8
2872
2873Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
2874to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
2875
2876Usually accessed via the C<SvPVutf8> macro.
2877
2878=cut
2879*/
645c22ef 2880
7340a771
GS
2881char *
2882Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
2883{
035cbb0e
RGS
2884 sv_utf8_upgrade(sv);
2885 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771 2886}
1c846c1f 2887
7ee2227d 2888
645c22ef
DM
2889/*
2890=for apidoc sv_2bool
2891
2892This function is only called on magical items, and is only used by
8cf8f3d1 2893sv_true() or its macro equivalent.
645c22ef
DM
2894
2895=cut
2896*/
2897
463ee0b2 2898bool
864dbfa3 2899Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 2900{
97aff369 2901 dVAR;
5b295bef 2902 SvGETMAGIC(sv);
463ee0b2 2903
a0d0e21e
LW
2904 if (!SvOK(sv))
2905 return 0;
2906 if (SvROK(sv)) {
fabdb6c0
AL
2907 if (SvAMAGIC(sv)) {
2908 SV * const tmpsv = AMG_CALLun(sv,bool_);
2909 if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2910 return (bool)SvTRUE(tmpsv);
2911 }
2912 return SvRV(sv) != 0;
a0d0e21e 2913 }
463ee0b2 2914 if (SvPOKp(sv)) {
53c1dcc0
AL
2915 register XPV* const Xpvtmp = (XPV*)SvANY(sv);
2916 if (Xpvtmp &&
339049b0 2917 (*sv->sv_u.svu_pv > '0' ||
11343788 2918 Xpvtmp->xpv_cur > 1 ||
339049b0 2919 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
463ee0b2
LW
2920 return 1;
2921 else
2922 return 0;
2923 }
2924 else {
2925 if (SvIOKp(sv))
2926 return SvIVX(sv) != 0;
2927 else {
2928 if (SvNOKp(sv))
2929 return SvNVX(sv) != 0.0;
180488f8 2930 else {
f7877b28 2931 if (isGV_with_GP(sv))
180488f8
NC
2932 return TRUE;
2933 else
2934 return FALSE;
2935 }
463ee0b2
LW
2936 }
2937 }
79072805
LW
2938}
2939
c461cf8f
JH
2940/*
2941=for apidoc sv_utf8_upgrade
2942
78ea37eb 2943Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 2944Forces the SV to string form if it is not already.
4411f3b6
NIS
2945Always sets the SvUTF8 flag to avoid future validity checks even
2946if all the bytes have hibit clear.
c461cf8f 2947
13a6c0e0
JH
2948This is not as a general purpose byte encoding to Unicode interface:
2949use the Encode extension for that.
2950
8d6d96c1
HS
2951=for apidoc sv_utf8_upgrade_flags
2952
78ea37eb 2953Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 2954Forces the SV to string form if it is not already.
8d6d96c1
HS
2955Always sets the SvUTF8 flag to avoid future validity checks even
2956if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
2957will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
2958C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
2959
13a6c0e0
JH
2960This is not as a general purpose byte encoding to Unicode interface:
2961use the Encode extension for that.
2962
8d6d96c1
HS
2963=cut
2964*/
2965
2966STRLEN
2967Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
2968{
97aff369 2969 dVAR;
808c356f
RGS
2970 if (sv == &PL_sv_undef)
2971 return 0;
e0e62c2a
NIS
2972 if (!SvPOK(sv)) {
2973 STRLEN len = 0;
d52b7888
NC
2974 if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
2975 (void) sv_2pv_flags(sv,&len, flags);
2976 if (SvUTF8(sv))
2977 return len;
2978 } else {
2979 (void) SvPV_force(sv,len);
2980 }
e0e62c2a 2981 }
4411f3b6 2982
f5cee72b 2983 if (SvUTF8(sv)) {
5fec3b1d 2984 return SvCUR(sv);
f5cee72b 2985 }
5fec3b1d 2986
765f542d
NC
2987 if (SvIsCOW(sv)) {
2988 sv_force_normal_flags(sv, 0);
db42d148
NIS
2989 }
2990
88632417 2991 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
799ef3cb 2992 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 2993 else { /* Assume Latin-1/EBCDIC */
c4e7c712
NC
2994 /* This function could be much more efficient if we
2995 * had a FLAG in SVs to signal if there are any hibit
2996 * chars in the PV. Given that there isn't such a flag
2997 * make the loop as fast as possible. */
00b6aa41 2998 const U8 * const s = (U8 *) SvPVX_const(sv);
c4420975 2999 const U8 * const e = (U8 *) SvEND(sv);
93524f2b 3000 const U8 *t = s;
c4e7c712
NC
3001
3002 while (t < e) {
53c1dcc0 3003 const U8 ch = *t++;
00b6aa41
AL
3004 /* Check for hi bit */
3005 if (!NATIVE_IS_INVARIANT(ch)) {
3006 STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
3007 U8 * const recoded = bytes_to_utf8((U8*)s, &len);
3008
3009 SvPV_free(sv); /* No longer using what was there before. */
3010 SvPV_set(sv, (char*)recoded);
3011 SvCUR_set(sv, len - 1);
3012 SvLEN_set(sv, len); /* No longer know the real size. */
c4e7c712 3013 break;
00b6aa41 3014 }
c4e7c712
NC
3015 }
3016 /* Mark as UTF-8 even if no hibit - saves scanning loop */
3017 SvUTF8_on(sv);
560a288e 3018 }
4411f3b6 3019 return SvCUR(sv);
560a288e
GS
3020}
3021
c461cf8f
JH
3022/*
3023=for apidoc sv_utf8_downgrade
3024
78ea37eb
TS
3025Attempts to convert the PV of an SV from characters to bytes.
3026If the PV contains a character beyond byte, this conversion will fail;
3027in this case, either returns false or, if C<fail_ok> is not
c461cf8f
JH
3028true, croaks.
3029
13a6c0e0
JH
3030This is not as a general purpose Unicode to byte encoding interface:
3031use the Encode extension for that.
3032
c461cf8f
JH
3033=cut
3034*/
3035
560a288e
GS
3036bool
3037Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
3038{
97aff369 3039 dVAR;
78ea37eb 3040 if (SvPOKp(sv) && SvUTF8(sv)) {
fa301091 3041 if (SvCUR(sv)) {
03cfe0ae 3042 U8 *s;
652088fc 3043 STRLEN len;
fa301091 3044
765f542d
NC
3045 if (SvIsCOW(sv)) {
3046 sv_force_normal_flags(sv, 0);
3047 }
03cfe0ae
NIS
3048 s = (U8 *) SvPV(sv, len);
3049 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
3050 if (fail_ok)
3051 return FALSE;
3052 else {
3053 if (PL_op)
3054 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 3055 OP_DESC(PL_op));
fa301091
JH
3056 else
3057 Perl_croak(aTHX_ "Wide character");
3058 }
4b3603a4 3059 }
b162af07 3060 SvCUR_set(sv, len);
67e989fb 3061 }
560a288e 3062 }
ffebcc3e 3063 SvUTF8_off(sv);
560a288e
GS
3064 return TRUE;
3065}
3066
c461cf8f
JH
3067/*
3068=for apidoc sv_utf8_encode
3069
78ea37eb
TS
3070Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3071flag off so that it looks like octets again.
c461cf8f
JH
3072
3073=cut
3074*/
3075
560a288e
GS
3076void
3077Perl_sv_utf8_encode(pTHX_ register SV *sv)
3078{
4411f3b6 3079 (void) sv_utf8_upgrade(sv);
4c94c214
NC
3080 if (SvIsCOW(sv)) {
3081 sv_force_normal_flags(sv, 0);
3082 }
3083 if (SvREADONLY(sv)) {
3084 Perl_croak(aTHX_ PL_no_modify);
3085 }
560a288e
GS
3086 SvUTF8_off(sv);
3087}
3088
4411f3b6
NIS
3089/*
3090=for apidoc sv_utf8_decode
3091
78ea37eb
TS
3092If the PV of the SV is an octet sequence in UTF-8
3093and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3094so that it looks like a character. If the PV contains only single-byte
3095characters, the C<SvUTF8> flag stays being off.
3096Scans PV for validity and returns false if the PV is invalid UTF-8.
4411f3b6
NIS
3097
3098=cut
3099*/
3100
560a288e
GS
3101bool
3102Perl_sv_utf8_decode(pTHX_ register SV *sv)
3103{
78ea37eb 3104 if (SvPOKp(sv)) {
93524f2b
NC
3105 const U8 *c;
3106 const U8 *e;
9cbac4c7 3107
645c22ef
DM
3108 /* The octets may have got themselves encoded - get them back as
3109 * bytes
3110 */
3111 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
3112 return FALSE;
3113
3114 /* it is actually just a matter of turning the utf8 flag on, but
3115 * we want to make sure everything inside is valid utf8 first.
3116 */
93524f2b 3117 c = (const U8 *) SvPVX_const(sv);
63cd0674 3118 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 3119 return FALSE;
93524f2b 3120 e = (const U8 *) SvEND(sv);
511c2ff0 3121 while (c < e) {
b64e5050 3122 const U8 ch = *c++;
c4d5f83a 3123 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
3124 SvUTF8_on(sv);
3125 break;
3126 }
560a288e 3127 }
560a288e
GS
3128 }
3129 return TRUE;
3130}
3131
954c1994
GS
3132/*
3133=for apidoc sv_setsv
3134
645c22ef
DM
3135Copies the contents of the source SV C<ssv> into the destination SV
3136C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3137function if the source SV needs to be reused. Does not handle 'set' magic.
3138Loosely speaking, it performs a copy-by-value, obliterating any previous
3139content of the destination.
3140
3141You probably want to use one of the assortment of wrappers, such as
3142C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3143C<SvSetMagicSV_nosteal>.
3144
8d6d96c1
HS
3145=for apidoc sv_setsv_flags
3146
645c22ef
DM
3147Copies the contents of the source SV C<ssv> into the destination SV
3148C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3149function if the source SV needs to be reused. Does not handle 'set' magic.
3150Loosely speaking, it performs a copy-by-value, obliterating any previous
3151content of the destination.
3152If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
5fcdf167
NC
3153C<ssv> if appropriate, else not. If the C<flags> parameter has the
3154C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
3155and C<sv_setsv_nomg> are implemented in terms of this function.
645c22ef
DM
3156
3157You probably want to use one of the assortment of wrappers, such as
3158C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3159C<SvSetMagicSV_nosteal>.
3160
3161This is the primary function for copying scalars, and most other
3162copy-ish functions and macros use this underneath.
8d6d96c1
HS
3163
3164=cut
3165*/
3166
5d0301b7 3167static void
2eb42952 3168S_glob_assign_glob(pTHX_ SV *dstr, SV *sstr, const int dtype)
5d0301b7
NC
3169{
3170 if (dtype != SVt_PVGV) {
3171 const char * const name = GvNAME(sstr);
3172 const STRLEN len = GvNAMELEN(sstr);
3173 /* don't upgrade SVt_PVLV: it can hold a glob */
f7877b28
NC
3174 if (dtype != SVt_PVLV) {
3175 if (dtype >= SVt_PV) {
3176 SvPV_free(dstr);
3177 SvPV_set(dstr, 0);
3178 SvLEN_set(dstr, 0);
3179 SvCUR_set(dstr, 0);
3180 }
5d0301b7 3181 sv_upgrade(dstr, SVt_PVGV);
dedf8e73
NC
3182 (void)SvOK_off(dstr);
3183 SvSCREAM_on(dstr);
f7877b28 3184 }
5d0301b7
NC
3185 GvSTASH(dstr) = GvSTASH(sstr);
3186 if (GvSTASH(dstr))
3187 Perl_sv_add_backref(aTHX_ (SV*)GvSTASH(dstr), dstr);
ae8cc45f 3188 gv_name_set((GV *)dstr, name, len, GV_ADD);
5d0301b7
NC
3189 SvFAKE_on(dstr); /* can coerce to non-glob */
3190 }
3191
3192#ifdef GV_UNIQUE_CHECK
3193 if (GvUNIQUE((GV*)dstr)) {
3194 Perl_croak(aTHX_ PL_no_modify);
3195 }
3196#endif
3197
f7877b28
NC
3198 gp_free((GV*)dstr);
3199 SvSCREAM_off(dstr);
5d0301b7 3200 (void)SvOK_off(dstr);
f7877b28 3201 SvSCREAM_on(dstr);
dedf8e73 3202 GvINTRO_off(dstr); /* one-shot flag */
5d0301b7
NC
3203 GvGP(dstr) = gp_ref(GvGP(sstr));
3204 if (SvTAINTED(sstr))
3205 SvTAINT(dstr);
3206 if (GvIMPORTED(dstr) != GVf_IMPORTED
3207 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3208 {
3209 GvIMPORTED_on(dstr);
3210 }
3211 GvMULTI_on(dstr);
3212 return;
3213}
3214
b8473700 3215static void
2eb42952 3216S_glob_assign_ref(pTHX_ SV *dstr, SV *sstr) {
b8473700
NC
3217 SV * const sref = SvREFCNT_inc(SvRV(sstr));
3218 SV *dref = NULL;
3219 const int intro = GvINTRO(dstr);
2440974c 3220 SV **location;
3386d083 3221 U8 import_flag = 0;
27242d61
NC
3222 const U32 stype = SvTYPE(sref);
3223
b8473700
NC
3224
3225#ifdef GV_UNIQUE_CHECK
3226 if (GvUNIQUE((GV*)dstr)) {
3227 Perl_croak(aTHX_ PL_no_modify);
3228 }
3229#endif
3230
3231 if (intro) {
3232 GvINTRO_off(dstr); /* one-shot flag */
3233 GvLINE(dstr) = CopLINE(PL_curcop);
3234 GvEGV(dstr) = (GV*)dstr;
3235 }
3236 GvMULTI_on(dstr);
27242d61 3237 switch (stype) {
b8473700 3238 case SVt_PVCV:
27242d61
NC
3239 location = (SV **) &GvCV(dstr);
3240 import_flag = GVf_IMPORTED_CV;
3241 goto common;
3242 case SVt_PVHV:
3243 location = (SV **) &GvHV(dstr);
3244 import_flag = GVf_IMPORTED_HV;
3245 goto common;
3246 case SVt_PVAV:
3247 location = (SV **) &GvAV(dstr);
3248 import_flag = GVf_IMPORTED_AV;
3249 goto common;
3250 case SVt_PVIO:
3251 location = (SV **) &GvIOp(dstr);
3252 goto common;
3253 case SVt_PVFM:
3254 location = (SV **) &GvFORM(dstr);
3255 default:
3256 location = &GvSV(dstr);
3257 import_flag = GVf_IMPORTED_SV;
3258 common:
b8473700 3259 if (intro) {
27242d61
NC
3260 if (stype == SVt_PVCV) {
3261 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
3262 SvREFCNT_dec(GvCV(dstr));
3263 GvCV(dstr) = NULL;
3264 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3265 PL_sub_generation++;
3266 }
b8473700 3267 }
27242d61 3268 SAVEGENERICSV(*location);
b8473700
NC
3269 }
3270 else
27242d61
NC
3271 dref = *location;
3272 if (stype == SVt_PVCV && *location != sref) {
3273 CV* const cv = (CV*)*location;
b8473700
NC
3274 if (cv) {
3275 if (!GvCVGEN((GV*)dstr) &&
3276 (CvROOT(cv) || CvXSUB(cv)))
3277 {
3278 /* Redefining a sub - warning is mandatory if
3279 it was a const and its value changed. */
3280 if (CvCONST(cv) && CvCONST((CV*)sref)
3281 && cv_const_sv(cv) == cv_const_sv((CV*)sref)) {
bb263b4e 3282 /*EMPTY*/
b8473700
NC
3283 /* They are 2 constant subroutines generated from
3284 the same constant. This probably means that
3285 they are really the "same" proxy subroutine
3286 instantiated in 2 places. Most likely this is
3287 when a constant is exported twice. Don't warn.
3288 */
3289 }
3290 else if (ckWARN(WARN_REDEFINE)
3291 || (CvCONST(cv)
3292 && (!CvCONST((CV*)sref)
3293 || sv_cmp(cv_const_sv(cv),
3294 cv_const_sv((CV*)sref))))) {
3295 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
3296 CvCONST(cv)
3297 ? "Constant subroutine %s::%s redefined"
3298 : "Subroutine %s::%s redefined",
3299 HvNAME_get(GvSTASH((GV*)dstr)),
3300 GvENAME((GV*)dstr));
3301 }
3302 }
3303 if (!intro)
3304 cv_ckproto(cv, (GV*)dstr,
bd61b366 3305 SvPOK(sref) ? SvPVX_const(sref) : NULL);
b8473700 3306 }
b8473700
NC
3307 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3308 GvASSUMECV_on(dstr);
3309 PL_sub_generation++;
3310 }
2440974c 3311 *location = sref;
3386d083
NC
3312 if (import_flag && !(GvFLAGS(dstr) & import_flag)
3313 && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
3314 GvFLAGS(dstr) |= import_flag;
b8473700
NC
3315 }
3316 break;
3317 }
b37c2d43 3318 SvREFCNT_dec(dref);
b8473700
NC
3319 if (SvTAINTED(sstr))
3320 SvTAINT(dstr);
3321 return;
3322}
3323
8d6d96c1
HS
3324void
3325Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
3326{
97aff369 3327 dVAR;
8990e307
LW
3328 register U32 sflags;
3329 register int dtype;
3330 register int stype;
463ee0b2 3331
79072805
LW
3332 if (sstr == dstr)
3333 return;
765f542d 3334 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 3335 if (!sstr)
3280af22 3336 sstr = &PL_sv_undef;
8990e307
LW
3337 stype = SvTYPE(sstr);
3338 dtype = SvTYPE(dstr);
79072805 3339
a0d0e21e 3340 SvAMAGIC_off(dstr);
7a5fa8a2 3341 if ( SvVOK(dstr) )
ece467f9
JP
3342 {
3343 /* need to nuke the magic */
3344 mg_free(dstr);
3345 SvRMAGICAL_off(dstr);
3346 }
9e7bc3e8 3347
463ee0b2 3348 /* There's a lot of redundancy below but we're going for speed here */
79072805 3349
8990e307 3350 switch (stype) {
79072805 3351 case SVt_NULL:
aece5585 3352 undef_sstr:
20408e3c
GS
3353 if (dtype != SVt_PVGV) {
3354 (void)SvOK_off(dstr);
3355 return;
3356 }
3357 break;
463ee0b2 3358 case SVt_IV:
aece5585
GA
3359 if (SvIOK(sstr)) {
3360 switch (dtype) {
3361 case SVt_NULL:
8990e307 3362 sv_upgrade(dstr, SVt_IV);
aece5585
GA
3363 break;
3364 case SVt_NV:
aece5585
GA
3365 case SVt_RV:
3366 case SVt_PV:
a0d0e21e 3367 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
3368 break;
3369 }
3370 (void)SvIOK_only(dstr);
45977657 3371 SvIV_set(dstr, SvIVX(sstr));
25da4f38
IZ
3372 if (SvIsUV(sstr))
3373 SvIsUV_on(dstr);
37c25af0
NC
3374 /* SvTAINTED can only be true if the SV has taint magic, which in
3375 turn means that the SV type is PVMG (or greater). This is the
3376 case statement for SVt_IV, so this cannot be true (whatever gcov
3377 may say). */
3378 assert(!SvTAINTED(sstr));
aece5585 3379 return;
8990e307 3380 }
aece5585
GA
3381 goto undef_sstr;
3382
463ee0b2 3383 case SVt_NV:
aece5585
GA
3384 if (SvNOK(sstr)) {
3385 switch (dtype) {
3386 case SVt_NULL:
3387 case SVt_IV:
8990e307 3388 sv_upgrade(dstr, SVt_NV);
aece5585
GA
3389 break;
3390 case SVt_RV:
3391 case SVt_PV:
3392 case SVt_PVIV:
a0d0e21e 3393 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
3394 break;
3395 }
9d6ce603 3396 SvNV_set(dstr, SvNVX(sstr));
aece5585 3397 (void)SvNOK_only(dstr);
37c25af0
NC
3398 /* SvTAINTED can only be true if the SV has taint magic, which in
3399 turn means that the SV type is PVMG (or greater). This is the
3400 case statement for SVt_NV, so this cannot be true (whatever gcov
3401 may say). */
3402 assert(!SvTAINTED(sstr));
aece5585 3403 return;
8990e307 3404 }
aece5585
GA
3405 goto undef_sstr;
3406
ed6116ce 3407 case SVt_RV:
8990e307 3408 if (dtype < SVt_RV)
ed6116ce 3409 sv_upgrade(dstr, SVt_RV);
ed6116ce 3410 break;
fc36a67e 3411 case SVt_PVFM:
f8c7b90f 3412#ifdef PERL_OLD_COPY_ON_WRITE
d89fc664
NC
3413 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
3414 if (dtype < SVt_PVIV)
3415 sv_upgrade(dstr, SVt_PVIV);
3416 break;
3417 }
3418 /* Fall through */
3419#endif
3420 case SVt_PV:
8990e307 3421 if (dtype < SVt_PV)
463ee0b2 3422 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
3423 break;
3424 case SVt_PVIV:
8990e307 3425 if (dtype < SVt_PVIV)
463ee0b2 3426 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
3427 break;
3428 case SVt_PVNV:
8990e307 3429 if (dtype < SVt_PVNV)
463ee0b2 3430 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 3431 break;
489f7bfe 3432 default:
a3b680e6
AL
3433 {
3434 const char * const type = sv_reftype(sstr,0);
533c011a 3435 if (PL_op)
a3b680e6 3436 Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_NAME(PL_op));
4633a7c4 3437 else
a3b680e6
AL
3438 Perl_croak(aTHX_ "Bizarre copy of %s", type);
3439 }
4633a7c4
LW
3440 break;
3441
79072805 3442 case SVt_PVGV:
8990e307 3443 if (dtype <= SVt_PVGV) {
2eb42952 3444 S_glob_assign_glob(aTHX_ dstr, sstr, dtype);
b8c701c1 3445 return;
79072805 3446 }
5f66b61c 3447 /*FALLTHROUGH*/
79072805 3448
489f7bfe
NC
3449 case SVt_PVMG:
3450 case SVt_PVLV:
3451 case SVt_PVBM:
8d6d96c1 3452 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 3453 mg_get(sstr);
eb160463 3454 if ((int)SvTYPE(sstr) != stype) {
973f89ab 3455 stype = SvTYPE(sstr);
b8c701c1 3456 if (stype == SVt_PVGV && dtype <= SVt_PVGV) {
2eb42952 3457 S_glob_assign_glob(aTHX_ dstr, sstr, dtype);
b8c701c1
NC
3458 return;
3459 }
973f89ab
CS
3460 }
3461 }
ded42b9f 3462 if (stype == SVt_PVLV)
862a34c6 3463 SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 3464 else
862a34c6 3465 SvUPGRADE(dstr, (U32)stype);
79072805
LW
3466 }
3467
ff920335
NC
3468 /* dstr may have been upgraded. */
3469 dtype = SvTYPE(dstr);
8990e307
LW
3470 sflags = SvFLAGS(sstr);
3471
3472 if (sflags & SVf_ROK) {
acaa9288
NC
3473 if (dtype == SVt_PVGV &&
3474 SvROK(sstr) && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
3475 sstr = SvRV(sstr);
3476 if (sstr == dstr) {
3477 if (GvIMPORTED(dstr) != GVf_IMPORTED
3478 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3479 {
3480 GvIMPORTED_on(dstr);
3481 }
3482 GvMULTI_on(dstr);
3483 return;
3484 }
2eb42952 3485 S_glob_assign_glob(aTHX_ dstr, sstr, dtype);
acaa9288
NC
3486 return;
3487 }
3488
8990e307 3489 if (dtype >= SVt_PV) {
b8c701c1 3490 if (dtype == SVt_PVGV) {
2eb42952 3491 S_glob_assign_ref(aTHX_ dstr, sstr);
b8c701c1
NC
3492 return;
3493 }
3f7c398e 3494 if (SvPVX_const(dstr)) {
8bd4d4c5 3495 SvPV_free(dstr);
b162af07
SP
3496 SvLEN_set(dstr, 0);
3497 SvCUR_set(dstr, 0);
a0d0e21e 3498 }
8990e307 3499 }
a0d0e21e 3500 (void)SvOK_off(dstr);
b162af07 3501 SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
dfd48732
NC
3502 SvFLAGS(dstr) |= sflags & (SVf_ROK|SVf_AMAGIC);
3503 assert(!(sflags & SVp_NOK));
3504 assert(!(sflags & SVp_IOK));
3505 assert(!(sflags & SVf_NOK));
3506 assert(!(sflags & SVf_IOK));
ed6116ce 3507 }
c0c44674
NC
3508 else if (dtype == SVt_PVGV) {
3509 if (!(sflags & SVf_OK)) {
3510 if (ckWARN(WARN_MISC))
3511 Perl_warner(aTHX_ packWARN(WARN_MISC),
3512 "Undefined value assigned to typeglob");
3513 }
3514 else {
3515 GV *gv = gv_fetchsv(sstr, GV_ADD, SVt_PVGV);
3516 if (dstr != (SV*)gv) {
3517 if (GvGP(dstr))
3518 gp_free((GV*)dstr);
3519 GvGP(dstr) = gp_ref(GvGP(gv));
3520 }
3521 }
3522 }
8990e307 3523 else if (sflags & SVp_POK) {
765f542d 3524 bool isSwipe = 0;
79072805
LW
3525
3526 /*
3527 * Check to see if we can just swipe the string. If so, it's a
3528 * possible small lose on short strings, but a big win on long ones.
3f7c398e
SP
3529 * It might even be a win on short strings if SvPVX_const(dstr)
3530 * has to be allocated and SvPVX_const(sstr) has to be freed.
79072805
LW
3531 */
3532
120fac95
NC
3533 /* Whichever path we take through the next code, we want this true,
3534 and doing it now facilitates the COW check. */
3535 (void)SvPOK_only(dstr);
3536
765f542d 3537 if (
b8f9541a
NC
3538 /* We're not already COW */
3539 ((sflags & (SVf_FAKE | SVf_READONLY)) != (SVf_FAKE | SVf_READONLY)
f8c7b90f 3540#ifndef PERL_OLD_COPY_ON_WRITE
b8f9541a
NC
3541 /* or we are, but dstr isn't a suitable target. */
3542 || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
3543#endif
3544 )
765f542d 3545 &&
765f542d
NC
3546 !(isSwipe =
3547 (sflags & SVs_TEMP) && /* slated for free anyway? */
3548 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
5fcdf167
NC
3549 (!(flags & SV_NOSTEAL)) &&
3550 /* and we're allowed to steal temps */
765f542d
NC
3551 SvREFCNT(sstr) == 1 && /* and no other references to it? */
3552 SvLEN(sstr) && /* and really is a string */
645c22ef 3553 /* and won't be needed again, potentially */
765f542d 3554 !(PL_op && PL_op->op_type == OP_AASSIGN))
f8c7b90f 3555#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 3556 && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
120fac95 3557 && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
765f542d
NC
3558 && SvTYPE(sstr) >= SVt_PVIV)
3559#endif
3560 ) {
3561 /* Failed the swipe test, and it's not a shared hash key either.
3562 Have to copy the string. */
3563 STRLEN len = SvCUR(sstr);
3564 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3f7c398e 3565 Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
765f542d
NC
3566 SvCUR_set(dstr, len);
3567 *SvEND(dstr) = '\0';
765f542d 3568 } else {
f8c7b90f 3569 /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
765f542d 3570 be true in here. */
765f542d
NC
3571 /* Either it's a shared hash key, or it's suitable for
3572 copy-on-write or we can swipe the string. */
46187eeb 3573 if (DEBUG_C_TEST) {
ed252734 3574 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
3575 sv_dump(sstr);
3576 sv_dump(dstr);
46187eeb 3577 }
f8c7b90f 3578#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
3579 if (!isSwipe) {
3580 /* I believe I should acquire a global SV mutex if
3581 it's a COW sv (not a shared hash key) to stop
3582 it going un copy-on-write.
3583 If the source SV has gone un copy on write between up there
3584 and down here, then (assert() that) it is of the correct
3585 form to make it copy on write again */
3586 if ((sflags & (SVf_FAKE | SVf_READONLY))
3587 != (SVf_FAKE | SVf_READONLY)) {
3588 SvREADONLY_on(sstr);
3589 SvFAKE_on(sstr);
3590 /* Make the source SV into a loop of 1.
3591 (about to become 2) */
a29f6d03 3592 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
3593 }
3594 }
3595#endif
3596 /* Initial code is common. */
94010e71
NC
3597 if (SvPVX_const(dstr)) { /* we know that dtype >= SVt_PV */
3598 SvPV_free(dstr);
79072805 3599 }
765f542d 3600
765f542d
NC
3601 if (!isSwipe) {
3602 /* making another shared SV. */
3603 STRLEN cur = SvCUR(sstr);
3604 STRLEN len = SvLEN(sstr);
f8c7b90f 3605#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 3606 if (len) {
b8f9541a 3607 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
3608 /* SvIsCOW_normal */
3609 /* splice us in between source and next-after-source. */
a29f6d03
NC
3610 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3611 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 3612 SvPV_set(dstr, SvPVX_mutable(sstr));
a604c751
NC
3613 } else
3614#endif
3615 {
765f542d 3616 /* SvIsCOW_shared_hash */
46187eeb
NC
3617 DEBUG_C(PerlIO_printf(Perl_debug_log,
3618 "Copy on write: Sharing hash\n"));
b8f9541a 3619
bdd68bc3 3620 assert (SvTYPE(dstr) >= SVt_PV);
765f542d 3621 SvPV_set(dstr,
d1db91c6 3622 HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
bdd68bc3 3623 }
87a1ef3d
SP
3624 SvLEN_set(dstr, len);
3625 SvCUR_set(dstr, cur);
765f542d
NC
3626 SvREADONLY_on(dstr);
3627 SvFAKE_on(dstr);
3628 /* Relesase a global SV mutex. */
3629 }
3630 else
765f542d 3631 { /* Passes the swipe test. */
78d1e721 3632 SvPV_set(dstr, SvPVX_mutable(sstr));
765f542d
NC
3633 SvLEN_set(dstr, SvLEN(sstr));
3634 SvCUR_set(dstr, SvCUR(sstr));
3635
3636 SvTEMP_off(dstr);
3637 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
6136c704 3638 SvPV_set(sstr, NULL);
765f542d
NC
3639 SvLEN_set(sstr, 0);
3640 SvCUR_set(sstr, 0);
3641 SvTEMP_off(sstr);
3642 }
3643 }
8990e307 3644 if (sflags & SVp_NOK) {
9d6ce603 3645 SvNV_set(dstr, SvNVX(sstr));
79072805 3646 }
8990e307 3647 if (sflags & SVp_IOK) {
23525414
NC
3648 SvRELEASE_IVX(dstr);
3649 SvIV_set(dstr, SvIVX(sstr));
3650 /* Must do this otherwise some other overloaded use of 0x80000000
3651 gets confused. I guess SVpbm_VALID */
2b1c7e3e 3652 if (sflags & SVf_IVisUV)
25da4f38 3653 SvIsUV_on(dstr);
79072805 3654 }
dd2eae66
NC
3655 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8
3656 |SVf_AMAGIC);
4f2da183
NC
3657 {
3658 const MAGIC * const smg = SvVOK(sstr);
3659 if (smg) {
3660 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
3661 smg->mg_ptr, smg->mg_len);
3662 SvRMAGICAL_on(dstr);
3663 }
7a5fa8a2 3664 }
79072805 3665 }
5d581361 3666 else if (sflags & (SVp_IOK|SVp_NOK)) {
c2468cc7 3667 (void)SvOK_off(dstr);
dd2eae66
NC
3668 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK
3669 |SVf_AMAGIC);
5d581361
NC
3670 if (sflags & SVp_IOK) {
3671 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
3672 SvIV_set(dstr, SvIVX(sstr));
3673 }
3332b3c1 3674 if (sflags & SVp_NOK) {
9d6ce603 3675 SvNV_set(dstr, SvNVX(sstr));
3332b3c1
JH
3676 }
3677 }
79072805 3678 else {
f7877b28 3679 if (isGV_with_GP(sstr)) {
180488f8
NC
3680 /* This stringification rule for globs is spread in 3 places.
3681 This feels bad. FIXME. */
3682 const U32 wasfake = sflags & SVf_FAKE;
3683
3684 /* FAKE globs can get coerced, so need to turn this off
3685 temporarily if it is on. */
3686 SvFAKE_off(sstr);
3687 gv_efullname3(dstr, (GV *)sstr, "*");
3688 SvFLAGS(sstr) |= wasfake;
dd2eae66 3689 SvFLAGS(dstr) |= sflags & SVf_AMAGIC;
180488f8 3690 }
20408e3c
GS
3691 else
3692 (void)SvOK_off(dstr);
a0d0e21e 3693 }
27c9684d
AP
3694 if (SvTAINTED(sstr))
3695 SvTAINT(dstr);
79072805
LW
3696}
3697
954c1994
GS
3698/*
3699=for apidoc sv_setsv_mg
3700
3701Like C<sv_setsv>, but also handles 'set' magic.
3702
3703=cut
3704*/
3705
79072805 3706void
864dbfa3 3707Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
3708{
3709 sv_setsv(dstr,sstr);
3710 SvSETMAGIC(dstr);
3711}
3712
f8c7b90f 3713#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
3714SV *
3715Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
3716{
3717 STRLEN cur = SvCUR(sstr);
3718 STRLEN len = SvLEN(sstr);
3719 register char *new_pv;
3720
3721 if (DEBUG_C_TEST) {
3722 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
3723 sstr, dstr);
3724 sv_dump(sstr);
3725 if (dstr)
3726 sv_dump(dstr);
3727 }
3728
3729 if (dstr) {
3730 if (SvTHINKFIRST(dstr))
3731 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
3f7c398e
SP
3732 else if (SvPVX_const(dstr))
3733 Safefree(SvPVX_const(dstr));
ed252734
NC
3734 }
3735 else
3736 new_SV(dstr);
862a34c6 3737 SvUPGRADE(dstr, SVt_PVIV);
ed252734
NC
3738
3739 assert (SvPOK(sstr));
3740 assert (SvPOKp(sstr));
3741 assert (!SvIOK(sstr));
3742 assert (!SvIOKp(sstr));
3743 assert (!SvNOK(sstr));
3744 assert (!SvNOKp(sstr));
3745
3746 if (SvIsCOW(sstr)) {
3747
3748 if (SvLEN(sstr) == 0) {
3749 /* source is a COW shared hash key. */
ed252734
NC
3750 DEBUG_C(PerlIO_printf(Perl_debug_log,
3751 "Fast copy on write: Sharing hash\n"));
d1db91c6 3752 new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
ed252734
NC
3753 goto common_exit;
3754 }
3755 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3756 } else {
3757 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
862a34c6 3758 SvUPGRADE(sstr, SVt_PVIV);
ed252734
NC
3759 SvREADONLY_on(sstr);
3760 SvFAKE_on(sstr);
3761 DEBUG_C(PerlIO_printf(Perl_debug_log,
3762 "Fast copy on write: Converting sstr to COW\n"));
3763 SV_COW_NEXT_SV_SET(dstr, sstr);
3764 }
3765 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 3766 new_pv = SvPVX_mutable(sstr);
ed252734
NC
3767
3768 common_exit:
3769 SvPV_set(dstr, new_pv);
3770 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
3771 if (SvUTF8(sstr))
3772 SvUTF8_on(dstr);
87a1ef3d
SP
3773 SvLEN_set(dstr, len);
3774 SvCUR_set(dstr, cur);
ed252734
NC
3775 if (DEBUG_C_TEST) {
3776 sv_dump(dstr);
3777 }
3778 return dstr;
3779}
3780#endif
3781
954c1994
GS
3782/*
3783=for apidoc sv_setpvn
3784
3785Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
3786bytes to be copied. If the C<ptr> argument is NULL the SV will become
3787undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
3788
3789=cut
3790*/
3791
ef50df4b 3792void
864dbfa3 3793Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 3794{
97aff369 3795 dVAR;
c6f8c383 3796 register char *dptr;
22c522df 3797
765f542d 3798 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 3799 if (!ptr) {
a0d0e21e 3800 (void)SvOK_off(sv);
463ee0b2
LW
3801 return;
3802 }
22c522df
JH
3803 else {
3804 /* len is STRLEN which is unsigned, need to copy to signed */
a3b680e6 3805 const IV iv = len;
9c5ffd7c
JH
3806 if (iv < 0)
3807 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 3808 }
862a34c6 3809 SvUPGRADE(sv, SVt_PV);
c6f8c383 3810
5902b6a9 3811 dptr = SvGROW(sv, len + 1);
c6f8c383
GA
3812 Move(ptr,dptr,len,char);
3813 dptr[len] = '\0';
79072805 3814 SvCUR_set(sv, len);
1aa99e6b 3815 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3816 SvTAINT(sv);
79072805
LW
3817}
3818
954c1994
GS
3819/*
3820=for apidoc sv_setpvn_mg
3821
3822Like C<sv_setpvn>, but also handles 'set' magic.
3823
3824=cut
3825*/
3826
79072805 3827void
864dbfa3 3828Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
3829{
3830 sv_setpvn(sv,ptr,len);
3831 SvSETMAGIC(sv);
3832}
3833
954c1994
GS
3834/*
3835=for apidoc sv_setpv
3836
3837Copies a string into an SV. The string must be null-terminated. Does not
3838handle 'set' magic. See C<sv_setpv_mg>.
3839
3840=cut
3841*/
3842
ef50df4b 3843void
864dbfa3 3844Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805 3845{
97aff369 3846 dVAR;
79072805
LW
3847 register STRLEN len;
3848
765f542d 3849 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 3850 if (!ptr) {
a0d0e21e 3851 (void)SvOK_off(sv);
463ee0b2
LW
3852 return;
3853 }
79072805 3854 len = strlen(ptr);
862a34c6 3855 SvUPGRADE(sv, SVt_PV);
c6f8c383 3856
79072805 3857 SvGROW(sv, len + 1);
463ee0b2 3858 Move(ptr,SvPVX(sv),len+1,char);
79072805 3859 SvCUR_set(sv, len);
1aa99e6b 3860 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
3861 SvTAINT(sv);
3862}
3863
954c1994
GS
3864/*
3865=for apidoc sv_setpv_mg
3866
3867Like C<sv_setpv>, but also handles 'set' magic.
3868
3869=cut
3870*/
3871
463ee0b2 3872void
864dbfa3 3873Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
3874{
3875 sv_setpv(sv,ptr);
3876 SvSETMAGIC(sv);
3877}
3878
954c1994
GS
3879/*
3880=for apidoc sv_usepvn
3881
3882Tells an SV to use C<ptr> to find its string value. Normally the string is
1c846c1f 3883stored inside the SV but sv_usepvn allows the SV to use an outside string.
954c1994
GS
3884The C<ptr> should point to memory that was allocated by C<malloc>. The
3885string length, C<len>, must be supplied. This function will realloc the
3886memory pointed to by C<ptr>, so that pointer should not be freed or used by
3887the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
3888See C<sv_usepvn_mg>.
3889
3890=cut
3891*/
3892
ef50df4b 3893void
864dbfa3 3894Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 3895{
97aff369 3896 dVAR;
1936d2a7 3897 STRLEN allocate;
765f542d 3898 SV_CHECK_THINKFIRST_COW_DROP(sv);
862a34c6 3899 SvUPGRADE(sv, SVt_PV);
463ee0b2 3900 if (!ptr) {
a0d0e21e 3901 (void)SvOK_off(sv);
463ee0b2
LW
3902 return;
3903 }
3f7c398e 3904 if (SvPVX_const(sv))
8bd4d4c5 3905 SvPV_free(sv);
1936d2a7
NC
3906
3907 allocate = PERL_STRLEN_ROUNDUP(len + 1);
7a9b70e9 3908 ptr = saferealloc (ptr, allocate);
f880fe2f 3909 SvPV_set(sv, ptr);
463ee0b2 3910 SvCUR_set(sv, len);
1936d2a7 3911 SvLEN_set(sv, allocate);
463ee0b2 3912 *SvEND(sv) = '\0';
1aa99e6b 3913 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3914 SvTAINT(sv);
79072805
LW
3915}
3916
954c1994
GS
3917/*
3918=for apidoc sv_usepvn_mg
3919
3920Like C<sv_usepvn>, but also handles 'set' magic.
3921
3922=cut
3923*/
3924
ef50df4b 3925void
864dbfa3 3926Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 3927{
51c1089b 3928 sv_usepvn(sv,ptr,len);
ef50df4b
GS
3929 SvSETMAGIC(sv);
3930}
3931
f8c7b90f 3932#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
3933/* Need to do this *after* making the SV normal, as we need the buffer
3934 pointer to remain valid until after we've copied it. If we let go too early,
3935 another thread could invalidate it by unsharing last of the same hash key
3936 (which it can do by means other than releasing copy-on-write Svs)
3937 or by changing the other copy-on-write SVs in the loop. */
3938STATIC void
bdd68bc3 3939S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, STRLEN len, SV *after)
765f542d
NC
3940{
3941 if (len) { /* this SV was SvIsCOW_normal(sv) */
3942 /* we need to find the SV pointing to us. */
cf5629ad 3943 SV *current = SV_COW_NEXT_SV(after);
7a5fa8a2 3944
765f542d
NC
3945 if (current == sv) {
3946 /* The SV we point to points back to us (there were only two of us
3947 in the loop.)
3948 Hence other SV is no longer copy on write either. */
3949 SvFAKE_off(after);
3950 SvREADONLY_off(after);
3951 } else {
3952 /* We need to follow the pointers around the loop. */
3953 SV *next;
3954 while ((next = SV_COW_NEXT_SV(current)) != sv) {
3955 assert (next);
3956 current = next;
3957 /* don't loop forever if the structure is bust, and we have
3958 a pointer into a closed loop. */
3959 assert (current != after);
3f7c398e 3960 assert (SvPVX_const(current) == pvx);
765f542d
NC
3961 }
3962 /* Make the SV before us point to the SV after us. */
a29f6d03 3963 SV_COW_NEXT_SV_SET(current, after);
765f542d
NC
3964 }
3965 } else {
bdd68bc3 3966 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
765f542d
NC
3967 }
3968}
3969
3970int
3971Perl_sv_release_IVX(pTHX_ register SV *sv)
3972{
3973 if (SvIsCOW(sv))
3974 sv_force_normal_flags(sv, 0);
0c34ef67
MHM
3975 SvOOK_off(sv);
3976 return 0;
765f542d
NC
3977}
3978#endif
645c22ef
DM
3979/*
3980=for apidoc sv_force_normal_flags
3981
3982Undo various types of fakery on an SV: if the PV is a shared string, make
3983a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
3984an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
3985we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
3986then a copy-on-write scalar drops its PV buffer (if any) and becomes
3987SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 3988set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
3989C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
3990with flags set to 0.
645c22ef
DM
3991
3992=cut
3993*/
3994
6fc92669 3995void
840a7b70 3996Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 3997{
97aff369 3998 dVAR;
f8c7b90f 3999#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4000 if (SvREADONLY(sv)) {
4001 /* At this point I believe I should acquire a global SV mutex. */
4002 if (SvFAKE(sv)) {
b64e5050 4003 const char * const pvx = SvPVX_const(sv);
a28509cc
AL
4004 const STRLEN len = SvLEN(sv);
4005 const STRLEN cur = SvCUR(sv);
a28509cc 4006 SV * const next = SV_COW_NEXT_SV(sv); /* next COW sv in the loop. */
46187eeb
NC
4007 if (DEBUG_C_TEST) {
4008 PerlIO_printf(Perl_debug_log,
4009 "Copy on write: Force normal %ld\n",
4010 (long) flags);
e419cbc5 4011 sv_dump(sv);
46187eeb 4012 }
765f542d
NC
4013 SvFAKE_off(sv);
4014 SvREADONLY_off(sv);
9f653bb5 4015 /* This SV doesn't own the buffer, so need to Newx() a new one: */
6136c704 4016 SvPV_set(sv, NULL);
87a1ef3d 4017 SvLEN_set(sv, 0);
765f542d
NC
4018 if (flags & SV_COW_DROP_PV) {
4019 /* OK, so we don't need to copy our buffer. */
4020 SvPOK_off(sv);
4021 } else {
4022 SvGROW(sv, cur + 1);
4023 Move(pvx,SvPVX(sv),cur,char);
87a1ef3d 4024 SvCUR_set(sv, cur);
765f542d
NC
4025 *SvEND(sv) = '\0';
4026 }
bdd68bc3 4027 sv_release_COW(sv, pvx, len, next);
46187eeb 4028 if (DEBUG_C_TEST) {
e419cbc5 4029 sv_dump(sv);
46187eeb 4030 }
765f542d 4031 }
923e4eb5 4032 else if (IN_PERL_RUNTIME)
765f542d
NC
4033 Perl_croak(aTHX_ PL_no_modify);
4034 /* At this point I believe that I can drop the global SV mutex. */
4035 }
4036#else
2213622d 4037 if (SvREADONLY(sv)) {
1c846c1f 4038 if (SvFAKE(sv)) {
b64e5050 4039 const char * const pvx = SvPVX_const(sv);
66a1b24b 4040 const STRLEN len = SvCUR(sv);
10bcdfd6
NC
4041 SvFAKE_off(sv);
4042 SvREADONLY_off(sv);
bd61b366 4043 SvPV_set(sv, NULL);
66a1b24b 4044 SvLEN_set(sv, 0);
1c846c1f 4045 SvGROW(sv, len + 1);
706aa1c9 4046 Move(pvx,SvPVX(sv),len,char);
1c846c1f 4047 *SvEND(sv) = '\0';
bdd68bc3 4048 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
1c846c1f 4049 }
923e4eb5 4050 else if (IN_PERL_RUNTIME)
cea2e8a9 4051 Perl_croak(aTHX_ PL_no_modify);
0f15f207 4052 }
765f542d 4053#endif
2213622d 4054 if (SvROK(sv))
840a7b70 4055 sv_unref_flags(sv, flags);
6fc92669
GS
4056 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4057 sv_unglob(sv);
0f15f207 4058}
1c846c1f 4059
645c22ef 4060/*
954c1994
GS
4061=for apidoc sv_chop
4062
1c846c1f 4063Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4064SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4065the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4066string. Uses the "OOK hack".
3f7c398e 4067Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
31869a79 4068refer to the same chunk of data.
954c1994
GS
4069
4070=cut
4071*/
4072
79072805 4073void
f54cb97a 4074Perl_sv_chop(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4075{
4076 register STRLEN delta;
a0d0e21e 4077 if (!ptr || !SvPOKp(sv))
79072805 4078 return;
3f7c398e 4079 delta = ptr - SvPVX_const(sv);
2213622d 4080 SV_CHECK_THINKFIRST(sv);
79072805
LW
4081 if (SvTYPE(sv) < SVt_PVIV)
4082 sv_upgrade(sv,SVt_PVIV);
4083
4084 if (!SvOOK(sv)) {
50483b2c 4085 if (!SvLEN(sv)) { /* make copy of shared string */
3f7c398e 4086 const char *pvx = SvPVX_const(sv);
a28509cc 4087 const STRLEN len = SvCUR(sv);
50483b2c 4088 SvGROW(sv, len + 1);
706aa1c9 4089 Move(pvx,SvPVX(sv),len,char);
50483b2c
JD
4090 *SvEND(sv) = '\0';
4091 }
45977657 4092 SvIV_set(sv, 0);
a4bfb290
AB
4093 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
4094 and we do that anyway inside the SvNIOK_off
4095 */
7a5fa8a2 4096 SvFLAGS(sv) |= SVf_OOK;
79072805 4097 }
a4bfb290 4098 SvNIOK_off(sv);
b162af07
SP
4099 SvLEN_set(sv, SvLEN(sv) - delta);
4100 SvCUR_set(sv, SvCUR(sv) - delta);
f880fe2f 4101 SvPV_set(sv, SvPVX(sv) + delta);
45977657 4102 SvIV_set(sv, SvIVX(sv) + delta);
79072805
LW
4103}
4104
954c1994
GS
4105/*
4106=for apidoc sv_catpvn
4107
4108Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4109C<len> indicates number of bytes to copy. If the SV has the UTF-8
4110status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 4111Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 4112
8d6d96c1
HS
4113=for apidoc sv_catpvn_flags
4114
4115Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4116C<len> indicates number of bytes to copy. If the SV has the UTF-8
4117status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
4118If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4119appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4120in terms of this function.
4121
4122=cut
4123*/
4124
4125void
4126Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
4127{
97aff369 4128 dVAR;
8d6d96c1 4129 STRLEN dlen;
fabdb6c0 4130 const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
8d6d96c1 4131
8d6d96c1
HS
4132 SvGROW(dsv, dlen + slen + 1);
4133 if (sstr == dstr)
3f7c398e 4134 sstr = SvPVX_const(dsv);
8d6d96c1 4135 Move(sstr, SvPVX(dsv) + dlen, slen, char);
b162af07 4136 SvCUR_set(dsv, SvCUR(dsv) + slen);
8d6d96c1
HS
4137 *SvEND(dsv) = '\0';
4138 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
4139 SvTAINT(dsv);
bddd5118
NC
4140 if (flags & SV_SMAGIC)
4141 SvSETMAGIC(dsv);
79072805
LW
4142}
4143
954c1994 4144/*
954c1994
GS
4145=for apidoc sv_catsv
4146
13e8c8e3
JH
4147Concatenates the string from SV C<ssv> onto the end of the string in
4148SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
4149not 'set' magic. See C<sv_catsv_mg>.
954c1994 4150
8d6d96c1
HS
4151=for apidoc sv_catsv_flags
4152
4153Concatenates the string from SV C<ssv> onto the end of the string in
4154SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
4155bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4156and C<sv_catsv_nomg> are implemented in terms of this function.
4157
4158=cut */
4159
ef50df4b 4160void
8d6d96c1 4161Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 4162{
97aff369 4163 dVAR;
bddd5118 4164 if (ssv) {
00b6aa41
AL
4165 STRLEN slen;
4166 const char *spv = SvPV_const(ssv, slen);
4167 if (spv) {
bddd5118
NC
4168 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4169 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4170 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4171 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4172 dsv->sv_flags doesn't have that bit set.
4fd84b44 4173 Andy Dougherty 12 Oct 2001
bddd5118
NC
4174 */
4175 const I32 sutf8 = DO_UTF8(ssv);
4176 I32 dutf8;
13e8c8e3 4177
bddd5118
NC
4178 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4179 mg_get(dsv);
4180 dutf8 = DO_UTF8(dsv);
8d6d96c1 4181
bddd5118
NC
4182 if (dutf8 != sutf8) {
4183 if (dutf8) {
4184 /* Not modifying source SV, so taking a temporary copy. */
00b6aa41 4185 SV* const csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 4186
bddd5118
NC
4187 sv_utf8_upgrade(csv);
4188 spv = SvPV_const(csv, slen);
4189 }
4190 else
4191 sv_utf8_upgrade_nomg(dsv);
13e8c8e3 4192 }
bddd5118 4193 sv_catpvn_nomg(dsv, spv, slen);
e84ff256 4194 }
560a288e 4195 }
bddd5118
NC
4196 if (flags & SV_SMAGIC)
4197 SvSETMAGIC(dsv);
79072805
LW
4198}
4199
954c1994 4200/*
954c1994
GS
4201=for apidoc sv_catpv
4202
4203Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
4204If the SV has the UTF-8 status set, then the bytes appended should be
4205valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 4206
d5ce4a7c 4207=cut */
954c1994 4208
ef50df4b 4209void
0c981600 4210Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805 4211{
97aff369 4212 dVAR;
79072805 4213 register STRLEN len;
463ee0b2 4214 STRLEN tlen;
748a9306 4215 char *junk;
79072805 4216
0c981600 4217 if (!ptr)
79072805 4218 return;
748a9306 4219 junk = SvPV_force(sv, tlen);
0c981600 4220 len = strlen(ptr);
463ee0b2 4221 SvGROW(sv, tlen + len + 1);
0c981600 4222 if (ptr == junk)
3f7c398e 4223 ptr = SvPVX_const(sv);
0c981600 4224 Move(ptr,SvPVX(sv)+tlen,len+1,char);
b162af07 4225 SvCUR_set(sv, SvCUR(sv) + len);
d41ff1b8 4226 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4227 SvTAINT(sv);
79072805
LW
4228}
4229
954c1994
GS
4230/*
4231=for apidoc sv_catpv_mg
4232
4233Like C<sv_catpv>, but also handles 'set' magic.
4234
4235=cut
4236*/
4237
ef50df4b 4238void
0c981600 4239Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 4240{
0c981600 4241 sv_catpv(sv,ptr);
ef50df4b
GS
4242 SvSETMAGIC(sv);
4243}
4244
645c22ef
DM
4245/*
4246=for apidoc newSV
4247
561b68a9
SH
4248Creates a new SV. A non-zero C<len> parameter indicates the number of
4249bytes of preallocated string space the SV should have. An extra byte for a
4250trailing NUL is also reserved. (SvPOK is not set for the SV even if string
4251space is allocated.) The reference count for the new SV is set to 1.
4252
4253In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
4254parameter, I<x>, a debug aid which allowed callers to identify themselves.
4255This aid has been superseded by a new build option, PERL_MEM_LOG (see
4256L<perlhack/PERL_MEM_LOG>). The older API is still there for use in XS
4257modules supporting older perls.
645c22ef
DM
4258
4259=cut
4260*/
4261
79072805 4262SV *
864dbfa3 4263Perl_newSV(pTHX_ STRLEN len)
79072805 4264{
97aff369 4265 dVAR;
79072805 4266 register SV *sv;
1c846c1f 4267
4561caa4 4268 new_SV(sv);
79072805
LW
4269 if (len) {
4270 sv_upgrade(sv, SVt_PV);
4271 SvGROW(sv, len + 1);
4272 }
4273 return sv;
4274}
954c1994 4275/*
92110913 4276=for apidoc sv_magicext
954c1994 4277
68795e93 4278Adds magic to an SV, upgrading it if necessary. Applies the
2d8d5d5a 4279supplied vtable and returns a pointer to the magic added.
92110913 4280
2d8d5d5a
SH
4281Note that C<sv_magicext> will allow things that C<sv_magic> will not.
4282In particular, you can add magic to SvREADONLY SVs, and add more than
4283one instance of the same 'how'.
645c22ef 4284
2d8d5d5a
SH
4285If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
4286stored, if C<namlen> is zero then C<name> is stored as-is and - as another
4287special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
4288to contain an C<SV*> and is stored as-is with its REFCNT incremented.
92110913 4289
2d8d5d5a 4290(This is now used as a subroutine by C<sv_magic>.)
954c1994
GS
4291
4292=cut
4293*/
92110913 4294MAGIC *
92e67595 4295Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, MGVTBL *vtable,
92110913 4296 const char* name, I32 namlen)
79072805 4297{
97aff369 4298 dVAR;
79072805 4299 MAGIC* mg;
68795e93 4300
92110913 4301 if (SvTYPE(sv) < SVt_PVMG) {
862a34c6 4302 SvUPGRADE(sv, SVt_PVMG);
463ee0b2 4303 }
a02a5408 4304 Newxz(mg, 1, MAGIC);
79072805 4305 mg->mg_moremagic = SvMAGIC(sv);
b162af07 4306 SvMAGIC_set(sv, mg);
75f9d97a 4307
05f95b08
SB
4308 /* Sometimes a magic contains a reference loop, where the sv and
4309 object refer to each other. To prevent a reference loop that
4310 would prevent such objects being freed, we look for such loops
4311 and if we find one we avoid incrementing the object refcount.
87f0b213
JH
4312
4313 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 4314 have its REFCNT incremented to keep it in existence.
87f0b213
JH
4315
4316 */
14befaf4
DM
4317 if (!obj || obj == sv ||
4318 how == PERL_MAGIC_arylen ||
4319 how == PERL_MAGIC_qr ||
8d2f4536 4320 how == PERL_MAGIC_symtab ||
75f9d97a
JH
4321 (SvTYPE(obj) == SVt_PVGV &&
4322 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4323 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 4324 GvFORM(obj) == (CV*)sv)))
75f9d97a 4325 {
8990e307 4326 mg->mg_obj = obj;
75f9d97a 4327 }
85e6fe83 4328 else {
b37c2d43 4329 mg->mg_obj = SvREFCNT_inc_simple(obj);
85e6fe83
LW
4330 mg->mg_flags |= MGf_REFCOUNTED;
4331 }
b5ccf5f2
YST
4332
4333 /* Normal self-ties simply pass a null object, and instead of
4334 using mg_obj directly, use the SvTIED_obj macro to produce a
4335 new RV as needed. For glob "self-ties", we are tieing the PVIO
4336 with an RV obj pointing to the glob containing the PVIO. In
4337 this case, to avoid a reference loop, we need to weaken the
4338 reference.
4339 */
4340
4341 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4342 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
4343 {
4344 sv_rvweaken(obj);
4345 }
4346
79072805 4347 mg->mg_type = how;
565764a8 4348 mg->mg_len = namlen;
9cbac4c7 4349 if (name) {
92110913 4350 if (namlen > 0)
1edc1566 4351 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 4352 else if (namlen == HEf_SVKEY)
b37c2d43 4353 mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV*)name);
68795e93 4354 else
92110913 4355 mg->mg_ptr = (char *) name;
9cbac4c7 4356 }
92110913 4357 mg->mg_virtual = vtable;
68795e93 4358
92110913
NIS
4359 mg_magical(sv);
4360 if (SvGMAGICAL(sv))
4361 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4362 return mg;
4363}
4364
4365/*
4366=for apidoc sv_magic
1c846c1f 4367
92110913
NIS
4368Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4369then adds a new magic item of type C<how> to the head of the magic list.
4370
2d8d5d5a
SH
4371See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
4372handling of the C<name> and C<namlen> arguments.
4373
4509d3fb
SB
4374You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
4375to add more than one instance of the same 'how'.
4376
92110913
NIS
4377=cut
4378*/
4379
4380void
4381Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 4382{
97aff369 4383 dVAR;
92e67595 4384 MGVTBL *vtable;
92110913 4385 MAGIC* mg;
92110913 4386
f8c7b90f 4387#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4388 if (SvIsCOW(sv))
4389 sv_force_normal_flags(sv, 0);
4390#endif
92110913 4391 if (SvREADONLY(sv)) {
d8084ca5
DM
4392 if (
4393 /* its okay to attach magic to shared strings; the subsequent
4394 * upgrade to PVMG will unshare the string */
4395 !(SvFAKE(sv) && SvTYPE(sv) < SVt_PVMG)
4396
4397 && IN_PERL_RUNTIME
92110913
NIS
4398 && how != PERL_MAGIC_regex_global
4399 && how != PERL_MAGIC_bm
4400 && how != PERL_MAGIC_fm
4401 && how != PERL_MAGIC_sv
e6469971 4402 && how != PERL_MAGIC_backref
92110913
NIS
4403 )
4404 {
4405 Perl_croak(aTHX_ PL_no_modify);
4406 }
4407 }
4408 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4409 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
4410 /* sv_magic() refuses to add a magic of the same 'how' as an
4411 existing one
92110913 4412 */
2a509ed3 4413 if (how == PERL_MAGIC_taint) {
92110913 4414 mg->mg_len |= 1;
2a509ed3
NC
4415 /* Any scalar which already had taint magic on which someone
4416 (erroneously?) did SvIOK_on() or similar will now be
4417 incorrectly sporting public "OK" flags. */
4418 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4419 }
92110913
NIS
4420 return;
4421 }
4422 }
68795e93 4423
79072805 4424 switch (how) {
14befaf4 4425 case PERL_MAGIC_sv:
92110913 4426 vtable = &PL_vtbl_sv;
79072805 4427 break;
14befaf4 4428 case PERL_MAGIC_overload:
92110913 4429 vtable = &PL_vtbl_amagic;
a0d0e21e 4430 break;
14befaf4 4431 case PERL_MAGIC_overload_elem:
92110913 4432 vtable = &PL_vtbl_amagicelem;
a0d0e21e 4433 break;
14befaf4 4434 case PERL_MAGIC_overload_table:
92110913 4435 vtable = &PL_vtbl_ovrld;
a0d0e21e 4436 break;
14befaf4 4437 case PERL_MAGIC_bm:
92110913 4438 vtable = &PL_vtbl_bm;
79072805 4439 break;
14befaf4 4440 case PERL_MAGIC_regdata:
92110913 4441 vtable = &PL_vtbl_regdata;
6cef1e77 4442 break;
14befaf4 4443 case PERL_MAGIC_regdatum:
92110913 4444 vtable = &PL_vtbl_regdatum;
6cef1e77 4445 break;
14befaf4 4446 case PERL_MAGIC_env:
92110913 4447 vtable = &PL_vtbl_env;
79072805 4448 break;
14befaf4 4449 case PERL_MAGIC_fm:
92110913 4450 vtable = &PL_vtbl_fm;
55497cff 4451 break;
14befaf4 4452 case PERL_MAGIC_envelem:
92110913 4453 vtable = &PL_vtbl_envelem;
79072805 4454 break;
14befaf4 4455 case PERL_MAGIC_regex_global:
92110913 4456 vtable = &PL_vtbl_mglob;
93a17b20 4457 break;
14befaf4 4458 case PERL_MAGIC_isa:
92110913 4459 vtable = &PL_vtbl_isa;
463ee0b2 4460 break;
14befaf4 4461 case PERL_MAGIC_isaelem:
92110913 4462 vtable = &PL_vtbl_isaelem;
463ee0b2 4463 break;
14befaf4 4464 case PERL_MAGIC_nkeys:
92110913 4465 vtable = &PL_vtbl_nkeys;
16660edb 4466 break;
14befaf4 4467 case PERL_MAGIC_dbfile:
aec46f14 4468 vtable = NULL;
93a17b20 4469 break;
14befaf4 4470 case PERL_MAGIC_dbline:
92110913 4471 vtable = &PL_vtbl_dbline;
79072805 4472 break;
36477c24 4473#ifdef USE_LOCALE_COLLATE
14befaf4 4474 case PERL_MAGIC_collxfrm:
92110913 4475 vtable = &PL_vtbl_collxfrm;
bbce6d69 4476 break;
36477c24 4477#endif /* USE_LOCALE_COLLATE */
14befaf4 4478 case PERL_MAGIC_tied:
92110913 4479 vtable = &PL_vtbl_pack;
463ee0b2 4480 break;
14befaf4
DM
4481 case PERL_MAGIC_tiedelem:
4482 case PERL_MAGIC_tiedscalar:
92110913 4483 vtable = &PL_vtbl_packelem;
463ee0b2 4484 break;
14befaf4 4485 case PERL_MAGIC_qr:
92110913 4486 vtable = &PL_vtbl_regexp;
c277df42 4487 break;
14befaf4 4488 case PERL_MAGIC_sig:
92110913 4489 vtable = &PL_vtbl_sig;
79072805 4490 break;
14befaf4 4491 case PERL_MAGIC_sigelem:
92110913 4492 vtable = &PL_vtbl_sigelem;
79072805 4493 break;
14befaf4 4494 case PERL_MAGIC_taint:
92110913 4495 vtable = &PL_vtbl_taint;
463ee0b2 4496 break;
14befaf4 4497 case PERL_MAGIC_uvar:
92110913 4498 vtable = &PL_vtbl_uvar;
79072805 4499 break;
14befaf4 4500 case PERL_MAGIC_vec:
92110913 4501 vtable = &PL_vtbl_vec;
79072805 4502 break;
a3874608 4503 case PERL_MAGIC_arylen_p:
bfcb3514 4504 case PERL_MAGIC_rhash:
8d2f4536 4505 case PERL_MAGIC_symtab:
ece467f9 4506 case PERL_MAGIC_vstring:
aec46f14 4507 vtable = NULL;
ece467f9 4508 break;
7e8c5dac
HS
4509 case PERL_MAGIC_utf8:
4510 vtable = &PL_vtbl_utf8;
4511 break;
14befaf4 4512 case PERL_MAGIC_substr:
92110913 4513 vtable = &PL_vtbl_substr;
79072805 4514 break;
14befaf4 4515 case PERL_MAGIC_defelem:
92110913 4516 vtable = &PL_vtbl_defelem;
5f05dabc 4517 break;
14befaf4 4518 case PERL_MAGIC_arylen:
92110913 4519 vtable = &PL_vtbl_arylen;
79072805 4520 break;
14befaf4 4521 case PERL_MAGIC_pos:
92110913 4522 vtable = &PL_vtbl_pos;
a0d0e21e 4523 break;
14befaf4 4524 case PERL_MAGIC_backref:
92110913 4525 vtable = &PL_vtbl_backref;
810b8aa5 4526 break;
14befaf4
DM
4527 case PERL_MAGIC_ext:
4528 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
4529 /* Useful for attaching extension internal data to perl vars. */
4530 /* Note that multiple extensions may clash if magical scalars */
4531 /* etc holding private data from one are passed to another. */
aec46f14 4532 vtable = NULL;
a0d0e21e 4533 break;
79072805 4534 default:
14befaf4 4535 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 4536 }
68795e93 4537
92110913 4538 /* Rest of work is done else where */
aec46f14 4539 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 4540
92110913
NIS
4541 switch (how) {
4542 case PERL_MAGIC_taint:
4543 mg->mg_len = 1;
4544 break;
4545 case PERL_MAGIC_ext:
4546 case PERL_MAGIC_dbfile:
4547 SvRMAGICAL_on(sv);
4548 break;
4549 }
463ee0b2
LW
4550}
4551
c461cf8f
JH
4552/*
4553=for apidoc sv_unmagic
4554
645c22ef 4555Removes all magic of type C<type> from an SV.
c461cf8f
JH
4556
4557=cut
4558*/
4559
463ee0b2 4560int
864dbfa3 4561Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
4562{
4563 MAGIC* mg;
4564 MAGIC** mgp;
91bba347 4565 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2 4566 return 0;
064cf529 4567 mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
463ee0b2
LW
4568 for (mg = *mgp; mg; mg = *mgp) {
4569 if (mg->mg_type == type) {
e1ec3a88 4570 const MGVTBL* const vtbl = mg->mg_virtual;
463ee0b2 4571 *mgp = mg->mg_moremagic;
1d7c1841 4572 if (vtbl && vtbl->svt_free)
fc0dc3b3 4573 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 4574 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 4575 if (mg->mg_len > 0)
1edc1566 4576 Safefree(mg->mg_ptr);
565764a8 4577 else if (mg->mg_len == HEf_SVKEY)
1edc1566 4578 SvREFCNT_dec((SV*)mg->mg_ptr);
d2923cdd 4579 else if (mg->mg_type == PERL_MAGIC_utf8)
7e8c5dac 4580 Safefree(mg->mg_ptr);
9cbac4c7 4581 }
a0d0e21e
LW
4582 if (mg->mg_flags & MGf_REFCOUNTED)
4583 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
4584 Safefree(mg);
4585 }
4586 else
4587 mgp = &mg->mg_moremagic;
79072805 4588 }
91bba347 4589 if (!SvMAGIC(sv)) {
463ee0b2 4590 SvMAGICAL_off(sv);
c268c2a6 4591 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
86f55936 4592 SvMAGIC_set(sv, NULL);
463ee0b2
LW
4593 }
4594
4595 return 0;
79072805
LW
4596}
4597
c461cf8f
JH
4598/*
4599=for apidoc sv_rvweaken
4600
645c22ef
DM
4601Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
4602referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
4603push a back-reference to this RV onto the array of backreferences
4604associated with that magic.
c461cf8f
JH
4605
4606=cut
4607*/
4608
810b8aa5 4609SV *
864dbfa3 4610Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
4611{
4612 SV *tsv;
4613 if (!SvOK(sv)) /* let undefs pass */
4614 return sv;
4615 if (!SvROK(sv))
cea2e8a9 4616 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 4617 else if (SvWEAKREF(sv)) {
810b8aa5 4618 if (ckWARN(WARN_MISC))
9014280d 4619 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
4620 return sv;
4621 }
4622 tsv = SvRV(sv);
e15faf7d 4623 Perl_sv_add_backref(aTHX_ tsv, sv);
810b8aa5 4624 SvWEAKREF_on(sv);
1c846c1f 4625 SvREFCNT_dec(tsv);
810b8aa5
GS
4626 return sv;
4627}
4628
645c22ef
DM
4629/* Give tsv backref magic if it hasn't already got it, then push a
4630 * back-reference to sv onto the array associated with the backref magic.
4631 */
4632
e15faf7d
NC
4633void
4634Perl_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5 4635{
97aff369 4636 dVAR;
810b8aa5 4637 AV *av;
86f55936
NC
4638
4639 if (SvTYPE(tsv) == SVt_PVHV) {
4640 AV **const avp = Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
4641
4642 av = *avp;
4643 if (!av) {
4644 /* There is no AV in the offical place - try a fixup. */
4645 MAGIC *const mg = mg_find(tsv, PERL_MAGIC_backref);
4646
4647 if (mg) {
4648 /* Aha. They've got it stowed in magic. Bring it back. */
4649 av = (AV*)mg->mg_obj;
4650 /* Stop mg_free decreasing the refernce count. */
4651 mg->mg_obj = NULL;
4652 /* Stop mg_free even calling the destructor, given that
4653 there's no AV to free up. */
4654 mg->mg_virtual = 0;
4655 sv_unmagic(tsv, PERL_MAGIC_backref);
4656 } else {
4657 av = newAV();
4658 AvREAL_off(av);
b37c2d43 4659 SvREFCNT_inc_simple_void(av);
86f55936
NC
4660 }
4661 *avp = av;
4662 }
4663 } else {
4664 const MAGIC *const mg
4665 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
4666 if (mg)
4667 av = (AV*)mg->mg_obj;
4668 else {
4669 av = newAV();
4670 AvREAL_off(av);
4671 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
4672 /* av now has a refcnt of 2, which avoids it getting freed
4673 * before us during global cleanup. The extra ref is removed
4674 * by magic_killbackrefs() when tsv is being freed */
4675 }
810b8aa5 4676 }
d91d49e8 4677 if (AvFILLp(av) >= AvMAX(av)) {
d91d49e8
MM
4678 av_extend(av, AvFILLp(av)+1);
4679 }
4680 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
4681}
4682
645c22ef
DM
4683/* delete a back-reference to ourselves from the backref magic associated
4684 * with the SV we point to.
4685 */
4686
1c846c1f 4687STATIC void
e15faf7d 4688S_sv_del_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5 4689{
97aff369 4690 dVAR;
86f55936 4691 AV *av = NULL;
810b8aa5
GS
4692 SV **svp;
4693 I32 i;
86f55936
NC
4694
4695 if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
4696 av = *Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
5b285ea4
NC
4697 /* We mustn't attempt to "fix up" the hash here by moving the
4698 backreference array back to the hv_aux structure, as that is stored
4699 in the main HvARRAY(), and hfreentries assumes that no-one
4700 reallocates HvARRAY() while it is running. */
86f55936
NC
4701 }
4702 if (!av) {
4703 const MAGIC *const mg
4704 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
4705 if (mg)
4706 av = (AV *)mg->mg_obj;
4707 }
4708 if (!av) {
e15faf7d
NC
4709 if (PL_in_clean_all)
4710 return;
cea2e8a9 4711 Perl_croak(aTHX_ "panic: del_backref");
86f55936
NC
4712 }
4713
4714 if (SvIS_FREED(av))
4715 return;
4716
810b8aa5 4717 svp = AvARRAY(av);
6a76db8b
NC
4718 /* We shouldn't be in here more than once, but for paranoia reasons lets
4719 not assume this. */
4720 for (i = AvFILLp(av); i >= 0; i--) {
4721 if (svp[i] == sv) {
4722 const SSize_t fill = AvFILLp(av);
4723 if (i != fill) {
4724 /* We weren't the last entry.
4725 An unordered list has this property that you can take the
4726 last element off the end to fill the hole, and it's still
4727 an unordered list :-)
4728 */
4729 svp[i] = svp[fill];
4730 }
a0714e2c 4731 svp[fill] = NULL;
6a76db8b
NC
4732 AvFILLp(av) = fill - 1;
4733 }
4734 }
810b8aa5
GS
4735}
4736
86f55936
NC
4737int
4738Perl_sv_kill_backrefs(pTHX_ SV *sv, AV *av)
4739{
4740 SV **svp = AvARRAY(av);
4741
4742 PERL_UNUSED_ARG(sv);
4743
4744 /* Not sure why the av can get freed ahead of its sv, but somehow it does
4745 in ext/B/t/bytecode.t test 15 (involving print <DATA>) */
4746 if (svp && !SvIS_FREED(av)) {
4747 SV *const *const last = svp + AvFILLp(av);
4748
4749 while (svp <= last) {
4750 if (*svp) {
4751 SV *const referrer = *svp;
4752 if (SvWEAKREF(referrer)) {
4753 /* XXX Should we check that it hasn't changed? */
4754 SvRV_set(referrer, 0);
4755 SvOK_off(referrer);
4756 SvWEAKREF_off(referrer);
4757 } else if (SvTYPE(referrer) == SVt_PVGV ||
4758 SvTYPE(referrer) == SVt_PVLV) {
4759 /* You lookin' at me? */
4760 assert(GvSTASH(referrer));
4761 assert(GvSTASH(referrer) == (HV*)sv);
4762 GvSTASH(referrer) = 0;
4763 } else {
4764 Perl_croak(aTHX_
4765 "panic: magic_killbackrefs (flags=%"UVxf")",
4766 (UV)SvFLAGS(referrer));
4767 }
4768
a0714e2c 4769 *svp = NULL;
86f55936
NC
4770 }
4771 svp++;
4772 }
4773 }
4774 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
4775 return 0;
4776}
4777
954c1994
GS
4778/*
4779=for apidoc sv_insert
4780
4781Inserts a string at the specified offset/length within the SV. Similar to
4782the Perl substr() function.
4783
4784=cut
4785*/
4786
79072805 4787void
e1ec3a88 4788Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, const char *little, STRLEN littlelen)
79072805 4789{
97aff369 4790 dVAR;
79072805
LW
4791 register char *big;
4792 register char *mid;
4793 register char *midend;
4794 register char *bigend;
4795 register I32 i;
6ff81951 4796 STRLEN curlen;
1c846c1f 4797
79072805 4798
8990e307 4799 if (!bigstr)
cea2e8a9 4800 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 4801 SvPV_force(bigstr, curlen);
60fa28ff 4802 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
4803 if (offset + len > curlen) {
4804 SvGROW(bigstr, offset+len+1);
93524f2b 4805 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
6ff81951
GS
4806 SvCUR_set(bigstr, offset+len);
4807 }
79072805 4808
69b47968 4809 SvTAINT(bigstr);
79072805
LW
4810 i = littlelen - len;
4811 if (i > 0) { /* string might grow */
a0d0e21e 4812 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
4813 mid = big + offset + len;
4814 midend = bigend = big + SvCUR(bigstr);
4815 bigend += i;
4816 *bigend = '\0';
4817 while (midend > mid) /* shove everything down */
4818 *--bigend = *--midend;
4819 Move(little,big+offset,littlelen,char);
b162af07 4820 SvCUR_set(bigstr, SvCUR(bigstr) + i);
79072805
LW
4821 SvSETMAGIC(bigstr);
4822 return;
4823 }
4824 else if (i == 0) {
463ee0b2 4825 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
4826 SvSETMAGIC(bigstr);
4827 return;
4828 }
4829
463ee0b2 4830 big = SvPVX(bigstr);
79072805
LW
4831 mid = big + offset;
4832 midend = mid + len;
4833 bigend = big + SvCUR(bigstr);
4834
4835 if (midend > bigend)
cea2e8a9 4836 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
4837
4838 if (mid - big > bigend - midend) { /* faster to shorten from end */
4839 if (littlelen) {
4840 Move(little, mid, littlelen,char);
4841 mid += littlelen;
4842 }
4843 i = bigend - midend;
4844 if (i > 0) {
4845 Move(midend, mid, i,char);
4846 mid += i;
4847 }
4848 *mid = '\0';
4849 SvCUR_set(bigstr, mid - big);
4850 }
155aba94 4851 else if ((i = mid - big)) { /* faster from front */
79072805
LW
4852 midend -= littlelen;
4853 mid = midend;
4854 sv_chop(bigstr,midend-i);
4855 big += i;
4856 while (i--)
4857 *--midend = *--big;
4858 if (littlelen)
4859 Move(little, mid, littlelen,char);
4860 }
4861 else if (littlelen) {
4862 midend -= littlelen;
4863 sv_chop(bigstr,midend);
4864 Move(little,midend,littlelen,char);
4865 }
4866 else {
4867 sv_chop(bigstr,midend);
4868 }
4869 SvSETMAGIC(bigstr);
4870}
4871
c461cf8f
JH
4872/*
4873=for apidoc sv_replace
4874
4875Make the first argument a copy of the second, then delete the original.
645c22ef
DM
4876The target SV physically takes over ownership of the body of the source SV
4877and inherits its flags; however, the target keeps any magic it owns,
4878and any magic in the source is discarded.
ff276b08 4879Note that this is a rather specialist SV copying operation; most of the
645c22ef 4880time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
4881
4882=cut
4883*/
79072805
LW
4884
4885void
864dbfa3 4886Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805 4887{
97aff369 4888 dVAR;
a3b680e6 4889 const U32 refcnt = SvREFCNT(sv);
765f542d 4890 SV_CHECK_THINKFIRST_COW_DROP(sv);
30e5c352 4891 if (SvREFCNT(nsv) != 1) {
7437becc 4892 Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace() (%"
30e5c352
NC
4893 UVuf " != 1)", (UV) SvREFCNT(nsv));
4894 }
93a17b20 4895 if (SvMAGICAL(sv)) {
a0d0e21e
LW
4896 if (SvMAGICAL(nsv))
4897 mg_free(nsv);
4898 else
4899 sv_upgrade(nsv, SVt_PVMG);
b162af07 4900 SvMAGIC_set(nsv, SvMAGIC(sv));
a0d0e21e 4901 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20 4902 SvMAGICAL_off(sv);
b162af07 4903 SvMAGIC_set(sv, NULL);
93a17b20 4904 }
79072805
LW
4905 SvREFCNT(sv) = 0;
4906 sv_clear(sv);
477f5d66 4907 assert(!SvREFCNT(sv));
fd0854ff
DM
4908#ifdef DEBUG_LEAKING_SCALARS
4909 sv->sv_flags = nsv->sv_flags;
4910 sv->sv_any = nsv->sv_any;
4911 sv->sv_refcnt = nsv->sv_refcnt;
f34d0642 4912 sv->sv_u = nsv->sv_u;
fd0854ff 4913#else
79072805 4914 StructCopy(nsv,sv,SV);
fd0854ff 4915#endif
7b2c381c
NC
4916 /* Currently could join these into one piece of pointer arithmetic, but
4917 it would be unclear. */
4918 if(SvTYPE(sv) == SVt_IV)
4919 SvANY(sv)
339049b0 4920 = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
7b2c381c 4921 else if (SvTYPE(sv) == SVt_RV) {
339049b0 4922 SvANY(sv) = &sv->sv_u.svu_rv;
7b2c381c
NC
4923 }
4924
fd0854ff 4925
f8c7b90f 4926#ifdef PERL_OLD_COPY_ON_WRITE
d3d0e6f1
NC
4927 if (SvIsCOW_normal(nsv)) {
4928 /* We need to follow the pointers around the loop to make the
4929 previous SV point to sv, rather than nsv. */
4930 SV *next;
4931 SV *current = nsv;
4932 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
4933 assert(next);
4934 current = next;
3f7c398e 4935 assert(SvPVX_const(current) == SvPVX_const(nsv));
d3d0e6f1
NC
4936 }
4937 /* Make the SV before us point to the SV after us. */
4938 if (DEBUG_C_TEST) {
4939 PerlIO_printf(Perl_debug_log, "previous is\n");
4940 sv_dump(current);
a29f6d03
NC
4941 PerlIO_printf(Perl_debug_log,
4942 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
4943 (UV) SV_COW_NEXT_SV(current), (UV) sv);
4944 }
a29f6d03 4945 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
4946 }
4947#endif
79072805 4948 SvREFCNT(sv) = refcnt;
1edc1566 4949 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 4950 SvREFCNT(nsv) = 0;
463ee0b2 4951 del_SV(nsv);
79072805
LW
4952}
4953
c461cf8f
JH
4954/*
4955=for apidoc sv_clear
4956
645c22ef
DM
4957Clear an SV: call any destructors, free up any memory used by the body,
4958and free the body itself. The SV's head is I<not> freed, although
4959its type is set to all 1's so that it won't inadvertently be assumed
4960to be live during global destruction etc.
4961This function should only be called when REFCNT is zero. Most of the time
4962you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
4963instead.
c461cf8f
JH
4964
4965=cut
4966*/
4967
79072805 4968void
864dbfa3 4969Perl_sv_clear(pTHX_ register SV *sv)
79072805 4970{
27da23d5 4971 dVAR;
82bb6deb 4972 const U32 type = SvTYPE(sv);
8edfc514
NC
4973 const struct body_details *const sv_type_details
4974 = bodies_by_type + type;
82bb6deb 4975
79072805
LW
4976 assert(sv);
4977 assert(SvREFCNT(sv) == 0);
4978
d2a0f284
JC
4979 if (type <= SVt_IV) {
4980 /* See the comment in sv.h about the collusion between this early
4981 return and the overloading of the NULL and IV slots in the size
4982 table. */
82bb6deb 4983 return;
d2a0f284 4984 }
82bb6deb 4985
ed6116ce 4986 if (SvOBJECT(sv)) {
3280af22 4987 if (PL_defstash) { /* Still have a symbol table? */
39644a26 4988 dSP;
893645bd 4989 HV* stash;
d460ef45 4990 do {
b464bac0 4991 CV* destructor;
4e8e7886 4992 stash = SvSTASH(sv);
32251b26 4993 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 4994 if (destructor) {
1b6737cc 4995 SV* const tmpref = newRV(sv);
5cc433a6 4996 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 4997 ENTER;
e788e7d3 4998 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
4999 EXTEND(SP, 2);
5000 PUSHMARK(SP);
5cc433a6 5001 PUSHs(tmpref);
4e8e7886 5002 PUTBACK;
44389ee9 5003 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
7a5fa8a2
NIS
5004
5005
d3acc0f7 5006 POPSTACK;
3095d977 5007 SPAGAIN;
4e8e7886 5008 LEAVE;
5cc433a6
AB
5009 if(SvREFCNT(tmpref) < 2) {
5010 /* tmpref is not kept alive! */
5011 SvREFCNT(sv)--;
b162af07 5012 SvRV_set(tmpref, NULL);
5cc433a6
AB
5013 SvROK_off(tmpref);
5014 }
5015 SvREFCNT_dec(tmpref);
4e8e7886
GS
5016 }
5017 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5018
6f44e0a4
JP
5019
5020 if (SvREFCNT(sv)) {
5021 if (PL_in_clean_objs)
cea2e8a9 5022 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
bfcb3514 5023 HvNAME_get(stash));
6f44e0a4
JP
5024 /* DESTROY gave object new lease on life */
5025 return;
5026 }
a0d0e21e 5027 }
4e8e7886 5028
a0d0e21e 5029 if (SvOBJECT(sv)) {
4e8e7886 5030 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e 5031 SvOBJECT_off(sv); /* Curse the object. */
82bb6deb 5032 if (type != SVt_PVIO)
3280af22 5033 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5034 }
463ee0b2 5035 }
82bb6deb 5036 if (type >= SVt_PVMG) {
e736a858
NC
5037 HV *ourstash;
5038 if ((type == SVt_PVMG || type == SVt_PVGV) &&
5039 (ourstash = OURSTASH(sv))) {
5040 SvREFCNT_dec(ourstash);
5041 } else if (SvMAGIC(sv))
524189f1 5042 mg_free(sv);
00b1698f 5043 if (type == SVt_PVMG && SvPAD_TYPED(sv))
524189f1
JH
5044 SvREFCNT_dec(SvSTASH(sv));
5045 }
82bb6deb 5046 switch (type) {
8990e307 5047 case SVt_PVIO:
df0bd2f4
GS
5048 if (IoIFP(sv) &&
5049 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5050 IoIFP(sv) != PerlIO_stdout() &&
5051 IoIFP(sv) != PerlIO_stderr())
93578b34 5052 {
f2b5be74 5053 io_close((IO*)sv, FALSE);
93578b34 5054 }
1d7c1841 5055 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5056 PerlDir_close(IoDIRP(sv));
1d7c1841 5057 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5058 Safefree(IoTOP_NAME(sv));
5059 Safefree(IoFMT_NAME(sv));
5060 Safefree(IoBOTTOM_NAME(sv));
82bb6deb 5061 goto freescalar;
79072805 5062 case SVt_PVBM:
a0d0e21e 5063 goto freescalar;
79072805 5064 case SVt_PVCV:
748a9306 5065 case SVt_PVFM:
85e6fe83 5066 cv_undef((CV*)sv);
a0d0e21e 5067 goto freescalar;
79072805 5068 case SVt_PVHV:
86f55936 5069 Perl_hv_kill_backrefs(aTHX_ (HV*)sv);
85e6fe83 5070 hv_undef((HV*)sv);
a0d0e21e 5071 break;
79072805 5072 case SVt_PVAV:
85e6fe83 5073 av_undef((AV*)sv);
a0d0e21e 5074 break;
02270b4e 5075 case SVt_PVLV:
dd28f7bb
DM
5076 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5077 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5078 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5079 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5080 }
5081 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
5082 SvREFCNT_dec(LvTARG(sv));
02270b4e 5083 goto freescalar;
a0d0e21e 5084 case SVt_PVGV:
1edc1566 5085 gp_free((GV*)sv);
acda4c6a
NC
5086 if (GvNAME_HEK(sv)) {
5087 unshare_hek(GvNAME_HEK(sv));
5088 }
893645bd
NC
5089 /* If we're in a stash, we don't own a reference to it. However it does
5090 have a back reference to us, which needs to be cleared. */
5091 if (GvSTASH(sv))
5092 sv_del_backref((SV*)GvSTASH(sv), sv);
79072805 5093 case SVt_PVMG:
79072805
LW
5094 case SVt_PVNV:
5095 case SVt_PVIV:
a0d0e21e 5096 freescalar:
5228ca4e
NC
5097 /* Don't bother with SvOOK_off(sv); as we're only going to free it. */
5098 if (SvOOK(sv)) {
93524f2b 5099 SvPV_set(sv, SvPVX_mutable(sv) - SvIVX(sv));
5228ca4e
NC
5100 /* Don't even bother with turning off the OOK flag. */
5101 }
79072805 5102 case SVt_PV:
a0d0e21e 5103 case SVt_RV:
810b8aa5 5104 if (SvROK(sv)) {
b37c2d43 5105 SV * const target = SvRV(sv);
810b8aa5 5106 if (SvWEAKREF(sv))
e15faf7d 5107 sv_del_backref(target, sv);
810b8aa5 5108 else
e15faf7d 5109 SvREFCNT_dec(target);
810b8aa5 5110 }
f8c7b90f 5111#ifdef PERL_OLD_COPY_ON_WRITE
3f7c398e 5112 else if (SvPVX_const(sv)) {
765f542d
NC
5113 if (SvIsCOW(sv)) {
5114 /* I believe I need to grab the global SV mutex here and
5115 then recheck the COW status. */
46187eeb
NC
5116 if (DEBUG_C_TEST) {
5117 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5118 sv_dump(sv);
46187eeb 5119 }
bdd68bc3
NC
5120 sv_release_COW(sv, SvPVX_const(sv), SvLEN(sv),
5121 SV_COW_NEXT_SV(sv));
765f542d
NC
5122 /* And drop it here. */
5123 SvFAKE_off(sv);
5124 } else if (SvLEN(sv)) {
3f7c398e 5125 Safefree(SvPVX_const(sv));
765f542d
NC
5126 }
5127 }
5128#else
3f7c398e 5129 else if (SvPVX_const(sv) && SvLEN(sv))
94010e71 5130 Safefree(SvPVX_mutable(sv));
3f7c398e 5131 else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
bdd68bc3 5132 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
1c846c1f
NIS
5133 SvFAKE_off(sv);
5134 }
765f542d 5135#endif
79072805
LW
5136 break;
5137 case SVt_NV:
79072805
LW
5138 break;
5139 }
5140
893645bd
NC
5141 SvFLAGS(sv) &= SVf_BREAK;
5142 SvFLAGS(sv) |= SVTYPEMASK;
5143
8edfc514 5144 if (sv_type_details->arena) {
b9502f15 5145 del_body(((char *)SvANY(sv) + sv_type_details->offset),
8edfc514
NC
5146 &PL_body_roots[type]);
5147 }
d2a0f284 5148 else if (sv_type_details->body_size) {
8edfc514
NC
5149 my_safefree(SvANY(sv));
5150 }
79072805
LW
5151}
5152
645c22ef
DM
5153/*
5154=for apidoc sv_newref
5155
5156Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5157instead.
5158
5159=cut
5160*/
5161
79072805 5162SV *
864dbfa3 5163Perl_sv_newref(pTHX_ SV *sv)
79072805 5164{
96a5add6 5165 PERL_UNUSED_CONTEXT;
463ee0b2 5166 if (sv)
4db098f4 5167 (SvREFCNT(sv))++;
79072805
LW
5168 return sv;
5169}
5170
c461cf8f
JH
5171/*
5172=for apidoc sv_free
5173
645c22ef
DM
5174Decrement an SV's reference count, and if it drops to zero, call
5175C<sv_clear> to invoke destructors and free up any memory used by
5176the body; finally, deallocate the SV's head itself.
5177Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5178
5179=cut
5180*/
5181
79072805 5182void
864dbfa3 5183Perl_sv_free(pTHX_ SV *sv)
79072805 5184{
27da23d5 5185 dVAR;
79072805
LW
5186 if (!sv)
5187 return;
a0d0e21e
LW
5188 if (SvREFCNT(sv) == 0) {
5189 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5190 /* this SV's refcnt has been artificially decremented to
5191 * trigger cleanup */
a0d0e21e 5192 return;
3280af22 5193 if (PL_in_clean_all) /* All is fair */
1edc1566 5194 return;
d689ffdd
JP
5195 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5196 /* make sure SvREFCNT(sv)==0 happens very seldom */
5197 SvREFCNT(sv) = (~(U32)0)/2;
5198 return;
5199 }
41e4abd8 5200 if (ckWARN_d(WARN_INTERNAL)) {
d5dede04 5201 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
5202 "Attempt to free unreferenced scalar: SV 0x%"UVxf
5203 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
41e4abd8
NC
5204#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
5205 Perl_dump_sv_child(aTHX_ sv);
5206#endif
5207 }
79072805
LW
5208 return;
5209 }
4db098f4 5210 if (--(SvREFCNT(sv)) > 0)
8990e307 5211 return;
8c4d3c90
NC
5212 Perl_sv_free2(aTHX_ sv);
5213}
5214
5215void
5216Perl_sv_free2(pTHX_ SV *sv)
5217{
27da23d5 5218 dVAR;
463ee0b2
LW
5219#ifdef DEBUGGING
5220 if (SvTEMP(sv)) {
0453d815 5221 if (ckWARN_d(WARN_DEBUGGING))
9014280d 5222 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
472d47bc
SB
5223 "Attempt to free temp prematurely: SV 0x%"UVxf
5224 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 5225 return;
79072805 5226 }
463ee0b2 5227#endif
d689ffdd
JP
5228 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5229 /* make sure SvREFCNT(sv)==0 happens very seldom */
5230 SvREFCNT(sv) = (~(U32)0)/2;
5231 return;
5232 }
79072805 5233 sv_clear(sv);
477f5d66
CS
5234 if (! SvREFCNT(sv))
5235 del_SV(sv);
79072805
LW
5236}
5237
954c1994
GS
5238/*
5239=for apidoc sv_len
5240
645c22ef
DM
5241Returns the length of the string in the SV. Handles magic and type
5242coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5243
5244=cut
5245*/
5246
79072805 5247STRLEN
864dbfa3 5248Perl_sv_len(pTHX_ register SV *sv)
79072805 5249{
463ee0b2 5250 STRLEN len;
79072805
LW
5251
5252 if (!sv)
5253 return 0;
5254
8990e307 5255 if (SvGMAGICAL(sv))
565764a8 5256 len = mg_length(sv);
8990e307 5257 else
4d84ee25 5258 (void)SvPV_const(sv, len);
463ee0b2 5259 return len;
79072805
LW
5260}
5261
c461cf8f
JH
5262/*
5263=for apidoc sv_len_utf8
5264
5265Returns the number of characters in the string in an SV, counting wide
1e54db1a 5266UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5267
5268=cut
5269*/
5270
7e8c5dac
HS
5271/*
5272 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
5273 * mg_ptr is used, by sv_pos_u2b(), see the comments of S_utf8_mg_pos_init().
5274 * (Note that the mg_len is not the length of the mg_ptr field.)
7a5fa8a2 5275 *
7e8c5dac
HS
5276 */
5277
a0ed51b3 5278STRLEN
864dbfa3 5279Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 5280{
a0ed51b3
LW
5281 if (!sv)
5282 return 0;
5283
a0ed51b3 5284 if (SvGMAGICAL(sv))
b76347f2 5285 return mg_length(sv);
a0ed51b3 5286 else
b76347f2 5287 {
26346457 5288 STRLEN len;
e62f0680 5289 const U8 *s = (U8*)SvPV_const(sv, len);
7e8c5dac 5290
26346457
NC
5291 if (PL_utf8cache) {
5292 STRLEN ulen;
5293 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
5294
5295 if (mg && mg->mg_len != -1) {
5296 ulen = mg->mg_len;
5297 if (PL_utf8cache < 0) {
5298 const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
5299 if (real != ulen) {
5300 /* Need to turn the assertions off otherwise we may
5301 recurse infinitely while printing error messages.
5302 */
5303 SAVEI8(PL_utf8cache);
5304 PL_utf8cache = 0;
5305 Perl_croak(aTHX_ "panic: sv_len_utf8 cache %"UVf
ec07b5e0 5306 " real %"UVf" for %"SVf,
26346457
NC
5307 (UV) ulen, (UV) real, sv);
5308 }
5309 }
5310 }
5311 else {
5312 ulen = Perl_utf8_length(aTHX_ s, s + len);
5313 if (!SvREADONLY(sv)) {
5314 if (!mg) {
5315 mg = sv_magicext(sv, 0, PERL_MAGIC_utf8,
5316 &PL_vtbl_utf8, 0, 0);
5317 }
cb9e20bb 5318 assert(mg);
26346457 5319 mg->mg_len = ulen;
cb9e20bb 5320 }
cb9e20bb 5321 }
26346457 5322 return ulen;
7e8c5dac 5323 }
26346457 5324 return Perl_utf8_length(aTHX_ s, s + len);
7e8c5dac
HS
5325 }
5326}
5327
5328/* S_utf8_mg_pos_init() is used to initialize the mg_ptr field of
5329 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5330 * between UTF-8 and byte offsets. There are two (substr offset and substr
5331 * length, the i offset, PERL_MAGIC_UTF8_CACHESIZE) times two (UTF-8 offset
5332 * and byte offset) cache positions.
5333 *
5334 * The mg_len field is used by sv_len_utf8(), see its comments.
5335 * Note that the mg_len is not the length of the mg_ptr field.
5336 *
5337 */
5338STATIC bool
245d4a47
NC
5339S_utf8_mg_pos_init(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i,
5340 I32 offsetp, const U8 *s, const U8 *start)
7e8c5dac 5341{
7a5fa8a2 5342 bool found = FALSE;
7e8c5dac
HS
5343
5344 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
45f47268 5345 if (!*mgp) {
27da23d5 5346 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0, 0);
45f47268
NC
5347 (*mgp)->mg_len = -1;
5348 }
7e8c5dac 5349 assert(*mgp);
b76347f2 5350
7e8c5dac
HS
5351 if ((*mgp)->mg_ptr)
5352 *cachep = (STRLEN *) (*mgp)->mg_ptr;
5353 else {
a02a5408 5354 Newxz(*cachep, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7e8c5dac
HS
5355 (*mgp)->mg_ptr = (char *) *cachep;
5356 }
5357 assert(*cachep);
5358
a3b680e6 5359 (*cachep)[i] = offsetp;
7e8c5dac
HS
5360 (*cachep)[i+1] = s - start;
5361 found = TRUE;
a0ed51b3 5362 }
7e8c5dac
HS
5363
5364 return found;
a0ed51b3
LW
5365}
5366
645c22ef 5367/*
7e8c5dac
HS
5368 * S_utf8_mg_pos() is used to query and update mg_ptr field of
5369 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5370 * between UTF-8 and byte offsets. See also the comments of
5371 * S_utf8_mg_pos_init().
5372 *
5373 */
5374STATIC bool
245d4a47 5375S_utf8_mg_pos(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, I32 uoff, const U8 **sp, const U8 *start, const U8 *send)
7e8c5dac
HS
5376{
5377 bool found = FALSE;
5378
5379 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
5380 if (!*mgp)
5381 *mgp = mg_find(sv, PERL_MAGIC_utf8);
5382 if (*mgp && (*mgp)->mg_ptr) {
5383 *cachep = (STRLEN *) (*mgp)->mg_ptr;
e23c8137 5384 ASSERT_UTF8_CACHE(*cachep);
667208dd 5385 if ((*cachep)[i] == (STRLEN)uoff) /* An exact match. */
7a5fa8a2 5386 found = TRUE;
7e8c5dac
HS
5387 else { /* We will skip to the right spot. */
5388 STRLEN forw = 0;
5389 STRLEN backw = 0;
a3b680e6 5390 const U8* p = NULL;
7e8c5dac
HS
5391
5392 /* The assumption is that going backward is half
5393 * the speed of going forward (that's where the
5394 * 2 * backw in the below comes from). (The real
5395 * figure of course depends on the UTF-8 data.) */
5396
667208dd 5397 if ((*cachep)[i] > (STRLEN)uoff) {
7e8c5dac 5398 forw = uoff;
667208dd 5399 backw = (*cachep)[i] - (STRLEN)uoff;
7e8c5dac
HS
5400
5401 if (forw < 2 * backw)
5402 p = start;
5403 else
5404 p = start + (*cachep)[i+1];
5405 }
5406 /* Try this only for the substr offset (i == 0),
5407 * not for the substr length (i == 2). */
5408 else if (i == 0) { /* (*cachep)[i] < uoff */
a3b680e6 5409 const STRLEN ulen = sv_len_utf8(sv);
7e8c5dac 5410
667208dd
JH
5411 if ((STRLEN)uoff < ulen) {
5412 forw = (STRLEN)uoff - (*cachep)[i];
5413 backw = ulen - (STRLEN)uoff;
7e8c5dac
HS
5414
5415 if (forw < 2 * backw)
5416 p = start + (*cachep)[i+1];
5417 else
5418 p = send;
5419 }
5420
5421 /* If the string is not long enough for uoff,
5422 * we could extend it, but not at this low a level. */
5423 }
5424
5425 if (p) {
5426 if (forw < 2 * backw) {
5427 while (forw--)
5428 p += UTF8SKIP(p);
5429 }
5430 else {
5431 while (backw--) {
5432 p--;
5433 while (UTF8_IS_CONTINUATION(*p))
5434 p--;
5435 }
5436 }
5437
5438 /* Update the cache. */
667208dd 5439 (*cachep)[i] = (STRLEN)uoff;
7e8c5dac 5440 (*cachep)[i+1] = p - start;
8f78557a
AE
5441
5442 /* Drop the stale "length" cache */
5443 if (i == 0) {
5444 (*cachep)[2] = 0;
5445 (*cachep)[3] = 0;
5446 }
7a5fa8a2 5447
7e8c5dac
HS
5448 found = TRUE;
5449 }
5450 }
5451 if (found) { /* Setup the return values. */
5452 *offsetp = (*cachep)[i+1];
5453 *sp = start + *offsetp;
5454 if (*sp >= send) {
5455 *sp = send;
5456 *offsetp = send - start;
5457 }
5458 else if (*sp < start) {
5459 *sp = start;
5460 *offsetp = 0;
5461 }
5462 }
5463 }
e23c8137
JH
5464#ifdef PERL_UTF8_CACHE_ASSERT
5465 if (found) {
45f47268 5466 const U8 *s = start;
e23c8137
JH
5467 I32 n = uoff;
5468
5469 while (n-- && s < send)
5470 s += UTF8SKIP(s);
5471
5472 if (i == 0) {
5473 assert(*offsetp == s - start);
5474 assert((*cachep)[0] == (STRLEN)uoff);
5475 assert((*cachep)[1] == *offsetp);
5476 }
5477 ASSERT_UTF8_CACHE(*cachep);
5478 }
5479#endif
7e8c5dac 5480 }
e23c8137 5481
7e8c5dac
HS
5482 return found;
5483}
7a5fa8a2 5484
7e8c5dac 5485/*
645c22ef
DM
5486=for apidoc sv_pos_u2b
5487
1e54db1a 5488Converts the value pointed to by offsetp from a count of UTF-8 chars from
645c22ef
DM
5489the start of the string, to a count of the equivalent number of bytes; if
5490lenp is non-zero, it does the same to lenp, but this time starting from
5491the offset, rather than from the start of the string. Handles magic and
5492type coercion.
5493
5494=cut
5495*/
5496
7e8c5dac
HS
5497/*
5498 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
5499 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5500 * byte offsets. See also the comments of S_utf8_mg_pos().
5501 *
5502 */
5503
a0ed51b3 5504void
864dbfa3 5505Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 5506{
245d4a47 5507 const U8 *start;
a0ed51b3
LW
5508 STRLEN len;
5509
5510 if (!sv)
5511 return;
5512
245d4a47 5513 start = (U8*)SvPV_const(sv, len);
7e8c5dac 5514 if (len) {
b464bac0 5515 STRLEN boffset = 0;
cbbf8932 5516 STRLEN *cache = NULL;
245d4a47
NC
5517 const U8 *s = start;
5518 I32 uoffset = *offsetp;
9d4ba2ae 5519 const U8 * const send = s + len;
cbbf8932
AL
5520 MAGIC *mg = NULL;
5521 bool found = utf8_mg_pos(sv, &mg, &cache, 0, offsetp, *offsetp, &s, start, send);
7e8c5dac 5522
7e8c5dac
HS
5523 if (!found && uoffset > 0) {
5524 while (s < send && uoffset--)
5525 s += UTF8SKIP(s);
5526 if (s >= send)
5527 s = send;
a3b680e6 5528 if (utf8_mg_pos_init(sv, &mg, &cache, 0, *offsetp, s, start))
7e8c5dac
HS
5529 boffset = cache[1];
5530 *offsetp = s - start;
5531 }
5532 if (lenp) {
5533 found = FALSE;
5534 start = s;
ec062429 5535 if (utf8_mg_pos(sv, &mg, &cache, 2, lenp, *lenp, &s, start, send)) {
7e8c5dac
HS
5536 *lenp -= boffset;
5537 found = TRUE;
5538 }
5539 if (!found && *lenp > 0) {
5540 I32 ulen = *lenp;
5541 if (ulen > 0)
5542 while (s < send && ulen--)
5543 s += UTF8SKIP(s);
5544 if (s >= send)
5545 s = send;
a3b680e6 5546 utf8_mg_pos_init(sv, &mg, &cache, 2, *lenp, s, start);
7e8c5dac
HS
5547 }
5548 *lenp = s - start;
5549 }
e23c8137 5550 ASSERT_UTF8_CACHE(cache);
7e8c5dac
HS
5551 }
5552 else {
5553 *offsetp = 0;
5554 if (lenp)
5555 *lenp = 0;
a0ed51b3 5556 }
e23c8137 5557
a0ed51b3
LW
5558 return;
5559}
5560
645c22ef
DM
5561/*
5562=for apidoc sv_pos_b2u
5563
5564Converts the value pointed to by offsetp from a count of bytes from the
1e54db1a 5565start of the string, to a count of the equivalent number of UTF-8 chars.
645c22ef
DM
5566Handles magic and type coercion.
5567
5568=cut
5569*/
5570
7e8c5dac
HS
5571/*
5572 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
5573 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5574 * byte offsets. See also the comments of S_utf8_mg_pos().
5575 *
5576 */
5577
ec07b5e0
NC
5578
5579static STRLEN
5580S_sv_pos_b2u_forwards(pTHX_ const U8 *s, const U8 *const target);
5581
5582static void
5583S_utf8_mg_pos_cache_update(pTHX_ SV *sv, MAGIC **mgp, STRLEN byte, STRLEN utf8)
5584{
5585 STRLEN *cache;
5586 if (SvREADONLY(sv))
5587 return;
5588
5589 if (!*mgp) {
5590 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
5591 0);
5592 (*mgp)->mg_len = -1;
5593 }
5594 assert(*mgp);
5595
5596 if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
5597 Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
5598 (*mgp)->mg_ptr = (char *) cache;
5599 }
5600 assert(cache);
5601
5602 if (PL_utf8cache < 0) {
5603 const char *start = SvPVX_const(sv);
5604 const STRLEN realutf8
5605 = S_sv_pos_b2u_forwards(aTHX_ start, start + byte);
5606
5607 if (realutf8 != utf8) {
5608 /* Need to turn the assertions off otherwise we may recurse
5609 infinitely while printing error messages. */
5610 SAVEI8(PL_utf8cache);
5611 PL_utf8cache = 0;
5612 Perl_croak(aTHX_ "panic: utf8_mg_pos_cache_update cache %"UVf
5613 " real %"UVf" for %"SVf, (UV) utf8, (UV) realutf8, sv);
5614 }
5615 }
5616 cache[0] = utf8;
5617 cache[1] = byte;
5618 /* Drop the stale "length" cache */
5619 cache[2] = 0;
5620 cache[3] = 0;
5621}
5622
5623/* If we don't know the character offset of the end of a region, our only
5624 option is to walk forwards to the target byte offset. */
5625static STRLEN
5626S_sv_pos_b2u_forwards(pTHX_ const U8 *s, const U8 *const target)
5627{
5628 STRLEN len = 0;
5629 while (s < target) {
5630 STRLEN n = 1;
5631
5632 /* Call utf8n_to_uvchr() to validate the sequence
5633 * (unless a simple non-UTF character) */
5634 if (!UTF8_IS_INVARIANT(*s))
5635 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
5636 if (n > 0) {
5637 s += n;
5638 len++;
5639 }
5640 else
5641 break;
5642 }
5643 return len;
5644}
5645
5646/* We already know all of the way, now we may be able to walk back. The same
5647 assumption is made as in S_utf8_mg_pos(), namely that walking backward is
5648 twice slower than walking forward. */
5649static STRLEN
5650S_sv_pos_b2u_midway(pTHX_ const U8 *s, const U8 *const target, const U8 *end,
5651 STRLEN endu)
5652{
5653 const STRLEN forw = target - s;
5654 STRLEN backw = end - target;
5655
5656 if (forw < 2 * backw) {
5657 return S_sv_pos_b2u_forwards(aTHX_ s, target);
5658 }
5659
5660 while (end > target) {
5661 end--;
5662 while (UTF8_IS_CONTINUATION(*end)) {
5663 end--;
5664 }
5665 endu--;
5666 }
5667 return endu;
5668}
5669
a0ed51b3 5670void
7e8c5dac 5671Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 5672{
83003860 5673 const U8* s;
ec07b5e0 5674 const STRLEN byte = *offsetp;
a0ed51b3 5675 STRLEN len;
ec07b5e0
NC
5676 MAGIC* mg = NULL;
5677 const U8* send;
a0ed51b3
LW
5678
5679 if (!sv)
5680 return;
5681
83003860 5682 s = (const U8*)SvPV_const(sv, len);
7e8c5dac 5683
b9f984a5 5684 if (len < byte)
ec07b5e0 5685 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac 5686
ec07b5e0 5687 send = s + byte;
a67d7df9 5688
ffca234a
NC
5689 if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
5690 && (mg = mg_find(sv, PERL_MAGIC_utf8))) {
5691 if (mg->mg_ptr) {
ec07b5e0 5692 STRLEN *cache = (STRLEN *) mg->mg_ptr;
b9f984a5 5693 if (cache[1] == byte) {
ec07b5e0
NC
5694 /* An exact match. */
5695 *offsetp = cache[0];
a67d7df9 5696
ec07b5e0 5697 return;
7e8c5dac 5698 }
b9f984a5 5699 else if (cache[1] < byte) {
ec07b5e0 5700 /* We already know part of the way. */
b9f984a5
NC
5701 if (mg->mg_len != -1) {
5702 /* Actually, we know the end too. */
5703 len = cache[0]
5704 + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
5705 s + len, mg->mg_len - cache[0]);
5706 } else {
5707 len = cache[0]
5708 + S_sv_pos_b2u_forwards(aTHX_ s + cache[1], send);
5709 }
7e8c5dac 5710 }
ec07b5e0
NC
5711 else { /* cache[1] > byte */
5712 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[1],
5713 cache[0]);
7e8c5dac 5714
7e8c5dac 5715 }
ec07b5e0
NC
5716 ASSERT_UTF8_CACHE(cache);
5717 if (PL_utf8cache < 0) {
5718 const STRLEN reallen = S_sv_pos_b2u_forwards(aTHX_ s, send);
5719
5720 if (len != reallen) {
5721 /* Need to turn the assertions off otherwise we may recurse
5722 infinitely while printing error messages. */
5723 SAVEI8(PL_utf8cache);
5724 PL_utf8cache = 0;
5725 Perl_croak(aTHX_ "panic: sv_pos_b2u cache %"UVf
5726 " real %"UVf" for %"SVf,
5727 (UV) len, (UV) reallen, sv);
5728 }
7e8c5dac 5729 }
ffca234a
NC
5730 } else if (mg->mg_len != -1) {
5731 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + len, mg->mg_len);
ec07b5e0
NC
5732 } else {
5733 len = S_sv_pos_b2u_forwards(aTHX_ s, send);
7e8c5dac 5734 }
a0ed51b3 5735 }
ec07b5e0
NC
5736 else {
5737 len = S_sv_pos_b2u_forwards(aTHX_ s, send);
5738 }
5739 *offsetp = len;
5740
5741 S_utf8_mg_pos_cache_update(aTHX_ sv, &mg, byte, len);
a0ed51b3
LW
5742}
5743
954c1994
GS
5744/*
5745=for apidoc sv_eq
5746
5747Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
5748identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5749coerce its args to strings if necessary.
954c1994
GS
5750
5751=cut
5752*/
5753
79072805 5754I32
e01b9e88 5755Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805 5756{
97aff369 5757 dVAR;
e1ec3a88 5758 const char *pv1;
463ee0b2 5759 STRLEN cur1;
e1ec3a88 5760 const char *pv2;
463ee0b2 5761 STRLEN cur2;
e01b9e88 5762 I32 eq = 0;
bd61b366 5763 char *tpv = NULL;
a0714e2c 5764 SV* svrecode = NULL;
79072805 5765
e01b9e88 5766 if (!sv1) {
79072805
LW
5767 pv1 = "";
5768 cur1 = 0;
5769 }
463ee0b2 5770 else
4d84ee25 5771 pv1 = SvPV_const(sv1, cur1);
79072805 5772
e01b9e88
SC
5773 if (!sv2){
5774 pv2 = "";
5775 cur2 = 0;
92d29cee 5776 }
e01b9e88 5777 else
4d84ee25 5778 pv2 = SvPV_const(sv2, cur2);
79072805 5779
cf48d248 5780 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
5781 /* Differing utf8ness.
5782 * Do not UTF8size the comparands as a side-effect. */
5783 if (PL_encoding) {
5784 if (SvUTF8(sv1)) {
553e1bcc
AT
5785 svrecode = newSVpvn(pv2, cur2);
5786 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5787 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
5788 }
5789 else {
553e1bcc
AT
5790 svrecode = newSVpvn(pv1, cur1);
5791 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5792 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
5793 }
5794 /* Now both are in UTF-8. */
0a1bd7ac
DM
5795 if (cur1 != cur2) {
5796 SvREFCNT_dec(svrecode);
799ef3cb 5797 return FALSE;
0a1bd7ac 5798 }
799ef3cb
JH
5799 }
5800 else {
5801 bool is_utf8 = TRUE;
5802
5803 if (SvUTF8(sv1)) {
5804 /* sv1 is the UTF-8 one,
5805 * if is equal it must be downgrade-able */
9d4ba2ae 5806 char * const pv = (char*)bytes_from_utf8((const U8*)pv1,
799ef3cb
JH
5807 &cur1, &is_utf8);
5808 if (pv != pv1)
553e1bcc 5809 pv1 = tpv = pv;
799ef3cb
JH
5810 }
5811 else {
5812 /* sv2 is the UTF-8 one,
5813 * if is equal it must be downgrade-able */
9d4ba2ae 5814 char * const pv = (char *)bytes_from_utf8((const U8*)pv2,
799ef3cb
JH
5815 &cur2, &is_utf8);
5816 if (pv != pv2)
553e1bcc 5817 pv2 = tpv = pv;
799ef3cb
JH
5818 }
5819 if (is_utf8) {
5820 /* Downgrade not possible - cannot be eq */
bf694877 5821 assert (tpv == 0);
799ef3cb
JH
5822 return FALSE;
5823 }
5824 }
cf48d248
JH
5825 }
5826
5827 if (cur1 == cur2)
765f542d 5828 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 5829
b37c2d43 5830 SvREFCNT_dec(svrecode);
553e1bcc
AT
5831 if (tpv)
5832 Safefree(tpv);
cf48d248 5833
e01b9e88 5834 return eq;
79072805
LW
5835}
5836
954c1994
GS
5837/*
5838=for apidoc sv_cmp
5839
5840Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
5841string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
5842C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5843coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
5844
5845=cut
5846*/
5847
79072805 5848I32
e01b9e88 5849Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 5850{
97aff369 5851 dVAR;
560a288e 5852 STRLEN cur1, cur2;
e1ec3a88 5853 const char *pv1, *pv2;
bd61b366 5854 char *tpv = NULL;
cf48d248 5855 I32 cmp;
a0714e2c 5856 SV *svrecode = NULL;
560a288e 5857
e01b9e88
SC
5858 if (!sv1) {
5859 pv1 = "";
560a288e
GS
5860 cur1 = 0;
5861 }
e01b9e88 5862 else
4d84ee25 5863 pv1 = SvPV_const(sv1, cur1);
560a288e 5864
553e1bcc 5865 if (!sv2) {
e01b9e88 5866 pv2 = "";
560a288e
GS
5867 cur2 = 0;
5868 }
e01b9e88 5869 else
4d84ee25 5870 pv2 = SvPV_const(sv2, cur2);
79072805 5871
cf48d248 5872 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
5873 /* Differing utf8ness.
5874 * Do not UTF8size the comparands as a side-effect. */
cf48d248 5875 if (SvUTF8(sv1)) {
799ef3cb 5876 if (PL_encoding) {
553e1bcc
AT
5877 svrecode = newSVpvn(pv2, cur2);
5878 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5879 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
5880 }
5881 else {
e1ec3a88 5882 pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
799ef3cb 5883 }
cf48d248
JH
5884 }
5885 else {
799ef3cb 5886 if (PL_encoding) {
553e1bcc
AT
5887 svrecode = newSVpvn(pv1, cur1);
5888 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5889 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
5890 }
5891 else {
e1ec3a88 5892 pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
799ef3cb 5893 }
cf48d248
JH
5894 }
5895 }
5896
e01b9e88 5897 if (!cur1) {
cf48d248 5898 cmp = cur2 ? -1 : 0;
e01b9e88 5899 } else if (!cur2) {
cf48d248
JH
5900 cmp = 1;
5901 } else {
e1ec3a88 5902 const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
5903
5904 if (retval) {
cf48d248 5905 cmp = retval < 0 ? -1 : 1;
e01b9e88 5906 } else if (cur1 == cur2) {
cf48d248
JH
5907 cmp = 0;
5908 } else {
5909 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 5910 }
cf48d248 5911 }
16660edb 5912
b37c2d43 5913 SvREFCNT_dec(svrecode);
553e1bcc
AT
5914 if (tpv)
5915 Safefree(tpv);
cf48d248
JH
5916
5917 return cmp;
bbce6d69 5918}
16660edb 5919
c461cf8f
JH
5920/*
5921=for apidoc sv_cmp_locale
5922
645c22ef
DM
5923Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
5924'use bytes' aware, handles get magic, and will coerce its args to strings
5925if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
5926
5927=cut
5928*/
5929
bbce6d69 5930I32
864dbfa3 5931Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 5932{
97aff369 5933 dVAR;
36477c24 5934#ifdef USE_LOCALE_COLLATE
16660edb 5935
bbce6d69 5936 char *pv1, *pv2;
5937 STRLEN len1, len2;
5938 I32 retval;
16660edb 5939
3280af22 5940 if (PL_collation_standard)
bbce6d69 5941 goto raw_compare;
16660edb 5942
bbce6d69 5943 len1 = 0;
8ac85365 5944 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 5945 len2 = 0;
8ac85365 5946 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 5947
bbce6d69 5948 if (!pv1 || !len1) {
5949 if (pv2 && len2)
5950 return -1;
5951 else
5952 goto raw_compare;
5953 }
5954 else {
5955 if (!pv2 || !len2)
5956 return 1;
5957 }
16660edb 5958
bbce6d69 5959 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 5960
bbce6d69 5961 if (retval)
16660edb 5962 return retval < 0 ? -1 : 1;
5963
bbce6d69 5964 /*
5965 * When the result of collation is equality, that doesn't mean
5966 * that there are no differences -- some locales exclude some
5967 * characters from consideration. So to avoid false equalities,
5968 * we use the raw string as a tiebreaker.
5969 */
16660edb 5970
bbce6d69 5971 raw_compare:
5f66b61c 5972 /*FALLTHROUGH*/
16660edb 5973
36477c24 5974#endif /* USE_LOCALE_COLLATE */
16660edb 5975
bbce6d69 5976 return sv_cmp(sv1, sv2);
5977}
79072805 5978
645c22ef 5979
36477c24 5980#ifdef USE_LOCALE_COLLATE
645c22ef 5981
7a4c00b4 5982/*
645c22ef
DM
5983=for apidoc sv_collxfrm
5984
5985Add Collate Transform magic to an SV if it doesn't already have it.
5986
5987Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
5988scalar data of the variable, but transformed to such a format that a normal
5989memory comparison can be used to compare the data according to the locale
5990settings.
5991
5992=cut
5993*/
5994
bbce6d69 5995char *
864dbfa3 5996Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 5997{
97aff369 5998 dVAR;
7a4c00b4 5999 MAGIC *mg;
16660edb 6000
14befaf4 6001 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 6002 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
93524f2b
NC
6003 const char *s;
6004 char *xf;
bbce6d69 6005 STRLEN len, xlen;
6006
7a4c00b4 6007 if (mg)
6008 Safefree(mg->mg_ptr);
93524f2b 6009 s = SvPV_const(sv, len);
bbce6d69 6010 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 6011 if (SvREADONLY(sv)) {
6012 SAVEFREEPV(xf);
6013 *nxp = xlen;
3280af22 6014 return xf + sizeof(PL_collation_ix);
ff0cee69 6015 }
7a4c00b4 6016 if (! mg) {
d83f0a82
NC
6017#ifdef PERL_OLD_COPY_ON_WRITE
6018 if (SvIsCOW(sv))
6019 sv_force_normal_flags(sv, 0);
6020#endif
6021 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
6022 0, 0);
7a4c00b4 6023 assert(mg);
bbce6d69 6024 }
7a4c00b4 6025 mg->mg_ptr = xf;
565764a8 6026 mg->mg_len = xlen;
7a4c00b4 6027 }
6028 else {
ff0cee69 6029 if (mg) {
6030 mg->mg_ptr = NULL;
565764a8 6031 mg->mg_len = -1;
ff0cee69 6032 }
bbce6d69 6033 }
6034 }
7a4c00b4 6035 if (mg && mg->mg_ptr) {
565764a8 6036 *nxp = mg->mg_len;
3280af22 6037 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 6038 }
6039 else {
6040 *nxp = 0;
6041 return NULL;
16660edb 6042 }
79072805
LW
6043}
6044
36477c24 6045#endif /* USE_LOCALE_COLLATE */
bbce6d69 6046
c461cf8f
JH
6047/*
6048=for apidoc sv_gets
6049
6050Get a line from the filehandle and store it into the SV, optionally
6051appending to the currently-stored string.
6052
6053=cut
6054*/
6055
79072805 6056char *
864dbfa3 6057Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 6058{
97aff369 6059 dVAR;
e1ec3a88 6060 const char *rsptr;
c07a80fd 6061 STRLEN rslen;
6062 register STDCHAR rslast;
6063 register STDCHAR *bp;
6064 register I32 cnt;
9c5ffd7c 6065 I32 i = 0;
8bfdd7d9 6066 I32 rspara = 0;
e311fd51 6067 I32 recsize;
c07a80fd 6068
bc44a8a2
NC
6069 if (SvTHINKFIRST(sv))
6070 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
6071 /* XXX. If you make this PVIV, then copy on write can copy scalars read
6072 from <>.
6073 However, perlbench says it's slower, because the existing swipe code
6074 is faster than copy on write.
6075 Swings and roundabouts. */
862a34c6 6076 SvUPGRADE(sv, SVt_PV);
99491443 6077
ff68c719 6078 SvSCREAM_off(sv);
efd8b2ba
AE
6079
6080 if (append) {
6081 if (PerlIO_isutf8(fp)) {
6082 if (!SvUTF8(sv)) {
6083 sv_utf8_upgrade_nomg(sv);
6084 sv_pos_u2b(sv,&append,0);
6085 }
6086 } else if (SvUTF8(sv)) {
561b68a9 6087 SV * const tsv = newSV(0);
efd8b2ba
AE
6088 sv_gets(tsv, fp, 0);
6089 sv_utf8_upgrade_nomg(tsv);
6090 SvCUR_set(sv,append);
6091 sv_catsv(sv,tsv);
6092 sv_free(tsv);
6093 goto return_string_or_null;
6094 }
6095 }
6096
6097 SvPOK_only(sv);
6098 if (PerlIO_isutf8(fp))
6099 SvUTF8_on(sv);
c07a80fd 6100
923e4eb5 6101 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
6102 /* we always read code in line mode */
6103 rsptr = "\n";
6104 rslen = 1;
6105 }
6106 else if (RsSNARF(PL_rs)) {
7a5fa8a2
NIS
6107 /* If it is a regular disk file use size from stat() as estimate
6108 of amount we are going to read - may result in malloc-ing
6109 more memory than we realy need if layers bellow reduce
e468d35b
NIS
6110 size we read (e.g. CRLF or a gzip layer)
6111 */
e311fd51 6112 Stat_t st;
e468d35b 6113 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
f54cb97a 6114 const Off_t offset = PerlIO_tell(fp);
58f1856e 6115 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
6116 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6117 }
6118 }
c07a80fd 6119 rsptr = NULL;
6120 rslen = 0;
6121 }
3280af22 6122 else if (RsRECORD(PL_rs)) {
e311fd51 6123 I32 bytesread;
5b2b9c68
HM
6124 char *buffer;
6125
6126 /* Grab the size of the record we're getting */
3280af22 6127 recsize = SvIV(SvRV(PL_rs));
e311fd51 6128 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
6129 /* Go yank in */
6130#ifdef VMS
6131 /* VMS wants read instead of fread, because fread doesn't respect */
6132 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
6133 /* doing, but we've got no other real choice - except avoid stdio
6134 as implementation - perhaps write a :vms layer ?
6135 */
5b2b9c68
HM
6136 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
6137#else
6138 bytesread = PerlIO_read(fp, buffer, recsize);
6139#endif
27e6ca2d
AE
6140 if (bytesread < 0)
6141 bytesread = 0;
e311fd51 6142 SvCUR_set(sv, bytesread += append);
e670df4e 6143 buffer[bytesread] = '\0';
efd8b2ba 6144 goto return_string_or_null;
5b2b9c68 6145 }
3280af22 6146 else if (RsPARA(PL_rs)) {
c07a80fd 6147 rsptr = "\n\n";
6148 rslen = 2;
8bfdd7d9 6149 rspara = 1;
c07a80fd 6150 }
7d59b7e4
NIS
6151 else {
6152 /* Get $/ i.e. PL_rs into same encoding as stream wants */
6153 if (PerlIO_isutf8(fp)) {
6154 rsptr = SvPVutf8(PL_rs, rslen);
6155 }
6156 else {
6157 if (SvUTF8(PL_rs)) {
6158 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
6159 Perl_croak(aTHX_ "Wide character in $/");
6160 }
6161 }
93524f2b 6162 rsptr = SvPV_const(PL_rs, rslen);
7d59b7e4
NIS
6163 }
6164 }
6165
c07a80fd 6166 rslast = rslen ? rsptr[rslen - 1] : '\0';
6167
8bfdd7d9 6168 if (rspara) { /* have to do this both before and after */
79072805 6169 do { /* to make sure file boundaries work right */
760ac839 6170 if (PerlIO_eof(fp))
a0d0e21e 6171 return 0;
760ac839 6172 i = PerlIO_getc(fp);
79072805 6173 if (i != '\n') {
a0d0e21e
LW
6174 if (i == -1)
6175 return 0;
760ac839 6176 PerlIO_ungetc(fp,i);
79072805
LW
6177 break;
6178 }
6179 } while (i != EOF);
6180 }
c07a80fd 6181
760ac839
LW
6182 /* See if we know enough about I/O mechanism to cheat it ! */
6183
6184 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 6185 of abstracting out stdio interface. One call should be cheap
760ac839
LW
6186 enough here - and may even be a macro allowing compile
6187 time optimization.
6188 */
6189
6190 if (PerlIO_fast_gets(fp)) {
6191
6192 /*
6193 * We're going to steal some values from the stdio struct
6194 * and put EVERYTHING in the innermost loop into registers.
6195 */
6196 register STDCHAR *ptr;
6197 STRLEN bpx;
6198 I32 shortbuffered;
6199
16660edb 6200#if defined(VMS) && defined(PERLIO_IS_STDIO)
6201 /* An ungetc()d char is handled separately from the regular
6202 * buffer, so we getc() it back out and stuff it in the buffer.
6203 */
6204 i = PerlIO_getc(fp);
6205 if (i == EOF) return 0;
6206 *(--((*fp)->_ptr)) = (unsigned char) i;
6207 (*fp)->_cnt++;
6208#endif
c07a80fd 6209
c2960299 6210 /* Here is some breathtakingly efficient cheating */
c07a80fd 6211
a20bf0c3 6212 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b 6213 /* make sure we have the room */
7a5fa8a2 6214 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
e468d35b 6215 /* Not room for all of it
7a5fa8a2 6216 if we are looking for a separator and room for some
e468d35b
NIS
6217 */
6218 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7a5fa8a2 6219 /* just process what we have room for */
79072805
LW
6220 shortbuffered = cnt - SvLEN(sv) + append + 1;
6221 cnt -= shortbuffered;
6222 }
6223 else {
6224 shortbuffered = 0;
bbce6d69 6225 /* remember that cnt can be negative */
eb160463 6226 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
6227 }
6228 }
7a5fa8a2 6229 else
79072805 6230 shortbuffered = 0;
3f7c398e 6231 bp = (STDCHAR*)SvPVX_const(sv) + append; /* move these two too to registers */
a20bf0c3 6232 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 6233 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6234 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 6235 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 6236 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6237 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6238 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
6239 for (;;) {
6240 screamer:
93a17b20 6241 if (cnt > 0) {
c07a80fd 6242 if (rslen) {
760ac839
LW
6243 while (cnt > 0) { /* this | eat */
6244 cnt--;
c07a80fd 6245 if ((*bp++ = *ptr++) == rslast) /* really | dust */
6246 goto thats_all_folks; /* screams | sed :-) */
6247 }
6248 }
6249 else {
1c846c1f
NIS
6250 Copy(ptr, bp, cnt, char); /* this | eat */
6251 bp += cnt; /* screams | dust */
c07a80fd 6252 ptr += cnt; /* louder | sed :-) */
a5f75d66 6253 cnt = 0;
93a17b20 6254 }
79072805
LW
6255 }
6256
748a9306 6257 if (shortbuffered) { /* oh well, must extend */
79072805
LW
6258 cnt = shortbuffered;
6259 shortbuffered = 0;
3f7c398e 6260 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6261 SvCUR_set(sv, bpx);
6262 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3f7c398e 6263 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
79072805
LW
6264 continue;
6265 }
6266
16660edb 6267 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
6268 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
6269 PTR2UV(ptr),(long)cnt));
cc00df79 6270 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 6271#if 0
16660edb 6272 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6273 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6274 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6275 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6276#endif
1c846c1f 6277 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 6278 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
6279 another abstraction. */
760ac839 6280 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 6281#if 0
16660edb 6282 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6283 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6284 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6285 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6286#endif
a20bf0c3
JH
6287 cnt = PerlIO_get_cnt(fp);
6288 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 6289 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6290 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 6291
748a9306
LW
6292 if (i == EOF) /* all done for ever? */
6293 goto thats_really_all_folks;
6294
3f7c398e 6295 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6296 SvCUR_set(sv, bpx);
6297 SvGROW(sv, bpx + cnt + 2);
3f7c398e 6298 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
c07a80fd 6299
eb160463 6300 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 6301
c07a80fd 6302 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 6303 goto thats_all_folks;
79072805
LW
6304 }
6305
6306thats_all_folks:
3f7c398e 6307 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
36477c24 6308 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 6309 goto screamer; /* go back to the fray */
79072805
LW
6310thats_really_all_folks:
6311 if (shortbuffered)
6312 cnt += shortbuffered;
16660edb 6313 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6314 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 6315 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 6316 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6317 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6318 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6319 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 6320 *bp = '\0';
3f7c398e 6321 SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv)); /* set length */
16660edb 6322 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 6323 "Screamer: done, len=%ld, string=|%.*s|\n",
3f7c398e 6324 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
760ac839
LW
6325 }
6326 else
79072805 6327 {
6edd2cd5 6328 /*The big, slow, and stupid way. */
27da23d5 6329#ifdef USE_HEAP_INSTEAD_OF_STACK /* Even slower way. */
cbbf8932 6330 STDCHAR *buf = NULL;
a02a5408 6331 Newx(buf, 8192, STDCHAR);
6edd2cd5 6332 assert(buf);
4d2c4e07 6333#else
6edd2cd5 6334 STDCHAR buf[8192];
4d2c4e07 6335#endif
79072805 6336
760ac839 6337screamer2:
c07a80fd 6338 if (rslen) {
00b6aa41 6339 register const STDCHAR * const bpe = buf + sizeof(buf);
760ac839 6340 bp = buf;
eb160463 6341 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
6342 ; /* keep reading */
6343 cnt = bp - buf;
c07a80fd 6344 }
6345 else {
760ac839 6346 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 6347 /* Accomodate broken VAXC compiler, which applies U8 cast to
6348 * both args of ?: operator, causing EOF to change into 255
6349 */
37be0adf 6350 if (cnt > 0)
cbe9e203
JH
6351 i = (U8)buf[cnt - 1];
6352 else
37be0adf 6353 i = EOF;
c07a80fd 6354 }
79072805 6355
cbe9e203
JH
6356 if (cnt < 0)
6357 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
6358 if (append)
6359 sv_catpvn(sv, (char *) buf, cnt);
6360 else
6361 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 6362
6363 if (i != EOF && /* joy */
6364 (!rslen ||
6365 SvCUR(sv) < rslen ||
3f7c398e 6366 memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
6367 {
6368 append = -1;
63e4d877
CS
6369 /*
6370 * If we're reading from a TTY and we get a short read,
6371 * indicating that the user hit his EOF character, we need
6372 * to notice it now, because if we try to read from the TTY
6373 * again, the EOF condition will disappear.
6374 *
6375 * The comparison of cnt to sizeof(buf) is an optimization
6376 * that prevents unnecessary calls to feof().
6377 *
6378 * - jik 9/25/96
6379 */
6380 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
6381 goto screamer2;
79072805 6382 }
6edd2cd5 6383
27da23d5 6384#ifdef USE_HEAP_INSTEAD_OF_STACK
6edd2cd5
JH
6385 Safefree(buf);
6386#endif
79072805
LW
6387 }
6388
8bfdd7d9 6389 if (rspara) { /* have to do this both before and after */
c07a80fd 6390 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 6391 i = PerlIO_getc(fp);
79072805 6392 if (i != '\n') {
760ac839 6393 PerlIO_ungetc(fp,i);
79072805
LW
6394 break;
6395 }
6396 }
6397 }
c07a80fd 6398
efd8b2ba 6399return_string_or_null:
bd61b366 6400 return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
79072805
LW
6401}
6402
954c1994
GS
6403/*
6404=for apidoc sv_inc
6405
645c22ef
DM
6406Auto-increment of the value in the SV, doing string to numeric conversion
6407if necessary. Handles 'get' magic.
954c1994
GS
6408
6409=cut
6410*/
6411
79072805 6412void
864dbfa3 6413Perl_sv_inc(pTHX_ register SV *sv)
79072805 6414{
97aff369 6415 dVAR;
79072805 6416 register char *d;
463ee0b2 6417 int flags;
79072805
LW
6418
6419 if (!sv)
6420 return;
5b295bef 6421 SvGETMAGIC(sv);
ed6116ce 6422 if (SvTHINKFIRST(sv)) {
765f542d
NC
6423 if (SvIsCOW(sv))
6424 sv_force_normal_flags(sv, 0);
0f15f207 6425 if (SvREADONLY(sv)) {
923e4eb5 6426 if (IN_PERL_RUNTIME)
cea2e8a9 6427 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6428 }
a0d0e21e 6429 if (SvROK(sv)) {
b5be31e9 6430 IV i;
9e7bc3e8
JD
6431 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
6432 return;
56431972 6433 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6434 sv_unref(sv);
6435 sv_setiv(sv, i);
a0d0e21e 6436 }
ed6116ce 6437 }
8990e307 6438 flags = SvFLAGS(sv);
28e5dec8
JH
6439 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
6440 /* It's (privately or publicly) a float, but not tested as an
6441 integer, so test it to see. */
d460ef45 6442 (void) SvIV(sv);
28e5dec8
JH
6443 flags = SvFLAGS(sv);
6444 }
6445 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6446 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6447#ifdef PERL_PRESERVE_IVUV
28e5dec8 6448 oops_its_int:
59d8ce62 6449#endif
25da4f38
IZ
6450 if (SvIsUV(sv)) {
6451 if (SvUVX(sv) == UV_MAX)
a1e868e7 6452 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
6453 else
6454 (void)SvIOK_only_UV(sv);
607fa7f2 6455 SvUV_set(sv, SvUVX(sv) + 1);
25da4f38
IZ
6456 } else {
6457 if (SvIVX(sv) == IV_MAX)
28e5dec8 6458 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
6459 else {
6460 (void)SvIOK_only(sv);
45977657 6461 SvIV_set(sv, SvIVX(sv) + 1);
1c846c1f 6462 }
55497cff 6463 }
79072805
LW
6464 return;
6465 }
28e5dec8
JH
6466 if (flags & SVp_NOK) {
6467 (void)SvNOK_only(sv);
9d6ce603 6468 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6469 return;
6470 }
6471
3f7c398e 6472 if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
28e5dec8 6473 if ((flags & SVTYPEMASK) < SVt_PVIV)
f5282e15 6474 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
28e5dec8 6475 (void)SvIOK_only(sv);
45977657 6476 SvIV_set(sv, 1);
79072805
LW
6477 return;
6478 }
463ee0b2 6479 d = SvPVX(sv);
79072805
LW
6480 while (isALPHA(*d)) d++;
6481 while (isDIGIT(*d)) d++;
6482 if (*d) {
28e5dec8 6483#ifdef PERL_PRESERVE_IVUV
d1be9408 6484 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
6485 warnings. Probably ought to make the sv_iv_please() that does
6486 the conversion if possible, and silently. */
504618e9 6487 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
6488 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6489 /* Need to try really hard to see if it's an integer.
6490 9.22337203685478e+18 is an integer.
6491 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6492 so $a="9.22337203685478e+18"; $a+0; $a++
6493 needs to be the same as $a="9.22337203685478e+18"; $a++
6494 or we go insane. */
d460ef45 6495
28e5dec8
JH
6496 (void) sv_2iv(sv);
6497 if (SvIOK(sv))
6498 goto oops_its_int;
6499
6500 /* sv_2iv *should* have made this an NV */
6501 if (flags & SVp_NOK) {
6502 (void)SvNOK_only(sv);
9d6ce603 6503 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6504 return;
6505 }
6506 /* I don't think we can get here. Maybe I should assert this
6507 And if we do get here I suspect that sv_setnv will croak. NWC
6508 Fall through. */
6509#if defined(USE_LONG_DOUBLE)
6510 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 6511 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 6512#else
1779d84d 6513 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 6514 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
6515#endif
6516 }
6517#endif /* PERL_PRESERVE_IVUV */
3f7c398e 6518 sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
79072805
LW
6519 return;
6520 }
6521 d--;
3f7c398e 6522 while (d >= SvPVX_const(sv)) {
79072805
LW
6523 if (isDIGIT(*d)) {
6524 if (++*d <= '9')
6525 return;
6526 *(d--) = '0';
6527 }
6528 else {
9d116dd7
JH
6529#ifdef EBCDIC
6530 /* MKS: The original code here died if letters weren't consecutive.
6531 * at least it didn't have to worry about non-C locales. The
6532 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 6533 * arranged in order (although not consecutively) and that only
9d116dd7
JH
6534 * [A-Za-z] are accepted by isALPHA in the C locale.
6535 */
6536 if (*d != 'z' && *d != 'Z') {
6537 do { ++*d; } while (!isALPHA(*d));
6538 return;
6539 }
6540 *(d--) -= 'z' - 'a';
6541#else
79072805
LW
6542 ++*d;
6543 if (isALPHA(*d))
6544 return;
6545 *(d--) -= 'z' - 'a' + 1;
9d116dd7 6546#endif
79072805
LW
6547 }
6548 }
6549 /* oh,oh, the number grew */
6550 SvGROW(sv, SvCUR(sv) + 2);
b162af07 6551 SvCUR_set(sv, SvCUR(sv) + 1);
3f7c398e 6552 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
79072805
LW
6553 *d = d[-1];
6554 if (isDIGIT(d[1]))
6555 *d = '1';
6556 else
6557 *d = d[1];
6558}
6559
954c1994
GS
6560/*
6561=for apidoc sv_dec
6562
645c22ef
DM
6563Auto-decrement of the value in the SV, doing string to numeric conversion
6564if necessary. Handles 'get' magic.
954c1994
GS
6565
6566=cut
6567*/
6568
79072805 6569void
864dbfa3 6570Perl_sv_dec(pTHX_ register SV *sv)
79072805 6571{
97aff369 6572 dVAR;
463ee0b2
LW
6573 int flags;
6574
79072805
LW
6575 if (!sv)
6576 return;
5b295bef 6577 SvGETMAGIC(sv);
ed6116ce 6578 if (SvTHINKFIRST(sv)) {
765f542d
NC
6579 if (SvIsCOW(sv))
6580 sv_force_normal_flags(sv, 0);
0f15f207 6581 if (SvREADONLY(sv)) {
923e4eb5 6582 if (IN_PERL_RUNTIME)
cea2e8a9 6583 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6584 }
a0d0e21e 6585 if (SvROK(sv)) {
b5be31e9 6586 IV i;
9e7bc3e8
JD
6587 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6588 return;
56431972 6589 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6590 sv_unref(sv);
6591 sv_setiv(sv, i);
a0d0e21e 6592 }
ed6116ce 6593 }
28e5dec8
JH
6594 /* Unlike sv_inc we don't have to worry about string-never-numbers
6595 and keeping them magic. But we mustn't warn on punting */
8990e307 6596 flags = SvFLAGS(sv);
28e5dec8
JH
6597 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6598 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6599#ifdef PERL_PRESERVE_IVUV
28e5dec8 6600 oops_its_int:
59d8ce62 6601#endif
25da4f38
IZ
6602 if (SvIsUV(sv)) {
6603 if (SvUVX(sv) == 0) {
6604 (void)SvIOK_only(sv);
45977657 6605 SvIV_set(sv, -1);
25da4f38
IZ
6606 }
6607 else {
6608 (void)SvIOK_only_UV(sv);
f4eee32f 6609 SvUV_set(sv, SvUVX(sv) - 1);
1c846c1f 6610 }
25da4f38
IZ
6611 } else {
6612 if (SvIVX(sv) == IV_MIN)
65202027 6613 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
6614 else {
6615 (void)SvIOK_only(sv);
45977657 6616 SvIV_set(sv, SvIVX(sv) - 1);
1c846c1f 6617 }
55497cff 6618 }
6619 return;
6620 }
28e5dec8 6621 if (flags & SVp_NOK) {
9d6ce603 6622 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
6623 (void)SvNOK_only(sv);
6624 return;
6625 }
8990e307 6626 if (!(flags & SVp_POK)) {
ef088171
NC
6627 if ((flags & SVTYPEMASK) < SVt_PVIV)
6628 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
6629 SvIV_set(sv, -1);
6630 (void)SvIOK_only(sv);
79072805
LW
6631 return;
6632 }
28e5dec8
JH
6633#ifdef PERL_PRESERVE_IVUV
6634 {
504618e9 6635 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
6636 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6637 /* Need to try really hard to see if it's an integer.
6638 9.22337203685478e+18 is an integer.
6639 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6640 so $a="9.22337203685478e+18"; $a+0; $a--
6641 needs to be the same as $a="9.22337203685478e+18"; $a--
6642 or we go insane. */
d460ef45 6643
28e5dec8
JH
6644 (void) sv_2iv(sv);
6645 if (SvIOK(sv))
6646 goto oops_its_int;
6647
6648 /* sv_2iv *should* have made this an NV */
6649 if (flags & SVp_NOK) {
6650 (void)SvNOK_only(sv);
9d6ce603 6651 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
6652 return;
6653 }
6654 /* I don't think we can get here. Maybe I should assert this
6655 And if we do get here I suspect that sv_setnv will croak. NWC
6656 Fall through. */
6657#if defined(USE_LONG_DOUBLE)
6658 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 6659 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 6660#else
1779d84d 6661 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 6662 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
6663#endif
6664 }
6665 }
6666#endif /* PERL_PRESERVE_IVUV */
3f7c398e 6667 sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0); /* punt */
79072805
LW
6668}
6669
954c1994
GS
6670/*
6671=for apidoc sv_mortalcopy
6672
645c22ef 6673Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
6674The new SV is marked as mortal. It will be destroyed "soon", either by an
6675explicit call to FREETMPS, or by an implicit call at places such as
6676statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
6677
6678=cut
6679*/
6680
79072805
LW
6681/* Make a string that will exist for the duration of the expression
6682 * evaluation. Actually, it may have to last longer than that, but
6683 * hopefully we won't free it until it has been assigned to a
6684 * permanent location. */
6685
6686SV *
864dbfa3 6687Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 6688{
97aff369 6689 dVAR;
463ee0b2 6690 register SV *sv;
b881518d 6691
4561caa4 6692 new_SV(sv);
79072805 6693 sv_setsv(sv,oldstr);
677b06e3
GS
6694 EXTEND_MORTAL(1);
6695 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
6696 SvTEMP_on(sv);
6697 return sv;
6698}
6699
954c1994
GS
6700/*
6701=for apidoc sv_newmortal
6702
645c22ef 6703Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
6704set to 1. It will be destroyed "soon", either by an explicit call to
6705FREETMPS, or by an implicit call at places such as statement boundaries.
6706See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
6707
6708=cut
6709*/
6710
8990e307 6711SV *
864dbfa3 6712Perl_sv_newmortal(pTHX)
8990e307 6713{
97aff369 6714 dVAR;
8990e307
LW
6715 register SV *sv;
6716
4561caa4 6717 new_SV(sv);
8990e307 6718 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
6719 EXTEND_MORTAL(1);
6720 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
6721 return sv;
6722}
6723
954c1994
GS
6724/*
6725=for apidoc sv_2mortal
6726
d4236ebc
DM
6727Marks an existing SV as mortal. The SV will be destroyed "soon", either
6728by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
6729statement boundaries. SvTEMP() is turned on which means that the SV's
6730string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
6731and C<sv_mortalcopy>.
954c1994
GS
6732
6733=cut
6734*/
6735
79072805 6736SV *
864dbfa3 6737Perl_sv_2mortal(pTHX_ register SV *sv)
79072805 6738{
27da23d5 6739 dVAR;
79072805 6740 if (!sv)
7a5b473e 6741 return NULL;
d689ffdd 6742 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 6743 return sv;
677b06e3
GS
6744 EXTEND_MORTAL(1);
6745 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 6746 SvTEMP_on(sv);
79072805
LW
6747 return sv;
6748}
6749
954c1994
GS
6750/*
6751=for apidoc newSVpv
6752
6753Creates a new SV and copies a string into it. The reference count for the
6754SV is set to 1. If C<len> is zero, Perl will compute the length using
6755strlen(). For efficiency, consider using C<newSVpvn> instead.
6756
6757=cut
6758*/
6759
79072805 6760SV *
864dbfa3 6761Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 6762{
97aff369 6763 dVAR;
463ee0b2 6764 register SV *sv;
79072805 6765
4561caa4 6766 new_SV(sv);
616d8c9c 6767 sv_setpvn(sv,s,len ? len : strlen(s));
79072805
LW
6768 return sv;
6769}
6770
954c1994
GS
6771/*
6772=for apidoc newSVpvn
6773
6774Creates a new SV and copies a string into it. The reference count for the
1c846c1f 6775SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 6776string. You are responsible for ensuring that the source string is at least
9e09f5f2 6777C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
6778
6779=cut
6780*/
6781
9da1e3b5 6782SV *
864dbfa3 6783Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5 6784{
97aff369 6785 dVAR;
9da1e3b5
MUN
6786 register SV *sv;
6787
6788 new_SV(sv);
9da1e3b5
MUN
6789 sv_setpvn(sv,s,len);
6790 return sv;
6791}
6792
bd08039b
NC
6793
6794/*
926f8064 6795=for apidoc newSVhek
bd08039b
NC
6796
6797Creates a new SV from the hash key structure. It will generate scalars that
5aaec2b4
NC
6798point to the shared string table where possible. Returns a new (undefined)
6799SV if the hek is NULL.
bd08039b
NC
6800
6801=cut
6802*/
6803
6804SV *
c1b02ed8 6805Perl_newSVhek(pTHX_ const HEK *hek)
bd08039b 6806{
97aff369 6807 dVAR;
5aaec2b4
NC
6808 if (!hek) {
6809 SV *sv;
6810
6811 new_SV(sv);
6812 return sv;
6813 }
6814
bd08039b
NC
6815 if (HEK_LEN(hek) == HEf_SVKEY) {
6816 return newSVsv(*(SV**)HEK_KEY(hek));
6817 } else {
6818 const int flags = HEK_FLAGS(hek);
6819 if (flags & HVhek_WASUTF8) {
6820 /* Trouble :-)
6821 Andreas would like keys he put in as utf8 to come back as utf8
6822 */
6823 STRLEN utf8_len = HEK_LEN(hek);
b64e5050
AL
6824 const U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
6825 SV * const sv = newSVpvn ((const char*)as_utf8, utf8_len);
bd08039b
NC
6826
6827 SvUTF8_on (sv);
6828 Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
6829 return sv;
6830 } else if (flags & HVhek_REHASH) {
6831 /* We don't have a pointer to the hv, so we have to replicate the
6832 flag into every HEK. This hv is using custom a hasing
6833 algorithm. Hence we can't return a shared string scalar, as
6834 that would contain the (wrong) hash value, and might get passed
6835 into an hv routine with a regular hash */
6836
b64e5050 6837 SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
bd08039b
NC
6838 if (HEK_UTF8(hek))
6839 SvUTF8_on (sv);
6840 return sv;
6841 }
6842 /* This will be overwhelminly the most common case. */
6843 return newSVpvn_share(HEK_KEY(hek),
6844 (HEK_UTF8(hek) ? -HEK_LEN(hek) : HEK_LEN(hek)),
6845 HEK_HASH(hek));
6846 }
6847}
6848
1c846c1f
NIS
6849/*
6850=for apidoc newSVpvn_share
6851
3f7c398e 6852Creates a new SV with its SvPVX_const pointing to a shared string in the string
645c22ef
DM
6853table. If the string does not already exist in the table, it is created
6854first. Turns on READONLY and FAKE. The string's hash is stored in the UV
6855slot of the SV; if the C<hash> parameter is non-zero, that value is used;
6856otherwise the hash is computed. The idea here is that as the string table
3f7c398e 6857is used for shared hash keys these strings will have SvPVX_const == HeKEY and
645c22ef 6858hash lookup will avoid string compare.
1c846c1f
NIS
6859
6860=cut
6861*/
6862
6863SV *
c3654f1a 6864Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f 6865{
97aff369 6866 dVAR;
1c846c1f 6867 register SV *sv;
c3654f1a
IH
6868 bool is_utf8 = FALSE;
6869 if (len < 0) {
77caf834 6870 STRLEN tmplen = -len;
c3654f1a 6871 is_utf8 = TRUE;
75a54232 6872 /* See the note in hv.c:hv_fetch() --jhi */
e1ec3a88 6873 src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
75a54232
JH
6874 len = tmplen;
6875 }
1c846c1f 6876 if (!hash)
5afd6d42 6877 PERL_HASH(hash, src, len);
1c846c1f 6878 new_SV(sv);
bdd68bc3 6879 sv_upgrade(sv, SVt_PV);
f880fe2f 6880 SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
b162af07 6881 SvCUR_set(sv, len);
b162af07 6882 SvLEN_set(sv, 0);
1c846c1f
NIS
6883 SvREADONLY_on(sv);
6884 SvFAKE_on(sv);
6885 SvPOK_on(sv);
c3654f1a
IH
6886 if (is_utf8)
6887 SvUTF8_on(sv);
1c846c1f
NIS
6888 return sv;
6889}
6890
645c22ef 6891
cea2e8a9 6892#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
6893
6894/* pTHX_ magic can't cope with varargs, so this is a no-context
6895 * version of the main function, (which may itself be aliased to us).
6896 * Don't access this version directly.
6897 */
6898
46fc3d4c 6899SV *
cea2e8a9 6900Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 6901{
cea2e8a9 6902 dTHX;
46fc3d4c 6903 register SV *sv;
6904 va_list args;
46fc3d4c 6905 va_start(args, pat);
c5be433b 6906 sv = vnewSVpvf(pat, &args);
46fc3d4c 6907 va_end(args);
6908 return sv;
6909}
cea2e8a9 6910#endif
46fc3d4c 6911
954c1994
GS
6912/*
6913=for apidoc newSVpvf
6914
645c22ef 6915Creates a new SV and initializes it with the string formatted like
954c1994
GS
6916C<sprintf>.
6917
6918=cut
6919*/
6920
cea2e8a9
GS
6921SV *
6922Perl_newSVpvf(pTHX_ const char* pat, ...)
6923{
6924 register SV *sv;
6925 va_list args;
cea2e8a9 6926 va_start(args, pat);
c5be433b 6927 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
6928 va_end(args);
6929 return sv;
6930}
46fc3d4c 6931
645c22ef
DM
6932/* backend for newSVpvf() and newSVpvf_nocontext() */
6933
79072805 6934SV *
c5be433b
GS
6935Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
6936{
97aff369 6937 dVAR;
c5be433b
GS
6938 register SV *sv;
6939 new_SV(sv);
4608196e 6940 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
6941 return sv;
6942}
6943
954c1994
GS
6944/*
6945=for apidoc newSVnv
6946
6947Creates a new SV and copies a floating point value into it.
6948The reference count for the SV is set to 1.
6949
6950=cut
6951*/
6952
c5be433b 6953SV *
65202027 6954Perl_newSVnv(pTHX_ NV n)
79072805 6955{
97aff369 6956 dVAR;
463ee0b2 6957 register SV *sv;
79072805 6958
4561caa4 6959 new_SV(sv);
79072805
LW
6960 sv_setnv(sv,n);
6961 return sv;
6962}
6963
954c1994
GS
6964/*
6965=for apidoc newSViv
6966
6967Creates a new SV and copies an integer into it. The reference count for the
6968SV is set to 1.
6969
6970=cut
6971*/
6972
79072805 6973SV *
864dbfa3 6974Perl_newSViv(pTHX_ IV i)
79072805 6975{
97aff369 6976 dVAR;
463ee0b2 6977 register SV *sv;
79072805 6978
4561caa4 6979 new_SV(sv);
79072805
LW
6980 sv_setiv(sv,i);
6981 return sv;
6982}
6983
954c1994 6984/*
1a3327fb
JH
6985=for apidoc newSVuv
6986
6987Creates a new SV and copies an unsigned integer into it.
6988The reference count for the SV is set to 1.
6989
6990=cut
6991*/
6992
6993SV *
6994Perl_newSVuv(pTHX_ UV u)
6995{
97aff369 6996 dVAR;
1a3327fb
JH
6997 register SV *sv;
6998
6999 new_SV(sv);
7000 sv_setuv(sv,u);
7001 return sv;
7002}
7003
7004/*
954c1994
GS
7005=for apidoc newRV_noinc
7006
7007Creates an RV wrapper for an SV. The reference count for the original
7008SV is B<not> incremented.
7009
7010=cut
7011*/
7012
2304df62 7013SV *
864dbfa3 7014Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62 7015{
97aff369 7016 dVAR;
2304df62
AD
7017 register SV *sv;
7018
4561caa4 7019 new_SV(sv);
2304df62 7020 sv_upgrade(sv, SVt_RV);
76e3520e 7021 SvTEMP_off(tmpRef);
b162af07 7022 SvRV_set(sv, tmpRef);
2304df62 7023 SvROK_on(sv);
2304df62
AD
7024 return sv;
7025}
7026
ff276b08 7027/* newRV_inc is the official function name to use now.
645c22ef
DM
7028 * newRV_inc is in fact #defined to newRV in sv.h
7029 */
7030
5f05dabc 7031SV *
7f466ec7 7032Perl_newRV(pTHX_ SV *sv)
5f05dabc 7033{
97aff369 7034 dVAR;
7f466ec7 7035 return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
5f05dabc 7036}
5f05dabc 7037
954c1994
GS
7038/*
7039=for apidoc newSVsv
7040
7041Creates a new SV which is an exact duplicate of the original SV.
645c22ef 7042(Uses C<sv_setsv>).
954c1994
GS
7043
7044=cut
7045*/
7046
79072805 7047SV *
864dbfa3 7048Perl_newSVsv(pTHX_ register SV *old)
79072805 7049{
97aff369 7050 dVAR;
463ee0b2 7051 register SV *sv;
79072805
LW
7052
7053 if (!old)
7a5b473e 7054 return NULL;
8990e307 7055 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 7056 if (ckWARN_d(WARN_INTERNAL))
9014280d 7057 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
a0714e2c 7058 return NULL;
79072805 7059 }
4561caa4 7060 new_SV(sv);
e90aabeb
NC
7061 /* SV_GMAGIC is the default for sv_setv()
7062 SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
7063 with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
7064 sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
463ee0b2 7065 return sv;
79072805
LW
7066}
7067
645c22ef
DM
7068/*
7069=for apidoc sv_reset
7070
7071Underlying implementation for the C<reset> Perl function.
7072Note that the perl-level function is vaguely deprecated.
7073
7074=cut
7075*/
7076
79072805 7077void
e1ec3a88 7078Perl_sv_reset(pTHX_ register const char *s, HV *stash)
79072805 7079{
27da23d5 7080 dVAR;
4802d5d7 7081 char todo[PERL_UCHAR_MAX+1];
79072805 7082
49d8d3a1
MB
7083 if (!stash)
7084 return;
7085
79072805 7086 if (!*s) { /* reset ?? searches */
aec46f14 7087 MAGIC * const mg = mg_find((SV *)stash, PERL_MAGIC_symtab);
8d2f4536
NC
7088 if (mg) {
7089 PMOP *pm = (PMOP *) mg->mg_obj;
7090 while (pm) {
7091 pm->op_pmdynflags &= ~PMdf_USED;
7092 pm = pm->op_pmnext;
7093 }
79072805
LW
7094 }
7095 return;
7096 }
7097
7098 /* reset variables */
7099
7100 if (!HvARRAY(stash))
7101 return;
463ee0b2
LW
7102
7103 Zero(todo, 256, char);
79072805 7104 while (*s) {
b464bac0
AL
7105 I32 max;
7106 I32 i = (unsigned char)*s;
79072805
LW
7107 if (s[1] == '-') {
7108 s += 2;
7109 }
4802d5d7 7110 max = (unsigned char)*s++;
79072805 7111 for ( ; i <= max; i++) {
463ee0b2
LW
7112 todo[i] = 1;
7113 }
a0d0e21e 7114 for (i = 0; i <= (I32) HvMAX(stash); i++) {
b464bac0 7115 HE *entry;
79072805 7116 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7117 entry;
7118 entry = HeNEXT(entry))
7119 {
b464bac0
AL
7120 register GV *gv;
7121 register SV *sv;
7122
1edc1566 7123 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7124 continue;
1edc1566 7125 gv = (GV*)HeVAL(entry);
79072805 7126 sv = GvSV(gv);
e203899d
NC
7127 if (sv) {
7128 if (SvTHINKFIRST(sv)) {
7129 if (!SvREADONLY(sv) && SvROK(sv))
7130 sv_unref(sv);
7131 /* XXX Is this continue a bug? Why should THINKFIRST
7132 exempt us from resetting arrays and hashes? */
7133 continue;
7134 }
7135 SvOK_off(sv);
7136 if (SvTYPE(sv) >= SVt_PV) {
7137 SvCUR_set(sv, 0);
bd61b366 7138 if (SvPVX_const(sv) != NULL)
e203899d
NC
7139 *SvPVX(sv) = '\0';
7140 SvTAINT(sv);
7141 }
79072805
LW
7142 }
7143 if (GvAV(gv)) {
7144 av_clear(GvAV(gv));
7145 }
bfcb3514 7146 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
b0269e46
AB
7147#if defined(VMS)
7148 Perl_die(aTHX_ "Can't reset %%ENV on this system");
7149#else /* ! VMS */
463ee0b2 7150 hv_clear(GvHV(gv));
b0269e46
AB
7151# if defined(USE_ENVIRON_ARRAY)
7152 if (gv == PL_envgv)
7153 my_clearenv();
7154# endif /* USE_ENVIRON_ARRAY */
7155#endif /* VMS */
79072805
LW
7156 }
7157 }
7158 }
7159 }
7160}
7161
645c22ef
DM
7162/*
7163=for apidoc sv_2io
7164
7165Using various gambits, try to get an IO from an SV: the IO slot if its a
7166GV; or the recursive result if we're an RV; or the IO slot of the symbol
7167named after the PV if we're a string.
7168
7169=cut
7170*/
7171
46fc3d4c 7172IO*
864dbfa3 7173Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 7174{
7175 IO* io;
7176 GV* gv;
7177
7178 switch (SvTYPE(sv)) {
7179 case SVt_PVIO:
7180 io = (IO*)sv;
7181 break;
7182 case SVt_PVGV:
7183 gv = (GV*)sv;
7184 io = GvIO(gv);
7185 if (!io)
cea2e8a9 7186 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 7187 break;
7188 default:
7189 if (!SvOK(sv))
cea2e8a9 7190 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 7191 if (SvROK(sv))
7192 return sv_2io(SvRV(sv));
f776e3cd 7193 gv = gv_fetchsv(sv, 0, SVt_PVIO);
46fc3d4c 7194 if (gv)
7195 io = GvIO(gv);
7196 else
7197 io = 0;
7198 if (!io)
35c1215d 7199 Perl_croak(aTHX_ "Bad filehandle: %"SVf, sv);
46fc3d4c 7200 break;
7201 }
7202 return io;
7203}
7204
645c22ef
DM
7205/*
7206=for apidoc sv_2cv
7207
7208Using various gambits, try to get a CV from an SV; in addition, try if
7209possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
f2c0649b 7210The flags in C<lref> are passed to sv_fetchsv.
645c22ef
DM
7211
7212=cut
7213*/
7214
79072805 7215CV *
864dbfa3 7216Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 7217{
27da23d5 7218 dVAR;
a0714e2c 7219 GV *gv = NULL;
601f1833 7220 CV *cv = NULL;
79072805 7221
85dec29a
NC
7222 if (!sv) {
7223 *st = NULL;
7224 *gvp = NULL;
7225 return NULL;
7226 }
79072805 7227 switch (SvTYPE(sv)) {
79072805
LW
7228 case SVt_PVCV:
7229 *st = CvSTASH(sv);
a0714e2c 7230 *gvp = NULL;
79072805
LW
7231 return (CV*)sv;
7232 case SVt_PVHV:
7233 case SVt_PVAV:
ef58ba18 7234 *st = NULL;
a0714e2c 7235 *gvp = NULL;
601f1833 7236 return NULL;
8990e307
LW
7237 case SVt_PVGV:
7238 gv = (GV*)sv;
a0d0e21e 7239 *gvp = gv;
8990e307
LW
7240 *st = GvESTASH(gv);
7241 goto fix_gv;
7242
79072805 7243 default:
5b295bef 7244 SvGETMAGIC(sv);
a0d0e21e 7245 if (SvROK(sv)) {
823a54a3 7246 SV * const *sp = &sv; /* Used in tryAMAGICunDEREF macro. */
f5284f61
IZ
7247 tryAMAGICunDEREF(to_cv);
7248
62f274bf
GS
7249 sv = SvRV(sv);
7250 if (SvTYPE(sv) == SVt_PVCV) {
7251 cv = (CV*)sv;
a0714e2c 7252 *gvp = NULL;
62f274bf
GS
7253 *st = CvSTASH(cv);
7254 return cv;
7255 }
7256 else if(isGV(sv))
7257 gv = (GV*)sv;
7258 else
cea2e8a9 7259 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 7260 }
62f274bf 7261 else if (isGV(sv))
79072805
LW
7262 gv = (GV*)sv;
7263 else
7a5fd60d 7264 gv = gv_fetchsv(sv, lref, SVt_PVCV);
79072805 7265 *gvp = gv;
ef58ba18
NC
7266 if (!gv) {
7267 *st = NULL;
601f1833 7268 return NULL;
ef58ba18 7269 }
e26df76a
NC
7270 /* Some flags to gv_fetchsv mean don't really create the GV */
7271 if (SvTYPE(gv) != SVt_PVGV) {
7272 *st = NULL;
7273 return NULL;
7274 }
79072805 7275 *st = GvESTASH(gv);
8990e307 7276 fix_gv:
8ebc5c01 7277 if (lref && !GvCVu(gv)) {
4633a7c4 7278 SV *tmpsv;
748a9306 7279 ENTER;
561b68a9 7280 tmpsv = newSV(0);
bd61b366 7281 gv_efullname3(tmpsv, gv, NULL);
f6ec51f7
GS
7282 /* XXX this is probably not what they think they're getting.
7283 * It has the same effect as "sub name;", i.e. just a forward
7284 * declaration! */
774d564b 7285 newSUB(start_subparse(FALSE, 0),
4633a7c4 7286 newSVOP(OP_CONST, 0, tmpsv),
5f66b61c 7287 NULL, NULL);
748a9306 7288 LEAVE;
8ebc5c01 7289 if (!GvCVu(gv))
35c1215d
NC
7290 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
7291 sv);
8990e307 7292 }
8ebc5c01 7293 return GvCVu(gv);
79072805
LW
7294 }
7295}
7296
c461cf8f
JH
7297/*
7298=for apidoc sv_true
7299
7300Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
7301Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
7302instead use an in-line version.
c461cf8f
JH
7303
7304=cut
7305*/
7306
79072805 7307I32
864dbfa3 7308Perl_sv_true(pTHX_ register SV *sv)
79072805 7309{
8990e307
LW
7310 if (!sv)
7311 return 0;
79072805 7312 if (SvPOK(sv)) {
823a54a3
AL
7313 register const XPV* const tXpv = (XPV*)SvANY(sv);
7314 if (tXpv &&
c2f1de04 7315 (tXpv->xpv_cur > 1 ||
339049b0 7316 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
79072805
LW
7317 return 1;
7318 else
7319 return 0;
7320 }
7321 else {
7322 if (SvIOK(sv))
463ee0b2 7323 return SvIVX(sv) != 0;
79072805
LW
7324 else {
7325 if (SvNOK(sv))
463ee0b2 7326 return SvNVX(sv) != 0.0;
79072805 7327 else
463ee0b2 7328 return sv_2bool(sv);
79072805
LW
7329 }
7330 }
7331}
79072805 7332
645c22ef 7333/*
c461cf8f
JH
7334=for apidoc sv_pvn_force
7335
7336Get a sensible string out of the SV somehow.
645c22ef
DM
7337A private implementation of the C<SvPV_force> macro for compilers which
7338can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 7339
8d6d96c1
HS
7340=for apidoc sv_pvn_force_flags
7341
7342Get a sensible string out of the SV somehow.
7343If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
7344appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
7345implemented in terms of this function.
645c22ef
DM
7346You normally want to use the various wrapper macros instead: see
7347C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
7348
7349=cut
7350*/
7351
7352char *
7353Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
7354{
97aff369 7355 dVAR;
6fc92669 7356 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 7357 sv_force_normal_flags(sv, 0);
1c846c1f 7358
a0d0e21e 7359 if (SvPOK(sv)) {
13c5b33c
NC
7360 if (lp)
7361 *lp = SvCUR(sv);
a0d0e21e
LW
7362 }
7363 else {
a3b680e6 7364 char *s;
13c5b33c
NC
7365 STRLEN len;
7366
4d84ee25 7367 if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
b64e5050 7368 const char * const ref = sv_reftype(sv,0);
4d84ee25
NC
7369 if (PL_op)
7370 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
b64e5050 7371 ref, OP_NAME(PL_op));
4d84ee25 7372 else
b64e5050 7373 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
4d84ee25 7374 }
b64e5050 7375 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
cea2e8a9 7376 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 7377 OP_NAME(PL_op));
b64e5050 7378 s = sv_2pv_flags(sv, &len, flags);
13c5b33c
NC
7379 if (lp)
7380 *lp = len;
7381
3f7c398e 7382 if (s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */
a0d0e21e
LW
7383 if (SvROK(sv))
7384 sv_unref(sv);
862a34c6 7385 SvUPGRADE(sv, SVt_PV); /* Never FALSE */
a0d0e21e 7386 SvGROW(sv, len + 1);
706aa1c9 7387 Move(s,SvPVX(sv),len,char);
a0d0e21e
LW
7388 SvCUR_set(sv, len);
7389 *SvEND(sv) = '\0';
7390 }
7391 if (!SvPOK(sv)) {
7392 SvPOK_on(sv); /* validate pointer */
7393 SvTAINT(sv);
1d7c1841 7394 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 7395 PTR2UV(sv),SvPVX_const(sv)));
a0d0e21e
LW
7396 }
7397 }
4d84ee25 7398 return SvPVX_mutable(sv);
a0d0e21e
LW
7399}
7400
645c22ef 7401/*
645c22ef
DM
7402=for apidoc sv_pvbyten_force
7403
0feed65a 7404The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
645c22ef
DM
7405
7406=cut
7407*/
7408
7340a771
GS
7409char *
7410Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
7411{
46ec2f14 7412 sv_pvn_force(sv,lp);
ffebcc3e 7413 sv_utf8_downgrade(sv,0);
46ec2f14
TS
7414 *lp = SvCUR(sv);
7415 return SvPVX(sv);
7340a771
GS
7416}
7417
645c22ef 7418/*
c461cf8f
JH
7419=for apidoc sv_pvutf8n_force
7420
0feed65a 7421The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
c461cf8f
JH
7422
7423=cut
7424*/
7425
7340a771
GS
7426char *
7427Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
7428{
46ec2f14 7429 sv_pvn_force(sv,lp);
560a288e 7430 sv_utf8_upgrade(sv);
46ec2f14
TS
7431 *lp = SvCUR(sv);
7432 return SvPVX(sv);
7340a771
GS
7433}
7434
c461cf8f
JH
7435/*
7436=for apidoc sv_reftype
7437
7438Returns a string describing what the SV is a reference to.
7439
7440=cut
7441*/
7442
1cb0ed9b 7443char *
bfed75c6 7444Perl_sv_reftype(pTHX_ const SV *sv, int ob)
a0d0e21e 7445{
07409e01
NC
7446 /* The fact that I don't need to downcast to char * everywhere, only in ?:
7447 inside return suggests a const propagation bug in g++. */
c86bf373 7448 if (ob && SvOBJECT(sv)) {
1b6737cc 7449 char * const name = HvNAME_get(SvSTASH(sv));
07409e01 7450 return name ? name : (char *) "__ANON__";
c86bf373 7451 }
a0d0e21e
LW
7452 else {
7453 switch (SvTYPE(sv)) {
7454 case SVt_NULL:
7455 case SVt_IV:
7456 case SVt_NV:
7457 case SVt_RV:
7458 case SVt_PV:
7459 case SVt_PVIV:
7460 case SVt_PVNV:
7461 case SVt_PVMG:
7462 case SVt_PVBM:
1cb0ed9b 7463 if (SvVOK(sv))
439cb1c4 7464 return "VSTRING";
a0d0e21e
LW
7465 if (SvROK(sv))
7466 return "REF";
7467 else
7468 return "SCALAR";
1cb0ed9b 7469
07409e01 7470 case SVt_PVLV: return (char *) (SvROK(sv) ? "REF"
be65207d
DM
7471 /* tied lvalues should appear to be
7472 * scalars for backwards compatitbility */
7473 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
07409e01 7474 ? "SCALAR" : "LVALUE");
a0d0e21e
LW
7475 case SVt_PVAV: return "ARRAY";
7476 case SVt_PVHV: return "HASH";
7477 case SVt_PVCV: return "CODE";
7478 case SVt_PVGV: return "GLOB";
1d2dff63 7479 case SVt_PVFM: return "FORMAT";
27f9d8f3 7480 case SVt_PVIO: return "IO";
a0d0e21e
LW
7481 default: return "UNKNOWN";
7482 }
7483 }
7484}
7485
954c1994
GS
7486/*
7487=for apidoc sv_isobject
7488
7489Returns a boolean indicating whether the SV is an RV pointing to a blessed
7490object. If the SV is not an RV, or if the object is not blessed, then this
7491will return false.
7492
7493=cut
7494*/
7495
463ee0b2 7496int
864dbfa3 7497Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 7498{
68dc0745 7499 if (!sv)
7500 return 0;
5b295bef 7501 SvGETMAGIC(sv);
85e6fe83
LW
7502 if (!SvROK(sv))
7503 return 0;
7504 sv = (SV*)SvRV(sv);
7505 if (!SvOBJECT(sv))
7506 return 0;
7507 return 1;
7508}
7509
954c1994
GS
7510/*
7511=for apidoc sv_isa
7512
7513Returns a boolean indicating whether the SV is blessed into the specified
7514class. This does not check for subtypes; use C<sv_derived_from> to verify
7515an inheritance relationship.
7516
7517=cut
7518*/
7519
85e6fe83 7520int
864dbfa3 7521Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 7522{
bfcb3514 7523 const char *hvname;
68dc0745 7524 if (!sv)
7525 return 0;
5b295bef 7526 SvGETMAGIC(sv);
ed6116ce 7527 if (!SvROK(sv))
463ee0b2 7528 return 0;
ed6116ce
LW
7529 sv = (SV*)SvRV(sv);
7530 if (!SvOBJECT(sv))
463ee0b2 7531 return 0;
bfcb3514
NC
7532 hvname = HvNAME_get(SvSTASH(sv));
7533 if (!hvname)
e27ad1f2 7534 return 0;
463ee0b2 7535
bfcb3514 7536 return strEQ(hvname, name);
463ee0b2
LW
7537}
7538
954c1994
GS
7539/*
7540=for apidoc newSVrv
7541
7542Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
7543it will be upgraded to one. If C<classname> is non-null then the new SV will
7544be blessed in the specified package. The new SV is returned and its
7545reference count is 1.
7546
7547=cut
7548*/
7549
463ee0b2 7550SV*
864dbfa3 7551Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 7552{
97aff369 7553 dVAR;
463ee0b2
LW
7554 SV *sv;
7555
4561caa4 7556 new_SV(sv);
51cf62d8 7557
765f542d 7558 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 7559 SvAMAGIC_off(rv);
51cf62d8 7560
0199fce9 7561 if (SvTYPE(rv) >= SVt_PVMG) {
a3b680e6 7562 const U32 refcnt = SvREFCNT(rv);
0199fce9
JD
7563 SvREFCNT(rv) = 0;
7564 sv_clear(rv);
7565 SvFLAGS(rv) = 0;
7566 SvREFCNT(rv) = refcnt;
7567 }
7568
51cf62d8 7569 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
7570 sv_upgrade(rv, SVt_RV);
7571 else if (SvTYPE(rv) > SVt_RV) {
8bd4d4c5 7572 SvPV_free(rv);
0199fce9
JD
7573 SvCUR_set(rv, 0);
7574 SvLEN_set(rv, 0);
7575 }
51cf62d8 7576
0c34ef67 7577 SvOK_off(rv);
b162af07 7578 SvRV_set(rv, sv);
ed6116ce 7579 SvROK_on(rv);
463ee0b2 7580
a0d0e21e 7581 if (classname) {
1b6737cc 7582 HV* const stash = gv_stashpv(classname, TRUE);
a0d0e21e
LW
7583 (void)sv_bless(rv, stash);
7584 }
7585 return sv;
7586}
7587
954c1994
GS
7588/*
7589=for apidoc sv_setref_pv
7590
7591Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
7592argument will be upgraded to an RV. That RV will be modified to point to
7593the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7594into the SV. The C<classname> argument indicates the package for the
bd61b366 7595blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7596will have a reference count of 1, and the RV will be returned.
954c1994
GS
7597
7598Do not use with other Perl types such as HV, AV, SV, CV, because those
7599objects will become corrupted by the pointer copy process.
7600
7601Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7602
7603=cut
7604*/
7605
a0d0e21e 7606SV*
864dbfa3 7607Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 7608{
97aff369 7609 dVAR;
189b2af5 7610 if (!pv) {
3280af22 7611 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
7612 SvSETMAGIC(rv);
7613 }
a0d0e21e 7614 else
56431972 7615 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
7616 return rv;
7617}
7618
954c1994
GS
7619/*
7620=for apidoc sv_setref_iv
7621
7622Copies an integer into a new SV, optionally blessing the SV. The C<rv>
7623argument will be upgraded to an RV. That RV will be modified to point to
7624the new SV. The C<classname> argument indicates the package for the
bd61b366 7625blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7626will have a reference count of 1, and the RV will be returned.
954c1994
GS
7627
7628=cut
7629*/
7630
a0d0e21e 7631SV*
864dbfa3 7632Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
7633{
7634 sv_setiv(newSVrv(rv,classname), iv);
7635 return rv;
7636}
7637
954c1994 7638/*
e1c57cef
JH
7639=for apidoc sv_setref_uv
7640
7641Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
7642argument will be upgraded to an RV. That RV will be modified to point to
7643the new SV. The C<classname> argument indicates the package for the
bd61b366 7644blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7645will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
7646
7647=cut
7648*/
7649
7650SV*
7651Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
7652{
7653 sv_setuv(newSVrv(rv,classname), uv);
7654 return rv;
7655}
7656
7657/*
954c1994
GS
7658=for apidoc sv_setref_nv
7659
7660Copies a double into a new SV, optionally blessing the SV. The C<rv>
7661argument will be upgraded to an RV. That RV will be modified to point to
7662the new SV. The C<classname> argument indicates the package for the
bd61b366 7663blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7664will have a reference count of 1, and the RV will be returned.
954c1994
GS
7665
7666=cut
7667*/
7668
a0d0e21e 7669SV*
65202027 7670Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
7671{
7672 sv_setnv(newSVrv(rv,classname), nv);
7673 return rv;
7674}
463ee0b2 7675
954c1994
GS
7676/*
7677=for apidoc sv_setref_pvn
7678
7679Copies a string into a new SV, optionally blessing the SV. The length of the
7680string must be specified with C<n>. The C<rv> argument will be upgraded to
7681an RV. That RV will be modified to point to the new SV. The C<classname>
7682argument indicates the package for the blessing. Set C<classname> to
bd61b366 7683C<NULL> to avoid the blessing. The new SV will have a reference count
d34c2299 7684of 1, and the RV will be returned.
954c1994
GS
7685
7686Note that C<sv_setref_pv> copies the pointer while this copies the string.
7687
7688=cut
7689*/
7690
a0d0e21e 7691SV*
1b6737cc 7692Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, const char *pv, STRLEN n)
a0d0e21e
LW
7693{
7694 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
7695 return rv;
7696}
7697
954c1994
GS
7698/*
7699=for apidoc sv_bless
7700
7701Blesses an SV into a specified package. The SV must be an RV. The package
7702must be designated by its stash (see C<gv_stashpv()>). The reference count
7703of the SV is unaffected.
7704
7705=cut
7706*/
7707
a0d0e21e 7708SV*
864dbfa3 7709Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 7710{
97aff369 7711 dVAR;
76e3520e 7712 SV *tmpRef;
a0d0e21e 7713 if (!SvROK(sv))
cea2e8a9 7714 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
7715 tmpRef = SvRV(sv);
7716 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
7717 if (SvREADONLY(tmpRef))
cea2e8a9 7718 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
7719 if (SvOBJECT(tmpRef)) {
7720 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7721 --PL_sv_objcount;
76e3520e 7722 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 7723 }
a0d0e21e 7724 }
76e3520e
GS
7725 SvOBJECT_on(tmpRef);
7726 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7727 ++PL_sv_objcount;
862a34c6 7728 SvUPGRADE(tmpRef, SVt_PVMG);
b37c2d43 7729 SvSTASH_set(tmpRef, (HV*)SvREFCNT_inc_simple(stash));
a0d0e21e 7730
2e3febc6
CS
7731 if (Gv_AMG(stash))
7732 SvAMAGIC_on(sv);
7733 else
7734 SvAMAGIC_off(sv);
a0d0e21e 7735
1edbfb88
AB
7736 if(SvSMAGICAL(tmpRef))
7737 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
7738 mg_set(tmpRef);
7739
7740
ecdeb87c 7741
a0d0e21e
LW
7742 return sv;
7743}
7744
645c22ef 7745/* Downgrades a PVGV to a PVMG.
645c22ef
DM
7746 */
7747
76e3520e 7748STATIC void
cea2e8a9 7749S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 7750{
97aff369 7751 dVAR;
850fabdf 7752 void *xpvmg;
b37c2d43 7753 SV * const temp = sv_newmortal();
850fabdf 7754
a0d0e21e
LW
7755 assert(SvTYPE(sv) == SVt_PVGV);
7756 SvFAKE_off(sv);
180488f8
NC
7757 gv_efullname3(temp, (GV *) sv, "*");
7758
f7877b28 7759 if (GvGP(sv)) {
1edc1566 7760 gp_free((GV*)sv);
f7877b28 7761 }
e826b3c7 7762 if (GvSTASH(sv)) {
e15faf7d 7763 sv_del_backref((SV*)GvSTASH(sv), sv);
5c284bb0 7764 GvSTASH(sv) = NULL;
e826b3c7 7765 }
a5f75d66 7766 GvMULTI_off(sv);
acda4c6a
NC
7767 if (GvNAME_HEK(sv)) {
7768 unshare_hek(GvNAME_HEK(sv));
7769 }
dedf8e73 7770 SvSCREAM_off(sv);
850fabdf
GS
7771
7772 /* need to keep SvANY(sv) in the right arena */
7773 xpvmg = new_XPVMG();
7774 StructCopy(SvANY(sv), xpvmg, XPVMG);
7775 del_XPVGV(SvANY(sv));
7776 SvANY(sv) = xpvmg;
7777
a0d0e21e
LW
7778 SvFLAGS(sv) &= ~SVTYPEMASK;
7779 SvFLAGS(sv) |= SVt_PVMG;
180488f8
NC
7780
7781 /* Intentionally not calling any local SET magic, as this isn't so much a
7782 set operation as merely an internal storage change. */
7783 sv_setsv_flags(sv, temp, 0);
a0d0e21e
LW
7784}
7785
954c1994 7786/*
840a7b70 7787=for apidoc sv_unref_flags
954c1994
GS
7788
7789Unsets the RV status of the SV, and decrements the reference count of
7790whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
7791as a reversal of C<newSVrv>. The C<cflags> argument can contain
7792C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
7793(otherwise the decrementing is conditional on the reference count being
7794different from one or the reference being a readonly SV).
7889fe52 7795See C<SvROK_off>.
954c1994
GS
7796
7797=cut
7798*/
7799
ed6116ce 7800void
e15faf7d 7801Perl_sv_unref_flags(pTHX_ SV *ref, U32 flags)
ed6116ce 7802{
b64e5050 7803 SV* const target = SvRV(ref);
810b8aa5 7804
e15faf7d
NC
7805 if (SvWEAKREF(ref)) {
7806 sv_del_backref(target, ref);
7807 SvWEAKREF_off(ref);
7808 SvRV_set(ref, NULL);
810b8aa5
GS
7809 return;
7810 }
e15faf7d
NC
7811 SvRV_set(ref, NULL);
7812 SvROK_off(ref);
7813 /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
04ca4930 7814 assigned to as BEGIN {$a = \"Foo"} will fail. */
e15faf7d
NC
7815 if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
7816 SvREFCNT_dec(target);
840a7b70 7817 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
e15faf7d 7818 sv_2mortal(target); /* Schedule for freeing later */
ed6116ce 7819}
8990e307 7820
840a7b70 7821/*
645c22ef
DM
7822=for apidoc sv_untaint
7823
7824Untaint an SV. Use C<SvTAINTED_off> instead.
7825=cut
7826*/
7827
bbce6d69 7828void
864dbfa3 7829Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 7830{
13f57bf8 7831 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
b64e5050 7832 MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 7833 if (mg)
565764a8 7834 mg->mg_len &= ~1;
36477c24 7835 }
bbce6d69 7836}
7837
645c22ef
DM
7838/*
7839=for apidoc sv_tainted
7840
7841Test an SV for taintedness. Use C<SvTAINTED> instead.
7842=cut
7843*/
7844
bbce6d69 7845bool
864dbfa3 7846Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 7847{
13f57bf8 7848 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
823a54a3 7849 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
2ddb8a4f 7850 if (mg && (mg->mg_len & 1) )
36477c24 7851 return TRUE;
7852 }
7853 return FALSE;
bbce6d69 7854}
7855
09540bc3
JH
7856/*
7857=for apidoc sv_setpviv
7858
7859Copies an integer into the given SV, also updating its string value.
7860Does not handle 'set' magic. See C<sv_setpviv_mg>.
7861
7862=cut
7863*/
7864
7865void
7866Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
7867{
7868 char buf[TYPE_CHARS(UV)];
7869 char *ebuf;
b64e5050 7870 char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
09540bc3
JH
7871
7872 sv_setpvn(sv, ptr, ebuf - ptr);
7873}
7874
7875/*
7876=for apidoc sv_setpviv_mg
7877
7878Like C<sv_setpviv>, but also handles 'set' magic.
7879
7880=cut
7881*/
7882
7883void
7884Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
7885{
df7eb254 7886 sv_setpviv(sv, iv);
09540bc3
JH
7887 SvSETMAGIC(sv);
7888}
7889
cea2e8a9 7890#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7891
7892/* pTHX_ magic can't cope with varargs, so this is a no-context
7893 * version of the main function, (which may itself be aliased to us).
7894 * Don't access this version directly.
7895 */
7896
cea2e8a9
GS
7897void
7898Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
7899{
7900 dTHX;
7901 va_list args;
7902 va_start(args, pat);
c5be433b 7903 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
7904 va_end(args);
7905}
7906
645c22ef
DM
7907/* pTHX_ magic can't cope with varargs, so this is a no-context
7908 * version of the main function, (which may itself be aliased to us).
7909 * Don't access this version directly.
7910 */
cea2e8a9
GS
7911
7912void
7913Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
7914{
7915 dTHX;
7916 va_list args;
7917 va_start(args, pat);
c5be433b 7918 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 7919 va_end(args);
cea2e8a9
GS
7920}
7921#endif
7922
954c1994
GS
7923/*
7924=for apidoc sv_setpvf
7925
bffc3d17
SH
7926Works like C<sv_catpvf> but copies the text into the SV instead of
7927appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
7928
7929=cut
7930*/
7931
46fc3d4c 7932void
864dbfa3 7933Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 7934{
7935 va_list args;
46fc3d4c 7936 va_start(args, pat);
c5be433b 7937 sv_vsetpvf(sv, pat, &args);
46fc3d4c 7938 va_end(args);
7939}
7940
bffc3d17
SH
7941/*
7942=for apidoc sv_vsetpvf
7943
7944Works like C<sv_vcatpvf> but copies the text into the SV instead of
7945appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
7946
7947Usually used via its frontend C<sv_setpvf>.
7948
7949=cut
7950*/
645c22ef 7951
c5be433b
GS
7952void
7953Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7954{
4608196e 7955 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b 7956}
ef50df4b 7957
954c1994
GS
7958/*
7959=for apidoc sv_setpvf_mg
7960
7961Like C<sv_setpvf>, but also handles 'set' magic.
7962
7963=cut
7964*/
7965
ef50df4b 7966void
864dbfa3 7967Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
7968{
7969 va_list args;
ef50df4b 7970 va_start(args, pat);
c5be433b 7971 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 7972 va_end(args);
c5be433b
GS
7973}
7974
bffc3d17
SH
7975/*
7976=for apidoc sv_vsetpvf_mg
7977
7978Like C<sv_vsetpvf>, but also handles 'set' magic.
7979
7980Usually used via its frontend C<sv_setpvf_mg>.
7981
7982=cut
7983*/
645c22ef 7984
c5be433b
GS
7985void
7986Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7987{
4608196e 7988 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
7989 SvSETMAGIC(sv);
7990}
7991
cea2e8a9 7992#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7993
7994/* pTHX_ magic can't cope with varargs, so this is a no-context
7995 * version of the main function, (which may itself be aliased to us).
7996 * Don't access this version directly.
7997 */
7998
cea2e8a9
GS
7999void
8000Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
8001{
8002 dTHX;
8003 va_list args;
8004 va_start(args, pat);
c5be433b 8005 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
8006 va_end(args);
8007}
8008
645c22ef
DM
8009/* pTHX_ magic can't cope with varargs, so this is a no-context
8010 * version of the main function, (which may itself be aliased to us).
8011 * Don't access this version directly.
8012 */
8013
cea2e8a9
GS
8014void
8015Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
8016{
8017 dTHX;
8018 va_list args;
8019 va_start(args, pat);
c5be433b 8020 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 8021 va_end(args);
cea2e8a9
GS
8022}
8023#endif
8024
954c1994
GS
8025/*
8026=for apidoc sv_catpvf
8027
d5ce4a7c
GA
8028Processes its arguments like C<sprintf> and appends the formatted
8029output to an SV. If the appended data contains "wide" characters
8030(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
8031and characters >255 formatted with %c), the original SV might get
bffc3d17 8032upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
8033C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
8034valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 8035
d5ce4a7c 8036=cut */
954c1994 8037
46fc3d4c 8038void
864dbfa3 8039Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8040{
8041 va_list args;
46fc3d4c 8042 va_start(args, pat);
c5be433b 8043 sv_vcatpvf(sv, pat, &args);
46fc3d4c 8044 va_end(args);
8045}
8046
bffc3d17
SH
8047/*
8048=for apidoc sv_vcatpvf
8049
8050Processes its arguments like C<vsprintf> and appends the formatted output
8051to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
8052
8053Usually used via its frontend C<sv_catpvf>.
8054
8055=cut
8056*/
645c22ef 8057
ef50df4b 8058void
c5be433b
GS
8059Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8060{
4608196e 8061 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
8062}
8063
954c1994
GS
8064/*
8065=for apidoc sv_catpvf_mg
8066
8067Like C<sv_catpvf>, but also handles 'set' magic.
8068
8069=cut
8070*/
8071
c5be433b 8072void
864dbfa3 8073Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8074{
8075 va_list args;
ef50df4b 8076 va_start(args, pat);
c5be433b 8077 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 8078 va_end(args);
c5be433b
GS
8079}
8080
bffc3d17
SH
8081/*
8082=for apidoc sv_vcatpvf_mg
8083
8084Like C<sv_vcatpvf>, but also handles 'set' magic.
8085
8086Usually used via its frontend C<sv_catpvf_mg>.
8087
8088=cut
8089*/
645c22ef 8090
c5be433b
GS
8091void
8092Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8093{
4608196e 8094 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
8095 SvSETMAGIC(sv);
8096}
8097
954c1994
GS
8098/*
8099=for apidoc sv_vsetpvfn
8100
bffc3d17 8101Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
8102appending it.
8103
bffc3d17 8104Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 8105
954c1994
GS
8106=cut
8107*/
8108
46fc3d4c 8109void
7d5ea4e7 8110Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8111{
8112 sv_setpvn(sv, "", 0);
7d5ea4e7 8113 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 8114}
8115
2d00ba3b 8116STATIC I32
9dd79c3f 8117S_expect_number(pTHX_ char** pattern)
211dfcf1 8118{
97aff369 8119 dVAR;
211dfcf1
HS
8120 I32 var = 0;
8121 switch (**pattern) {
8122 case '1': case '2': case '3':
8123 case '4': case '5': case '6':
8124 case '7': case '8': case '9':
2fba7546
GA
8125 var = *(*pattern)++ - '0';
8126 while (isDIGIT(**pattern)) {
5f66b61c 8127 const I32 tmp = var * 10 + (*(*pattern)++ - '0');
2fba7546
GA
8128 if (tmp < var)
8129 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_NAME(PL_op) : "sv_vcatpvfn"));
8130 var = tmp;
8131 }
211dfcf1
HS
8132 }
8133 return var;
8134}
211dfcf1 8135
c445ea15
AL
8136STATIC char *
8137S_F0convert(NV nv, char *endbuf, STRLEN *len)
4151a5fe 8138{
a3b680e6 8139 const int neg = nv < 0;
4151a5fe 8140 UV uv;
4151a5fe
IZ
8141
8142 if (neg)
8143 nv = -nv;
8144 if (nv < UV_MAX) {
b464bac0 8145 char *p = endbuf;
4151a5fe 8146 nv += 0.5;
028f8eaa 8147 uv = (UV)nv;
4151a5fe
IZ
8148 if (uv & 1 && uv == nv)
8149 uv--; /* Round to even */
8150 do {
a3b680e6 8151 const unsigned dig = uv % 10;
4151a5fe
IZ
8152 *--p = '0' + dig;
8153 } while (uv /= 10);
8154 if (neg)
8155 *--p = '-';
8156 *len = endbuf - p;
8157 return p;
8158 }
bd61b366 8159 return NULL;
4151a5fe
IZ
8160}
8161
8162
954c1994
GS
8163/*
8164=for apidoc sv_vcatpvfn
8165
8166Processes its arguments like C<vsprintf> and appends the formatted output
8167to an SV. Uses an array of SVs if the C style variable argument list is
8168missing (NULL). When running with taint checks enabled, indicates via
8169C<maybe_tainted> if results are untrustworthy (often due to the use of
8170locales).
8171
bffc3d17 8172Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 8173
954c1994
GS
8174=cut
8175*/
8176
8896765a
RB
8177
8178#define VECTORIZE_ARGS vecsv = va_arg(*args, SV*);\
8179 vecstr = (U8*)SvPV_const(vecsv,veclen);\
8180 vec_utf8 = DO_UTF8(vecsv);
8181
1ef29b0e
RGS
8182/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
8183
46fc3d4c 8184void
7d5ea4e7 8185Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8186{
97aff369 8187 dVAR;
46fc3d4c 8188 char *p;
8189 char *q;
a3b680e6 8190 const char *patend;
fc36a67e 8191 STRLEN origlen;
46fc3d4c 8192 I32 svix = 0;
27da23d5 8193 static const char nullstr[] = "(null)";
a0714e2c 8194 SV *argsv = NULL;
b464bac0
AL
8195 bool has_utf8 = DO_UTF8(sv); /* has the result utf8? */
8196 const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
a0714e2c 8197 SV *nsv = NULL;
4151a5fe
IZ
8198 /* Times 4: a decimal digit takes more than 3 binary digits.
8199 * NV_DIG: mantissa takes than many decimal digits.
8200 * Plus 32: Playing safe. */
8201 char ebuf[IV_DIG * 4 + NV_DIG + 32];
8202 /* large enough for "%#.#f" --chip */
8203 /* what about long double NVs? --jhi */
db79b45b 8204
53c1dcc0
AL
8205 PERL_UNUSED_ARG(maybe_tainted);
8206
46fc3d4c 8207 /* no matter what, this is a string now */
fc36a67e 8208 (void)SvPV_force(sv, origlen);
46fc3d4c 8209
8896765a 8210 /* special-case "", "%s", and "%-p" (SVf - see below) */
46fc3d4c 8211 if (patlen == 0)
8212 return;
0dbb1585 8213 if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
2d03de9c
AL
8214 if (args) {
8215 const char * const s = va_arg(*args, char*);
8216 sv_catpv(sv, s ? s : nullstr);
8217 }
8218 else if (svix < svmax) {
8219 sv_catsv(sv, *svargs);
2d03de9c
AL
8220 }
8221 return;
0dbb1585 8222 }
8896765a
RB
8223 if (args && patlen == 3 && pat[0] == '%' &&
8224 pat[1] == '-' && pat[2] == 'p') {
8225 argsv = va_arg(*args, SV*);
8226 sv_catsv(sv, argsv);
8896765a 8227 return;
46fc3d4c 8228 }
8229
1d917b39 8230#ifndef USE_LONG_DOUBLE
4151a5fe 8231 /* special-case "%.<number>[gf]" */
7af36d83 8232 if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
4151a5fe
IZ
8233 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
8234 unsigned digits = 0;
8235 const char *pp;
8236
8237 pp = pat + 2;
8238 while (*pp >= '0' && *pp <= '9')
8239 digits = 10 * digits + (*pp++ - '0');
028f8eaa 8240 if (pp - pat == (int)patlen - 1) {
4151a5fe
IZ
8241 NV nv;
8242
7af36d83 8243 if (svix < svmax)
4151a5fe
IZ
8244 nv = SvNV(*svargs);
8245 else
8246 return;
8247 if (*pp == 'g') {
2873255c
NC
8248 /* Add check for digits != 0 because it seems that some
8249 gconverts are buggy in this case, and we don't yet have
8250 a Configure test for this. */
8251 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
8252 /* 0, point, slack */
2e59c212 8253 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
8254 sv_catpv(sv, ebuf);
8255 if (*ebuf) /* May return an empty string for digits==0 */
8256 return;
8257 }
8258 } else if (!digits) {
8259 STRLEN l;
8260
8261 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
8262 sv_catpvn(sv, p, l);
8263 return;
8264 }
8265 }
8266 }
8267 }
1d917b39 8268#endif /* !USE_LONG_DOUBLE */
4151a5fe 8269
2cf2cfc6 8270 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 8271 has_utf8 = TRUE;
2cf2cfc6 8272
46fc3d4c 8273 patend = (char*)pat + patlen;
8274 for (p = (char*)pat; p < patend; p = q) {
8275 bool alt = FALSE;
8276 bool left = FALSE;
b22c7a20 8277 bool vectorize = FALSE;
211dfcf1 8278 bool vectorarg = FALSE;
2cf2cfc6 8279 bool vec_utf8 = FALSE;
46fc3d4c 8280 char fill = ' ';
8281 char plus = 0;
8282 char intsize = 0;
8283 STRLEN width = 0;
fc36a67e 8284 STRLEN zeros = 0;
46fc3d4c 8285 bool has_precis = FALSE;
8286 STRLEN precis = 0;
c445ea15 8287 const I32 osvix = svix;
2cf2cfc6 8288 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
8289#ifdef HAS_LDBL_SPRINTF_BUG
8290 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 8291 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
8292 bool fix_ldbl_sprintf_bug = FALSE;
8293#endif
205f51d8 8294
46fc3d4c 8295 char esignbuf[4];
89ebb4a3 8296 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 8297 STRLEN esignlen = 0;
8298
bd61b366 8299 const char *eptr = NULL;
fc36a67e 8300 STRLEN elen = 0;
a0714e2c 8301 SV *vecsv = NULL;
4608196e 8302 const U8 *vecstr = NULL;
b22c7a20 8303 STRLEN veclen = 0;
934abaf1 8304 char c = 0;
46fc3d4c 8305 int i;
9c5ffd7c 8306 unsigned base = 0;
8c8eb53c
RB
8307 IV iv = 0;
8308 UV uv = 0;
9e5b023a
JH
8309 /* we need a long double target in case HAS_LONG_DOUBLE but
8310 not USE_LONG_DOUBLE
8311 */
35fff930 8312#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
8313 long double nv;
8314#else
65202027 8315 NV nv;
9e5b023a 8316#endif
46fc3d4c 8317 STRLEN have;
8318 STRLEN need;
8319 STRLEN gap;
7af36d83 8320 const char *dotstr = ".";
b22c7a20 8321 STRLEN dotstrlen = 1;
211dfcf1 8322 I32 efix = 0; /* explicit format parameter index */
eb3fce90 8323 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
8324 I32 epix = 0; /* explicit precision index */
8325 I32 evix = 0; /* explicit vector index */
eb3fce90 8326 bool asterisk = FALSE;
46fc3d4c 8327
211dfcf1 8328 /* echo everything up to the next format specification */
46fc3d4c 8329 for (q = p; q < patend && *q != '%'; ++q) ;
8330 if (q > p) {
db79b45b
JH
8331 if (has_utf8 && !pat_utf8)
8332 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
8333 else
8334 sv_catpvn(sv, p, q - p);
46fc3d4c 8335 p = q;
8336 }
8337 if (q++ >= patend)
8338 break;
8339
211dfcf1
HS
8340/*
8341 We allow format specification elements in this order:
8342 \d+\$ explicit format parameter index
8343 [-+ 0#]+ flags
a472f209 8344 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 8345 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
8346 \d+|\*(\d+\$)? width using optional (optionally specified) arg
8347 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
8348 [hlqLV] size
8896765a
RB
8349 [%bcdefginopsuxDFOUX] format (mandatory)
8350*/
8351
8352 if (args) {
8353/*
8354 As of perl5.9.3, printf format checking is on by default.
8355 Internally, perl uses %p formats to provide an escape to
8356 some extended formatting. This block deals with those
8357 extensions: if it does not match, (char*)q is reset and
8358 the normal format processing code is used.
8359
8360 Currently defined extensions are:
8361 %p include pointer address (standard)
8362 %-p (SVf) include an SV (previously %_)
8363 %-<num>p include an SV with precision <num>
8364 %1p (VDf) include a v-string (as %vd)
8365 %<num>p reserved for future extensions
8366
8367 Robin Barker 2005-07-14
211dfcf1 8368*/
8896765a
RB
8369 char* r = q;
8370 bool sv = FALSE;
8371 STRLEN n = 0;
8372 if (*q == '-')
8373 sv = *q++;
c445ea15 8374 n = expect_number(&q);
8896765a
RB
8375 if (*q++ == 'p') {
8376 if (sv) { /* SVf */
8377 if (n) {
8378 precis = n;
8379 has_precis = TRUE;
8380 }
8381 argsv = va_arg(*args, SV*);
8382 eptr = SvPVx_const(argsv, elen);
8383 if (DO_UTF8(argsv))
8384 is_utf8 = TRUE;
8385 goto string;
8386 }
8387#if vdNUMBER
8388 else if (n == vdNUMBER) { /* VDf */
8389 vectorize = TRUE;
8390 VECTORIZE_ARGS
8391 goto format_vd;
8392 }
8393#endif
8394 else if (n) {
8395 if (ckWARN_d(WARN_INTERNAL))
8396 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
8397 "internal %%<num>p might conflict with future printf extensions");
8398 }
8399 }
8400 q = r;
8401 }
8402
c445ea15 8403 if ( (width = expect_number(&q)) ) {
211dfcf1
HS
8404 if (*q == '$') {
8405 ++q;
8406 efix = width;
8407 } else {
8408 goto gotwidth;
8409 }
8410 }
8411
fc36a67e 8412 /* FLAGS */
8413
46fc3d4c 8414 while (*q) {
8415 switch (*q) {
8416 case ' ':
8417 case '+':
8418 plus = *q++;
8419 continue;
8420
8421 case '-':
8422 left = TRUE;
8423 q++;
8424 continue;
8425
8426 case '0':
8427 fill = *q++;
8428 continue;
8429
8430 case '#':
8431 alt = TRUE;
8432 q++;
8433 continue;
8434
fc36a67e 8435 default:
8436 break;
8437 }
8438 break;
8439 }
46fc3d4c 8440
211dfcf1 8441 tryasterisk:
eb3fce90 8442 if (*q == '*') {
211dfcf1 8443 q++;
c445ea15 8444 if ( (ewix = expect_number(&q)) )
211dfcf1
HS
8445 if (*q++ != '$')
8446 goto unknown;
eb3fce90 8447 asterisk = TRUE;
211dfcf1
HS
8448 }
8449 if (*q == 'v') {
eb3fce90 8450 q++;
211dfcf1
HS
8451 if (vectorize)
8452 goto unknown;
9cbac4c7 8453 if ((vectorarg = asterisk)) {
211dfcf1
HS
8454 evix = ewix;
8455 ewix = 0;
8456 asterisk = FALSE;
8457 }
8458 vectorize = TRUE;
8459 goto tryasterisk;
eb3fce90
JH
8460 }
8461
211dfcf1 8462 if (!asterisk)
858a90f9 8463 {
7a5fa8a2 8464 if( *q == '0' )
f3583277 8465 fill = *q++;
c445ea15 8466 width = expect_number(&q);
858a90f9 8467 }
211dfcf1
HS
8468
8469 if (vectorize) {
8470 if (vectorarg) {
8471 if (args)
8472 vecsv = va_arg(*args, SV*);
7ad96abb
NC
8473 else if (evix) {
8474 vecsv = (evix > 0 && evix <= svmax)
8475 ? svargs[evix-1] : &PL_sv_undef;
8476 } else {
8477 vecsv = svix < svmax ? svargs[svix++] : &PL_sv_undef;
8478 }
245d4a47 8479 dotstr = SvPV_const(vecsv, dotstrlen);
640283f5
NC
8480 /* Keep the DO_UTF8 test *after* the SvPV call, else things go
8481 bad with tied or overloaded values that return UTF8. */
211dfcf1 8482 if (DO_UTF8(vecsv))
2cf2cfc6 8483 is_utf8 = TRUE;
640283f5
NC
8484 else if (has_utf8) {
8485 vecsv = sv_mortalcopy(vecsv);
8486 sv_utf8_upgrade(vecsv);
8487 dotstr = SvPV_const(vecsv, dotstrlen);
8488 is_utf8 = TRUE;
8489 }
211dfcf1
HS
8490 }
8491 if (args) {
8896765a 8492 VECTORIZE_ARGS
eb3fce90 8493 }
7ad96abb 8494 else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
211dfcf1 8495 vecsv = svargs[efix ? efix-1 : svix++];
245d4a47 8496 vecstr = (U8*)SvPV_const(vecsv,veclen);
2cf2cfc6 8497 vec_utf8 = DO_UTF8(vecsv);
96b8f7ce
JP
8498
8499 /* if this is a version object, we need to convert
8500 * back into v-string notation and then let the
8501 * vectorize happen normally
d7aa5382 8502 */
96b8f7ce
JP
8503 if (sv_derived_from(vecsv, "version")) {
8504 char *version = savesvpv(vecsv);
34ba6322
SP
8505 if ( hv_exists((HV*)SvRV(vecsv), "alpha", 5 ) ) {
8506 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
8507 "vector argument not supported with alpha versions");
8508 goto unknown;
8509 }
96b8f7ce
JP
8510 vecsv = sv_newmortal();
8511 /* scan_vstring is expected to be called during
8512 * tokenization, so we need to fake up the end
8513 * of the buffer for it
8514 */
8515 PL_bufend = version + veclen;
8516 scan_vstring(version, vecsv);
8517 vecstr = (U8*)SvPV_const(vecsv, veclen);
8518 vec_utf8 = DO_UTF8(vecsv);
8519 Safefree(version);
d7aa5382 8520 }
211dfcf1
HS
8521 }
8522 else {
8523 vecstr = (U8*)"";
8524 veclen = 0;
8525 }
eb3fce90 8526 }
fc36a67e 8527
eb3fce90 8528 if (asterisk) {
fc36a67e 8529 if (args)
8530 i = va_arg(*args, int);
8531 else
eb3fce90
JH
8532 i = (ewix ? ewix <= svmax : svix < svmax) ?
8533 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8534 left |= (i < 0);
8535 width = (i < 0) ? -i : i;
fc36a67e 8536 }
211dfcf1 8537 gotwidth:
fc36a67e 8538
8539 /* PRECISION */
46fc3d4c 8540
fc36a67e 8541 if (*q == '.') {
8542 q++;
8543 if (*q == '*') {
211dfcf1 8544 q++;
c445ea15 8545 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
7b8dd722
HS
8546 goto unknown;
8547 /* XXX: todo, support specified precision parameter */
8548 if (epix)
211dfcf1 8549 goto unknown;
46fc3d4c 8550 if (args)
8551 i = va_arg(*args, int);
8552 else
eb3fce90
JH
8553 i = (ewix ? ewix <= svmax : svix < svmax)
8554 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8555 precis = (i < 0) ? 0 : i;
fc36a67e 8556 }
8557 else {
8558 precis = 0;
8559 while (isDIGIT(*q))
8560 precis = precis * 10 + (*q++ - '0');
8561 }
8562 has_precis = TRUE;
8563 }
46fc3d4c 8564
fc36a67e 8565 /* SIZE */
46fc3d4c 8566
fc36a67e 8567 switch (*q) {
c623ac67
GS
8568#ifdef WIN32
8569 case 'I': /* Ix, I32x, and I64x */
8570# ifdef WIN64
8571 if (q[1] == '6' && q[2] == '4') {
8572 q += 3;
8573 intsize = 'q';
8574 break;
8575 }
8576# endif
8577 if (q[1] == '3' && q[2] == '2') {
8578 q += 3;
8579 break;
8580 }
8581# ifdef WIN64
8582 intsize = 'q';
8583# endif
8584 q++;
8585 break;
8586#endif
9e5b023a 8587#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 8588 case 'L': /* Ld */
5f66b61c 8589 /*FALLTHROUGH*/
e5c81feb 8590#ifdef HAS_QUAD
6f9bb7fd 8591 case 'q': /* qd */
9e5b023a 8592#endif
6f9bb7fd
GS
8593 intsize = 'q';
8594 q++;
8595 break;
8596#endif
fc36a67e 8597 case 'l':
9e5b023a 8598#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 8599 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 8600 intsize = 'q';
8601 q += 2;
46fc3d4c 8602 break;
cf2093f6 8603 }
fc36a67e 8604#endif
5f66b61c 8605 /*FALLTHROUGH*/
fc36a67e 8606 case 'h':
5f66b61c 8607 /*FALLTHROUGH*/
fc36a67e 8608 case 'V':
8609 intsize = *q++;
46fc3d4c 8610 break;
8611 }
8612
fc36a67e 8613 /* CONVERSION */
8614
211dfcf1
HS
8615 if (*q == '%') {
8616 eptr = q++;
8617 elen = 1;
26372e71
GA
8618 if (vectorize) {
8619 c = '%';
8620 goto unknown;
8621 }
211dfcf1
HS
8622 goto string;
8623 }
8624
26372e71 8625 if (!vectorize && !args) {
86c51f8b
NC
8626 if (efix) {
8627 const I32 i = efix-1;
8628 argsv = (i >= 0 && i < svmax) ? svargs[i] : &PL_sv_undef;
8629 } else {
8630 argsv = (svix >= 0 && svix < svmax)
8631 ? svargs[svix++] : &PL_sv_undef;
8632 }
863811b2 8633 }
211dfcf1 8634
46fc3d4c 8635 switch (c = *q++) {
8636
8637 /* STRINGS */
8638
46fc3d4c 8639 case 'c':
26372e71
GA
8640 if (vectorize)
8641 goto unknown;
8642 uv = (args) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
8643 if ((uv > 255 ||
8644 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 8645 && !IN_BYTES) {
dfe13c55 8646 eptr = (char*)utf8buf;
9041c2e3 8647 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 8648 is_utf8 = TRUE;
7e2040f0
GS
8649 }
8650 else {
8651 c = (char)uv;
8652 eptr = &c;
8653 elen = 1;
a0ed51b3 8654 }
46fc3d4c 8655 goto string;
8656
46fc3d4c 8657 case 's':
26372e71
GA
8658 if (vectorize)
8659 goto unknown;
8660 if (args) {
fc36a67e 8661 eptr = va_arg(*args, char*);
c635e13b 8662 if (eptr)
1d7c1841
GS
8663#ifdef MACOS_TRADITIONAL
8664 /* On MacOS, %#s format is used for Pascal strings */
8665 if (alt)
8666 elen = *eptr++;
8667 else
8668#endif
c635e13b 8669 elen = strlen(eptr);
8670 else {
27da23d5 8671 eptr = (char *)nullstr;
c635e13b 8672 elen = sizeof nullstr - 1;
8673 }
46fc3d4c 8674 }
211dfcf1 8675 else {
4d84ee25 8676 eptr = SvPVx_const(argsv, elen);
7e2040f0 8677 if (DO_UTF8(argsv)) {
a0ed51b3
LW
8678 if (has_precis && precis < elen) {
8679 I32 p = precis;
7e2040f0 8680 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
8681 precis = p;
8682 }
8683 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 8684 width += elen - sv_len_utf8(argsv);
a0ed51b3 8685 }
2cf2cfc6 8686 is_utf8 = TRUE;
a0ed51b3
LW
8687 }
8688 }
fc36a67e 8689
46fc3d4c 8690 string:
8691 if (has_precis && elen > precis)
8692 elen = precis;
8693 break;
8694
8695 /* INTEGERS */
8696
fc36a67e 8697 case 'p':
be75b157 8698 if (alt || vectorize)
c2e66d9e 8699 goto unknown;
211dfcf1 8700 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 8701 base = 16;
8702 goto integer;
8703
46fc3d4c 8704 case 'D':
29fe7a80 8705#ifdef IV_IS_QUAD
22f3ae8c 8706 intsize = 'q';
29fe7a80 8707#else
46fc3d4c 8708 intsize = 'l';
29fe7a80 8709#endif
5f66b61c 8710 /*FALLTHROUGH*/
46fc3d4c 8711 case 'd':
8712 case 'i':
8896765a
RB
8713#if vdNUMBER
8714 format_vd:
8715#endif
b22c7a20 8716 if (vectorize) {
ba210ebe 8717 STRLEN ulen;
211dfcf1
HS
8718 if (!veclen)
8719 continue;
2cf2cfc6
A
8720 if (vec_utf8)
8721 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8722 UTF8_ALLOW_ANYUV);
b22c7a20 8723 else {
e83d50c9 8724 uv = *vecstr;
b22c7a20
GS
8725 ulen = 1;
8726 }
8727 vecstr += ulen;
8728 veclen -= ulen;
e83d50c9
JP
8729 if (plus)
8730 esignbuf[esignlen++] = plus;
b22c7a20
GS
8731 }
8732 else if (args) {
46fc3d4c 8733 switch (intsize) {
8734 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 8735 case 'l': iv = va_arg(*args, long); break;
fc36a67e 8736 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 8737 default: iv = va_arg(*args, int); break;
cf2093f6
JH
8738#ifdef HAS_QUAD
8739 case 'q': iv = va_arg(*args, Quad_t); break;
8740#endif
46fc3d4c 8741 }
8742 }
8743 else {
b10c0dba 8744 IV tiv = SvIVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 8745 switch (intsize) {
b10c0dba
MHM
8746 case 'h': iv = (short)tiv; break;
8747 case 'l': iv = (long)tiv; break;
8748 case 'V':
8749 default: iv = tiv; break;
cf2093f6 8750#ifdef HAS_QUAD
b10c0dba 8751 case 'q': iv = (Quad_t)tiv; break;
cf2093f6 8752#endif
46fc3d4c 8753 }
8754 }
e83d50c9
JP
8755 if ( !vectorize ) /* we already set uv above */
8756 {
8757 if (iv >= 0) {
8758 uv = iv;
8759 if (plus)
8760 esignbuf[esignlen++] = plus;
8761 }
8762 else {
8763 uv = -iv;
8764 esignbuf[esignlen++] = '-';
8765 }
46fc3d4c 8766 }
8767 base = 10;
8768 goto integer;
8769
fc36a67e 8770 case 'U':
29fe7a80 8771#ifdef IV_IS_QUAD
22f3ae8c 8772 intsize = 'q';
29fe7a80 8773#else
fc36a67e 8774 intsize = 'l';
29fe7a80 8775#endif
5f66b61c 8776 /*FALLTHROUGH*/
fc36a67e 8777 case 'u':
8778 base = 10;
8779 goto uns_integer;
8780
4f19785b
WSI
8781 case 'b':
8782 base = 2;
8783 goto uns_integer;
8784
46fc3d4c 8785 case 'O':
29fe7a80 8786#ifdef IV_IS_QUAD
22f3ae8c 8787 intsize = 'q';
29fe7a80 8788#else
46fc3d4c 8789 intsize = 'l';
29fe7a80 8790#endif
5f66b61c 8791 /*FALLTHROUGH*/
46fc3d4c 8792 case 'o':
8793 base = 8;
8794 goto uns_integer;
8795
8796 case 'X':
46fc3d4c 8797 case 'x':
8798 base = 16;
46fc3d4c 8799
8800 uns_integer:
b22c7a20 8801 if (vectorize) {
ba210ebe 8802 STRLEN ulen;
b22c7a20 8803 vector:
211dfcf1
HS
8804 if (!veclen)
8805 continue;
2cf2cfc6
A
8806 if (vec_utf8)
8807 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8808 UTF8_ALLOW_ANYUV);
b22c7a20 8809 else {
a05b299f 8810 uv = *vecstr;
b22c7a20
GS
8811 ulen = 1;
8812 }
8813 vecstr += ulen;
8814 veclen -= ulen;
8815 }
8816 else if (args) {
46fc3d4c 8817 switch (intsize) {
8818 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 8819 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 8820 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 8821 default: uv = va_arg(*args, unsigned); break;
cf2093f6 8822#ifdef HAS_QUAD
9e3321a5 8823 case 'q': uv = va_arg(*args, Uquad_t); break;
cf2093f6 8824#endif
46fc3d4c 8825 }
8826 }
8827 else {
b10c0dba 8828 UV tuv = SvUVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 8829 switch (intsize) {
b10c0dba
MHM
8830 case 'h': uv = (unsigned short)tuv; break;
8831 case 'l': uv = (unsigned long)tuv; break;
8832 case 'V':
8833 default: uv = tuv; break;
cf2093f6 8834#ifdef HAS_QUAD
b10c0dba 8835 case 'q': uv = (Uquad_t)tuv; break;
cf2093f6 8836#endif
46fc3d4c 8837 }
8838 }
8839
8840 integer:
4d84ee25
NC
8841 {
8842 char *ptr = ebuf + sizeof ebuf;
8843 switch (base) {
8844 unsigned dig;
8845 case 16:
8846 if (!uv)
8847 alt = FALSE;
8848 p = (char*)((c == 'X')
8849 ? "0123456789ABCDEF" : "0123456789abcdef");
8850 do {
8851 dig = uv & 15;
8852 *--ptr = p[dig];
8853 } while (uv >>= 4);
8854 if (alt) {
8855 esignbuf[esignlen++] = '0';
8856 esignbuf[esignlen++] = c; /* 'x' or 'X' */
8857 }
8858 break;
8859 case 8:
8860 do {
8861 dig = uv & 7;
8862 *--ptr = '0' + dig;
8863 } while (uv >>= 3);
8864 if (alt && *ptr != '0')
8865 *--ptr = '0';
8866 break;
8867 case 2:
ed2b91d2
GA
8868 if (!uv)
8869 alt = FALSE;
4d84ee25
NC
8870 do {
8871 dig = uv & 1;
8872 *--ptr = '0' + dig;
8873 } while (uv >>= 1);
8874 if (alt) {
8875 esignbuf[esignlen++] = '0';
8876 esignbuf[esignlen++] = 'b';
8877 }
8878 break;
8879 default: /* it had better be ten or less */
8880 do {
8881 dig = uv % base;
8882 *--ptr = '0' + dig;
8883 } while (uv /= base);
8884 break;
46fc3d4c 8885 }
4d84ee25
NC
8886 elen = (ebuf + sizeof ebuf) - ptr;
8887 eptr = ptr;
8888 if (has_precis) {
8889 if (precis > elen)
8890 zeros = precis - elen;
8891 else if (precis == 0 && elen == 1 && *eptr == '0')
8892 elen = 0;
eda88b6d 8893 }
c10ed8b9 8894 }
46fc3d4c 8895 break;
8896
8897 /* FLOATING POINT */
8898
fc36a67e 8899 case 'F':
8900 c = 'f'; /* maybe %F isn't supported here */
5f66b61c 8901 /*FALLTHROUGH*/
46fc3d4c 8902 case 'e': case 'E':
fc36a67e 8903 case 'f':
46fc3d4c 8904 case 'g': case 'G':
26372e71
GA
8905 if (vectorize)
8906 goto unknown;
46fc3d4c 8907
8908 /* This is evil, but floating point is even more evil */
8909
9e5b023a
JH
8910 /* for SV-style calling, we can only get NV
8911 for C-style calling, we assume %f is double;
8912 for simplicity we allow any of %Lf, %llf, %qf for long double
8913 */
8914 switch (intsize) {
8915 case 'V':
8916#if defined(USE_LONG_DOUBLE)
8917 intsize = 'q';
8918#endif
8919 break;
8a2e3f14 8920/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364 8921 case 'l':
5f66b61c 8922 /*FALLTHROUGH*/
9e5b023a
JH
8923 default:
8924#if defined(USE_LONG_DOUBLE)
8925 intsize = args ? 0 : 'q';
8926#endif
8927 break;
8928 case 'q':
8929#if defined(HAS_LONG_DOUBLE)
8930 break;
8931#else
5f66b61c 8932 /*FALLTHROUGH*/
9e5b023a
JH
8933#endif
8934 case 'h':
9e5b023a
JH
8935 goto unknown;
8936 }
8937
8938 /* now we need (long double) if intsize == 'q', else (double) */
26372e71 8939 nv = (args) ?
35fff930
JH
8940#if LONG_DOUBLESIZE > DOUBLESIZE
8941 intsize == 'q' ?
205f51d8
AS
8942 va_arg(*args, long double) :
8943 va_arg(*args, double)
35fff930 8944#else
205f51d8 8945 va_arg(*args, double)
35fff930 8946#endif
9e5b023a 8947 : SvNVx(argsv);
fc36a67e 8948
8949 need = 0;
8950 if (c != 'e' && c != 'E') {
8951 i = PERL_INT_MIN;
9e5b023a
JH
8952 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
8953 will cast our (long double) to (double) */
73b309ea 8954 (void)Perl_frexp(nv, &i);
fc36a67e 8955 if (i == PERL_INT_MIN)
cea2e8a9 8956 Perl_die(aTHX_ "panic: frexp");
c635e13b 8957 if (i > 0)
fc36a67e 8958 need = BIT_DIGITS(i);
8959 }
8960 need += has_precis ? precis : 6; /* known default */
20f6aaab 8961
fc36a67e 8962 if (need < width)
8963 need = width;
8964
20f6aaab
AS
8965#ifdef HAS_LDBL_SPRINTF_BUG
8966 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
8967 with sfio - Allen <allens@cpan.org> */
8968
8969# ifdef DBL_MAX
8970# define MY_DBL_MAX DBL_MAX
8971# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
8972# if DOUBLESIZE >= 8
8973# define MY_DBL_MAX 1.7976931348623157E+308L
8974# else
8975# define MY_DBL_MAX 3.40282347E+38L
8976# endif
8977# endif
8978
8979# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
8980# define MY_DBL_MAX_BUG 1L
20f6aaab 8981# else
205f51d8 8982# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 8983# endif
20f6aaab 8984
205f51d8
AS
8985# ifdef DBL_MIN
8986# define MY_DBL_MIN DBL_MIN
8987# else /* XXX guessing! -Allen */
8988# if DOUBLESIZE >= 8
8989# define MY_DBL_MIN 2.2250738585072014E-308L
8990# else
8991# define MY_DBL_MIN 1.17549435E-38L
8992# endif
8993# endif
20f6aaab 8994
205f51d8
AS
8995 if ((intsize == 'q') && (c == 'f') &&
8996 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
8997 (need < DBL_DIG)) {
8998 /* it's going to be short enough that
8999 * long double precision is not needed */
9000
9001 if ((nv <= 0L) && (nv >= -0L))
9002 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9003 else {
9004 /* would use Perl_fp_class as a double-check but not
9005 * functional on IRIX - see perl.h comments */
9006
9007 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9008 /* It's within the range that a double can represent */
9009#if defined(DBL_MAX) && !defined(DBL_MIN)
9010 if ((nv >= ((long double)1/DBL_MAX)) ||
9011 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9012#endif
205f51d8 9013 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9014 }
205f51d8
AS
9015 }
9016 if (fix_ldbl_sprintf_bug == TRUE) {
9017 double temp;
9018
9019 intsize = 0;
9020 temp = (double)nv;
9021 nv = (NV)temp;
9022 }
20f6aaab 9023 }
205f51d8
AS
9024
9025# undef MY_DBL_MAX
9026# undef MY_DBL_MAX_BUG
9027# undef MY_DBL_MIN
9028
20f6aaab
AS
9029#endif /* HAS_LDBL_SPRINTF_BUG */
9030
46fc3d4c 9031 need += 20; /* fudge factor */
80252599
GS
9032 if (PL_efloatsize < need) {
9033 Safefree(PL_efloatbuf);
9034 PL_efloatsize = need + 20; /* more fudge */
a02a5408 9035 Newx(PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9036 PL_efloatbuf[0] = '\0';
46fc3d4c 9037 }
9038
4151a5fe
IZ
9039 if ( !(width || left || plus || alt) && fill != '0'
9040 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
9041 /* See earlier comment about buggy Gconvert when digits,
9042 aka precis is 0 */
9043 if ( c == 'g' && precis) {
2e59c212 9044 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4150c189
NC
9045 /* May return an empty string for digits==0 */
9046 if (*PL_efloatbuf) {
9047 elen = strlen(PL_efloatbuf);
4151a5fe 9048 goto float_converted;
4150c189 9049 }
4151a5fe
IZ
9050 } else if ( c == 'f' && !precis) {
9051 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9052 break;
9053 }
9054 }
4d84ee25
NC
9055 {
9056 char *ptr = ebuf + sizeof ebuf;
9057 *--ptr = '\0';
9058 *--ptr = c;
9059 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9e5b023a 9060#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
4d84ee25
NC
9061 if (intsize == 'q') {
9062 /* Copy the one or more characters in a long double
9063 * format before the 'base' ([efgEFG]) character to
9064 * the format string. */
9065 static char const prifldbl[] = PERL_PRIfldbl;
9066 char const *p = prifldbl + sizeof(prifldbl) - 3;
9067 while (p >= prifldbl) { *--ptr = *p--; }
9068 }
65202027 9069#endif
4d84ee25
NC
9070 if (has_precis) {
9071 base = precis;
9072 do { *--ptr = '0' + (base % 10); } while (base /= 10);
9073 *--ptr = '.';
9074 }
9075 if (width) {
9076 base = width;
9077 do { *--ptr = '0' + (base % 10); } while (base /= 10);
9078 }
9079 if (fill == '0')
9080 *--ptr = fill;
9081 if (left)
9082 *--ptr = '-';
9083 if (plus)
9084 *--ptr = plus;
9085 if (alt)
9086 *--ptr = '#';
9087 *--ptr = '%';
9088
9089 /* No taint. Otherwise we are in the strange situation
9090 * where printf() taints but print($float) doesn't.
9091 * --jhi */
9e5b023a 9092#if defined(HAS_LONG_DOUBLE)
4150c189
NC
9093 elen = ((intsize == 'q')
9094 ? my_sprintf(PL_efloatbuf, ptr, nv)
9095 : my_sprintf(PL_efloatbuf, ptr, (double)nv));
9e5b023a 9096#else
4150c189 9097 elen = my_sprintf(PL_efloatbuf, ptr, nv);
9e5b023a 9098#endif
4d84ee25 9099 }
4151a5fe 9100 float_converted:
80252599 9101 eptr = PL_efloatbuf;
46fc3d4c 9102 break;
9103
fc36a67e 9104 /* SPECIAL */
9105
9106 case 'n':
26372e71
GA
9107 if (vectorize)
9108 goto unknown;
fc36a67e 9109 i = SvCUR(sv) - origlen;
26372e71 9110 if (args) {
c635e13b 9111 switch (intsize) {
9112 case 'h': *(va_arg(*args, short*)) = i; break;
9113 default: *(va_arg(*args, int*)) = i; break;
9114 case 'l': *(va_arg(*args, long*)) = i; break;
9115 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
9116#ifdef HAS_QUAD
9117 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
9118#endif
c635e13b 9119 }
fc36a67e 9120 }
9dd79c3f 9121 else
211dfcf1 9122 sv_setuv_mg(argsv, (UV)i);
fc36a67e 9123 continue; /* not "break" */
9124
9125 /* UNKNOWN */
9126
46fc3d4c 9127 default:
fc36a67e 9128 unknown:
041457d9
DM
9129 if (!args
9130 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
9131 && ckWARN(WARN_PRINTF))
9132 {
c4420975 9133 SV * const msg = sv_newmortal();
35c1215d
NC
9134 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9135 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 9136 if (c) {
0f4b6630 9137 if (isPRINT(c))
1c846c1f 9138 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
9139 "\"%%%c\"", c & 0xFF);
9140 else
9141 Perl_sv_catpvf(aTHX_ msg,
57def98f 9142 "\"%%\\%03"UVof"\"",
0f4b6630 9143 (UV)c & 0xFF);
0f4b6630 9144 } else
396482e1 9145 sv_catpvs(msg, "end of string");
9014280d 9146 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 9147 }
fb73857a 9148
9149 /* output mangled stuff ... */
9150 if (c == '\0')
9151 --q;
46fc3d4c 9152 eptr = p;
9153 elen = q - p;
fb73857a 9154
9155 /* ... right here, because formatting flags should not apply */
9156 SvGROW(sv, SvCUR(sv) + elen + 1);
9157 p = SvEND(sv);
4459522c 9158 Copy(eptr, p, elen, char);
fb73857a 9159 p += elen;
9160 *p = '\0';
3f7c398e 9161 SvCUR_set(sv, p - SvPVX_const(sv));
58e33a90 9162 svix = osvix;
fb73857a 9163 continue; /* not "break" */
46fc3d4c 9164 }
9165
6c94ec8b
HS
9166 /* calculate width before utf8_upgrade changes it */
9167 have = esignlen + zeros + elen;
ed2b91d2
GA
9168 if (have < zeros)
9169 Perl_croak_nocontext(PL_memory_wrap);
6c94ec8b 9170
d2876be5
JH
9171 if (is_utf8 != has_utf8) {
9172 if (is_utf8) {
9173 if (SvCUR(sv))
9174 sv_utf8_upgrade(sv);
9175 }
9176 else {
53c1dcc0 9177 SV * const nsv = sv_2mortal(newSVpvn(eptr, elen));
d2876be5 9178 sv_utf8_upgrade(nsv);
93524f2b 9179 eptr = SvPVX_const(nsv);
d2876be5
JH
9180 elen = SvCUR(nsv);
9181 }
9182 SvGROW(sv, SvCUR(sv) + elen + 1);
9183 p = SvEND(sv);
9184 *p = '\0';
9185 }
6af65485 9186
46fc3d4c 9187 need = (have > width ? have : width);
9188 gap = need - have;
9189
d2641cbd
PC
9190 if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
9191 Perl_croak_nocontext(PL_memory_wrap);
b22c7a20 9192 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 9193 p = SvEND(sv);
9194 if (esignlen && fill == '0') {
53c1dcc0 9195 int i;
eb160463 9196 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9197 *p++ = esignbuf[i];
9198 }
9199 if (gap && !left) {
9200 memset(p, fill, gap);
9201 p += gap;
9202 }
9203 if (esignlen && fill != '0') {
53c1dcc0 9204 int i;
eb160463 9205 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9206 *p++ = esignbuf[i];
9207 }
fc36a67e 9208 if (zeros) {
53c1dcc0 9209 int i;
fc36a67e 9210 for (i = zeros; i; i--)
9211 *p++ = '0';
9212 }
46fc3d4c 9213 if (elen) {
4459522c 9214 Copy(eptr, p, elen, char);
46fc3d4c 9215 p += elen;
9216 }
9217 if (gap && left) {
9218 memset(p, ' ', gap);
9219 p += gap;
9220 }
b22c7a20
GS
9221 if (vectorize) {
9222 if (veclen) {
4459522c 9223 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
9224 p += dotstrlen;
9225 }
9226 else
9227 vectorize = FALSE; /* done iterating over vecstr */
9228 }
2cf2cfc6
A
9229 if (is_utf8)
9230 has_utf8 = TRUE;
9231 if (has_utf8)
7e2040f0 9232 SvUTF8_on(sv);
46fc3d4c 9233 *p = '\0';
3f7c398e 9234 SvCUR_set(sv, p - SvPVX_const(sv));
b22c7a20
GS
9235 if (vectorize) {
9236 esignlen = 0;
9237 goto vector;
9238 }
46fc3d4c 9239 }
9240}
51371543 9241
645c22ef
DM
9242/* =========================================================================
9243
9244=head1 Cloning an interpreter
9245
9246All the macros and functions in this section are for the private use of
9247the main function, perl_clone().
9248
9249The foo_dup() functions make an exact copy of an existing foo thinngy.
9250During the course of a cloning, a hash table is used to map old addresses
9251to new addresses. The table is created and manipulated with the
9252ptr_table_* functions.
9253
9254=cut
9255
9256============================================================================*/
9257
9258
1d7c1841
GS
9259#if defined(USE_ITHREADS)
9260
1d7c1841
GS
9261#ifndef GpREFCNT_inc
9262# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
9263#endif
9264
9265
d2d73c3e 9266#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
7f466ec7 9267#define sv_dup_inc_NN(s,t) SvREFCNT_inc_NN(sv_dup(s,t))
d2d73c3e
AB
9268#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
9269#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9270#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
9271#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9272#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
9273#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9274#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
9275#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
9276#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
9277#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
6136c704
AL
9278#define SAVEPV(p) ((p) ? savepv(p) : NULL)
9279#define SAVEPVN(p,n) ((p) ? savepvn(p,n) : NULL)
8cf8f3d1 9280
d2d73c3e 9281
d2f185dc
AMS
9282/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
9283 regcomp.c. AMS 20010712 */
645c22ef 9284
1d7c1841 9285REGEXP *
53c1dcc0 9286Perl_re_dup(pTHX_ const REGEXP *r, CLONE_PARAMS *param)
1d7c1841 9287{
27da23d5 9288 dVAR;
d2f185dc
AMS
9289 REGEXP *ret;
9290 int i, len, npar;
9291 struct reg_substr_datum *s;
9292
9293 if (!r)
9294 return (REGEXP *)NULL;
9295
9296 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
9297 return ret;
9298
9299 len = r->offsets[0];
9300 npar = r->nparens+1;
9301
a02a5408 9302 Newxc(ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
d2f185dc
AMS
9303 Copy(r->program, ret->program, len+1, regnode);
9304
a02a5408 9305 Newx(ret->startp, npar, I32);
d2f185dc 9306 Copy(r->startp, ret->startp, npar, I32);
a02a5408 9307 Newx(ret->endp, npar, I32);
d2f185dc
AMS
9308 Copy(r->startp, ret->startp, npar, I32);
9309
a02a5408 9310 Newx(ret->substrs, 1, struct reg_substr_data);
d2f185dc
AMS
9311 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
9312 s->min_offset = r->substrs->data[i].min_offset;
9313 s->max_offset = r->substrs->data[i].max_offset;
9314 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 9315 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
9316 }
9317
70612e96 9318 ret->regstclass = NULL;
d2f185dc
AMS
9319 if (r->data) {
9320 struct reg_data *d;
e1ec3a88 9321 const int count = r->data->count;
53c1dcc0 9322 int i;
d2f185dc 9323
a02a5408 9324 Newxc(d, sizeof(struct reg_data) + count*sizeof(void *),
d2f185dc 9325 char, struct reg_data);
a02a5408 9326 Newx(d->what, count, U8);
d2f185dc
AMS
9327
9328 d->count = count;
9329 for (i = 0; i < count; i++) {
9330 d->what[i] = r->data->what[i];
9331 switch (d->what[i]) {
a3621e74
YO
9332 /* legal options are one of: sfpont
9333 see also regcomp.h and pregfree() */
d2f185dc
AMS
9334 case 's':
9335 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
9336 break;
9337 case 'p':
9338 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
9339 break;
9340 case 'f':
9341 /* This is cheating. */
a02a5408 9342 Newx(d->data[i], 1, struct regnode_charclass_class);
d2f185dc
AMS
9343 StructCopy(r->data->data[i], d->data[i],
9344 struct regnode_charclass_class);
70612e96 9345 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
9346 break;
9347 case 'o':
33773810
AMS
9348 /* Compiled op trees are readonly, and can thus be
9349 shared without duplication. */
b34c0dd4 9350 OP_REFCNT_LOCK;
9b978d73 9351 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
b34c0dd4 9352 OP_REFCNT_UNLOCK;
9b978d73 9353 break;
d2f185dc
AMS
9354 case 'n':
9355 d->data[i] = r->data->data[i];
9356 break;
a3621e74
YO
9357 case 't':
9358 d->data[i] = r->data->data[i];
9359 OP_REFCNT_LOCK;
9360 ((reg_trie_data*)d->data[i])->refcount++;
9361 OP_REFCNT_UNLOCK;
9362 break;
9363 default:
9364 Perl_croak(aTHX_ "panic: re_dup unknown data code '%c'", r->data->what[i]);
d2f185dc
AMS
9365 }
9366 }
9367
9368 ret->data = d;
9369 }
9370 else
9371 ret->data = NULL;
9372
a02a5408 9373 Newx(ret->offsets, 2*len+1, U32);
d2f185dc
AMS
9374 Copy(r->offsets, ret->offsets, 2*len+1, U32);
9375
e01c5899 9376 ret->precomp = SAVEPVN(r->precomp, r->prelen);
d2f185dc
AMS
9377 ret->refcnt = r->refcnt;
9378 ret->minlen = r->minlen;
9379 ret->prelen = r->prelen;
9380 ret->nparens = r->nparens;
9381 ret->lastparen = r->lastparen;
9382 ret->lastcloseparen = r->lastcloseparen;
9383 ret->reganch = r->reganch;
9384
70612e96
RG
9385 ret->sublen = r->sublen;
9386
9387 if (RX_MATCH_COPIED(ret))
e01c5899 9388 ret->subbeg = SAVEPVN(r->subbeg, r->sublen);
70612e96 9389 else
bd61b366 9390 ret->subbeg = NULL;
f8c7b90f 9391#ifdef PERL_OLD_COPY_ON_WRITE
a0714e2c 9392 ret->saved_copy = NULL;
9a26048b 9393#endif
70612e96 9394
d2f185dc
AMS
9395 ptr_table_store(PL_ptr_table, r, ret);
9396 return ret;
1d7c1841
GS
9397}
9398
d2d73c3e 9399/* duplicate a file handle */
645c22ef 9400
1d7c1841 9401PerlIO *
a8fc9800 9402Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
9403{
9404 PerlIO *ret;
53c1dcc0
AL
9405
9406 PERL_UNUSED_ARG(type);
73d840c0 9407
1d7c1841
GS
9408 if (!fp)
9409 return (PerlIO*)NULL;
9410
9411 /* look for it in the table first */
9412 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
9413 if (ret)
9414 return ret;
9415
9416 /* create anew and remember what it is */
ecdeb87c 9417 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
9418 ptr_table_store(PL_ptr_table, fp, ret);
9419 return ret;
9420}
9421
645c22ef
DM
9422/* duplicate a directory handle */
9423
1d7c1841
GS
9424DIR *
9425Perl_dirp_dup(pTHX_ DIR *dp)
9426{
96a5add6 9427 PERL_UNUSED_CONTEXT;
1d7c1841
GS
9428 if (!dp)
9429 return (DIR*)NULL;
9430 /* XXX TODO */
9431 return dp;
9432}
9433
ff276b08 9434/* duplicate a typeglob */
645c22ef 9435
1d7c1841 9436GP *
a8fc9800 9437Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
9438{
9439 GP *ret;
b37c2d43 9440
1d7c1841
GS
9441 if (!gp)
9442 return (GP*)NULL;
9443 /* look for it in the table first */
9444 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
9445 if (ret)
9446 return ret;
9447
9448 /* create anew and remember what it is */
a02a5408 9449 Newxz(ret, 1, GP);
1d7c1841
GS
9450 ptr_table_store(PL_ptr_table, gp, ret);
9451
9452 /* clone */
9453 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
9454 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
9455 ret->gp_io = io_dup_inc(gp->gp_io, param);
9456 ret->gp_form = cv_dup_inc(gp->gp_form, param);
9457 ret->gp_av = av_dup_inc(gp->gp_av, param);
9458 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
9459 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
9460 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841 9461 ret->gp_cvgen = gp->gp_cvgen;
1d7c1841
GS
9462 ret->gp_line = gp->gp_line;
9463 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
9464 return ret;
9465}
9466
645c22ef
DM
9467/* duplicate a chain of magic */
9468
1d7c1841 9469MAGIC *
a8fc9800 9470Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 9471{
cb359b41
JH
9472 MAGIC *mgprev = (MAGIC*)NULL;
9473 MAGIC *mgret;
1d7c1841
GS
9474 if (!mg)
9475 return (MAGIC*)NULL;
9476 /* look for it in the table first */
9477 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
9478 if (mgret)
9479 return mgret;
9480
9481 for (; mg; mg = mg->mg_moremagic) {
9482 MAGIC *nmg;
a02a5408 9483 Newxz(nmg, 1, MAGIC);
cb359b41 9484 if (mgprev)
1d7c1841 9485 mgprev->mg_moremagic = nmg;
cb359b41
JH
9486 else
9487 mgret = nmg;
1d7c1841
GS
9488 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
9489 nmg->mg_private = mg->mg_private;
9490 nmg->mg_type = mg->mg_type;
9491 nmg->mg_flags = mg->mg_flags;
14befaf4 9492 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 9493 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 9494 }
05bd4103 9495 else if(mg->mg_type == PERL_MAGIC_backref) {
d7cbc7b5
NC
9496 /* The backref AV has its reference count deliberately bumped by
9497 1. */
9498 nmg->mg_obj = SvREFCNT_inc(av_dup_inc((AV*) mg->mg_obj, param));
05bd4103 9499 }
8d2f4536
NC
9500 else if (mg->mg_type == PERL_MAGIC_symtab) {
9501 nmg->mg_obj = mg->mg_obj;
9502 }
1d7c1841
GS
9503 else {
9504 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
9505 ? sv_dup_inc(mg->mg_obj, param)
9506 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
9507 }
9508 nmg->mg_len = mg->mg_len;
9509 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 9510 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 9511 if (mg->mg_len > 0) {
1d7c1841 9512 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
9513 if (mg->mg_type == PERL_MAGIC_overload_table &&
9514 AMT_AMAGIC((AMT*)mg->mg_ptr))
9515 {
c445ea15 9516 const AMT * const amtp = (AMT*)mg->mg_ptr;
0bcc34c2 9517 AMT * const namtp = (AMT*)nmg->mg_ptr;
1d7c1841
GS
9518 I32 i;
9519 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 9520 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
9521 }
9522 }
9523 }
9524 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 9525 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 9526 }
68795e93
NIS
9527 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
9528 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
9529 }
1d7c1841
GS
9530 mgprev = nmg;
9531 }
9532 return mgret;
9533}
9534
645c22ef
DM
9535/* create a new pointer-mapping table */
9536
1d7c1841
GS
9537PTR_TBL_t *
9538Perl_ptr_table_new(pTHX)
9539{
9540 PTR_TBL_t *tbl;
96a5add6
AL
9541 PERL_UNUSED_CONTEXT;
9542
a02a5408 9543 Newxz(tbl, 1, PTR_TBL_t);
1d7c1841
GS
9544 tbl->tbl_max = 511;
9545 tbl->tbl_items = 0;
a02a5408 9546 Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
1d7c1841
GS
9547 return tbl;
9548}
9549
7119fd33
NC
9550#define PTR_TABLE_HASH(ptr) \
9551 ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
134ca3d6 9552
93e68bfb
JC
9553/*
9554 we use the PTE_SVSLOT 'reservation' made above, both here (in the
9555 following define) and at call to new_body_inline made below in
9556 Perl_ptr_table_store()
9557 */
9558
9559#define del_pte(p) del_body_type(p, PTE_SVSLOT)
32e691d0 9560
645c22ef
DM
9561/* map an existing pointer using a table */
9562
7bf61b54 9563STATIC PTR_TBL_ENT_t *
b0e6ae5b 9564S_ptr_table_find(PTR_TBL_t *tbl, const void *sv) {
1d7c1841 9565 PTR_TBL_ENT_t *tblent;
4373e329 9566 const UV hash = PTR_TABLE_HASH(sv);
1d7c1841
GS
9567 assert(tbl);
9568 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
9569 for (; tblent; tblent = tblent->next) {
9570 if (tblent->oldval == sv)
7bf61b54 9571 return tblent;
1d7c1841 9572 }
7bf61b54
NC
9573 return 0;
9574}
9575
9576void *
9577Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, const void *sv)
9578{
b0e6ae5b 9579 PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
96a5add6 9580 PERL_UNUSED_CONTEXT;
7bf61b54 9581 return tblent ? tblent->newval : (void *) 0;
1d7c1841
GS
9582}
9583
645c22ef
DM
9584/* add a new entry to a pointer-mapping table */
9585
1d7c1841 9586void
44f8325f 9587Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, const void *oldsv, void *newsv)
1d7c1841 9588{
0c9fdfe0 9589 PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
96a5add6 9590 PERL_UNUSED_CONTEXT;
1d7c1841 9591
7bf61b54
NC
9592 if (tblent) {
9593 tblent->newval = newsv;
9594 } else {
9595 const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
9596
d2a0f284
JC
9597 new_body_inline(tblent, PTE_SVSLOT);
9598
7bf61b54
NC
9599 tblent->oldval = oldsv;
9600 tblent->newval = newsv;
9601 tblent->next = tbl->tbl_ary[entry];
9602 tbl->tbl_ary[entry] = tblent;
9603 tbl->tbl_items++;
9604 if (tblent->next && tbl->tbl_items > tbl->tbl_max)
9605 ptr_table_split(tbl);
1d7c1841 9606 }
1d7c1841
GS
9607}
9608
645c22ef
DM
9609/* double the hash bucket size of an existing ptr table */
9610
1d7c1841
GS
9611void
9612Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
9613{
9614 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
4373e329 9615 const UV oldsize = tbl->tbl_max + 1;
1d7c1841
GS
9616 UV newsize = oldsize * 2;
9617 UV i;
96a5add6 9618 PERL_UNUSED_CONTEXT;
1d7c1841
GS
9619
9620 Renew(ary, newsize, PTR_TBL_ENT_t*);
9621 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
9622 tbl->tbl_max = --newsize;
9623 tbl->tbl_ary = ary;
9624 for (i=0; i < oldsize; i++, ary++) {
9625 PTR_TBL_ENT_t **curentp, **entp, *ent;
9626 if (!*ary)
9627 continue;
9628 curentp = ary + oldsize;
9629 for (entp = ary, ent = *ary; ent; ent = *entp) {
134ca3d6 9630 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
9631 *entp = ent->next;
9632 ent->next = *curentp;
9633 *curentp = ent;
9634 continue;
9635 }
9636 else
9637 entp = &ent->next;
9638 }
9639 }
9640}
9641
645c22ef
DM
9642/* remove all the entries from a ptr table */
9643
a0739874
DM
9644void
9645Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
9646{
d5cefff9 9647 if (tbl && tbl->tbl_items) {
c445ea15 9648 register PTR_TBL_ENT_t * const * const array = tbl->tbl_ary;
d5cefff9 9649 UV riter = tbl->tbl_max;
a0739874 9650
d5cefff9
NC
9651 do {
9652 PTR_TBL_ENT_t *entry = array[riter];
ab1e7f95 9653
d5cefff9 9654 while (entry) {
00b6aa41 9655 PTR_TBL_ENT_t * const oentry = entry;
d5cefff9
NC
9656 entry = entry->next;
9657 del_pte(oentry);
9658 }
9659 } while (riter--);
a0739874 9660
d5cefff9
NC
9661 tbl->tbl_items = 0;
9662 }
a0739874
DM
9663}
9664
645c22ef
DM
9665/* clear and free a ptr table */
9666
a0739874
DM
9667void
9668Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
9669{
9670 if (!tbl) {
9671 return;
9672 }
9673 ptr_table_clear(tbl);
9674 Safefree(tbl->tbl_ary);
9675 Safefree(tbl);
9676}
9677
5bd07a3d 9678
83841fad 9679void
eb86f8b3 9680Perl_rvpv_dup(pTHX_ SV *dstr, const SV *sstr, CLONE_PARAMS* param)
83841fad
NIS
9681{
9682 if (SvROK(sstr)) {
b162af07
SP
9683 SvRV_set(dstr, SvWEAKREF(sstr)
9684 ? sv_dup(SvRV(sstr), param)
9685 : sv_dup_inc(SvRV(sstr), param));
f880fe2f 9686
83841fad 9687 }
3f7c398e 9688 else if (SvPVX_const(sstr)) {
83841fad
NIS
9689 /* Has something there */
9690 if (SvLEN(sstr)) {
68795e93 9691 /* Normal PV - clone whole allocated space */
3f7c398e 9692 SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
d3d0e6f1
NC
9693 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
9694 /* Not that normal - actually sstr is copy on write.
9695 But we are a true, independant SV, so: */
9696 SvREADONLY_off(dstr);
9697 SvFAKE_off(dstr);
9698 }
68795e93 9699 }
83841fad
NIS
9700 else {
9701 /* Special case - not normally malloced for some reason */
f7877b28
NC
9702 if (isGV_with_GP(sstr)) {
9703 /* Don't need to do anything here. */
9704 }
9705 else if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
ef10be65
NC
9706 /* A "shared" PV - clone it as "shared" PV */
9707 SvPV_set(dstr,
9708 HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
9709 param)));
83841fad
NIS
9710 }
9711 else {
9712 /* Some other special case - random pointer */
f880fe2f 9713 SvPV_set(dstr, SvPVX(sstr));
d3d0e6f1 9714 }
83841fad
NIS
9715 }
9716 }
9717 else {
4608196e 9718 /* Copy the NULL */
f880fe2f 9719 if (SvTYPE(dstr) == SVt_RV)
b162af07 9720 SvRV_set(dstr, NULL);
f880fe2f 9721 else
6136c704 9722 SvPV_set(dstr, NULL);
83841fad
NIS
9723 }
9724}
9725
662fb8b2
NC
9726/* duplicate an SV of any type (including AV, HV etc) */
9727
1d7c1841 9728SV *
eb86f8b3 9729Perl_sv_dup(pTHX_ const SV *sstr, CLONE_PARAMS* param)
1d7c1841 9730{
27da23d5 9731 dVAR;
1d7c1841
GS
9732 SV *dstr;
9733
9734 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
6136c704 9735 return NULL;
1d7c1841
GS
9736 /* look for it in the table first */
9737 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
9738 if (dstr)
9739 return dstr;
9740
0405e91e
AB
9741 if(param->flags & CLONEf_JOIN_IN) {
9742 /** We are joining here so we don't want do clone
9743 something that is bad **/
eb86f8b3
AL
9744 if (SvTYPE(sstr) == SVt_PVHV) {
9745 const char * const hvname = HvNAME_get(sstr);
9746 if (hvname)
9747 /** don't clone stashes if they already exist **/
9748 return (SV*)gv_stashpv(hvname,0);
0405e91e
AB
9749 }
9750 }
9751
1d7c1841
GS
9752 /* create anew and remember what it is */
9753 new_SV(dstr);
fd0854ff
DM
9754
9755#ifdef DEBUG_LEAKING_SCALARS
9756 dstr->sv_debug_optype = sstr->sv_debug_optype;
9757 dstr->sv_debug_line = sstr->sv_debug_line;
9758 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
9759 dstr->sv_debug_cloned = 1;
fd0854ff 9760 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
fd0854ff
DM
9761#endif
9762
1d7c1841
GS
9763 ptr_table_store(PL_ptr_table, sstr, dstr);
9764
9765 /* clone */
9766 SvFLAGS(dstr) = SvFLAGS(sstr);
9767 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
9768 SvREFCNT(dstr) = 0; /* must be before any other dups! */
9769
9770#ifdef DEBUGGING
3f7c398e 9771 if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
1d7c1841 9772 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
3f7c398e 9773 PL_watch_pvx, SvPVX_const(sstr));
1d7c1841
GS
9774#endif
9775
9660f481
DM
9776 /* don't clone objects whose class has asked us not to */
9777 if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
9778 SvFLAGS(dstr) &= ~SVTYPEMASK;
9779 SvOBJECT_off(dstr);
9780 return dstr;
9781 }
9782
1d7c1841
GS
9783 switch (SvTYPE(sstr)) {
9784 case SVt_NULL:
9785 SvANY(dstr) = NULL;
9786 break;
9787 case SVt_IV:
339049b0 9788 SvANY(dstr) = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
45977657 9789 SvIV_set(dstr, SvIVX(sstr));
1d7c1841
GS
9790 break;
9791 case SVt_NV:
9792 SvANY(dstr) = new_XNV();
9d6ce603 9793 SvNV_set(dstr, SvNVX(sstr));
1d7c1841
GS
9794 break;
9795 case SVt_RV:
339049b0 9796 SvANY(dstr) = &(dstr->sv_u.svu_rv);
83841fad 9797 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841 9798 break;
662fb8b2
NC
9799 default:
9800 {
9801 /* These are all the types that need complex bodies allocating. */
662fb8b2 9802 void *new_body;
2bcc16b3
NC
9803 const svtype sv_type = SvTYPE(sstr);
9804 const struct body_details *const sv_type_details
9805 = bodies_by_type + sv_type;
662fb8b2 9806
93e68bfb 9807 switch (sv_type) {
662fb8b2 9808 default:
bb263b4e 9809 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
662fb8b2
NC
9810 break;
9811
662fb8b2
NC
9812 case SVt_PVGV:
9813 if (GvUNIQUE((GV*)sstr)) {
bb263b4e 9814 /*EMPTY*/; /* Do sharing here, and fall through */
662fb8b2 9815 }
c22188b4
NC
9816 case SVt_PVIO:
9817 case SVt_PVFM:
9818 case SVt_PVHV:
9819 case SVt_PVAV:
93e68bfb 9820 case SVt_PVBM:
662fb8b2 9821 case SVt_PVCV:
662fb8b2 9822 case SVt_PVLV:
662fb8b2 9823 case SVt_PVMG:
662fb8b2 9824 case SVt_PVNV:
662fb8b2 9825 case SVt_PVIV:
662fb8b2 9826 case SVt_PV:
d2a0f284 9827 assert(sv_type_details->body_size);
c22188b4 9828 if (sv_type_details->arena) {
d2a0f284 9829 new_body_inline(new_body, sv_type);
c22188b4 9830 new_body
b9502f15 9831 = (void*)((char*)new_body - sv_type_details->offset);
c22188b4
NC
9832 } else {
9833 new_body = new_NOARENA(sv_type_details);
9834 }
1d7c1841 9835 }
662fb8b2
NC
9836 assert(new_body);
9837 SvANY(dstr) = new_body;
9838
2bcc16b3 9839#ifndef PURIFY
b9502f15
NC
9840 Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
9841 ((char*)SvANY(dstr)) + sv_type_details->offset,
f32993d6 9842 sv_type_details->copy, char);
2bcc16b3
NC
9843#else
9844 Copy(((char*)SvANY(sstr)),
9845 ((char*)SvANY(dstr)),
d2a0f284 9846 sv_type_details->body_size + sv_type_details->offset, char);
2bcc16b3 9847#endif
662fb8b2 9848
f7877b28
NC
9849 if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
9850 && !isGV_with_GP(dstr))
662fb8b2
NC
9851 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9852
9853 /* The Copy above means that all the source (unduplicated) pointers
9854 are now in the destination. We can check the flags and the
9855 pointers in either, but it's possible that there's less cache
9856 missing by always going for the destination.
9857 FIXME - instrument and check that assumption */
f32993d6 9858 if (sv_type >= SVt_PVMG) {
e736a858 9859 HV *ourstash;
2892acdb 9860 if ((sv_type == SVt_PVMG) && (ourstash = OURSTASH(dstr))) {
e736a858
NC
9861 OURSTASH_set(dstr, hv_dup_inc(ourstash, param));
9862 } else if (SvMAGIC(dstr))
662fb8b2
NC
9863 SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
9864 if (SvSTASH(dstr))
9865 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
1d7c1841 9866 }
662fb8b2 9867
f32993d6
NC
9868 /* The cast silences a GCC warning about unhandled types. */
9869 switch ((int)sv_type) {
662fb8b2
NC
9870 case SVt_PV:
9871 break;
9872 case SVt_PVIV:
9873 break;
9874 case SVt_PVNV:
9875 break;
9876 case SVt_PVMG:
9877 break;
9878 case SVt_PVBM:
9879 break;
9880 case SVt_PVLV:
9881 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
9882 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
9883 LvTARG(dstr) = dstr;
9884 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
9885 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(dstr), 0, param);
9886 else
9887 LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
9888 break;
9889 case SVt_PVGV:
acda4c6a
NC
9890 if (GvNAME_HEK(dstr))
9891 GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
f5c1e807 9892
e15faf7d
NC
9893 /* Don't call sv_add_backref here as it's going to be created
9894 as part of the magic cloning of the symbol table. */
f7877b28
NC
9895 GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
9896 if(isGV_with_GP(sstr)) {
9897 /* Danger Will Robinson - GvGP(dstr) isn't initialised
9898 at the point of this comment. */
9899 GvGP(dstr) = gp_dup(GvGP(sstr), param);
9900 (void)GpREFCNT_inc(GvGP(dstr));
9901 } else
9902 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
662fb8b2
NC
9903 break;
9904 case SVt_PVIO:
9905 IoIFP(dstr) = fp_dup(IoIFP(dstr), IoTYPE(dstr), param);
9906 if (IoOFP(dstr) == IoIFP(sstr))
9907 IoOFP(dstr) = IoIFP(dstr);
9908 else
9909 IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
9910 /* PL_rsfp_filters entries have fake IoDIRP() */
662fb8b2
NC
9911 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
9912 /* I have no idea why fake dirp (rsfps)
9913 should be treated differently but otherwise
9914 we end up with leaks -- sky*/
9915 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(dstr), param);
9916 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(dstr), param);
9917 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(dstr), param);
9918 } else {
9919 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(dstr), param);
9920 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(dstr), param);
9921 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(dstr), param);
100ce7e1
NC
9922 if (IoDIRP(dstr)) {
9923 IoDIRP(dstr) = dirp_dup(IoDIRP(dstr));
9924 } else {
bb263b4e 9925 /*EMPTY*/;
100ce7e1
NC
9926 /* IoDIRP(dstr) is already a copy of IoDIRP(sstr) */
9927 }
662fb8b2
NC
9928 }
9929 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(dstr));
9930 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(dstr));
9931 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(dstr));
9932 break;
9933 case SVt_PVAV:
9934 if (AvARRAY((AV*)sstr)) {
9935 SV **dst_ary, **src_ary;
9936 SSize_t items = AvFILLp((AV*)sstr) + 1;
9937
9938 src_ary = AvARRAY((AV*)sstr);
a02a5408 9939 Newxz(dst_ary, AvMAX((AV*)sstr)+1, SV*);
662fb8b2
NC
9940 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
9941 SvPV_set(dstr, (char*)dst_ary);
9942 AvALLOC((AV*)dstr) = dst_ary;
9943 if (AvREAL((AV*)sstr)) {
9944 while (items-- > 0)
9945 *dst_ary++ = sv_dup_inc(*src_ary++, param);
9946 }
9947 else {
9948 while (items-- > 0)
9949 *dst_ary++ = sv_dup(*src_ary++, param);
9950 }
9951 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
9952 while (items-- > 0) {
9953 *dst_ary++ = &PL_sv_undef;
9954 }
bfcb3514 9955 }
662fb8b2 9956 else {
bd61b366 9957 SvPV_set(dstr, NULL);
662fb8b2 9958 AvALLOC((AV*)dstr) = (SV**)NULL;
b79f7545 9959 }
662fb8b2
NC
9960 break;
9961 case SVt_PVHV:
9962 {
cbbf8932 9963 HEK *hvname = NULL;
662fb8b2
NC
9964
9965 if (HvARRAY((HV*)sstr)) {
9966 STRLEN i = 0;
9967 const bool sharekeys = !!HvSHAREKEYS(sstr);
9968 XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
9969 XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
9970 char *darray;
a02a5408 9971 Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
662fb8b2
NC
9972 + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
9973 char);
9974 HvARRAY(dstr) = (HE**)darray;
9975 while (i <= sxhv->xhv_max) {
5c4138a0 9976 const HE *source = HvARRAY(sstr)[i];
662fb8b2
NC
9977 HvARRAY(dstr)[i] = source
9978 ? he_dup(source, sharekeys, param) : 0;
9979 ++i;
9980 }
9981 if (SvOOK(sstr)) {
00b6aa41
AL
9982 struct xpvhv_aux * const saux = HvAUX(sstr);
9983 struct xpvhv_aux * const daux = HvAUX(dstr);
662fb8b2
NC
9984 /* This flag isn't copied. */
9985 /* SvOOK_on(hv) attacks the IV flags. */
9986 SvFLAGS(dstr) |= SVf_OOK;
9987
9988 hvname = saux->xhv_name;
dd690478
NC
9989 daux->xhv_name
9990 = hvname ? hek_dup(hvname, param) : hvname;
662fb8b2
NC
9991
9992 daux->xhv_riter = saux->xhv_riter;
9993 daux->xhv_eiter = saux->xhv_eiter
dd690478
NC
9994 ? he_dup(saux->xhv_eiter,
9995 (bool)!!HvSHAREKEYS(sstr), param) : 0;
86f55936
NC
9996 daux->xhv_backreferences = saux->xhv_backreferences
9997 ? (AV*) SvREFCNT_inc(
9998 sv_dup((SV*)saux->
9999 xhv_backreferences,
10000 param))
10001 : 0;
662fb8b2
NC
10002 }
10003 }
10004 else {
bd61b366 10005 SvPV_set(dstr, NULL);
662fb8b2
NC
10006 }
10007 /* Record stashes for possible cloning in Perl_clone(). */
10008 if(hvname)
10009 av_push(param->stashes, dstr);
10010 }
10011 break;
662fb8b2 10012 case SVt_PVCV:
bb172083
NC
10013 if (!(param->flags & CLONEf_COPY_STACKS)) {
10014 CvDEPTH(dstr) = 0;
10015 }
10016 case SVt_PVFM:
662fb8b2
NC
10017 /* NOTE: not refcounted */
10018 CvSTASH(dstr) = hv_dup(CvSTASH(dstr), param);
10019 OP_REFCNT_LOCK;
d04ba589
NC
10020 if (!CvISXSUB(dstr))
10021 CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
662fb8b2 10022 OP_REFCNT_UNLOCK;
cfae286e 10023 if (CvCONST(dstr) && CvISXSUB(dstr)) {
662fb8b2
NC
10024 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(dstr)) ?
10025 SvREFCNT_inc(CvXSUBANY(dstr).any_ptr) :
10026 sv_dup_inc((SV *)CvXSUBANY(dstr).any_ptr, param);
10027 }
10028 /* don't dup if copying back - CvGV isn't refcounted, so the
10029 * duped GV may never be freed. A bit of a hack! DAPM */
10030 CvGV(dstr) = (param->flags & CLONEf_JOIN_IN) ?
a0714e2c 10031 NULL : gv_dup(CvGV(dstr), param) ;
662fb8b2
NC
10032 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
10033 CvOUTSIDE(dstr) =
10034 CvWEAKOUTSIDE(sstr)
10035 ? cv_dup( CvOUTSIDE(dstr), param)
10036 : cv_dup_inc(CvOUTSIDE(dstr), param);
aed2304a 10037 if (!CvISXSUB(dstr))
662fb8b2
NC
10038 CvFILE(dstr) = SAVEPV(CvFILE(dstr));
10039 break;
bfcb3514 10040 }
1d7c1841 10041 }
1d7c1841
GS
10042 }
10043
10044 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
10045 ++PL_sv_objcount;
10046
10047 return dstr;
d2d73c3e 10048 }
1d7c1841 10049
645c22ef
DM
10050/* duplicate a context */
10051
1d7c1841 10052PERL_CONTEXT *
a8fc9800 10053Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
10054{
10055 PERL_CONTEXT *ncxs;
10056
10057 if (!cxs)
10058 return (PERL_CONTEXT*)NULL;
10059
10060 /* look for it in the table first */
10061 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
10062 if (ncxs)
10063 return ncxs;
10064
10065 /* create anew and remember what it is */
a02a5408 10066 Newxz(ncxs, max + 1, PERL_CONTEXT);
1d7c1841
GS
10067 ptr_table_store(PL_ptr_table, cxs, ncxs);
10068
10069 while (ix >= 0) {
c445ea15
AL
10070 PERL_CONTEXT * const cx = &cxs[ix];
10071 PERL_CONTEXT * const ncx = &ncxs[ix];
1d7c1841
GS
10072 ncx->cx_type = cx->cx_type;
10073 if (CxTYPE(cx) == CXt_SUBST) {
10074 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
10075 }
10076 else {
10077 ncx->blk_oldsp = cx->blk_oldsp;
10078 ncx->blk_oldcop = cx->blk_oldcop;
1d7c1841
GS
10079 ncx->blk_oldmarksp = cx->blk_oldmarksp;
10080 ncx->blk_oldscopesp = cx->blk_oldscopesp;
10081 ncx->blk_oldpm = cx->blk_oldpm;
10082 ncx->blk_gimme = cx->blk_gimme;
10083 switch (CxTYPE(cx)) {
10084 case CXt_SUB:
10085 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
10086 ? cv_dup_inc(cx->blk_sub.cv, param)
10087 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 10088 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 10089 ? av_dup_inc(cx->blk_sub.argarray, param)
7d49f689 10090 : NULL);
d2d73c3e 10091 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
10092 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
10093 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10094 ncx->blk_sub.lval = cx->blk_sub.lval;
f39bc417 10095 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
10096 break;
10097 case CXt_EVAL:
10098 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
10099 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 10100 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 10101 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 10102 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
f39bc417 10103 ncx->blk_eval.retop = cx->blk_eval.retop;
1d7c1841
GS
10104 break;
10105 case CXt_LOOP:
10106 ncx->blk_loop.label = cx->blk_loop.label;
10107 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
10108 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
10109 ncx->blk_loop.next_op = cx->blk_loop.next_op;
10110 ncx->blk_loop.last_op = cx->blk_loop.last_op;
10111 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
10112 ? cx->blk_loop.iterdata
d2d73c3e 10113 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
10114 ncx->blk_loop.oldcomppad
10115 = (PAD*)ptr_table_fetch(PL_ptr_table,
10116 cx->blk_loop.oldcomppad);
d2d73c3e
AB
10117 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
10118 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
10119 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
10120 ncx->blk_loop.iterix = cx->blk_loop.iterix;
10121 ncx->blk_loop.itermax = cx->blk_loop.itermax;
10122 break;
10123 case CXt_FORMAT:
d2d73c3e
AB
10124 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
10125 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
10126 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841 10127 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
f39bc417 10128 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
10129 break;
10130 case CXt_BLOCK:
10131 case CXt_NULL:
10132 break;
10133 }
10134 }
10135 --ix;
10136 }
10137 return ncxs;
10138}
10139
645c22ef
DM
10140/* duplicate a stack info structure */
10141
1d7c1841 10142PERL_SI *
a8fc9800 10143Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
10144{
10145 PERL_SI *nsi;
10146
10147 if (!si)
10148 return (PERL_SI*)NULL;
10149
10150 /* look for it in the table first */
10151 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
10152 if (nsi)
10153 return nsi;
10154
10155 /* create anew and remember what it is */
a02a5408 10156 Newxz(nsi, 1, PERL_SI);
1d7c1841
GS
10157 ptr_table_store(PL_ptr_table, si, nsi);
10158
d2d73c3e 10159 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
10160 nsi->si_cxix = si->si_cxix;
10161 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 10162 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 10163 nsi->si_type = si->si_type;
d2d73c3e
AB
10164 nsi->si_prev = si_dup(si->si_prev, param);
10165 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
10166 nsi->si_markoff = si->si_markoff;
10167
10168 return nsi;
10169}
10170
10171#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
10172#define TOPINT(ss,ix) ((ss)[ix].any_i32)
10173#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
10174#define TOPLONG(ss,ix) ((ss)[ix].any_long)
10175#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
10176#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
10177#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
10178#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
10179#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
10180#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
10181#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
10182#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
10183#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
10184#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
10185
10186/* XXXXX todo */
10187#define pv_dup_inc(p) SAVEPV(p)
10188#define pv_dup(p) SAVEPV(p)
10189#define svp_dup_inc(p,pp) any_dup(p,pp)
10190
645c22ef
DM
10191/* map any object to the new equivent - either something in the
10192 * ptr table, or something in the interpreter structure
10193 */
10194
1d7c1841 10195void *
53c1dcc0 10196Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
1d7c1841
GS
10197{
10198 void *ret;
10199
10200 if (!v)
10201 return (void*)NULL;
10202
10203 /* look for it in the table first */
10204 ret = ptr_table_fetch(PL_ptr_table, v);
10205 if (ret)
10206 return ret;
10207
10208 /* see if it is part of the interpreter structure */
10209 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 10210 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 10211 else {
1d7c1841 10212 ret = v;
05ec9bb3 10213 }
1d7c1841
GS
10214
10215 return ret;
10216}
10217
645c22ef
DM
10218/* duplicate the save stack */
10219
1d7c1841 10220ANY *
a8fc9800 10221Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841 10222{
53c1dcc0
AL
10223 ANY * const ss = proto_perl->Tsavestack;
10224 const I32 max = proto_perl->Tsavestack_max;
10225 I32 ix = proto_perl->Tsavestack_ix;
1d7c1841
GS
10226 ANY *nss;
10227 SV *sv;
10228 GV *gv;
10229 AV *av;
10230 HV *hv;
10231 void* ptr;
10232 int intval;
10233 long longval;
10234 GP *gp;
10235 IV iv;
c4e33207 10236 char *c = NULL;
1d7c1841 10237 void (*dptr) (void*);
acfe0abc 10238 void (*dxptr) (pTHX_ void*);
1d7c1841 10239
a02a5408 10240 Newxz(nss, max, ANY);
1d7c1841
GS
10241
10242 while (ix > 0) {
b464bac0 10243 I32 i = POPINT(ss,ix);
1d7c1841
GS
10244 TOPINT(nss,ix) = i;
10245 switch (i) {
10246 case SAVEt_ITEM: /* normal string */
10247 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10248 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10249 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10250 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10251 break;
10252 case SAVEt_SV: /* scalar reference */
10253 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10254 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10255 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10256 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 10257 break;
f4dd75d9
GS
10258 case SAVEt_GENERIC_PVREF: /* generic char* */
10259 c = (char*)POPPTR(ss,ix);
10260 TOPPTR(nss,ix) = pv_dup(c);
10261 ptr = POPPTR(ss,ix);
10262 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10263 break;
05ec9bb3
NIS
10264 case SAVEt_SHARED_PVREF: /* char* in shared space */
10265 c = (char*)POPPTR(ss,ix);
10266 TOPPTR(nss,ix) = savesharedpv(c);
10267 ptr = POPPTR(ss,ix);
10268 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10269 break;
1d7c1841
GS
10270 case SAVEt_GENERIC_SVREF: /* generic sv */
10271 case SAVEt_SVREF: /* scalar reference */
10272 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10273 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10274 ptr = POPPTR(ss,ix);
10275 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
10276 break;
10277 case SAVEt_AV: /* array reference */
10278 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10279 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 10280 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10281 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10282 break;
10283 case SAVEt_HV: /* hash reference */
10284 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10285 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 10286 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10287 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10288 break;
10289 case SAVEt_INT: /* int reference */
10290 ptr = POPPTR(ss,ix);
10291 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10292 intval = (int)POPINT(ss,ix);
10293 TOPINT(nss,ix) = intval;
10294 break;
10295 case SAVEt_LONG: /* long reference */
10296 ptr = POPPTR(ss,ix);
10297 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10298 longval = (long)POPLONG(ss,ix);
10299 TOPLONG(nss,ix) = longval;
10300 break;
10301 case SAVEt_I32: /* I32 reference */
10302 case SAVEt_I16: /* I16 reference */
10303 case SAVEt_I8: /* I8 reference */
10304 ptr = POPPTR(ss,ix);
10305 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10306 i = POPINT(ss,ix);
10307 TOPINT(nss,ix) = i;
10308 break;
10309 case SAVEt_IV: /* IV reference */
10310 ptr = POPPTR(ss,ix);
10311 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10312 iv = POPIV(ss,ix);
10313 TOPIV(nss,ix) = iv;
10314 break;
10315 case SAVEt_SPTR: /* SV* reference */
10316 ptr = POPPTR(ss,ix);
10317 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10318 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10319 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
10320 break;
10321 case SAVEt_VPTR: /* random* reference */
10322 ptr = POPPTR(ss,ix);
10323 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10324 ptr = POPPTR(ss,ix);
10325 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10326 break;
10327 case SAVEt_PPTR: /* char* reference */
10328 ptr = POPPTR(ss,ix);
10329 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10330 c = (char*)POPPTR(ss,ix);
10331 TOPPTR(nss,ix) = pv_dup(c);
10332 break;
10333 case SAVEt_HPTR: /* HV* reference */
10334 ptr = POPPTR(ss,ix);
10335 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10336 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10337 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
10338 break;
10339 case SAVEt_APTR: /* AV* reference */
10340 ptr = POPPTR(ss,ix);
10341 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10342 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10343 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
10344 break;
10345 case SAVEt_NSTAB:
10346 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10347 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10348 break;
10349 case SAVEt_GP: /* scalar reference */
10350 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 10351 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
10352 (void)GpREFCNT_inc(gp);
10353 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 10354 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
10355 c = (char*)POPPTR(ss,ix);
10356 TOPPTR(nss,ix) = pv_dup(c);
10357 iv = POPIV(ss,ix);
10358 TOPIV(nss,ix) = iv;
10359 iv = POPIV(ss,ix);
10360 TOPIV(nss,ix) = iv;
10361 break;
10362 case SAVEt_FREESV:
26d9b02f 10363 case SAVEt_MORTALIZESV:
1d7c1841 10364 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10365 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10366 break;
10367 case SAVEt_FREEOP:
10368 ptr = POPPTR(ss,ix);
10369 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
10370 /* these are assumed to be refcounted properly */
53c1dcc0 10371 OP *o;
1d7c1841
GS
10372 switch (((OP*)ptr)->op_type) {
10373 case OP_LEAVESUB:
10374 case OP_LEAVESUBLV:
10375 case OP_LEAVEEVAL:
10376 case OP_LEAVE:
10377 case OP_SCOPE:
10378 case OP_LEAVEWRITE:
e977893f
GS
10379 TOPPTR(nss,ix) = ptr;
10380 o = (OP*)ptr;
10381 OpREFCNT_inc(o);
1d7c1841
GS
10382 break;
10383 default:
5f66b61c 10384 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
10385 break;
10386 }
10387 }
10388 else
5f66b61c 10389 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
10390 break;
10391 case SAVEt_FREEPV:
10392 c = (char*)POPPTR(ss,ix);
10393 TOPPTR(nss,ix) = pv_dup_inc(c);
10394 break;
10395 case SAVEt_CLEARSV:
10396 longval = POPLONG(ss,ix);
10397 TOPLONG(nss,ix) = longval;
10398 break;
10399 case SAVEt_DELETE:
10400 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10401 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10402 c = (char*)POPPTR(ss,ix);
10403 TOPPTR(nss,ix) = pv_dup_inc(c);
10404 i = POPINT(ss,ix);
10405 TOPINT(nss,ix) = i;
10406 break;
10407 case SAVEt_DESTRUCTOR:
10408 ptr = POPPTR(ss,ix);
10409 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10410 dptr = POPDPTR(ss,ix);
8141890a
JH
10411 TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
10412 any_dup(FPTR2DPTR(void *, dptr),
10413 proto_perl));
1d7c1841
GS
10414 break;
10415 case SAVEt_DESTRUCTOR_X:
10416 ptr = POPPTR(ss,ix);
10417 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10418 dxptr = POPDXPTR(ss,ix);
8141890a
JH
10419 TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
10420 any_dup(FPTR2DPTR(void *, dxptr),
10421 proto_perl));
1d7c1841
GS
10422 break;
10423 case SAVEt_REGCONTEXT:
10424 case SAVEt_ALLOC:
10425 i = POPINT(ss,ix);
10426 TOPINT(nss,ix) = i;
10427 ix -= i;
10428 break;
10429 case SAVEt_STACK_POS: /* Position on Perl stack */
10430 i = POPINT(ss,ix);
10431 TOPINT(nss,ix) = i;
10432 break;
10433 case SAVEt_AELEM: /* array element */
10434 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10435 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10436 i = POPINT(ss,ix);
10437 TOPINT(nss,ix) = i;
10438 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10439 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
10440 break;
10441 case SAVEt_HELEM: /* hash element */
10442 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10443 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10444 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10445 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10446 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10447 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10448 break;
10449 case SAVEt_OP:
10450 ptr = POPPTR(ss,ix);
10451 TOPPTR(nss,ix) = ptr;
10452 break;
10453 case SAVEt_HINTS:
10454 i = POPINT(ss,ix);
10455 TOPINT(nss,ix) = i;
10456 break;
c4410b1b
GS
10457 case SAVEt_COMPPAD:
10458 av = (AV*)POPPTR(ss,ix);
58ed4fbe 10459 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 10460 break;
c3564e5c
GS
10461 case SAVEt_PADSV:
10462 longval = (long)POPLONG(ss,ix);
10463 TOPLONG(nss,ix) = longval;
10464 ptr = POPPTR(ss,ix);
10465 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10466 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10467 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 10468 break;
a1bb4754 10469 case SAVEt_BOOL:
38d8b13e 10470 ptr = POPPTR(ss,ix);
b9609c01 10471 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 10472 longval = (long)POPBOOL(ss,ix);
b9609c01 10473 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 10474 break;
8bd2680e
MHM
10475 case SAVEt_SET_SVFLAGS:
10476 i = POPINT(ss,ix);
10477 TOPINT(nss,ix) = i;
10478 i = POPINT(ss,ix);
10479 TOPINT(nss,ix) = i;
10480 sv = (SV*)POPPTR(ss,ix);
10481 TOPPTR(nss,ix) = sv_dup(sv, param);
10482 break;
1d7c1841
GS
10483 default:
10484 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
10485 }
10486 }
10487
bd81e77b
NC
10488 return nss;
10489}
10490
10491
10492/* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
10493 * flag to the result. This is done for each stash before cloning starts,
10494 * so we know which stashes want their objects cloned */
10495
10496static void
10497do_mark_cloneable_stash(pTHX_ SV *sv)
10498{
10499 const HEK * const hvname = HvNAME_HEK((HV*)sv);
10500 if (hvname) {
10501 GV* const cloner = gv_fetchmethod_autoload((HV*)sv, "CLONE_SKIP", 0);
10502 SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
10503 if (cloner && GvCV(cloner)) {
10504 dSP;
10505 UV status;
10506
10507 ENTER;
10508 SAVETMPS;
10509 PUSHMARK(SP);
10510 XPUSHs(sv_2mortal(newSVhek(hvname)));
10511 PUTBACK;
10512 call_sv((SV*)GvCV(cloner), G_SCALAR);
10513 SPAGAIN;
10514 status = POPu;
10515 PUTBACK;
10516 FREETMPS;
10517 LEAVE;
10518 if (status)
10519 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
10520 }
10521 }
10522}
10523
10524
10525
10526/*
10527=for apidoc perl_clone
10528
10529Create and return a new interpreter by cloning the current one.
10530
10531perl_clone takes these flags as parameters:
10532
10533CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
10534without it we only clone the data and zero the stacks,
10535with it we copy the stacks and the new perl interpreter is
10536ready to run at the exact same point as the previous one.
10537The pseudo-fork code uses COPY_STACKS while the
10538threads->new doesn't.
10539
10540CLONEf_KEEP_PTR_TABLE
10541perl_clone keeps a ptr_table with the pointer of the old
10542variable as a key and the new variable as a value,
10543this allows it to check if something has been cloned and not
10544clone it again but rather just use the value and increase the
10545refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
10546the ptr_table using the function
10547C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
10548reason to keep it around is if you want to dup some of your own
10549variable who are outside the graph perl scans, example of this
10550code is in threads.xs create
10551
10552CLONEf_CLONE_HOST
10553This is a win32 thing, it is ignored on unix, it tells perls
10554win32host code (which is c++) to clone itself, this is needed on
10555win32 if you want to run two threads at the same time,
10556if you just want to do some stuff in a separate perl interpreter
10557and then throw it away and return to the original one,
10558you don't need to do anything.
10559
10560=cut
10561*/
10562
10563/* XXX the above needs expanding by someone who actually understands it ! */
10564EXTERN_C PerlInterpreter *
10565perl_clone_host(PerlInterpreter* proto_perl, UV flags);
10566
10567PerlInterpreter *
10568perl_clone(PerlInterpreter *proto_perl, UV flags)
10569{
10570 dVAR;
10571#ifdef PERL_IMPLICIT_SYS
10572
10573 /* perlhost.h so we need to call into it
10574 to clone the host, CPerlHost should have a c interface, sky */
10575
10576 if (flags & CLONEf_CLONE_HOST) {
10577 return perl_clone_host(proto_perl,flags);
10578 }
10579 return perl_clone_using(proto_perl, flags,
10580 proto_perl->IMem,
10581 proto_perl->IMemShared,
10582 proto_perl->IMemParse,
10583 proto_perl->IEnv,
10584 proto_perl->IStdIO,
10585 proto_perl->ILIO,
10586 proto_perl->IDir,
10587 proto_perl->ISock,
10588 proto_perl->IProc);
10589}
10590
10591PerlInterpreter *
10592perl_clone_using(PerlInterpreter *proto_perl, UV flags,
10593 struct IPerlMem* ipM, struct IPerlMem* ipMS,
10594 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
10595 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
10596 struct IPerlDir* ipD, struct IPerlSock* ipS,
10597 struct IPerlProc* ipP)
10598{
10599 /* XXX many of the string copies here can be optimized if they're
10600 * constants; they need to be allocated as common memory and just
10601 * their pointers copied. */
10602
10603 IV i;
10604 CLONE_PARAMS clone_params;
5f66b61c 10605 CLONE_PARAMS* const param = &clone_params;
bd81e77b 10606
5f66b61c 10607 PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
bd81e77b
NC
10608 /* for each stash, determine whether its objects should be cloned */
10609 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
10610 PERL_SET_THX(my_perl);
10611
10612# ifdef DEBUGGING
10613 Poison(my_perl, 1, PerlInterpreter);
5f66b61c
AL
10614 PL_op = NULL;
10615 PL_curcop = NULL;
bd81e77b
NC
10616 PL_markstack = 0;
10617 PL_scopestack = 0;
10618 PL_savestack = 0;
10619 PL_savestack_ix = 0;
10620 PL_savestack_max = -1;
10621 PL_sig_pending = 0;
10622 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
10623# else /* !DEBUGGING */
10624 Zero(my_perl, 1, PerlInterpreter);
10625# endif /* DEBUGGING */
10626
10627 /* host pointers */
10628 PL_Mem = ipM;
10629 PL_MemShared = ipMS;
10630 PL_MemParse = ipMP;
10631 PL_Env = ipE;
10632 PL_StdIO = ipStd;
10633 PL_LIO = ipLIO;
10634 PL_Dir = ipD;
10635 PL_Sock = ipS;
10636 PL_Proc = ipP;
10637#else /* !PERL_IMPLICIT_SYS */
10638 IV i;
10639 CLONE_PARAMS clone_params;
10640 CLONE_PARAMS* param = &clone_params;
5f66b61c 10641 PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
bd81e77b
NC
10642 /* for each stash, determine whether its objects should be cloned */
10643 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
10644 PERL_SET_THX(my_perl);
10645
10646# ifdef DEBUGGING
10647 Poison(my_perl, 1, PerlInterpreter);
5f66b61c
AL
10648 PL_op = NULL;
10649 PL_curcop = NULL;
bd81e77b
NC
10650 PL_markstack = 0;
10651 PL_scopestack = 0;
10652 PL_savestack = 0;
10653 PL_savestack_ix = 0;
10654 PL_savestack_max = -1;
10655 PL_sig_pending = 0;
10656 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
10657# else /* !DEBUGGING */
10658 Zero(my_perl, 1, PerlInterpreter);
10659# endif /* DEBUGGING */
10660#endif /* PERL_IMPLICIT_SYS */
10661 param->flags = flags;
10662 param->proto_perl = proto_perl;
10663
7cb608b5
NC
10664 INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
10665
fdda85ca 10666 PL_body_arenas = NULL;
bd81e77b
NC
10667 Zero(&PL_body_roots, 1, PL_body_roots);
10668
10669 PL_nice_chunk = NULL;
10670 PL_nice_chunk_size = 0;
10671 PL_sv_count = 0;
10672 PL_sv_objcount = 0;
a0714e2c
SS
10673 PL_sv_root = NULL;
10674 PL_sv_arenaroot = NULL;
bd81e77b
NC
10675
10676 PL_debug = proto_perl->Idebug;
10677
10678 PL_hash_seed = proto_perl->Ihash_seed;
10679 PL_rehash_seed = proto_perl->Irehash_seed;
10680
10681#ifdef USE_REENTRANT_API
10682 /* XXX: things like -Dm will segfault here in perlio, but doing
10683 * PERL_SET_CONTEXT(proto_perl);
10684 * breaks too many other things
10685 */
10686 Perl_reentrant_init(aTHX);
10687#endif
10688
10689 /* create SV map for pointer relocation */
10690 PL_ptr_table = ptr_table_new();
10691
10692 /* initialize these special pointers as early as possible */
10693 SvANY(&PL_sv_undef) = NULL;
10694 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
10695 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
10696 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
10697
10698 SvANY(&PL_sv_no) = new_XPVNV();
10699 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
10700 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
10701 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
10702 SvPV_set(&PL_sv_no, SAVEPVN(PL_No, 0));
10703 SvCUR_set(&PL_sv_no, 0);
10704 SvLEN_set(&PL_sv_no, 1);
10705 SvIV_set(&PL_sv_no, 0);
10706 SvNV_set(&PL_sv_no, 0);
10707 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
10708
10709 SvANY(&PL_sv_yes) = new_XPVNV();
10710 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
10711 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
10712 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
10713 SvPV_set(&PL_sv_yes, SAVEPVN(PL_Yes, 1));
10714 SvCUR_set(&PL_sv_yes, 1);
10715 SvLEN_set(&PL_sv_yes, 2);
10716 SvIV_set(&PL_sv_yes, 1);
10717 SvNV_set(&PL_sv_yes, 1);
10718 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
10719
10720 /* create (a non-shared!) shared string table */
10721 PL_strtab = newHV();
10722 HvSHAREKEYS_off(PL_strtab);
10723 hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
10724 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
10725
10726 PL_compiling = proto_perl->Icompiling;
10727
10728 /* These two PVs will be free'd special way so must set them same way op.c does */
10729 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
10730 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
10731
10732 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
10733 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
10734
10735 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
10736 if (!specialWARN(PL_compiling.cop_warnings))
10737 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
10738 if (!specialCopIO(PL_compiling.cop_io))
10739 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
10740 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
10741
10742 /* pseudo environmental stuff */
10743 PL_origargc = proto_perl->Iorigargc;
10744 PL_origargv = proto_perl->Iorigargv;
10745
10746 param->stashes = newAV(); /* Setup array of objects to call clone on */
10747
10748 /* Set tainting stuff before PerlIO_debug can possibly get called */
10749 PL_tainting = proto_perl->Itainting;
10750 PL_taint_warn = proto_perl->Itaint_warn;
10751
10752#ifdef PERLIO_LAYERS
10753 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
10754 PerlIO_clone(aTHX_ proto_perl, param);
10755#endif
10756
10757 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
10758 PL_incgv = gv_dup(proto_perl->Iincgv, param);
10759 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
10760 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
10761 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
10762 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
10763
10764 /* switches */
10765 PL_minus_c = proto_perl->Iminus_c;
10766 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
10767 PL_localpatches = proto_perl->Ilocalpatches;
10768 PL_splitstr = proto_perl->Isplitstr;
10769 PL_preprocess = proto_perl->Ipreprocess;
10770 PL_minus_n = proto_perl->Iminus_n;
10771 PL_minus_p = proto_perl->Iminus_p;
10772 PL_minus_l = proto_perl->Iminus_l;
10773 PL_minus_a = proto_perl->Iminus_a;
bc9b29db 10774 PL_minus_E = proto_perl->Iminus_E;
bd81e77b
NC
10775 PL_minus_F = proto_perl->Iminus_F;
10776 PL_doswitches = proto_perl->Idoswitches;
10777 PL_dowarn = proto_perl->Idowarn;
10778 PL_doextract = proto_perl->Idoextract;
10779 PL_sawampersand = proto_perl->Isawampersand;
10780 PL_unsafe = proto_perl->Iunsafe;
10781 PL_inplace = SAVEPV(proto_perl->Iinplace);
10782 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
10783 PL_perldb = proto_perl->Iperldb;
10784 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
10785 PL_exit_flags = proto_perl->Iexit_flags;
10786
10787 /* magical thingies */
10788 /* XXX time(&PL_basetime) when asked for? */
10789 PL_basetime = proto_perl->Ibasetime;
10790 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
10791
10792 PL_maxsysfd = proto_perl->Imaxsysfd;
10793 PL_multiline = proto_perl->Imultiline;
10794 PL_statusvalue = proto_perl->Istatusvalue;
10795#ifdef VMS
10796 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
10797#else
10798 PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
10799#endif
10800 PL_encoding = sv_dup(proto_perl->Iencoding, param);
10801
10802 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
10803 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
10804 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
10805
10806 /* Clone the regex array */
10807 PL_regex_padav = newAV();
10808 {
10809 const I32 len = av_len((AV*)proto_perl->Iregex_padav);
7a5b473e 10810 SV* const * const regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
bd81e77b 10811 IV i;
7f466ec7 10812 av_push(PL_regex_padav, sv_dup_inc_NN(regexen[0],param));
bd81e77b 10813 for(i = 1; i <= len; i++) {
7a5b473e
AL
10814 const SV * const regex = regexen[i];
10815 SV * const sv =
10816 SvREPADTMP(regex)
10817 ? sv_dup_inc(regex, param)
10818 : SvREFCNT_inc(
10819 newSViv(PTR2IV(re_dup(
10820 INT2PTR(REGEXP *, SvIVX(regex)), param))))
10821 ;
10822 av_push(PL_regex_padav, sv);
bd81e77b
NC
10823 }
10824 }
10825 PL_regex_pad = AvARRAY(PL_regex_padav);
10826
10827 /* shortcuts to various I/O objects */
10828 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
10829 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
10830 PL_defgv = gv_dup(proto_perl->Idefgv, param);
10831 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
10832 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
10833 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841 10834
bd81e77b
NC
10835 /* shortcuts to regexp stuff */
10836 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
9660f481 10837
bd81e77b
NC
10838 /* shortcuts to misc objects */
10839 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
9660f481 10840
bd81e77b
NC
10841 /* shortcuts to debugging objects */
10842 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
10843 PL_DBline = gv_dup(proto_perl->IDBline, param);
10844 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
10845 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
10846 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
10847 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
10848 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
10849 PL_lineary = av_dup(proto_perl->Ilineary, param);
10850 PL_dbargs = av_dup(proto_perl->Idbargs, param);
9660f481 10851
bd81e77b
NC
10852 /* symbol tables */
10853 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
10854 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
10855 PL_debstash = hv_dup(proto_perl->Idebstash, param);
10856 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
10857 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
10858
10859 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
10860 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
10861 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
10862 PL_endav = av_dup_inc(proto_perl->Iendav, param);
10863 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
10864 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
10865
10866 PL_sub_generation = proto_perl->Isub_generation;
10867
10868 /* funky return mechanisms */
10869 PL_forkprocess = proto_perl->Iforkprocess;
10870
10871 /* subprocess state */
10872 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
10873
10874 /* internal state */
10875 PL_maxo = proto_perl->Imaxo;
10876 if (proto_perl->Iop_mask)
10877 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
10878 else
bd61b366 10879 PL_op_mask = NULL;
bd81e77b
NC
10880 /* PL_asserting = proto_perl->Iasserting; */
10881
10882 /* current interpreter roots */
10883 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
10884 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
10885 PL_main_start = proto_perl->Imain_start;
10886 PL_eval_root = proto_perl->Ieval_root;
10887 PL_eval_start = proto_perl->Ieval_start;
10888
10889 /* runtime control stuff */
10890 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
10891 PL_copline = proto_perl->Icopline;
10892
10893 PL_filemode = proto_perl->Ifilemode;
10894 PL_lastfd = proto_perl->Ilastfd;
10895 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
10896 PL_Argv = NULL;
bd61b366 10897 PL_Cmd = NULL;
bd81e77b
NC
10898 PL_gensym = proto_perl->Igensym;
10899 PL_preambled = proto_perl->Ipreambled;
10900 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
10901 PL_laststatval = proto_perl->Ilaststatval;
10902 PL_laststype = proto_perl->Ilaststype;
a0714e2c 10903 PL_mess_sv = NULL;
bd81e77b
NC
10904
10905 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
10906
10907 /* interpreter atexit processing */
10908 PL_exitlistlen = proto_perl->Iexitlistlen;
10909 if (PL_exitlistlen) {
10910 Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
10911 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
9660f481 10912 }
bd81e77b
NC
10913 else
10914 PL_exitlist = (PerlExitListEntry*)NULL;
f16dd614
DM
10915
10916 PL_my_cxt_size = proto_perl->Imy_cxt_size;
4c901e72 10917 if (PL_my_cxt_size) {
f16dd614
DM
10918 Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
10919 Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
10920 }
10921 else
10922 PL_my_cxt_list = (void**)NULL;
bd81e77b
NC
10923 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
10924 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
10925 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
10926
10927 PL_profiledata = NULL;
10928 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
10929 /* PL_rsfp_filters entries have fake IoDIRP() */
10930 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
9660f481 10931
bd81e77b 10932 PL_compcv = cv_dup(proto_perl->Icompcv, param);
9660f481 10933
bd81e77b 10934 PAD_CLONE_VARS(proto_perl, param);
9660f481 10935
bd81e77b
NC
10936#ifdef HAVE_INTERP_INTERN
10937 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
10938#endif
645c22ef 10939
bd81e77b
NC
10940 /* more statics moved here */
10941 PL_generation = proto_perl->Igeneration;
10942 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
645c22ef 10943
bd81e77b
NC
10944 PL_in_clean_objs = proto_perl->Iin_clean_objs;
10945 PL_in_clean_all = proto_perl->Iin_clean_all;
6a78b4db 10946
bd81e77b
NC
10947 PL_uid = proto_perl->Iuid;
10948 PL_euid = proto_perl->Ieuid;
10949 PL_gid = proto_perl->Igid;
10950 PL_egid = proto_perl->Iegid;
10951 PL_nomemok = proto_perl->Inomemok;
10952 PL_an = proto_perl->Ian;
10953 PL_evalseq = proto_perl->Ievalseq;
10954 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
10955 PL_origalen = proto_perl->Iorigalen;
10956#ifdef PERL_USES_PL_PIDSTATUS
10957 PL_pidstatus = newHV(); /* XXX flag for cloning? */
10958#endif
10959 PL_osname = SAVEPV(proto_perl->Iosname);
10960 PL_sighandlerp = proto_perl->Isighandlerp;
6a78b4db 10961
bd81e77b 10962 PL_runops = proto_perl->Irunops;
6a78b4db 10963
bd81e77b 10964 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
6a78b4db 10965
bd81e77b
NC
10966#ifdef CSH
10967 PL_cshlen = proto_perl->Icshlen;
10968 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
10969#endif
645c22ef 10970
bd81e77b
NC
10971 PL_lex_state = proto_perl->Ilex_state;
10972 PL_lex_defer = proto_perl->Ilex_defer;
10973 PL_lex_expect = proto_perl->Ilex_expect;
10974 PL_lex_formbrack = proto_perl->Ilex_formbrack;
10975 PL_lex_dojoin = proto_perl->Ilex_dojoin;
10976 PL_lex_starts = proto_perl->Ilex_starts;
10977 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
10978 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
10979 PL_lex_op = proto_perl->Ilex_op;
10980 PL_lex_inpat = proto_perl->Ilex_inpat;
10981 PL_lex_inwhat = proto_perl->Ilex_inwhat;
10982 PL_lex_brackets = proto_perl->Ilex_brackets;
10983 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
10984 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
10985 PL_lex_casemods = proto_perl->Ilex_casemods;
10986 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
10987 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
645c22ef 10988
5db06880
NC
10989#ifdef PERL_MAD
10990 Copy(proto_perl->Inexttoke, PL_nexttoke, 5, NEXTTOKE);
10991 PL_lasttoke = proto_perl->Ilasttoke;
5336380d
NC
10992 PL_realtokenstart = proto_perl->Irealtokenstart;
10993 PL_faketokens = proto_perl->Ifaketokens;
10994 PL_thismad = proto_perl->Ithismad;
10995 PL_thistoken = proto_perl->Ithistoken;
10996 PL_thisopen = proto_perl->Ithisopen;
10997 PL_thisstuff = proto_perl->Ithisstuff;
10998 PL_thisclose = proto_perl->Ithisclose;
10999 PL_thiswhite = proto_perl->Ithiswhite;
11000 PL_nextwhite = proto_perl->Inextwhite;
11001 PL_skipwhite = proto_perl->Iskipwhite;
11002 PL_endwhite = proto_perl->Iendwhite;
11003 PL_curforce = proto_perl->Icurforce;
5db06880 11004#else
bd81e77b
NC
11005 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
11006 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
11007 PL_nexttoke = proto_perl->Inexttoke;
5db06880 11008#endif
c43294b8 11009
bd81e77b
NC
11010 /* XXX This is probably masking the deeper issue of why
11011 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
11012 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
11013 * (A little debugging with a watchpoint on it may help.)
11014 */
11015 if (SvANY(proto_perl->Ilinestr)) {
11016 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
11017 i = proto_perl->Ibufptr - SvPVX_const(proto_perl->Ilinestr);
11018 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11019 i = proto_perl->Ioldbufptr - SvPVX_const(proto_perl->Ilinestr);
11020 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11021 i = proto_perl->Ioldoldbufptr - SvPVX_const(proto_perl->Ilinestr);
11022 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11023 i = proto_perl->Ilinestart - SvPVX_const(proto_perl->Ilinestr);
11024 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11025 }
11026 else {
561b68a9 11027 PL_linestr = newSV(79);
bd81e77b
NC
11028 sv_upgrade(PL_linestr,SVt_PVIV);
11029 sv_setpvn(PL_linestr,"",0);
11030 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
11031 }
11032 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
11033 PL_pending_ident = proto_perl->Ipending_ident;
11034 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
11035
11036 PL_expect = proto_perl->Iexpect;
11037
11038 PL_multi_start = proto_perl->Imulti_start;
11039 PL_multi_end = proto_perl->Imulti_end;
11040 PL_multi_open = proto_perl->Imulti_open;
11041 PL_multi_close = proto_perl->Imulti_close;
11042
11043 PL_error_count = proto_perl->Ierror_count;
11044 PL_subline = proto_perl->Isubline;
11045 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
c43294b8 11046
bd81e77b
NC
11047 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
11048 if (SvANY(proto_perl->Ilinestr)) {
11049 i = proto_perl->Ilast_uni - SvPVX_const(proto_perl->Ilinestr);
11050 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11051 i = proto_perl->Ilast_lop - SvPVX_const(proto_perl->Ilinestr);
11052 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11053 PL_last_lop_op = proto_perl->Ilast_lop_op;
11054 }
11055 else {
11056 PL_last_uni = SvPVX(PL_linestr);
11057 PL_last_lop = SvPVX(PL_linestr);
11058 PL_last_lop_op = 0;
11059 }
11060 PL_in_my = proto_perl->Iin_my;
11061 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
11062#ifdef FCRYPT
11063 PL_cryptseen = proto_perl->Icryptseen;
11064#endif
1d7c1841 11065
bd81e77b 11066 PL_hints = proto_perl->Ihints;
1d7c1841 11067
bd81e77b 11068 PL_amagic_generation = proto_perl->Iamagic_generation;
d2d73c3e 11069
bd81e77b
NC
11070#ifdef USE_LOCALE_COLLATE
11071 PL_collation_ix = proto_perl->Icollation_ix;
11072 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
11073 PL_collation_standard = proto_perl->Icollation_standard;
11074 PL_collxfrm_base = proto_perl->Icollxfrm_base;
11075 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
11076#endif /* USE_LOCALE_COLLATE */
1d7c1841 11077
bd81e77b
NC
11078#ifdef USE_LOCALE_NUMERIC
11079 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
11080 PL_numeric_standard = proto_perl->Inumeric_standard;
11081 PL_numeric_local = proto_perl->Inumeric_local;
11082 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
11083#endif /* !USE_LOCALE_NUMERIC */
1d7c1841 11084
bd81e77b
NC
11085 /* utf8 character classes */
11086 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
11087 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
11088 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
11089 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
11090 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
11091 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
11092 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
11093 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
11094 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
11095 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
11096 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
11097 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
11098 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
11099 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
11100 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
11101 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
11102 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
11103 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
11104 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
11105 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 11106
bd81e77b
NC
11107 /* Did the locale setup indicate UTF-8? */
11108 PL_utf8locale = proto_perl->Iutf8locale;
11109 /* Unicode features (see perlrun/-C) */
11110 PL_unicode = proto_perl->Iunicode;
1d7c1841 11111
bd81e77b
NC
11112 /* Pre-5.8 signals control */
11113 PL_signals = proto_perl->Isignals;
1d7c1841 11114
bd81e77b
NC
11115 /* times() ticks per second */
11116 PL_clocktick = proto_perl->Iclocktick;
1d7c1841 11117
bd81e77b
NC
11118 /* Recursion stopper for PerlIO_find_layer */
11119 PL_in_load_module = proto_perl->Iin_load_module;
8df990a8 11120
bd81e77b
NC
11121 /* sort() routine */
11122 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
e5dd39fc 11123
bd81e77b
NC
11124 /* Not really needed/useful since the reenrant_retint is "volatile",
11125 * but do it for consistency's sake. */
11126 PL_reentrant_retint = proto_perl->Ireentrant_retint;
1d7c1841 11127
bd81e77b
NC
11128 /* Hooks to shared SVs and locks. */
11129 PL_sharehook = proto_perl->Isharehook;
11130 PL_lockhook = proto_perl->Ilockhook;
11131 PL_unlockhook = proto_perl->Iunlockhook;
11132 PL_threadhook = proto_perl->Ithreadhook;
1d7c1841 11133
bd81e77b
NC
11134 PL_runops_std = proto_perl->Irunops_std;
11135 PL_runops_dbg = proto_perl->Irunops_dbg;
1d7c1841 11136
bd81e77b
NC
11137#ifdef THREADS_HAVE_PIDS
11138 PL_ppid = proto_perl->Ippid;
11139#endif
1d7c1841 11140
bd81e77b 11141 /* swatch cache */
5c284bb0 11142 PL_last_swash_hv = NULL; /* reinits on demand */
bd81e77b
NC
11143 PL_last_swash_klen = 0;
11144 PL_last_swash_key[0]= '\0';
11145 PL_last_swash_tmps = (U8*)NULL;
11146 PL_last_swash_slen = 0;
1d7c1841 11147
bd81e77b
NC
11148 PL_glob_index = proto_perl->Iglob_index;
11149 PL_srand_called = proto_perl->Isrand_called;
11150 PL_uudmap['M'] = 0; /* reinits on demand */
bd61b366 11151 PL_bitcount = NULL; /* reinits on demand */
05ec9bb3 11152
bd81e77b
NC
11153 if (proto_perl->Ipsig_pend) {
11154 Newxz(PL_psig_pend, SIG_SIZE, int);
11155 }
11156 else {
11157 PL_psig_pend = (int*)NULL;
11158 }
05ec9bb3 11159
bd81e77b
NC
11160 if (proto_perl->Ipsig_ptr) {
11161 Newxz(PL_psig_ptr, SIG_SIZE, SV*);
11162 Newxz(PL_psig_name, SIG_SIZE, SV*);
11163 for (i = 1; i < SIG_SIZE; i++) {
11164 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
11165 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
11166 }
11167 }
11168 else {
11169 PL_psig_ptr = (SV**)NULL;
11170 PL_psig_name = (SV**)NULL;
11171 }
05ec9bb3 11172
bd81e77b 11173 /* thrdvar.h stuff */
1d7c1841 11174
bd81e77b
NC
11175 if (flags & CLONEf_COPY_STACKS) {
11176 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
11177 PL_tmps_ix = proto_perl->Ttmps_ix;
11178 PL_tmps_max = proto_perl->Ttmps_max;
11179 PL_tmps_floor = proto_perl->Ttmps_floor;
11180 Newxz(PL_tmps_stack, PL_tmps_max, SV*);
11181 i = 0;
11182 while (i <= PL_tmps_ix) {
11183 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
11184 ++i;
11185 }
d2d73c3e 11186
bd81e77b
NC
11187 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
11188 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
11189 Newxz(PL_markstack, i, I32);
11190 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
11191 - proto_perl->Tmarkstack);
11192 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
11193 - proto_perl->Tmarkstack);
11194 Copy(proto_perl->Tmarkstack, PL_markstack,
11195 PL_markstack_ptr - PL_markstack + 1, I32);
d2d73c3e 11196
bd81e77b
NC
11197 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
11198 * NOTE: unlike the others! */
11199 PL_scopestack_ix = proto_perl->Tscopestack_ix;
11200 PL_scopestack_max = proto_perl->Tscopestack_max;
11201 Newxz(PL_scopestack, PL_scopestack_max, I32);
11202 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
d419787a 11203
bd81e77b
NC
11204 /* NOTE: si_dup() looks at PL_markstack */
11205 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
d2d73c3e 11206
bd81e77b
NC
11207 /* PL_curstack = PL_curstackinfo->si_stack; */
11208 PL_curstack = av_dup(proto_perl->Tcurstack, param);
11209 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841 11210
bd81e77b
NC
11211 /* next PUSHs() etc. set *(PL_stack_sp+1) */
11212 PL_stack_base = AvARRAY(PL_curstack);
11213 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
11214 - proto_perl->Tstack_base);
11215 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
1d7c1841 11216
bd81e77b
NC
11217 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
11218 * NOTE: unlike the others! */
11219 PL_savestack_ix = proto_perl->Tsavestack_ix;
11220 PL_savestack_max = proto_perl->Tsavestack_max;
11221 /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
11222 PL_savestack = ss_dup(proto_perl, param);
11223 }
11224 else {
11225 init_stacks();
11226 ENTER; /* perl_destruct() wants to LEAVE; */
34394ecd
DM
11227
11228 /* although we're not duplicating the tmps stack, we should still
11229 * add entries for any SVs on the tmps stack that got cloned by a
11230 * non-refcount means (eg a temp in @_); otherwise they will be
11231 * orphaned
11232 */
11233 for (i = 0; i<= proto_perl->Ttmps_ix; i++) {
6136c704 11234 SV * const nsv = (SV*)ptr_table_fetch(PL_ptr_table,
34394ecd
DM
11235 proto_perl->Ttmps_stack[i]);
11236 if (nsv && !SvREFCNT(nsv)) {
11237 EXTEND_MORTAL(1);
b37c2d43 11238 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple(nsv);
34394ecd
DM
11239 }
11240 }
bd81e77b 11241 }
1d7c1841 11242
bd81e77b
NC
11243 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
11244 PL_top_env = &PL_start_env;
1d7c1841 11245
bd81e77b 11246 PL_op = proto_perl->Top;
4a4c6fe3 11247
a0714e2c 11248 PL_Sv = NULL;
bd81e77b
NC
11249 PL_Xpv = (XPV*)NULL;
11250 PL_na = proto_perl->Tna;
1fcf4c12 11251
bd81e77b
NC
11252 PL_statbuf = proto_perl->Tstatbuf;
11253 PL_statcache = proto_perl->Tstatcache;
11254 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
11255 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
11256#ifdef HAS_TIMES
11257 PL_timesbuf = proto_perl->Ttimesbuf;
11258#endif
1d7c1841 11259
bd81e77b
NC
11260 PL_tainted = proto_perl->Ttainted;
11261 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
11262 PL_rs = sv_dup_inc(proto_perl->Trs, param);
11263 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
11264 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
11265 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
11266 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
11267 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
11268 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
11269 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841 11270
bd81e77b
NC
11271 PL_restartop = proto_perl->Trestartop;
11272 PL_in_eval = proto_perl->Tin_eval;
11273 PL_delaymagic = proto_perl->Tdelaymagic;
11274 PL_dirty = proto_perl->Tdirty;
11275 PL_localizing = proto_perl->Tlocalizing;
1d7c1841 11276
bd81e77b 11277 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
4608196e 11278 PL_hv_fetch_ent_mh = NULL;
bd81e77b 11279 PL_modcount = proto_perl->Tmodcount;
5f66b61c 11280 PL_lastgotoprobe = NULL;
bd81e77b 11281 PL_dumpindent = proto_perl->Tdumpindent;
1d7c1841 11282
bd81e77b
NC
11283 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
11284 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
11285 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
11286 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
bd61b366 11287 PL_efloatbuf = NULL; /* reinits on demand */
bd81e77b 11288 PL_efloatsize = 0; /* reinits on demand */
d2d73c3e 11289
bd81e77b 11290 /* regex stuff */
1d7c1841 11291
bd81e77b
NC
11292 PL_screamfirst = NULL;
11293 PL_screamnext = NULL;
11294 PL_maxscream = -1; /* reinits on demand */
a0714e2c 11295 PL_lastscream = NULL;
1d7c1841 11296
bd81e77b 11297 PL_watchaddr = NULL;
bd61b366 11298 PL_watchok = NULL;
1d7c1841 11299
bd81e77b 11300 PL_regdummy = proto_perl->Tregdummy;
bd61b366 11301 PL_regprecomp = NULL;
bd81e77b
NC
11302 PL_regnpar = 0;
11303 PL_regsize = 0;
11304 PL_colorset = 0; /* reinits PL_colors[] */
11305 /*PL_colors[6] = {0,0,0,0,0,0};*/
bd61b366
SS
11306 PL_reginput = NULL;
11307 PL_regbol = NULL;
11308 PL_regeol = NULL;
bd81e77b
NC
11309 PL_regstartp = (I32*)NULL;
11310 PL_regendp = (I32*)NULL;
11311 PL_reglastparen = (U32*)NULL;
11312 PL_reglastcloseparen = (U32*)NULL;
bd61b366 11313 PL_regtill = NULL;
bd81e77b
NC
11314 PL_reg_start_tmp = (char**)NULL;
11315 PL_reg_start_tmpl = 0;
11316 PL_regdata = (struct reg_data*)NULL;
bd61b366 11317 PL_bostr = NULL;
bd81e77b
NC
11318 PL_reg_flags = 0;
11319 PL_reg_eval_set = 0;
11320 PL_regnarrate = 0;
11321 PL_regprogram = (regnode*)NULL;
11322 PL_regindent = 0;
11323 PL_regcc = (CURCUR*)NULL;
11324 PL_reg_call_cc = (struct re_cc_state*)NULL;
11325 PL_reg_re = (regexp*)NULL;
bd61b366 11326 PL_reg_ganch = NULL;
a0714e2c 11327 PL_reg_sv = NULL;
bd81e77b
NC
11328 PL_reg_match_utf8 = FALSE;
11329 PL_reg_magic = (MAGIC*)NULL;
11330 PL_reg_oldpos = 0;
11331 PL_reg_oldcurpm = (PMOP*)NULL;
11332 PL_reg_curpm = (PMOP*)NULL;
bd61b366 11333 PL_reg_oldsaved = NULL;
bd81e77b
NC
11334 PL_reg_oldsavedlen = 0;
11335#ifdef PERL_OLD_COPY_ON_WRITE
a0714e2c 11336 PL_nrs = NULL;
bd81e77b
NC
11337#endif
11338 PL_reg_maxiter = 0;
11339 PL_reg_leftiter = 0;
bd61b366 11340 PL_reg_poscache = NULL;
bd81e77b 11341 PL_reg_poscache_size= 0;
1d7c1841 11342
bd81e77b
NC
11343 /* RE engine - function pointers */
11344 PL_regcompp = proto_perl->Tregcompp;
11345 PL_regexecp = proto_perl->Tregexecp;
11346 PL_regint_start = proto_perl->Tregint_start;
11347 PL_regint_string = proto_perl->Tregint_string;
11348 PL_regfree = proto_perl->Tregfree;
1d7c1841 11349
bd81e77b
NC
11350 PL_reginterp_cnt = 0;
11351 PL_reg_starttry = 0;
1d7c1841 11352
bd81e77b
NC
11353 /* Pluggable optimizer */
11354 PL_peepp = proto_perl->Tpeepp;
1d7c1841 11355
bd81e77b 11356 PL_stashcache = newHV();
1d7c1841 11357
bd81e77b
NC
11358 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
11359 ptr_table_free(PL_ptr_table);
11360 PL_ptr_table = NULL;
11361 }
1d7c1841 11362
bd81e77b
NC
11363 /* Call the ->CLONE method, if it exists, for each of the stashes
11364 identified by sv_dup() above.
11365 */
11366 while(av_len(param->stashes) != -1) {
11367 HV* const stash = (HV*) av_shift(param->stashes);
11368 GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
11369 if (cloner && GvCV(cloner)) {
11370 dSP;
11371 ENTER;
11372 SAVETMPS;
11373 PUSHMARK(SP);
11374 XPUSHs(sv_2mortal(newSVhek(HvNAME_HEK(stash))));
11375 PUTBACK;
11376 call_sv((SV*)GvCV(cloner), G_DISCARD);
11377 FREETMPS;
11378 LEAVE;
11379 }
1d7c1841 11380 }
1d7c1841 11381
bd81e77b 11382 SvREFCNT_dec(param->stashes);
1d7c1841 11383
bd81e77b
NC
11384 /* orphaned? eg threads->new inside BEGIN or use */
11385 if (PL_compcv && ! SvREFCNT(PL_compcv)) {
b37c2d43 11386 SvREFCNT_inc_simple_void(PL_compcv);
bd81e77b
NC
11387 SAVEFREESV(PL_compcv);
11388 }
dd2155a4 11389
bd81e77b
NC
11390 return my_perl;
11391}
1d7c1841 11392
bd81e77b 11393#endif /* USE_ITHREADS */
1d7c1841 11394
bd81e77b
NC
11395/*
11396=head1 Unicode Support
1d7c1841 11397
bd81e77b 11398=for apidoc sv_recode_to_utf8
1d7c1841 11399
bd81e77b
NC
11400The encoding is assumed to be an Encode object, on entry the PV
11401of the sv is assumed to be octets in that encoding, and the sv
11402will be converted into Unicode (and UTF-8).
1d7c1841 11403
bd81e77b
NC
11404If the sv already is UTF-8 (or if it is not POK), or if the encoding
11405is not a reference, nothing is done to the sv. If the encoding is not
11406an C<Encode::XS> Encoding object, bad things will happen.
11407(See F<lib/encoding.pm> and L<Encode>).
1d7c1841 11408
bd81e77b 11409The PV of the sv is returned.
1d7c1841 11410
bd81e77b 11411=cut */
1d7c1841 11412
bd81e77b
NC
11413char *
11414Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
11415{
11416 dVAR;
11417 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
11418 SV *uni;
11419 STRLEN len;
11420 const char *s;
11421 dSP;
11422 ENTER;
11423 SAVETMPS;
11424 save_re_context();
11425 PUSHMARK(sp);
11426 EXTEND(SP, 3);
11427 XPUSHs(encoding);
11428 XPUSHs(sv);
11429/*
11430 NI-S 2002/07/09
11431 Passing sv_yes is wrong - it needs to be or'ed set of constants
11432 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
11433 remove converted chars from source.
1d7c1841 11434
bd81e77b 11435 Both will default the value - let them.
1d7c1841 11436
bd81e77b
NC
11437 XPUSHs(&PL_sv_yes);
11438*/
11439 PUTBACK;
11440 call_method("decode", G_SCALAR);
11441 SPAGAIN;
11442 uni = POPs;
11443 PUTBACK;
11444 s = SvPV_const(uni, len);
11445 if (s != SvPVX_const(sv)) {
11446 SvGROW(sv, len + 1);
11447 Move(s, SvPVX(sv), len + 1, char);
11448 SvCUR_set(sv, len);
11449 }
11450 FREETMPS;
11451 LEAVE;
11452 SvUTF8_on(sv);
11453 return SvPVX(sv);
389edf32 11454 }
bd81e77b
NC
11455 return SvPOKp(sv) ? SvPVX(sv) : NULL;
11456}
1d7c1841 11457
bd81e77b
NC
11458/*
11459=for apidoc sv_cat_decode
1d7c1841 11460
bd81e77b
NC
11461The encoding is assumed to be an Encode object, the PV of the ssv is
11462assumed to be octets in that encoding and decoding the input starts
11463from the position which (PV + *offset) pointed to. The dsv will be
11464concatenated the decoded UTF-8 string from ssv. Decoding will terminate
11465when the string tstr appears in decoding output or the input ends on
11466the PV of the ssv. The value which the offset points will be modified
11467to the last input position on the ssv.
1d7c1841 11468
bd81e77b 11469Returns TRUE if the terminator was found, else returns FALSE.
1d7c1841 11470
bd81e77b
NC
11471=cut */
11472
11473bool
11474Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
11475 SV *ssv, int *offset, char *tstr, int tlen)
11476{
11477 dVAR;
11478 bool ret = FALSE;
11479 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
11480 SV *offsv;
11481 dSP;
11482 ENTER;
11483 SAVETMPS;
11484 save_re_context();
11485 PUSHMARK(sp);
11486 EXTEND(SP, 6);
11487 XPUSHs(encoding);
11488 XPUSHs(dsv);
11489 XPUSHs(ssv);
11490 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
11491 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
11492 PUTBACK;
11493 call_method("cat_decode", G_SCALAR);
11494 SPAGAIN;
11495 ret = SvTRUE(TOPs);
11496 *offset = SvIV(offsv);
11497 PUTBACK;
11498 FREETMPS;
11499 LEAVE;
389edf32 11500 }
bd81e77b
NC
11501 else
11502 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
11503 return ret;
1d7c1841 11504
bd81e77b 11505}
1d7c1841 11506
bd81e77b
NC
11507/* ---------------------------------------------------------------------
11508 *
11509 * support functions for report_uninit()
11510 */
1d7c1841 11511
bd81e77b
NC
11512/* the maxiumum size of array or hash where we will scan looking
11513 * for the undefined element that triggered the warning */
1d7c1841 11514
bd81e77b 11515#define FUV_MAX_SEARCH_SIZE 1000
1d7c1841 11516
bd81e77b
NC
11517/* Look for an entry in the hash whose value has the same SV as val;
11518 * If so, return a mortal copy of the key. */
1d7c1841 11519
bd81e77b
NC
11520STATIC SV*
11521S_find_hash_subscript(pTHX_ HV *hv, SV* val)
11522{
11523 dVAR;
11524 register HE **array;
11525 I32 i;
6c3182a5 11526
bd81e77b
NC
11527 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
11528 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
a0714e2c 11529 return NULL;
6c3182a5 11530
bd81e77b 11531 array = HvARRAY(hv);
6c3182a5 11532
bd81e77b
NC
11533 for (i=HvMAX(hv); i>0; i--) {
11534 register HE *entry;
11535 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
11536 if (HeVAL(entry) != val)
11537 continue;
11538 if ( HeVAL(entry) == &PL_sv_undef ||
11539 HeVAL(entry) == &PL_sv_placeholder)
11540 continue;
11541 if (!HeKEY(entry))
a0714e2c 11542 return NULL;
bd81e77b
NC
11543 if (HeKLEN(entry) == HEf_SVKEY)
11544 return sv_mortalcopy(HeKEY_sv(entry));
11545 return sv_2mortal(newSVpvn(HeKEY(entry), HeKLEN(entry)));
11546 }
11547 }
a0714e2c 11548 return NULL;
bd81e77b 11549}
6c3182a5 11550
bd81e77b
NC
11551/* Look for an entry in the array whose value has the same SV as val;
11552 * If so, return the index, otherwise return -1. */
6c3182a5 11553
bd81e77b
NC
11554STATIC I32
11555S_find_array_subscript(pTHX_ AV *av, SV* val)
11556{
97aff369 11557 dVAR;
bd81e77b
NC
11558 SV** svp;
11559 I32 i;
11560 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
11561 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
11562 return -1;
57c6e6d2 11563
bd81e77b
NC
11564 svp = AvARRAY(av);
11565 for (i=AvFILLp(av); i>=0; i--) {
11566 if (svp[i] == val && svp[i] != &PL_sv_undef)
11567 return i;
11568 }
11569 return -1;
11570}
15a5279a 11571
bd81e77b
NC
11572/* S_varname(): return the name of a variable, optionally with a subscript.
11573 * If gv is non-zero, use the name of that global, along with gvtype (one
11574 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
11575 * targ. Depending on the value of the subscript_type flag, return:
11576 */
bce260cd 11577
bd81e77b
NC
11578#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
11579#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
11580#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
11581#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
bce260cd 11582
bd81e77b
NC
11583STATIC SV*
11584S_varname(pTHX_ GV *gv, const char gvtype, PADOFFSET targ,
11585 SV* keyname, I32 aindex, int subscript_type)
11586{
1d7c1841 11587
bd81e77b
NC
11588 SV * const name = sv_newmortal();
11589 if (gv) {
11590 char buffer[2];
11591 buffer[0] = gvtype;
11592 buffer[1] = 0;
1d7c1841 11593
bd81e77b 11594 /* as gv_fullname4(), but add literal '^' for $^FOO names */
66fe0623 11595
bd81e77b 11596 gv_fullname4(name, gv, buffer, 0);
1d7c1841 11597
bd81e77b
NC
11598 if ((unsigned int)SvPVX(name)[1] <= 26) {
11599 buffer[0] = '^';
11600 buffer[1] = SvPVX(name)[1] + 'A' - 1;
1d7c1841 11601
bd81e77b
NC
11602 /* Swap the 1 unprintable control character for the 2 byte pretty
11603 version - ie substr($name, 1, 1) = $buffer; */
11604 sv_insert(name, 1, 1, buffer, 2);
1d7c1841 11605 }
bd81e77b
NC
11606 }
11607 else {
11608 U32 unused;
11609 CV * const cv = find_runcv(&unused);
11610 SV *sv;
11611 AV *av;
1d7c1841 11612
bd81e77b 11613 if (!cv || !CvPADLIST(cv))
a0714e2c 11614 return NULL;
bd81e77b
NC
11615 av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
11616 sv = *av_fetch(av, targ, FALSE);
11617 /* SvLEN in a pad name is not to be trusted */
11618 sv_setpv(name, SvPV_nolen_const(sv));
11619 }
1d7c1841 11620
bd81e77b 11621 if (subscript_type == FUV_SUBSCRIPT_HASH) {
561b68a9 11622 SV * const sv = newSV(0);
bd81e77b
NC
11623 *SvPVX(name) = '$';
11624 Perl_sv_catpvf(aTHX_ name, "{%s}",
11625 pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
11626 SvREFCNT_dec(sv);
11627 }
11628 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
11629 *SvPVX(name) = '$';
11630 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
11631 }
11632 else if (subscript_type == FUV_SUBSCRIPT_WITHIN)
89529cee 11633 Perl_sv_insert(aTHX_ name, 0, 0, STR_WITH_LEN("within "));
1d7c1841 11634
bd81e77b
NC
11635 return name;
11636}
1d7c1841 11637
1d7c1841 11638
bd81e77b
NC
11639/*
11640=for apidoc find_uninit_var
1d7c1841 11641
bd81e77b
NC
11642Find the name of the undefined variable (if any) that caused the operator o
11643to issue a "Use of uninitialized value" warning.
11644If match is true, only return a name if it's value matches uninit_sv.
11645So roughly speaking, if a unary operator (such as OP_COS) generates a
11646warning, then following the direct child of the op may yield an
11647OP_PADSV or OP_GV that gives the name of the undefined variable. On the
11648other hand, with OP_ADD there are two branches to follow, so we only print
11649the variable name if we get an exact match.
1d7c1841 11650
bd81e77b 11651The name is returned as a mortal SV.
1d7c1841 11652
bd81e77b
NC
11653Assumes that PL_op is the op that originally triggered the error, and that
11654PL_comppad/PL_curpad points to the currently executing pad.
1d7c1841 11655
bd81e77b
NC
11656=cut
11657*/
1d7c1841 11658
bd81e77b
NC
11659STATIC SV *
11660S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
11661{
11662 dVAR;
11663 SV *sv;
11664 AV *av;
11665 GV *gv;
11666 OP *o, *o2, *kid;
1d7c1841 11667
bd81e77b
NC
11668 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
11669 uninit_sv == &PL_sv_placeholder)))
a0714e2c 11670 return NULL;
1d7c1841 11671
bd81e77b 11672 switch (obase->op_type) {
1d7c1841 11673
bd81e77b
NC
11674 case OP_RV2AV:
11675 case OP_RV2HV:
11676 case OP_PADAV:
11677 case OP_PADHV:
11678 {
11679 const bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
11680 const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
11681 I32 index = 0;
a0714e2c 11682 SV *keysv = NULL;
bd81e77b 11683 int subscript_type = FUV_SUBSCRIPT_WITHIN;
1d7c1841 11684
bd81e77b
NC
11685 if (pad) { /* @lex, %lex */
11686 sv = PAD_SVl(obase->op_targ);
a0714e2c 11687 gv = NULL;
bd81e77b
NC
11688 }
11689 else {
11690 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
11691 /* @global, %global */
11692 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
11693 if (!gv)
11694 break;
11695 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
11696 }
11697 else /* @{expr}, %{expr} */
11698 return find_uninit_var(cUNOPx(obase)->op_first,
11699 uninit_sv, match);
11700 }
1d7c1841 11701
bd81e77b
NC
11702 /* attempt to find a match within the aggregate */
11703 if (hash) {
11704 keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
11705 if (keysv)
11706 subscript_type = FUV_SUBSCRIPT_HASH;
11707 }
11708 else {
11709 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
11710 if (index >= 0)
11711 subscript_type = FUV_SUBSCRIPT_ARRAY;
11712 }
1d7c1841 11713
bd81e77b
NC
11714 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
11715 break;
1d7c1841 11716
bd81e77b
NC
11717 return varname(gv, hash ? '%' : '@', obase->op_targ,
11718 keysv, index, subscript_type);
11719 }
1d7c1841 11720
bd81e77b
NC
11721 case OP_PADSV:
11722 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
11723 break;
a0714e2c
SS
11724 return varname(NULL, '$', obase->op_targ,
11725 NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 11726
bd81e77b
NC
11727 case OP_GVSV:
11728 gv = cGVOPx_gv(obase);
11729 if (!gv || (match && GvSV(gv) != uninit_sv))
11730 break;
a0714e2c 11731 return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 11732
bd81e77b
NC
11733 case OP_AELEMFAST:
11734 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
11735 if (match) {
11736 SV **svp;
11737 av = (AV*)PAD_SV(obase->op_targ);
11738 if (!av || SvRMAGICAL(av))
11739 break;
11740 svp = av_fetch(av, (I32)obase->op_private, FALSE);
11741 if (!svp || *svp != uninit_sv)
11742 break;
11743 }
a0714e2c
SS
11744 return varname(NULL, '$', obase->op_targ,
11745 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11746 }
11747 else {
11748 gv = cGVOPx_gv(obase);
11749 if (!gv)
11750 break;
11751 if (match) {
11752 SV **svp;
11753 av = GvAV(gv);
11754 if (!av || SvRMAGICAL(av))
11755 break;
11756 svp = av_fetch(av, (I32)obase->op_private, FALSE);
11757 if (!svp || *svp != uninit_sv)
11758 break;
11759 }
11760 return varname(gv, '$', 0,
a0714e2c 11761 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11762 }
11763 break;
1d7c1841 11764
bd81e77b
NC
11765 case OP_EXISTS:
11766 o = cUNOPx(obase)->op_first;
11767 if (!o || o->op_type != OP_NULL ||
11768 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
11769 break;
11770 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
a2efc822 11771
bd81e77b
NC
11772 case OP_AELEM:
11773 case OP_HELEM:
11774 if (PL_op == obase)
11775 /* $a[uninit_expr] or $h{uninit_expr} */
11776 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
081fc587 11777
a0714e2c 11778 gv = NULL;
bd81e77b
NC
11779 o = cBINOPx(obase)->op_first;
11780 kid = cBINOPx(obase)->op_last;
8cf8f3d1 11781
bd81e77b 11782 /* get the av or hv, and optionally the gv */
a0714e2c 11783 sv = NULL;
bd81e77b
NC
11784 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
11785 sv = PAD_SV(o->op_targ);
11786 }
11787 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
11788 && cUNOPo->op_first->op_type == OP_GV)
11789 {
11790 gv = cGVOPx_gv(cUNOPo->op_first);
11791 if (!gv)
11792 break;
11793 sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
11794 }
11795 if (!sv)
11796 break;
11797
11798 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
11799 /* index is constant */
11800 if (match) {
11801 if (SvMAGICAL(sv))
11802 break;
11803 if (obase->op_type == OP_HELEM) {
11804 HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
11805 if (!he || HeVAL(he) != uninit_sv)
11806 break;
11807 }
11808 else {
00b6aa41 11809 SV * const * const svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
bd81e77b
NC
11810 if (!svp || *svp != uninit_sv)
11811 break;
11812 }
11813 }
11814 if (obase->op_type == OP_HELEM)
11815 return varname(gv, '%', o->op_targ,
11816 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
11817 else
a0714e2c 11818 return varname(gv, '@', o->op_targ, NULL,
bd81e77b 11819 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11820 }
11821 else {
11822 /* index is an expression;
11823 * attempt to find a match within the aggregate */
11824 if (obase->op_type == OP_HELEM) {
11825 SV * const keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
11826 if (keysv)
11827 return varname(gv, '%', o->op_targ,
11828 keysv, 0, FUV_SUBSCRIPT_HASH);
11829 }
11830 else {
11831 const I32 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
11832 if (index >= 0)
11833 return varname(gv, '@', o->op_targ,
a0714e2c 11834 NULL, index, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11835 }
11836 if (match)
11837 break;
11838 return varname(gv,
11839 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
11840 ? '@' : '%',
a0714e2c 11841 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
f284b03f 11842 }
bd81e77b 11843 break;
dc507217 11844
bd81e77b
NC
11845 case OP_AASSIGN:
11846 /* only examine RHS */
11847 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
6d26897e 11848
bd81e77b
NC
11849 case OP_OPEN:
11850 o = cUNOPx(obase)->op_first;
11851 if (o->op_type == OP_PUSHMARK)
11852 o = o->op_sibling;
1d7c1841 11853
bd81e77b
NC
11854 if (!o->op_sibling) {
11855 /* one-arg version of open is highly magical */
a0ae6670 11856
bd81e77b
NC
11857 if (o->op_type == OP_GV) { /* open FOO; */
11858 gv = cGVOPx_gv(o);
11859 if (match && GvSV(gv) != uninit_sv)
11860 break;
11861 return varname(gv, '$', 0,
a0714e2c 11862 NULL, 0, FUV_SUBSCRIPT_NONE);
bd81e77b
NC
11863 }
11864 /* other possibilities not handled are:
11865 * open $x; or open my $x; should return '${*$x}'
11866 * open expr; should return '$'.expr ideally
11867 */
11868 break;
11869 }
11870 goto do_op;
ccfc67b7 11871
bd81e77b
NC
11872 /* ops where $_ may be an implicit arg */
11873 case OP_TRANS:
11874 case OP_SUBST:
11875 case OP_MATCH:
11876 if ( !(obase->op_flags & OPf_STACKED)) {
11877 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
11878 ? PAD_SVl(obase->op_targ)
11879 : DEFSV))
11880 {
11881 sv = sv_newmortal();
11882 sv_setpvn(sv, "$_", 2);
11883 return sv;
11884 }
11885 }
11886 goto do_op;
9f4817db 11887
bd81e77b
NC
11888 case OP_PRTF:
11889 case OP_PRINT:
11890 /* skip filehandle as it can't produce 'undef' warning */
11891 o = cUNOPx(obase)->op_first;
11892 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
11893 o = o->op_sibling->op_sibling;
11894 goto do_op2;
9f4817db 11895
9f4817db 11896
bd81e77b
NC
11897 case OP_RV2SV:
11898 case OP_CUSTOM:
11899 case OP_ENTERSUB:
11900 match = 1; /* XS or custom code could trigger random warnings */
11901 goto do_op;
9f4817db 11902
bd81e77b
NC
11903 case OP_SCHOMP:
11904 case OP_CHOMP:
11905 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
396482e1 11906 return sv_2mortal(newSVpvs("${$/}"));
5f66b61c 11907 /*FALLTHROUGH*/
5d170f3a 11908
bd81e77b
NC
11909 default:
11910 do_op:
11911 if (!(obase->op_flags & OPf_KIDS))
11912 break;
11913 o = cUNOPx(obase)->op_first;
11914
11915 do_op2:
11916 if (!o)
11917 break;
f9893866 11918
bd81e77b
NC
11919 /* if all except one arg are constant, or have no side-effects,
11920 * or are optimized away, then it's unambiguous */
5f66b61c 11921 o2 = NULL;
bd81e77b
NC
11922 for (kid=o; kid; kid = kid->op_sibling) {
11923 if (kid &&
11924 ( (kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid)))
11925 || (kid->op_type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
11926 || (kid->op_type == OP_PUSHMARK)
11927 )
11928 )
11929 continue;
11930 if (o2) { /* more than one found */
5f66b61c 11931 o2 = NULL;
bd81e77b
NC
11932 break;
11933 }
11934 o2 = kid;
11935 }
11936 if (o2)
11937 return find_uninit_var(o2, uninit_sv, match);
7a5fa8a2 11938
bd81e77b
NC
11939 /* scan all args */
11940 while (o) {
11941 sv = find_uninit_var(o, uninit_sv, 1);
11942 if (sv)
11943 return sv;
11944 o = o->op_sibling;
d0063567 11945 }
bd81e77b 11946 break;
f9893866 11947 }
a0714e2c 11948 return NULL;
9f4817db
JH
11949}
11950
220e2d4e 11951
bd81e77b
NC
11952/*
11953=for apidoc report_uninit
68795e93 11954
bd81e77b 11955Print appropriate "Use of uninitialized variable" warning
220e2d4e 11956
bd81e77b
NC
11957=cut
11958*/
220e2d4e 11959
bd81e77b
NC
11960void
11961Perl_report_uninit(pTHX_ SV* uninit_sv)
220e2d4e 11962{
97aff369 11963 dVAR;
bd81e77b 11964 if (PL_op) {
a0714e2c 11965 SV* varname = NULL;
bd81e77b
NC
11966 if (uninit_sv) {
11967 varname = find_uninit_var(PL_op, uninit_sv,0);
11968 if (varname)
11969 sv_insert(varname, 0, 0, " ", 1);
11970 }
11971 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
11972 varname ? SvPV_nolen_const(varname) : "",
11973 " in ", OP_DESC(PL_op));
220e2d4e 11974 }
a73e8557 11975 else
bd81e77b
NC
11976 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
11977 "", "", "");
220e2d4e 11978}
f9893866 11979
241d1a3b
NC
11980/*
11981 * Local variables:
11982 * c-indentation-style: bsd
11983 * c-basic-offset: 4
11984 * indent-tabs-mode: t
11985 * End:
11986 *
37442d52
RGS
11987 * ex: set ts=8 sts=4 sw=4 noet:
11988 */