This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
The remainder of the toke.c MAD changes. Now to investigate why MAD
[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 }
23525414 3655 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
4f2da183
NC
3656 {
3657 const MAGIC * const smg = SvVOK(sstr);
3658 if (smg) {
3659 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
3660 smg->mg_ptr, smg->mg_len);
3661 SvRMAGICAL_on(dstr);
3662 }
7a5fa8a2 3663 }
79072805 3664 }
5d581361 3665 else if (sflags & (SVp_IOK|SVp_NOK)) {
c2468cc7 3666 (void)SvOK_off(dstr);
5d581361
NC
3667 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
3668 if (sflags & SVp_IOK) {
3669 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
3670 SvIV_set(dstr, SvIVX(sstr));
3671 }
3332b3c1 3672 if (sflags & SVp_NOK) {
9d6ce603 3673 SvNV_set(dstr, SvNVX(sstr));
3332b3c1
JH
3674 }
3675 }
79072805 3676 else {
f7877b28 3677 if (isGV_with_GP(sstr)) {
180488f8
NC
3678 /* This stringification rule for globs is spread in 3 places.
3679 This feels bad. FIXME. */
3680 const U32 wasfake = sflags & SVf_FAKE;
3681
3682 /* FAKE globs can get coerced, so need to turn this off
3683 temporarily if it is on. */
3684 SvFAKE_off(sstr);
3685 gv_efullname3(dstr, (GV *)sstr, "*");
3686 SvFLAGS(sstr) |= wasfake;
3687 }
20408e3c
GS
3688 else
3689 (void)SvOK_off(dstr);
a0d0e21e 3690 }
27c9684d
AP
3691 if (SvTAINTED(sstr))
3692 SvTAINT(dstr);
79072805
LW
3693}
3694
954c1994
GS
3695/*
3696=for apidoc sv_setsv_mg
3697
3698Like C<sv_setsv>, but also handles 'set' magic.
3699
3700=cut
3701*/
3702
79072805 3703void
864dbfa3 3704Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
3705{
3706 sv_setsv(dstr,sstr);
3707 SvSETMAGIC(dstr);
3708}
3709
f8c7b90f 3710#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
3711SV *
3712Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
3713{
3714 STRLEN cur = SvCUR(sstr);
3715 STRLEN len = SvLEN(sstr);
3716 register char *new_pv;
3717
3718 if (DEBUG_C_TEST) {
3719 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
3720 sstr, dstr);
3721 sv_dump(sstr);
3722 if (dstr)
3723 sv_dump(dstr);
3724 }
3725
3726 if (dstr) {
3727 if (SvTHINKFIRST(dstr))
3728 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
3f7c398e
SP
3729 else if (SvPVX_const(dstr))
3730 Safefree(SvPVX_const(dstr));
ed252734
NC
3731 }
3732 else
3733 new_SV(dstr);
862a34c6 3734 SvUPGRADE(dstr, SVt_PVIV);
ed252734
NC
3735
3736 assert (SvPOK(sstr));
3737 assert (SvPOKp(sstr));
3738 assert (!SvIOK(sstr));
3739 assert (!SvIOKp(sstr));
3740 assert (!SvNOK(sstr));
3741 assert (!SvNOKp(sstr));
3742
3743 if (SvIsCOW(sstr)) {
3744
3745 if (SvLEN(sstr) == 0) {
3746 /* source is a COW shared hash key. */
ed252734
NC
3747 DEBUG_C(PerlIO_printf(Perl_debug_log,
3748 "Fast copy on write: Sharing hash\n"));
d1db91c6 3749 new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
ed252734
NC
3750 goto common_exit;
3751 }
3752 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3753 } else {
3754 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
862a34c6 3755 SvUPGRADE(sstr, SVt_PVIV);
ed252734
NC
3756 SvREADONLY_on(sstr);
3757 SvFAKE_on(sstr);
3758 DEBUG_C(PerlIO_printf(Perl_debug_log,
3759 "Fast copy on write: Converting sstr to COW\n"));
3760 SV_COW_NEXT_SV_SET(dstr, sstr);
3761 }
3762 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 3763 new_pv = SvPVX_mutable(sstr);
ed252734
NC
3764
3765 common_exit:
3766 SvPV_set(dstr, new_pv);
3767 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
3768 if (SvUTF8(sstr))
3769 SvUTF8_on(dstr);
87a1ef3d
SP
3770 SvLEN_set(dstr, len);
3771 SvCUR_set(dstr, cur);
ed252734
NC
3772 if (DEBUG_C_TEST) {
3773 sv_dump(dstr);
3774 }
3775 return dstr;
3776}
3777#endif
3778
954c1994
GS
3779/*
3780=for apidoc sv_setpvn
3781
3782Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
3783bytes to be copied. If the C<ptr> argument is NULL the SV will become
3784undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
3785
3786=cut
3787*/
3788
ef50df4b 3789void
864dbfa3 3790Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 3791{
97aff369 3792 dVAR;
c6f8c383 3793 register char *dptr;
22c522df 3794
765f542d 3795 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 3796 if (!ptr) {
a0d0e21e 3797 (void)SvOK_off(sv);
463ee0b2
LW
3798 return;
3799 }
22c522df
JH
3800 else {
3801 /* len is STRLEN which is unsigned, need to copy to signed */
a3b680e6 3802 const IV iv = len;
9c5ffd7c
JH
3803 if (iv < 0)
3804 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 3805 }
862a34c6 3806 SvUPGRADE(sv, SVt_PV);
c6f8c383 3807
5902b6a9 3808 dptr = SvGROW(sv, len + 1);
c6f8c383
GA
3809 Move(ptr,dptr,len,char);
3810 dptr[len] = '\0';
79072805 3811 SvCUR_set(sv, len);
1aa99e6b 3812 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3813 SvTAINT(sv);
79072805
LW
3814}
3815
954c1994
GS
3816/*
3817=for apidoc sv_setpvn_mg
3818
3819Like C<sv_setpvn>, but also handles 'set' magic.
3820
3821=cut
3822*/
3823
79072805 3824void
864dbfa3 3825Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
3826{
3827 sv_setpvn(sv,ptr,len);
3828 SvSETMAGIC(sv);
3829}
3830
954c1994
GS
3831/*
3832=for apidoc sv_setpv
3833
3834Copies a string into an SV. The string must be null-terminated. Does not
3835handle 'set' magic. See C<sv_setpv_mg>.
3836
3837=cut
3838*/
3839
ef50df4b 3840void
864dbfa3 3841Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805 3842{
97aff369 3843 dVAR;
79072805
LW
3844 register STRLEN len;
3845
765f542d 3846 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 3847 if (!ptr) {
a0d0e21e 3848 (void)SvOK_off(sv);
463ee0b2
LW
3849 return;
3850 }
79072805 3851 len = strlen(ptr);
862a34c6 3852 SvUPGRADE(sv, SVt_PV);
c6f8c383 3853
79072805 3854 SvGROW(sv, len + 1);
463ee0b2 3855 Move(ptr,SvPVX(sv),len+1,char);
79072805 3856 SvCUR_set(sv, len);
1aa99e6b 3857 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
3858 SvTAINT(sv);
3859}
3860
954c1994
GS
3861/*
3862=for apidoc sv_setpv_mg
3863
3864Like C<sv_setpv>, but also handles 'set' magic.
3865
3866=cut
3867*/
3868
463ee0b2 3869void
864dbfa3 3870Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
3871{
3872 sv_setpv(sv,ptr);
3873 SvSETMAGIC(sv);
3874}
3875
954c1994
GS
3876/*
3877=for apidoc sv_usepvn
3878
3879Tells an SV to use C<ptr> to find its string value. Normally the string is
1c846c1f 3880stored inside the SV but sv_usepvn allows the SV to use an outside string.
954c1994
GS
3881The C<ptr> should point to memory that was allocated by C<malloc>. The
3882string length, C<len>, must be supplied. This function will realloc the
3883memory pointed to by C<ptr>, so that pointer should not be freed or used by
3884the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
3885See C<sv_usepvn_mg>.
3886
3887=cut
3888*/
3889
ef50df4b 3890void
864dbfa3 3891Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 3892{
97aff369 3893 dVAR;
1936d2a7 3894 STRLEN allocate;
765f542d 3895 SV_CHECK_THINKFIRST_COW_DROP(sv);
862a34c6 3896 SvUPGRADE(sv, SVt_PV);
463ee0b2 3897 if (!ptr) {
a0d0e21e 3898 (void)SvOK_off(sv);
463ee0b2
LW
3899 return;
3900 }
3f7c398e 3901 if (SvPVX_const(sv))
8bd4d4c5 3902 SvPV_free(sv);
1936d2a7
NC
3903
3904 allocate = PERL_STRLEN_ROUNDUP(len + 1);
7a9b70e9 3905 ptr = saferealloc (ptr, allocate);
f880fe2f 3906 SvPV_set(sv, ptr);
463ee0b2 3907 SvCUR_set(sv, len);
1936d2a7 3908 SvLEN_set(sv, allocate);
463ee0b2 3909 *SvEND(sv) = '\0';
1aa99e6b 3910 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3911 SvTAINT(sv);
79072805
LW
3912}
3913
954c1994
GS
3914/*
3915=for apidoc sv_usepvn_mg
3916
3917Like C<sv_usepvn>, but also handles 'set' magic.
3918
3919=cut
3920*/
3921
ef50df4b 3922void
864dbfa3 3923Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 3924{
51c1089b 3925 sv_usepvn(sv,ptr,len);
ef50df4b
GS
3926 SvSETMAGIC(sv);
3927}
3928
f8c7b90f 3929#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
3930/* Need to do this *after* making the SV normal, as we need the buffer
3931 pointer to remain valid until after we've copied it. If we let go too early,
3932 another thread could invalidate it by unsharing last of the same hash key
3933 (which it can do by means other than releasing copy-on-write Svs)
3934 or by changing the other copy-on-write SVs in the loop. */
3935STATIC void
bdd68bc3 3936S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, STRLEN len, SV *after)
765f542d
NC
3937{
3938 if (len) { /* this SV was SvIsCOW_normal(sv) */
3939 /* we need to find the SV pointing to us. */
cf5629ad 3940 SV *current = SV_COW_NEXT_SV(after);
7a5fa8a2 3941
765f542d
NC
3942 if (current == sv) {
3943 /* The SV we point to points back to us (there were only two of us
3944 in the loop.)
3945 Hence other SV is no longer copy on write either. */
3946 SvFAKE_off(after);
3947 SvREADONLY_off(after);
3948 } else {
3949 /* We need to follow the pointers around the loop. */
3950 SV *next;
3951 while ((next = SV_COW_NEXT_SV(current)) != sv) {
3952 assert (next);
3953 current = next;
3954 /* don't loop forever if the structure is bust, and we have
3955 a pointer into a closed loop. */
3956 assert (current != after);
3f7c398e 3957 assert (SvPVX_const(current) == pvx);
765f542d
NC
3958 }
3959 /* Make the SV before us point to the SV after us. */
a29f6d03 3960 SV_COW_NEXT_SV_SET(current, after);
765f542d
NC
3961 }
3962 } else {
bdd68bc3 3963 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
765f542d
NC
3964 }
3965}
3966
3967int
3968Perl_sv_release_IVX(pTHX_ register SV *sv)
3969{
3970 if (SvIsCOW(sv))
3971 sv_force_normal_flags(sv, 0);
0c34ef67
MHM
3972 SvOOK_off(sv);
3973 return 0;
765f542d
NC
3974}
3975#endif
645c22ef
DM
3976/*
3977=for apidoc sv_force_normal_flags
3978
3979Undo various types of fakery on an SV: if the PV is a shared string, make
3980a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
3981an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
3982we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
3983then a copy-on-write scalar drops its PV buffer (if any) and becomes
3984SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 3985set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
3986C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
3987with flags set to 0.
645c22ef
DM
3988
3989=cut
3990*/
3991
6fc92669 3992void
840a7b70 3993Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 3994{
97aff369 3995 dVAR;
f8c7b90f 3996#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
3997 if (SvREADONLY(sv)) {
3998 /* At this point I believe I should acquire a global SV mutex. */
3999 if (SvFAKE(sv)) {
b64e5050 4000 const char * const pvx = SvPVX_const(sv);
a28509cc
AL
4001 const STRLEN len = SvLEN(sv);
4002 const STRLEN cur = SvCUR(sv);
a28509cc 4003 SV * const next = SV_COW_NEXT_SV(sv); /* next COW sv in the loop. */
46187eeb
NC
4004 if (DEBUG_C_TEST) {
4005 PerlIO_printf(Perl_debug_log,
4006 "Copy on write: Force normal %ld\n",
4007 (long) flags);
e419cbc5 4008 sv_dump(sv);
46187eeb 4009 }
765f542d
NC
4010 SvFAKE_off(sv);
4011 SvREADONLY_off(sv);
9f653bb5 4012 /* This SV doesn't own the buffer, so need to Newx() a new one: */
6136c704 4013 SvPV_set(sv, NULL);
87a1ef3d 4014 SvLEN_set(sv, 0);
765f542d
NC
4015 if (flags & SV_COW_DROP_PV) {
4016 /* OK, so we don't need to copy our buffer. */
4017 SvPOK_off(sv);
4018 } else {
4019 SvGROW(sv, cur + 1);
4020 Move(pvx,SvPVX(sv),cur,char);
87a1ef3d 4021 SvCUR_set(sv, cur);
765f542d
NC
4022 *SvEND(sv) = '\0';
4023 }
bdd68bc3 4024 sv_release_COW(sv, pvx, len, next);
46187eeb 4025 if (DEBUG_C_TEST) {
e419cbc5 4026 sv_dump(sv);
46187eeb 4027 }
765f542d 4028 }
923e4eb5 4029 else if (IN_PERL_RUNTIME)
765f542d
NC
4030 Perl_croak(aTHX_ PL_no_modify);
4031 /* At this point I believe that I can drop the global SV mutex. */
4032 }
4033#else
2213622d 4034 if (SvREADONLY(sv)) {
1c846c1f 4035 if (SvFAKE(sv)) {
b64e5050 4036 const char * const pvx = SvPVX_const(sv);
66a1b24b 4037 const STRLEN len = SvCUR(sv);
10bcdfd6
NC
4038 SvFAKE_off(sv);
4039 SvREADONLY_off(sv);
bd61b366 4040 SvPV_set(sv, NULL);
66a1b24b 4041 SvLEN_set(sv, 0);
1c846c1f 4042 SvGROW(sv, len + 1);
706aa1c9 4043 Move(pvx,SvPVX(sv),len,char);
1c846c1f 4044 *SvEND(sv) = '\0';
bdd68bc3 4045 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
1c846c1f 4046 }
923e4eb5 4047 else if (IN_PERL_RUNTIME)
cea2e8a9 4048 Perl_croak(aTHX_ PL_no_modify);
0f15f207 4049 }
765f542d 4050#endif
2213622d 4051 if (SvROK(sv))
840a7b70 4052 sv_unref_flags(sv, flags);
6fc92669
GS
4053 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4054 sv_unglob(sv);
0f15f207 4055}
1c846c1f 4056
645c22ef 4057/*
954c1994
GS
4058=for apidoc sv_chop
4059
1c846c1f 4060Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4061SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4062the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4063string. Uses the "OOK hack".
3f7c398e 4064Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
31869a79 4065refer to the same chunk of data.
954c1994
GS
4066
4067=cut
4068*/
4069
79072805 4070void
f54cb97a 4071Perl_sv_chop(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4072{
4073 register STRLEN delta;
a0d0e21e 4074 if (!ptr || !SvPOKp(sv))
79072805 4075 return;
3f7c398e 4076 delta = ptr - SvPVX_const(sv);
2213622d 4077 SV_CHECK_THINKFIRST(sv);
79072805
LW
4078 if (SvTYPE(sv) < SVt_PVIV)
4079 sv_upgrade(sv,SVt_PVIV);
4080
4081 if (!SvOOK(sv)) {
50483b2c 4082 if (!SvLEN(sv)) { /* make copy of shared string */
3f7c398e 4083 const char *pvx = SvPVX_const(sv);
a28509cc 4084 const STRLEN len = SvCUR(sv);
50483b2c 4085 SvGROW(sv, len + 1);
706aa1c9 4086 Move(pvx,SvPVX(sv),len,char);
50483b2c
JD
4087 *SvEND(sv) = '\0';
4088 }
45977657 4089 SvIV_set(sv, 0);
a4bfb290
AB
4090 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
4091 and we do that anyway inside the SvNIOK_off
4092 */
7a5fa8a2 4093 SvFLAGS(sv) |= SVf_OOK;
79072805 4094 }
a4bfb290 4095 SvNIOK_off(sv);
b162af07
SP
4096 SvLEN_set(sv, SvLEN(sv) - delta);
4097 SvCUR_set(sv, SvCUR(sv) - delta);
f880fe2f 4098 SvPV_set(sv, SvPVX(sv) + delta);
45977657 4099 SvIV_set(sv, SvIVX(sv) + delta);
79072805
LW
4100}
4101
954c1994
GS
4102/*
4103=for apidoc sv_catpvn
4104
4105Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4106C<len> indicates number of bytes to copy. If the SV has the UTF-8
4107status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 4108Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 4109
8d6d96c1
HS
4110=for apidoc sv_catpvn_flags
4111
4112Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4113C<len> indicates number of bytes to copy. If the SV has the UTF-8
4114status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
4115If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4116appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4117in terms of this function.
4118
4119=cut
4120*/
4121
4122void
4123Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
4124{
97aff369 4125 dVAR;
8d6d96c1 4126 STRLEN dlen;
fabdb6c0 4127 const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
8d6d96c1 4128
8d6d96c1
HS
4129 SvGROW(dsv, dlen + slen + 1);
4130 if (sstr == dstr)
3f7c398e 4131 sstr = SvPVX_const(dsv);
8d6d96c1 4132 Move(sstr, SvPVX(dsv) + dlen, slen, char);
b162af07 4133 SvCUR_set(dsv, SvCUR(dsv) + slen);
8d6d96c1
HS
4134 *SvEND(dsv) = '\0';
4135 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
4136 SvTAINT(dsv);
bddd5118
NC
4137 if (flags & SV_SMAGIC)
4138 SvSETMAGIC(dsv);
79072805
LW
4139}
4140
954c1994 4141/*
954c1994
GS
4142=for apidoc sv_catsv
4143
13e8c8e3
JH
4144Concatenates the string from SV C<ssv> onto the end of the string in
4145SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
4146not 'set' magic. See C<sv_catsv_mg>.
954c1994 4147
8d6d96c1
HS
4148=for apidoc sv_catsv_flags
4149
4150Concatenates the string from SV C<ssv> onto the end of the string in
4151SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
4152bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4153and C<sv_catsv_nomg> are implemented in terms of this function.
4154
4155=cut */
4156
ef50df4b 4157void
8d6d96c1 4158Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 4159{
97aff369 4160 dVAR;
bddd5118 4161 if (ssv) {
00b6aa41
AL
4162 STRLEN slen;
4163 const char *spv = SvPV_const(ssv, slen);
4164 if (spv) {
bddd5118
NC
4165 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4166 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4167 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4168 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4169 dsv->sv_flags doesn't have that bit set.
4fd84b44 4170 Andy Dougherty 12 Oct 2001
bddd5118
NC
4171 */
4172 const I32 sutf8 = DO_UTF8(ssv);
4173 I32 dutf8;
13e8c8e3 4174
bddd5118
NC
4175 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4176 mg_get(dsv);
4177 dutf8 = DO_UTF8(dsv);
8d6d96c1 4178
bddd5118
NC
4179 if (dutf8 != sutf8) {
4180 if (dutf8) {
4181 /* Not modifying source SV, so taking a temporary copy. */
00b6aa41 4182 SV* const csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 4183
bddd5118
NC
4184 sv_utf8_upgrade(csv);
4185 spv = SvPV_const(csv, slen);
4186 }
4187 else
4188 sv_utf8_upgrade_nomg(dsv);
13e8c8e3 4189 }
bddd5118 4190 sv_catpvn_nomg(dsv, spv, slen);
e84ff256 4191 }
560a288e 4192 }
bddd5118
NC
4193 if (flags & SV_SMAGIC)
4194 SvSETMAGIC(dsv);
79072805
LW
4195}
4196
954c1994 4197/*
954c1994
GS
4198=for apidoc sv_catpv
4199
4200Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
4201If the SV has the UTF-8 status set, then the bytes appended should be
4202valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 4203
d5ce4a7c 4204=cut */
954c1994 4205
ef50df4b 4206void
0c981600 4207Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805 4208{
97aff369 4209 dVAR;
79072805 4210 register STRLEN len;
463ee0b2 4211 STRLEN tlen;
748a9306 4212 char *junk;
79072805 4213
0c981600 4214 if (!ptr)
79072805 4215 return;
748a9306 4216 junk = SvPV_force(sv, tlen);
0c981600 4217 len = strlen(ptr);
463ee0b2 4218 SvGROW(sv, tlen + len + 1);
0c981600 4219 if (ptr == junk)
3f7c398e 4220 ptr = SvPVX_const(sv);
0c981600 4221 Move(ptr,SvPVX(sv)+tlen,len+1,char);
b162af07 4222 SvCUR_set(sv, SvCUR(sv) + len);
d41ff1b8 4223 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4224 SvTAINT(sv);
79072805
LW
4225}
4226
954c1994
GS
4227/*
4228=for apidoc sv_catpv_mg
4229
4230Like C<sv_catpv>, but also handles 'set' magic.
4231
4232=cut
4233*/
4234
ef50df4b 4235void
0c981600 4236Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 4237{
0c981600 4238 sv_catpv(sv,ptr);
ef50df4b
GS
4239 SvSETMAGIC(sv);
4240}
4241
645c22ef
DM
4242/*
4243=for apidoc newSV
4244
561b68a9
SH
4245Creates a new SV. A non-zero C<len> parameter indicates the number of
4246bytes of preallocated string space the SV should have. An extra byte for a
4247trailing NUL is also reserved. (SvPOK is not set for the SV even if string
4248space is allocated.) The reference count for the new SV is set to 1.
4249
4250In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
4251parameter, I<x>, a debug aid which allowed callers to identify themselves.
4252This aid has been superseded by a new build option, PERL_MEM_LOG (see
4253L<perlhack/PERL_MEM_LOG>). The older API is still there for use in XS
4254modules supporting older perls.
645c22ef
DM
4255
4256=cut
4257*/
4258
79072805 4259SV *
864dbfa3 4260Perl_newSV(pTHX_ STRLEN len)
79072805 4261{
97aff369 4262 dVAR;
79072805 4263 register SV *sv;
1c846c1f 4264
4561caa4 4265 new_SV(sv);
79072805
LW
4266 if (len) {
4267 sv_upgrade(sv, SVt_PV);
4268 SvGROW(sv, len + 1);
4269 }
4270 return sv;
4271}
954c1994 4272/*
92110913 4273=for apidoc sv_magicext
954c1994 4274
68795e93 4275Adds magic to an SV, upgrading it if necessary. Applies the
2d8d5d5a 4276supplied vtable and returns a pointer to the magic added.
92110913 4277
2d8d5d5a
SH
4278Note that C<sv_magicext> will allow things that C<sv_magic> will not.
4279In particular, you can add magic to SvREADONLY SVs, and add more than
4280one instance of the same 'how'.
645c22ef 4281
2d8d5d5a
SH
4282If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
4283stored, if C<namlen> is zero then C<name> is stored as-is and - as another
4284special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
4285to contain an C<SV*> and is stored as-is with its REFCNT incremented.
92110913 4286
2d8d5d5a 4287(This is now used as a subroutine by C<sv_magic>.)
954c1994
GS
4288
4289=cut
4290*/
92110913 4291MAGIC *
92e67595 4292Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, MGVTBL *vtable,
92110913 4293 const char* name, I32 namlen)
79072805 4294{
97aff369 4295 dVAR;
79072805 4296 MAGIC* mg;
68795e93 4297
92110913 4298 if (SvTYPE(sv) < SVt_PVMG) {
862a34c6 4299 SvUPGRADE(sv, SVt_PVMG);
463ee0b2 4300 }
a02a5408 4301 Newxz(mg, 1, MAGIC);
79072805 4302 mg->mg_moremagic = SvMAGIC(sv);
b162af07 4303 SvMAGIC_set(sv, mg);
75f9d97a 4304
05f95b08
SB
4305 /* Sometimes a magic contains a reference loop, where the sv and
4306 object refer to each other. To prevent a reference loop that
4307 would prevent such objects being freed, we look for such loops
4308 and if we find one we avoid incrementing the object refcount.
87f0b213
JH
4309
4310 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 4311 have its REFCNT incremented to keep it in existence.
87f0b213
JH
4312
4313 */
14befaf4
DM
4314 if (!obj || obj == sv ||
4315 how == PERL_MAGIC_arylen ||
4316 how == PERL_MAGIC_qr ||
8d2f4536 4317 how == PERL_MAGIC_symtab ||
75f9d97a
JH
4318 (SvTYPE(obj) == SVt_PVGV &&
4319 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4320 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 4321 GvFORM(obj) == (CV*)sv)))
75f9d97a 4322 {
8990e307 4323 mg->mg_obj = obj;
75f9d97a 4324 }
85e6fe83 4325 else {
b37c2d43 4326 mg->mg_obj = SvREFCNT_inc_simple(obj);
85e6fe83
LW
4327 mg->mg_flags |= MGf_REFCOUNTED;
4328 }
b5ccf5f2
YST
4329
4330 /* Normal self-ties simply pass a null object, and instead of
4331 using mg_obj directly, use the SvTIED_obj macro to produce a
4332 new RV as needed. For glob "self-ties", we are tieing the PVIO
4333 with an RV obj pointing to the glob containing the PVIO. In
4334 this case, to avoid a reference loop, we need to weaken the
4335 reference.
4336 */
4337
4338 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4339 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
4340 {
4341 sv_rvweaken(obj);
4342 }
4343
79072805 4344 mg->mg_type = how;
565764a8 4345 mg->mg_len = namlen;
9cbac4c7 4346 if (name) {
92110913 4347 if (namlen > 0)
1edc1566 4348 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 4349 else if (namlen == HEf_SVKEY)
b37c2d43 4350 mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV*)name);
68795e93 4351 else
92110913 4352 mg->mg_ptr = (char *) name;
9cbac4c7 4353 }
92110913 4354 mg->mg_virtual = vtable;
68795e93 4355
92110913
NIS
4356 mg_magical(sv);
4357 if (SvGMAGICAL(sv))
4358 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4359 return mg;
4360}
4361
4362/*
4363=for apidoc sv_magic
1c846c1f 4364
92110913
NIS
4365Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4366then adds a new magic item of type C<how> to the head of the magic list.
4367
2d8d5d5a
SH
4368See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
4369handling of the C<name> and C<namlen> arguments.
4370
4509d3fb
SB
4371You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
4372to add more than one instance of the same 'how'.
4373
92110913
NIS
4374=cut
4375*/
4376
4377void
4378Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 4379{
97aff369 4380 dVAR;
92e67595 4381 MGVTBL *vtable;
92110913 4382 MAGIC* mg;
92110913 4383
f8c7b90f 4384#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4385 if (SvIsCOW(sv))
4386 sv_force_normal_flags(sv, 0);
4387#endif
92110913 4388 if (SvREADONLY(sv)) {
d8084ca5
DM
4389 if (
4390 /* its okay to attach magic to shared strings; the subsequent
4391 * upgrade to PVMG will unshare the string */
4392 !(SvFAKE(sv) && SvTYPE(sv) < SVt_PVMG)
4393
4394 && IN_PERL_RUNTIME
92110913
NIS
4395 && how != PERL_MAGIC_regex_global
4396 && how != PERL_MAGIC_bm
4397 && how != PERL_MAGIC_fm
4398 && how != PERL_MAGIC_sv
e6469971 4399 && how != PERL_MAGIC_backref
92110913
NIS
4400 )
4401 {
4402 Perl_croak(aTHX_ PL_no_modify);
4403 }
4404 }
4405 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4406 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
4407 /* sv_magic() refuses to add a magic of the same 'how' as an
4408 existing one
92110913 4409 */
2a509ed3 4410 if (how == PERL_MAGIC_taint) {
92110913 4411 mg->mg_len |= 1;
2a509ed3
NC
4412 /* Any scalar which already had taint magic on which someone
4413 (erroneously?) did SvIOK_on() or similar will now be
4414 incorrectly sporting public "OK" flags. */
4415 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4416 }
92110913
NIS
4417 return;
4418 }
4419 }
68795e93 4420
79072805 4421 switch (how) {
14befaf4 4422 case PERL_MAGIC_sv:
92110913 4423 vtable = &PL_vtbl_sv;
79072805 4424 break;
14befaf4 4425 case PERL_MAGIC_overload:
92110913 4426 vtable = &PL_vtbl_amagic;
a0d0e21e 4427 break;
14befaf4 4428 case PERL_MAGIC_overload_elem:
92110913 4429 vtable = &PL_vtbl_amagicelem;
a0d0e21e 4430 break;
14befaf4 4431 case PERL_MAGIC_overload_table:
92110913 4432 vtable = &PL_vtbl_ovrld;
a0d0e21e 4433 break;
14befaf4 4434 case PERL_MAGIC_bm:
92110913 4435 vtable = &PL_vtbl_bm;
79072805 4436 break;
14befaf4 4437 case PERL_MAGIC_regdata:
92110913 4438 vtable = &PL_vtbl_regdata;
6cef1e77 4439 break;
14befaf4 4440 case PERL_MAGIC_regdatum:
92110913 4441 vtable = &PL_vtbl_regdatum;
6cef1e77 4442 break;
14befaf4 4443 case PERL_MAGIC_env:
92110913 4444 vtable = &PL_vtbl_env;
79072805 4445 break;
14befaf4 4446 case PERL_MAGIC_fm:
92110913 4447 vtable = &PL_vtbl_fm;
55497cff 4448 break;
14befaf4 4449 case PERL_MAGIC_envelem:
92110913 4450 vtable = &PL_vtbl_envelem;
79072805 4451 break;
14befaf4 4452 case PERL_MAGIC_regex_global:
92110913 4453 vtable = &PL_vtbl_mglob;
93a17b20 4454 break;
14befaf4 4455 case PERL_MAGIC_isa:
92110913 4456 vtable = &PL_vtbl_isa;
463ee0b2 4457 break;
14befaf4 4458 case PERL_MAGIC_isaelem:
92110913 4459 vtable = &PL_vtbl_isaelem;
463ee0b2 4460 break;
14befaf4 4461 case PERL_MAGIC_nkeys:
92110913 4462 vtable = &PL_vtbl_nkeys;
16660edb 4463 break;
14befaf4 4464 case PERL_MAGIC_dbfile:
aec46f14 4465 vtable = NULL;
93a17b20 4466 break;
14befaf4 4467 case PERL_MAGIC_dbline:
92110913 4468 vtable = &PL_vtbl_dbline;
79072805 4469 break;
36477c24 4470#ifdef USE_LOCALE_COLLATE
14befaf4 4471 case PERL_MAGIC_collxfrm:
92110913 4472 vtable = &PL_vtbl_collxfrm;
bbce6d69 4473 break;
36477c24 4474#endif /* USE_LOCALE_COLLATE */
14befaf4 4475 case PERL_MAGIC_tied:
92110913 4476 vtable = &PL_vtbl_pack;
463ee0b2 4477 break;
14befaf4
DM
4478 case PERL_MAGIC_tiedelem:
4479 case PERL_MAGIC_tiedscalar:
92110913 4480 vtable = &PL_vtbl_packelem;
463ee0b2 4481 break;
14befaf4 4482 case PERL_MAGIC_qr:
92110913 4483 vtable = &PL_vtbl_regexp;
c277df42 4484 break;
14befaf4 4485 case PERL_MAGIC_sig:
92110913 4486 vtable = &PL_vtbl_sig;
79072805 4487 break;
14befaf4 4488 case PERL_MAGIC_sigelem:
92110913 4489 vtable = &PL_vtbl_sigelem;
79072805 4490 break;
14befaf4 4491 case PERL_MAGIC_taint:
92110913 4492 vtable = &PL_vtbl_taint;
463ee0b2 4493 break;
14befaf4 4494 case PERL_MAGIC_uvar:
92110913 4495 vtable = &PL_vtbl_uvar;
79072805 4496 break;
14befaf4 4497 case PERL_MAGIC_vec:
92110913 4498 vtable = &PL_vtbl_vec;
79072805 4499 break;
a3874608 4500 case PERL_MAGIC_arylen_p:
bfcb3514 4501 case PERL_MAGIC_rhash:
8d2f4536 4502 case PERL_MAGIC_symtab:
ece467f9 4503 case PERL_MAGIC_vstring:
aec46f14 4504 vtable = NULL;
ece467f9 4505 break;
7e8c5dac
HS
4506 case PERL_MAGIC_utf8:
4507 vtable = &PL_vtbl_utf8;
4508 break;
14befaf4 4509 case PERL_MAGIC_substr:
92110913 4510 vtable = &PL_vtbl_substr;
79072805 4511 break;
14befaf4 4512 case PERL_MAGIC_defelem:
92110913 4513 vtable = &PL_vtbl_defelem;
5f05dabc 4514 break;
14befaf4 4515 case PERL_MAGIC_arylen:
92110913 4516 vtable = &PL_vtbl_arylen;
79072805 4517 break;
14befaf4 4518 case PERL_MAGIC_pos:
92110913 4519 vtable = &PL_vtbl_pos;
a0d0e21e 4520 break;
14befaf4 4521 case PERL_MAGIC_backref:
92110913 4522 vtable = &PL_vtbl_backref;
810b8aa5 4523 break;
14befaf4
DM
4524 case PERL_MAGIC_ext:
4525 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
4526 /* Useful for attaching extension internal data to perl vars. */
4527 /* Note that multiple extensions may clash if magical scalars */
4528 /* etc holding private data from one are passed to another. */
aec46f14 4529 vtable = NULL;
a0d0e21e 4530 break;
79072805 4531 default:
14befaf4 4532 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 4533 }
68795e93 4534
92110913 4535 /* Rest of work is done else where */
aec46f14 4536 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 4537
92110913
NIS
4538 switch (how) {
4539 case PERL_MAGIC_taint:
4540 mg->mg_len = 1;
4541 break;
4542 case PERL_MAGIC_ext:
4543 case PERL_MAGIC_dbfile:
4544 SvRMAGICAL_on(sv);
4545 break;
4546 }
463ee0b2
LW
4547}
4548
c461cf8f
JH
4549/*
4550=for apidoc sv_unmagic
4551
645c22ef 4552Removes all magic of type C<type> from an SV.
c461cf8f
JH
4553
4554=cut
4555*/
4556
463ee0b2 4557int
864dbfa3 4558Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
4559{
4560 MAGIC* mg;
4561 MAGIC** mgp;
91bba347 4562 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2 4563 return 0;
064cf529 4564 mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
463ee0b2
LW
4565 for (mg = *mgp; mg; mg = *mgp) {
4566 if (mg->mg_type == type) {
e1ec3a88 4567 const MGVTBL* const vtbl = mg->mg_virtual;
463ee0b2 4568 *mgp = mg->mg_moremagic;
1d7c1841 4569 if (vtbl && vtbl->svt_free)
fc0dc3b3 4570 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 4571 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 4572 if (mg->mg_len > 0)
1edc1566 4573 Safefree(mg->mg_ptr);
565764a8 4574 else if (mg->mg_len == HEf_SVKEY)
1edc1566 4575 SvREFCNT_dec((SV*)mg->mg_ptr);
7e8c5dac
HS
4576 else if (mg->mg_type == PERL_MAGIC_utf8 && mg->mg_ptr)
4577 Safefree(mg->mg_ptr);
9cbac4c7 4578 }
a0d0e21e
LW
4579 if (mg->mg_flags & MGf_REFCOUNTED)
4580 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
4581 Safefree(mg);
4582 }
4583 else
4584 mgp = &mg->mg_moremagic;
79072805 4585 }
91bba347 4586 if (!SvMAGIC(sv)) {
463ee0b2 4587 SvMAGICAL_off(sv);
c268c2a6 4588 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
86f55936 4589 SvMAGIC_set(sv, NULL);
463ee0b2
LW
4590 }
4591
4592 return 0;
79072805
LW
4593}
4594
c461cf8f
JH
4595/*
4596=for apidoc sv_rvweaken
4597
645c22ef
DM
4598Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
4599referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
4600push a back-reference to this RV onto the array of backreferences
4601associated with that magic.
c461cf8f
JH
4602
4603=cut
4604*/
4605
810b8aa5 4606SV *
864dbfa3 4607Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
4608{
4609 SV *tsv;
4610 if (!SvOK(sv)) /* let undefs pass */
4611 return sv;
4612 if (!SvROK(sv))
cea2e8a9 4613 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 4614 else if (SvWEAKREF(sv)) {
810b8aa5 4615 if (ckWARN(WARN_MISC))
9014280d 4616 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
4617 return sv;
4618 }
4619 tsv = SvRV(sv);
e15faf7d 4620 Perl_sv_add_backref(aTHX_ tsv, sv);
810b8aa5 4621 SvWEAKREF_on(sv);
1c846c1f 4622 SvREFCNT_dec(tsv);
810b8aa5
GS
4623 return sv;
4624}
4625
645c22ef
DM
4626/* Give tsv backref magic if it hasn't already got it, then push a
4627 * back-reference to sv onto the array associated with the backref magic.
4628 */
4629
e15faf7d
NC
4630void
4631Perl_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5 4632{
97aff369 4633 dVAR;
810b8aa5 4634 AV *av;
86f55936
NC
4635
4636 if (SvTYPE(tsv) == SVt_PVHV) {
4637 AV **const avp = Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
4638
4639 av = *avp;
4640 if (!av) {
4641 /* There is no AV in the offical place - try a fixup. */
4642 MAGIC *const mg = mg_find(tsv, PERL_MAGIC_backref);
4643
4644 if (mg) {
4645 /* Aha. They've got it stowed in magic. Bring it back. */
4646 av = (AV*)mg->mg_obj;
4647 /* Stop mg_free decreasing the refernce count. */
4648 mg->mg_obj = NULL;
4649 /* Stop mg_free even calling the destructor, given that
4650 there's no AV to free up. */
4651 mg->mg_virtual = 0;
4652 sv_unmagic(tsv, PERL_MAGIC_backref);
4653 } else {
4654 av = newAV();
4655 AvREAL_off(av);
b37c2d43 4656 SvREFCNT_inc_simple_void(av);
86f55936
NC
4657 }
4658 *avp = av;
4659 }
4660 } else {
4661 const MAGIC *const mg
4662 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
4663 if (mg)
4664 av = (AV*)mg->mg_obj;
4665 else {
4666 av = newAV();
4667 AvREAL_off(av);
4668 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
4669 /* av now has a refcnt of 2, which avoids it getting freed
4670 * before us during global cleanup. The extra ref is removed
4671 * by magic_killbackrefs() when tsv is being freed */
4672 }
810b8aa5 4673 }
d91d49e8 4674 if (AvFILLp(av) >= AvMAX(av)) {
d91d49e8
MM
4675 av_extend(av, AvFILLp(av)+1);
4676 }
4677 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
4678}
4679
645c22ef
DM
4680/* delete a back-reference to ourselves from the backref magic associated
4681 * with the SV we point to.
4682 */
4683
1c846c1f 4684STATIC void
e15faf7d 4685S_sv_del_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5 4686{
97aff369 4687 dVAR;
86f55936 4688 AV *av = NULL;
810b8aa5
GS
4689 SV **svp;
4690 I32 i;
86f55936
NC
4691
4692 if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
4693 av = *Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
5b285ea4
NC
4694 /* We mustn't attempt to "fix up" the hash here by moving the
4695 backreference array back to the hv_aux structure, as that is stored
4696 in the main HvARRAY(), and hfreentries assumes that no-one
4697 reallocates HvARRAY() while it is running. */
86f55936
NC
4698 }
4699 if (!av) {
4700 const MAGIC *const mg
4701 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
4702 if (mg)
4703 av = (AV *)mg->mg_obj;
4704 }
4705 if (!av) {
e15faf7d
NC
4706 if (PL_in_clean_all)
4707 return;
cea2e8a9 4708 Perl_croak(aTHX_ "panic: del_backref");
86f55936
NC
4709 }
4710
4711 if (SvIS_FREED(av))
4712 return;
4713
810b8aa5 4714 svp = AvARRAY(av);
6a76db8b
NC
4715 /* We shouldn't be in here more than once, but for paranoia reasons lets
4716 not assume this. */
4717 for (i = AvFILLp(av); i >= 0; i--) {
4718 if (svp[i] == sv) {
4719 const SSize_t fill = AvFILLp(av);
4720 if (i != fill) {
4721 /* We weren't the last entry.
4722 An unordered list has this property that you can take the
4723 last element off the end to fill the hole, and it's still
4724 an unordered list :-)
4725 */
4726 svp[i] = svp[fill];
4727 }
a0714e2c 4728 svp[fill] = NULL;
6a76db8b
NC
4729 AvFILLp(av) = fill - 1;
4730 }
4731 }
810b8aa5
GS
4732}
4733
86f55936
NC
4734int
4735Perl_sv_kill_backrefs(pTHX_ SV *sv, AV *av)
4736{
4737 SV **svp = AvARRAY(av);
4738
4739 PERL_UNUSED_ARG(sv);
4740
4741 /* Not sure why the av can get freed ahead of its sv, but somehow it does
4742 in ext/B/t/bytecode.t test 15 (involving print <DATA>) */
4743 if (svp && !SvIS_FREED(av)) {
4744 SV *const *const last = svp + AvFILLp(av);
4745
4746 while (svp <= last) {
4747 if (*svp) {
4748 SV *const referrer = *svp;
4749 if (SvWEAKREF(referrer)) {
4750 /* XXX Should we check that it hasn't changed? */
4751 SvRV_set(referrer, 0);
4752 SvOK_off(referrer);
4753 SvWEAKREF_off(referrer);
4754 } else if (SvTYPE(referrer) == SVt_PVGV ||
4755 SvTYPE(referrer) == SVt_PVLV) {
4756 /* You lookin' at me? */
4757 assert(GvSTASH(referrer));
4758 assert(GvSTASH(referrer) == (HV*)sv);
4759 GvSTASH(referrer) = 0;
4760 } else {
4761 Perl_croak(aTHX_
4762 "panic: magic_killbackrefs (flags=%"UVxf")",
4763 (UV)SvFLAGS(referrer));
4764 }
4765
a0714e2c 4766 *svp = NULL;
86f55936
NC
4767 }
4768 svp++;
4769 }
4770 }
4771 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
4772 return 0;
4773}
4774
954c1994
GS
4775/*
4776=for apidoc sv_insert
4777
4778Inserts a string at the specified offset/length within the SV. Similar to
4779the Perl substr() function.
4780
4781=cut
4782*/
4783
79072805 4784void
e1ec3a88 4785Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, const char *little, STRLEN littlelen)
79072805 4786{
97aff369 4787 dVAR;
79072805
LW
4788 register char *big;
4789 register char *mid;
4790 register char *midend;
4791 register char *bigend;
4792 register I32 i;
6ff81951 4793 STRLEN curlen;
1c846c1f 4794
79072805 4795
8990e307 4796 if (!bigstr)
cea2e8a9 4797 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 4798 SvPV_force(bigstr, curlen);
60fa28ff 4799 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
4800 if (offset + len > curlen) {
4801 SvGROW(bigstr, offset+len+1);
93524f2b 4802 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
6ff81951
GS
4803 SvCUR_set(bigstr, offset+len);
4804 }
79072805 4805
69b47968 4806 SvTAINT(bigstr);
79072805
LW
4807 i = littlelen - len;
4808 if (i > 0) { /* string might grow */
a0d0e21e 4809 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
4810 mid = big + offset + len;
4811 midend = bigend = big + SvCUR(bigstr);
4812 bigend += i;
4813 *bigend = '\0';
4814 while (midend > mid) /* shove everything down */
4815 *--bigend = *--midend;
4816 Move(little,big+offset,littlelen,char);
b162af07 4817 SvCUR_set(bigstr, SvCUR(bigstr) + i);
79072805
LW
4818 SvSETMAGIC(bigstr);
4819 return;
4820 }
4821 else if (i == 0) {
463ee0b2 4822 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
4823 SvSETMAGIC(bigstr);
4824 return;
4825 }
4826
463ee0b2 4827 big = SvPVX(bigstr);
79072805
LW
4828 mid = big + offset;
4829 midend = mid + len;
4830 bigend = big + SvCUR(bigstr);
4831
4832 if (midend > bigend)
cea2e8a9 4833 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
4834
4835 if (mid - big > bigend - midend) { /* faster to shorten from end */
4836 if (littlelen) {
4837 Move(little, mid, littlelen,char);
4838 mid += littlelen;
4839 }
4840 i = bigend - midend;
4841 if (i > 0) {
4842 Move(midend, mid, i,char);
4843 mid += i;
4844 }
4845 *mid = '\0';
4846 SvCUR_set(bigstr, mid - big);
4847 }
155aba94 4848 else if ((i = mid - big)) { /* faster from front */
79072805
LW
4849 midend -= littlelen;
4850 mid = midend;
4851 sv_chop(bigstr,midend-i);
4852 big += i;
4853 while (i--)
4854 *--midend = *--big;
4855 if (littlelen)
4856 Move(little, mid, littlelen,char);
4857 }
4858 else if (littlelen) {
4859 midend -= littlelen;
4860 sv_chop(bigstr,midend);
4861 Move(little,midend,littlelen,char);
4862 }
4863 else {
4864 sv_chop(bigstr,midend);
4865 }
4866 SvSETMAGIC(bigstr);
4867}
4868
c461cf8f
JH
4869/*
4870=for apidoc sv_replace
4871
4872Make the first argument a copy of the second, then delete the original.
645c22ef
DM
4873The target SV physically takes over ownership of the body of the source SV
4874and inherits its flags; however, the target keeps any magic it owns,
4875and any magic in the source is discarded.
ff276b08 4876Note that this is a rather specialist SV copying operation; most of the
645c22ef 4877time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
4878
4879=cut
4880*/
79072805
LW
4881
4882void
864dbfa3 4883Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805 4884{
97aff369 4885 dVAR;
a3b680e6 4886 const U32 refcnt = SvREFCNT(sv);
765f542d 4887 SV_CHECK_THINKFIRST_COW_DROP(sv);
30e5c352 4888 if (SvREFCNT(nsv) != 1) {
7437becc 4889 Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace() (%"
30e5c352
NC
4890 UVuf " != 1)", (UV) SvREFCNT(nsv));
4891 }
93a17b20 4892 if (SvMAGICAL(sv)) {
a0d0e21e
LW
4893 if (SvMAGICAL(nsv))
4894 mg_free(nsv);
4895 else
4896 sv_upgrade(nsv, SVt_PVMG);
b162af07 4897 SvMAGIC_set(nsv, SvMAGIC(sv));
a0d0e21e 4898 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20 4899 SvMAGICAL_off(sv);
b162af07 4900 SvMAGIC_set(sv, NULL);
93a17b20 4901 }
79072805
LW
4902 SvREFCNT(sv) = 0;
4903 sv_clear(sv);
477f5d66 4904 assert(!SvREFCNT(sv));
fd0854ff
DM
4905#ifdef DEBUG_LEAKING_SCALARS
4906 sv->sv_flags = nsv->sv_flags;
4907 sv->sv_any = nsv->sv_any;
4908 sv->sv_refcnt = nsv->sv_refcnt;
f34d0642 4909 sv->sv_u = nsv->sv_u;
fd0854ff 4910#else
79072805 4911 StructCopy(nsv,sv,SV);
fd0854ff 4912#endif
7b2c381c
NC
4913 /* Currently could join these into one piece of pointer arithmetic, but
4914 it would be unclear. */
4915 if(SvTYPE(sv) == SVt_IV)
4916 SvANY(sv)
339049b0 4917 = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
7b2c381c 4918 else if (SvTYPE(sv) == SVt_RV) {
339049b0 4919 SvANY(sv) = &sv->sv_u.svu_rv;
7b2c381c
NC
4920 }
4921
fd0854ff 4922
f8c7b90f 4923#ifdef PERL_OLD_COPY_ON_WRITE
d3d0e6f1
NC
4924 if (SvIsCOW_normal(nsv)) {
4925 /* We need to follow the pointers around the loop to make the
4926 previous SV point to sv, rather than nsv. */
4927 SV *next;
4928 SV *current = nsv;
4929 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
4930 assert(next);
4931 current = next;
3f7c398e 4932 assert(SvPVX_const(current) == SvPVX_const(nsv));
d3d0e6f1
NC
4933 }
4934 /* Make the SV before us point to the SV after us. */
4935 if (DEBUG_C_TEST) {
4936 PerlIO_printf(Perl_debug_log, "previous is\n");
4937 sv_dump(current);
a29f6d03
NC
4938 PerlIO_printf(Perl_debug_log,
4939 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
4940 (UV) SV_COW_NEXT_SV(current), (UV) sv);
4941 }
a29f6d03 4942 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
4943 }
4944#endif
79072805 4945 SvREFCNT(sv) = refcnt;
1edc1566 4946 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 4947 SvREFCNT(nsv) = 0;
463ee0b2 4948 del_SV(nsv);
79072805
LW
4949}
4950
c461cf8f
JH
4951/*
4952=for apidoc sv_clear
4953
645c22ef
DM
4954Clear an SV: call any destructors, free up any memory used by the body,
4955and free the body itself. The SV's head is I<not> freed, although
4956its type is set to all 1's so that it won't inadvertently be assumed
4957to be live during global destruction etc.
4958This function should only be called when REFCNT is zero. Most of the time
4959you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
4960instead.
c461cf8f
JH
4961
4962=cut
4963*/
4964
79072805 4965void
864dbfa3 4966Perl_sv_clear(pTHX_ register SV *sv)
79072805 4967{
27da23d5 4968 dVAR;
82bb6deb 4969 const U32 type = SvTYPE(sv);
8edfc514
NC
4970 const struct body_details *const sv_type_details
4971 = bodies_by_type + type;
82bb6deb 4972
79072805
LW
4973 assert(sv);
4974 assert(SvREFCNT(sv) == 0);
4975
d2a0f284
JC
4976 if (type <= SVt_IV) {
4977 /* See the comment in sv.h about the collusion between this early
4978 return and the overloading of the NULL and IV slots in the size
4979 table. */
82bb6deb 4980 return;
d2a0f284 4981 }
82bb6deb 4982
ed6116ce 4983 if (SvOBJECT(sv)) {
3280af22 4984 if (PL_defstash) { /* Still have a symbol table? */
39644a26 4985 dSP;
893645bd 4986 HV* stash;
d460ef45 4987 do {
b464bac0 4988 CV* destructor;
4e8e7886 4989 stash = SvSTASH(sv);
32251b26 4990 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 4991 if (destructor) {
1b6737cc 4992 SV* const tmpref = newRV(sv);
5cc433a6 4993 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 4994 ENTER;
e788e7d3 4995 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
4996 EXTEND(SP, 2);
4997 PUSHMARK(SP);
5cc433a6 4998 PUSHs(tmpref);
4e8e7886 4999 PUTBACK;
44389ee9 5000 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
7a5fa8a2
NIS
5001
5002
d3acc0f7 5003 POPSTACK;
3095d977 5004 SPAGAIN;
4e8e7886 5005 LEAVE;
5cc433a6
AB
5006 if(SvREFCNT(tmpref) < 2) {
5007 /* tmpref is not kept alive! */
5008 SvREFCNT(sv)--;
b162af07 5009 SvRV_set(tmpref, NULL);
5cc433a6
AB
5010 SvROK_off(tmpref);
5011 }
5012 SvREFCNT_dec(tmpref);
4e8e7886
GS
5013 }
5014 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5015
6f44e0a4
JP
5016
5017 if (SvREFCNT(sv)) {
5018 if (PL_in_clean_objs)
cea2e8a9 5019 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
bfcb3514 5020 HvNAME_get(stash));
6f44e0a4
JP
5021 /* DESTROY gave object new lease on life */
5022 return;
5023 }
a0d0e21e 5024 }
4e8e7886 5025
a0d0e21e 5026 if (SvOBJECT(sv)) {
4e8e7886 5027 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e 5028 SvOBJECT_off(sv); /* Curse the object. */
82bb6deb 5029 if (type != SVt_PVIO)
3280af22 5030 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5031 }
463ee0b2 5032 }
82bb6deb 5033 if (type >= SVt_PVMG) {
e736a858
NC
5034 HV *ourstash;
5035 if ((type == SVt_PVMG || type == SVt_PVGV) &&
5036 (ourstash = OURSTASH(sv))) {
5037 SvREFCNT_dec(ourstash);
5038 } else if (SvMAGIC(sv))
524189f1 5039 mg_free(sv);
00b1698f 5040 if (type == SVt_PVMG && SvPAD_TYPED(sv))
524189f1
JH
5041 SvREFCNT_dec(SvSTASH(sv));
5042 }
82bb6deb 5043 switch (type) {
8990e307 5044 case SVt_PVIO:
df0bd2f4
GS
5045 if (IoIFP(sv) &&
5046 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5047 IoIFP(sv) != PerlIO_stdout() &&
5048 IoIFP(sv) != PerlIO_stderr())
93578b34 5049 {
f2b5be74 5050 io_close((IO*)sv, FALSE);
93578b34 5051 }
1d7c1841 5052 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5053 PerlDir_close(IoDIRP(sv));
1d7c1841 5054 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5055 Safefree(IoTOP_NAME(sv));
5056 Safefree(IoFMT_NAME(sv));
5057 Safefree(IoBOTTOM_NAME(sv));
82bb6deb 5058 goto freescalar;
79072805 5059 case SVt_PVBM:
a0d0e21e 5060 goto freescalar;
79072805 5061 case SVt_PVCV:
748a9306 5062 case SVt_PVFM:
85e6fe83 5063 cv_undef((CV*)sv);
a0d0e21e 5064 goto freescalar;
79072805 5065 case SVt_PVHV:
86f55936 5066 Perl_hv_kill_backrefs(aTHX_ (HV*)sv);
85e6fe83 5067 hv_undef((HV*)sv);
a0d0e21e 5068 break;
79072805 5069 case SVt_PVAV:
85e6fe83 5070 av_undef((AV*)sv);
a0d0e21e 5071 break;
02270b4e 5072 case SVt_PVLV:
dd28f7bb
DM
5073 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5074 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5075 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5076 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5077 }
5078 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
5079 SvREFCNT_dec(LvTARG(sv));
02270b4e 5080 goto freescalar;
a0d0e21e 5081 case SVt_PVGV:
1edc1566 5082 gp_free((GV*)sv);
acda4c6a
NC
5083 if (GvNAME_HEK(sv)) {
5084 unshare_hek(GvNAME_HEK(sv));
5085 }
893645bd
NC
5086 /* If we're in a stash, we don't own a reference to it. However it does
5087 have a back reference to us, which needs to be cleared. */
5088 if (GvSTASH(sv))
5089 sv_del_backref((SV*)GvSTASH(sv), sv);
79072805 5090 case SVt_PVMG:
79072805
LW
5091 case SVt_PVNV:
5092 case SVt_PVIV:
a0d0e21e 5093 freescalar:
5228ca4e
NC
5094 /* Don't bother with SvOOK_off(sv); as we're only going to free it. */
5095 if (SvOOK(sv)) {
93524f2b 5096 SvPV_set(sv, SvPVX_mutable(sv) - SvIVX(sv));
5228ca4e
NC
5097 /* Don't even bother with turning off the OOK flag. */
5098 }
79072805 5099 case SVt_PV:
a0d0e21e 5100 case SVt_RV:
810b8aa5 5101 if (SvROK(sv)) {
b37c2d43 5102 SV * const target = SvRV(sv);
810b8aa5 5103 if (SvWEAKREF(sv))
e15faf7d 5104 sv_del_backref(target, sv);
810b8aa5 5105 else
e15faf7d 5106 SvREFCNT_dec(target);
810b8aa5 5107 }
f8c7b90f 5108#ifdef PERL_OLD_COPY_ON_WRITE
3f7c398e 5109 else if (SvPVX_const(sv)) {
765f542d
NC
5110 if (SvIsCOW(sv)) {
5111 /* I believe I need to grab the global SV mutex here and
5112 then recheck the COW status. */
46187eeb
NC
5113 if (DEBUG_C_TEST) {
5114 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5115 sv_dump(sv);
46187eeb 5116 }
bdd68bc3
NC
5117 sv_release_COW(sv, SvPVX_const(sv), SvLEN(sv),
5118 SV_COW_NEXT_SV(sv));
765f542d
NC
5119 /* And drop it here. */
5120 SvFAKE_off(sv);
5121 } else if (SvLEN(sv)) {
3f7c398e 5122 Safefree(SvPVX_const(sv));
765f542d
NC
5123 }
5124 }
5125#else
3f7c398e 5126 else if (SvPVX_const(sv) && SvLEN(sv))
94010e71 5127 Safefree(SvPVX_mutable(sv));
3f7c398e 5128 else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
bdd68bc3 5129 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
1c846c1f
NIS
5130 SvFAKE_off(sv);
5131 }
765f542d 5132#endif
79072805
LW
5133 break;
5134 case SVt_NV:
79072805
LW
5135 break;
5136 }
5137
893645bd
NC
5138 SvFLAGS(sv) &= SVf_BREAK;
5139 SvFLAGS(sv) |= SVTYPEMASK;
5140
8edfc514 5141 if (sv_type_details->arena) {
b9502f15 5142 del_body(((char *)SvANY(sv) + sv_type_details->offset),
8edfc514
NC
5143 &PL_body_roots[type]);
5144 }
d2a0f284 5145 else if (sv_type_details->body_size) {
8edfc514
NC
5146 my_safefree(SvANY(sv));
5147 }
79072805
LW
5148}
5149
645c22ef
DM
5150/*
5151=for apidoc sv_newref
5152
5153Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5154instead.
5155
5156=cut
5157*/
5158
79072805 5159SV *
864dbfa3 5160Perl_sv_newref(pTHX_ SV *sv)
79072805 5161{
96a5add6 5162 PERL_UNUSED_CONTEXT;
463ee0b2 5163 if (sv)
4db098f4 5164 (SvREFCNT(sv))++;
79072805
LW
5165 return sv;
5166}
5167
c461cf8f
JH
5168/*
5169=for apidoc sv_free
5170
645c22ef
DM
5171Decrement an SV's reference count, and if it drops to zero, call
5172C<sv_clear> to invoke destructors and free up any memory used by
5173the body; finally, deallocate the SV's head itself.
5174Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5175
5176=cut
5177*/
5178
79072805 5179void
864dbfa3 5180Perl_sv_free(pTHX_ SV *sv)
79072805 5181{
27da23d5 5182 dVAR;
79072805
LW
5183 if (!sv)
5184 return;
a0d0e21e
LW
5185 if (SvREFCNT(sv) == 0) {
5186 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5187 /* this SV's refcnt has been artificially decremented to
5188 * trigger cleanup */
a0d0e21e 5189 return;
3280af22 5190 if (PL_in_clean_all) /* All is fair */
1edc1566 5191 return;
d689ffdd
JP
5192 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5193 /* make sure SvREFCNT(sv)==0 happens very seldom */
5194 SvREFCNT(sv) = (~(U32)0)/2;
5195 return;
5196 }
41e4abd8 5197 if (ckWARN_d(WARN_INTERNAL)) {
d5dede04 5198 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
5199 "Attempt to free unreferenced scalar: SV 0x%"UVxf
5200 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
41e4abd8
NC
5201#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
5202 Perl_dump_sv_child(aTHX_ sv);
5203#endif
5204 }
79072805
LW
5205 return;
5206 }
4db098f4 5207 if (--(SvREFCNT(sv)) > 0)
8990e307 5208 return;
8c4d3c90
NC
5209 Perl_sv_free2(aTHX_ sv);
5210}
5211
5212void
5213Perl_sv_free2(pTHX_ SV *sv)
5214{
27da23d5 5215 dVAR;
463ee0b2
LW
5216#ifdef DEBUGGING
5217 if (SvTEMP(sv)) {
0453d815 5218 if (ckWARN_d(WARN_DEBUGGING))
9014280d 5219 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
472d47bc
SB
5220 "Attempt to free temp prematurely: SV 0x%"UVxf
5221 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 5222 return;
79072805 5223 }
463ee0b2 5224#endif
d689ffdd
JP
5225 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5226 /* make sure SvREFCNT(sv)==0 happens very seldom */
5227 SvREFCNT(sv) = (~(U32)0)/2;
5228 return;
5229 }
79072805 5230 sv_clear(sv);
477f5d66
CS
5231 if (! SvREFCNT(sv))
5232 del_SV(sv);
79072805
LW
5233}
5234
954c1994
GS
5235/*
5236=for apidoc sv_len
5237
645c22ef
DM
5238Returns the length of the string in the SV. Handles magic and type
5239coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5240
5241=cut
5242*/
5243
79072805 5244STRLEN
864dbfa3 5245Perl_sv_len(pTHX_ register SV *sv)
79072805 5246{
463ee0b2 5247 STRLEN len;
79072805
LW
5248
5249 if (!sv)
5250 return 0;
5251
8990e307 5252 if (SvGMAGICAL(sv))
565764a8 5253 len = mg_length(sv);
8990e307 5254 else
4d84ee25 5255 (void)SvPV_const(sv, len);
463ee0b2 5256 return len;
79072805
LW
5257}
5258
c461cf8f
JH
5259/*
5260=for apidoc sv_len_utf8
5261
5262Returns the number of characters in the string in an SV, counting wide
1e54db1a 5263UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5264
5265=cut
5266*/
5267
7e8c5dac
HS
5268/*
5269 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
5270 * mg_ptr is used, by sv_pos_u2b(), see the comments of S_utf8_mg_pos_init().
5271 * (Note that the mg_len is not the length of the mg_ptr field.)
7a5fa8a2 5272 *
7e8c5dac
HS
5273 */
5274
a0ed51b3 5275STRLEN
864dbfa3 5276Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 5277{
a0ed51b3
LW
5278 if (!sv)
5279 return 0;
5280
a0ed51b3 5281 if (SvGMAGICAL(sv))
b76347f2 5282 return mg_length(sv);
a0ed51b3 5283 else
b76347f2 5284 {
7e8c5dac 5285 STRLEN len, ulen;
e62f0680 5286 const U8 *s = (U8*)SvPV_const(sv, len);
7e8c5dac
HS
5287 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
5288
e23c8137 5289 if (mg && mg->mg_len != -1 && (mg->mg_len > 0 || len == 0)) {
7e8c5dac 5290 ulen = mg->mg_len;
e23c8137
JH
5291#ifdef PERL_UTF8_CACHE_ASSERT
5292 assert(ulen == Perl_utf8_length(aTHX_ s, s + len));
5293#endif
5294 }
7e8c5dac
HS
5295 else {
5296 ulen = Perl_utf8_length(aTHX_ s, s + len);
5297 if (!mg && !SvREADONLY(sv)) {
5298 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
5299 mg = mg_find(sv, PERL_MAGIC_utf8);
5300 assert(mg);
5301 }
5302 if (mg)
5303 mg->mg_len = ulen;
5304 }
5305 return ulen;
5306 }
5307}
5308
5309/* S_utf8_mg_pos_init() is used to initialize the mg_ptr field of
5310 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5311 * between UTF-8 and byte offsets. There are two (substr offset and substr
5312 * length, the i offset, PERL_MAGIC_UTF8_CACHESIZE) times two (UTF-8 offset
5313 * and byte offset) cache positions.
5314 *
5315 * The mg_len field is used by sv_len_utf8(), see its comments.
5316 * Note that the mg_len is not the length of the mg_ptr field.
5317 *
5318 */
5319STATIC bool
245d4a47
NC
5320S_utf8_mg_pos_init(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i,
5321 I32 offsetp, const U8 *s, const U8 *start)
7e8c5dac 5322{
7a5fa8a2 5323 bool found = FALSE;
7e8c5dac
HS
5324
5325 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
8f78557a 5326 if (!*mgp)
27da23d5 5327 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0, 0);
7e8c5dac 5328 assert(*mgp);
b76347f2 5329
7e8c5dac
HS
5330 if ((*mgp)->mg_ptr)
5331 *cachep = (STRLEN *) (*mgp)->mg_ptr;
5332 else {
a02a5408 5333 Newxz(*cachep, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7e8c5dac
HS
5334 (*mgp)->mg_ptr = (char *) *cachep;
5335 }
5336 assert(*cachep);
5337
a3b680e6 5338 (*cachep)[i] = offsetp;
7e8c5dac
HS
5339 (*cachep)[i+1] = s - start;
5340 found = TRUE;
a0ed51b3 5341 }
7e8c5dac
HS
5342
5343 return found;
a0ed51b3
LW
5344}
5345
645c22ef 5346/*
7e8c5dac
HS
5347 * S_utf8_mg_pos() is used to query and update mg_ptr field of
5348 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5349 * between UTF-8 and byte offsets. See also the comments of
5350 * S_utf8_mg_pos_init().
5351 *
5352 */
5353STATIC bool
245d4a47 5354S_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
5355{
5356 bool found = FALSE;
5357
5358 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
5359 if (!*mgp)
5360 *mgp = mg_find(sv, PERL_MAGIC_utf8);
5361 if (*mgp && (*mgp)->mg_ptr) {
5362 *cachep = (STRLEN *) (*mgp)->mg_ptr;
e23c8137 5363 ASSERT_UTF8_CACHE(*cachep);
667208dd 5364 if ((*cachep)[i] == (STRLEN)uoff) /* An exact match. */
7a5fa8a2 5365 found = TRUE;
7e8c5dac
HS
5366 else { /* We will skip to the right spot. */
5367 STRLEN forw = 0;
5368 STRLEN backw = 0;
a3b680e6 5369 const U8* p = NULL;
7e8c5dac
HS
5370
5371 /* The assumption is that going backward is half
5372 * the speed of going forward (that's where the
5373 * 2 * backw in the below comes from). (The real
5374 * figure of course depends on the UTF-8 data.) */
5375
667208dd 5376 if ((*cachep)[i] > (STRLEN)uoff) {
7e8c5dac 5377 forw = uoff;
667208dd 5378 backw = (*cachep)[i] - (STRLEN)uoff;
7e8c5dac
HS
5379
5380 if (forw < 2 * backw)
5381 p = start;
5382 else
5383 p = start + (*cachep)[i+1];
5384 }
5385 /* Try this only for the substr offset (i == 0),
5386 * not for the substr length (i == 2). */
5387 else if (i == 0) { /* (*cachep)[i] < uoff */
a3b680e6 5388 const STRLEN ulen = sv_len_utf8(sv);
7e8c5dac 5389
667208dd
JH
5390 if ((STRLEN)uoff < ulen) {
5391 forw = (STRLEN)uoff - (*cachep)[i];
5392 backw = ulen - (STRLEN)uoff;
7e8c5dac
HS
5393
5394 if (forw < 2 * backw)
5395 p = start + (*cachep)[i+1];
5396 else
5397 p = send;
5398 }
5399
5400 /* If the string is not long enough for uoff,
5401 * we could extend it, but not at this low a level. */
5402 }
5403
5404 if (p) {
5405 if (forw < 2 * backw) {
5406 while (forw--)
5407 p += UTF8SKIP(p);
5408 }
5409 else {
5410 while (backw--) {
5411 p--;
5412 while (UTF8_IS_CONTINUATION(*p))
5413 p--;
5414 }
5415 }
5416
5417 /* Update the cache. */
667208dd 5418 (*cachep)[i] = (STRLEN)uoff;
7e8c5dac 5419 (*cachep)[i+1] = p - start;
8f78557a
AE
5420
5421 /* Drop the stale "length" cache */
5422 if (i == 0) {
5423 (*cachep)[2] = 0;
5424 (*cachep)[3] = 0;
5425 }
7a5fa8a2 5426
7e8c5dac
HS
5427 found = TRUE;
5428 }
5429 }
5430 if (found) { /* Setup the return values. */
5431 *offsetp = (*cachep)[i+1];
5432 *sp = start + *offsetp;
5433 if (*sp >= send) {
5434 *sp = send;
5435 *offsetp = send - start;
5436 }
5437 else if (*sp < start) {
5438 *sp = start;
5439 *offsetp = 0;
5440 }
5441 }
5442 }
e23c8137
JH
5443#ifdef PERL_UTF8_CACHE_ASSERT
5444 if (found) {
5445 U8 *s = start;
5446 I32 n = uoff;
5447
5448 while (n-- && s < send)
5449 s += UTF8SKIP(s);
5450
5451 if (i == 0) {
5452 assert(*offsetp == s - start);
5453 assert((*cachep)[0] == (STRLEN)uoff);
5454 assert((*cachep)[1] == *offsetp);
5455 }
5456 ASSERT_UTF8_CACHE(*cachep);
5457 }
5458#endif
7e8c5dac 5459 }
e23c8137 5460
7e8c5dac
HS
5461 return found;
5462}
7a5fa8a2 5463
7e8c5dac 5464/*
645c22ef
DM
5465=for apidoc sv_pos_u2b
5466
1e54db1a 5467Converts the value pointed to by offsetp from a count of UTF-8 chars from
645c22ef
DM
5468the start of the string, to a count of the equivalent number of bytes; if
5469lenp is non-zero, it does the same to lenp, but this time starting from
5470the offset, rather than from the start of the string. Handles magic and
5471type coercion.
5472
5473=cut
5474*/
5475
7e8c5dac
HS
5476/*
5477 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
5478 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5479 * byte offsets. See also the comments of S_utf8_mg_pos().
5480 *
5481 */
5482
a0ed51b3 5483void
864dbfa3 5484Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 5485{
245d4a47 5486 const U8 *start;
a0ed51b3
LW
5487 STRLEN len;
5488
5489 if (!sv)
5490 return;
5491
245d4a47 5492 start = (U8*)SvPV_const(sv, len);
7e8c5dac 5493 if (len) {
b464bac0 5494 STRLEN boffset = 0;
cbbf8932 5495 STRLEN *cache = NULL;
245d4a47
NC
5496 const U8 *s = start;
5497 I32 uoffset = *offsetp;
9d4ba2ae 5498 const U8 * const send = s + len;
cbbf8932
AL
5499 MAGIC *mg = NULL;
5500 bool found = utf8_mg_pos(sv, &mg, &cache, 0, offsetp, *offsetp, &s, start, send);
7e8c5dac 5501
7e8c5dac
HS
5502 if (!found && uoffset > 0) {
5503 while (s < send && uoffset--)
5504 s += UTF8SKIP(s);
5505 if (s >= send)
5506 s = send;
a3b680e6 5507 if (utf8_mg_pos_init(sv, &mg, &cache, 0, *offsetp, s, start))
7e8c5dac
HS
5508 boffset = cache[1];
5509 *offsetp = s - start;
5510 }
5511 if (lenp) {
5512 found = FALSE;
5513 start = s;
ec062429 5514 if (utf8_mg_pos(sv, &mg, &cache, 2, lenp, *lenp, &s, start, send)) {
7e8c5dac
HS
5515 *lenp -= boffset;
5516 found = TRUE;
5517 }
5518 if (!found && *lenp > 0) {
5519 I32 ulen = *lenp;
5520 if (ulen > 0)
5521 while (s < send && ulen--)
5522 s += UTF8SKIP(s);
5523 if (s >= send)
5524 s = send;
a3b680e6 5525 utf8_mg_pos_init(sv, &mg, &cache, 2, *lenp, s, start);
7e8c5dac
HS
5526 }
5527 *lenp = s - start;
5528 }
e23c8137 5529 ASSERT_UTF8_CACHE(cache);
7e8c5dac
HS
5530 }
5531 else {
5532 *offsetp = 0;
5533 if (lenp)
5534 *lenp = 0;
a0ed51b3 5535 }
e23c8137 5536
a0ed51b3
LW
5537 return;
5538}
5539
645c22ef
DM
5540/*
5541=for apidoc sv_pos_b2u
5542
5543Converts the value pointed to by offsetp from a count of bytes from the
1e54db1a 5544start of the string, to a count of the equivalent number of UTF-8 chars.
645c22ef
DM
5545Handles magic and type coercion.
5546
5547=cut
5548*/
5549
7e8c5dac
HS
5550/*
5551 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
5552 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5553 * byte offsets. See also the comments of S_utf8_mg_pos().
5554 *
5555 */
5556
a0ed51b3 5557void
7e8c5dac 5558Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 5559{
83003860 5560 const U8* s;
a0ed51b3
LW
5561 STRLEN len;
5562
5563 if (!sv)
5564 return;
5565
83003860 5566 s = (const U8*)SvPV_const(sv, len);
eb160463 5567 if ((I32)len < *offsetp)
a0dbb045 5568 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac 5569 else {
83003860 5570 const U8* send = s + *offsetp;
7e8c5dac
HS
5571 MAGIC* mg = NULL;
5572 STRLEN *cache = NULL;
5573
5574 len = 0;
5575
5576 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
5577 mg = mg_find(sv, PERL_MAGIC_utf8);
5578 if (mg && mg->mg_ptr) {
5579 cache = (STRLEN *) mg->mg_ptr;
c5661c80 5580 if (cache[1] == (STRLEN)*offsetp) {
7e8c5dac
HS
5581 /* An exact match. */
5582 *offsetp = cache[0];
5583
5584 return;
5585 }
c5661c80 5586 else if (cache[1] < (STRLEN)*offsetp) {
7e8c5dac
HS
5587 /* We already know part of the way. */
5588 len = cache[0];
5589 s += cache[1];
7a5fa8a2 5590 /* Let the below loop do the rest. */
7e8c5dac
HS
5591 }
5592 else { /* cache[1] > *offsetp */
5593 /* We already know all of the way, now we may
5594 * be able to walk back. The same assumption
5595 * is made as in S_utf8_mg_pos(), namely that
5596 * walking backward is twice slower than
5597 * walking forward. */
9d4ba2ae 5598 const STRLEN forw = *offsetp;
7e8c5dac
HS
5599 STRLEN backw = cache[1] - *offsetp;
5600
5601 if (!(forw < 2 * backw)) {
83003860 5602 const U8 *p = s + cache[1];
7e8c5dac 5603 STRLEN ubackw = 0;
7a5fa8a2 5604
a5b510f2
AE
5605 cache[1] -= backw;
5606
7e8c5dac
HS
5607 while (backw--) {
5608 p--;
0aeb64d0 5609 while (UTF8_IS_CONTINUATION(*p)) {
7e8c5dac 5610 p--;
0aeb64d0
JH
5611 backw--;
5612 }
7e8c5dac
HS
5613 ubackw++;
5614 }
5615
5616 cache[0] -= ubackw;
0aeb64d0 5617 *offsetp = cache[0];
a67d7df9
TS
5618
5619 /* Drop the stale "length" cache */
5620 cache[2] = 0;
5621 cache[3] = 0;
5622
0aeb64d0 5623 return;
7e8c5dac
HS
5624 }
5625 }
5626 }
e23c8137 5627 ASSERT_UTF8_CACHE(cache);
a0dbb045 5628 }
7e8c5dac
HS
5629
5630 while (s < send) {
5631 STRLEN n = 1;
5632
5633 /* Call utf8n_to_uvchr() to validate the sequence
5634 * (unless a simple non-UTF character) */
5635 if (!UTF8_IS_INVARIANT(*s))
5636 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
5637 if (n > 0) {
5638 s += n;
5639 len++;
5640 }
5641 else
5642 break;
5643 }
5644
5645 if (!SvREADONLY(sv)) {
5646 if (!mg) {
5647 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
5648 mg = mg_find(sv, PERL_MAGIC_utf8);
5649 }
5650 assert(mg);
5651
5652 if (!mg->mg_ptr) {
a02a5408 5653 Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7e8c5dac
HS
5654 mg->mg_ptr = (char *) cache;
5655 }
5656 assert(cache);
5657
5658 cache[0] = len;
5659 cache[1] = *offsetp;
a67d7df9
TS
5660 /* Drop the stale "length" cache */
5661 cache[2] = 0;
5662 cache[3] = 0;
7e8c5dac
HS
5663 }
5664
5665 *offsetp = len;
a0ed51b3 5666 }
a0ed51b3
LW
5667 return;
5668}
5669
954c1994
GS
5670/*
5671=for apidoc sv_eq
5672
5673Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
5674identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5675coerce its args to strings if necessary.
954c1994
GS
5676
5677=cut
5678*/
5679
79072805 5680I32
e01b9e88 5681Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805 5682{
97aff369 5683 dVAR;
e1ec3a88 5684 const char *pv1;
463ee0b2 5685 STRLEN cur1;
e1ec3a88 5686 const char *pv2;
463ee0b2 5687 STRLEN cur2;
e01b9e88 5688 I32 eq = 0;
bd61b366 5689 char *tpv = NULL;
a0714e2c 5690 SV* svrecode = NULL;
79072805 5691
e01b9e88 5692 if (!sv1) {
79072805
LW
5693 pv1 = "";
5694 cur1 = 0;
5695 }
463ee0b2 5696 else
4d84ee25 5697 pv1 = SvPV_const(sv1, cur1);
79072805 5698
e01b9e88
SC
5699 if (!sv2){
5700 pv2 = "";
5701 cur2 = 0;
92d29cee 5702 }
e01b9e88 5703 else
4d84ee25 5704 pv2 = SvPV_const(sv2, cur2);
79072805 5705
cf48d248 5706 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
5707 /* Differing utf8ness.
5708 * Do not UTF8size the comparands as a side-effect. */
5709 if (PL_encoding) {
5710 if (SvUTF8(sv1)) {
553e1bcc
AT
5711 svrecode = newSVpvn(pv2, cur2);
5712 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5713 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
5714 }
5715 else {
553e1bcc
AT
5716 svrecode = newSVpvn(pv1, cur1);
5717 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5718 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
5719 }
5720 /* Now both are in UTF-8. */
0a1bd7ac
DM
5721 if (cur1 != cur2) {
5722 SvREFCNT_dec(svrecode);
799ef3cb 5723 return FALSE;
0a1bd7ac 5724 }
799ef3cb
JH
5725 }
5726 else {
5727 bool is_utf8 = TRUE;
5728
5729 if (SvUTF8(sv1)) {
5730 /* sv1 is the UTF-8 one,
5731 * if is equal it must be downgrade-able */
9d4ba2ae 5732 char * const pv = (char*)bytes_from_utf8((const U8*)pv1,
799ef3cb
JH
5733 &cur1, &is_utf8);
5734 if (pv != pv1)
553e1bcc 5735 pv1 = tpv = pv;
799ef3cb
JH
5736 }
5737 else {
5738 /* sv2 is the UTF-8 one,
5739 * if is equal it must be downgrade-able */
9d4ba2ae 5740 char * const pv = (char *)bytes_from_utf8((const U8*)pv2,
799ef3cb
JH
5741 &cur2, &is_utf8);
5742 if (pv != pv2)
553e1bcc 5743 pv2 = tpv = pv;
799ef3cb
JH
5744 }
5745 if (is_utf8) {
5746 /* Downgrade not possible - cannot be eq */
bf694877 5747 assert (tpv == 0);
799ef3cb
JH
5748 return FALSE;
5749 }
5750 }
cf48d248
JH
5751 }
5752
5753 if (cur1 == cur2)
765f542d 5754 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 5755
b37c2d43 5756 SvREFCNT_dec(svrecode);
553e1bcc
AT
5757 if (tpv)
5758 Safefree(tpv);
cf48d248 5759
e01b9e88 5760 return eq;
79072805
LW
5761}
5762
954c1994
GS
5763/*
5764=for apidoc sv_cmp
5765
5766Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
5767string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
5768C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5769coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
5770
5771=cut
5772*/
5773
79072805 5774I32
e01b9e88 5775Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 5776{
97aff369 5777 dVAR;
560a288e 5778 STRLEN cur1, cur2;
e1ec3a88 5779 const char *pv1, *pv2;
bd61b366 5780 char *tpv = NULL;
cf48d248 5781 I32 cmp;
a0714e2c 5782 SV *svrecode = NULL;
560a288e 5783
e01b9e88
SC
5784 if (!sv1) {
5785 pv1 = "";
560a288e
GS
5786 cur1 = 0;
5787 }
e01b9e88 5788 else
4d84ee25 5789 pv1 = SvPV_const(sv1, cur1);
560a288e 5790
553e1bcc 5791 if (!sv2) {
e01b9e88 5792 pv2 = "";
560a288e
GS
5793 cur2 = 0;
5794 }
e01b9e88 5795 else
4d84ee25 5796 pv2 = SvPV_const(sv2, cur2);
79072805 5797
cf48d248 5798 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
5799 /* Differing utf8ness.
5800 * Do not UTF8size the comparands as a side-effect. */
cf48d248 5801 if (SvUTF8(sv1)) {
799ef3cb 5802 if (PL_encoding) {
553e1bcc
AT
5803 svrecode = newSVpvn(pv2, cur2);
5804 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5805 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
5806 }
5807 else {
e1ec3a88 5808 pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
799ef3cb 5809 }
cf48d248
JH
5810 }
5811 else {
799ef3cb 5812 if (PL_encoding) {
553e1bcc
AT
5813 svrecode = newSVpvn(pv1, cur1);
5814 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5815 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
5816 }
5817 else {
e1ec3a88 5818 pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
799ef3cb 5819 }
cf48d248
JH
5820 }
5821 }
5822
e01b9e88 5823 if (!cur1) {
cf48d248 5824 cmp = cur2 ? -1 : 0;
e01b9e88 5825 } else if (!cur2) {
cf48d248
JH
5826 cmp = 1;
5827 } else {
e1ec3a88 5828 const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
5829
5830 if (retval) {
cf48d248 5831 cmp = retval < 0 ? -1 : 1;
e01b9e88 5832 } else if (cur1 == cur2) {
cf48d248
JH
5833 cmp = 0;
5834 } else {
5835 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 5836 }
cf48d248 5837 }
16660edb 5838
b37c2d43 5839 SvREFCNT_dec(svrecode);
553e1bcc
AT
5840 if (tpv)
5841 Safefree(tpv);
cf48d248
JH
5842
5843 return cmp;
bbce6d69 5844}
16660edb 5845
c461cf8f
JH
5846/*
5847=for apidoc sv_cmp_locale
5848
645c22ef
DM
5849Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
5850'use bytes' aware, handles get magic, and will coerce its args to strings
5851if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
5852
5853=cut
5854*/
5855
bbce6d69 5856I32
864dbfa3 5857Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 5858{
97aff369 5859 dVAR;
36477c24 5860#ifdef USE_LOCALE_COLLATE
16660edb 5861
bbce6d69 5862 char *pv1, *pv2;
5863 STRLEN len1, len2;
5864 I32 retval;
16660edb 5865
3280af22 5866 if (PL_collation_standard)
bbce6d69 5867 goto raw_compare;
16660edb 5868
bbce6d69 5869 len1 = 0;
8ac85365 5870 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 5871 len2 = 0;
8ac85365 5872 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 5873
bbce6d69 5874 if (!pv1 || !len1) {
5875 if (pv2 && len2)
5876 return -1;
5877 else
5878 goto raw_compare;
5879 }
5880 else {
5881 if (!pv2 || !len2)
5882 return 1;
5883 }
16660edb 5884
bbce6d69 5885 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 5886
bbce6d69 5887 if (retval)
16660edb 5888 return retval < 0 ? -1 : 1;
5889
bbce6d69 5890 /*
5891 * When the result of collation is equality, that doesn't mean
5892 * that there are no differences -- some locales exclude some
5893 * characters from consideration. So to avoid false equalities,
5894 * we use the raw string as a tiebreaker.
5895 */
16660edb 5896
bbce6d69 5897 raw_compare:
5f66b61c 5898 /*FALLTHROUGH*/
16660edb 5899
36477c24 5900#endif /* USE_LOCALE_COLLATE */
16660edb 5901
bbce6d69 5902 return sv_cmp(sv1, sv2);
5903}
79072805 5904
645c22ef 5905
36477c24 5906#ifdef USE_LOCALE_COLLATE
645c22ef 5907
7a4c00b4 5908/*
645c22ef
DM
5909=for apidoc sv_collxfrm
5910
5911Add Collate Transform magic to an SV if it doesn't already have it.
5912
5913Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
5914scalar data of the variable, but transformed to such a format that a normal
5915memory comparison can be used to compare the data according to the locale
5916settings.
5917
5918=cut
5919*/
5920
bbce6d69 5921char *
864dbfa3 5922Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 5923{
97aff369 5924 dVAR;
7a4c00b4 5925 MAGIC *mg;
16660edb 5926
14befaf4 5927 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 5928 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
93524f2b
NC
5929 const char *s;
5930 char *xf;
bbce6d69 5931 STRLEN len, xlen;
5932
7a4c00b4 5933 if (mg)
5934 Safefree(mg->mg_ptr);
93524f2b 5935 s = SvPV_const(sv, len);
bbce6d69 5936 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 5937 if (SvREADONLY(sv)) {
5938 SAVEFREEPV(xf);
5939 *nxp = xlen;
3280af22 5940 return xf + sizeof(PL_collation_ix);
ff0cee69 5941 }
7a4c00b4 5942 if (! mg) {
14befaf4
DM
5943 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
5944 mg = mg_find(sv, PERL_MAGIC_collxfrm);
7a4c00b4 5945 assert(mg);
bbce6d69 5946 }
7a4c00b4 5947 mg->mg_ptr = xf;
565764a8 5948 mg->mg_len = xlen;
7a4c00b4 5949 }
5950 else {
ff0cee69 5951 if (mg) {
5952 mg->mg_ptr = NULL;
565764a8 5953 mg->mg_len = -1;
ff0cee69 5954 }
bbce6d69 5955 }
5956 }
7a4c00b4 5957 if (mg && mg->mg_ptr) {
565764a8 5958 *nxp = mg->mg_len;
3280af22 5959 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 5960 }
5961 else {
5962 *nxp = 0;
5963 return NULL;
16660edb 5964 }
79072805
LW
5965}
5966
36477c24 5967#endif /* USE_LOCALE_COLLATE */
bbce6d69 5968
c461cf8f
JH
5969/*
5970=for apidoc sv_gets
5971
5972Get a line from the filehandle and store it into the SV, optionally
5973appending to the currently-stored string.
5974
5975=cut
5976*/
5977
79072805 5978char *
864dbfa3 5979Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 5980{
97aff369 5981 dVAR;
e1ec3a88 5982 const char *rsptr;
c07a80fd 5983 STRLEN rslen;
5984 register STDCHAR rslast;
5985 register STDCHAR *bp;
5986 register I32 cnt;
9c5ffd7c 5987 I32 i = 0;
8bfdd7d9 5988 I32 rspara = 0;
e311fd51 5989 I32 recsize;
c07a80fd 5990
bc44a8a2
NC
5991 if (SvTHINKFIRST(sv))
5992 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
5993 /* XXX. If you make this PVIV, then copy on write can copy scalars read
5994 from <>.
5995 However, perlbench says it's slower, because the existing swipe code
5996 is faster than copy on write.
5997 Swings and roundabouts. */
862a34c6 5998 SvUPGRADE(sv, SVt_PV);
99491443 5999
ff68c719 6000 SvSCREAM_off(sv);
efd8b2ba
AE
6001
6002 if (append) {
6003 if (PerlIO_isutf8(fp)) {
6004 if (!SvUTF8(sv)) {
6005 sv_utf8_upgrade_nomg(sv);
6006 sv_pos_u2b(sv,&append,0);
6007 }
6008 } else if (SvUTF8(sv)) {
561b68a9 6009 SV * const tsv = newSV(0);
efd8b2ba
AE
6010 sv_gets(tsv, fp, 0);
6011 sv_utf8_upgrade_nomg(tsv);
6012 SvCUR_set(sv,append);
6013 sv_catsv(sv,tsv);
6014 sv_free(tsv);
6015 goto return_string_or_null;
6016 }
6017 }
6018
6019 SvPOK_only(sv);
6020 if (PerlIO_isutf8(fp))
6021 SvUTF8_on(sv);
c07a80fd 6022
923e4eb5 6023 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
6024 /* we always read code in line mode */
6025 rsptr = "\n";
6026 rslen = 1;
6027 }
6028 else if (RsSNARF(PL_rs)) {
7a5fa8a2
NIS
6029 /* If it is a regular disk file use size from stat() as estimate
6030 of amount we are going to read - may result in malloc-ing
6031 more memory than we realy need if layers bellow reduce
e468d35b
NIS
6032 size we read (e.g. CRLF or a gzip layer)
6033 */
e311fd51 6034 Stat_t st;
e468d35b 6035 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
f54cb97a 6036 const Off_t offset = PerlIO_tell(fp);
58f1856e 6037 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
6038 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6039 }
6040 }
c07a80fd 6041 rsptr = NULL;
6042 rslen = 0;
6043 }
3280af22 6044 else if (RsRECORD(PL_rs)) {
e311fd51 6045 I32 bytesread;
5b2b9c68
HM
6046 char *buffer;
6047
6048 /* Grab the size of the record we're getting */
3280af22 6049 recsize = SvIV(SvRV(PL_rs));
e311fd51 6050 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
6051 /* Go yank in */
6052#ifdef VMS
6053 /* VMS wants read instead of fread, because fread doesn't respect */
6054 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
6055 /* doing, but we've got no other real choice - except avoid stdio
6056 as implementation - perhaps write a :vms layer ?
6057 */
5b2b9c68
HM
6058 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
6059#else
6060 bytesread = PerlIO_read(fp, buffer, recsize);
6061#endif
27e6ca2d
AE
6062 if (bytesread < 0)
6063 bytesread = 0;
e311fd51 6064 SvCUR_set(sv, bytesread += append);
e670df4e 6065 buffer[bytesread] = '\0';
efd8b2ba 6066 goto return_string_or_null;
5b2b9c68 6067 }
3280af22 6068 else if (RsPARA(PL_rs)) {
c07a80fd 6069 rsptr = "\n\n";
6070 rslen = 2;
8bfdd7d9 6071 rspara = 1;
c07a80fd 6072 }
7d59b7e4
NIS
6073 else {
6074 /* Get $/ i.e. PL_rs into same encoding as stream wants */
6075 if (PerlIO_isutf8(fp)) {
6076 rsptr = SvPVutf8(PL_rs, rslen);
6077 }
6078 else {
6079 if (SvUTF8(PL_rs)) {
6080 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
6081 Perl_croak(aTHX_ "Wide character in $/");
6082 }
6083 }
93524f2b 6084 rsptr = SvPV_const(PL_rs, rslen);
7d59b7e4
NIS
6085 }
6086 }
6087
c07a80fd 6088 rslast = rslen ? rsptr[rslen - 1] : '\0';
6089
8bfdd7d9 6090 if (rspara) { /* have to do this both before and after */
79072805 6091 do { /* to make sure file boundaries work right */
760ac839 6092 if (PerlIO_eof(fp))
a0d0e21e 6093 return 0;
760ac839 6094 i = PerlIO_getc(fp);
79072805 6095 if (i != '\n') {
a0d0e21e
LW
6096 if (i == -1)
6097 return 0;
760ac839 6098 PerlIO_ungetc(fp,i);
79072805
LW
6099 break;
6100 }
6101 } while (i != EOF);
6102 }
c07a80fd 6103
760ac839
LW
6104 /* See if we know enough about I/O mechanism to cheat it ! */
6105
6106 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 6107 of abstracting out stdio interface. One call should be cheap
760ac839
LW
6108 enough here - and may even be a macro allowing compile
6109 time optimization.
6110 */
6111
6112 if (PerlIO_fast_gets(fp)) {
6113
6114 /*
6115 * We're going to steal some values from the stdio struct
6116 * and put EVERYTHING in the innermost loop into registers.
6117 */
6118 register STDCHAR *ptr;
6119 STRLEN bpx;
6120 I32 shortbuffered;
6121
16660edb 6122#if defined(VMS) && defined(PERLIO_IS_STDIO)
6123 /* An ungetc()d char is handled separately from the regular
6124 * buffer, so we getc() it back out and stuff it in the buffer.
6125 */
6126 i = PerlIO_getc(fp);
6127 if (i == EOF) return 0;
6128 *(--((*fp)->_ptr)) = (unsigned char) i;
6129 (*fp)->_cnt++;
6130#endif
c07a80fd 6131
c2960299 6132 /* Here is some breathtakingly efficient cheating */
c07a80fd 6133
a20bf0c3 6134 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b 6135 /* make sure we have the room */
7a5fa8a2 6136 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
e468d35b 6137 /* Not room for all of it
7a5fa8a2 6138 if we are looking for a separator and room for some
e468d35b
NIS
6139 */
6140 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7a5fa8a2 6141 /* just process what we have room for */
79072805
LW
6142 shortbuffered = cnt - SvLEN(sv) + append + 1;
6143 cnt -= shortbuffered;
6144 }
6145 else {
6146 shortbuffered = 0;
bbce6d69 6147 /* remember that cnt can be negative */
eb160463 6148 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
6149 }
6150 }
7a5fa8a2 6151 else
79072805 6152 shortbuffered = 0;
3f7c398e 6153 bp = (STDCHAR*)SvPVX_const(sv) + append; /* move these two too to registers */
a20bf0c3 6154 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 6155 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6156 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 6157 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 6158 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6159 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6160 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
6161 for (;;) {
6162 screamer:
93a17b20 6163 if (cnt > 0) {
c07a80fd 6164 if (rslen) {
760ac839
LW
6165 while (cnt > 0) { /* this | eat */
6166 cnt--;
c07a80fd 6167 if ((*bp++ = *ptr++) == rslast) /* really | dust */
6168 goto thats_all_folks; /* screams | sed :-) */
6169 }
6170 }
6171 else {
1c846c1f
NIS
6172 Copy(ptr, bp, cnt, char); /* this | eat */
6173 bp += cnt; /* screams | dust */
c07a80fd 6174 ptr += cnt; /* louder | sed :-) */
a5f75d66 6175 cnt = 0;
93a17b20 6176 }
79072805
LW
6177 }
6178
748a9306 6179 if (shortbuffered) { /* oh well, must extend */
79072805
LW
6180 cnt = shortbuffered;
6181 shortbuffered = 0;
3f7c398e 6182 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6183 SvCUR_set(sv, bpx);
6184 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3f7c398e 6185 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
79072805
LW
6186 continue;
6187 }
6188
16660edb 6189 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
6190 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
6191 PTR2UV(ptr),(long)cnt));
cc00df79 6192 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 6193#if 0
16660edb 6194 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6195 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6196 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6197 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6198#endif
1c846c1f 6199 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 6200 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
6201 another abstraction. */
760ac839 6202 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 6203#if 0
16660edb 6204 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6205 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6206 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6207 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6208#endif
a20bf0c3
JH
6209 cnt = PerlIO_get_cnt(fp);
6210 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 6211 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6212 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 6213
748a9306
LW
6214 if (i == EOF) /* all done for ever? */
6215 goto thats_really_all_folks;
6216
3f7c398e 6217 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6218 SvCUR_set(sv, bpx);
6219 SvGROW(sv, bpx + cnt + 2);
3f7c398e 6220 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
c07a80fd 6221
eb160463 6222 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 6223
c07a80fd 6224 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 6225 goto thats_all_folks;
79072805
LW
6226 }
6227
6228thats_all_folks:
3f7c398e 6229 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
36477c24 6230 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 6231 goto screamer; /* go back to the fray */
79072805
LW
6232thats_really_all_folks:
6233 if (shortbuffered)
6234 cnt += shortbuffered;
16660edb 6235 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6236 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 6237 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 6238 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6239 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6240 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6241 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 6242 *bp = '\0';
3f7c398e 6243 SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv)); /* set length */
16660edb 6244 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 6245 "Screamer: done, len=%ld, string=|%.*s|\n",
3f7c398e 6246 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
760ac839
LW
6247 }
6248 else
79072805 6249 {
6edd2cd5 6250 /*The big, slow, and stupid way. */
27da23d5 6251#ifdef USE_HEAP_INSTEAD_OF_STACK /* Even slower way. */
cbbf8932 6252 STDCHAR *buf = NULL;
a02a5408 6253 Newx(buf, 8192, STDCHAR);
6edd2cd5 6254 assert(buf);
4d2c4e07 6255#else
6edd2cd5 6256 STDCHAR buf[8192];
4d2c4e07 6257#endif
79072805 6258
760ac839 6259screamer2:
c07a80fd 6260 if (rslen) {
00b6aa41 6261 register const STDCHAR * const bpe = buf + sizeof(buf);
760ac839 6262 bp = buf;
eb160463 6263 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
6264 ; /* keep reading */
6265 cnt = bp - buf;
c07a80fd 6266 }
6267 else {
760ac839 6268 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 6269 /* Accomodate broken VAXC compiler, which applies U8 cast to
6270 * both args of ?: operator, causing EOF to change into 255
6271 */
37be0adf 6272 if (cnt > 0)
cbe9e203
JH
6273 i = (U8)buf[cnt - 1];
6274 else
37be0adf 6275 i = EOF;
c07a80fd 6276 }
79072805 6277
cbe9e203
JH
6278 if (cnt < 0)
6279 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
6280 if (append)
6281 sv_catpvn(sv, (char *) buf, cnt);
6282 else
6283 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 6284
6285 if (i != EOF && /* joy */
6286 (!rslen ||
6287 SvCUR(sv) < rslen ||
3f7c398e 6288 memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
6289 {
6290 append = -1;
63e4d877
CS
6291 /*
6292 * If we're reading from a TTY and we get a short read,
6293 * indicating that the user hit his EOF character, we need
6294 * to notice it now, because if we try to read from the TTY
6295 * again, the EOF condition will disappear.
6296 *
6297 * The comparison of cnt to sizeof(buf) is an optimization
6298 * that prevents unnecessary calls to feof().
6299 *
6300 * - jik 9/25/96
6301 */
6302 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
6303 goto screamer2;
79072805 6304 }
6edd2cd5 6305
27da23d5 6306#ifdef USE_HEAP_INSTEAD_OF_STACK
6edd2cd5
JH
6307 Safefree(buf);
6308#endif
79072805
LW
6309 }
6310
8bfdd7d9 6311 if (rspara) { /* have to do this both before and after */
c07a80fd 6312 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 6313 i = PerlIO_getc(fp);
79072805 6314 if (i != '\n') {
760ac839 6315 PerlIO_ungetc(fp,i);
79072805
LW
6316 break;
6317 }
6318 }
6319 }
c07a80fd 6320
efd8b2ba 6321return_string_or_null:
bd61b366 6322 return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
79072805
LW
6323}
6324
954c1994
GS
6325/*
6326=for apidoc sv_inc
6327
645c22ef
DM
6328Auto-increment of the value in the SV, doing string to numeric conversion
6329if necessary. Handles 'get' magic.
954c1994
GS
6330
6331=cut
6332*/
6333
79072805 6334void
864dbfa3 6335Perl_sv_inc(pTHX_ register SV *sv)
79072805 6336{
97aff369 6337 dVAR;
79072805 6338 register char *d;
463ee0b2 6339 int flags;
79072805
LW
6340
6341 if (!sv)
6342 return;
5b295bef 6343 SvGETMAGIC(sv);
ed6116ce 6344 if (SvTHINKFIRST(sv)) {
765f542d
NC
6345 if (SvIsCOW(sv))
6346 sv_force_normal_flags(sv, 0);
0f15f207 6347 if (SvREADONLY(sv)) {
923e4eb5 6348 if (IN_PERL_RUNTIME)
cea2e8a9 6349 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6350 }
a0d0e21e 6351 if (SvROK(sv)) {
b5be31e9 6352 IV i;
9e7bc3e8
JD
6353 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
6354 return;
56431972 6355 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6356 sv_unref(sv);
6357 sv_setiv(sv, i);
a0d0e21e 6358 }
ed6116ce 6359 }
8990e307 6360 flags = SvFLAGS(sv);
28e5dec8
JH
6361 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
6362 /* It's (privately or publicly) a float, but not tested as an
6363 integer, so test it to see. */
d460ef45 6364 (void) SvIV(sv);
28e5dec8
JH
6365 flags = SvFLAGS(sv);
6366 }
6367 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6368 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6369#ifdef PERL_PRESERVE_IVUV
28e5dec8 6370 oops_its_int:
59d8ce62 6371#endif
25da4f38
IZ
6372 if (SvIsUV(sv)) {
6373 if (SvUVX(sv) == UV_MAX)
a1e868e7 6374 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
6375 else
6376 (void)SvIOK_only_UV(sv);
607fa7f2 6377 SvUV_set(sv, SvUVX(sv) + 1);
25da4f38
IZ
6378 } else {
6379 if (SvIVX(sv) == IV_MAX)
28e5dec8 6380 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
6381 else {
6382 (void)SvIOK_only(sv);
45977657 6383 SvIV_set(sv, SvIVX(sv) + 1);
1c846c1f 6384 }
55497cff 6385 }
79072805
LW
6386 return;
6387 }
28e5dec8
JH
6388 if (flags & SVp_NOK) {
6389 (void)SvNOK_only(sv);
9d6ce603 6390 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6391 return;
6392 }
6393
3f7c398e 6394 if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
28e5dec8 6395 if ((flags & SVTYPEMASK) < SVt_PVIV)
f5282e15 6396 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
28e5dec8 6397 (void)SvIOK_only(sv);
45977657 6398 SvIV_set(sv, 1);
79072805
LW
6399 return;
6400 }
463ee0b2 6401 d = SvPVX(sv);
79072805
LW
6402 while (isALPHA(*d)) d++;
6403 while (isDIGIT(*d)) d++;
6404 if (*d) {
28e5dec8 6405#ifdef PERL_PRESERVE_IVUV
d1be9408 6406 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
6407 warnings. Probably ought to make the sv_iv_please() that does
6408 the conversion if possible, and silently. */
504618e9 6409 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
6410 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6411 /* Need to try really hard to see if it's an integer.
6412 9.22337203685478e+18 is an integer.
6413 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6414 so $a="9.22337203685478e+18"; $a+0; $a++
6415 needs to be the same as $a="9.22337203685478e+18"; $a++
6416 or we go insane. */
d460ef45 6417
28e5dec8
JH
6418 (void) sv_2iv(sv);
6419 if (SvIOK(sv))
6420 goto oops_its_int;
6421
6422 /* sv_2iv *should* have made this an NV */
6423 if (flags & SVp_NOK) {
6424 (void)SvNOK_only(sv);
9d6ce603 6425 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6426 return;
6427 }
6428 /* I don't think we can get here. Maybe I should assert this
6429 And if we do get here I suspect that sv_setnv will croak. NWC
6430 Fall through. */
6431#if defined(USE_LONG_DOUBLE)
6432 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 6433 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 6434#else
1779d84d 6435 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 6436 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
6437#endif
6438 }
6439#endif /* PERL_PRESERVE_IVUV */
3f7c398e 6440 sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
79072805
LW
6441 return;
6442 }
6443 d--;
3f7c398e 6444 while (d >= SvPVX_const(sv)) {
79072805
LW
6445 if (isDIGIT(*d)) {
6446 if (++*d <= '9')
6447 return;
6448 *(d--) = '0';
6449 }
6450 else {
9d116dd7
JH
6451#ifdef EBCDIC
6452 /* MKS: The original code here died if letters weren't consecutive.
6453 * at least it didn't have to worry about non-C locales. The
6454 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 6455 * arranged in order (although not consecutively) and that only
9d116dd7
JH
6456 * [A-Za-z] are accepted by isALPHA in the C locale.
6457 */
6458 if (*d != 'z' && *d != 'Z') {
6459 do { ++*d; } while (!isALPHA(*d));
6460 return;
6461 }
6462 *(d--) -= 'z' - 'a';
6463#else
79072805
LW
6464 ++*d;
6465 if (isALPHA(*d))
6466 return;
6467 *(d--) -= 'z' - 'a' + 1;
9d116dd7 6468#endif
79072805
LW
6469 }
6470 }
6471 /* oh,oh, the number grew */
6472 SvGROW(sv, SvCUR(sv) + 2);
b162af07 6473 SvCUR_set(sv, SvCUR(sv) + 1);
3f7c398e 6474 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
79072805
LW
6475 *d = d[-1];
6476 if (isDIGIT(d[1]))
6477 *d = '1';
6478 else
6479 *d = d[1];
6480}
6481
954c1994
GS
6482/*
6483=for apidoc sv_dec
6484
645c22ef
DM
6485Auto-decrement of the value in the SV, doing string to numeric conversion
6486if necessary. Handles 'get' magic.
954c1994
GS
6487
6488=cut
6489*/
6490
79072805 6491void
864dbfa3 6492Perl_sv_dec(pTHX_ register SV *sv)
79072805 6493{
97aff369 6494 dVAR;
463ee0b2
LW
6495 int flags;
6496
79072805
LW
6497 if (!sv)
6498 return;
5b295bef 6499 SvGETMAGIC(sv);
ed6116ce 6500 if (SvTHINKFIRST(sv)) {
765f542d
NC
6501 if (SvIsCOW(sv))
6502 sv_force_normal_flags(sv, 0);
0f15f207 6503 if (SvREADONLY(sv)) {
923e4eb5 6504 if (IN_PERL_RUNTIME)
cea2e8a9 6505 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6506 }
a0d0e21e 6507 if (SvROK(sv)) {
b5be31e9 6508 IV i;
9e7bc3e8
JD
6509 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6510 return;
56431972 6511 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6512 sv_unref(sv);
6513 sv_setiv(sv, i);
a0d0e21e 6514 }
ed6116ce 6515 }
28e5dec8
JH
6516 /* Unlike sv_inc we don't have to worry about string-never-numbers
6517 and keeping them magic. But we mustn't warn on punting */
8990e307 6518 flags = SvFLAGS(sv);
28e5dec8
JH
6519 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6520 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6521#ifdef PERL_PRESERVE_IVUV
28e5dec8 6522 oops_its_int:
59d8ce62 6523#endif
25da4f38
IZ
6524 if (SvIsUV(sv)) {
6525 if (SvUVX(sv) == 0) {
6526 (void)SvIOK_only(sv);
45977657 6527 SvIV_set(sv, -1);
25da4f38
IZ
6528 }
6529 else {
6530 (void)SvIOK_only_UV(sv);
f4eee32f 6531 SvUV_set(sv, SvUVX(sv) - 1);
1c846c1f 6532 }
25da4f38
IZ
6533 } else {
6534 if (SvIVX(sv) == IV_MIN)
65202027 6535 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
6536 else {
6537 (void)SvIOK_only(sv);
45977657 6538 SvIV_set(sv, SvIVX(sv) - 1);
1c846c1f 6539 }
55497cff 6540 }
6541 return;
6542 }
28e5dec8 6543 if (flags & SVp_NOK) {
9d6ce603 6544 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
6545 (void)SvNOK_only(sv);
6546 return;
6547 }
8990e307 6548 if (!(flags & SVp_POK)) {
ef088171
NC
6549 if ((flags & SVTYPEMASK) < SVt_PVIV)
6550 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
6551 SvIV_set(sv, -1);
6552 (void)SvIOK_only(sv);
79072805
LW
6553 return;
6554 }
28e5dec8
JH
6555#ifdef PERL_PRESERVE_IVUV
6556 {
504618e9 6557 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
6558 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6559 /* Need to try really hard to see if it's an integer.
6560 9.22337203685478e+18 is an integer.
6561 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6562 so $a="9.22337203685478e+18"; $a+0; $a--
6563 needs to be the same as $a="9.22337203685478e+18"; $a--
6564 or we go insane. */
d460ef45 6565
28e5dec8
JH
6566 (void) sv_2iv(sv);
6567 if (SvIOK(sv))
6568 goto oops_its_int;
6569
6570 /* sv_2iv *should* have made this an NV */
6571 if (flags & SVp_NOK) {
6572 (void)SvNOK_only(sv);
9d6ce603 6573 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
6574 return;
6575 }
6576 /* I don't think we can get here. Maybe I should assert this
6577 And if we do get here I suspect that sv_setnv will croak. NWC
6578 Fall through. */
6579#if defined(USE_LONG_DOUBLE)
6580 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 6581 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 6582#else
1779d84d 6583 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 6584 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
6585#endif
6586 }
6587 }
6588#endif /* PERL_PRESERVE_IVUV */
3f7c398e 6589 sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0); /* punt */
79072805
LW
6590}
6591
954c1994
GS
6592/*
6593=for apidoc sv_mortalcopy
6594
645c22ef 6595Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
6596The new SV is marked as mortal. It will be destroyed "soon", either by an
6597explicit call to FREETMPS, or by an implicit call at places such as
6598statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
6599
6600=cut
6601*/
6602
79072805
LW
6603/* Make a string that will exist for the duration of the expression
6604 * evaluation. Actually, it may have to last longer than that, but
6605 * hopefully we won't free it until it has been assigned to a
6606 * permanent location. */
6607
6608SV *
864dbfa3 6609Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 6610{
97aff369 6611 dVAR;
463ee0b2 6612 register SV *sv;
b881518d 6613
4561caa4 6614 new_SV(sv);
79072805 6615 sv_setsv(sv,oldstr);
677b06e3
GS
6616 EXTEND_MORTAL(1);
6617 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
6618 SvTEMP_on(sv);
6619 return sv;
6620}
6621
954c1994
GS
6622/*
6623=for apidoc sv_newmortal
6624
645c22ef 6625Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
6626set to 1. It will be destroyed "soon", either by an explicit call to
6627FREETMPS, or by an implicit call at places such as statement boundaries.
6628See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
6629
6630=cut
6631*/
6632
8990e307 6633SV *
864dbfa3 6634Perl_sv_newmortal(pTHX)
8990e307 6635{
97aff369 6636 dVAR;
8990e307
LW
6637 register SV *sv;
6638
4561caa4 6639 new_SV(sv);
8990e307 6640 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
6641 EXTEND_MORTAL(1);
6642 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
6643 return sv;
6644}
6645
954c1994
GS
6646/*
6647=for apidoc sv_2mortal
6648
d4236ebc
DM
6649Marks an existing SV as mortal. The SV will be destroyed "soon", either
6650by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
6651statement boundaries. SvTEMP() is turned on which means that the SV's
6652string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
6653and C<sv_mortalcopy>.
954c1994
GS
6654
6655=cut
6656*/
6657
79072805 6658SV *
864dbfa3 6659Perl_sv_2mortal(pTHX_ register SV *sv)
79072805 6660{
27da23d5 6661 dVAR;
79072805 6662 if (!sv)
7a5b473e 6663 return NULL;
d689ffdd 6664 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 6665 return sv;
677b06e3
GS
6666 EXTEND_MORTAL(1);
6667 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 6668 SvTEMP_on(sv);
79072805
LW
6669 return sv;
6670}
6671
954c1994
GS
6672/*
6673=for apidoc newSVpv
6674
6675Creates a new SV and copies a string into it. The reference count for the
6676SV is set to 1. If C<len> is zero, Perl will compute the length using
6677strlen(). For efficiency, consider using C<newSVpvn> instead.
6678
6679=cut
6680*/
6681
79072805 6682SV *
864dbfa3 6683Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 6684{
97aff369 6685 dVAR;
463ee0b2 6686 register SV *sv;
79072805 6687
4561caa4 6688 new_SV(sv);
616d8c9c 6689 sv_setpvn(sv,s,len ? len : strlen(s));
79072805
LW
6690 return sv;
6691}
6692
954c1994
GS
6693/*
6694=for apidoc newSVpvn
6695
6696Creates a new SV and copies a string into it. The reference count for the
1c846c1f 6697SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 6698string. You are responsible for ensuring that the source string is at least
9e09f5f2 6699C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
6700
6701=cut
6702*/
6703
9da1e3b5 6704SV *
864dbfa3 6705Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5 6706{
97aff369 6707 dVAR;
9da1e3b5
MUN
6708 register SV *sv;
6709
6710 new_SV(sv);
9da1e3b5
MUN
6711 sv_setpvn(sv,s,len);
6712 return sv;
6713}
6714
bd08039b
NC
6715
6716/*
926f8064 6717=for apidoc newSVhek
bd08039b
NC
6718
6719Creates a new SV from the hash key structure. It will generate scalars that
5aaec2b4
NC
6720point to the shared string table where possible. Returns a new (undefined)
6721SV if the hek is NULL.
bd08039b
NC
6722
6723=cut
6724*/
6725
6726SV *
c1b02ed8 6727Perl_newSVhek(pTHX_ const HEK *hek)
bd08039b 6728{
97aff369 6729 dVAR;
5aaec2b4
NC
6730 if (!hek) {
6731 SV *sv;
6732
6733 new_SV(sv);
6734 return sv;
6735 }
6736
bd08039b
NC
6737 if (HEK_LEN(hek) == HEf_SVKEY) {
6738 return newSVsv(*(SV**)HEK_KEY(hek));
6739 } else {
6740 const int flags = HEK_FLAGS(hek);
6741 if (flags & HVhek_WASUTF8) {
6742 /* Trouble :-)
6743 Andreas would like keys he put in as utf8 to come back as utf8
6744 */
6745 STRLEN utf8_len = HEK_LEN(hek);
b64e5050
AL
6746 const U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
6747 SV * const sv = newSVpvn ((const char*)as_utf8, utf8_len);
bd08039b
NC
6748
6749 SvUTF8_on (sv);
6750 Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
6751 return sv;
6752 } else if (flags & HVhek_REHASH) {
6753 /* We don't have a pointer to the hv, so we have to replicate the
6754 flag into every HEK. This hv is using custom a hasing
6755 algorithm. Hence we can't return a shared string scalar, as
6756 that would contain the (wrong) hash value, and might get passed
6757 into an hv routine with a regular hash */
6758
b64e5050 6759 SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
bd08039b
NC
6760 if (HEK_UTF8(hek))
6761 SvUTF8_on (sv);
6762 return sv;
6763 }
6764 /* This will be overwhelminly the most common case. */
6765 return newSVpvn_share(HEK_KEY(hek),
6766 (HEK_UTF8(hek) ? -HEK_LEN(hek) : HEK_LEN(hek)),
6767 HEK_HASH(hek));
6768 }
6769}
6770
1c846c1f
NIS
6771/*
6772=for apidoc newSVpvn_share
6773
3f7c398e 6774Creates a new SV with its SvPVX_const pointing to a shared string in the string
645c22ef
DM
6775table. If the string does not already exist in the table, it is created
6776first. Turns on READONLY and FAKE. The string's hash is stored in the UV
6777slot of the SV; if the C<hash> parameter is non-zero, that value is used;
6778otherwise the hash is computed. The idea here is that as the string table
3f7c398e 6779is used for shared hash keys these strings will have SvPVX_const == HeKEY and
645c22ef 6780hash lookup will avoid string compare.
1c846c1f
NIS
6781
6782=cut
6783*/
6784
6785SV *
c3654f1a 6786Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f 6787{
97aff369 6788 dVAR;
1c846c1f 6789 register SV *sv;
c3654f1a
IH
6790 bool is_utf8 = FALSE;
6791 if (len < 0) {
77caf834 6792 STRLEN tmplen = -len;
c3654f1a 6793 is_utf8 = TRUE;
75a54232 6794 /* See the note in hv.c:hv_fetch() --jhi */
e1ec3a88 6795 src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
75a54232
JH
6796 len = tmplen;
6797 }
1c846c1f 6798 if (!hash)
5afd6d42 6799 PERL_HASH(hash, src, len);
1c846c1f 6800 new_SV(sv);
bdd68bc3 6801 sv_upgrade(sv, SVt_PV);
f880fe2f 6802 SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
b162af07 6803 SvCUR_set(sv, len);
b162af07 6804 SvLEN_set(sv, 0);
1c846c1f
NIS
6805 SvREADONLY_on(sv);
6806 SvFAKE_on(sv);
6807 SvPOK_on(sv);
c3654f1a
IH
6808 if (is_utf8)
6809 SvUTF8_on(sv);
1c846c1f
NIS
6810 return sv;
6811}
6812
645c22ef 6813
cea2e8a9 6814#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
6815
6816/* pTHX_ magic can't cope with varargs, so this is a no-context
6817 * version of the main function, (which may itself be aliased to us).
6818 * Don't access this version directly.
6819 */
6820
46fc3d4c 6821SV *
cea2e8a9 6822Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 6823{
cea2e8a9 6824 dTHX;
46fc3d4c 6825 register SV *sv;
6826 va_list args;
46fc3d4c 6827 va_start(args, pat);
c5be433b 6828 sv = vnewSVpvf(pat, &args);
46fc3d4c 6829 va_end(args);
6830 return sv;
6831}
cea2e8a9 6832#endif
46fc3d4c 6833
954c1994
GS
6834/*
6835=for apidoc newSVpvf
6836
645c22ef 6837Creates a new SV and initializes it with the string formatted like
954c1994
GS
6838C<sprintf>.
6839
6840=cut
6841*/
6842
cea2e8a9
GS
6843SV *
6844Perl_newSVpvf(pTHX_ const char* pat, ...)
6845{
6846 register SV *sv;
6847 va_list args;
cea2e8a9 6848 va_start(args, pat);
c5be433b 6849 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
6850 va_end(args);
6851 return sv;
6852}
46fc3d4c 6853
645c22ef
DM
6854/* backend for newSVpvf() and newSVpvf_nocontext() */
6855
79072805 6856SV *
c5be433b
GS
6857Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
6858{
97aff369 6859 dVAR;
c5be433b
GS
6860 register SV *sv;
6861 new_SV(sv);
4608196e 6862 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
6863 return sv;
6864}
6865
954c1994
GS
6866/*
6867=for apidoc newSVnv
6868
6869Creates a new SV and copies a floating point value into it.
6870The reference count for the SV is set to 1.
6871
6872=cut
6873*/
6874
c5be433b 6875SV *
65202027 6876Perl_newSVnv(pTHX_ NV n)
79072805 6877{
97aff369 6878 dVAR;
463ee0b2 6879 register SV *sv;
79072805 6880
4561caa4 6881 new_SV(sv);
79072805
LW
6882 sv_setnv(sv,n);
6883 return sv;
6884}
6885
954c1994
GS
6886/*
6887=for apidoc newSViv
6888
6889Creates a new SV and copies an integer into it. The reference count for the
6890SV is set to 1.
6891
6892=cut
6893*/
6894
79072805 6895SV *
864dbfa3 6896Perl_newSViv(pTHX_ IV i)
79072805 6897{
97aff369 6898 dVAR;
463ee0b2 6899 register SV *sv;
79072805 6900
4561caa4 6901 new_SV(sv);
79072805
LW
6902 sv_setiv(sv,i);
6903 return sv;
6904}
6905
954c1994 6906/*
1a3327fb
JH
6907=for apidoc newSVuv
6908
6909Creates a new SV and copies an unsigned integer into it.
6910The reference count for the SV is set to 1.
6911
6912=cut
6913*/
6914
6915SV *
6916Perl_newSVuv(pTHX_ UV u)
6917{
97aff369 6918 dVAR;
1a3327fb
JH
6919 register SV *sv;
6920
6921 new_SV(sv);
6922 sv_setuv(sv,u);
6923 return sv;
6924}
6925
6926/*
954c1994
GS
6927=for apidoc newRV_noinc
6928
6929Creates an RV wrapper for an SV. The reference count for the original
6930SV is B<not> incremented.
6931
6932=cut
6933*/
6934
2304df62 6935SV *
864dbfa3 6936Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62 6937{
97aff369 6938 dVAR;
2304df62
AD
6939 register SV *sv;
6940
4561caa4 6941 new_SV(sv);
2304df62 6942 sv_upgrade(sv, SVt_RV);
76e3520e 6943 SvTEMP_off(tmpRef);
b162af07 6944 SvRV_set(sv, tmpRef);
2304df62 6945 SvROK_on(sv);
2304df62
AD
6946 return sv;
6947}
6948
ff276b08 6949/* newRV_inc is the official function name to use now.
645c22ef
DM
6950 * newRV_inc is in fact #defined to newRV in sv.h
6951 */
6952
5f05dabc 6953SV *
7f466ec7 6954Perl_newRV(pTHX_ SV *sv)
5f05dabc 6955{
97aff369 6956 dVAR;
7f466ec7 6957 return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
5f05dabc 6958}
5f05dabc 6959
954c1994
GS
6960/*
6961=for apidoc newSVsv
6962
6963Creates a new SV which is an exact duplicate of the original SV.
645c22ef 6964(Uses C<sv_setsv>).
954c1994
GS
6965
6966=cut
6967*/
6968
79072805 6969SV *
864dbfa3 6970Perl_newSVsv(pTHX_ register SV *old)
79072805 6971{
97aff369 6972 dVAR;
463ee0b2 6973 register SV *sv;
79072805
LW
6974
6975 if (!old)
7a5b473e 6976 return NULL;
8990e307 6977 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 6978 if (ckWARN_d(WARN_INTERNAL))
9014280d 6979 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
a0714e2c 6980 return NULL;
79072805 6981 }
4561caa4 6982 new_SV(sv);
e90aabeb
NC
6983 /* SV_GMAGIC is the default for sv_setv()
6984 SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
6985 with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
6986 sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
463ee0b2 6987 return sv;
79072805
LW
6988}
6989
645c22ef
DM
6990/*
6991=for apidoc sv_reset
6992
6993Underlying implementation for the C<reset> Perl function.
6994Note that the perl-level function is vaguely deprecated.
6995
6996=cut
6997*/
6998
79072805 6999void
e1ec3a88 7000Perl_sv_reset(pTHX_ register const char *s, HV *stash)
79072805 7001{
27da23d5 7002 dVAR;
4802d5d7 7003 char todo[PERL_UCHAR_MAX+1];
79072805 7004
49d8d3a1
MB
7005 if (!stash)
7006 return;
7007
79072805 7008 if (!*s) { /* reset ?? searches */
aec46f14 7009 MAGIC * const mg = mg_find((SV *)stash, PERL_MAGIC_symtab);
8d2f4536
NC
7010 if (mg) {
7011 PMOP *pm = (PMOP *) mg->mg_obj;
7012 while (pm) {
7013 pm->op_pmdynflags &= ~PMdf_USED;
7014 pm = pm->op_pmnext;
7015 }
79072805
LW
7016 }
7017 return;
7018 }
7019
7020 /* reset variables */
7021
7022 if (!HvARRAY(stash))
7023 return;
463ee0b2
LW
7024
7025 Zero(todo, 256, char);
79072805 7026 while (*s) {
b464bac0
AL
7027 I32 max;
7028 I32 i = (unsigned char)*s;
79072805
LW
7029 if (s[1] == '-') {
7030 s += 2;
7031 }
4802d5d7 7032 max = (unsigned char)*s++;
79072805 7033 for ( ; i <= max; i++) {
463ee0b2
LW
7034 todo[i] = 1;
7035 }
a0d0e21e 7036 for (i = 0; i <= (I32) HvMAX(stash); i++) {
b464bac0 7037 HE *entry;
79072805 7038 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7039 entry;
7040 entry = HeNEXT(entry))
7041 {
b464bac0
AL
7042 register GV *gv;
7043 register SV *sv;
7044
1edc1566 7045 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7046 continue;
1edc1566 7047 gv = (GV*)HeVAL(entry);
79072805 7048 sv = GvSV(gv);
e203899d
NC
7049 if (sv) {
7050 if (SvTHINKFIRST(sv)) {
7051 if (!SvREADONLY(sv) && SvROK(sv))
7052 sv_unref(sv);
7053 /* XXX Is this continue a bug? Why should THINKFIRST
7054 exempt us from resetting arrays and hashes? */
7055 continue;
7056 }
7057 SvOK_off(sv);
7058 if (SvTYPE(sv) >= SVt_PV) {
7059 SvCUR_set(sv, 0);
bd61b366 7060 if (SvPVX_const(sv) != NULL)
e203899d
NC
7061 *SvPVX(sv) = '\0';
7062 SvTAINT(sv);
7063 }
79072805
LW
7064 }
7065 if (GvAV(gv)) {
7066 av_clear(GvAV(gv));
7067 }
bfcb3514 7068 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
b0269e46
AB
7069#if defined(VMS)
7070 Perl_die(aTHX_ "Can't reset %%ENV on this system");
7071#else /* ! VMS */
463ee0b2 7072 hv_clear(GvHV(gv));
b0269e46
AB
7073# if defined(USE_ENVIRON_ARRAY)
7074 if (gv == PL_envgv)
7075 my_clearenv();
7076# endif /* USE_ENVIRON_ARRAY */
7077#endif /* VMS */
79072805
LW
7078 }
7079 }
7080 }
7081 }
7082}
7083
645c22ef
DM
7084/*
7085=for apidoc sv_2io
7086
7087Using various gambits, try to get an IO from an SV: the IO slot if its a
7088GV; or the recursive result if we're an RV; or the IO slot of the symbol
7089named after the PV if we're a string.
7090
7091=cut
7092*/
7093
46fc3d4c 7094IO*
864dbfa3 7095Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 7096{
7097 IO* io;
7098 GV* gv;
7099
7100 switch (SvTYPE(sv)) {
7101 case SVt_PVIO:
7102 io = (IO*)sv;
7103 break;
7104 case SVt_PVGV:
7105 gv = (GV*)sv;
7106 io = GvIO(gv);
7107 if (!io)
cea2e8a9 7108 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 7109 break;
7110 default:
7111 if (!SvOK(sv))
cea2e8a9 7112 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 7113 if (SvROK(sv))
7114 return sv_2io(SvRV(sv));
f776e3cd 7115 gv = gv_fetchsv(sv, 0, SVt_PVIO);
46fc3d4c 7116 if (gv)
7117 io = GvIO(gv);
7118 else
7119 io = 0;
7120 if (!io)
35c1215d 7121 Perl_croak(aTHX_ "Bad filehandle: %"SVf, sv);
46fc3d4c 7122 break;
7123 }
7124 return io;
7125}
7126
645c22ef
DM
7127/*
7128=for apidoc sv_2cv
7129
7130Using various gambits, try to get a CV from an SV; in addition, try if
7131possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
f2c0649b 7132The flags in C<lref> are passed to sv_fetchsv.
645c22ef
DM
7133
7134=cut
7135*/
7136
79072805 7137CV *
864dbfa3 7138Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 7139{
27da23d5 7140 dVAR;
a0714e2c 7141 GV *gv = NULL;
601f1833 7142 CV *cv = NULL;
79072805 7143
85dec29a
NC
7144 if (!sv) {
7145 *st = NULL;
7146 *gvp = NULL;
7147 return NULL;
7148 }
79072805 7149 switch (SvTYPE(sv)) {
79072805
LW
7150 case SVt_PVCV:
7151 *st = CvSTASH(sv);
a0714e2c 7152 *gvp = NULL;
79072805
LW
7153 return (CV*)sv;
7154 case SVt_PVHV:
7155 case SVt_PVAV:
ef58ba18 7156 *st = NULL;
a0714e2c 7157 *gvp = NULL;
601f1833 7158 return NULL;
8990e307
LW
7159 case SVt_PVGV:
7160 gv = (GV*)sv;
a0d0e21e 7161 *gvp = gv;
8990e307
LW
7162 *st = GvESTASH(gv);
7163 goto fix_gv;
7164
79072805 7165 default:
5b295bef 7166 SvGETMAGIC(sv);
a0d0e21e 7167 if (SvROK(sv)) {
823a54a3 7168 SV * const *sp = &sv; /* Used in tryAMAGICunDEREF macro. */
f5284f61
IZ
7169 tryAMAGICunDEREF(to_cv);
7170
62f274bf
GS
7171 sv = SvRV(sv);
7172 if (SvTYPE(sv) == SVt_PVCV) {
7173 cv = (CV*)sv;
a0714e2c 7174 *gvp = NULL;
62f274bf
GS
7175 *st = CvSTASH(cv);
7176 return cv;
7177 }
7178 else if(isGV(sv))
7179 gv = (GV*)sv;
7180 else
cea2e8a9 7181 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 7182 }
62f274bf 7183 else if (isGV(sv))
79072805
LW
7184 gv = (GV*)sv;
7185 else
7a5fd60d 7186 gv = gv_fetchsv(sv, lref, SVt_PVCV);
79072805 7187 *gvp = gv;
ef58ba18
NC
7188 if (!gv) {
7189 *st = NULL;
601f1833 7190 return NULL;
ef58ba18 7191 }
e26df76a
NC
7192 /* Some flags to gv_fetchsv mean don't really create the GV */
7193 if (SvTYPE(gv) != SVt_PVGV) {
7194 *st = NULL;
7195 return NULL;
7196 }
79072805 7197 *st = GvESTASH(gv);
8990e307 7198 fix_gv:
8ebc5c01 7199 if (lref && !GvCVu(gv)) {
4633a7c4 7200 SV *tmpsv;
748a9306 7201 ENTER;
561b68a9 7202 tmpsv = newSV(0);
bd61b366 7203 gv_efullname3(tmpsv, gv, NULL);
f6ec51f7
GS
7204 /* XXX this is probably not what they think they're getting.
7205 * It has the same effect as "sub name;", i.e. just a forward
7206 * declaration! */
774d564b 7207 newSUB(start_subparse(FALSE, 0),
4633a7c4 7208 newSVOP(OP_CONST, 0, tmpsv),
5f66b61c 7209 NULL, NULL);
748a9306 7210 LEAVE;
8ebc5c01 7211 if (!GvCVu(gv))
35c1215d
NC
7212 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
7213 sv);
8990e307 7214 }
8ebc5c01 7215 return GvCVu(gv);
79072805
LW
7216 }
7217}
7218
c461cf8f
JH
7219/*
7220=for apidoc sv_true
7221
7222Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
7223Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
7224instead use an in-line version.
c461cf8f
JH
7225
7226=cut
7227*/
7228
79072805 7229I32
864dbfa3 7230Perl_sv_true(pTHX_ register SV *sv)
79072805 7231{
8990e307
LW
7232 if (!sv)
7233 return 0;
79072805 7234 if (SvPOK(sv)) {
823a54a3
AL
7235 register const XPV* const tXpv = (XPV*)SvANY(sv);
7236 if (tXpv &&
c2f1de04 7237 (tXpv->xpv_cur > 1 ||
339049b0 7238 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
79072805
LW
7239 return 1;
7240 else
7241 return 0;
7242 }
7243 else {
7244 if (SvIOK(sv))
463ee0b2 7245 return SvIVX(sv) != 0;
79072805
LW
7246 else {
7247 if (SvNOK(sv))
463ee0b2 7248 return SvNVX(sv) != 0.0;
79072805 7249 else
463ee0b2 7250 return sv_2bool(sv);
79072805
LW
7251 }
7252 }
7253}
79072805 7254
645c22ef 7255/*
c461cf8f
JH
7256=for apidoc sv_pvn_force
7257
7258Get a sensible string out of the SV somehow.
645c22ef
DM
7259A private implementation of the C<SvPV_force> macro for compilers which
7260can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 7261
8d6d96c1
HS
7262=for apidoc sv_pvn_force_flags
7263
7264Get a sensible string out of the SV somehow.
7265If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
7266appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
7267implemented in terms of this function.
645c22ef
DM
7268You normally want to use the various wrapper macros instead: see
7269C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
7270
7271=cut
7272*/
7273
7274char *
7275Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
7276{
97aff369 7277 dVAR;
6fc92669 7278 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 7279 sv_force_normal_flags(sv, 0);
1c846c1f 7280
a0d0e21e 7281 if (SvPOK(sv)) {
13c5b33c
NC
7282 if (lp)
7283 *lp = SvCUR(sv);
a0d0e21e
LW
7284 }
7285 else {
a3b680e6 7286 char *s;
13c5b33c
NC
7287 STRLEN len;
7288
4d84ee25 7289 if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
b64e5050 7290 const char * const ref = sv_reftype(sv,0);
4d84ee25
NC
7291 if (PL_op)
7292 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
b64e5050 7293 ref, OP_NAME(PL_op));
4d84ee25 7294 else
b64e5050 7295 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
4d84ee25 7296 }
b64e5050 7297 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
cea2e8a9 7298 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 7299 OP_NAME(PL_op));
b64e5050 7300 s = sv_2pv_flags(sv, &len, flags);
13c5b33c
NC
7301 if (lp)
7302 *lp = len;
7303
3f7c398e 7304 if (s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */
a0d0e21e
LW
7305 if (SvROK(sv))
7306 sv_unref(sv);
862a34c6 7307 SvUPGRADE(sv, SVt_PV); /* Never FALSE */
a0d0e21e 7308 SvGROW(sv, len + 1);
706aa1c9 7309 Move(s,SvPVX(sv),len,char);
a0d0e21e
LW
7310 SvCUR_set(sv, len);
7311 *SvEND(sv) = '\0';
7312 }
7313 if (!SvPOK(sv)) {
7314 SvPOK_on(sv); /* validate pointer */
7315 SvTAINT(sv);
1d7c1841 7316 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 7317 PTR2UV(sv),SvPVX_const(sv)));
a0d0e21e
LW
7318 }
7319 }
4d84ee25 7320 return SvPVX_mutable(sv);
a0d0e21e
LW
7321}
7322
645c22ef 7323/*
645c22ef
DM
7324=for apidoc sv_pvbyten_force
7325
0feed65a 7326The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
645c22ef
DM
7327
7328=cut
7329*/
7330
7340a771
GS
7331char *
7332Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
7333{
46ec2f14 7334 sv_pvn_force(sv,lp);
ffebcc3e 7335 sv_utf8_downgrade(sv,0);
46ec2f14
TS
7336 *lp = SvCUR(sv);
7337 return SvPVX(sv);
7340a771
GS
7338}
7339
645c22ef 7340/*
c461cf8f
JH
7341=for apidoc sv_pvutf8n_force
7342
0feed65a 7343The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
c461cf8f
JH
7344
7345=cut
7346*/
7347
7340a771
GS
7348char *
7349Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
7350{
46ec2f14 7351 sv_pvn_force(sv,lp);
560a288e 7352 sv_utf8_upgrade(sv);
46ec2f14
TS
7353 *lp = SvCUR(sv);
7354 return SvPVX(sv);
7340a771
GS
7355}
7356
c461cf8f
JH
7357/*
7358=for apidoc sv_reftype
7359
7360Returns a string describing what the SV is a reference to.
7361
7362=cut
7363*/
7364
1cb0ed9b 7365char *
bfed75c6 7366Perl_sv_reftype(pTHX_ const SV *sv, int ob)
a0d0e21e 7367{
07409e01
NC
7368 /* The fact that I don't need to downcast to char * everywhere, only in ?:
7369 inside return suggests a const propagation bug in g++. */
c86bf373 7370 if (ob && SvOBJECT(sv)) {
1b6737cc 7371 char * const name = HvNAME_get(SvSTASH(sv));
07409e01 7372 return name ? name : (char *) "__ANON__";
c86bf373 7373 }
a0d0e21e
LW
7374 else {
7375 switch (SvTYPE(sv)) {
7376 case SVt_NULL:
7377 case SVt_IV:
7378 case SVt_NV:
7379 case SVt_RV:
7380 case SVt_PV:
7381 case SVt_PVIV:
7382 case SVt_PVNV:
7383 case SVt_PVMG:
7384 case SVt_PVBM:
1cb0ed9b 7385 if (SvVOK(sv))
439cb1c4 7386 return "VSTRING";
a0d0e21e
LW
7387 if (SvROK(sv))
7388 return "REF";
7389 else
7390 return "SCALAR";
1cb0ed9b 7391
07409e01 7392 case SVt_PVLV: return (char *) (SvROK(sv) ? "REF"
be65207d
DM
7393 /* tied lvalues should appear to be
7394 * scalars for backwards compatitbility */
7395 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
07409e01 7396 ? "SCALAR" : "LVALUE");
a0d0e21e
LW
7397 case SVt_PVAV: return "ARRAY";
7398 case SVt_PVHV: return "HASH";
7399 case SVt_PVCV: return "CODE";
7400 case SVt_PVGV: return "GLOB";
1d2dff63 7401 case SVt_PVFM: return "FORMAT";
27f9d8f3 7402 case SVt_PVIO: return "IO";
a0d0e21e
LW
7403 default: return "UNKNOWN";
7404 }
7405 }
7406}
7407
954c1994
GS
7408/*
7409=for apidoc sv_isobject
7410
7411Returns a boolean indicating whether the SV is an RV pointing to a blessed
7412object. If the SV is not an RV, or if the object is not blessed, then this
7413will return false.
7414
7415=cut
7416*/
7417
463ee0b2 7418int
864dbfa3 7419Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 7420{
68dc0745 7421 if (!sv)
7422 return 0;
5b295bef 7423 SvGETMAGIC(sv);
85e6fe83
LW
7424 if (!SvROK(sv))
7425 return 0;
7426 sv = (SV*)SvRV(sv);
7427 if (!SvOBJECT(sv))
7428 return 0;
7429 return 1;
7430}
7431
954c1994
GS
7432/*
7433=for apidoc sv_isa
7434
7435Returns a boolean indicating whether the SV is blessed into the specified
7436class. This does not check for subtypes; use C<sv_derived_from> to verify
7437an inheritance relationship.
7438
7439=cut
7440*/
7441
85e6fe83 7442int
864dbfa3 7443Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 7444{
bfcb3514 7445 const char *hvname;
68dc0745 7446 if (!sv)
7447 return 0;
5b295bef 7448 SvGETMAGIC(sv);
ed6116ce 7449 if (!SvROK(sv))
463ee0b2 7450 return 0;
ed6116ce
LW
7451 sv = (SV*)SvRV(sv);
7452 if (!SvOBJECT(sv))
463ee0b2 7453 return 0;
bfcb3514
NC
7454 hvname = HvNAME_get(SvSTASH(sv));
7455 if (!hvname)
e27ad1f2 7456 return 0;
463ee0b2 7457
bfcb3514 7458 return strEQ(hvname, name);
463ee0b2
LW
7459}
7460
954c1994
GS
7461/*
7462=for apidoc newSVrv
7463
7464Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
7465it will be upgraded to one. If C<classname> is non-null then the new SV will
7466be blessed in the specified package. The new SV is returned and its
7467reference count is 1.
7468
7469=cut
7470*/
7471
463ee0b2 7472SV*
864dbfa3 7473Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 7474{
97aff369 7475 dVAR;
463ee0b2
LW
7476 SV *sv;
7477
4561caa4 7478 new_SV(sv);
51cf62d8 7479
765f542d 7480 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 7481 SvAMAGIC_off(rv);
51cf62d8 7482
0199fce9 7483 if (SvTYPE(rv) >= SVt_PVMG) {
a3b680e6 7484 const U32 refcnt = SvREFCNT(rv);
0199fce9
JD
7485 SvREFCNT(rv) = 0;
7486 sv_clear(rv);
7487 SvFLAGS(rv) = 0;
7488 SvREFCNT(rv) = refcnt;
7489 }
7490
51cf62d8 7491 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
7492 sv_upgrade(rv, SVt_RV);
7493 else if (SvTYPE(rv) > SVt_RV) {
8bd4d4c5 7494 SvPV_free(rv);
0199fce9
JD
7495 SvCUR_set(rv, 0);
7496 SvLEN_set(rv, 0);
7497 }
51cf62d8 7498
0c34ef67 7499 SvOK_off(rv);
b162af07 7500 SvRV_set(rv, sv);
ed6116ce 7501 SvROK_on(rv);
463ee0b2 7502
a0d0e21e 7503 if (classname) {
1b6737cc 7504 HV* const stash = gv_stashpv(classname, TRUE);
a0d0e21e
LW
7505 (void)sv_bless(rv, stash);
7506 }
7507 return sv;
7508}
7509
954c1994
GS
7510/*
7511=for apidoc sv_setref_pv
7512
7513Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
7514argument will be upgraded to an RV. That RV will be modified to point to
7515the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7516into the SV. The C<classname> argument indicates the package for the
bd61b366 7517blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7518will have a reference count of 1, and the RV will be returned.
954c1994
GS
7519
7520Do not use with other Perl types such as HV, AV, SV, CV, because those
7521objects will become corrupted by the pointer copy process.
7522
7523Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7524
7525=cut
7526*/
7527
a0d0e21e 7528SV*
864dbfa3 7529Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 7530{
97aff369 7531 dVAR;
189b2af5 7532 if (!pv) {
3280af22 7533 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
7534 SvSETMAGIC(rv);
7535 }
a0d0e21e 7536 else
56431972 7537 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
7538 return rv;
7539}
7540
954c1994
GS
7541/*
7542=for apidoc sv_setref_iv
7543
7544Copies an integer into a new SV, optionally blessing the SV. The C<rv>
7545argument will be upgraded to an RV. That RV will be modified to point to
7546the new SV. The C<classname> argument indicates the package for the
bd61b366 7547blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7548will have a reference count of 1, and the RV will be returned.
954c1994
GS
7549
7550=cut
7551*/
7552
a0d0e21e 7553SV*
864dbfa3 7554Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
7555{
7556 sv_setiv(newSVrv(rv,classname), iv);
7557 return rv;
7558}
7559
954c1994 7560/*
e1c57cef
JH
7561=for apidoc sv_setref_uv
7562
7563Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
7564argument will be upgraded to an RV. That RV will be modified to point to
7565the new SV. The C<classname> argument indicates the package for the
bd61b366 7566blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7567will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
7568
7569=cut
7570*/
7571
7572SV*
7573Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
7574{
7575 sv_setuv(newSVrv(rv,classname), uv);
7576 return rv;
7577}
7578
7579/*
954c1994
GS
7580=for apidoc sv_setref_nv
7581
7582Copies a double into a new SV, optionally blessing the SV. The C<rv>
7583argument will be upgraded to an RV. That RV will be modified to point to
7584the new SV. The C<classname> argument indicates the package for the
bd61b366 7585blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7586will have a reference count of 1, and the RV will be returned.
954c1994
GS
7587
7588=cut
7589*/
7590
a0d0e21e 7591SV*
65202027 7592Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
7593{
7594 sv_setnv(newSVrv(rv,classname), nv);
7595 return rv;
7596}
463ee0b2 7597
954c1994
GS
7598/*
7599=for apidoc sv_setref_pvn
7600
7601Copies a string into a new SV, optionally blessing the SV. The length of the
7602string must be specified with C<n>. The C<rv> argument will be upgraded to
7603an RV. That RV will be modified to point to the new SV. The C<classname>
7604argument indicates the package for the blessing. Set C<classname> to
bd61b366 7605C<NULL> to avoid the blessing. The new SV will have a reference count
d34c2299 7606of 1, and the RV will be returned.
954c1994
GS
7607
7608Note that C<sv_setref_pv> copies the pointer while this copies the string.
7609
7610=cut
7611*/
7612
a0d0e21e 7613SV*
1b6737cc 7614Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, const char *pv, STRLEN n)
a0d0e21e
LW
7615{
7616 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
7617 return rv;
7618}
7619
954c1994
GS
7620/*
7621=for apidoc sv_bless
7622
7623Blesses an SV into a specified package. The SV must be an RV. The package
7624must be designated by its stash (see C<gv_stashpv()>). The reference count
7625of the SV is unaffected.
7626
7627=cut
7628*/
7629
a0d0e21e 7630SV*
864dbfa3 7631Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 7632{
97aff369 7633 dVAR;
76e3520e 7634 SV *tmpRef;
a0d0e21e 7635 if (!SvROK(sv))
cea2e8a9 7636 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
7637 tmpRef = SvRV(sv);
7638 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
7639 if (SvREADONLY(tmpRef))
cea2e8a9 7640 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
7641 if (SvOBJECT(tmpRef)) {
7642 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7643 --PL_sv_objcount;
76e3520e 7644 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 7645 }
a0d0e21e 7646 }
76e3520e
GS
7647 SvOBJECT_on(tmpRef);
7648 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7649 ++PL_sv_objcount;
862a34c6 7650 SvUPGRADE(tmpRef, SVt_PVMG);
b37c2d43 7651 SvSTASH_set(tmpRef, (HV*)SvREFCNT_inc_simple(stash));
a0d0e21e 7652
2e3febc6
CS
7653 if (Gv_AMG(stash))
7654 SvAMAGIC_on(sv);
7655 else
7656 SvAMAGIC_off(sv);
a0d0e21e 7657
1edbfb88
AB
7658 if(SvSMAGICAL(tmpRef))
7659 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
7660 mg_set(tmpRef);
7661
7662
ecdeb87c 7663
a0d0e21e
LW
7664 return sv;
7665}
7666
645c22ef 7667/* Downgrades a PVGV to a PVMG.
645c22ef
DM
7668 */
7669
76e3520e 7670STATIC void
cea2e8a9 7671S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 7672{
97aff369 7673 dVAR;
850fabdf 7674 void *xpvmg;
b37c2d43 7675 SV * const temp = sv_newmortal();
850fabdf 7676
a0d0e21e
LW
7677 assert(SvTYPE(sv) == SVt_PVGV);
7678 SvFAKE_off(sv);
180488f8
NC
7679 gv_efullname3(temp, (GV *) sv, "*");
7680
f7877b28 7681 if (GvGP(sv)) {
1edc1566 7682 gp_free((GV*)sv);
f7877b28 7683 }
e826b3c7 7684 if (GvSTASH(sv)) {
e15faf7d 7685 sv_del_backref((SV*)GvSTASH(sv), sv);
5c284bb0 7686 GvSTASH(sv) = NULL;
e826b3c7 7687 }
a5f75d66 7688 GvMULTI_off(sv);
acda4c6a
NC
7689 if (GvNAME_HEK(sv)) {
7690 unshare_hek(GvNAME_HEK(sv));
7691 }
dedf8e73 7692 SvSCREAM_off(sv);
850fabdf
GS
7693
7694 /* need to keep SvANY(sv) in the right arena */
7695 xpvmg = new_XPVMG();
7696 StructCopy(SvANY(sv), xpvmg, XPVMG);
7697 del_XPVGV(SvANY(sv));
7698 SvANY(sv) = xpvmg;
7699
a0d0e21e
LW
7700 SvFLAGS(sv) &= ~SVTYPEMASK;
7701 SvFLAGS(sv) |= SVt_PVMG;
180488f8
NC
7702
7703 /* Intentionally not calling any local SET magic, as this isn't so much a
7704 set operation as merely an internal storage change. */
7705 sv_setsv_flags(sv, temp, 0);
a0d0e21e
LW
7706}
7707
954c1994 7708/*
840a7b70 7709=for apidoc sv_unref_flags
954c1994
GS
7710
7711Unsets the RV status of the SV, and decrements the reference count of
7712whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
7713as a reversal of C<newSVrv>. The C<cflags> argument can contain
7714C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
7715(otherwise the decrementing is conditional on the reference count being
7716different from one or the reference being a readonly SV).
7889fe52 7717See C<SvROK_off>.
954c1994
GS
7718
7719=cut
7720*/
7721
ed6116ce 7722void
e15faf7d 7723Perl_sv_unref_flags(pTHX_ SV *ref, U32 flags)
ed6116ce 7724{
b64e5050 7725 SV* const target = SvRV(ref);
810b8aa5 7726
e15faf7d
NC
7727 if (SvWEAKREF(ref)) {
7728 sv_del_backref(target, ref);
7729 SvWEAKREF_off(ref);
7730 SvRV_set(ref, NULL);
810b8aa5
GS
7731 return;
7732 }
e15faf7d
NC
7733 SvRV_set(ref, NULL);
7734 SvROK_off(ref);
7735 /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
04ca4930 7736 assigned to as BEGIN {$a = \"Foo"} will fail. */
e15faf7d
NC
7737 if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
7738 SvREFCNT_dec(target);
840a7b70 7739 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
e15faf7d 7740 sv_2mortal(target); /* Schedule for freeing later */
ed6116ce 7741}
8990e307 7742
840a7b70 7743/*
645c22ef
DM
7744=for apidoc sv_untaint
7745
7746Untaint an SV. Use C<SvTAINTED_off> instead.
7747=cut
7748*/
7749
bbce6d69 7750void
864dbfa3 7751Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 7752{
13f57bf8 7753 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
b64e5050 7754 MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 7755 if (mg)
565764a8 7756 mg->mg_len &= ~1;
36477c24 7757 }
bbce6d69 7758}
7759
645c22ef
DM
7760/*
7761=for apidoc sv_tainted
7762
7763Test an SV for taintedness. Use C<SvTAINTED> instead.
7764=cut
7765*/
7766
bbce6d69 7767bool
864dbfa3 7768Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 7769{
13f57bf8 7770 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
823a54a3 7771 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
2ddb8a4f 7772 if (mg && (mg->mg_len & 1) )
36477c24 7773 return TRUE;
7774 }
7775 return FALSE;
bbce6d69 7776}
7777
09540bc3
JH
7778/*
7779=for apidoc sv_setpviv
7780
7781Copies an integer into the given SV, also updating its string value.
7782Does not handle 'set' magic. See C<sv_setpviv_mg>.
7783
7784=cut
7785*/
7786
7787void
7788Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
7789{
7790 char buf[TYPE_CHARS(UV)];
7791 char *ebuf;
b64e5050 7792 char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
09540bc3
JH
7793
7794 sv_setpvn(sv, ptr, ebuf - ptr);
7795}
7796
7797/*
7798=for apidoc sv_setpviv_mg
7799
7800Like C<sv_setpviv>, but also handles 'set' magic.
7801
7802=cut
7803*/
7804
7805void
7806Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
7807{
df7eb254 7808 sv_setpviv(sv, iv);
09540bc3
JH
7809 SvSETMAGIC(sv);
7810}
7811
cea2e8a9 7812#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7813
7814/* pTHX_ magic can't cope with varargs, so this is a no-context
7815 * version of the main function, (which may itself be aliased to us).
7816 * Don't access this version directly.
7817 */
7818
cea2e8a9
GS
7819void
7820Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
7821{
7822 dTHX;
7823 va_list args;
7824 va_start(args, pat);
c5be433b 7825 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
7826 va_end(args);
7827}
7828
645c22ef
DM
7829/* pTHX_ magic can't cope with varargs, so this is a no-context
7830 * version of the main function, (which may itself be aliased to us).
7831 * Don't access this version directly.
7832 */
cea2e8a9
GS
7833
7834void
7835Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
7836{
7837 dTHX;
7838 va_list args;
7839 va_start(args, pat);
c5be433b 7840 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 7841 va_end(args);
cea2e8a9
GS
7842}
7843#endif
7844
954c1994
GS
7845/*
7846=for apidoc sv_setpvf
7847
bffc3d17
SH
7848Works like C<sv_catpvf> but copies the text into the SV instead of
7849appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
7850
7851=cut
7852*/
7853
46fc3d4c 7854void
864dbfa3 7855Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 7856{
7857 va_list args;
46fc3d4c 7858 va_start(args, pat);
c5be433b 7859 sv_vsetpvf(sv, pat, &args);
46fc3d4c 7860 va_end(args);
7861}
7862
bffc3d17
SH
7863/*
7864=for apidoc sv_vsetpvf
7865
7866Works like C<sv_vcatpvf> but copies the text into the SV instead of
7867appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
7868
7869Usually used via its frontend C<sv_setpvf>.
7870
7871=cut
7872*/
645c22ef 7873
c5be433b
GS
7874void
7875Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7876{
4608196e 7877 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b 7878}
ef50df4b 7879
954c1994
GS
7880/*
7881=for apidoc sv_setpvf_mg
7882
7883Like C<sv_setpvf>, but also handles 'set' magic.
7884
7885=cut
7886*/
7887
ef50df4b 7888void
864dbfa3 7889Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
7890{
7891 va_list args;
ef50df4b 7892 va_start(args, pat);
c5be433b 7893 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 7894 va_end(args);
c5be433b
GS
7895}
7896
bffc3d17
SH
7897/*
7898=for apidoc sv_vsetpvf_mg
7899
7900Like C<sv_vsetpvf>, but also handles 'set' magic.
7901
7902Usually used via its frontend C<sv_setpvf_mg>.
7903
7904=cut
7905*/
645c22ef 7906
c5be433b
GS
7907void
7908Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7909{
4608196e 7910 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
7911 SvSETMAGIC(sv);
7912}
7913
cea2e8a9 7914#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7915
7916/* pTHX_ magic can't cope with varargs, so this is a no-context
7917 * version of the main function, (which may itself be aliased to us).
7918 * Don't access this version directly.
7919 */
7920
cea2e8a9
GS
7921void
7922Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
7923{
7924 dTHX;
7925 va_list args;
7926 va_start(args, pat);
c5be433b 7927 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
7928 va_end(args);
7929}
7930
645c22ef
DM
7931/* pTHX_ magic can't cope with varargs, so this is a no-context
7932 * version of the main function, (which may itself be aliased to us).
7933 * Don't access this version directly.
7934 */
7935
cea2e8a9
GS
7936void
7937Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
7938{
7939 dTHX;
7940 va_list args;
7941 va_start(args, pat);
c5be433b 7942 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 7943 va_end(args);
cea2e8a9
GS
7944}
7945#endif
7946
954c1994
GS
7947/*
7948=for apidoc sv_catpvf
7949
d5ce4a7c
GA
7950Processes its arguments like C<sprintf> and appends the formatted
7951output to an SV. If the appended data contains "wide" characters
7952(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
7953and characters >255 formatted with %c), the original SV might get
bffc3d17 7954upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
7955C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
7956valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 7957
d5ce4a7c 7958=cut */
954c1994 7959
46fc3d4c 7960void
864dbfa3 7961Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 7962{
7963 va_list args;
46fc3d4c 7964 va_start(args, pat);
c5be433b 7965 sv_vcatpvf(sv, pat, &args);
46fc3d4c 7966 va_end(args);
7967}
7968
bffc3d17
SH
7969/*
7970=for apidoc sv_vcatpvf
7971
7972Processes its arguments like C<vsprintf> and appends the formatted output
7973to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
7974
7975Usually used via its frontend C<sv_catpvf>.
7976
7977=cut
7978*/
645c22ef 7979
ef50df4b 7980void
c5be433b
GS
7981Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7982{
4608196e 7983 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
7984}
7985
954c1994
GS
7986/*
7987=for apidoc sv_catpvf_mg
7988
7989Like C<sv_catpvf>, but also handles 'set' magic.
7990
7991=cut
7992*/
7993
c5be433b 7994void
864dbfa3 7995Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
7996{
7997 va_list args;
ef50df4b 7998 va_start(args, pat);
c5be433b 7999 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 8000 va_end(args);
c5be433b
GS
8001}
8002
bffc3d17
SH
8003/*
8004=for apidoc sv_vcatpvf_mg
8005
8006Like C<sv_vcatpvf>, but also handles 'set' magic.
8007
8008Usually used via its frontend C<sv_catpvf_mg>.
8009
8010=cut
8011*/
645c22ef 8012
c5be433b
GS
8013void
8014Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8015{
4608196e 8016 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
8017 SvSETMAGIC(sv);
8018}
8019
954c1994
GS
8020/*
8021=for apidoc sv_vsetpvfn
8022
bffc3d17 8023Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
8024appending it.
8025
bffc3d17 8026Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 8027
954c1994
GS
8028=cut
8029*/
8030
46fc3d4c 8031void
7d5ea4e7 8032Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8033{
8034 sv_setpvn(sv, "", 0);
7d5ea4e7 8035 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 8036}
8037
2d00ba3b 8038STATIC I32
9dd79c3f 8039S_expect_number(pTHX_ char** pattern)
211dfcf1 8040{
97aff369 8041 dVAR;
211dfcf1
HS
8042 I32 var = 0;
8043 switch (**pattern) {
8044 case '1': case '2': case '3':
8045 case '4': case '5': case '6':
8046 case '7': case '8': case '9':
2fba7546
GA
8047 var = *(*pattern)++ - '0';
8048 while (isDIGIT(**pattern)) {
5f66b61c 8049 const I32 tmp = var * 10 + (*(*pattern)++ - '0');
2fba7546
GA
8050 if (tmp < var)
8051 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_NAME(PL_op) : "sv_vcatpvfn"));
8052 var = tmp;
8053 }
211dfcf1
HS
8054 }
8055 return var;
8056}
211dfcf1 8057
c445ea15
AL
8058STATIC char *
8059S_F0convert(NV nv, char *endbuf, STRLEN *len)
4151a5fe 8060{
a3b680e6 8061 const int neg = nv < 0;
4151a5fe 8062 UV uv;
4151a5fe
IZ
8063
8064 if (neg)
8065 nv = -nv;
8066 if (nv < UV_MAX) {
b464bac0 8067 char *p = endbuf;
4151a5fe 8068 nv += 0.5;
028f8eaa 8069 uv = (UV)nv;
4151a5fe
IZ
8070 if (uv & 1 && uv == nv)
8071 uv--; /* Round to even */
8072 do {
a3b680e6 8073 const unsigned dig = uv % 10;
4151a5fe
IZ
8074 *--p = '0' + dig;
8075 } while (uv /= 10);
8076 if (neg)
8077 *--p = '-';
8078 *len = endbuf - p;
8079 return p;
8080 }
bd61b366 8081 return NULL;
4151a5fe
IZ
8082}
8083
8084
954c1994
GS
8085/*
8086=for apidoc sv_vcatpvfn
8087
8088Processes its arguments like C<vsprintf> and appends the formatted output
8089to an SV. Uses an array of SVs if the C style variable argument list is
8090missing (NULL). When running with taint checks enabled, indicates via
8091C<maybe_tainted> if results are untrustworthy (often due to the use of
8092locales).
8093
bffc3d17 8094Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 8095
954c1994
GS
8096=cut
8097*/
8098
8896765a
RB
8099
8100#define VECTORIZE_ARGS vecsv = va_arg(*args, SV*);\
8101 vecstr = (U8*)SvPV_const(vecsv,veclen);\
8102 vec_utf8 = DO_UTF8(vecsv);
8103
1ef29b0e
RGS
8104/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
8105
46fc3d4c 8106void
7d5ea4e7 8107Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8108{
97aff369 8109 dVAR;
46fc3d4c 8110 char *p;
8111 char *q;
a3b680e6 8112 const char *patend;
fc36a67e 8113 STRLEN origlen;
46fc3d4c 8114 I32 svix = 0;
27da23d5 8115 static const char nullstr[] = "(null)";
a0714e2c 8116 SV *argsv = NULL;
b464bac0
AL
8117 bool has_utf8 = DO_UTF8(sv); /* has the result utf8? */
8118 const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
a0714e2c 8119 SV *nsv = NULL;
4151a5fe
IZ
8120 /* Times 4: a decimal digit takes more than 3 binary digits.
8121 * NV_DIG: mantissa takes than many decimal digits.
8122 * Plus 32: Playing safe. */
8123 char ebuf[IV_DIG * 4 + NV_DIG + 32];
8124 /* large enough for "%#.#f" --chip */
8125 /* what about long double NVs? --jhi */
db79b45b 8126
53c1dcc0
AL
8127 PERL_UNUSED_ARG(maybe_tainted);
8128
46fc3d4c 8129 /* no matter what, this is a string now */
fc36a67e 8130 (void)SvPV_force(sv, origlen);
46fc3d4c 8131
8896765a 8132 /* special-case "", "%s", and "%-p" (SVf - see below) */
46fc3d4c 8133 if (patlen == 0)
8134 return;
0dbb1585 8135 if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
2d03de9c
AL
8136 if (args) {
8137 const char * const s = va_arg(*args, char*);
8138 sv_catpv(sv, s ? s : nullstr);
8139 }
8140 else if (svix < svmax) {
8141 sv_catsv(sv, *svargs);
2d03de9c
AL
8142 }
8143 return;
0dbb1585 8144 }
8896765a
RB
8145 if (args && patlen == 3 && pat[0] == '%' &&
8146 pat[1] == '-' && pat[2] == 'p') {
8147 argsv = va_arg(*args, SV*);
8148 sv_catsv(sv, argsv);
8896765a 8149 return;
46fc3d4c 8150 }
8151
1d917b39 8152#ifndef USE_LONG_DOUBLE
4151a5fe 8153 /* special-case "%.<number>[gf]" */
7af36d83 8154 if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
4151a5fe
IZ
8155 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
8156 unsigned digits = 0;
8157 const char *pp;
8158
8159 pp = pat + 2;
8160 while (*pp >= '0' && *pp <= '9')
8161 digits = 10 * digits + (*pp++ - '0');
028f8eaa 8162 if (pp - pat == (int)patlen - 1) {
4151a5fe
IZ
8163 NV nv;
8164
7af36d83 8165 if (svix < svmax)
4151a5fe
IZ
8166 nv = SvNV(*svargs);
8167 else
8168 return;
8169 if (*pp == 'g') {
2873255c
NC
8170 /* Add check for digits != 0 because it seems that some
8171 gconverts are buggy in this case, and we don't yet have
8172 a Configure test for this. */
8173 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
8174 /* 0, point, slack */
2e59c212 8175 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
8176 sv_catpv(sv, ebuf);
8177 if (*ebuf) /* May return an empty string for digits==0 */
8178 return;
8179 }
8180 } else if (!digits) {
8181 STRLEN l;
8182
8183 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
8184 sv_catpvn(sv, p, l);
8185 return;
8186 }
8187 }
8188 }
8189 }
1d917b39 8190#endif /* !USE_LONG_DOUBLE */
4151a5fe 8191
2cf2cfc6 8192 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 8193 has_utf8 = TRUE;
2cf2cfc6 8194
46fc3d4c 8195 patend = (char*)pat + patlen;
8196 for (p = (char*)pat; p < patend; p = q) {
8197 bool alt = FALSE;
8198 bool left = FALSE;
b22c7a20 8199 bool vectorize = FALSE;
211dfcf1 8200 bool vectorarg = FALSE;
2cf2cfc6 8201 bool vec_utf8 = FALSE;
46fc3d4c 8202 char fill = ' ';
8203 char plus = 0;
8204 char intsize = 0;
8205 STRLEN width = 0;
fc36a67e 8206 STRLEN zeros = 0;
46fc3d4c 8207 bool has_precis = FALSE;
8208 STRLEN precis = 0;
c445ea15 8209 const I32 osvix = svix;
2cf2cfc6 8210 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
8211#ifdef HAS_LDBL_SPRINTF_BUG
8212 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 8213 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
8214 bool fix_ldbl_sprintf_bug = FALSE;
8215#endif
205f51d8 8216
46fc3d4c 8217 char esignbuf[4];
89ebb4a3 8218 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 8219 STRLEN esignlen = 0;
8220
bd61b366 8221 const char *eptr = NULL;
fc36a67e 8222 STRLEN elen = 0;
a0714e2c 8223 SV *vecsv = NULL;
4608196e 8224 const U8 *vecstr = NULL;
b22c7a20 8225 STRLEN veclen = 0;
934abaf1 8226 char c = 0;
46fc3d4c 8227 int i;
9c5ffd7c 8228 unsigned base = 0;
8c8eb53c
RB
8229 IV iv = 0;
8230 UV uv = 0;
9e5b023a
JH
8231 /* we need a long double target in case HAS_LONG_DOUBLE but
8232 not USE_LONG_DOUBLE
8233 */
35fff930 8234#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
8235 long double nv;
8236#else
65202027 8237 NV nv;
9e5b023a 8238#endif
46fc3d4c 8239 STRLEN have;
8240 STRLEN need;
8241 STRLEN gap;
7af36d83 8242 const char *dotstr = ".";
b22c7a20 8243 STRLEN dotstrlen = 1;
211dfcf1 8244 I32 efix = 0; /* explicit format parameter index */
eb3fce90 8245 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
8246 I32 epix = 0; /* explicit precision index */
8247 I32 evix = 0; /* explicit vector index */
eb3fce90 8248 bool asterisk = FALSE;
46fc3d4c 8249
211dfcf1 8250 /* echo everything up to the next format specification */
46fc3d4c 8251 for (q = p; q < patend && *q != '%'; ++q) ;
8252 if (q > p) {
db79b45b
JH
8253 if (has_utf8 && !pat_utf8)
8254 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
8255 else
8256 sv_catpvn(sv, p, q - p);
46fc3d4c 8257 p = q;
8258 }
8259 if (q++ >= patend)
8260 break;
8261
211dfcf1
HS
8262/*
8263 We allow format specification elements in this order:
8264 \d+\$ explicit format parameter index
8265 [-+ 0#]+ flags
a472f209 8266 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 8267 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
8268 \d+|\*(\d+\$)? width using optional (optionally specified) arg
8269 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
8270 [hlqLV] size
8896765a
RB
8271 [%bcdefginopsuxDFOUX] format (mandatory)
8272*/
8273
8274 if (args) {
8275/*
8276 As of perl5.9.3, printf format checking is on by default.
8277 Internally, perl uses %p formats to provide an escape to
8278 some extended formatting. This block deals with those
8279 extensions: if it does not match, (char*)q is reset and
8280 the normal format processing code is used.
8281
8282 Currently defined extensions are:
8283 %p include pointer address (standard)
8284 %-p (SVf) include an SV (previously %_)
8285 %-<num>p include an SV with precision <num>
8286 %1p (VDf) include a v-string (as %vd)
8287 %<num>p reserved for future extensions
8288
8289 Robin Barker 2005-07-14
211dfcf1 8290*/
8896765a
RB
8291 char* r = q;
8292 bool sv = FALSE;
8293 STRLEN n = 0;
8294 if (*q == '-')
8295 sv = *q++;
c445ea15 8296 n = expect_number(&q);
8896765a
RB
8297 if (*q++ == 'p') {
8298 if (sv) { /* SVf */
8299 if (n) {
8300 precis = n;
8301 has_precis = TRUE;
8302 }
8303 argsv = va_arg(*args, SV*);
8304 eptr = SvPVx_const(argsv, elen);
8305 if (DO_UTF8(argsv))
8306 is_utf8 = TRUE;
8307 goto string;
8308 }
8309#if vdNUMBER
8310 else if (n == vdNUMBER) { /* VDf */
8311 vectorize = TRUE;
8312 VECTORIZE_ARGS
8313 goto format_vd;
8314 }
8315#endif
8316 else if (n) {
8317 if (ckWARN_d(WARN_INTERNAL))
8318 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
8319 "internal %%<num>p might conflict with future printf extensions");
8320 }
8321 }
8322 q = r;
8323 }
8324
c445ea15 8325 if ( (width = expect_number(&q)) ) {
211dfcf1
HS
8326 if (*q == '$') {
8327 ++q;
8328 efix = width;
8329 } else {
8330 goto gotwidth;
8331 }
8332 }
8333
fc36a67e 8334 /* FLAGS */
8335
46fc3d4c 8336 while (*q) {
8337 switch (*q) {
8338 case ' ':
8339 case '+':
8340 plus = *q++;
8341 continue;
8342
8343 case '-':
8344 left = TRUE;
8345 q++;
8346 continue;
8347
8348 case '0':
8349 fill = *q++;
8350 continue;
8351
8352 case '#':
8353 alt = TRUE;
8354 q++;
8355 continue;
8356
fc36a67e 8357 default:
8358 break;
8359 }
8360 break;
8361 }
46fc3d4c 8362
211dfcf1 8363 tryasterisk:
eb3fce90 8364 if (*q == '*') {
211dfcf1 8365 q++;
c445ea15 8366 if ( (ewix = expect_number(&q)) )
211dfcf1
HS
8367 if (*q++ != '$')
8368 goto unknown;
eb3fce90 8369 asterisk = TRUE;
211dfcf1
HS
8370 }
8371 if (*q == 'v') {
eb3fce90 8372 q++;
211dfcf1
HS
8373 if (vectorize)
8374 goto unknown;
9cbac4c7 8375 if ((vectorarg = asterisk)) {
211dfcf1
HS
8376 evix = ewix;
8377 ewix = 0;
8378 asterisk = FALSE;
8379 }
8380 vectorize = TRUE;
8381 goto tryasterisk;
eb3fce90
JH
8382 }
8383
211dfcf1 8384 if (!asterisk)
858a90f9 8385 {
7a5fa8a2 8386 if( *q == '0' )
f3583277 8387 fill = *q++;
c445ea15 8388 width = expect_number(&q);
858a90f9 8389 }
211dfcf1
HS
8390
8391 if (vectorize) {
8392 if (vectorarg) {
8393 if (args)
8394 vecsv = va_arg(*args, SV*);
7ad96abb
NC
8395 else if (evix) {
8396 vecsv = (evix > 0 && evix <= svmax)
8397 ? svargs[evix-1] : &PL_sv_undef;
8398 } else {
8399 vecsv = svix < svmax ? svargs[svix++] : &PL_sv_undef;
8400 }
245d4a47 8401 dotstr = SvPV_const(vecsv, dotstrlen);
640283f5
NC
8402 /* Keep the DO_UTF8 test *after* the SvPV call, else things go
8403 bad with tied or overloaded values that return UTF8. */
211dfcf1 8404 if (DO_UTF8(vecsv))
2cf2cfc6 8405 is_utf8 = TRUE;
640283f5
NC
8406 else if (has_utf8) {
8407 vecsv = sv_mortalcopy(vecsv);
8408 sv_utf8_upgrade(vecsv);
8409 dotstr = SvPV_const(vecsv, dotstrlen);
8410 is_utf8 = TRUE;
8411 }
211dfcf1
HS
8412 }
8413 if (args) {
8896765a 8414 VECTORIZE_ARGS
eb3fce90 8415 }
7ad96abb 8416 else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
211dfcf1 8417 vecsv = svargs[efix ? efix-1 : svix++];
245d4a47 8418 vecstr = (U8*)SvPV_const(vecsv,veclen);
2cf2cfc6 8419 vec_utf8 = DO_UTF8(vecsv);
96b8f7ce
JP
8420
8421 /* if this is a version object, we need to convert
8422 * back into v-string notation and then let the
8423 * vectorize happen normally
d7aa5382 8424 */
96b8f7ce
JP
8425 if (sv_derived_from(vecsv, "version")) {
8426 char *version = savesvpv(vecsv);
34ba6322
SP
8427 if ( hv_exists((HV*)SvRV(vecsv), "alpha", 5 ) ) {
8428 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
8429 "vector argument not supported with alpha versions");
8430 goto unknown;
8431 }
96b8f7ce
JP
8432 vecsv = sv_newmortal();
8433 /* scan_vstring is expected to be called during
8434 * tokenization, so we need to fake up the end
8435 * of the buffer for it
8436 */
8437 PL_bufend = version + veclen;
8438 scan_vstring(version, vecsv);
8439 vecstr = (U8*)SvPV_const(vecsv, veclen);
8440 vec_utf8 = DO_UTF8(vecsv);
8441 Safefree(version);
d7aa5382 8442 }
211dfcf1
HS
8443 }
8444 else {
8445 vecstr = (U8*)"";
8446 veclen = 0;
8447 }
eb3fce90 8448 }
fc36a67e 8449
eb3fce90 8450 if (asterisk) {
fc36a67e 8451 if (args)
8452 i = va_arg(*args, int);
8453 else
eb3fce90
JH
8454 i = (ewix ? ewix <= svmax : svix < svmax) ?
8455 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8456 left |= (i < 0);
8457 width = (i < 0) ? -i : i;
fc36a67e 8458 }
211dfcf1 8459 gotwidth:
fc36a67e 8460
8461 /* PRECISION */
46fc3d4c 8462
fc36a67e 8463 if (*q == '.') {
8464 q++;
8465 if (*q == '*') {
211dfcf1 8466 q++;
c445ea15 8467 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
7b8dd722
HS
8468 goto unknown;
8469 /* XXX: todo, support specified precision parameter */
8470 if (epix)
211dfcf1 8471 goto unknown;
46fc3d4c 8472 if (args)
8473 i = va_arg(*args, int);
8474 else
eb3fce90
JH
8475 i = (ewix ? ewix <= svmax : svix < svmax)
8476 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8477 precis = (i < 0) ? 0 : i;
fc36a67e 8478 }
8479 else {
8480 precis = 0;
8481 while (isDIGIT(*q))
8482 precis = precis * 10 + (*q++ - '0');
8483 }
8484 has_precis = TRUE;
8485 }
46fc3d4c 8486
fc36a67e 8487 /* SIZE */
46fc3d4c 8488
fc36a67e 8489 switch (*q) {
c623ac67
GS
8490#ifdef WIN32
8491 case 'I': /* Ix, I32x, and I64x */
8492# ifdef WIN64
8493 if (q[1] == '6' && q[2] == '4') {
8494 q += 3;
8495 intsize = 'q';
8496 break;
8497 }
8498# endif
8499 if (q[1] == '3' && q[2] == '2') {
8500 q += 3;
8501 break;
8502 }
8503# ifdef WIN64
8504 intsize = 'q';
8505# endif
8506 q++;
8507 break;
8508#endif
9e5b023a 8509#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 8510 case 'L': /* Ld */
5f66b61c 8511 /*FALLTHROUGH*/
e5c81feb 8512#ifdef HAS_QUAD
6f9bb7fd 8513 case 'q': /* qd */
9e5b023a 8514#endif
6f9bb7fd
GS
8515 intsize = 'q';
8516 q++;
8517 break;
8518#endif
fc36a67e 8519 case 'l':
9e5b023a 8520#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 8521 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 8522 intsize = 'q';
8523 q += 2;
46fc3d4c 8524 break;
cf2093f6 8525 }
fc36a67e 8526#endif
5f66b61c 8527 /*FALLTHROUGH*/
fc36a67e 8528 case 'h':
5f66b61c 8529 /*FALLTHROUGH*/
fc36a67e 8530 case 'V':
8531 intsize = *q++;
46fc3d4c 8532 break;
8533 }
8534
fc36a67e 8535 /* CONVERSION */
8536
211dfcf1
HS
8537 if (*q == '%') {
8538 eptr = q++;
8539 elen = 1;
26372e71
GA
8540 if (vectorize) {
8541 c = '%';
8542 goto unknown;
8543 }
211dfcf1
HS
8544 goto string;
8545 }
8546
26372e71 8547 if (!vectorize && !args) {
86c51f8b
NC
8548 if (efix) {
8549 const I32 i = efix-1;
8550 argsv = (i >= 0 && i < svmax) ? svargs[i] : &PL_sv_undef;
8551 } else {
8552 argsv = (svix >= 0 && svix < svmax)
8553 ? svargs[svix++] : &PL_sv_undef;
8554 }
863811b2 8555 }
211dfcf1 8556
46fc3d4c 8557 switch (c = *q++) {
8558
8559 /* STRINGS */
8560
46fc3d4c 8561 case 'c':
26372e71
GA
8562 if (vectorize)
8563 goto unknown;
8564 uv = (args) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
8565 if ((uv > 255 ||
8566 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 8567 && !IN_BYTES) {
dfe13c55 8568 eptr = (char*)utf8buf;
9041c2e3 8569 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 8570 is_utf8 = TRUE;
7e2040f0
GS
8571 }
8572 else {
8573 c = (char)uv;
8574 eptr = &c;
8575 elen = 1;
a0ed51b3 8576 }
46fc3d4c 8577 goto string;
8578
46fc3d4c 8579 case 's':
26372e71
GA
8580 if (vectorize)
8581 goto unknown;
8582 if (args) {
fc36a67e 8583 eptr = va_arg(*args, char*);
c635e13b 8584 if (eptr)
1d7c1841
GS
8585#ifdef MACOS_TRADITIONAL
8586 /* On MacOS, %#s format is used for Pascal strings */
8587 if (alt)
8588 elen = *eptr++;
8589 else
8590#endif
c635e13b 8591 elen = strlen(eptr);
8592 else {
27da23d5 8593 eptr = (char *)nullstr;
c635e13b 8594 elen = sizeof nullstr - 1;
8595 }
46fc3d4c 8596 }
211dfcf1 8597 else {
4d84ee25 8598 eptr = SvPVx_const(argsv, elen);
7e2040f0 8599 if (DO_UTF8(argsv)) {
a0ed51b3
LW
8600 if (has_precis && precis < elen) {
8601 I32 p = precis;
7e2040f0 8602 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
8603 precis = p;
8604 }
8605 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 8606 width += elen - sv_len_utf8(argsv);
a0ed51b3 8607 }
2cf2cfc6 8608 is_utf8 = TRUE;
a0ed51b3
LW
8609 }
8610 }
fc36a67e 8611
46fc3d4c 8612 string:
8613 if (has_precis && elen > precis)
8614 elen = precis;
8615 break;
8616
8617 /* INTEGERS */
8618
fc36a67e 8619 case 'p':
be75b157 8620 if (alt || vectorize)
c2e66d9e 8621 goto unknown;
211dfcf1 8622 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 8623 base = 16;
8624 goto integer;
8625
46fc3d4c 8626 case 'D':
29fe7a80 8627#ifdef IV_IS_QUAD
22f3ae8c 8628 intsize = 'q';
29fe7a80 8629#else
46fc3d4c 8630 intsize = 'l';
29fe7a80 8631#endif
5f66b61c 8632 /*FALLTHROUGH*/
46fc3d4c 8633 case 'd':
8634 case 'i':
8896765a
RB
8635#if vdNUMBER
8636 format_vd:
8637#endif
b22c7a20 8638 if (vectorize) {
ba210ebe 8639 STRLEN ulen;
211dfcf1
HS
8640 if (!veclen)
8641 continue;
2cf2cfc6
A
8642 if (vec_utf8)
8643 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8644 UTF8_ALLOW_ANYUV);
b22c7a20 8645 else {
e83d50c9 8646 uv = *vecstr;
b22c7a20
GS
8647 ulen = 1;
8648 }
8649 vecstr += ulen;
8650 veclen -= ulen;
e83d50c9
JP
8651 if (plus)
8652 esignbuf[esignlen++] = plus;
b22c7a20
GS
8653 }
8654 else if (args) {
46fc3d4c 8655 switch (intsize) {
8656 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 8657 case 'l': iv = va_arg(*args, long); break;
fc36a67e 8658 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 8659 default: iv = va_arg(*args, int); break;
cf2093f6
JH
8660#ifdef HAS_QUAD
8661 case 'q': iv = va_arg(*args, Quad_t); break;
8662#endif
46fc3d4c 8663 }
8664 }
8665 else {
b10c0dba 8666 IV tiv = SvIVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 8667 switch (intsize) {
b10c0dba
MHM
8668 case 'h': iv = (short)tiv; break;
8669 case 'l': iv = (long)tiv; break;
8670 case 'V':
8671 default: iv = tiv; break;
cf2093f6 8672#ifdef HAS_QUAD
b10c0dba 8673 case 'q': iv = (Quad_t)tiv; break;
cf2093f6 8674#endif
46fc3d4c 8675 }
8676 }
e83d50c9
JP
8677 if ( !vectorize ) /* we already set uv above */
8678 {
8679 if (iv >= 0) {
8680 uv = iv;
8681 if (plus)
8682 esignbuf[esignlen++] = plus;
8683 }
8684 else {
8685 uv = -iv;
8686 esignbuf[esignlen++] = '-';
8687 }
46fc3d4c 8688 }
8689 base = 10;
8690 goto integer;
8691
fc36a67e 8692 case 'U':
29fe7a80 8693#ifdef IV_IS_QUAD
22f3ae8c 8694 intsize = 'q';
29fe7a80 8695#else
fc36a67e 8696 intsize = 'l';
29fe7a80 8697#endif
5f66b61c 8698 /*FALLTHROUGH*/
fc36a67e 8699 case 'u':
8700 base = 10;
8701 goto uns_integer;
8702
4f19785b
WSI
8703 case 'b':
8704 base = 2;
8705 goto uns_integer;
8706
46fc3d4c 8707 case 'O':
29fe7a80 8708#ifdef IV_IS_QUAD
22f3ae8c 8709 intsize = 'q';
29fe7a80 8710#else
46fc3d4c 8711 intsize = 'l';
29fe7a80 8712#endif
5f66b61c 8713 /*FALLTHROUGH*/
46fc3d4c 8714 case 'o':
8715 base = 8;
8716 goto uns_integer;
8717
8718 case 'X':
46fc3d4c 8719 case 'x':
8720 base = 16;
46fc3d4c 8721
8722 uns_integer:
b22c7a20 8723 if (vectorize) {
ba210ebe 8724 STRLEN ulen;
b22c7a20 8725 vector:
211dfcf1
HS
8726 if (!veclen)
8727 continue;
2cf2cfc6
A
8728 if (vec_utf8)
8729 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8730 UTF8_ALLOW_ANYUV);
b22c7a20 8731 else {
a05b299f 8732 uv = *vecstr;
b22c7a20
GS
8733 ulen = 1;
8734 }
8735 vecstr += ulen;
8736 veclen -= ulen;
8737 }
8738 else if (args) {
46fc3d4c 8739 switch (intsize) {
8740 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 8741 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 8742 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 8743 default: uv = va_arg(*args, unsigned); break;
cf2093f6 8744#ifdef HAS_QUAD
9e3321a5 8745 case 'q': uv = va_arg(*args, Uquad_t); break;
cf2093f6 8746#endif
46fc3d4c 8747 }
8748 }
8749 else {
b10c0dba 8750 UV tuv = SvUVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 8751 switch (intsize) {
b10c0dba
MHM
8752 case 'h': uv = (unsigned short)tuv; break;
8753 case 'l': uv = (unsigned long)tuv; break;
8754 case 'V':
8755 default: uv = tuv; break;
cf2093f6 8756#ifdef HAS_QUAD
b10c0dba 8757 case 'q': uv = (Uquad_t)tuv; break;
cf2093f6 8758#endif
46fc3d4c 8759 }
8760 }
8761
8762 integer:
4d84ee25
NC
8763 {
8764 char *ptr = ebuf + sizeof ebuf;
8765 switch (base) {
8766 unsigned dig;
8767 case 16:
8768 if (!uv)
8769 alt = FALSE;
8770 p = (char*)((c == 'X')
8771 ? "0123456789ABCDEF" : "0123456789abcdef");
8772 do {
8773 dig = uv & 15;
8774 *--ptr = p[dig];
8775 } while (uv >>= 4);
8776 if (alt) {
8777 esignbuf[esignlen++] = '0';
8778 esignbuf[esignlen++] = c; /* 'x' or 'X' */
8779 }
8780 break;
8781 case 8:
8782 do {
8783 dig = uv & 7;
8784 *--ptr = '0' + dig;
8785 } while (uv >>= 3);
8786 if (alt && *ptr != '0')
8787 *--ptr = '0';
8788 break;
8789 case 2:
ed2b91d2
GA
8790 if (!uv)
8791 alt = FALSE;
4d84ee25
NC
8792 do {
8793 dig = uv & 1;
8794 *--ptr = '0' + dig;
8795 } while (uv >>= 1);
8796 if (alt) {
8797 esignbuf[esignlen++] = '0';
8798 esignbuf[esignlen++] = 'b';
8799 }
8800 break;
8801 default: /* it had better be ten or less */
8802 do {
8803 dig = uv % base;
8804 *--ptr = '0' + dig;
8805 } while (uv /= base);
8806 break;
46fc3d4c 8807 }
4d84ee25
NC
8808 elen = (ebuf + sizeof ebuf) - ptr;
8809 eptr = ptr;
8810 if (has_precis) {
8811 if (precis > elen)
8812 zeros = precis - elen;
8813 else if (precis == 0 && elen == 1 && *eptr == '0')
8814 elen = 0;
eda88b6d 8815 }
c10ed8b9 8816 }
46fc3d4c 8817 break;
8818
8819 /* FLOATING POINT */
8820
fc36a67e 8821 case 'F':
8822 c = 'f'; /* maybe %F isn't supported here */
5f66b61c 8823 /*FALLTHROUGH*/
46fc3d4c 8824 case 'e': case 'E':
fc36a67e 8825 case 'f':
46fc3d4c 8826 case 'g': case 'G':
26372e71
GA
8827 if (vectorize)
8828 goto unknown;
46fc3d4c 8829
8830 /* This is evil, but floating point is even more evil */
8831
9e5b023a
JH
8832 /* for SV-style calling, we can only get NV
8833 for C-style calling, we assume %f is double;
8834 for simplicity we allow any of %Lf, %llf, %qf for long double
8835 */
8836 switch (intsize) {
8837 case 'V':
8838#if defined(USE_LONG_DOUBLE)
8839 intsize = 'q';
8840#endif
8841 break;
8a2e3f14 8842/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364 8843 case 'l':
5f66b61c 8844 /*FALLTHROUGH*/
9e5b023a
JH
8845 default:
8846#if defined(USE_LONG_DOUBLE)
8847 intsize = args ? 0 : 'q';
8848#endif
8849 break;
8850 case 'q':
8851#if defined(HAS_LONG_DOUBLE)
8852 break;
8853#else
5f66b61c 8854 /*FALLTHROUGH*/
9e5b023a
JH
8855#endif
8856 case 'h':
9e5b023a
JH
8857 goto unknown;
8858 }
8859
8860 /* now we need (long double) if intsize == 'q', else (double) */
26372e71 8861 nv = (args) ?
35fff930
JH
8862#if LONG_DOUBLESIZE > DOUBLESIZE
8863 intsize == 'q' ?
205f51d8
AS
8864 va_arg(*args, long double) :
8865 va_arg(*args, double)
35fff930 8866#else
205f51d8 8867 va_arg(*args, double)
35fff930 8868#endif
9e5b023a 8869 : SvNVx(argsv);
fc36a67e 8870
8871 need = 0;
8872 if (c != 'e' && c != 'E') {
8873 i = PERL_INT_MIN;
9e5b023a
JH
8874 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
8875 will cast our (long double) to (double) */
73b309ea 8876 (void)Perl_frexp(nv, &i);
fc36a67e 8877 if (i == PERL_INT_MIN)
cea2e8a9 8878 Perl_die(aTHX_ "panic: frexp");
c635e13b 8879 if (i > 0)
fc36a67e 8880 need = BIT_DIGITS(i);
8881 }
8882 need += has_precis ? precis : 6; /* known default */
20f6aaab 8883
fc36a67e 8884 if (need < width)
8885 need = width;
8886
20f6aaab
AS
8887#ifdef HAS_LDBL_SPRINTF_BUG
8888 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
8889 with sfio - Allen <allens@cpan.org> */
8890
8891# ifdef DBL_MAX
8892# define MY_DBL_MAX DBL_MAX
8893# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
8894# if DOUBLESIZE >= 8
8895# define MY_DBL_MAX 1.7976931348623157E+308L
8896# else
8897# define MY_DBL_MAX 3.40282347E+38L
8898# endif
8899# endif
8900
8901# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
8902# define MY_DBL_MAX_BUG 1L
20f6aaab 8903# else
205f51d8 8904# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 8905# endif
20f6aaab 8906
205f51d8
AS
8907# ifdef DBL_MIN
8908# define MY_DBL_MIN DBL_MIN
8909# else /* XXX guessing! -Allen */
8910# if DOUBLESIZE >= 8
8911# define MY_DBL_MIN 2.2250738585072014E-308L
8912# else
8913# define MY_DBL_MIN 1.17549435E-38L
8914# endif
8915# endif
20f6aaab 8916
205f51d8
AS
8917 if ((intsize == 'q') && (c == 'f') &&
8918 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
8919 (need < DBL_DIG)) {
8920 /* it's going to be short enough that
8921 * long double precision is not needed */
8922
8923 if ((nv <= 0L) && (nv >= -0L))
8924 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
8925 else {
8926 /* would use Perl_fp_class as a double-check but not
8927 * functional on IRIX - see perl.h comments */
8928
8929 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
8930 /* It's within the range that a double can represent */
8931#if defined(DBL_MAX) && !defined(DBL_MIN)
8932 if ((nv >= ((long double)1/DBL_MAX)) ||
8933 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 8934#endif
205f51d8 8935 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 8936 }
205f51d8
AS
8937 }
8938 if (fix_ldbl_sprintf_bug == TRUE) {
8939 double temp;
8940
8941 intsize = 0;
8942 temp = (double)nv;
8943 nv = (NV)temp;
8944 }
20f6aaab 8945 }
205f51d8
AS
8946
8947# undef MY_DBL_MAX
8948# undef MY_DBL_MAX_BUG
8949# undef MY_DBL_MIN
8950
20f6aaab
AS
8951#endif /* HAS_LDBL_SPRINTF_BUG */
8952
46fc3d4c 8953 need += 20; /* fudge factor */
80252599
GS
8954 if (PL_efloatsize < need) {
8955 Safefree(PL_efloatbuf);
8956 PL_efloatsize = need + 20; /* more fudge */
a02a5408 8957 Newx(PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 8958 PL_efloatbuf[0] = '\0';
46fc3d4c 8959 }
8960
4151a5fe
IZ
8961 if ( !(width || left || plus || alt) && fill != '0'
8962 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
8963 /* See earlier comment about buggy Gconvert when digits,
8964 aka precis is 0 */
8965 if ( c == 'g' && precis) {
2e59c212 8966 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4150c189
NC
8967 /* May return an empty string for digits==0 */
8968 if (*PL_efloatbuf) {
8969 elen = strlen(PL_efloatbuf);
4151a5fe 8970 goto float_converted;
4150c189 8971 }
4151a5fe
IZ
8972 } else if ( c == 'f' && !precis) {
8973 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
8974 break;
8975 }
8976 }
4d84ee25
NC
8977 {
8978 char *ptr = ebuf + sizeof ebuf;
8979 *--ptr = '\0';
8980 *--ptr = c;
8981 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9e5b023a 8982#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
4d84ee25
NC
8983 if (intsize == 'q') {
8984 /* Copy the one or more characters in a long double
8985 * format before the 'base' ([efgEFG]) character to
8986 * the format string. */
8987 static char const prifldbl[] = PERL_PRIfldbl;
8988 char const *p = prifldbl + sizeof(prifldbl) - 3;
8989 while (p >= prifldbl) { *--ptr = *p--; }
8990 }
65202027 8991#endif
4d84ee25
NC
8992 if (has_precis) {
8993 base = precis;
8994 do { *--ptr = '0' + (base % 10); } while (base /= 10);
8995 *--ptr = '.';
8996 }
8997 if (width) {
8998 base = width;
8999 do { *--ptr = '0' + (base % 10); } while (base /= 10);
9000 }
9001 if (fill == '0')
9002 *--ptr = fill;
9003 if (left)
9004 *--ptr = '-';
9005 if (plus)
9006 *--ptr = plus;
9007 if (alt)
9008 *--ptr = '#';
9009 *--ptr = '%';
9010
9011 /* No taint. Otherwise we are in the strange situation
9012 * where printf() taints but print($float) doesn't.
9013 * --jhi */
9e5b023a 9014#if defined(HAS_LONG_DOUBLE)
4150c189
NC
9015 elen = ((intsize == 'q')
9016 ? my_sprintf(PL_efloatbuf, ptr, nv)
9017 : my_sprintf(PL_efloatbuf, ptr, (double)nv));
9e5b023a 9018#else
4150c189 9019 elen = my_sprintf(PL_efloatbuf, ptr, nv);
9e5b023a 9020#endif
4d84ee25 9021 }
4151a5fe 9022 float_converted:
80252599 9023 eptr = PL_efloatbuf;
46fc3d4c 9024 break;
9025
fc36a67e 9026 /* SPECIAL */
9027
9028 case 'n':
26372e71
GA
9029 if (vectorize)
9030 goto unknown;
fc36a67e 9031 i = SvCUR(sv) - origlen;
26372e71 9032 if (args) {
c635e13b 9033 switch (intsize) {
9034 case 'h': *(va_arg(*args, short*)) = i; break;
9035 default: *(va_arg(*args, int*)) = i; break;
9036 case 'l': *(va_arg(*args, long*)) = i; break;
9037 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
9038#ifdef HAS_QUAD
9039 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
9040#endif
c635e13b 9041 }
fc36a67e 9042 }
9dd79c3f 9043 else
211dfcf1 9044 sv_setuv_mg(argsv, (UV)i);
fc36a67e 9045 continue; /* not "break" */
9046
9047 /* UNKNOWN */
9048
46fc3d4c 9049 default:
fc36a67e 9050 unknown:
041457d9
DM
9051 if (!args
9052 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
9053 && ckWARN(WARN_PRINTF))
9054 {
c4420975 9055 SV * const msg = sv_newmortal();
35c1215d
NC
9056 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9057 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 9058 if (c) {
0f4b6630 9059 if (isPRINT(c))
1c846c1f 9060 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
9061 "\"%%%c\"", c & 0xFF);
9062 else
9063 Perl_sv_catpvf(aTHX_ msg,
57def98f 9064 "\"%%\\%03"UVof"\"",
0f4b6630 9065 (UV)c & 0xFF);
0f4b6630 9066 } else
396482e1 9067 sv_catpvs(msg, "end of string");
9014280d 9068 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 9069 }
fb73857a 9070
9071 /* output mangled stuff ... */
9072 if (c == '\0')
9073 --q;
46fc3d4c 9074 eptr = p;
9075 elen = q - p;
fb73857a 9076
9077 /* ... right here, because formatting flags should not apply */
9078 SvGROW(sv, SvCUR(sv) + elen + 1);
9079 p = SvEND(sv);
4459522c 9080 Copy(eptr, p, elen, char);
fb73857a 9081 p += elen;
9082 *p = '\0';
3f7c398e 9083 SvCUR_set(sv, p - SvPVX_const(sv));
58e33a90 9084 svix = osvix;
fb73857a 9085 continue; /* not "break" */
46fc3d4c 9086 }
9087
6c94ec8b
HS
9088 /* calculate width before utf8_upgrade changes it */
9089 have = esignlen + zeros + elen;
ed2b91d2
GA
9090 if (have < zeros)
9091 Perl_croak_nocontext(PL_memory_wrap);
6c94ec8b 9092
d2876be5
JH
9093 if (is_utf8 != has_utf8) {
9094 if (is_utf8) {
9095 if (SvCUR(sv))
9096 sv_utf8_upgrade(sv);
9097 }
9098 else {
53c1dcc0 9099 SV * const nsv = sv_2mortal(newSVpvn(eptr, elen));
d2876be5 9100 sv_utf8_upgrade(nsv);
93524f2b 9101 eptr = SvPVX_const(nsv);
d2876be5
JH
9102 elen = SvCUR(nsv);
9103 }
9104 SvGROW(sv, SvCUR(sv) + elen + 1);
9105 p = SvEND(sv);
9106 *p = '\0';
9107 }
6af65485 9108
46fc3d4c 9109 need = (have > width ? have : width);
9110 gap = need - have;
9111
d2641cbd
PC
9112 if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
9113 Perl_croak_nocontext(PL_memory_wrap);
b22c7a20 9114 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 9115 p = SvEND(sv);
9116 if (esignlen && fill == '0') {
53c1dcc0 9117 int i;
eb160463 9118 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9119 *p++ = esignbuf[i];
9120 }
9121 if (gap && !left) {
9122 memset(p, fill, gap);
9123 p += gap;
9124 }
9125 if (esignlen && fill != '0') {
53c1dcc0 9126 int i;
eb160463 9127 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9128 *p++ = esignbuf[i];
9129 }
fc36a67e 9130 if (zeros) {
53c1dcc0 9131 int i;
fc36a67e 9132 for (i = zeros; i; i--)
9133 *p++ = '0';
9134 }
46fc3d4c 9135 if (elen) {
4459522c 9136 Copy(eptr, p, elen, char);
46fc3d4c 9137 p += elen;
9138 }
9139 if (gap && left) {
9140 memset(p, ' ', gap);
9141 p += gap;
9142 }
b22c7a20
GS
9143 if (vectorize) {
9144 if (veclen) {
4459522c 9145 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
9146 p += dotstrlen;
9147 }
9148 else
9149 vectorize = FALSE; /* done iterating over vecstr */
9150 }
2cf2cfc6
A
9151 if (is_utf8)
9152 has_utf8 = TRUE;
9153 if (has_utf8)
7e2040f0 9154 SvUTF8_on(sv);
46fc3d4c 9155 *p = '\0';
3f7c398e 9156 SvCUR_set(sv, p - SvPVX_const(sv));
b22c7a20
GS
9157 if (vectorize) {
9158 esignlen = 0;
9159 goto vector;
9160 }
46fc3d4c 9161 }
9162}
51371543 9163
645c22ef
DM
9164/* =========================================================================
9165
9166=head1 Cloning an interpreter
9167
9168All the macros and functions in this section are for the private use of
9169the main function, perl_clone().
9170
9171The foo_dup() functions make an exact copy of an existing foo thinngy.
9172During the course of a cloning, a hash table is used to map old addresses
9173to new addresses. The table is created and manipulated with the
9174ptr_table_* functions.
9175
9176=cut
9177
9178============================================================================*/
9179
9180
1d7c1841
GS
9181#if defined(USE_ITHREADS)
9182
1d7c1841
GS
9183#ifndef GpREFCNT_inc
9184# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
9185#endif
9186
9187
d2d73c3e 9188#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
7f466ec7 9189#define sv_dup_inc_NN(s,t) SvREFCNT_inc_NN(sv_dup(s,t))
d2d73c3e
AB
9190#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
9191#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9192#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
9193#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9194#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
9195#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9196#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
9197#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
9198#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
9199#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
6136c704
AL
9200#define SAVEPV(p) ((p) ? savepv(p) : NULL)
9201#define SAVEPVN(p,n) ((p) ? savepvn(p,n) : NULL)
8cf8f3d1 9202
d2d73c3e 9203
d2f185dc
AMS
9204/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
9205 regcomp.c. AMS 20010712 */
645c22ef 9206
1d7c1841 9207REGEXP *
53c1dcc0 9208Perl_re_dup(pTHX_ const REGEXP *r, CLONE_PARAMS *param)
1d7c1841 9209{
27da23d5 9210 dVAR;
d2f185dc
AMS
9211 REGEXP *ret;
9212 int i, len, npar;
9213 struct reg_substr_datum *s;
9214
9215 if (!r)
9216 return (REGEXP *)NULL;
9217
9218 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
9219 return ret;
9220
9221 len = r->offsets[0];
9222 npar = r->nparens+1;
9223
a02a5408 9224 Newxc(ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
d2f185dc
AMS
9225 Copy(r->program, ret->program, len+1, regnode);
9226
a02a5408 9227 Newx(ret->startp, npar, I32);
d2f185dc 9228 Copy(r->startp, ret->startp, npar, I32);
a02a5408 9229 Newx(ret->endp, npar, I32);
d2f185dc
AMS
9230 Copy(r->startp, ret->startp, npar, I32);
9231
a02a5408 9232 Newx(ret->substrs, 1, struct reg_substr_data);
d2f185dc
AMS
9233 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
9234 s->min_offset = r->substrs->data[i].min_offset;
9235 s->max_offset = r->substrs->data[i].max_offset;
9236 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 9237 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
9238 }
9239
70612e96 9240 ret->regstclass = NULL;
d2f185dc
AMS
9241 if (r->data) {
9242 struct reg_data *d;
e1ec3a88 9243 const int count = r->data->count;
53c1dcc0 9244 int i;
d2f185dc 9245
a02a5408 9246 Newxc(d, sizeof(struct reg_data) + count*sizeof(void *),
d2f185dc 9247 char, struct reg_data);
a02a5408 9248 Newx(d->what, count, U8);
d2f185dc
AMS
9249
9250 d->count = count;
9251 for (i = 0; i < count; i++) {
9252 d->what[i] = r->data->what[i];
9253 switch (d->what[i]) {
a3621e74
YO
9254 /* legal options are one of: sfpont
9255 see also regcomp.h and pregfree() */
d2f185dc
AMS
9256 case 's':
9257 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
9258 break;
9259 case 'p':
9260 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
9261 break;
9262 case 'f':
9263 /* This is cheating. */
a02a5408 9264 Newx(d->data[i], 1, struct regnode_charclass_class);
d2f185dc
AMS
9265 StructCopy(r->data->data[i], d->data[i],
9266 struct regnode_charclass_class);
70612e96 9267 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
9268 break;
9269 case 'o':
33773810
AMS
9270 /* Compiled op trees are readonly, and can thus be
9271 shared without duplication. */
b34c0dd4 9272 OP_REFCNT_LOCK;
9b978d73 9273 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
b34c0dd4 9274 OP_REFCNT_UNLOCK;
9b978d73 9275 break;
d2f185dc
AMS
9276 case 'n':
9277 d->data[i] = r->data->data[i];
9278 break;
a3621e74
YO
9279 case 't':
9280 d->data[i] = r->data->data[i];
9281 OP_REFCNT_LOCK;
9282 ((reg_trie_data*)d->data[i])->refcount++;
9283 OP_REFCNT_UNLOCK;
9284 break;
9285 default:
9286 Perl_croak(aTHX_ "panic: re_dup unknown data code '%c'", r->data->what[i]);
d2f185dc
AMS
9287 }
9288 }
9289
9290 ret->data = d;
9291 }
9292 else
9293 ret->data = NULL;
9294
a02a5408 9295 Newx(ret->offsets, 2*len+1, U32);
d2f185dc
AMS
9296 Copy(r->offsets, ret->offsets, 2*len+1, U32);
9297
e01c5899 9298 ret->precomp = SAVEPVN(r->precomp, r->prelen);
d2f185dc
AMS
9299 ret->refcnt = r->refcnt;
9300 ret->minlen = r->minlen;
9301 ret->prelen = r->prelen;
9302 ret->nparens = r->nparens;
9303 ret->lastparen = r->lastparen;
9304 ret->lastcloseparen = r->lastcloseparen;
9305 ret->reganch = r->reganch;
9306
70612e96
RG
9307 ret->sublen = r->sublen;
9308
9309 if (RX_MATCH_COPIED(ret))
e01c5899 9310 ret->subbeg = SAVEPVN(r->subbeg, r->sublen);
70612e96 9311 else
bd61b366 9312 ret->subbeg = NULL;
f8c7b90f 9313#ifdef PERL_OLD_COPY_ON_WRITE
a0714e2c 9314 ret->saved_copy = NULL;
9a26048b 9315#endif
70612e96 9316
d2f185dc
AMS
9317 ptr_table_store(PL_ptr_table, r, ret);
9318 return ret;
1d7c1841
GS
9319}
9320
d2d73c3e 9321/* duplicate a file handle */
645c22ef 9322
1d7c1841 9323PerlIO *
a8fc9800 9324Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
9325{
9326 PerlIO *ret;
53c1dcc0
AL
9327
9328 PERL_UNUSED_ARG(type);
73d840c0 9329
1d7c1841
GS
9330 if (!fp)
9331 return (PerlIO*)NULL;
9332
9333 /* look for it in the table first */
9334 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
9335 if (ret)
9336 return ret;
9337
9338 /* create anew and remember what it is */
ecdeb87c 9339 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
9340 ptr_table_store(PL_ptr_table, fp, ret);
9341 return ret;
9342}
9343
645c22ef
DM
9344/* duplicate a directory handle */
9345
1d7c1841
GS
9346DIR *
9347Perl_dirp_dup(pTHX_ DIR *dp)
9348{
96a5add6 9349 PERL_UNUSED_CONTEXT;
1d7c1841
GS
9350 if (!dp)
9351 return (DIR*)NULL;
9352 /* XXX TODO */
9353 return dp;
9354}
9355
ff276b08 9356/* duplicate a typeglob */
645c22ef 9357
1d7c1841 9358GP *
a8fc9800 9359Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
9360{
9361 GP *ret;
b37c2d43 9362
1d7c1841
GS
9363 if (!gp)
9364 return (GP*)NULL;
9365 /* look for it in the table first */
9366 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
9367 if (ret)
9368 return ret;
9369
9370 /* create anew and remember what it is */
a02a5408 9371 Newxz(ret, 1, GP);
1d7c1841
GS
9372 ptr_table_store(PL_ptr_table, gp, ret);
9373
9374 /* clone */
9375 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
9376 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
9377 ret->gp_io = io_dup_inc(gp->gp_io, param);
9378 ret->gp_form = cv_dup_inc(gp->gp_form, param);
9379 ret->gp_av = av_dup_inc(gp->gp_av, param);
9380 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
9381 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
9382 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841 9383 ret->gp_cvgen = gp->gp_cvgen;
1d7c1841
GS
9384 ret->gp_line = gp->gp_line;
9385 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
9386 return ret;
9387}
9388
645c22ef
DM
9389/* duplicate a chain of magic */
9390
1d7c1841 9391MAGIC *
a8fc9800 9392Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 9393{
cb359b41
JH
9394 MAGIC *mgprev = (MAGIC*)NULL;
9395 MAGIC *mgret;
1d7c1841
GS
9396 if (!mg)
9397 return (MAGIC*)NULL;
9398 /* look for it in the table first */
9399 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
9400 if (mgret)
9401 return mgret;
9402
9403 for (; mg; mg = mg->mg_moremagic) {
9404 MAGIC *nmg;
a02a5408 9405 Newxz(nmg, 1, MAGIC);
cb359b41 9406 if (mgprev)
1d7c1841 9407 mgprev->mg_moremagic = nmg;
cb359b41
JH
9408 else
9409 mgret = nmg;
1d7c1841
GS
9410 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
9411 nmg->mg_private = mg->mg_private;
9412 nmg->mg_type = mg->mg_type;
9413 nmg->mg_flags = mg->mg_flags;
14befaf4 9414 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 9415 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 9416 }
05bd4103 9417 else if(mg->mg_type == PERL_MAGIC_backref) {
d7cbc7b5
NC
9418 /* The backref AV has its reference count deliberately bumped by
9419 1. */
9420 nmg->mg_obj = SvREFCNT_inc(av_dup_inc((AV*) mg->mg_obj, param));
05bd4103 9421 }
8d2f4536
NC
9422 else if (mg->mg_type == PERL_MAGIC_symtab) {
9423 nmg->mg_obj = mg->mg_obj;
9424 }
1d7c1841
GS
9425 else {
9426 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
9427 ? sv_dup_inc(mg->mg_obj, param)
9428 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
9429 }
9430 nmg->mg_len = mg->mg_len;
9431 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 9432 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 9433 if (mg->mg_len > 0) {
1d7c1841 9434 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
9435 if (mg->mg_type == PERL_MAGIC_overload_table &&
9436 AMT_AMAGIC((AMT*)mg->mg_ptr))
9437 {
c445ea15 9438 const AMT * const amtp = (AMT*)mg->mg_ptr;
0bcc34c2 9439 AMT * const namtp = (AMT*)nmg->mg_ptr;
1d7c1841
GS
9440 I32 i;
9441 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 9442 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
9443 }
9444 }
9445 }
9446 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 9447 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 9448 }
68795e93
NIS
9449 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
9450 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
9451 }
1d7c1841
GS
9452 mgprev = nmg;
9453 }
9454 return mgret;
9455}
9456
645c22ef
DM
9457/* create a new pointer-mapping table */
9458
1d7c1841
GS
9459PTR_TBL_t *
9460Perl_ptr_table_new(pTHX)
9461{
9462 PTR_TBL_t *tbl;
96a5add6
AL
9463 PERL_UNUSED_CONTEXT;
9464
a02a5408 9465 Newxz(tbl, 1, PTR_TBL_t);
1d7c1841
GS
9466 tbl->tbl_max = 511;
9467 tbl->tbl_items = 0;
a02a5408 9468 Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
1d7c1841
GS
9469 return tbl;
9470}
9471
7119fd33
NC
9472#define PTR_TABLE_HASH(ptr) \
9473 ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
134ca3d6 9474
93e68bfb
JC
9475/*
9476 we use the PTE_SVSLOT 'reservation' made above, both here (in the
9477 following define) and at call to new_body_inline made below in
9478 Perl_ptr_table_store()
9479 */
9480
9481#define del_pte(p) del_body_type(p, PTE_SVSLOT)
32e691d0 9482
645c22ef
DM
9483/* map an existing pointer using a table */
9484
7bf61b54 9485STATIC PTR_TBL_ENT_t *
b0e6ae5b 9486S_ptr_table_find(PTR_TBL_t *tbl, const void *sv) {
1d7c1841 9487 PTR_TBL_ENT_t *tblent;
4373e329 9488 const UV hash = PTR_TABLE_HASH(sv);
1d7c1841
GS
9489 assert(tbl);
9490 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
9491 for (; tblent; tblent = tblent->next) {
9492 if (tblent->oldval == sv)
7bf61b54 9493 return tblent;
1d7c1841 9494 }
7bf61b54
NC
9495 return 0;
9496}
9497
9498void *
9499Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, const void *sv)
9500{
b0e6ae5b 9501 PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
96a5add6 9502 PERL_UNUSED_CONTEXT;
7bf61b54 9503 return tblent ? tblent->newval : (void *) 0;
1d7c1841
GS
9504}
9505
645c22ef
DM
9506/* add a new entry to a pointer-mapping table */
9507
1d7c1841 9508void
44f8325f 9509Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, const void *oldsv, void *newsv)
1d7c1841 9510{
0c9fdfe0 9511 PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
96a5add6 9512 PERL_UNUSED_CONTEXT;
1d7c1841 9513
7bf61b54
NC
9514 if (tblent) {
9515 tblent->newval = newsv;
9516 } else {
9517 const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
9518
d2a0f284
JC
9519 new_body_inline(tblent, PTE_SVSLOT);
9520
7bf61b54
NC
9521 tblent->oldval = oldsv;
9522 tblent->newval = newsv;
9523 tblent->next = tbl->tbl_ary[entry];
9524 tbl->tbl_ary[entry] = tblent;
9525 tbl->tbl_items++;
9526 if (tblent->next && tbl->tbl_items > tbl->tbl_max)
9527 ptr_table_split(tbl);
1d7c1841 9528 }
1d7c1841
GS
9529}
9530
645c22ef
DM
9531/* double the hash bucket size of an existing ptr table */
9532
1d7c1841
GS
9533void
9534Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
9535{
9536 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
4373e329 9537 const UV oldsize = tbl->tbl_max + 1;
1d7c1841
GS
9538 UV newsize = oldsize * 2;
9539 UV i;
96a5add6 9540 PERL_UNUSED_CONTEXT;
1d7c1841
GS
9541
9542 Renew(ary, newsize, PTR_TBL_ENT_t*);
9543 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
9544 tbl->tbl_max = --newsize;
9545 tbl->tbl_ary = ary;
9546 for (i=0; i < oldsize; i++, ary++) {
9547 PTR_TBL_ENT_t **curentp, **entp, *ent;
9548 if (!*ary)
9549 continue;
9550 curentp = ary + oldsize;
9551 for (entp = ary, ent = *ary; ent; ent = *entp) {
134ca3d6 9552 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
9553 *entp = ent->next;
9554 ent->next = *curentp;
9555 *curentp = ent;
9556 continue;
9557 }
9558 else
9559 entp = &ent->next;
9560 }
9561 }
9562}
9563
645c22ef
DM
9564/* remove all the entries from a ptr table */
9565
a0739874
DM
9566void
9567Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
9568{
d5cefff9 9569 if (tbl && tbl->tbl_items) {
c445ea15 9570 register PTR_TBL_ENT_t * const * const array = tbl->tbl_ary;
d5cefff9 9571 UV riter = tbl->tbl_max;
a0739874 9572
d5cefff9
NC
9573 do {
9574 PTR_TBL_ENT_t *entry = array[riter];
ab1e7f95 9575
d5cefff9 9576 while (entry) {
00b6aa41 9577 PTR_TBL_ENT_t * const oentry = entry;
d5cefff9
NC
9578 entry = entry->next;
9579 del_pte(oentry);
9580 }
9581 } while (riter--);
a0739874 9582
d5cefff9
NC
9583 tbl->tbl_items = 0;
9584 }
a0739874
DM
9585}
9586
645c22ef
DM
9587/* clear and free a ptr table */
9588
a0739874
DM
9589void
9590Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
9591{
9592 if (!tbl) {
9593 return;
9594 }
9595 ptr_table_clear(tbl);
9596 Safefree(tbl->tbl_ary);
9597 Safefree(tbl);
9598}
9599
5bd07a3d 9600
83841fad 9601void
eb86f8b3 9602Perl_rvpv_dup(pTHX_ SV *dstr, const SV *sstr, CLONE_PARAMS* param)
83841fad
NIS
9603{
9604 if (SvROK(sstr)) {
b162af07
SP
9605 SvRV_set(dstr, SvWEAKREF(sstr)
9606 ? sv_dup(SvRV(sstr), param)
9607 : sv_dup_inc(SvRV(sstr), param));
f880fe2f 9608
83841fad 9609 }
3f7c398e 9610 else if (SvPVX_const(sstr)) {
83841fad
NIS
9611 /* Has something there */
9612 if (SvLEN(sstr)) {
68795e93 9613 /* Normal PV - clone whole allocated space */
3f7c398e 9614 SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
d3d0e6f1
NC
9615 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
9616 /* Not that normal - actually sstr is copy on write.
9617 But we are a true, independant SV, so: */
9618 SvREADONLY_off(dstr);
9619 SvFAKE_off(dstr);
9620 }
68795e93 9621 }
83841fad
NIS
9622 else {
9623 /* Special case - not normally malloced for some reason */
f7877b28
NC
9624 if (isGV_with_GP(sstr)) {
9625 /* Don't need to do anything here. */
9626 }
9627 else if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
ef10be65
NC
9628 /* A "shared" PV - clone it as "shared" PV */
9629 SvPV_set(dstr,
9630 HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
9631 param)));
83841fad
NIS
9632 }
9633 else {
9634 /* Some other special case - random pointer */
f880fe2f 9635 SvPV_set(dstr, SvPVX(sstr));
d3d0e6f1 9636 }
83841fad
NIS
9637 }
9638 }
9639 else {
4608196e 9640 /* Copy the NULL */
f880fe2f 9641 if (SvTYPE(dstr) == SVt_RV)
b162af07 9642 SvRV_set(dstr, NULL);
f880fe2f 9643 else
6136c704 9644 SvPV_set(dstr, NULL);
83841fad
NIS
9645 }
9646}
9647
662fb8b2
NC
9648/* duplicate an SV of any type (including AV, HV etc) */
9649
1d7c1841 9650SV *
eb86f8b3 9651Perl_sv_dup(pTHX_ const SV *sstr, CLONE_PARAMS* param)
1d7c1841 9652{
27da23d5 9653 dVAR;
1d7c1841
GS
9654 SV *dstr;
9655
9656 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
6136c704 9657 return NULL;
1d7c1841
GS
9658 /* look for it in the table first */
9659 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
9660 if (dstr)
9661 return dstr;
9662
0405e91e
AB
9663 if(param->flags & CLONEf_JOIN_IN) {
9664 /** We are joining here so we don't want do clone
9665 something that is bad **/
eb86f8b3
AL
9666 if (SvTYPE(sstr) == SVt_PVHV) {
9667 const char * const hvname = HvNAME_get(sstr);
9668 if (hvname)
9669 /** don't clone stashes if they already exist **/
9670 return (SV*)gv_stashpv(hvname,0);
0405e91e
AB
9671 }
9672 }
9673
1d7c1841
GS
9674 /* create anew and remember what it is */
9675 new_SV(dstr);
fd0854ff
DM
9676
9677#ifdef DEBUG_LEAKING_SCALARS
9678 dstr->sv_debug_optype = sstr->sv_debug_optype;
9679 dstr->sv_debug_line = sstr->sv_debug_line;
9680 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
9681 dstr->sv_debug_cloned = 1;
fd0854ff 9682 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
fd0854ff
DM
9683#endif
9684
1d7c1841
GS
9685 ptr_table_store(PL_ptr_table, sstr, dstr);
9686
9687 /* clone */
9688 SvFLAGS(dstr) = SvFLAGS(sstr);
9689 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
9690 SvREFCNT(dstr) = 0; /* must be before any other dups! */
9691
9692#ifdef DEBUGGING
3f7c398e 9693 if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
1d7c1841 9694 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
3f7c398e 9695 PL_watch_pvx, SvPVX_const(sstr));
1d7c1841
GS
9696#endif
9697
9660f481
DM
9698 /* don't clone objects whose class has asked us not to */
9699 if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
9700 SvFLAGS(dstr) &= ~SVTYPEMASK;
9701 SvOBJECT_off(dstr);
9702 return dstr;
9703 }
9704
1d7c1841
GS
9705 switch (SvTYPE(sstr)) {
9706 case SVt_NULL:
9707 SvANY(dstr) = NULL;
9708 break;
9709 case SVt_IV:
339049b0 9710 SvANY(dstr) = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
45977657 9711 SvIV_set(dstr, SvIVX(sstr));
1d7c1841
GS
9712 break;
9713 case SVt_NV:
9714 SvANY(dstr) = new_XNV();
9d6ce603 9715 SvNV_set(dstr, SvNVX(sstr));
1d7c1841
GS
9716 break;
9717 case SVt_RV:
339049b0 9718 SvANY(dstr) = &(dstr->sv_u.svu_rv);
83841fad 9719 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841 9720 break;
662fb8b2
NC
9721 default:
9722 {
9723 /* These are all the types that need complex bodies allocating. */
662fb8b2 9724 void *new_body;
2bcc16b3
NC
9725 const svtype sv_type = SvTYPE(sstr);
9726 const struct body_details *const sv_type_details
9727 = bodies_by_type + sv_type;
662fb8b2 9728
93e68bfb 9729 switch (sv_type) {
662fb8b2 9730 default:
bb263b4e 9731 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
662fb8b2
NC
9732 break;
9733
662fb8b2
NC
9734 case SVt_PVGV:
9735 if (GvUNIQUE((GV*)sstr)) {
bb263b4e 9736 /*EMPTY*/; /* Do sharing here, and fall through */
662fb8b2 9737 }
c22188b4
NC
9738 case SVt_PVIO:
9739 case SVt_PVFM:
9740 case SVt_PVHV:
9741 case SVt_PVAV:
93e68bfb 9742 case SVt_PVBM:
662fb8b2 9743 case SVt_PVCV:
662fb8b2 9744 case SVt_PVLV:
662fb8b2 9745 case SVt_PVMG:
662fb8b2 9746 case SVt_PVNV:
662fb8b2 9747 case SVt_PVIV:
662fb8b2 9748 case SVt_PV:
d2a0f284 9749 assert(sv_type_details->body_size);
c22188b4 9750 if (sv_type_details->arena) {
d2a0f284 9751 new_body_inline(new_body, sv_type);
c22188b4 9752 new_body
b9502f15 9753 = (void*)((char*)new_body - sv_type_details->offset);
c22188b4
NC
9754 } else {
9755 new_body = new_NOARENA(sv_type_details);
9756 }
1d7c1841 9757 }
662fb8b2
NC
9758 assert(new_body);
9759 SvANY(dstr) = new_body;
9760
2bcc16b3 9761#ifndef PURIFY
b9502f15
NC
9762 Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
9763 ((char*)SvANY(dstr)) + sv_type_details->offset,
f32993d6 9764 sv_type_details->copy, char);
2bcc16b3
NC
9765#else
9766 Copy(((char*)SvANY(sstr)),
9767 ((char*)SvANY(dstr)),
d2a0f284 9768 sv_type_details->body_size + sv_type_details->offset, char);
2bcc16b3 9769#endif
662fb8b2 9770
f7877b28
NC
9771 if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
9772 && !isGV_with_GP(dstr))
662fb8b2
NC
9773 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9774
9775 /* The Copy above means that all the source (unduplicated) pointers
9776 are now in the destination. We can check the flags and the
9777 pointers in either, but it's possible that there's less cache
9778 missing by always going for the destination.
9779 FIXME - instrument and check that assumption */
f32993d6 9780 if (sv_type >= SVt_PVMG) {
e736a858 9781 HV *ourstash;
2892acdb 9782 if ((sv_type == SVt_PVMG) && (ourstash = OURSTASH(dstr))) {
e736a858
NC
9783 OURSTASH_set(dstr, hv_dup_inc(ourstash, param));
9784 } else if (SvMAGIC(dstr))
662fb8b2
NC
9785 SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
9786 if (SvSTASH(dstr))
9787 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
1d7c1841 9788 }
662fb8b2 9789
f32993d6
NC
9790 /* The cast silences a GCC warning about unhandled types. */
9791 switch ((int)sv_type) {
662fb8b2
NC
9792 case SVt_PV:
9793 break;
9794 case SVt_PVIV:
9795 break;
9796 case SVt_PVNV:
9797 break;
9798 case SVt_PVMG:
9799 break;
9800 case SVt_PVBM:
9801 break;
9802 case SVt_PVLV:
9803 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
9804 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
9805 LvTARG(dstr) = dstr;
9806 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
9807 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(dstr), 0, param);
9808 else
9809 LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
9810 break;
9811 case SVt_PVGV:
acda4c6a
NC
9812 if (GvNAME_HEK(dstr))
9813 GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
f5c1e807 9814
e15faf7d
NC
9815 /* Don't call sv_add_backref here as it's going to be created
9816 as part of the magic cloning of the symbol table. */
f7877b28
NC
9817 GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
9818 if(isGV_with_GP(sstr)) {
9819 /* Danger Will Robinson - GvGP(dstr) isn't initialised
9820 at the point of this comment. */
9821 GvGP(dstr) = gp_dup(GvGP(sstr), param);
9822 (void)GpREFCNT_inc(GvGP(dstr));
9823 } else
9824 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
662fb8b2
NC
9825 break;
9826 case SVt_PVIO:
9827 IoIFP(dstr) = fp_dup(IoIFP(dstr), IoTYPE(dstr), param);
9828 if (IoOFP(dstr) == IoIFP(sstr))
9829 IoOFP(dstr) = IoIFP(dstr);
9830 else
9831 IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
9832 /* PL_rsfp_filters entries have fake IoDIRP() */
662fb8b2
NC
9833 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
9834 /* I have no idea why fake dirp (rsfps)
9835 should be treated differently but otherwise
9836 we end up with leaks -- sky*/
9837 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(dstr), param);
9838 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(dstr), param);
9839 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(dstr), param);
9840 } else {
9841 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(dstr), param);
9842 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(dstr), param);
9843 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(dstr), param);
100ce7e1
NC
9844 if (IoDIRP(dstr)) {
9845 IoDIRP(dstr) = dirp_dup(IoDIRP(dstr));
9846 } else {
bb263b4e 9847 /*EMPTY*/;
100ce7e1
NC
9848 /* IoDIRP(dstr) is already a copy of IoDIRP(sstr) */
9849 }
662fb8b2
NC
9850 }
9851 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(dstr));
9852 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(dstr));
9853 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(dstr));
9854 break;
9855 case SVt_PVAV:
9856 if (AvARRAY((AV*)sstr)) {
9857 SV **dst_ary, **src_ary;
9858 SSize_t items = AvFILLp((AV*)sstr) + 1;
9859
9860 src_ary = AvARRAY((AV*)sstr);
a02a5408 9861 Newxz(dst_ary, AvMAX((AV*)sstr)+1, SV*);
662fb8b2
NC
9862 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
9863 SvPV_set(dstr, (char*)dst_ary);
9864 AvALLOC((AV*)dstr) = dst_ary;
9865 if (AvREAL((AV*)sstr)) {
9866 while (items-- > 0)
9867 *dst_ary++ = sv_dup_inc(*src_ary++, param);
9868 }
9869 else {
9870 while (items-- > 0)
9871 *dst_ary++ = sv_dup(*src_ary++, param);
9872 }
9873 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
9874 while (items-- > 0) {
9875 *dst_ary++ = &PL_sv_undef;
9876 }
bfcb3514 9877 }
662fb8b2 9878 else {
bd61b366 9879 SvPV_set(dstr, NULL);
662fb8b2 9880 AvALLOC((AV*)dstr) = (SV**)NULL;
b79f7545 9881 }
662fb8b2
NC
9882 break;
9883 case SVt_PVHV:
9884 {
cbbf8932 9885 HEK *hvname = NULL;
662fb8b2
NC
9886
9887 if (HvARRAY((HV*)sstr)) {
9888 STRLEN i = 0;
9889 const bool sharekeys = !!HvSHAREKEYS(sstr);
9890 XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
9891 XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
9892 char *darray;
a02a5408 9893 Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
662fb8b2
NC
9894 + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
9895 char);
9896 HvARRAY(dstr) = (HE**)darray;
9897 while (i <= sxhv->xhv_max) {
5c4138a0 9898 const HE *source = HvARRAY(sstr)[i];
662fb8b2
NC
9899 HvARRAY(dstr)[i] = source
9900 ? he_dup(source, sharekeys, param) : 0;
9901 ++i;
9902 }
9903 if (SvOOK(sstr)) {
00b6aa41
AL
9904 struct xpvhv_aux * const saux = HvAUX(sstr);
9905 struct xpvhv_aux * const daux = HvAUX(dstr);
662fb8b2
NC
9906 /* This flag isn't copied. */
9907 /* SvOOK_on(hv) attacks the IV flags. */
9908 SvFLAGS(dstr) |= SVf_OOK;
9909
9910 hvname = saux->xhv_name;
dd690478
NC
9911 daux->xhv_name
9912 = hvname ? hek_dup(hvname, param) : hvname;
662fb8b2
NC
9913
9914 daux->xhv_riter = saux->xhv_riter;
9915 daux->xhv_eiter = saux->xhv_eiter
dd690478
NC
9916 ? he_dup(saux->xhv_eiter,
9917 (bool)!!HvSHAREKEYS(sstr), param) : 0;
86f55936
NC
9918 daux->xhv_backreferences = saux->xhv_backreferences
9919 ? (AV*) SvREFCNT_inc(
9920 sv_dup((SV*)saux->
9921 xhv_backreferences,
9922 param))
9923 : 0;
662fb8b2
NC
9924 }
9925 }
9926 else {
bd61b366 9927 SvPV_set(dstr, NULL);
662fb8b2
NC
9928 }
9929 /* Record stashes for possible cloning in Perl_clone(). */
9930 if(hvname)
9931 av_push(param->stashes, dstr);
9932 }
9933 break;
662fb8b2 9934 case SVt_PVCV:
bb172083
NC
9935 if (!(param->flags & CLONEf_COPY_STACKS)) {
9936 CvDEPTH(dstr) = 0;
9937 }
9938 case SVt_PVFM:
662fb8b2
NC
9939 /* NOTE: not refcounted */
9940 CvSTASH(dstr) = hv_dup(CvSTASH(dstr), param);
9941 OP_REFCNT_LOCK;
d04ba589
NC
9942 if (!CvISXSUB(dstr))
9943 CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
662fb8b2 9944 OP_REFCNT_UNLOCK;
cfae286e 9945 if (CvCONST(dstr) && CvISXSUB(dstr)) {
662fb8b2
NC
9946 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(dstr)) ?
9947 SvREFCNT_inc(CvXSUBANY(dstr).any_ptr) :
9948 sv_dup_inc((SV *)CvXSUBANY(dstr).any_ptr, param);
9949 }
9950 /* don't dup if copying back - CvGV isn't refcounted, so the
9951 * duped GV may never be freed. A bit of a hack! DAPM */
9952 CvGV(dstr) = (param->flags & CLONEf_JOIN_IN) ?
a0714e2c 9953 NULL : gv_dup(CvGV(dstr), param) ;
662fb8b2
NC
9954 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
9955 CvOUTSIDE(dstr) =
9956 CvWEAKOUTSIDE(sstr)
9957 ? cv_dup( CvOUTSIDE(dstr), param)
9958 : cv_dup_inc(CvOUTSIDE(dstr), param);
aed2304a 9959 if (!CvISXSUB(dstr))
662fb8b2
NC
9960 CvFILE(dstr) = SAVEPV(CvFILE(dstr));
9961 break;
bfcb3514 9962 }
1d7c1841 9963 }
1d7c1841
GS
9964 }
9965
9966 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
9967 ++PL_sv_objcount;
9968
9969 return dstr;
d2d73c3e 9970 }
1d7c1841 9971
645c22ef
DM
9972/* duplicate a context */
9973
1d7c1841 9974PERL_CONTEXT *
a8fc9800 9975Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
9976{
9977 PERL_CONTEXT *ncxs;
9978
9979 if (!cxs)
9980 return (PERL_CONTEXT*)NULL;
9981
9982 /* look for it in the table first */
9983 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
9984 if (ncxs)
9985 return ncxs;
9986
9987 /* create anew and remember what it is */
a02a5408 9988 Newxz(ncxs, max + 1, PERL_CONTEXT);
1d7c1841
GS
9989 ptr_table_store(PL_ptr_table, cxs, ncxs);
9990
9991 while (ix >= 0) {
c445ea15
AL
9992 PERL_CONTEXT * const cx = &cxs[ix];
9993 PERL_CONTEXT * const ncx = &ncxs[ix];
1d7c1841
GS
9994 ncx->cx_type = cx->cx_type;
9995 if (CxTYPE(cx) == CXt_SUBST) {
9996 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
9997 }
9998 else {
9999 ncx->blk_oldsp = cx->blk_oldsp;
10000 ncx->blk_oldcop = cx->blk_oldcop;
1d7c1841
GS
10001 ncx->blk_oldmarksp = cx->blk_oldmarksp;
10002 ncx->blk_oldscopesp = cx->blk_oldscopesp;
10003 ncx->blk_oldpm = cx->blk_oldpm;
10004 ncx->blk_gimme = cx->blk_gimme;
10005 switch (CxTYPE(cx)) {
10006 case CXt_SUB:
10007 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
10008 ? cv_dup_inc(cx->blk_sub.cv, param)
10009 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 10010 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 10011 ? av_dup_inc(cx->blk_sub.argarray, param)
7d49f689 10012 : NULL);
d2d73c3e 10013 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
10014 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
10015 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10016 ncx->blk_sub.lval = cx->blk_sub.lval;
f39bc417 10017 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
10018 break;
10019 case CXt_EVAL:
10020 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
10021 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 10022 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 10023 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 10024 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
f39bc417 10025 ncx->blk_eval.retop = cx->blk_eval.retop;
1d7c1841
GS
10026 break;
10027 case CXt_LOOP:
10028 ncx->blk_loop.label = cx->blk_loop.label;
10029 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
10030 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
10031 ncx->blk_loop.next_op = cx->blk_loop.next_op;
10032 ncx->blk_loop.last_op = cx->blk_loop.last_op;
10033 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
10034 ? cx->blk_loop.iterdata
d2d73c3e 10035 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
10036 ncx->blk_loop.oldcomppad
10037 = (PAD*)ptr_table_fetch(PL_ptr_table,
10038 cx->blk_loop.oldcomppad);
d2d73c3e
AB
10039 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
10040 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
10041 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
10042 ncx->blk_loop.iterix = cx->blk_loop.iterix;
10043 ncx->blk_loop.itermax = cx->blk_loop.itermax;
10044 break;
10045 case CXt_FORMAT:
d2d73c3e
AB
10046 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
10047 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
10048 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841 10049 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
f39bc417 10050 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
10051 break;
10052 case CXt_BLOCK:
10053 case CXt_NULL:
10054 break;
10055 }
10056 }
10057 --ix;
10058 }
10059 return ncxs;
10060}
10061
645c22ef
DM
10062/* duplicate a stack info structure */
10063
1d7c1841 10064PERL_SI *
a8fc9800 10065Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
10066{
10067 PERL_SI *nsi;
10068
10069 if (!si)
10070 return (PERL_SI*)NULL;
10071
10072 /* look for it in the table first */
10073 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
10074 if (nsi)
10075 return nsi;
10076
10077 /* create anew and remember what it is */
a02a5408 10078 Newxz(nsi, 1, PERL_SI);
1d7c1841
GS
10079 ptr_table_store(PL_ptr_table, si, nsi);
10080
d2d73c3e 10081 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
10082 nsi->si_cxix = si->si_cxix;
10083 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 10084 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 10085 nsi->si_type = si->si_type;
d2d73c3e
AB
10086 nsi->si_prev = si_dup(si->si_prev, param);
10087 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
10088 nsi->si_markoff = si->si_markoff;
10089
10090 return nsi;
10091}
10092
10093#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
10094#define TOPINT(ss,ix) ((ss)[ix].any_i32)
10095#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
10096#define TOPLONG(ss,ix) ((ss)[ix].any_long)
10097#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
10098#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
10099#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
10100#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
10101#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
10102#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
10103#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
10104#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
10105#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
10106#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
10107
10108/* XXXXX todo */
10109#define pv_dup_inc(p) SAVEPV(p)
10110#define pv_dup(p) SAVEPV(p)
10111#define svp_dup_inc(p,pp) any_dup(p,pp)
10112
645c22ef
DM
10113/* map any object to the new equivent - either something in the
10114 * ptr table, or something in the interpreter structure
10115 */
10116
1d7c1841 10117void *
53c1dcc0 10118Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
1d7c1841
GS
10119{
10120 void *ret;
10121
10122 if (!v)
10123 return (void*)NULL;
10124
10125 /* look for it in the table first */
10126 ret = ptr_table_fetch(PL_ptr_table, v);
10127 if (ret)
10128 return ret;
10129
10130 /* see if it is part of the interpreter structure */
10131 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 10132 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 10133 else {
1d7c1841 10134 ret = v;
05ec9bb3 10135 }
1d7c1841
GS
10136
10137 return ret;
10138}
10139
645c22ef
DM
10140/* duplicate the save stack */
10141
1d7c1841 10142ANY *
a8fc9800 10143Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841 10144{
53c1dcc0
AL
10145 ANY * const ss = proto_perl->Tsavestack;
10146 const I32 max = proto_perl->Tsavestack_max;
10147 I32 ix = proto_perl->Tsavestack_ix;
1d7c1841
GS
10148 ANY *nss;
10149 SV *sv;
10150 GV *gv;
10151 AV *av;
10152 HV *hv;
10153 void* ptr;
10154 int intval;
10155 long longval;
10156 GP *gp;
10157 IV iv;
c4e33207 10158 char *c = NULL;
1d7c1841 10159 void (*dptr) (void*);
acfe0abc 10160 void (*dxptr) (pTHX_ void*);
1d7c1841 10161
a02a5408 10162 Newxz(nss, max, ANY);
1d7c1841
GS
10163
10164 while (ix > 0) {
b464bac0 10165 I32 i = POPINT(ss,ix);
1d7c1841
GS
10166 TOPINT(nss,ix) = i;
10167 switch (i) {
10168 case SAVEt_ITEM: /* normal string */
10169 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10170 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10171 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10172 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10173 break;
10174 case SAVEt_SV: /* scalar reference */
10175 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10176 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10177 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10178 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 10179 break;
f4dd75d9
GS
10180 case SAVEt_GENERIC_PVREF: /* generic char* */
10181 c = (char*)POPPTR(ss,ix);
10182 TOPPTR(nss,ix) = pv_dup(c);
10183 ptr = POPPTR(ss,ix);
10184 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10185 break;
05ec9bb3
NIS
10186 case SAVEt_SHARED_PVREF: /* char* in shared space */
10187 c = (char*)POPPTR(ss,ix);
10188 TOPPTR(nss,ix) = savesharedpv(c);
10189 ptr = POPPTR(ss,ix);
10190 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10191 break;
1d7c1841
GS
10192 case SAVEt_GENERIC_SVREF: /* generic sv */
10193 case SAVEt_SVREF: /* scalar reference */
10194 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10195 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10196 ptr = POPPTR(ss,ix);
10197 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
10198 break;
10199 case SAVEt_AV: /* array reference */
10200 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10201 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 10202 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10203 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10204 break;
10205 case SAVEt_HV: /* hash reference */
10206 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10207 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 10208 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10209 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10210 break;
10211 case SAVEt_INT: /* int reference */
10212 ptr = POPPTR(ss,ix);
10213 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10214 intval = (int)POPINT(ss,ix);
10215 TOPINT(nss,ix) = intval;
10216 break;
10217 case SAVEt_LONG: /* long reference */
10218 ptr = POPPTR(ss,ix);
10219 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10220 longval = (long)POPLONG(ss,ix);
10221 TOPLONG(nss,ix) = longval;
10222 break;
10223 case SAVEt_I32: /* I32 reference */
10224 case SAVEt_I16: /* I16 reference */
10225 case SAVEt_I8: /* I8 reference */
10226 ptr = POPPTR(ss,ix);
10227 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10228 i = POPINT(ss,ix);
10229 TOPINT(nss,ix) = i;
10230 break;
10231 case SAVEt_IV: /* IV reference */
10232 ptr = POPPTR(ss,ix);
10233 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10234 iv = POPIV(ss,ix);
10235 TOPIV(nss,ix) = iv;
10236 break;
10237 case SAVEt_SPTR: /* SV* reference */
10238 ptr = POPPTR(ss,ix);
10239 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10240 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10241 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
10242 break;
10243 case SAVEt_VPTR: /* random* reference */
10244 ptr = POPPTR(ss,ix);
10245 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10246 ptr = POPPTR(ss,ix);
10247 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10248 break;
10249 case SAVEt_PPTR: /* char* reference */
10250 ptr = POPPTR(ss,ix);
10251 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10252 c = (char*)POPPTR(ss,ix);
10253 TOPPTR(nss,ix) = pv_dup(c);
10254 break;
10255 case SAVEt_HPTR: /* HV* reference */
10256 ptr = POPPTR(ss,ix);
10257 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10258 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10259 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
10260 break;
10261 case SAVEt_APTR: /* AV* reference */
10262 ptr = POPPTR(ss,ix);
10263 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10264 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10265 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
10266 break;
10267 case SAVEt_NSTAB:
10268 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10269 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10270 break;
10271 case SAVEt_GP: /* scalar reference */
10272 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 10273 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
10274 (void)GpREFCNT_inc(gp);
10275 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 10276 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
10277 c = (char*)POPPTR(ss,ix);
10278 TOPPTR(nss,ix) = pv_dup(c);
10279 iv = POPIV(ss,ix);
10280 TOPIV(nss,ix) = iv;
10281 iv = POPIV(ss,ix);
10282 TOPIV(nss,ix) = iv;
10283 break;
10284 case SAVEt_FREESV:
26d9b02f 10285 case SAVEt_MORTALIZESV:
1d7c1841 10286 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10287 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10288 break;
10289 case SAVEt_FREEOP:
10290 ptr = POPPTR(ss,ix);
10291 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
10292 /* these are assumed to be refcounted properly */
53c1dcc0 10293 OP *o;
1d7c1841
GS
10294 switch (((OP*)ptr)->op_type) {
10295 case OP_LEAVESUB:
10296 case OP_LEAVESUBLV:
10297 case OP_LEAVEEVAL:
10298 case OP_LEAVE:
10299 case OP_SCOPE:
10300 case OP_LEAVEWRITE:
e977893f
GS
10301 TOPPTR(nss,ix) = ptr;
10302 o = (OP*)ptr;
10303 OpREFCNT_inc(o);
1d7c1841
GS
10304 break;
10305 default:
5f66b61c 10306 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
10307 break;
10308 }
10309 }
10310 else
5f66b61c 10311 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
10312 break;
10313 case SAVEt_FREEPV:
10314 c = (char*)POPPTR(ss,ix);
10315 TOPPTR(nss,ix) = pv_dup_inc(c);
10316 break;
10317 case SAVEt_CLEARSV:
10318 longval = POPLONG(ss,ix);
10319 TOPLONG(nss,ix) = longval;
10320 break;
10321 case SAVEt_DELETE:
10322 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10323 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10324 c = (char*)POPPTR(ss,ix);
10325 TOPPTR(nss,ix) = pv_dup_inc(c);
10326 i = POPINT(ss,ix);
10327 TOPINT(nss,ix) = i;
10328 break;
10329 case SAVEt_DESTRUCTOR:
10330 ptr = POPPTR(ss,ix);
10331 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10332 dptr = POPDPTR(ss,ix);
8141890a
JH
10333 TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
10334 any_dup(FPTR2DPTR(void *, dptr),
10335 proto_perl));
1d7c1841
GS
10336 break;
10337 case SAVEt_DESTRUCTOR_X:
10338 ptr = POPPTR(ss,ix);
10339 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10340 dxptr = POPDXPTR(ss,ix);
8141890a
JH
10341 TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
10342 any_dup(FPTR2DPTR(void *, dxptr),
10343 proto_perl));
1d7c1841
GS
10344 break;
10345 case SAVEt_REGCONTEXT:
10346 case SAVEt_ALLOC:
10347 i = POPINT(ss,ix);
10348 TOPINT(nss,ix) = i;
10349 ix -= i;
10350 break;
10351 case SAVEt_STACK_POS: /* Position on Perl stack */
10352 i = POPINT(ss,ix);
10353 TOPINT(nss,ix) = i;
10354 break;
10355 case SAVEt_AELEM: /* array element */
10356 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10357 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10358 i = POPINT(ss,ix);
10359 TOPINT(nss,ix) = i;
10360 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10361 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
10362 break;
10363 case SAVEt_HELEM: /* hash element */
10364 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10365 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10366 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10367 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10368 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10369 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10370 break;
10371 case SAVEt_OP:
10372 ptr = POPPTR(ss,ix);
10373 TOPPTR(nss,ix) = ptr;
10374 break;
10375 case SAVEt_HINTS:
10376 i = POPINT(ss,ix);
10377 TOPINT(nss,ix) = i;
10378 break;
c4410b1b
GS
10379 case SAVEt_COMPPAD:
10380 av = (AV*)POPPTR(ss,ix);
58ed4fbe 10381 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 10382 break;
c3564e5c
GS
10383 case SAVEt_PADSV:
10384 longval = (long)POPLONG(ss,ix);
10385 TOPLONG(nss,ix) = longval;
10386 ptr = POPPTR(ss,ix);
10387 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10388 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10389 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 10390 break;
a1bb4754 10391 case SAVEt_BOOL:
38d8b13e 10392 ptr = POPPTR(ss,ix);
b9609c01 10393 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 10394 longval = (long)POPBOOL(ss,ix);
b9609c01 10395 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 10396 break;
8bd2680e
MHM
10397 case SAVEt_SET_SVFLAGS:
10398 i = POPINT(ss,ix);
10399 TOPINT(nss,ix) = i;
10400 i = POPINT(ss,ix);
10401 TOPINT(nss,ix) = i;
10402 sv = (SV*)POPPTR(ss,ix);
10403 TOPPTR(nss,ix) = sv_dup(sv, param);
10404 break;
1d7c1841
GS
10405 default:
10406 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
10407 }
10408 }
10409
bd81e77b
NC
10410 return nss;
10411}
10412
10413
10414/* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
10415 * flag to the result. This is done for each stash before cloning starts,
10416 * so we know which stashes want their objects cloned */
10417
10418static void
10419do_mark_cloneable_stash(pTHX_ SV *sv)
10420{
10421 const HEK * const hvname = HvNAME_HEK((HV*)sv);
10422 if (hvname) {
10423 GV* const cloner = gv_fetchmethod_autoload((HV*)sv, "CLONE_SKIP", 0);
10424 SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
10425 if (cloner && GvCV(cloner)) {
10426 dSP;
10427 UV status;
10428
10429 ENTER;
10430 SAVETMPS;
10431 PUSHMARK(SP);
10432 XPUSHs(sv_2mortal(newSVhek(hvname)));
10433 PUTBACK;
10434 call_sv((SV*)GvCV(cloner), G_SCALAR);
10435 SPAGAIN;
10436 status = POPu;
10437 PUTBACK;
10438 FREETMPS;
10439 LEAVE;
10440 if (status)
10441 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
10442 }
10443 }
10444}
10445
10446
10447
10448/*
10449=for apidoc perl_clone
10450
10451Create and return a new interpreter by cloning the current one.
10452
10453perl_clone takes these flags as parameters:
10454
10455CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
10456without it we only clone the data and zero the stacks,
10457with it we copy the stacks and the new perl interpreter is
10458ready to run at the exact same point as the previous one.
10459The pseudo-fork code uses COPY_STACKS while the
10460threads->new doesn't.
10461
10462CLONEf_KEEP_PTR_TABLE
10463perl_clone keeps a ptr_table with the pointer of the old
10464variable as a key and the new variable as a value,
10465this allows it to check if something has been cloned and not
10466clone it again but rather just use the value and increase the
10467refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
10468the ptr_table using the function
10469C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
10470reason to keep it around is if you want to dup some of your own
10471variable who are outside the graph perl scans, example of this
10472code is in threads.xs create
10473
10474CLONEf_CLONE_HOST
10475This is a win32 thing, it is ignored on unix, it tells perls
10476win32host code (which is c++) to clone itself, this is needed on
10477win32 if you want to run two threads at the same time,
10478if you just want to do some stuff in a separate perl interpreter
10479and then throw it away and return to the original one,
10480you don't need to do anything.
10481
10482=cut
10483*/
10484
10485/* XXX the above needs expanding by someone who actually understands it ! */
10486EXTERN_C PerlInterpreter *
10487perl_clone_host(PerlInterpreter* proto_perl, UV flags);
10488
10489PerlInterpreter *
10490perl_clone(PerlInterpreter *proto_perl, UV flags)
10491{
10492 dVAR;
10493#ifdef PERL_IMPLICIT_SYS
10494
10495 /* perlhost.h so we need to call into it
10496 to clone the host, CPerlHost should have a c interface, sky */
10497
10498 if (flags & CLONEf_CLONE_HOST) {
10499 return perl_clone_host(proto_perl,flags);
10500 }
10501 return perl_clone_using(proto_perl, flags,
10502 proto_perl->IMem,
10503 proto_perl->IMemShared,
10504 proto_perl->IMemParse,
10505 proto_perl->IEnv,
10506 proto_perl->IStdIO,
10507 proto_perl->ILIO,
10508 proto_perl->IDir,
10509 proto_perl->ISock,
10510 proto_perl->IProc);
10511}
10512
10513PerlInterpreter *
10514perl_clone_using(PerlInterpreter *proto_perl, UV flags,
10515 struct IPerlMem* ipM, struct IPerlMem* ipMS,
10516 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
10517 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
10518 struct IPerlDir* ipD, struct IPerlSock* ipS,
10519 struct IPerlProc* ipP)
10520{
10521 /* XXX many of the string copies here can be optimized if they're
10522 * constants; they need to be allocated as common memory and just
10523 * their pointers copied. */
10524
10525 IV i;
10526 CLONE_PARAMS clone_params;
5f66b61c 10527 CLONE_PARAMS* const param = &clone_params;
bd81e77b 10528
5f66b61c 10529 PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
bd81e77b
NC
10530 /* for each stash, determine whether its objects should be cloned */
10531 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
10532 PERL_SET_THX(my_perl);
10533
10534# ifdef DEBUGGING
10535 Poison(my_perl, 1, PerlInterpreter);
5f66b61c
AL
10536 PL_op = NULL;
10537 PL_curcop = NULL;
bd81e77b
NC
10538 PL_markstack = 0;
10539 PL_scopestack = 0;
10540 PL_savestack = 0;
10541 PL_savestack_ix = 0;
10542 PL_savestack_max = -1;
10543 PL_sig_pending = 0;
10544 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
10545# else /* !DEBUGGING */
10546 Zero(my_perl, 1, PerlInterpreter);
10547# endif /* DEBUGGING */
10548
10549 /* host pointers */
10550 PL_Mem = ipM;
10551 PL_MemShared = ipMS;
10552 PL_MemParse = ipMP;
10553 PL_Env = ipE;
10554 PL_StdIO = ipStd;
10555 PL_LIO = ipLIO;
10556 PL_Dir = ipD;
10557 PL_Sock = ipS;
10558 PL_Proc = ipP;
10559#else /* !PERL_IMPLICIT_SYS */
10560 IV i;
10561 CLONE_PARAMS clone_params;
10562 CLONE_PARAMS* param = &clone_params;
5f66b61c 10563 PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
bd81e77b
NC
10564 /* for each stash, determine whether its objects should be cloned */
10565 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
10566 PERL_SET_THX(my_perl);
10567
10568# ifdef DEBUGGING
10569 Poison(my_perl, 1, PerlInterpreter);
5f66b61c
AL
10570 PL_op = NULL;
10571 PL_curcop = NULL;
bd81e77b
NC
10572 PL_markstack = 0;
10573 PL_scopestack = 0;
10574 PL_savestack = 0;
10575 PL_savestack_ix = 0;
10576 PL_savestack_max = -1;
10577 PL_sig_pending = 0;
10578 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
10579# else /* !DEBUGGING */
10580 Zero(my_perl, 1, PerlInterpreter);
10581# endif /* DEBUGGING */
10582#endif /* PERL_IMPLICIT_SYS */
10583 param->flags = flags;
10584 param->proto_perl = proto_perl;
10585
7cb608b5
NC
10586 INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
10587
fdda85ca 10588 PL_body_arenas = NULL;
bd81e77b
NC
10589 Zero(&PL_body_roots, 1, PL_body_roots);
10590
10591 PL_nice_chunk = NULL;
10592 PL_nice_chunk_size = 0;
10593 PL_sv_count = 0;
10594 PL_sv_objcount = 0;
a0714e2c
SS
10595 PL_sv_root = NULL;
10596 PL_sv_arenaroot = NULL;
bd81e77b
NC
10597
10598 PL_debug = proto_perl->Idebug;
10599
10600 PL_hash_seed = proto_perl->Ihash_seed;
10601 PL_rehash_seed = proto_perl->Irehash_seed;
10602
10603#ifdef USE_REENTRANT_API
10604 /* XXX: things like -Dm will segfault here in perlio, but doing
10605 * PERL_SET_CONTEXT(proto_perl);
10606 * breaks too many other things
10607 */
10608 Perl_reentrant_init(aTHX);
10609#endif
10610
10611 /* create SV map for pointer relocation */
10612 PL_ptr_table = ptr_table_new();
10613
10614 /* initialize these special pointers as early as possible */
10615 SvANY(&PL_sv_undef) = NULL;
10616 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
10617 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
10618 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
10619
10620 SvANY(&PL_sv_no) = new_XPVNV();
10621 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
10622 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
10623 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
10624 SvPV_set(&PL_sv_no, SAVEPVN(PL_No, 0));
10625 SvCUR_set(&PL_sv_no, 0);
10626 SvLEN_set(&PL_sv_no, 1);
10627 SvIV_set(&PL_sv_no, 0);
10628 SvNV_set(&PL_sv_no, 0);
10629 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
10630
10631 SvANY(&PL_sv_yes) = new_XPVNV();
10632 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
10633 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
10634 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
10635 SvPV_set(&PL_sv_yes, SAVEPVN(PL_Yes, 1));
10636 SvCUR_set(&PL_sv_yes, 1);
10637 SvLEN_set(&PL_sv_yes, 2);
10638 SvIV_set(&PL_sv_yes, 1);
10639 SvNV_set(&PL_sv_yes, 1);
10640 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
10641
10642 /* create (a non-shared!) shared string table */
10643 PL_strtab = newHV();
10644 HvSHAREKEYS_off(PL_strtab);
10645 hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
10646 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
10647
10648 PL_compiling = proto_perl->Icompiling;
10649
10650 /* These two PVs will be free'd special way so must set them same way op.c does */
10651 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
10652 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
10653
10654 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
10655 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
10656
10657 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
10658 if (!specialWARN(PL_compiling.cop_warnings))
10659 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
10660 if (!specialCopIO(PL_compiling.cop_io))
10661 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
10662 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
10663
10664 /* pseudo environmental stuff */
10665 PL_origargc = proto_perl->Iorigargc;
10666 PL_origargv = proto_perl->Iorigargv;
10667
10668 param->stashes = newAV(); /* Setup array of objects to call clone on */
10669
10670 /* Set tainting stuff before PerlIO_debug can possibly get called */
10671 PL_tainting = proto_perl->Itainting;
10672 PL_taint_warn = proto_perl->Itaint_warn;
10673
10674#ifdef PERLIO_LAYERS
10675 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
10676 PerlIO_clone(aTHX_ proto_perl, param);
10677#endif
10678
10679 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
10680 PL_incgv = gv_dup(proto_perl->Iincgv, param);
10681 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
10682 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
10683 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
10684 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
10685
10686 /* switches */
10687 PL_minus_c = proto_perl->Iminus_c;
10688 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
10689 PL_localpatches = proto_perl->Ilocalpatches;
10690 PL_splitstr = proto_perl->Isplitstr;
10691 PL_preprocess = proto_perl->Ipreprocess;
10692 PL_minus_n = proto_perl->Iminus_n;
10693 PL_minus_p = proto_perl->Iminus_p;
10694 PL_minus_l = proto_perl->Iminus_l;
10695 PL_minus_a = proto_perl->Iminus_a;
bc9b29db 10696 PL_minus_E = proto_perl->Iminus_E;
bd81e77b
NC
10697 PL_minus_F = proto_perl->Iminus_F;
10698 PL_doswitches = proto_perl->Idoswitches;
10699 PL_dowarn = proto_perl->Idowarn;
10700 PL_doextract = proto_perl->Idoextract;
10701 PL_sawampersand = proto_perl->Isawampersand;
10702 PL_unsafe = proto_perl->Iunsafe;
10703 PL_inplace = SAVEPV(proto_perl->Iinplace);
10704 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
10705 PL_perldb = proto_perl->Iperldb;
10706 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
10707 PL_exit_flags = proto_perl->Iexit_flags;
10708
10709 /* magical thingies */
10710 /* XXX time(&PL_basetime) when asked for? */
10711 PL_basetime = proto_perl->Ibasetime;
10712 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
10713
10714 PL_maxsysfd = proto_perl->Imaxsysfd;
10715 PL_multiline = proto_perl->Imultiline;
10716 PL_statusvalue = proto_perl->Istatusvalue;
10717#ifdef VMS
10718 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
10719#else
10720 PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
10721#endif
10722 PL_encoding = sv_dup(proto_perl->Iencoding, param);
10723
10724 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
10725 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
10726 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
10727
10728 /* Clone the regex array */
10729 PL_regex_padav = newAV();
10730 {
10731 const I32 len = av_len((AV*)proto_perl->Iregex_padav);
7a5b473e 10732 SV* const * const regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
bd81e77b 10733 IV i;
7f466ec7 10734 av_push(PL_regex_padav, sv_dup_inc_NN(regexen[0],param));
bd81e77b 10735 for(i = 1; i <= len; i++) {
7a5b473e
AL
10736 const SV * const regex = regexen[i];
10737 SV * const sv =
10738 SvREPADTMP(regex)
10739 ? sv_dup_inc(regex, param)
10740 : SvREFCNT_inc(
10741 newSViv(PTR2IV(re_dup(
10742 INT2PTR(REGEXP *, SvIVX(regex)), param))))
10743 ;
10744 av_push(PL_regex_padav, sv);
bd81e77b
NC
10745 }
10746 }
10747 PL_regex_pad = AvARRAY(PL_regex_padav);
10748
10749 /* shortcuts to various I/O objects */
10750 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
10751 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
10752 PL_defgv = gv_dup(proto_perl->Idefgv, param);
10753 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
10754 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
10755 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841 10756
bd81e77b
NC
10757 /* shortcuts to regexp stuff */
10758 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
9660f481 10759
bd81e77b
NC
10760 /* shortcuts to misc objects */
10761 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
9660f481 10762
bd81e77b
NC
10763 /* shortcuts to debugging objects */
10764 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
10765 PL_DBline = gv_dup(proto_perl->IDBline, param);
10766 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
10767 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
10768 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
10769 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
10770 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
10771 PL_lineary = av_dup(proto_perl->Ilineary, param);
10772 PL_dbargs = av_dup(proto_perl->Idbargs, param);
9660f481 10773
bd81e77b
NC
10774 /* symbol tables */
10775 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
10776 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
10777 PL_debstash = hv_dup(proto_perl->Idebstash, param);
10778 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
10779 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
10780
10781 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
10782 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
10783 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
10784 PL_endav = av_dup_inc(proto_perl->Iendav, param);
10785 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
10786 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
10787
10788 PL_sub_generation = proto_perl->Isub_generation;
10789
10790 /* funky return mechanisms */
10791 PL_forkprocess = proto_perl->Iforkprocess;
10792
10793 /* subprocess state */
10794 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
10795
10796 /* internal state */
10797 PL_maxo = proto_perl->Imaxo;
10798 if (proto_perl->Iop_mask)
10799 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
10800 else
bd61b366 10801 PL_op_mask = NULL;
bd81e77b
NC
10802 /* PL_asserting = proto_perl->Iasserting; */
10803
10804 /* current interpreter roots */
10805 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
10806 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
10807 PL_main_start = proto_perl->Imain_start;
10808 PL_eval_root = proto_perl->Ieval_root;
10809 PL_eval_start = proto_perl->Ieval_start;
10810
10811 /* runtime control stuff */
10812 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
10813 PL_copline = proto_perl->Icopline;
10814
10815 PL_filemode = proto_perl->Ifilemode;
10816 PL_lastfd = proto_perl->Ilastfd;
10817 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
10818 PL_Argv = NULL;
bd61b366 10819 PL_Cmd = NULL;
bd81e77b
NC
10820 PL_gensym = proto_perl->Igensym;
10821 PL_preambled = proto_perl->Ipreambled;
10822 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
10823 PL_laststatval = proto_perl->Ilaststatval;
10824 PL_laststype = proto_perl->Ilaststype;
a0714e2c 10825 PL_mess_sv = NULL;
bd81e77b
NC
10826
10827 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
10828
10829 /* interpreter atexit processing */
10830 PL_exitlistlen = proto_perl->Iexitlistlen;
10831 if (PL_exitlistlen) {
10832 Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
10833 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
9660f481 10834 }
bd81e77b
NC
10835 else
10836 PL_exitlist = (PerlExitListEntry*)NULL;
f16dd614
DM
10837
10838 PL_my_cxt_size = proto_perl->Imy_cxt_size;
4c901e72 10839 if (PL_my_cxt_size) {
f16dd614
DM
10840 Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
10841 Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
10842 }
10843 else
10844 PL_my_cxt_list = (void**)NULL;
bd81e77b
NC
10845 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
10846 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
10847 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
10848
10849 PL_profiledata = NULL;
10850 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
10851 /* PL_rsfp_filters entries have fake IoDIRP() */
10852 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
9660f481 10853
bd81e77b 10854 PL_compcv = cv_dup(proto_perl->Icompcv, param);
9660f481 10855
bd81e77b 10856 PAD_CLONE_VARS(proto_perl, param);
9660f481 10857
bd81e77b
NC
10858#ifdef HAVE_INTERP_INTERN
10859 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
10860#endif
645c22ef 10861
bd81e77b
NC
10862 /* more statics moved here */
10863 PL_generation = proto_perl->Igeneration;
10864 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
645c22ef 10865
bd81e77b
NC
10866 PL_in_clean_objs = proto_perl->Iin_clean_objs;
10867 PL_in_clean_all = proto_perl->Iin_clean_all;
6a78b4db 10868
bd81e77b
NC
10869 PL_uid = proto_perl->Iuid;
10870 PL_euid = proto_perl->Ieuid;
10871 PL_gid = proto_perl->Igid;
10872 PL_egid = proto_perl->Iegid;
10873 PL_nomemok = proto_perl->Inomemok;
10874 PL_an = proto_perl->Ian;
10875 PL_evalseq = proto_perl->Ievalseq;
10876 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
10877 PL_origalen = proto_perl->Iorigalen;
10878#ifdef PERL_USES_PL_PIDSTATUS
10879 PL_pidstatus = newHV(); /* XXX flag for cloning? */
10880#endif
10881 PL_osname = SAVEPV(proto_perl->Iosname);
10882 PL_sighandlerp = proto_perl->Isighandlerp;
6a78b4db 10883
bd81e77b 10884 PL_runops = proto_perl->Irunops;
6a78b4db 10885
bd81e77b 10886 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
6a78b4db 10887
bd81e77b
NC
10888#ifdef CSH
10889 PL_cshlen = proto_perl->Icshlen;
10890 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
10891#endif
645c22ef 10892
bd81e77b
NC
10893 PL_lex_state = proto_perl->Ilex_state;
10894 PL_lex_defer = proto_perl->Ilex_defer;
10895 PL_lex_expect = proto_perl->Ilex_expect;
10896 PL_lex_formbrack = proto_perl->Ilex_formbrack;
10897 PL_lex_dojoin = proto_perl->Ilex_dojoin;
10898 PL_lex_starts = proto_perl->Ilex_starts;
10899 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
10900 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
10901 PL_lex_op = proto_perl->Ilex_op;
10902 PL_lex_inpat = proto_perl->Ilex_inpat;
10903 PL_lex_inwhat = proto_perl->Ilex_inwhat;
10904 PL_lex_brackets = proto_perl->Ilex_brackets;
10905 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
10906 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
10907 PL_lex_casemods = proto_perl->Ilex_casemods;
10908 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
10909 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
645c22ef 10910
5db06880
NC
10911#ifdef PERL_MAD
10912 Copy(proto_perl->Inexttoke, PL_nexttoke, 5, NEXTTOKE);
10913 PL_lasttoke = proto_perl->Ilasttoke;
10914#else
bd81e77b
NC
10915 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
10916 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
10917 PL_nexttoke = proto_perl->Inexttoke;
5db06880 10918#endif
c43294b8 10919
bd81e77b
NC
10920 /* XXX This is probably masking the deeper issue of why
10921 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
10922 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
10923 * (A little debugging with a watchpoint on it may help.)
10924 */
10925 if (SvANY(proto_perl->Ilinestr)) {
10926 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
10927 i = proto_perl->Ibufptr - SvPVX_const(proto_perl->Ilinestr);
10928 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10929 i = proto_perl->Ioldbufptr - SvPVX_const(proto_perl->Ilinestr);
10930 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10931 i = proto_perl->Ioldoldbufptr - SvPVX_const(proto_perl->Ilinestr);
10932 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10933 i = proto_perl->Ilinestart - SvPVX_const(proto_perl->Ilinestr);
10934 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10935 }
10936 else {
561b68a9 10937 PL_linestr = newSV(79);
bd81e77b
NC
10938 sv_upgrade(PL_linestr,SVt_PVIV);
10939 sv_setpvn(PL_linestr,"",0);
10940 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
10941 }
10942 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
10943 PL_pending_ident = proto_perl->Ipending_ident;
10944 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
10945
10946 PL_expect = proto_perl->Iexpect;
10947
10948 PL_multi_start = proto_perl->Imulti_start;
10949 PL_multi_end = proto_perl->Imulti_end;
10950 PL_multi_open = proto_perl->Imulti_open;
10951 PL_multi_close = proto_perl->Imulti_close;
10952
10953 PL_error_count = proto_perl->Ierror_count;
10954 PL_subline = proto_perl->Isubline;
10955 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
c43294b8 10956
bd81e77b
NC
10957 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
10958 if (SvANY(proto_perl->Ilinestr)) {
10959 i = proto_perl->Ilast_uni - SvPVX_const(proto_perl->Ilinestr);
10960 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10961 i = proto_perl->Ilast_lop - SvPVX_const(proto_perl->Ilinestr);
10962 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10963 PL_last_lop_op = proto_perl->Ilast_lop_op;
10964 }
10965 else {
10966 PL_last_uni = SvPVX(PL_linestr);
10967 PL_last_lop = SvPVX(PL_linestr);
10968 PL_last_lop_op = 0;
10969 }
10970 PL_in_my = proto_perl->Iin_my;
10971 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
10972#ifdef FCRYPT
10973 PL_cryptseen = proto_perl->Icryptseen;
10974#endif
1d7c1841 10975
bd81e77b 10976 PL_hints = proto_perl->Ihints;
1d7c1841 10977
bd81e77b 10978 PL_amagic_generation = proto_perl->Iamagic_generation;
d2d73c3e 10979
bd81e77b
NC
10980#ifdef USE_LOCALE_COLLATE
10981 PL_collation_ix = proto_perl->Icollation_ix;
10982 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
10983 PL_collation_standard = proto_perl->Icollation_standard;
10984 PL_collxfrm_base = proto_perl->Icollxfrm_base;
10985 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
10986#endif /* USE_LOCALE_COLLATE */
1d7c1841 10987
bd81e77b
NC
10988#ifdef USE_LOCALE_NUMERIC
10989 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
10990 PL_numeric_standard = proto_perl->Inumeric_standard;
10991 PL_numeric_local = proto_perl->Inumeric_local;
10992 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
10993#endif /* !USE_LOCALE_NUMERIC */
1d7c1841 10994
bd81e77b
NC
10995 /* utf8 character classes */
10996 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
10997 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
10998 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
10999 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
11000 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
11001 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
11002 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
11003 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
11004 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
11005 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
11006 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
11007 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
11008 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
11009 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
11010 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
11011 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
11012 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
11013 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
11014 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
11015 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 11016
bd81e77b
NC
11017 /* Did the locale setup indicate UTF-8? */
11018 PL_utf8locale = proto_perl->Iutf8locale;
11019 /* Unicode features (see perlrun/-C) */
11020 PL_unicode = proto_perl->Iunicode;
1d7c1841 11021
bd81e77b
NC
11022 /* Pre-5.8 signals control */
11023 PL_signals = proto_perl->Isignals;
1d7c1841 11024
bd81e77b
NC
11025 /* times() ticks per second */
11026 PL_clocktick = proto_perl->Iclocktick;
1d7c1841 11027
bd81e77b
NC
11028 /* Recursion stopper for PerlIO_find_layer */
11029 PL_in_load_module = proto_perl->Iin_load_module;
8df990a8 11030
bd81e77b
NC
11031 /* sort() routine */
11032 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
e5dd39fc 11033
bd81e77b
NC
11034 /* Not really needed/useful since the reenrant_retint is "volatile",
11035 * but do it for consistency's sake. */
11036 PL_reentrant_retint = proto_perl->Ireentrant_retint;
1d7c1841 11037
bd81e77b
NC
11038 /* Hooks to shared SVs and locks. */
11039 PL_sharehook = proto_perl->Isharehook;
11040 PL_lockhook = proto_perl->Ilockhook;
11041 PL_unlockhook = proto_perl->Iunlockhook;
11042 PL_threadhook = proto_perl->Ithreadhook;
1d7c1841 11043
bd81e77b
NC
11044 PL_runops_std = proto_perl->Irunops_std;
11045 PL_runops_dbg = proto_perl->Irunops_dbg;
1d7c1841 11046
bd81e77b
NC
11047#ifdef THREADS_HAVE_PIDS
11048 PL_ppid = proto_perl->Ippid;
11049#endif
1d7c1841 11050
bd81e77b 11051 /* swatch cache */
5c284bb0 11052 PL_last_swash_hv = NULL; /* reinits on demand */
bd81e77b
NC
11053 PL_last_swash_klen = 0;
11054 PL_last_swash_key[0]= '\0';
11055 PL_last_swash_tmps = (U8*)NULL;
11056 PL_last_swash_slen = 0;
1d7c1841 11057
bd81e77b
NC
11058 PL_glob_index = proto_perl->Iglob_index;
11059 PL_srand_called = proto_perl->Isrand_called;
11060 PL_uudmap['M'] = 0; /* reinits on demand */
bd61b366 11061 PL_bitcount = NULL; /* reinits on demand */
05ec9bb3 11062
bd81e77b
NC
11063 if (proto_perl->Ipsig_pend) {
11064 Newxz(PL_psig_pend, SIG_SIZE, int);
11065 }
11066 else {
11067 PL_psig_pend = (int*)NULL;
11068 }
05ec9bb3 11069
bd81e77b
NC
11070 if (proto_perl->Ipsig_ptr) {
11071 Newxz(PL_psig_ptr, SIG_SIZE, SV*);
11072 Newxz(PL_psig_name, SIG_SIZE, SV*);
11073 for (i = 1; i < SIG_SIZE; i++) {
11074 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
11075 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
11076 }
11077 }
11078 else {
11079 PL_psig_ptr = (SV**)NULL;
11080 PL_psig_name = (SV**)NULL;
11081 }
05ec9bb3 11082
bd81e77b 11083 /* thrdvar.h stuff */
1d7c1841 11084
bd81e77b
NC
11085 if (flags & CLONEf_COPY_STACKS) {
11086 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
11087 PL_tmps_ix = proto_perl->Ttmps_ix;
11088 PL_tmps_max = proto_perl->Ttmps_max;
11089 PL_tmps_floor = proto_perl->Ttmps_floor;
11090 Newxz(PL_tmps_stack, PL_tmps_max, SV*);
11091 i = 0;
11092 while (i <= PL_tmps_ix) {
11093 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
11094 ++i;
11095 }
d2d73c3e 11096
bd81e77b
NC
11097 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
11098 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
11099 Newxz(PL_markstack, i, I32);
11100 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
11101 - proto_perl->Tmarkstack);
11102 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
11103 - proto_perl->Tmarkstack);
11104 Copy(proto_perl->Tmarkstack, PL_markstack,
11105 PL_markstack_ptr - PL_markstack + 1, I32);
d2d73c3e 11106
bd81e77b
NC
11107 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
11108 * NOTE: unlike the others! */
11109 PL_scopestack_ix = proto_perl->Tscopestack_ix;
11110 PL_scopestack_max = proto_perl->Tscopestack_max;
11111 Newxz(PL_scopestack, PL_scopestack_max, I32);
11112 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
d419787a 11113
bd81e77b
NC
11114 /* NOTE: si_dup() looks at PL_markstack */
11115 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
d2d73c3e 11116
bd81e77b
NC
11117 /* PL_curstack = PL_curstackinfo->si_stack; */
11118 PL_curstack = av_dup(proto_perl->Tcurstack, param);
11119 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841 11120
bd81e77b
NC
11121 /* next PUSHs() etc. set *(PL_stack_sp+1) */
11122 PL_stack_base = AvARRAY(PL_curstack);
11123 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
11124 - proto_perl->Tstack_base);
11125 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
1d7c1841 11126
bd81e77b
NC
11127 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
11128 * NOTE: unlike the others! */
11129 PL_savestack_ix = proto_perl->Tsavestack_ix;
11130 PL_savestack_max = proto_perl->Tsavestack_max;
11131 /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
11132 PL_savestack = ss_dup(proto_perl, param);
11133 }
11134 else {
11135 init_stacks();
11136 ENTER; /* perl_destruct() wants to LEAVE; */
34394ecd
DM
11137
11138 /* although we're not duplicating the tmps stack, we should still
11139 * add entries for any SVs on the tmps stack that got cloned by a
11140 * non-refcount means (eg a temp in @_); otherwise they will be
11141 * orphaned
11142 */
11143 for (i = 0; i<= proto_perl->Ttmps_ix; i++) {
6136c704 11144 SV * const nsv = (SV*)ptr_table_fetch(PL_ptr_table,
34394ecd
DM
11145 proto_perl->Ttmps_stack[i]);
11146 if (nsv && !SvREFCNT(nsv)) {
11147 EXTEND_MORTAL(1);
b37c2d43 11148 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple(nsv);
34394ecd
DM
11149 }
11150 }
bd81e77b 11151 }
1d7c1841 11152
bd81e77b
NC
11153 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
11154 PL_top_env = &PL_start_env;
1d7c1841 11155
bd81e77b 11156 PL_op = proto_perl->Top;
4a4c6fe3 11157
a0714e2c 11158 PL_Sv = NULL;
bd81e77b
NC
11159 PL_Xpv = (XPV*)NULL;
11160 PL_na = proto_perl->Tna;
1fcf4c12 11161
bd81e77b
NC
11162 PL_statbuf = proto_perl->Tstatbuf;
11163 PL_statcache = proto_perl->Tstatcache;
11164 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
11165 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
11166#ifdef HAS_TIMES
11167 PL_timesbuf = proto_perl->Ttimesbuf;
11168#endif
1d7c1841 11169
bd81e77b
NC
11170 PL_tainted = proto_perl->Ttainted;
11171 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
11172 PL_rs = sv_dup_inc(proto_perl->Trs, param);
11173 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
11174 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
11175 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
11176 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
11177 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
11178 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
11179 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841 11180
bd81e77b
NC
11181 PL_restartop = proto_perl->Trestartop;
11182 PL_in_eval = proto_perl->Tin_eval;
11183 PL_delaymagic = proto_perl->Tdelaymagic;
11184 PL_dirty = proto_perl->Tdirty;
11185 PL_localizing = proto_perl->Tlocalizing;
1d7c1841 11186
bd81e77b 11187 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
4608196e 11188 PL_hv_fetch_ent_mh = NULL;
bd81e77b 11189 PL_modcount = proto_perl->Tmodcount;
5f66b61c 11190 PL_lastgotoprobe = NULL;
bd81e77b 11191 PL_dumpindent = proto_perl->Tdumpindent;
1d7c1841 11192
bd81e77b
NC
11193 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
11194 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
11195 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
11196 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
bd61b366 11197 PL_efloatbuf = NULL; /* reinits on demand */
bd81e77b 11198 PL_efloatsize = 0; /* reinits on demand */
d2d73c3e 11199
bd81e77b 11200 /* regex stuff */
1d7c1841 11201
bd81e77b
NC
11202 PL_screamfirst = NULL;
11203 PL_screamnext = NULL;
11204 PL_maxscream = -1; /* reinits on demand */
a0714e2c 11205 PL_lastscream = NULL;
1d7c1841 11206
bd81e77b 11207 PL_watchaddr = NULL;
bd61b366 11208 PL_watchok = NULL;
1d7c1841 11209
bd81e77b 11210 PL_regdummy = proto_perl->Tregdummy;
bd61b366 11211 PL_regprecomp = NULL;
bd81e77b
NC
11212 PL_regnpar = 0;
11213 PL_regsize = 0;
11214 PL_colorset = 0; /* reinits PL_colors[] */
11215 /*PL_colors[6] = {0,0,0,0,0,0};*/
bd61b366
SS
11216 PL_reginput = NULL;
11217 PL_regbol = NULL;
11218 PL_regeol = NULL;
bd81e77b
NC
11219 PL_regstartp = (I32*)NULL;
11220 PL_regendp = (I32*)NULL;
11221 PL_reglastparen = (U32*)NULL;
11222 PL_reglastcloseparen = (U32*)NULL;
bd61b366 11223 PL_regtill = NULL;
bd81e77b
NC
11224 PL_reg_start_tmp = (char**)NULL;
11225 PL_reg_start_tmpl = 0;
11226 PL_regdata = (struct reg_data*)NULL;
bd61b366 11227 PL_bostr = NULL;
bd81e77b
NC
11228 PL_reg_flags = 0;
11229 PL_reg_eval_set = 0;
11230 PL_regnarrate = 0;
11231 PL_regprogram = (regnode*)NULL;
11232 PL_regindent = 0;
11233 PL_regcc = (CURCUR*)NULL;
11234 PL_reg_call_cc = (struct re_cc_state*)NULL;
11235 PL_reg_re = (regexp*)NULL;
bd61b366 11236 PL_reg_ganch = NULL;
a0714e2c 11237 PL_reg_sv = NULL;
bd81e77b
NC
11238 PL_reg_match_utf8 = FALSE;
11239 PL_reg_magic = (MAGIC*)NULL;
11240 PL_reg_oldpos = 0;
11241 PL_reg_oldcurpm = (PMOP*)NULL;
11242 PL_reg_curpm = (PMOP*)NULL;
bd61b366 11243 PL_reg_oldsaved = NULL;
bd81e77b
NC
11244 PL_reg_oldsavedlen = 0;
11245#ifdef PERL_OLD_COPY_ON_WRITE
a0714e2c 11246 PL_nrs = NULL;
bd81e77b
NC
11247#endif
11248 PL_reg_maxiter = 0;
11249 PL_reg_leftiter = 0;
bd61b366 11250 PL_reg_poscache = NULL;
bd81e77b 11251 PL_reg_poscache_size= 0;
1d7c1841 11252
bd81e77b
NC
11253 /* RE engine - function pointers */
11254 PL_regcompp = proto_perl->Tregcompp;
11255 PL_regexecp = proto_perl->Tregexecp;
11256 PL_regint_start = proto_perl->Tregint_start;
11257 PL_regint_string = proto_perl->Tregint_string;
11258 PL_regfree = proto_perl->Tregfree;
1d7c1841 11259
bd81e77b
NC
11260 PL_reginterp_cnt = 0;
11261 PL_reg_starttry = 0;
1d7c1841 11262
bd81e77b
NC
11263 /* Pluggable optimizer */
11264 PL_peepp = proto_perl->Tpeepp;
1d7c1841 11265
bd81e77b 11266 PL_stashcache = newHV();
1d7c1841 11267
bd81e77b
NC
11268 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
11269 ptr_table_free(PL_ptr_table);
11270 PL_ptr_table = NULL;
11271 }
1d7c1841 11272
bd81e77b
NC
11273 /* Call the ->CLONE method, if it exists, for each of the stashes
11274 identified by sv_dup() above.
11275 */
11276 while(av_len(param->stashes) != -1) {
11277 HV* const stash = (HV*) av_shift(param->stashes);
11278 GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
11279 if (cloner && GvCV(cloner)) {
11280 dSP;
11281 ENTER;
11282 SAVETMPS;
11283 PUSHMARK(SP);
11284 XPUSHs(sv_2mortal(newSVhek(HvNAME_HEK(stash))));
11285 PUTBACK;
11286 call_sv((SV*)GvCV(cloner), G_DISCARD);
11287 FREETMPS;
11288 LEAVE;
11289 }
1d7c1841 11290 }
1d7c1841 11291
bd81e77b 11292 SvREFCNT_dec(param->stashes);
1d7c1841 11293
bd81e77b
NC
11294 /* orphaned? eg threads->new inside BEGIN or use */
11295 if (PL_compcv && ! SvREFCNT(PL_compcv)) {
b37c2d43 11296 SvREFCNT_inc_simple_void(PL_compcv);
bd81e77b
NC
11297 SAVEFREESV(PL_compcv);
11298 }
dd2155a4 11299
bd81e77b
NC
11300 return my_perl;
11301}
1d7c1841 11302
bd81e77b 11303#endif /* USE_ITHREADS */
1d7c1841 11304
bd81e77b
NC
11305/*
11306=head1 Unicode Support
1d7c1841 11307
bd81e77b 11308=for apidoc sv_recode_to_utf8
1d7c1841 11309
bd81e77b
NC
11310The encoding is assumed to be an Encode object, on entry the PV
11311of the sv is assumed to be octets in that encoding, and the sv
11312will be converted into Unicode (and UTF-8).
1d7c1841 11313
bd81e77b
NC
11314If the sv already is UTF-8 (or if it is not POK), or if the encoding
11315is not a reference, nothing is done to the sv. If the encoding is not
11316an C<Encode::XS> Encoding object, bad things will happen.
11317(See F<lib/encoding.pm> and L<Encode>).
1d7c1841 11318
bd81e77b 11319The PV of the sv is returned.
1d7c1841 11320
bd81e77b 11321=cut */
1d7c1841 11322
bd81e77b
NC
11323char *
11324Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
11325{
11326 dVAR;
11327 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
11328 SV *uni;
11329 STRLEN len;
11330 const char *s;
11331 dSP;
11332 ENTER;
11333 SAVETMPS;
11334 save_re_context();
11335 PUSHMARK(sp);
11336 EXTEND(SP, 3);
11337 XPUSHs(encoding);
11338 XPUSHs(sv);
11339/*
11340 NI-S 2002/07/09
11341 Passing sv_yes is wrong - it needs to be or'ed set of constants
11342 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
11343 remove converted chars from source.
1d7c1841 11344
bd81e77b 11345 Both will default the value - let them.
1d7c1841 11346
bd81e77b
NC
11347 XPUSHs(&PL_sv_yes);
11348*/
11349 PUTBACK;
11350 call_method("decode", G_SCALAR);
11351 SPAGAIN;
11352 uni = POPs;
11353 PUTBACK;
11354 s = SvPV_const(uni, len);
11355 if (s != SvPVX_const(sv)) {
11356 SvGROW(sv, len + 1);
11357 Move(s, SvPVX(sv), len + 1, char);
11358 SvCUR_set(sv, len);
11359 }
11360 FREETMPS;
11361 LEAVE;
11362 SvUTF8_on(sv);
11363 return SvPVX(sv);
389edf32 11364 }
bd81e77b
NC
11365 return SvPOKp(sv) ? SvPVX(sv) : NULL;
11366}
1d7c1841 11367
bd81e77b
NC
11368/*
11369=for apidoc sv_cat_decode
1d7c1841 11370
bd81e77b
NC
11371The encoding is assumed to be an Encode object, the PV of the ssv is
11372assumed to be octets in that encoding and decoding the input starts
11373from the position which (PV + *offset) pointed to. The dsv will be
11374concatenated the decoded UTF-8 string from ssv. Decoding will terminate
11375when the string tstr appears in decoding output or the input ends on
11376the PV of the ssv. The value which the offset points will be modified
11377to the last input position on the ssv.
1d7c1841 11378
bd81e77b 11379Returns TRUE if the terminator was found, else returns FALSE.
1d7c1841 11380
bd81e77b
NC
11381=cut */
11382
11383bool
11384Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
11385 SV *ssv, int *offset, char *tstr, int tlen)
11386{
11387 dVAR;
11388 bool ret = FALSE;
11389 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
11390 SV *offsv;
11391 dSP;
11392 ENTER;
11393 SAVETMPS;
11394 save_re_context();
11395 PUSHMARK(sp);
11396 EXTEND(SP, 6);
11397 XPUSHs(encoding);
11398 XPUSHs(dsv);
11399 XPUSHs(ssv);
11400 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
11401 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
11402 PUTBACK;
11403 call_method("cat_decode", G_SCALAR);
11404 SPAGAIN;
11405 ret = SvTRUE(TOPs);
11406 *offset = SvIV(offsv);
11407 PUTBACK;
11408 FREETMPS;
11409 LEAVE;
389edf32 11410 }
bd81e77b
NC
11411 else
11412 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
11413 return ret;
1d7c1841 11414
bd81e77b 11415}
1d7c1841 11416
bd81e77b
NC
11417/* ---------------------------------------------------------------------
11418 *
11419 * support functions for report_uninit()
11420 */
1d7c1841 11421
bd81e77b
NC
11422/* the maxiumum size of array or hash where we will scan looking
11423 * for the undefined element that triggered the warning */
1d7c1841 11424
bd81e77b 11425#define FUV_MAX_SEARCH_SIZE 1000
1d7c1841 11426
bd81e77b
NC
11427/* Look for an entry in the hash whose value has the same SV as val;
11428 * If so, return a mortal copy of the key. */
1d7c1841 11429
bd81e77b
NC
11430STATIC SV*
11431S_find_hash_subscript(pTHX_ HV *hv, SV* val)
11432{
11433 dVAR;
11434 register HE **array;
11435 I32 i;
6c3182a5 11436
bd81e77b
NC
11437 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
11438 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
a0714e2c 11439 return NULL;
6c3182a5 11440
bd81e77b 11441 array = HvARRAY(hv);
6c3182a5 11442
bd81e77b
NC
11443 for (i=HvMAX(hv); i>0; i--) {
11444 register HE *entry;
11445 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
11446 if (HeVAL(entry) != val)
11447 continue;
11448 if ( HeVAL(entry) == &PL_sv_undef ||
11449 HeVAL(entry) == &PL_sv_placeholder)
11450 continue;
11451 if (!HeKEY(entry))
a0714e2c 11452 return NULL;
bd81e77b
NC
11453 if (HeKLEN(entry) == HEf_SVKEY)
11454 return sv_mortalcopy(HeKEY_sv(entry));
11455 return sv_2mortal(newSVpvn(HeKEY(entry), HeKLEN(entry)));
11456 }
11457 }
a0714e2c 11458 return NULL;
bd81e77b 11459}
6c3182a5 11460
bd81e77b
NC
11461/* Look for an entry in the array whose value has the same SV as val;
11462 * If so, return the index, otherwise return -1. */
6c3182a5 11463
bd81e77b
NC
11464STATIC I32
11465S_find_array_subscript(pTHX_ AV *av, SV* val)
11466{
97aff369 11467 dVAR;
bd81e77b
NC
11468 SV** svp;
11469 I32 i;
11470 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
11471 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
11472 return -1;
57c6e6d2 11473
bd81e77b
NC
11474 svp = AvARRAY(av);
11475 for (i=AvFILLp(av); i>=0; i--) {
11476 if (svp[i] == val && svp[i] != &PL_sv_undef)
11477 return i;
11478 }
11479 return -1;
11480}
15a5279a 11481
bd81e77b
NC
11482/* S_varname(): return the name of a variable, optionally with a subscript.
11483 * If gv is non-zero, use the name of that global, along with gvtype (one
11484 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
11485 * targ. Depending on the value of the subscript_type flag, return:
11486 */
bce260cd 11487
bd81e77b
NC
11488#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
11489#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
11490#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
11491#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
bce260cd 11492
bd81e77b
NC
11493STATIC SV*
11494S_varname(pTHX_ GV *gv, const char gvtype, PADOFFSET targ,
11495 SV* keyname, I32 aindex, int subscript_type)
11496{
1d7c1841 11497
bd81e77b
NC
11498 SV * const name = sv_newmortal();
11499 if (gv) {
11500 char buffer[2];
11501 buffer[0] = gvtype;
11502 buffer[1] = 0;
1d7c1841 11503
bd81e77b 11504 /* as gv_fullname4(), but add literal '^' for $^FOO names */
66fe0623 11505
bd81e77b 11506 gv_fullname4(name, gv, buffer, 0);
1d7c1841 11507
bd81e77b
NC
11508 if ((unsigned int)SvPVX(name)[1] <= 26) {
11509 buffer[0] = '^';
11510 buffer[1] = SvPVX(name)[1] + 'A' - 1;
1d7c1841 11511
bd81e77b
NC
11512 /* Swap the 1 unprintable control character for the 2 byte pretty
11513 version - ie substr($name, 1, 1) = $buffer; */
11514 sv_insert(name, 1, 1, buffer, 2);
1d7c1841 11515 }
bd81e77b
NC
11516 }
11517 else {
11518 U32 unused;
11519 CV * const cv = find_runcv(&unused);
11520 SV *sv;
11521 AV *av;
1d7c1841 11522
bd81e77b 11523 if (!cv || !CvPADLIST(cv))
a0714e2c 11524 return NULL;
bd81e77b
NC
11525 av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
11526 sv = *av_fetch(av, targ, FALSE);
11527 /* SvLEN in a pad name is not to be trusted */
11528 sv_setpv(name, SvPV_nolen_const(sv));
11529 }
1d7c1841 11530
bd81e77b 11531 if (subscript_type == FUV_SUBSCRIPT_HASH) {
561b68a9 11532 SV * const sv = newSV(0);
bd81e77b
NC
11533 *SvPVX(name) = '$';
11534 Perl_sv_catpvf(aTHX_ name, "{%s}",
11535 pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
11536 SvREFCNT_dec(sv);
11537 }
11538 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
11539 *SvPVX(name) = '$';
11540 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
11541 }
11542 else if (subscript_type == FUV_SUBSCRIPT_WITHIN)
89529cee 11543 Perl_sv_insert(aTHX_ name, 0, 0, STR_WITH_LEN("within "));
1d7c1841 11544
bd81e77b
NC
11545 return name;
11546}
1d7c1841 11547
1d7c1841 11548
bd81e77b
NC
11549/*
11550=for apidoc find_uninit_var
1d7c1841 11551
bd81e77b
NC
11552Find the name of the undefined variable (if any) that caused the operator o
11553to issue a "Use of uninitialized value" warning.
11554If match is true, only return a name if it's value matches uninit_sv.
11555So roughly speaking, if a unary operator (such as OP_COS) generates a
11556warning, then following the direct child of the op may yield an
11557OP_PADSV or OP_GV that gives the name of the undefined variable. On the
11558other hand, with OP_ADD there are two branches to follow, so we only print
11559the variable name if we get an exact match.
1d7c1841 11560
bd81e77b 11561The name is returned as a mortal SV.
1d7c1841 11562
bd81e77b
NC
11563Assumes that PL_op is the op that originally triggered the error, and that
11564PL_comppad/PL_curpad points to the currently executing pad.
1d7c1841 11565
bd81e77b
NC
11566=cut
11567*/
1d7c1841 11568
bd81e77b
NC
11569STATIC SV *
11570S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
11571{
11572 dVAR;
11573 SV *sv;
11574 AV *av;
11575 GV *gv;
11576 OP *o, *o2, *kid;
1d7c1841 11577
bd81e77b
NC
11578 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
11579 uninit_sv == &PL_sv_placeholder)))
a0714e2c 11580 return NULL;
1d7c1841 11581
bd81e77b 11582 switch (obase->op_type) {
1d7c1841 11583
bd81e77b
NC
11584 case OP_RV2AV:
11585 case OP_RV2HV:
11586 case OP_PADAV:
11587 case OP_PADHV:
11588 {
11589 const bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
11590 const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
11591 I32 index = 0;
a0714e2c 11592 SV *keysv = NULL;
bd81e77b 11593 int subscript_type = FUV_SUBSCRIPT_WITHIN;
1d7c1841 11594
bd81e77b
NC
11595 if (pad) { /* @lex, %lex */
11596 sv = PAD_SVl(obase->op_targ);
a0714e2c 11597 gv = NULL;
bd81e77b
NC
11598 }
11599 else {
11600 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
11601 /* @global, %global */
11602 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
11603 if (!gv)
11604 break;
11605 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
11606 }
11607 else /* @{expr}, %{expr} */
11608 return find_uninit_var(cUNOPx(obase)->op_first,
11609 uninit_sv, match);
11610 }
1d7c1841 11611
bd81e77b
NC
11612 /* attempt to find a match within the aggregate */
11613 if (hash) {
11614 keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
11615 if (keysv)
11616 subscript_type = FUV_SUBSCRIPT_HASH;
11617 }
11618 else {
11619 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
11620 if (index >= 0)
11621 subscript_type = FUV_SUBSCRIPT_ARRAY;
11622 }
1d7c1841 11623
bd81e77b
NC
11624 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
11625 break;
1d7c1841 11626
bd81e77b
NC
11627 return varname(gv, hash ? '%' : '@', obase->op_targ,
11628 keysv, index, subscript_type);
11629 }
1d7c1841 11630
bd81e77b
NC
11631 case OP_PADSV:
11632 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
11633 break;
a0714e2c
SS
11634 return varname(NULL, '$', obase->op_targ,
11635 NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 11636
bd81e77b
NC
11637 case OP_GVSV:
11638 gv = cGVOPx_gv(obase);
11639 if (!gv || (match && GvSV(gv) != uninit_sv))
11640 break;
a0714e2c 11641 return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 11642
bd81e77b
NC
11643 case OP_AELEMFAST:
11644 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
11645 if (match) {
11646 SV **svp;
11647 av = (AV*)PAD_SV(obase->op_targ);
11648 if (!av || SvRMAGICAL(av))
11649 break;
11650 svp = av_fetch(av, (I32)obase->op_private, FALSE);
11651 if (!svp || *svp != uninit_sv)
11652 break;
11653 }
a0714e2c
SS
11654 return varname(NULL, '$', obase->op_targ,
11655 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11656 }
11657 else {
11658 gv = cGVOPx_gv(obase);
11659 if (!gv)
11660 break;
11661 if (match) {
11662 SV **svp;
11663 av = GvAV(gv);
11664 if (!av || SvRMAGICAL(av))
11665 break;
11666 svp = av_fetch(av, (I32)obase->op_private, FALSE);
11667 if (!svp || *svp != uninit_sv)
11668 break;
11669 }
11670 return varname(gv, '$', 0,
a0714e2c 11671 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11672 }
11673 break;
1d7c1841 11674
bd81e77b
NC
11675 case OP_EXISTS:
11676 o = cUNOPx(obase)->op_first;
11677 if (!o || o->op_type != OP_NULL ||
11678 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
11679 break;
11680 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
a2efc822 11681
bd81e77b
NC
11682 case OP_AELEM:
11683 case OP_HELEM:
11684 if (PL_op == obase)
11685 /* $a[uninit_expr] or $h{uninit_expr} */
11686 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
081fc587 11687
a0714e2c 11688 gv = NULL;
bd81e77b
NC
11689 o = cBINOPx(obase)->op_first;
11690 kid = cBINOPx(obase)->op_last;
8cf8f3d1 11691
bd81e77b 11692 /* get the av or hv, and optionally the gv */
a0714e2c 11693 sv = NULL;
bd81e77b
NC
11694 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
11695 sv = PAD_SV(o->op_targ);
11696 }
11697 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
11698 && cUNOPo->op_first->op_type == OP_GV)
11699 {
11700 gv = cGVOPx_gv(cUNOPo->op_first);
11701 if (!gv)
11702 break;
11703 sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
11704 }
11705 if (!sv)
11706 break;
11707
11708 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
11709 /* index is constant */
11710 if (match) {
11711 if (SvMAGICAL(sv))
11712 break;
11713 if (obase->op_type == OP_HELEM) {
11714 HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
11715 if (!he || HeVAL(he) != uninit_sv)
11716 break;
11717 }
11718 else {
00b6aa41 11719 SV * const * const svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
bd81e77b
NC
11720 if (!svp || *svp != uninit_sv)
11721 break;
11722 }
11723 }
11724 if (obase->op_type == OP_HELEM)
11725 return varname(gv, '%', o->op_targ,
11726 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
11727 else
a0714e2c 11728 return varname(gv, '@', o->op_targ, NULL,
bd81e77b 11729 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11730 }
11731 else {
11732 /* index is an expression;
11733 * attempt to find a match within the aggregate */
11734 if (obase->op_type == OP_HELEM) {
11735 SV * const keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
11736 if (keysv)
11737 return varname(gv, '%', o->op_targ,
11738 keysv, 0, FUV_SUBSCRIPT_HASH);
11739 }
11740 else {
11741 const I32 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
11742 if (index >= 0)
11743 return varname(gv, '@', o->op_targ,
a0714e2c 11744 NULL, index, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11745 }
11746 if (match)
11747 break;
11748 return varname(gv,
11749 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
11750 ? '@' : '%',
a0714e2c 11751 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
f284b03f 11752 }
bd81e77b 11753 break;
dc507217 11754
bd81e77b
NC
11755 case OP_AASSIGN:
11756 /* only examine RHS */
11757 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
6d26897e 11758
bd81e77b
NC
11759 case OP_OPEN:
11760 o = cUNOPx(obase)->op_first;
11761 if (o->op_type == OP_PUSHMARK)
11762 o = o->op_sibling;
1d7c1841 11763
bd81e77b
NC
11764 if (!o->op_sibling) {
11765 /* one-arg version of open is highly magical */
a0ae6670 11766
bd81e77b
NC
11767 if (o->op_type == OP_GV) { /* open FOO; */
11768 gv = cGVOPx_gv(o);
11769 if (match && GvSV(gv) != uninit_sv)
11770 break;
11771 return varname(gv, '$', 0,
a0714e2c 11772 NULL, 0, FUV_SUBSCRIPT_NONE);
bd81e77b
NC
11773 }
11774 /* other possibilities not handled are:
11775 * open $x; or open my $x; should return '${*$x}'
11776 * open expr; should return '$'.expr ideally
11777 */
11778 break;
11779 }
11780 goto do_op;
ccfc67b7 11781
bd81e77b
NC
11782 /* ops where $_ may be an implicit arg */
11783 case OP_TRANS:
11784 case OP_SUBST:
11785 case OP_MATCH:
11786 if ( !(obase->op_flags & OPf_STACKED)) {
11787 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
11788 ? PAD_SVl(obase->op_targ)
11789 : DEFSV))
11790 {
11791 sv = sv_newmortal();
11792 sv_setpvn(sv, "$_", 2);
11793 return sv;
11794 }
11795 }
11796 goto do_op;
9f4817db 11797
bd81e77b
NC
11798 case OP_PRTF:
11799 case OP_PRINT:
11800 /* skip filehandle as it can't produce 'undef' warning */
11801 o = cUNOPx(obase)->op_first;
11802 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
11803 o = o->op_sibling->op_sibling;
11804 goto do_op2;
9f4817db 11805
9f4817db 11806
bd81e77b
NC
11807 case OP_RV2SV:
11808 case OP_CUSTOM:
11809 case OP_ENTERSUB:
11810 match = 1; /* XS or custom code could trigger random warnings */
11811 goto do_op;
9f4817db 11812
bd81e77b
NC
11813 case OP_SCHOMP:
11814 case OP_CHOMP:
11815 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
396482e1 11816 return sv_2mortal(newSVpvs("${$/}"));
5f66b61c 11817 /*FALLTHROUGH*/
5d170f3a 11818
bd81e77b
NC
11819 default:
11820 do_op:
11821 if (!(obase->op_flags & OPf_KIDS))
11822 break;
11823 o = cUNOPx(obase)->op_first;
11824
11825 do_op2:
11826 if (!o)
11827 break;
f9893866 11828
bd81e77b
NC
11829 /* if all except one arg are constant, or have no side-effects,
11830 * or are optimized away, then it's unambiguous */
5f66b61c 11831 o2 = NULL;
bd81e77b
NC
11832 for (kid=o; kid; kid = kid->op_sibling) {
11833 if (kid &&
11834 ( (kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid)))
11835 || (kid->op_type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
11836 || (kid->op_type == OP_PUSHMARK)
11837 )
11838 )
11839 continue;
11840 if (o2) { /* more than one found */
5f66b61c 11841 o2 = NULL;
bd81e77b
NC
11842 break;
11843 }
11844 o2 = kid;
11845 }
11846 if (o2)
11847 return find_uninit_var(o2, uninit_sv, match);
7a5fa8a2 11848
bd81e77b
NC
11849 /* scan all args */
11850 while (o) {
11851 sv = find_uninit_var(o, uninit_sv, 1);
11852 if (sv)
11853 return sv;
11854 o = o->op_sibling;
d0063567 11855 }
bd81e77b 11856 break;
f9893866 11857 }
a0714e2c 11858 return NULL;
9f4817db
JH
11859}
11860
220e2d4e 11861
bd81e77b
NC
11862/*
11863=for apidoc report_uninit
68795e93 11864
bd81e77b 11865Print appropriate "Use of uninitialized variable" warning
220e2d4e 11866
bd81e77b
NC
11867=cut
11868*/
220e2d4e 11869
bd81e77b
NC
11870void
11871Perl_report_uninit(pTHX_ SV* uninit_sv)
220e2d4e 11872{
97aff369 11873 dVAR;
bd81e77b 11874 if (PL_op) {
a0714e2c 11875 SV* varname = NULL;
bd81e77b
NC
11876 if (uninit_sv) {
11877 varname = find_uninit_var(PL_op, uninit_sv,0);
11878 if (varname)
11879 sv_insert(varname, 0, 0, " ", 1);
11880 }
11881 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
11882 varname ? SvPV_nolen_const(varname) : "",
11883 " in ", OP_DESC(PL_op));
220e2d4e 11884 }
a73e8557 11885 else
bd81e77b
NC
11886 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
11887 "", "", "");
220e2d4e 11888}
f9893866 11889
241d1a3b
NC
11890/*
11891 * Local variables:
11892 * c-indentation-style: bsd
11893 * c-basic-offset: 4
11894 * indent-tabs-mode: t
11895 * End:
11896 *
37442d52
RGS
11897 * ex: set ts=8 sts=4 sw=4 noet:
11898 */