This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
clean up loops in doio.c and dump.c
[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 32#ifdef PERL_UTF8_CACHE_ASSERT
ab455f60 33/* if adding more checks watch out for the following tests:
e23c8137
JH
34 * t/op/index.t t/op/length.t t/op/pat.t t/op/substr.t
35 * lib/utf8.t lib/Unicode/Collate/t/index.t
36 * --jhi
37 */
6f207bd3 38# define ASSERT_UTF8_CACHE(cache) \
ab455f60
NC
39 STMT_START { if (cache) { assert((cache)[0] <= (cache)[1]); \
40 assert((cache)[2] <= (cache)[3]); \
41 assert((cache)[3] <= (cache)[1]);} \
42 } STMT_END
e23c8137 43#else
6f207bd3 44# define ASSERT_UTF8_CACHE(cache) NOOP
e23c8137
JH
45#endif
46
f8c7b90f 47#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 48#define SV_COW_NEXT_SV(sv) INT2PTR(SV *,SvUVX(sv))
607fa7f2 49#define SV_COW_NEXT_SV_SET(current,next) SvUV_set(current, PTR2UV(next))
b5ccf5f2 50/* This is a pessimistic view. Scalar must be purely a read-write PV to copy-
765f542d 51 on-write. */
765f542d 52#endif
645c22ef
DM
53
54/* ============================================================================
55
56=head1 Allocation and deallocation of SVs.
57
d2a0f284
JC
58An SV (or AV, HV, etc.) is allocated in two parts: the head (struct
59sv, av, hv...) contains type and reference count information, and for
60many types, a pointer to the body (struct xrv, xpv, xpviv...), which
61contains fields specific to each type. Some types store all they need
62in the head, so don't have a body.
63
64In all but the most memory-paranoid configuations (ex: PURIFY), heads
65and bodies are allocated out of arenas, which by default are
66approximately 4K chunks of memory parcelled up into N heads or bodies.
93e68bfb
JC
67Sv-bodies are allocated by their sv-type, guaranteeing size
68consistency needed to allocate safely from arrays.
69
d2a0f284
JC
70For SV-heads, the first slot in each arena is reserved, and holds a
71link to the next arena, some flags, and a note of the number of slots.
72Snaked through each arena chain is a linked list of free items; when
73this becomes empty, an extra arena is allocated and divided up into N
74items which are threaded into the free list.
75
76SV-bodies are similar, but they use arena-sets by default, which
77separate the link and info from the arena itself, and reclaim the 1st
78slot in the arena. SV-bodies are further described later.
645c22ef
DM
79
80The following global variables are associated with arenas:
81
82 PL_sv_arenaroot pointer to list of SV arenas
83 PL_sv_root pointer to list of free SV structures
84
d2a0f284
JC
85 PL_body_arenas head of linked-list of body arenas
86 PL_body_roots[] array of pointers to list of free bodies of svtype
87 arrays are indexed by the svtype needed
93e68bfb 88
d2a0f284
JC
89A few special SV heads are not allocated from an arena, but are
90instead directly created in the interpreter structure, eg PL_sv_undef.
93e68bfb
JC
91The size of arenas can be changed from the default by setting
92PERL_ARENA_SIZE appropriately at compile time.
645c22ef
DM
93
94The SV arena serves the secondary purpose of allowing still-live SVs
95to be located and destroyed during final cleanup.
96
97At the lowest level, the macros new_SV() and del_SV() grab and free
98an SV head. (If debugging with -DD, del_SV() calls the function S_del_sv()
99to return the SV to the free list with error checking.) new_SV() calls
100more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
101SVs in the free list have their SvTYPE field set to all ones.
102
ff276b08 103At the time of very final cleanup, sv_free_arenas() is called from
645c22ef 104perl_destruct() to physically free all the arenas allocated since the
6a93a7e5 105start of the interpreter.
645c22ef
DM
106
107Manipulation of any of the PL_*root pointers is protected by enclosing
108LOCK_SV_MUTEX; ... UNLOCK_SV_MUTEX calls which should Do the Right Thing
109if threads are enabled.
110
111The function visit() scans the SV arenas list, and calls a specified
112function for each SV it finds which is still live - ie which has an SvTYPE
113other than all 1's, and a non-zero SvREFCNT. visit() is used by the
114following functions (specified as [function that calls visit()] / [function
115called by visit() for each SV]):
116
117 sv_report_used() / do_report_used()
f2524eef 118 dump all remaining SVs (debugging aid)
645c22ef
DM
119
120 sv_clean_objs() / do_clean_objs(),do_clean_named_objs()
121 Attempt to free all objects pointed to by RVs,
122 and, unless DISABLE_DESTRUCTOR_KLUDGE is defined,
123 try to do the same for all objects indirectly
124 referenced by typeglobs too. Called once from
125 perl_destruct(), prior to calling sv_clean_all()
126 below.
127
128 sv_clean_all() / do_clean_all()
129 SvREFCNT_dec(sv) each remaining SV, possibly
130 triggering an sv_free(). It also sets the
131 SVf_BREAK flag on the SV to indicate that the
132 refcnt has been artificially lowered, and thus
133 stopping sv_free() from giving spurious warnings
134 about SVs which unexpectedly have a refcnt
135 of zero. called repeatedly from perl_destruct()
136 until there are no SVs left.
137
93e68bfb 138=head2 Arena allocator API Summary
645c22ef
DM
139
140Private API to rest of sv.c
141
142 new_SV(), del_SV(),
143
144 new_XIV(), del_XIV(),
145 new_XNV(), del_XNV(),
146 etc
147
148Public API:
149
8cf8f3d1 150 sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
645c22ef 151
645c22ef
DM
152=cut
153
154============================================================================ */
155
4561caa4
CS
156/*
157 * "A time to plant, and a time to uproot what was planted..."
158 */
159
77354fb4
NC
160/*
161 * nice_chunk and nice_chunk size need to be set
162 * and queried under the protection of sv_mutex
163 */
164void
165Perl_offer_nice_chunk(pTHX_ void *chunk, U32 chunk_size)
166{
97aff369 167 dVAR;
77354fb4
NC
168 void *new_chunk;
169 U32 new_chunk_size;
170 LOCK_SV_MUTEX;
171 new_chunk = (void *)(chunk);
172 new_chunk_size = (chunk_size);
173 if (new_chunk_size > PL_nice_chunk_size) {
174 Safefree(PL_nice_chunk);
175 PL_nice_chunk = (char *) new_chunk;
176 PL_nice_chunk_size = new_chunk_size;
177 } else {
178 Safefree(chunk);
179 }
180 UNLOCK_SV_MUTEX;
181}
cac9b346 182
fd0854ff 183#ifdef DEBUG_LEAKING_SCALARS
22162ca8 184# define FREE_SV_DEBUG_FILE(sv) Safefree((sv)->sv_debug_file)
fd0854ff
DM
185#else
186# define FREE_SV_DEBUG_FILE(sv)
187#endif
188
48614a46
NC
189#ifdef PERL_POISON
190# define SvARENA_CHAIN(sv) ((sv)->sv_u.svu_rv)
191/* Whilst I'd love to do this, it seems that things like to check on
192 unreferenced scalars
7e337ee0 193# define POSION_SV_HEAD(sv) PoisonNew(sv, 1, struct STRUCT_SV)
48614a46 194*/
7e337ee0
JH
195# define POSION_SV_HEAD(sv) PoisonNew(&SvANY(sv), 1, void *), \
196 PoisonNew(&SvREFCNT(sv), 1, U32)
48614a46
NC
197#else
198# define SvARENA_CHAIN(sv) SvANY(sv)
199# define POSION_SV_HEAD(sv)
200#endif
201
053fc874
GS
202#define plant_SV(p) \
203 STMT_START { \
fd0854ff 204 FREE_SV_DEBUG_FILE(p); \
48614a46
NC
205 POSION_SV_HEAD(p); \
206 SvARENA_CHAIN(p) = (void *)PL_sv_root; \
053fc874
GS
207 SvFLAGS(p) = SVTYPEMASK; \
208 PL_sv_root = (p); \
209 --PL_sv_count; \
210 } STMT_END
a0d0e21e 211
fba3b22e 212/* sv_mutex must be held while calling uproot_SV() */
053fc874
GS
213#define uproot_SV(p) \
214 STMT_START { \
215 (p) = PL_sv_root; \
bb7bbd9c 216 PL_sv_root = (SV*)SvARENA_CHAIN(p); \
053fc874
GS
217 ++PL_sv_count; \
218 } STMT_END
219
645c22ef 220
cac9b346
NC
221/* make some more SVs by adding another arena */
222
223/* sv_mutex must be held while calling more_sv() */
224STATIC SV*
225S_more_sv(pTHX)
226{
97aff369 227 dVAR;
cac9b346
NC
228 SV* sv;
229
230 if (PL_nice_chunk) {
231 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
bd61b366 232 PL_nice_chunk = NULL;
cac9b346
NC
233 PL_nice_chunk_size = 0;
234 }
235 else {
236 char *chunk; /* must use New here to match call to */
d2a0f284 237 Newx(chunk,PERL_ARENA_SIZE,char); /* Safefree() in sv_free_arenas() */
2e7ed132 238 sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
cac9b346
NC
239 }
240 uproot_SV(sv);
241 return sv;
242}
243
645c22ef
DM
244/* new_SV(): return a new, empty SV head */
245
eba0f806
DM
246#ifdef DEBUG_LEAKING_SCALARS
247/* provide a real function for a debugger to play with */
248STATIC SV*
249S_new_SV(pTHX)
250{
251 SV* sv;
252
253 LOCK_SV_MUTEX;
254 if (PL_sv_root)
255 uproot_SV(sv);
256 else
cac9b346 257 sv = S_more_sv(aTHX);
eba0f806
DM
258 UNLOCK_SV_MUTEX;
259 SvANY(sv) = 0;
260 SvREFCNT(sv) = 1;
261 SvFLAGS(sv) = 0;
fd0854ff
DM
262 sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
263 sv->sv_debug_line = (U16) ((PL_copline == NOLINE) ?
264 (PL_curcop ? CopLINE(PL_curcop) : 0) : PL_copline);
265 sv->sv_debug_inpad = 0;
266 sv->sv_debug_cloned = 0;
fd0854ff 267 sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
fd0854ff 268
eba0f806
DM
269 return sv;
270}
271# define new_SV(p) (p)=S_new_SV(aTHX)
272
273#else
274# define new_SV(p) \
053fc874
GS
275 STMT_START { \
276 LOCK_SV_MUTEX; \
277 if (PL_sv_root) \
278 uproot_SV(p); \
279 else \
cac9b346 280 (p) = S_more_sv(aTHX); \
053fc874
GS
281 UNLOCK_SV_MUTEX; \
282 SvANY(p) = 0; \
283 SvREFCNT(p) = 1; \
284 SvFLAGS(p) = 0; \
285 } STMT_END
eba0f806 286#endif
463ee0b2 287
645c22ef
DM
288
289/* del_SV(): return an empty SV head to the free list */
290
a0d0e21e 291#ifdef DEBUGGING
4561caa4 292
053fc874
GS
293#define del_SV(p) \
294 STMT_START { \
295 LOCK_SV_MUTEX; \
aea4f609 296 if (DEBUG_D_TEST) \
053fc874
GS
297 del_sv(p); \
298 else \
299 plant_SV(p); \
300 UNLOCK_SV_MUTEX; \
301 } STMT_END
a0d0e21e 302
76e3520e 303STATIC void
cea2e8a9 304S_del_sv(pTHX_ SV *p)
463ee0b2 305{
97aff369 306 dVAR;
aea4f609 307 if (DEBUG_D_TEST) {
4633a7c4 308 SV* sva;
a3b680e6 309 bool ok = 0;
3280af22 310 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
53c1dcc0
AL
311 const SV * const sv = sva + 1;
312 const SV * const svend = &sva[SvREFCNT(sva)];
c0ff570e 313 if (p >= sv && p < svend) {
a0d0e21e 314 ok = 1;
c0ff570e
NC
315 break;
316 }
a0d0e21e
LW
317 }
318 if (!ok) {
0453d815 319 if (ckWARN_d(WARN_INTERNAL))
9014280d 320 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
321 "Attempt to free non-arena SV: 0x%"UVxf
322 pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
a0d0e21e
LW
323 return;
324 }
325 }
4561caa4 326 plant_SV(p);
463ee0b2 327}
a0d0e21e 328
4561caa4
CS
329#else /* ! DEBUGGING */
330
331#define del_SV(p) plant_SV(p)
332
333#endif /* DEBUGGING */
463ee0b2 334
645c22ef
DM
335
336/*
ccfc67b7
JH
337=head1 SV Manipulation Functions
338
645c22ef
DM
339=for apidoc sv_add_arena
340
341Given a chunk of memory, link it to the head of the list of arenas,
342and split it into a list of free SVs.
343
344=cut
345*/
346
4633a7c4 347void
864dbfa3 348Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
463ee0b2 349{
97aff369 350 dVAR;
0bd48802 351 SV* const sva = (SV*)ptr;
463ee0b2
LW
352 register SV* sv;
353 register SV* svend;
4633a7c4
LW
354
355 /* The first SV in an arena isn't an SV. */
3280af22 356 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
357 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
358 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
359
3280af22
NIS
360 PL_sv_arenaroot = sva;
361 PL_sv_root = sva + 1;
4633a7c4
LW
362
363 svend = &sva[SvREFCNT(sva) - 1];
364 sv = sva + 1;
463ee0b2 365 while (sv < svend) {
48614a46 366 SvARENA_CHAIN(sv) = (void *)(SV*)(sv + 1);
03e36789 367#ifdef DEBUGGING
978b032e 368 SvREFCNT(sv) = 0;
03e36789
NC
369#endif
370 /* Must always set typemask because it's awlays checked in on cleanup
371 when the arenas are walked looking for objects. */
8990e307 372 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
373 sv++;
374 }
48614a46 375 SvARENA_CHAIN(sv) = 0;
03e36789
NC
376#ifdef DEBUGGING
377 SvREFCNT(sv) = 0;
378#endif
4633a7c4
LW
379 SvFLAGS(sv) = SVTYPEMASK;
380}
381
055972dc
DM
382/* visit(): call the named function for each non-free SV in the arenas
383 * whose flags field matches the flags/mask args. */
645c22ef 384
5226ed68 385STATIC I32
055972dc 386S_visit(pTHX_ SVFUNC_t f, U32 flags, U32 mask)
8990e307 387{
97aff369 388 dVAR;
4633a7c4 389 SV* sva;
5226ed68 390 I32 visited = 0;
8990e307 391
3280af22 392 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
53c1dcc0 393 register const SV * const svend = &sva[SvREFCNT(sva)];
a3b680e6 394 register SV* sv;
4561caa4 395 for (sv = sva + 1; sv < svend; ++sv) {
055972dc
DM
396 if (SvTYPE(sv) != SVTYPEMASK
397 && (sv->sv_flags & mask) == flags
398 && SvREFCNT(sv))
399 {
acfe0abc 400 (FCALL)(aTHX_ sv);
5226ed68
JH
401 ++visited;
402 }
8990e307
LW
403 }
404 }
5226ed68 405 return visited;
8990e307
LW
406}
407
758a08c3
JH
408#ifdef DEBUGGING
409
645c22ef
DM
410/* called by sv_report_used() for each live SV */
411
412static void
acfe0abc 413do_report_used(pTHX_ SV *sv)
645c22ef
DM
414{
415 if (SvTYPE(sv) != SVTYPEMASK) {
416 PerlIO_printf(Perl_debug_log, "****\n");
417 sv_dump(sv);
418 }
419}
758a08c3 420#endif
645c22ef
DM
421
422/*
423=for apidoc sv_report_used
424
425Dump the contents of all SVs not yet freed. (Debugging aid).
426
427=cut
428*/
429
8990e307 430void
864dbfa3 431Perl_sv_report_used(pTHX)
4561caa4 432{
ff270d3a 433#ifdef DEBUGGING
055972dc 434 visit(do_report_used, 0, 0);
96a5add6
AL
435#else
436 PERL_UNUSED_CONTEXT;
ff270d3a 437#endif
4561caa4
CS
438}
439
645c22ef
DM
440/* called by sv_clean_objs() for each live SV */
441
442static void
e15faf7d 443do_clean_objs(pTHX_ SV *ref)
645c22ef 444{
97aff369 445 dVAR;
823a54a3
AL
446 if (SvROK(ref)) {
447 SV * const target = SvRV(ref);
448 if (SvOBJECT(target)) {
449 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(ref)));
450 if (SvWEAKREF(ref)) {
451 sv_del_backref(target, ref);
452 SvWEAKREF_off(ref);
453 SvRV_set(ref, NULL);
454 } else {
455 SvROK_off(ref);
456 SvRV_set(ref, NULL);
457 SvREFCNT_dec(target);
458 }
645c22ef
DM
459 }
460 }
461
462 /* XXX Might want to check arrays, etc. */
463}
464
465/* called by sv_clean_objs() for each live SV */
466
467#ifndef DISABLE_DESTRUCTOR_KLUDGE
468static void
acfe0abc 469do_clean_named_objs(pTHX_ SV *sv)
645c22ef 470{
97aff369 471 dVAR;
f7877b28 472 if (SvTYPE(sv) == SVt_PVGV && isGV_with_GP(sv) && GvGP(sv)) {
c69033f2
NC
473 if ((
474#ifdef PERL_DONT_CREATE_GVSV
475 GvSV(sv) &&
476#endif
477 SvOBJECT(GvSV(sv))) ||
645c22ef
DM
478 (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
479 (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
480 (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
481 (GvCV(sv) && SvOBJECT(GvCV(sv))) )
482 {
483 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
ec5f3c78 484 SvFLAGS(sv) |= SVf_BREAK;
645c22ef
DM
485 SvREFCNT_dec(sv);
486 }
487 }
488}
489#endif
490
491/*
492=for apidoc sv_clean_objs
493
494Attempt to destroy all objects not yet freed
495
496=cut
497*/
498
4561caa4 499void
864dbfa3 500Perl_sv_clean_objs(pTHX)
4561caa4 501{
97aff369 502 dVAR;
3280af22 503 PL_in_clean_objs = TRUE;
055972dc 504 visit(do_clean_objs, SVf_ROK, SVf_ROK);
4561caa4 505#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 506 /* some barnacles may yet remain, clinging to typeglobs */
055972dc 507 visit(do_clean_named_objs, SVt_PVGV, SVTYPEMASK);
4561caa4 508#endif
3280af22 509 PL_in_clean_objs = FALSE;
4561caa4
CS
510}
511
645c22ef
DM
512/* called by sv_clean_all() for each live SV */
513
514static void
acfe0abc 515do_clean_all(pTHX_ SV *sv)
645c22ef 516{
97aff369 517 dVAR;
645c22ef
DM
518 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
519 SvFLAGS(sv) |= SVf_BREAK;
0e705b3b 520 if (PL_comppad == (AV*)sv) {
7d49f689 521 PL_comppad = NULL;
4608196e 522 PL_curpad = NULL;
0e705b3b 523 }
645c22ef
DM
524 SvREFCNT_dec(sv);
525}
526
527/*
528=for apidoc sv_clean_all
529
530Decrement the refcnt of each remaining SV, possibly triggering a
531cleanup. This function may have to be called multiple times to free
ff276b08 532SVs which are in complex self-referential hierarchies.
645c22ef
DM
533
534=cut
535*/
536
5226ed68 537I32
864dbfa3 538Perl_sv_clean_all(pTHX)
8990e307 539{
97aff369 540 dVAR;
5226ed68 541 I32 cleaned;
3280af22 542 PL_in_clean_all = TRUE;
055972dc 543 cleaned = visit(do_clean_all, 0,0);
3280af22 544 PL_in_clean_all = FALSE;
5226ed68 545 return cleaned;
8990e307 546}
463ee0b2 547
5e258f8c
JC
548/*
549 ARENASETS: a meta-arena implementation which separates arena-info
550 into struct arena_set, which contains an array of struct
551 arena_descs, each holding info for a single arena. By separating
552 the meta-info from the arena, we recover the 1st slot, formerly
553 borrowed for list management. The arena_set is about the size of an
554 arena, avoiding the needless malloc overhead of a naive linked-list
555
556 The cost is 1 arena-set malloc per ~320 arena-mallocs, + the unused
557 memory in the last arena-set (1/2 on average). In trade, we get
558 back the 1st slot in each arena (ie 1.7% of a CV-arena, less for
d2a0f284
JC
559 smaller types). The recovery of the wasted space allows use of
560 small arenas for large, rare body types,
5e258f8c 561*/
5e258f8c 562struct arena_desc {
398c677b
NC
563 char *arena; /* the raw storage, allocated aligned */
564 size_t size; /* its size ~4k typ */
565 int unit_type; /* useful for arena audits */
5e258f8c
JC
566 /* info for sv-heads (eventually)
567 int count, flags;
568 */
569};
570
e6148039
NC
571struct arena_set;
572
573/* Get the maximum number of elements in set[] such that struct arena_set
574 will fit within PERL_ARENA_SIZE, which is probabably just under 4K, and
575 therefore likely to be 1 aligned memory page. */
576
577#define ARENAS_PER_SET ((PERL_ARENA_SIZE - sizeof(struct arena_set*) \
578 - 2 * sizeof(int)) / sizeof (struct arena_desc))
5e258f8c
JC
579
580struct arena_set {
581 struct arena_set* next;
582 int set_size; /* ie ARENAS_PER_SET */
583 int curr; /* index of next available arena-desc */
584 struct arena_desc set[ARENAS_PER_SET];
585};
586
645c22ef
DM
587/*
588=for apidoc sv_free_arenas
589
590Deallocate the memory used by all arenas. Note that all the individual SV
591heads and bodies within the arenas must already have been freed.
592
593=cut
594*/
4633a7c4 595void
864dbfa3 596Perl_sv_free_arenas(pTHX)
4633a7c4 597{
97aff369 598 dVAR;
4633a7c4
LW
599 SV* sva;
600 SV* svanext;
93e68bfb 601 int i;
4633a7c4
LW
602
603 /* Free arenas here, but be careful about fake ones. (We assume
604 contiguity of the fake ones with the corresponding real ones.) */
605
3280af22 606 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
607 svanext = (SV*) SvANY(sva);
608 while (svanext && SvFAKE(svanext))
609 svanext = (SV*) SvANY(svanext);
610
611 if (!SvFAKE(sva))
1df70142 612 Safefree(sva);
4633a7c4 613 }
93e68bfb 614
5e258f8c
JC
615 {
616 struct arena_set *next, *aroot = (struct arena_set*) PL_body_arenas;
617
618 for (; aroot; aroot = next) {
96a5add6 619 const int max = aroot->curr;
5e258f8c
JC
620 for (i=0; i<max; i++) {
621 assert(aroot->set[i].arena);
622 Safefree(aroot->set[i].arena);
623 }
624 next = aroot->next;
625 Safefree(aroot);
626 }
627 }
dc8220bf 628 PL_body_arenas = 0;
fdda85ca 629
232d1c15 630 for (i=0; i<PERL_ARENA_ROOTS_SIZE; i++)
93e68bfb 631 PL_body_roots[i] = 0;
93e68bfb 632
43c5f42d 633 Safefree(PL_nice_chunk);
bd61b366 634 PL_nice_chunk = NULL;
3280af22
NIS
635 PL_nice_chunk_size = 0;
636 PL_sv_arenaroot = 0;
637 PL_sv_root = 0;
4633a7c4
LW
638}
639
bd81e77b
NC
640/*
641 Here are mid-level routines that manage the allocation of bodies out
642 of the various arenas. There are 5 kinds of arenas:
29489e7c 643
bd81e77b
NC
644 1. SV-head arenas, which are discussed and handled above
645 2. regular body arenas
646 3. arenas for reduced-size bodies
647 4. Hash-Entry arenas
648 5. pte arenas (thread related)
29489e7c 649
bd81e77b
NC
650 Arena types 2 & 3 are chained by body-type off an array of
651 arena-root pointers, which is indexed by svtype. Some of the
652 larger/less used body types are malloced singly, since a large
653 unused block of them is wasteful. Also, several svtypes dont have
654 bodies; the data fits into the sv-head itself. The arena-root
655 pointer thus has a few unused root-pointers (which may be hijacked
656 later for arena types 4,5)
29489e7c 657
bd81e77b
NC
658 3 differs from 2 as an optimization; some body types have several
659 unused fields in the front of the structure (which are kept in-place
660 for consistency). These bodies can be allocated in smaller chunks,
661 because the leading fields arent accessed. Pointers to such bodies
662 are decremented to point at the unused 'ghost' memory, knowing that
663 the pointers are used with offsets to the real memory.
29489e7c 664
bd81e77b
NC
665 HE, HEK arenas are managed separately, with separate code, but may
666 be merge-able later..
667
668 PTE arenas are not sv-bodies, but they share these mid-level
669 mechanics, so are considered here. The new mid-level mechanics rely
670 on the sv_type of the body being allocated, so we just reserve one
671 of the unused body-slots for PTEs, then use it in those (2) PTE
672 contexts below (line ~10k)
673*/
674
bd26d9a3 675/* get_arena(size): this creates custom-sized arenas
5e258f8c
JC
676 TBD: export properly for hv.c: S_more_he().
677*/
678void*
679Perl_get_arena(pTHX_ int arena_size)
680{
7a89be66 681 dVAR;
5e258f8c 682 struct arena_desc* adesc;
476a1e16 683 struct arena_set *newroot, **aroot = (struct arena_set**) &PL_body_arenas;
5e258f8c
JC
684 int curr;
685
476a1e16
JC
686 /* shouldnt need this
687 if (!arena_size) arena_size = PERL_ARENA_SIZE;
688 */
5e258f8c
JC
689
690 /* may need new arena-set to hold new arena */
476a1e16 691 if (!*aroot || (*aroot)->curr >= (*aroot)->set_size) {
5e258f8c
JC
692 Newxz(newroot, 1, struct arena_set);
693 newroot->set_size = ARENAS_PER_SET;
476a1e16
JC
694 newroot->next = *aroot;
695 *aroot = newroot;
ca0270c4 696 DEBUG_m(PerlIO_printf(Perl_debug_log, "new arenaset %p\n", (void*)*aroot));
5e258f8c
JC
697 }
698
699 /* ok, now have arena-set with at least 1 empty/available arena-desc */
476a1e16
JC
700 curr = (*aroot)->curr++;
701 adesc = &((*aroot)->set[curr]);
5e258f8c
JC
702 assert(!adesc->arena);
703
5e258f8c
JC
704 Newxz(adesc->arena, arena_size, char);
705 adesc->size = arena_size;
d2a0f284
JC
706 DEBUG_m(PerlIO_printf(Perl_debug_log, "arena %d added: %p size %d\n",
707 curr, adesc->arena, arena_size));
5e258f8c
JC
708
709 return adesc->arena;
5e258f8c
JC
710}
711
53c1dcc0 712
bd81e77b 713/* return a thing to the free list */
29489e7c 714
bd81e77b
NC
715#define del_body(thing, root) \
716 STMT_START { \
00b6aa41 717 void ** const thing_copy = (void **)thing;\
bd81e77b
NC
718 LOCK_SV_MUTEX; \
719 *thing_copy = *root; \
720 *root = (void*)thing_copy; \
721 UNLOCK_SV_MUTEX; \
722 } STMT_END
29489e7c 723
bd81e77b 724/*
d2a0f284
JC
725
726=head1 SV-Body Allocation
727
728Allocation of SV-bodies is similar to SV-heads, differing as follows;
729the allocation mechanism is used for many body types, so is somewhat
730more complicated, it uses arena-sets, and has no need for still-live
731SV detection.
732
733At the outermost level, (new|del)_X*V macros return bodies of the
734appropriate type. These macros call either (new|del)_body_type or
735(new|del)_body_allocated macro pairs, depending on specifics of the
736type. Most body types use the former pair, the latter pair is used to
737allocate body types with "ghost fields".
738
739"ghost fields" are fields that are unused in certain types, and
740consequently dont need to actually exist. They are declared because
741they're part of a "base type", which allows use of functions as
742methods. The simplest examples are AVs and HVs, 2 aggregate types
743which don't use the fields which support SCALAR semantics.
744
745For these types, the arenas are carved up into *_allocated size
746chunks, we thus avoid wasted memory for those unaccessed members.
747When bodies are allocated, we adjust the pointer back in memory by the
748size of the bit not allocated, so it's as if we allocated the full
749structure. (But things will all go boom if you write to the part that
750is "not there", because you'll be overwriting the last members of the
751preceding structure in memory.)
752
753We calculate the correction using the STRUCT_OFFSET macro. For
754example, if xpv_allocated is the same structure as XPV then the two
755OFFSETs sum to zero, and the pointer is unchanged. If the allocated
756structure is smaller (no initial NV actually allocated) then the net
757effect is to subtract the size of the NV from the pointer, to return a
758new pointer as if an initial NV were actually allocated.
759
760This is the same trick as was used for NV and IV bodies. Ironically it
761doesn't need to be used for NV bodies any more, because NV is now at
762the start of the structure. IV bodies don't need it either, because
763they are no longer allocated.
764
765In turn, the new_body_* allocators call S_new_body(), which invokes
766new_body_inline macro, which takes a lock, and takes a body off the
767linked list at PL_body_roots[sv_type], calling S_more_bodies() if
768necessary to refresh an empty list. Then the lock is released, and
769the body is returned.
770
771S_more_bodies calls get_arena(), and carves it up into an array of N
772bodies, which it strings into a linked list. It looks up arena-size
773and body-size from the body_details table described below, thus
774supporting the multiple body-types.
775
776If PURIFY is defined, or PERL_ARENA_SIZE=0, arenas are not used, and
777the (new|del)_X*V macros are mapped directly to malloc/free.
778
779*/
780
781/*
782
783For each sv-type, struct body_details bodies_by_type[] carries
784parameters which control these aspects of SV handling:
785
786Arena_size determines whether arenas are used for this body type, and if
787so, how big they are. PURIFY or PERL_ARENA_SIZE=0 set this field to
788zero, forcing individual mallocs and frees.
789
790Body_size determines how big a body is, and therefore how many fit into
791each arena. Offset carries the body-pointer adjustment needed for
792*_allocated body types, and is used in *_allocated macros.
793
794But its main purpose is to parameterize info needed in
795Perl_sv_upgrade(). The info here dramatically simplifies the function
796vs the implementation in 5.8.7, making it table-driven. All fields
797are used for this, except for arena_size.
798
799For the sv-types that have no bodies, arenas are not used, so those
800PL_body_roots[sv_type] are unused, and can be overloaded. In
801something of a special case, SVt_NULL is borrowed for HE arenas;
802PL_body_roots[SVt_NULL] is filled by S_more_he, but the
803bodies_by_type[SVt_NULL] slot is not used, as the table is not
804available in hv.c,
805
806PTEs also use arenas, but are never seen in Perl_sv_upgrade.
807Nonetheless, they get their own slot in bodies_by_type[SVt_NULL], so
808they can just use the same allocation semantics. At first, PTEs were
809also overloaded to a non-body sv-type, but this yielded hard-to-find
810malloc bugs, so was simplified by claiming a new slot. This choice
811has no consequence at this time.
812
29489e7c
DM
813*/
814
bd81e77b 815struct body_details {
0fb58b32 816 U8 body_size; /* Size to allocate */
10666ae3 817 U8 copy; /* Size of structure to copy (may be shorter) */
0fb58b32 818 U8 offset;
10666ae3
NC
819 unsigned int type : 4; /* We have space for a sanity check. */
820 unsigned int cant_upgrade : 1; /* Cannot upgrade this type */
821 unsigned int zero_nv : 1; /* zero the NV when upgrading from this */
822 unsigned int arena : 1; /* Allocated from an arena */
823 size_t arena_size; /* Size of arena to allocate */
bd81e77b 824};
29489e7c 825
bd81e77b
NC
826#define HADNV FALSE
827#define NONV TRUE
29489e7c 828
d2a0f284 829
bd81e77b
NC
830#ifdef PURIFY
831/* With -DPURFIY we allocate everything directly, and don't use arenas.
832 This seems a rather elegant way to simplify some of the code below. */
833#define HASARENA FALSE
834#else
835#define HASARENA TRUE
836#endif
837#define NOARENA FALSE
29489e7c 838
d2a0f284
JC
839/* Size the arenas to exactly fit a given number of bodies. A count
840 of 0 fits the max number bodies into a PERL_ARENA_SIZE.block,
841 simplifying the default. If count > 0, the arena is sized to fit
842 only that many bodies, allowing arenas to be used for large, rare
843 bodies (XPVFM, XPVIO) without undue waste. The arena size is
844 limited by PERL_ARENA_SIZE, so we can safely oversize the
845 declarations.
846 */
95db5f15
MB
847#define FIT_ARENA0(body_size) \
848 ((size_t)(PERL_ARENA_SIZE / body_size) * body_size)
849#define FIT_ARENAn(count,body_size) \
850 ( count * body_size <= PERL_ARENA_SIZE) \
851 ? count * body_size \
852 : FIT_ARENA0 (body_size)
853#define FIT_ARENA(count,body_size) \
854 count \
855 ? FIT_ARENAn (count, body_size) \
856 : FIT_ARENA0 (body_size)
d2a0f284 857
bd81e77b 858/* A macro to work out the offset needed to subtract from a pointer to (say)
29489e7c 859
bd81e77b
NC
860typedef struct {
861 STRLEN xpv_cur;
862 STRLEN xpv_len;
863} xpv_allocated;
29489e7c 864
bd81e77b 865to make its members accessible via a pointer to (say)
29489e7c 866
bd81e77b
NC
867struct xpv {
868 NV xnv_nv;
869 STRLEN xpv_cur;
870 STRLEN xpv_len;
871};
29489e7c 872
bd81e77b 873*/
29489e7c 874
bd81e77b
NC
875#define relative_STRUCT_OFFSET(longer, shorter, member) \
876 (STRUCT_OFFSET(shorter, member) - STRUCT_OFFSET(longer, member))
29489e7c 877
bd81e77b
NC
878/* Calculate the length to copy. Specifically work out the length less any
879 final padding the compiler needed to add. See the comment in sv_upgrade
880 for why copying the padding proved to be a bug. */
29489e7c 881
bd81e77b
NC
882#define copy_length(type, last_member) \
883 STRUCT_OFFSET(type, last_member) \
884 + sizeof (((type*)SvANY((SV*)0))->last_member)
29489e7c 885
bd81e77b 886static const struct body_details bodies_by_type[] = {
10666ae3
NC
887 { sizeof(HE), 0, 0, SVt_NULL,
888 FALSE, NONV, NOARENA, FIT_ARENA(0, sizeof(HE)) },
d2a0f284
JC
889
890 /* IVs are in the head, so the allocation size is 0.
891 However, the slot is overloaded for PTEs. */
892 { sizeof(struct ptr_tbl_ent), /* This is used for PTEs. */
893 sizeof(IV), /* This is used to copy out the IV body. */
10666ae3 894 STRUCT_OFFSET(XPVIV, xiv_iv), SVt_IV, FALSE, NONV,
d2a0f284
JC
895 NOARENA /* IVS don't need an arena */,
896 /* But PTEs need to know the size of their arena */
897 FIT_ARENA(0, sizeof(struct ptr_tbl_ent))
898 },
899
bd81e77b 900 /* 8 bytes on most ILP32 with IEEE doubles */
10666ae3 901 { sizeof(NV), sizeof(NV), 0, SVt_NV, FALSE, HADNV, HASARENA,
d2a0f284
JC
902 FIT_ARENA(0, sizeof(NV)) },
903
904 /* RVs are in the head now. */
10666ae3 905 { 0, 0, 0, SVt_RV, FALSE, NONV, NOARENA, 0 },
d2a0f284 906
bd81e77b 907 /* 8 bytes on most ILP32 with IEEE doubles */
d2a0f284
JC
908 { sizeof(xpv_allocated),
909 copy_length(XPV, xpv_len)
910 - relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
911 + relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
10666ae3 912 SVt_PV, FALSE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpv_allocated)) },
d2a0f284 913
bd81e77b 914 /* 12 */
d2a0f284
JC
915 { sizeof(xpviv_allocated),
916 copy_length(XPVIV, xiv_u)
917 - relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
918 + relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
10666ae3 919 SVt_PVIV, FALSE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpviv_allocated)) },
d2a0f284 920
bd81e77b 921 /* 20 */
10666ae3 922 { sizeof(XPVNV), copy_length(XPVNV, xiv_u), 0, SVt_PVNV, FALSE, HADNV,
d2a0f284
JC
923 HASARENA, FIT_ARENA(0, sizeof(XPVNV)) },
924
bd81e77b 925 /* 28 */
10666ae3 926 { sizeof(XPVMG), copy_length(XPVMG, xmg_stash), 0, SVt_PVMG, FALSE, HADNV,
d2a0f284
JC
927 HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
928
bd81e77b 929 /* 36 */
10666ae3 930 { sizeof(XPVBM), sizeof(XPVBM), 0, SVt_PVBM, TRUE, HADNV,
d2a0f284
JC
931 HASARENA, FIT_ARENA(0, sizeof(XPVBM)) },
932
bd81e77b 933 /* 48 */
10666ae3 934 { sizeof(XPVGV), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
d2a0f284
JC
935 HASARENA, FIT_ARENA(0, sizeof(XPVGV)) },
936
bd81e77b 937 /* 64 */
10666ae3 938 { sizeof(XPVLV), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
d2a0f284
JC
939 HASARENA, FIT_ARENA(0, sizeof(XPVLV)) },
940
941 { sizeof(xpvav_allocated),
942 copy_length(XPVAV, xmg_stash)
943 - relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
944 + relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
10666ae3 945 SVt_PVAV, TRUE, HADNV, HASARENA, FIT_ARENA(0, sizeof(xpvav_allocated)) },
d2a0f284
JC
946
947 { sizeof(xpvhv_allocated),
948 copy_length(XPVHV, xmg_stash)
949 - relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
950 + relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
10666ae3 951 SVt_PVHV, TRUE, HADNV, HASARENA, FIT_ARENA(0, sizeof(xpvhv_allocated)) },
d2a0f284 952
c84c4652 953 /* 56 */
4115f141 954 { sizeof(xpvcv_allocated), sizeof(xpvcv_allocated),
c84c4652 955 + relative_STRUCT_OFFSET(xpvcv_allocated, XPVCV, xpv_cur),
10666ae3 956 SVt_PVCV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvcv_allocated)) },
d2a0f284 957
4115f141 958 { sizeof(xpvfm_allocated), sizeof(xpvfm_allocated),
3038937b 959 + relative_STRUCT_OFFSET(xpvfm_allocated, XPVFM, xpv_cur),
10666ae3 960 SVt_PVFM, TRUE, NONV, NOARENA, FIT_ARENA(20, sizeof(xpvfm_allocated)) },
d2a0f284
JC
961
962 /* XPVIO is 84 bytes, fits 48x */
10666ae3 963 { sizeof(XPVIO), sizeof(XPVIO), 0, SVt_PVIO, TRUE, HADNV,
d2a0f284 964 HASARENA, FIT_ARENA(24, sizeof(XPVIO)) },
bd81e77b 965};
29489e7c 966
d2a0f284
JC
967#define new_body_type(sv_type) \
968 (void *)((char *)S_new_body(aTHX_ sv_type))
29489e7c 969
bd81e77b
NC
970#define del_body_type(p, sv_type) \
971 del_body(p, &PL_body_roots[sv_type])
29489e7c 972
29489e7c 973
bd81e77b 974#define new_body_allocated(sv_type) \
d2a0f284 975 (void *)((char *)S_new_body(aTHX_ sv_type) \
bd81e77b 976 - bodies_by_type[sv_type].offset)
29489e7c 977
bd81e77b
NC
978#define del_body_allocated(p, sv_type) \
979 del_body(p + bodies_by_type[sv_type].offset, &PL_body_roots[sv_type])
29489e7c 980
29489e7c 981
bd81e77b
NC
982#define my_safemalloc(s) (void*)safemalloc(s)
983#define my_safecalloc(s) (void*)safecalloc(s, 1)
984#define my_safefree(p) safefree((char*)p)
29489e7c 985
bd81e77b 986#ifdef PURIFY
29489e7c 987
bd81e77b
NC
988#define new_XNV() my_safemalloc(sizeof(XPVNV))
989#define del_XNV(p) my_safefree(p)
29489e7c 990
bd81e77b
NC
991#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
992#define del_XPVNV(p) my_safefree(p)
29489e7c 993
bd81e77b
NC
994#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
995#define del_XPVAV(p) my_safefree(p)
29489e7c 996
bd81e77b
NC
997#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
998#define del_XPVHV(p) my_safefree(p)
29489e7c 999
bd81e77b
NC
1000#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
1001#define del_XPVMG(p) my_safefree(p)
29489e7c 1002
bd81e77b
NC
1003#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
1004#define del_XPVGV(p) my_safefree(p)
29489e7c 1005
bd81e77b 1006#else /* !PURIFY */
29489e7c 1007
bd81e77b
NC
1008#define new_XNV() new_body_type(SVt_NV)
1009#define del_XNV(p) del_body_type(p, SVt_NV)
29489e7c 1010
bd81e77b
NC
1011#define new_XPVNV() new_body_type(SVt_PVNV)
1012#define del_XPVNV(p) del_body_type(p, SVt_PVNV)
29489e7c 1013
bd81e77b
NC
1014#define new_XPVAV() new_body_allocated(SVt_PVAV)
1015#define del_XPVAV(p) del_body_allocated(p, SVt_PVAV)
645c22ef 1016
bd81e77b
NC
1017#define new_XPVHV() new_body_allocated(SVt_PVHV)
1018#define del_XPVHV(p) del_body_allocated(p, SVt_PVHV)
645c22ef 1019
bd81e77b
NC
1020#define new_XPVMG() new_body_type(SVt_PVMG)
1021#define del_XPVMG(p) del_body_type(p, SVt_PVMG)
645c22ef 1022
bd81e77b
NC
1023#define new_XPVGV() new_body_type(SVt_PVGV)
1024#define del_XPVGV(p) del_body_type(p, SVt_PVGV)
1d7c1841 1025
bd81e77b 1026#endif /* PURIFY */
93e68bfb 1027
bd81e77b 1028/* no arena for you! */
93e68bfb 1029
bd81e77b 1030#define new_NOARENA(details) \
d2a0f284 1031 my_safemalloc((details)->body_size + (details)->offset)
bd81e77b 1032#define new_NOARENAZ(details) \
d2a0f284
JC
1033 my_safecalloc((details)->body_size + (details)->offset)
1034
10666ae3
NC
1035#ifdef DEBUGGING
1036static bool done_sanity_check;
1037#endif
1038
d2a0f284
JC
1039STATIC void *
1040S_more_bodies (pTHX_ svtype sv_type)
1041{
1042 dVAR;
1043 void ** const root = &PL_body_roots[sv_type];
96a5add6 1044 const struct body_details * const bdp = &bodies_by_type[sv_type];
d2a0f284
JC
1045 const size_t body_size = bdp->body_size;
1046 char *start;
1047 const char *end;
1048
1049 assert(bdp->arena_size);
10666ae3
NC
1050
1051#ifdef DEBUGGING
1052 if (!done_sanity_check) {
ea471437 1053 unsigned int i = SVt_LAST;
10666ae3
NC
1054
1055 done_sanity_check = TRUE;
1056
1057 while (i--)
1058 assert (bodies_by_type[i].type == i);
1059 }
1060#endif
1061
d2a0f284
JC
1062 start = (char*) Perl_get_arena(aTHX_ bdp->arena_size);
1063
1064 end = start + bdp->arena_size - body_size;
1065
d2a0f284
JC
1066 /* computed count doesnt reflect the 1st slot reservation */
1067 DEBUG_m(PerlIO_printf(Perl_debug_log,
1068 "arena %p end %p arena-size %d type %d size %d ct %d\n",
1069 start, end, bdp->arena_size, sv_type, body_size,
1070 bdp->arena_size / body_size));
d2a0f284
JC
1071
1072 *root = (void *)start;
1073
1074 while (start < end) {
1075 char * const next = start + body_size;
1076 *(void**) start = (void *)next;
1077 start = next;
1078 }
1079 *(void **)start = 0;
1080
1081 return *root;
1082}
1083
1084/* grab a new thing from the free list, allocating more if necessary.
1085 The inline version is used for speed in hot routines, and the
1086 function using it serves the rest (unless PURIFY).
1087*/
1088#define new_body_inline(xpv, sv_type) \
1089 STMT_START { \
1090 void ** const r3wt = &PL_body_roots[sv_type]; \
1091 LOCK_SV_MUTEX; \
1092 xpv = *((void **)(r3wt)) \
d4c19fe8 1093 ? *((void **)(r3wt)) : more_bodies(sv_type); \
d2a0f284
JC
1094 *(r3wt) = *(void**)(xpv); \
1095 UNLOCK_SV_MUTEX; \
1096 } STMT_END
1097
1098#ifndef PURIFY
1099
1100STATIC void *
1101S_new_body(pTHX_ svtype sv_type)
1102{
1103 dVAR;
1104 void *xpv;
1105 new_body_inline(xpv, sv_type);
1106 return xpv;
1107}
1108
1109#endif
93e68bfb 1110
bd81e77b
NC
1111/*
1112=for apidoc sv_upgrade
93e68bfb 1113
bd81e77b
NC
1114Upgrade an SV to a more complex form. Generally adds a new body type to the
1115SV, then copies across as much information as possible from the old body.
1116You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
93e68bfb 1117
bd81e77b 1118=cut
93e68bfb 1119*/
93e68bfb 1120
bd81e77b
NC
1121void
1122Perl_sv_upgrade(pTHX_ register SV *sv, U32 new_type)
cac9b346 1123{
97aff369 1124 dVAR;
bd81e77b
NC
1125 void* old_body;
1126 void* new_body;
1127 const U32 old_type = SvTYPE(sv);
d2a0f284 1128 const struct body_details *new_type_details;
bd81e77b
NC
1129 const struct body_details *const old_type_details
1130 = bodies_by_type + old_type;
cac9b346 1131
bd81e77b
NC
1132 if (new_type != SVt_PV && SvIsCOW(sv)) {
1133 sv_force_normal_flags(sv, 0);
1134 }
cac9b346 1135
bd81e77b
NC
1136 if (old_type == new_type)
1137 return;
cac9b346 1138
bd81e77b
NC
1139 if (old_type > new_type)
1140 Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
1141 (int)old_type, (int)new_type);
cac9b346 1142
cac9b346 1143
bd81e77b 1144 old_body = SvANY(sv);
de042e1d 1145
bd81e77b
NC
1146 /* Copying structures onto other structures that have been neatly zeroed
1147 has a subtle gotcha. Consider XPVMG
cac9b346 1148
bd81e77b
NC
1149 +------+------+------+------+------+-------+-------+
1150 | NV | CUR | LEN | IV | MAGIC | STASH |
1151 +------+------+------+------+------+-------+-------+
1152 0 4 8 12 16 20 24 28
645c22ef 1153
bd81e77b
NC
1154 where NVs are aligned to 8 bytes, so that sizeof that structure is
1155 actually 32 bytes long, with 4 bytes of padding at the end:
08742458 1156
bd81e77b
NC
1157 +------+------+------+------+------+-------+-------+------+
1158 | NV | CUR | LEN | IV | MAGIC | STASH | ??? |
1159 +------+------+------+------+------+-------+-------+------+
1160 0 4 8 12 16 20 24 28 32
08742458 1161
bd81e77b 1162 so what happens if you allocate memory for this structure:
30f9da9e 1163
bd81e77b
NC
1164 +------+------+------+------+------+-------+-------+------+------+...
1165 | NV | CUR | LEN | IV | MAGIC | STASH | GP | NAME |
1166 +------+------+------+------+------+-------+-------+------+------+...
1167 0 4 8 12 16 20 24 28 32 36
bfc44f79 1168
bd81e77b
NC
1169 zero it, then copy sizeof(XPVMG) bytes on top of it? Not quite what you
1170 expect, because you copy the area marked ??? onto GP. Now, ??? may have
1171 started out as zero once, but it's quite possible that it isn't. So now,
1172 rather than a nicely zeroed GP, you have it pointing somewhere random.
1173 Bugs ensue.
bfc44f79 1174
bd81e77b
NC
1175 (In fact, GP ends up pointing at a previous GP structure, because the
1176 principle cause of the padding in XPVMG getting garbage is a copy of
1177 sizeof(XPVMG) bytes from a XPVGV structure in sv_unglob)
30f9da9e 1178
bd81e77b
NC
1179 So we are careful and work out the size of used parts of all the
1180 structures. */
bfc44f79 1181
bd81e77b
NC
1182 switch (old_type) {
1183 case SVt_NULL:
1184 break;
1185 case SVt_IV:
1186 if (new_type < SVt_PVIV) {
1187 new_type = (new_type == SVt_NV)
1188 ? SVt_PVNV : SVt_PVIV;
bd81e77b
NC
1189 }
1190 break;
1191 case SVt_NV:
1192 if (new_type < SVt_PVNV) {
1193 new_type = SVt_PVNV;
bd81e77b
NC
1194 }
1195 break;
1196 case SVt_RV:
1197 break;
1198 case SVt_PV:
1199 assert(new_type > SVt_PV);
1200 assert(SVt_IV < SVt_PV);
1201 assert(SVt_NV < SVt_PV);
1202 break;
1203 case SVt_PVIV:
1204 break;
1205 case SVt_PVNV:
1206 break;
1207 case SVt_PVMG:
1208 /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1209 there's no way that it can be safely upgraded, because perl.c
1210 expects to Safefree(SvANY(PL_mess_sv)) */
1211 assert(sv != PL_mess_sv);
1212 /* This flag bit is used to mean other things in other scalar types.
1213 Given that it only has meaning inside the pad, it shouldn't be set
1214 on anything that can get upgraded. */
00b1698f 1215 assert(!SvPAD_TYPED(sv));
bd81e77b
NC
1216 break;
1217 default:
1218 if (old_type_details->cant_upgrade)
c81225bc
NC
1219 Perl_croak(aTHX_ "Can't upgrade %s (%" UVuf ") to %" UVuf,
1220 sv_reftype(sv, 0), (UV) old_type, (UV) new_type);
bd81e77b 1221 }
2fa1109b 1222 new_type_details = bodies_by_type + new_type;
645c22ef 1223
bd81e77b
NC
1224 SvFLAGS(sv) &= ~SVTYPEMASK;
1225 SvFLAGS(sv) |= new_type;
932e9ff9 1226
ab4416c0
NC
1227 /* This can't happen, as SVt_NULL is <= all values of new_type, so one of
1228 the return statements above will have triggered. */
1229 assert (new_type != SVt_NULL);
bd81e77b 1230 switch (new_type) {
bd81e77b
NC
1231 case SVt_IV:
1232 assert(old_type == SVt_NULL);
1233 SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
1234 SvIV_set(sv, 0);
1235 return;
1236 case SVt_NV:
1237 assert(old_type == SVt_NULL);
1238 SvANY(sv) = new_XNV();
1239 SvNV_set(sv, 0);
1240 return;
1241 case SVt_RV:
1242 assert(old_type == SVt_NULL);
1243 SvANY(sv) = &sv->sv_u.svu_rv;
1244 SvRV_set(sv, 0);
1245 return;
1246 case SVt_PVHV:
bd81e77b 1247 case SVt_PVAV:
d2a0f284 1248 assert(new_type_details->body_size);
c1ae03ae
NC
1249
1250#ifndef PURIFY
1251 assert(new_type_details->arena);
d2a0f284 1252 assert(new_type_details->arena_size);
c1ae03ae 1253 /* This points to the start of the allocated area. */
d2a0f284
JC
1254 new_body_inline(new_body, new_type);
1255 Zero(new_body, new_type_details->body_size, char);
c1ae03ae
NC
1256 new_body = ((char *)new_body) - new_type_details->offset;
1257#else
1258 /* We always allocated the full length item with PURIFY. To do this
1259 we fake things so that arena is false for all 16 types.. */
1260 new_body = new_NOARENAZ(new_type_details);
1261#endif
1262 SvANY(sv) = new_body;
1263 if (new_type == SVt_PVAV) {
1264 AvMAX(sv) = -1;
1265 AvFILLp(sv) = -1;
1266 AvREAL_only(sv);
1267 }
aeb18a1e 1268
bd81e77b
NC
1269 /* SVt_NULL isn't the only thing upgraded to AV or HV.
1270 The target created by newSVrv also is, and it can have magic.
1271 However, it never has SvPVX set.
1272 */
1273 if (old_type >= SVt_RV) {
1274 assert(SvPVX_const(sv) == 0);
1275 }
aeb18a1e 1276
bd81e77b
NC
1277 /* Could put this in the else clause below, as PVMG must have SvPVX
1278 0 already (the assertion above) */
6136c704 1279 SvPV_set(sv, NULL);
93e68bfb 1280
bd81e77b 1281 if (old_type >= SVt_PVMG) {
e736a858 1282 SvMAGIC_set(sv, ((XPVMG*)old_body)->xmg_u.xmg_magic);
bd81e77b 1283 SvSTASH_set(sv, ((XPVMG*)old_body)->xmg_stash);
bd81e77b
NC
1284 }
1285 break;
93e68bfb 1286
93e68bfb 1287
bd81e77b
NC
1288 case SVt_PVIV:
1289 /* XXX Is this still needed? Was it ever needed? Surely as there is
1290 no route from NV to PVIV, NOK can never be true */
1291 assert(!SvNOKp(sv));
1292 assert(!SvNOK(sv));
1293 case SVt_PVIO:
1294 case SVt_PVFM:
1295 case SVt_PVBM:
1296 case SVt_PVGV:
1297 case SVt_PVCV:
1298 case SVt_PVLV:
1299 case SVt_PVMG:
1300 case SVt_PVNV:
1301 case SVt_PV:
93e68bfb 1302
d2a0f284 1303 assert(new_type_details->body_size);
bd81e77b
NC
1304 /* We always allocated the full length item with PURIFY. To do this
1305 we fake things so that arena is false for all 16 types.. */
1306 if(new_type_details->arena) {
1307 /* This points to the start of the allocated area. */
d2a0f284
JC
1308 new_body_inline(new_body, new_type);
1309 Zero(new_body, new_type_details->body_size, char);
bd81e77b
NC
1310 new_body = ((char *)new_body) - new_type_details->offset;
1311 } else {
1312 new_body = new_NOARENAZ(new_type_details);
1313 }
1314 SvANY(sv) = new_body;
5e2fc214 1315
bd81e77b 1316 if (old_type_details->copy) {
f9ba3d20
NC
1317 /* There is now the potential for an upgrade from something without
1318 an offset (PVNV or PVMG) to something with one (PVCV, PVFM) */
1319 int offset = old_type_details->offset;
1320 int length = old_type_details->copy;
1321
1322 if (new_type_details->offset > old_type_details->offset) {
d4c19fe8 1323 const int difference
f9ba3d20
NC
1324 = new_type_details->offset - old_type_details->offset;
1325 offset += difference;
1326 length -= difference;
1327 }
1328 assert (length >= 0);
1329
1330 Copy((char *)old_body + offset, (char *)new_body + offset, length,
1331 char);
bd81e77b
NC
1332 }
1333
1334#ifndef NV_ZERO_IS_ALLBITS_ZERO
f2524eef 1335 /* If NV 0.0 is stores as all bits 0 then Zero() already creates a
e5ce394c
NC
1336 * correct 0.0 for us. Otherwise, if the old body didn't have an
1337 * NV slot, but the new one does, then we need to initialise the
1338 * freshly created NV slot with whatever the correct bit pattern is
1339 * for 0.0 */
1340 if (old_type_details->zero_nv && !new_type_details->zero_nv)
bd81e77b 1341 SvNV_set(sv, 0);
82048762 1342#endif
5e2fc214 1343
bd81e77b 1344 if (new_type == SVt_PVIO)
f2524eef 1345 IoPAGE_LEN(sv) = 60;
bd81e77b 1346 if (old_type < SVt_RV)
6136c704 1347 SvPV_set(sv, NULL);
bd81e77b
NC
1348 break;
1349 default:
afd78fd5
JH
1350 Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
1351 (unsigned long)new_type);
bd81e77b 1352 }
73171d91 1353
d2a0f284
JC
1354 if (old_type_details->arena) {
1355 /* If there was an old body, then we need to free it.
1356 Note that there is an assumption that all bodies of types that
1357 can be upgraded came from arenas. Only the more complex non-
1358 upgradable types are allowed to be directly malloc()ed. */
bd81e77b
NC
1359#ifdef PURIFY
1360 my_safefree(old_body);
1361#else
1362 del_body((void*)((char*)old_body + old_type_details->offset),
1363 &PL_body_roots[old_type]);
1364#endif
1365 }
1366}
73171d91 1367
bd81e77b
NC
1368/*
1369=for apidoc sv_backoff
73171d91 1370
bd81e77b
NC
1371Remove any string offset. You should normally use the C<SvOOK_off> macro
1372wrapper instead.
73171d91 1373
bd81e77b 1374=cut
73171d91
NC
1375*/
1376
bd81e77b
NC
1377int
1378Perl_sv_backoff(pTHX_ register SV *sv)
1379{
96a5add6 1380 PERL_UNUSED_CONTEXT;
bd81e77b
NC
1381 assert(SvOOK(sv));
1382 assert(SvTYPE(sv) != SVt_PVHV);
1383 assert(SvTYPE(sv) != SVt_PVAV);
1384 if (SvIVX(sv)) {
1385 const char * const s = SvPVX_const(sv);
1386 SvLEN_set(sv, SvLEN(sv) + SvIVX(sv));
1387 SvPV_set(sv, SvPVX(sv) - SvIVX(sv));
1388 SvIV_set(sv, 0);
1389 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1390 }
1391 SvFLAGS(sv) &= ~SVf_OOK;
1392 return 0;
1393}
73171d91 1394
bd81e77b
NC
1395/*
1396=for apidoc sv_grow
73171d91 1397
bd81e77b
NC
1398Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
1399upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
1400Use the C<SvGROW> wrapper instead.
93e68bfb 1401
bd81e77b
NC
1402=cut
1403*/
93e68bfb 1404
bd81e77b
NC
1405char *
1406Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
1407{
1408 register char *s;
93e68bfb 1409
5db06880
NC
1410 if (PL_madskills && newlen >= 0x100000) {
1411 PerlIO_printf(Perl_debug_log,
1412 "Allocation too large: %"UVxf"\n", (UV)newlen);
1413 }
bd81e77b
NC
1414#ifdef HAS_64K_LIMIT
1415 if (newlen >= 0x10000) {
1416 PerlIO_printf(Perl_debug_log,
1417 "Allocation too large: %"UVxf"\n", (UV)newlen);
1418 my_exit(1);
1419 }
1420#endif /* HAS_64K_LIMIT */
1421 if (SvROK(sv))
1422 sv_unref(sv);
1423 if (SvTYPE(sv) < SVt_PV) {
1424 sv_upgrade(sv, SVt_PV);
1425 s = SvPVX_mutable(sv);
1426 }
1427 else if (SvOOK(sv)) { /* pv is offset? */
1428 sv_backoff(sv);
1429 s = SvPVX_mutable(sv);
1430 if (newlen > SvLEN(sv))
1431 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1432#ifdef HAS_64K_LIMIT
1433 if (newlen >= 0x10000)
1434 newlen = 0xFFFF;
1435#endif
1436 }
1437 else
1438 s = SvPVX_mutable(sv);
aeb18a1e 1439
bd81e77b
NC
1440 if (newlen > SvLEN(sv)) { /* need more room? */
1441 newlen = PERL_STRLEN_ROUNDUP(newlen);
1442 if (SvLEN(sv) && s) {
1443#ifdef MYMALLOC
1444 const STRLEN l = malloced_size((void*)SvPVX_const(sv));
1445 if (newlen <= l) {
1446 SvLEN_set(sv, l);
1447 return s;
1448 } else
1449#endif
1450 s = saferealloc(s, newlen);
1451 }
1452 else {
1453 s = safemalloc(newlen);
1454 if (SvPVX_const(sv) && SvCUR(sv)) {
1455 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1456 }
1457 }
1458 SvPV_set(sv, s);
1459 SvLEN_set(sv, newlen);
1460 }
1461 return s;
1462}
aeb18a1e 1463
bd81e77b
NC
1464/*
1465=for apidoc sv_setiv
932e9ff9 1466
bd81e77b
NC
1467Copies an integer into the given SV, upgrading first if necessary.
1468Does not handle 'set' magic. See also C<sv_setiv_mg>.
463ee0b2 1469
bd81e77b
NC
1470=cut
1471*/
463ee0b2 1472
bd81e77b
NC
1473void
1474Perl_sv_setiv(pTHX_ register SV *sv, IV i)
1475{
97aff369 1476 dVAR;
bd81e77b
NC
1477 SV_CHECK_THINKFIRST_COW_DROP(sv);
1478 switch (SvTYPE(sv)) {
1479 case SVt_NULL:
1480 sv_upgrade(sv, SVt_IV);
1481 break;
1482 case SVt_NV:
1483 sv_upgrade(sv, SVt_PVNV);
1484 break;
1485 case SVt_RV:
1486 case SVt_PV:
1487 sv_upgrade(sv, SVt_PVIV);
1488 break;
463ee0b2 1489
bd81e77b
NC
1490 case SVt_PVGV:
1491 case SVt_PVAV:
1492 case SVt_PVHV:
1493 case SVt_PVCV:
1494 case SVt_PVFM:
1495 case SVt_PVIO:
1496 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1497 OP_DESC(PL_op));
1498 }
1499 (void)SvIOK_only(sv); /* validate number */
1500 SvIV_set(sv, i);
1501 SvTAINT(sv);
1502}
932e9ff9 1503
bd81e77b
NC
1504/*
1505=for apidoc sv_setiv_mg
d33b2eba 1506
bd81e77b 1507Like C<sv_setiv>, but also handles 'set' magic.
1c846c1f 1508
bd81e77b
NC
1509=cut
1510*/
d33b2eba 1511
bd81e77b
NC
1512void
1513Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
1514{
1515 sv_setiv(sv,i);
1516 SvSETMAGIC(sv);
1517}
727879eb 1518
bd81e77b
NC
1519/*
1520=for apidoc sv_setuv
d33b2eba 1521
bd81e77b
NC
1522Copies an unsigned integer into the given SV, upgrading first if necessary.
1523Does not handle 'set' magic. See also C<sv_setuv_mg>.
9b94d1dd 1524
bd81e77b
NC
1525=cut
1526*/
d33b2eba 1527
bd81e77b
NC
1528void
1529Perl_sv_setuv(pTHX_ register SV *sv, UV u)
1530{
1531 /* With these two if statements:
1532 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d33b2eba 1533
bd81e77b
NC
1534 without
1535 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
1c846c1f 1536
bd81e77b
NC
1537 If you wish to remove them, please benchmark to see what the effect is
1538 */
1539 if (u <= (UV)IV_MAX) {
1540 sv_setiv(sv, (IV)u);
1541 return;
1542 }
1543 sv_setiv(sv, 0);
1544 SvIsUV_on(sv);
1545 SvUV_set(sv, u);
1546}
d33b2eba 1547
bd81e77b
NC
1548/*
1549=for apidoc sv_setuv_mg
727879eb 1550
bd81e77b 1551Like C<sv_setuv>, but also handles 'set' magic.
9b94d1dd 1552
bd81e77b
NC
1553=cut
1554*/
5e2fc214 1555
bd81e77b
NC
1556void
1557Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
1558{
1559 sv_setiv(sv, 0);
1560 SvIsUV_on(sv);
1561 sv_setuv(sv,u);
1562 SvSETMAGIC(sv);
1563}
5e2fc214 1564
954c1994 1565/*
bd81e77b 1566=for apidoc sv_setnv
954c1994 1567
bd81e77b
NC
1568Copies a double into the given SV, upgrading first if necessary.
1569Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
1570
1571=cut
1572*/
1573
63f97190 1574void
bd81e77b 1575Perl_sv_setnv(pTHX_ register SV *sv, NV num)
79072805 1576{
97aff369 1577 dVAR;
bd81e77b
NC
1578 SV_CHECK_THINKFIRST_COW_DROP(sv);
1579 switch (SvTYPE(sv)) {
79072805 1580 case SVt_NULL:
79072805 1581 case SVt_IV:
bd81e77b 1582 sv_upgrade(sv, SVt_NV);
79072805 1583 break;
ed6116ce 1584 case SVt_RV:
79072805 1585 case SVt_PV:
79072805 1586 case SVt_PVIV:
bd81e77b 1587 sv_upgrade(sv, SVt_PVNV);
79072805 1588 break;
bd4b1eb5 1589
bd4b1eb5 1590 case SVt_PVGV:
bd81e77b
NC
1591 case SVt_PVAV:
1592 case SVt_PVHV:
79072805 1593 case SVt_PVCV:
bd81e77b
NC
1594 case SVt_PVFM:
1595 case SVt_PVIO:
1596 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1597 OP_NAME(PL_op));
2068cd4d 1598 }
bd81e77b
NC
1599 SvNV_set(sv, num);
1600 (void)SvNOK_only(sv); /* validate number */
1601 SvTAINT(sv);
79072805
LW
1602}
1603
645c22ef 1604/*
bd81e77b 1605=for apidoc sv_setnv_mg
645c22ef 1606
bd81e77b 1607Like C<sv_setnv>, but also handles 'set' magic.
645c22ef
DM
1608
1609=cut
1610*/
1611
bd81e77b
NC
1612void
1613Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
79072805 1614{
bd81e77b
NC
1615 sv_setnv(sv,num);
1616 SvSETMAGIC(sv);
79072805
LW
1617}
1618
bd81e77b
NC
1619/* Print an "isn't numeric" warning, using a cleaned-up,
1620 * printable version of the offending string
1621 */
954c1994 1622
bd81e77b
NC
1623STATIC void
1624S_not_a_number(pTHX_ SV *sv)
79072805 1625{
97aff369 1626 dVAR;
bd81e77b
NC
1627 SV *dsv;
1628 char tmpbuf[64];
1629 const char *pv;
94463019
JH
1630
1631 if (DO_UTF8(sv)) {
396482e1 1632 dsv = sv_2mortal(newSVpvs(""));
94463019
JH
1633 pv = sv_uni_display(dsv, sv, 10, 0);
1634 } else {
1635 char *d = tmpbuf;
551405c4 1636 const char * const limit = tmpbuf + sizeof(tmpbuf) - 8;
94463019
JH
1637 /* each *s can expand to 4 chars + "...\0",
1638 i.e. need room for 8 chars */
ecdeb87c 1639
00b6aa41
AL
1640 const char *s = SvPVX_const(sv);
1641 const char * const end = s + SvCUR(sv);
1642 for ( ; s < end && d < limit; s++ ) {
94463019
JH
1643 int ch = *s & 0xFF;
1644 if (ch & 128 && !isPRINT_LC(ch)) {
1645 *d++ = 'M';
1646 *d++ = '-';
1647 ch &= 127;
1648 }
1649 if (ch == '\n') {
1650 *d++ = '\\';
1651 *d++ = 'n';
1652 }
1653 else if (ch == '\r') {
1654 *d++ = '\\';
1655 *d++ = 'r';
1656 }
1657 else if (ch == '\f') {
1658 *d++ = '\\';
1659 *d++ = 'f';
1660 }
1661 else if (ch == '\\') {
1662 *d++ = '\\';
1663 *d++ = '\\';
1664 }
1665 else if (ch == '\0') {
1666 *d++ = '\\';
1667 *d++ = '0';
1668 }
1669 else if (isPRINT_LC(ch))
1670 *d++ = ch;
1671 else {
1672 *d++ = '^';
1673 *d++ = toCTRL(ch);
1674 }
1675 }
1676 if (s < end) {
1677 *d++ = '.';
1678 *d++ = '.';
1679 *d++ = '.';
1680 }
1681 *d = '\0';
1682 pv = tmpbuf;
a0d0e21e 1683 }
a0d0e21e 1684
533c011a 1685 if (PL_op)
9014280d 1686 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
1687 "Argument \"%s\" isn't numeric in %s", pv,
1688 OP_DESC(PL_op));
a0d0e21e 1689 else
9014280d 1690 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 1691 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
1692}
1693
c2988b20
NC
1694/*
1695=for apidoc looks_like_number
1696
645c22ef
DM
1697Test if the content of an SV looks like a number (or is a number).
1698C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1699non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
1700
1701=cut
1702*/
1703
1704I32
1705Perl_looks_like_number(pTHX_ SV *sv)
1706{
a3b680e6 1707 register const char *sbegin;
c2988b20
NC
1708 STRLEN len;
1709
1710 if (SvPOK(sv)) {
3f7c398e 1711 sbegin = SvPVX_const(sv);
c2988b20
NC
1712 len = SvCUR(sv);
1713 }
1714 else if (SvPOKp(sv))
83003860 1715 sbegin = SvPV_const(sv, len);
c2988b20 1716 else
e0ab1c0e 1717 return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
c2988b20
NC
1718 return grok_number(sbegin, len, NULL);
1719}
25da4f38 1720
19f6321d
NC
1721STATIC bool
1722S_glob_2number(pTHX_ GV * const gv)
180488f8
NC
1723{
1724 const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1725 SV *const buffer = sv_newmortal();
1726
1727 /* FAKE globs can get coerced, so need to turn this off temporarily if it
1728 is on. */
1729 SvFAKE_off(gv);
1730 gv_efullname3(buffer, gv, "*");
1731 SvFLAGS(gv) |= wasfake;
1732
675c862f
AL
1733 /* We know that all GVs stringify to something that is not-a-number,
1734 so no need to test that. */
1735 if (ckWARN(WARN_NUMERIC))
1736 not_a_number(buffer);
1737 /* We just want something true to return, so that S_sv_2iuv_common
1738 can tail call us and return true. */
19f6321d 1739 return TRUE;
675c862f
AL
1740}
1741
1742STATIC char *
19f6321d 1743S_glob_2pv(pTHX_ GV * const gv, STRLEN * const len)
675c862f
AL
1744{
1745 const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1746 SV *const buffer = sv_newmortal();
1747
1748 /* FAKE globs can get coerced, so need to turn this off temporarily if it
1749 is on. */
1750 SvFAKE_off(gv);
1751 gv_efullname3(buffer, gv, "*");
1752 SvFLAGS(gv) |= wasfake;
1753
1754 assert(SvPOK(buffer));
1755 *len = SvCUR(buffer);
1756 return SvPVX(buffer);
180488f8
NC
1757}
1758
25da4f38
IZ
1759/* Actually, ISO C leaves conversion of UV to IV undefined, but
1760 until proven guilty, assume that things are not that bad... */
1761
645c22ef
DM
1762/*
1763 NV_PRESERVES_UV:
1764
1765 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
1766 an IV (an assumption perl has been based on to date) it becomes necessary
1767 to remove the assumption that the NV always carries enough precision to
1768 recreate the IV whenever needed, and that the NV is the canonical form.
1769 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 1770 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
1771 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1772 1) to distinguish between IV/UV/NV slots that have cached a valid
1773 conversion where precision was lost and IV/UV/NV slots that have a
1774 valid conversion which has lost no precision
645c22ef 1775 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
1776 would lose precision, the precise conversion (or differently
1777 imprecise conversion) is also performed and cached, to prevent
1778 requests for different numeric formats on the same SV causing
1779 lossy conversion chains. (lossless conversion chains are perfectly
1780 acceptable (still))
1781
1782
1783 flags are used:
1784 SvIOKp is true if the IV slot contains a valid value
1785 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
1786 SvNOKp is true if the NV slot contains a valid value
1787 SvNOK is true only if the NV value is accurate
1788
1789 so
645c22ef 1790 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
1791 IV(or UV) would lose accuracy over a direct conversion from PV to
1792 IV(or UV). If it would, cache both conversions, return NV, but mark
1793 SV as IOK NOKp (ie not NOK).
1794
645c22ef 1795 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
1796 NV would lose accuracy over a direct conversion from PV to NV. If it
1797 would, cache both conversions, flag similarly.
1798
1799 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1800 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
1801 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1802 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 1803 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 1804
645c22ef
DM
1805 The benefit of this is that operations such as pp_add know that if
1806 SvIOK is true for both left and right operands, then integer addition
1807 can be used instead of floating point (for cases where the result won't
1808 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
1809 loss of precision compared with integer addition.
1810
1811 * making IV and NV equal status should make maths accurate on 64 bit
1812 platforms
1813 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 1814 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
1815 looking for SvIOK and checking for overflow will not outweigh the
1816 fp to integer speedup)
1817 * will slow down integer operations (callers of SvIV) on "inaccurate"
1818 values, as the change from SvIOK to SvIOKp will cause a call into
1819 sv_2iv each time rather than a macro access direct to the IV slot
1820 * should speed up number->string conversion on integers as IV is
645c22ef 1821 favoured when IV and NV are equally accurate
28e5dec8
JH
1822
1823 ####################################################################
645c22ef
DM
1824 You had better be using SvIOK_notUV if you want an IV for arithmetic:
1825 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1826 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
1827 ####################################################################
1828
645c22ef 1829 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
1830 performance ratio.
1831*/
1832
1833#ifndef NV_PRESERVES_UV
645c22ef
DM
1834# define IS_NUMBER_UNDERFLOW_IV 1
1835# define IS_NUMBER_UNDERFLOW_UV 2
1836# define IS_NUMBER_IV_AND_UV 2
1837# define IS_NUMBER_OVERFLOW_IV 4
1838# define IS_NUMBER_OVERFLOW_UV 5
1839
1840/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
1841
1842/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
1843STATIC int
645c22ef 1844S_sv_2iuv_non_preserve(pTHX_ register SV *sv, I32 numtype)
28e5dec8 1845{
97aff369 1846 dVAR;
3f7c398e 1847 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
1848 if (SvNVX(sv) < (NV)IV_MIN) {
1849 (void)SvIOKp_on(sv);
1850 (void)SvNOK_on(sv);
45977657 1851 SvIV_set(sv, IV_MIN);
28e5dec8
JH
1852 return IS_NUMBER_UNDERFLOW_IV;
1853 }
1854 if (SvNVX(sv) > (NV)UV_MAX) {
1855 (void)SvIOKp_on(sv);
1856 (void)SvNOK_on(sv);
1857 SvIsUV_on(sv);
607fa7f2 1858 SvUV_set(sv, UV_MAX);
28e5dec8
JH
1859 return IS_NUMBER_OVERFLOW_UV;
1860 }
c2988b20
NC
1861 (void)SvIOKp_on(sv);
1862 (void)SvNOK_on(sv);
1863 /* Can't use strtol etc to convert this string. (See truth table in
1864 sv_2iv */
1865 if (SvNVX(sv) <= (UV)IV_MAX) {
45977657 1866 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
1867 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1868 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
1869 } else {
1870 /* Integer is imprecise. NOK, IOKp */
1871 }
1872 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1873 }
1874 SvIsUV_on(sv);
607fa7f2 1875 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
1876 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
1877 if (SvUVX(sv) == UV_MAX) {
1878 /* As we know that NVs don't preserve UVs, UV_MAX cannot
1879 possibly be preserved by NV. Hence, it must be overflow.
1880 NOK, IOKp */
1881 return IS_NUMBER_OVERFLOW_UV;
1882 }
1883 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
1884 } else {
1885 /* Integer is imprecise. NOK, IOKp */
28e5dec8 1886 }
c2988b20 1887 return IS_NUMBER_OVERFLOW_IV;
28e5dec8 1888}
645c22ef
DM
1889#endif /* !NV_PRESERVES_UV*/
1890
af359546
NC
1891STATIC bool
1892S_sv_2iuv_common(pTHX_ SV *sv) {
97aff369 1893 dVAR;
af359546 1894 if (SvNOKp(sv)) {
28e5dec8
JH
1895 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
1896 * without also getting a cached IV/UV from it at the same time
1897 * (ie PV->NV conversion should detect loss of accuracy and cache
af359546
NC
1898 * IV or UV at same time to avoid this. */
1899 /* IV-over-UV optimisation - choose to cache IV if possible */
25da4f38
IZ
1900
1901 if (SvTYPE(sv) == SVt_NV)
1902 sv_upgrade(sv, SVt_PVNV);
1903
28e5dec8
JH
1904 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
1905 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
1906 certainly cast into the IV range at IV_MAX, whereas the correct
1907 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
1908 cases go to UV */
cab190d4
JD
1909#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1910 if (Perl_isnan(SvNVX(sv))) {
1911 SvUV_set(sv, 0);
1912 SvIsUV_on(sv);
fdbe6d7c 1913 return FALSE;
cab190d4 1914 }
cab190d4 1915#endif
28e5dec8 1916 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 1917 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
1918 if (SvNVX(sv) == (NV) SvIVX(sv)
1919#ifndef NV_PRESERVES_UV
1920 && (((UV)1 << NV_PRESERVES_UV_BITS) >
1921 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
1922 /* Don't flag it as "accurately an integer" if the number
1923 came from a (by definition imprecise) NV operation, and
1924 we're outside the range of NV integer precision */
1925#endif
1926 ) {
1927 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
1928 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 1929 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
1930 PTR2UV(sv),
1931 SvNVX(sv),
1932 SvIVX(sv)));
1933
1934 } else {
1935 /* IV not precise. No need to convert from PV, as NV
1936 conversion would already have cached IV if it detected
1937 that PV->IV would be better than PV->NV->IV
1938 flags already correct - don't set public IOK. */
1939 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 1940 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
1941 PTR2UV(sv),
1942 SvNVX(sv),
1943 SvIVX(sv)));
1944 }
1945 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
1946 but the cast (NV)IV_MIN rounds to a the value less (more
1947 negative) than IV_MIN which happens to be equal to SvNVX ??
1948 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
1949 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
1950 (NV)UVX == NVX are both true, but the values differ. :-(
1951 Hopefully for 2s complement IV_MIN is something like
1952 0x8000000000000000 which will be exact. NWC */
d460ef45 1953 }
25da4f38 1954 else {
607fa7f2 1955 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
1956 if (
1957 (SvNVX(sv) == (NV) SvUVX(sv))
1958#ifndef NV_PRESERVES_UV
1959 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
1960 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
1961 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
1962 /* Don't flag it as "accurately an integer" if the number
1963 came from a (by definition imprecise) NV operation, and
1964 we're outside the range of NV integer precision */
1965#endif
1966 )
1967 SvIOK_on(sv);
25da4f38 1968 SvIsUV_on(sv);
1c846c1f 1969 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 1970 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 1971 PTR2UV(sv),
57def98f
JH
1972 SvUVX(sv),
1973 SvUVX(sv)));
25da4f38 1974 }
748a9306
LW
1975 }
1976 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 1977 UV value;
504618e9 1978 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
af359546 1979 /* We want to avoid a possible problem when we cache an IV/ a UV which
25da4f38 1980 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
1981 the same as the direct translation of the initial string
1982 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
1983 be careful to ensure that the value with the .456 is around if the
1984 NV value is requested in the future).
1c846c1f 1985
af359546 1986 This means that if we cache such an IV/a UV, we need to cache the
25da4f38 1987 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 1988 cache the NV if we are sure it's not needed.
25da4f38 1989 */
16b7a9a4 1990
c2988b20
NC
1991 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
1992 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
1993 == IS_NUMBER_IN_UV) {
5e045b90 1994 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
1995 if (SvTYPE(sv) < SVt_PVIV)
1996 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 1997 (void)SvIOK_on(sv);
c2988b20
NC
1998 } else if (SvTYPE(sv) < SVt_PVNV)
1999 sv_upgrade(sv, SVt_PVNV);
28e5dec8 2000
f2524eef 2001 /* If NVs preserve UVs then we only use the UV value if we know that
c2988b20
NC
2002 we aren't going to call atof() below. If NVs don't preserve UVs
2003 then the value returned may have more precision than atof() will
2004 return, even though value isn't perfectly accurate. */
2005 if ((numtype & (IS_NUMBER_IN_UV
2006#ifdef NV_PRESERVES_UV
2007 | IS_NUMBER_NOT_INT
2008#endif
2009 )) == IS_NUMBER_IN_UV) {
2010 /* This won't turn off the public IOK flag if it was set above */
2011 (void)SvIOKp_on(sv);
2012
2013 if (!(numtype & IS_NUMBER_NEG)) {
2014 /* positive */;
2015 if (value <= (UV)IV_MAX) {
45977657 2016 SvIV_set(sv, (IV)value);
c2988b20 2017 } else {
af359546 2018 /* it didn't overflow, and it was positive. */
607fa7f2 2019 SvUV_set(sv, value);
c2988b20
NC
2020 SvIsUV_on(sv);
2021 }
2022 } else {
2023 /* 2s complement assumption */
2024 if (value <= (UV)IV_MIN) {
45977657 2025 SvIV_set(sv, -(IV)value);
c2988b20
NC
2026 } else {
2027 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2028 I'm assuming it will be rare. */
c2988b20
NC
2029 if (SvTYPE(sv) < SVt_PVNV)
2030 sv_upgrade(sv, SVt_PVNV);
2031 SvNOK_on(sv);
2032 SvIOK_off(sv);
2033 SvIOKp_on(sv);
9d6ce603 2034 SvNV_set(sv, -(NV)value);
45977657 2035 SvIV_set(sv, IV_MIN);
c2988b20
NC
2036 }
2037 }
2038 }
2039 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2040 will be in the previous block to set the IV slot, and the next
2041 block to set the NV slot. So no else here. */
2042
2043 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2044 != IS_NUMBER_IN_UV) {
2045 /* It wasn't an (integer that doesn't overflow the UV). */
3f7c398e 2046 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8 2047
c2988b20
NC
2048 if (! numtype && ckWARN(WARN_NUMERIC))
2049 not_a_number(sv);
28e5dec8 2050
65202027 2051#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2052 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2053 PTR2UV(sv), SvNVX(sv)));
65202027 2054#else
1779d84d 2055 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 2056 PTR2UV(sv), SvNVX(sv)));
65202027 2057#endif
28e5dec8 2058
28e5dec8 2059#ifdef NV_PRESERVES_UV
af359546
NC
2060 (void)SvIOKp_on(sv);
2061 (void)SvNOK_on(sv);
2062 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2063 SvIV_set(sv, I_V(SvNVX(sv)));
2064 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2065 SvIOK_on(sv);
2066 } else {
6f207bd3 2067 NOOP; /* Integer is imprecise. NOK, IOKp */
af359546
NC
2068 }
2069 /* UV will not work better than IV */
2070 } else {
2071 if (SvNVX(sv) > (NV)UV_MAX) {
2072 SvIsUV_on(sv);
2073 /* Integer is inaccurate. NOK, IOKp, is UV */
2074 SvUV_set(sv, UV_MAX);
af359546
NC
2075 } else {
2076 SvUV_set(sv, U_V(SvNVX(sv)));
2077 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2078 NV preservse UV so can do correct comparison. */
2079 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2080 SvIOK_on(sv);
af359546 2081 } else {
6f207bd3 2082 NOOP; /* Integer is imprecise. NOK, IOKp, is UV */
af359546
NC
2083 }
2084 }
4b0c9573 2085 SvIsUV_on(sv);
af359546 2086 }
28e5dec8 2087#else /* NV_PRESERVES_UV */
c2988b20
NC
2088 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2089 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
af359546 2090 /* The IV/UV slot will have been set from value returned by
c2988b20
NC
2091 grok_number above. The NV slot has just been set using
2092 Atof. */
560b0c46 2093 SvNOK_on(sv);
c2988b20
NC
2094 assert (SvIOKp(sv));
2095 } else {
2096 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2097 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2098 /* Small enough to preserve all bits. */
2099 (void)SvIOKp_on(sv);
2100 SvNOK_on(sv);
45977657 2101 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2102 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2103 SvIOK_on(sv);
2104 /* Assumption: first non-preserved integer is < IV_MAX,
2105 this NV is in the preserved range, therefore: */
2106 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2107 < (UV)IV_MAX)) {
32fdb065 2108 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
2109 }
2110 } else {
2111 /* IN_UV NOT_INT
2112 0 0 already failed to read UV.
2113 0 1 already failed to read UV.
2114 1 0 you won't get here in this case. IV/UV
2115 slot set, public IOK, Atof() unneeded.
2116 1 1 already read UV.
2117 so there's no point in sv_2iuv_non_preserve() attempting
2118 to use atol, strtol, strtoul etc. */
40a17c4c 2119 sv_2iuv_non_preserve (sv, numtype);
c2988b20
NC
2120 }
2121 }
28e5dec8 2122#endif /* NV_PRESERVES_UV */
25da4f38 2123 }
af359546
NC
2124 }
2125 else {
675c862f 2126 if (isGV_with_GP(sv))
a0933d07 2127 return glob_2number((GV *)sv);
180488f8 2128
af359546
NC
2129 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2130 if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
2131 report_uninit(sv);
2132 }
25da4f38
IZ
2133 if (SvTYPE(sv) < SVt_IV)
2134 /* Typically the caller expects that sv_any is not NULL now. */
2135 sv_upgrade(sv, SVt_IV);
af359546
NC
2136 /* Return 0 from the caller. */
2137 return TRUE;
2138 }
2139 return FALSE;
2140}
2141
2142/*
2143=for apidoc sv_2iv_flags
2144
2145Return the integer value of an SV, doing any necessary string
2146conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2147Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2148
2149=cut
2150*/
2151
2152IV
2153Perl_sv_2iv_flags(pTHX_ register SV *sv, I32 flags)
2154{
97aff369 2155 dVAR;
af359546 2156 if (!sv)
a0d0e21e 2157 return 0;
af359546
NC
2158 if (SvGMAGICAL(sv)) {
2159 if (flags & SV_GMAGIC)
2160 mg_get(sv);
2161 if (SvIOKp(sv))
2162 return SvIVX(sv);
2163 if (SvNOKp(sv)) {
2164 return I_V(SvNVX(sv));
2165 }
71c558c3
NC
2166 if (SvPOKp(sv) && SvLEN(sv)) {
2167 UV value;
2168 const int numtype
2169 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2170
2171 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2172 == IS_NUMBER_IN_UV) {
2173 /* It's definitely an integer */
2174 if (numtype & IS_NUMBER_NEG) {
2175 if (value < (UV)IV_MIN)
2176 return -(IV)value;
2177 } else {
2178 if (value < (UV)IV_MAX)
2179 return (IV)value;
2180 }
2181 }
2182 if (!numtype) {
2183 if (ckWARN(WARN_NUMERIC))
2184 not_a_number(sv);
2185 }
2186 return I_V(Atof(SvPVX_const(sv)));
2187 }
1c7ff15e
NC
2188 if (SvROK(sv)) {
2189 goto return_rok;
af359546 2190 }
1c7ff15e
NC
2191 assert(SvTYPE(sv) >= SVt_PVMG);
2192 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2193 } else if (SvTHINKFIRST(sv)) {
af359546 2194 if (SvROK(sv)) {
1c7ff15e 2195 return_rok:
af359546
NC
2196 if (SvAMAGIC(sv)) {
2197 SV * const tmpstr=AMG_CALLun(sv,numer);
2198 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2199 return SvIV(tmpstr);
2200 }
2201 }
2202 return PTR2IV(SvRV(sv));
2203 }
2204 if (SvIsCOW(sv)) {
2205 sv_force_normal_flags(sv, 0);
2206 }
2207 if (SvREADONLY(sv) && !SvOK(sv)) {
2208 if (ckWARN(WARN_UNINITIALIZED))
2209 report_uninit(sv);
2210 return 0;
2211 }
2212 }
2213 if (!SvIOKp(sv)) {
2214 if (S_sv_2iuv_common(aTHX_ sv))
2215 return 0;
79072805 2216 }
1d7c1841
GS
2217 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2218 PTR2UV(sv),SvIVX(sv)));
25da4f38 2219 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
2220}
2221
645c22ef 2222/*
891f9566 2223=for apidoc sv_2uv_flags
645c22ef
DM
2224
2225Return the unsigned integer value of an SV, doing any necessary string
891f9566
YST
2226conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2227Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
645c22ef
DM
2228
2229=cut
2230*/
2231
ff68c719 2232UV
891f9566 2233Perl_sv_2uv_flags(pTHX_ register SV *sv, I32 flags)
ff68c719 2234{
97aff369 2235 dVAR;
ff68c719 2236 if (!sv)
2237 return 0;
2238 if (SvGMAGICAL(sv)) {
891f9566
YST
2239 if (flags & SV_GMAGIC)
2240 mg_get(sv);
ff68c719 2241 if (SvIOKp(sv))
2242 return SvUVX(sv);
2243 if (SvNOKp(sv))
2244 return U_V(SvNVX(sv));
71c558c3
NC
2245 if (SvPOKp(sv) && SvLEN(sv)) {
2246 UV value;
2247 const int numtype
2248 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2249
2250 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2251 == IS_NUMBER_IN_UV) {
2252 /* It's definitely an integer */
2253 if (!(numtype & IS_NUMBER_NEG))
2254 return value;
2255 }
2256 if (!numtype) {
2257 if (ckWARN(WARN_NUMERIC))
2258 not_a_number(sv);
2259 }
2260 return U_V(Atof(SvPVX_const(sv)));
2261 }
1c7ff15e
NC
2262 if (SvROK(sv)) {
2263 goto return_rok;
3fe9a6f1 2264 }
1c7ff15e
NC
2265 assert(SvTYPE(sv) >= SVt_PVMG);
2266 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2267 } else if (SvTHINKFIRST(sv)) {
ff68c719 2268 if (SvROK(sv)) {
1c7ff15e 2269 return_rok:
deb46114
NC
2270 if (SvAMAGIC(sv)) {
2271 SV *const tmpstr = AMG_CALLun(sv,numer);
2272 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2273 return SvUV(tmpstr);
2274 }
2275 }
2276 return PTR2UV(SvRV(sv));
ff68c719 2277 }
765f542d
NC
2278 if (SvIsCOW(sv)) {
2279 sv_force_normal_flags(sv, 0);
8a818333 2280 }
0336b60e 2281 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2282 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2283 report_uninit(sv);
ff68c719 2284 return 0;
2285 }
2286 }
af359546
NC
2287 if (!SvIOKp(sv)) {
2288 if (S_sv_2iuv_common(aTHX_ sv))
2289 return 0;
ff68c719 2290 }
25da4f38 2291
1d7c1841
GS
2292 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2293 PTR2UV(sv),SvUVX(sv)));
25da4f38 2294 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 2295}
2296
645c22ef
DM
2297/*
2298=for apidoc sv_2nv
2299
2300Return the num value of an SV, doing any necessary string or integer
2301conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
2302macros.
2303
2304=cut
2305*/
2306
65202027 2307NV
864dbfa3 2308Perl_sv_2nv(pTHX_ register SV *sv)
79072805 2309{
97aff369 2310 dVAR;
79072805
LW
2311 if (!sv)
2312 return 0.0;
8990e307 2313 if (SvGMAGICAL(sv)) {
463ee0b2
LW
2314 mg_get(sv);
2315 if (SvNOKp(sv))
2316 return SvNVX(sv);
0aa395f8 2317 if ((SvPOKp(sv) && SvLEN(sv)) && !SvIOKp(sv)) {
041457d9 2318 if (!SvIOKp(sv) && ckWARN(WARN_NUMERIC) &&
504618e9 2319 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
a0d0e21e 2320 not_a_number(sv);
3f7c398e 2321 return Atof(SvPVX_const(sv));
a0d0e21e 2322 }
25da4f38 2323 if (SvIOKp(sv)) {
1c846c1f 2324 if (SvIsUV(sv))
65202027 2325 return (NV)SvUVX(sv);
25da4f38 2326 else
65202027 2327 return (NV)SvIVX(sv);
47a72cb8
NC
2328 }
2329 if (SvROK(sv)) {
2330 goto return_rok;
2331 }
2332 assert(SvTYPE(sv) >= SVt_PVMG);
2333 /* This falls through to the report_uninit near the end of the
2334 function. */
2335 } else if (SvTHINKFIRST(sv)) {
a0d0e21e 2336 if (SvROK(sv)) {
47a72cb8 2337 return_rok:
deb46114
NC
2338 if (SvAMAGIC(sv)) {
2339 SV *const tmpstr = AMG_CALLun(sv,numer);
2340 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2341 return SvNV(tmpstr);
2342 }
2343 }
2344 return PTR2NV(SvRV(sv));
a0d0e21e 2345 }
765f542d
NC
2346 if (SvIsCOW(sv)) {
2347 sv_force_normal_flags(sv, 0);
8a818333 2348 }
0336b60e 2349 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 2350 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2351 report_uninit(sv);
ed6116ce
LW
2352 return 0.0;
2353 }
79072805
LW
2354 }
2355 if (SvTYPE(sv) < SVt_NV) {
7e25a7e9
NC
2356 /* The logic to use SVt_PVNV if necessary is in sv_upgrade. */
2357 sv_upgrade(sv, SVt_NV);
906f284f 2358#ifdef USE_LONG_DOUBLE
097ee67d 2359 DEBUG_c({
f93f4e46 2360 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2361 PerlIO_printf(Perl_debug_log,
2362 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2363 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2364 RESTORE_NUMERIC_LOCAL();
2365 });
65202027 2366#else
572bbb43 2367 DEBUG_c({
f93f4e46 2368 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2369 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 2370 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2371 RESTORE_NUMERIC_LOCAL();
2372 });
572bbb43 2373#endif
79072805
LW
2374 }
2375 else if (SvTYPE(sv) < SVt_PVNV)
2376 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
2377 if (SvNOKp(sv)) {
2378 return SvNVX(sv);
61604483 2379 }
59d8ce62 2380 if (SvIOKp(sv)) {
9d6ce603 2381 SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
28e5dec8
JH
2382#ifdef NV_PRESERVES_UV
2383 SvNOK_on(sv);
2384#else
2385 /* Only set the public NV OK flag if this NV preserves the IV */
2386 /* Check it's not 0xFFFFFFFFFFFFFFFF */
2387 if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2388 : (SvIVX(sv) == I_V(SvNVX(sv))))
2389 SvNOK_on(sv);
2390 else
2391 SvNOKp_on(sv);
2392#endif
93a17b20 2393 }
748a9306 2394 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2395 UV value;
3f7c398e 2396 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
041457d9 2397 if (!SvIOKp(sv) && !numtype && ckWARN(WARN_NUMERIC))
a0d0e21e 2398 not_a_number(sv);
28e5dec8 2399#ifdef NV_PRESERVES_UV
c2988b20
NC
2400 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2401 == IS_NUMBER_IN_UV) {
5e045b90 2402 /* It's definitely an integer */
9d6ce603 2403 SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
c2988b20 2404 } else
3f7c398e 2405 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2406 SvNOK_on(sv);
2407#else
3f7c398e 2408 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2409 /* Only set the public NV OK flag if this NV preserves the value in
2410 the PV at least as well as an IV/UV would.
2411 Not sure how to do this 100% reliably. */
2412 /* if that shift count is out of range then Configure's test is
2413 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2414 UV_BITS */
2415 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 2416 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 2417 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
2418 } else if (!(numtype & IS_NUMBER_IN_UV)) {
2419 /* Can't use strtol etc to convert this string, so don't try.
2420 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
2421 SvNOK_on(sv);
2422 } else {
2423 /* value has been set. It may not be precise. */
2424 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2425 /* 2s complement assumption for (UV)IV_MIN */
2426 SvNOK_on(sv); /* Integer is too negative. */
2427 } else {
2428 SvNOKp_on(sv);
2429 SvIOKp_on(sv);
6fa402ec 2430
c2988b20 2431 if (numtype & IS_NUMBER_NEG) {
45977657 2432 SvIV_set(sv, -(IV)value);
c2988b20 2433 } else if (value <= (UV)IV_MAX) {
45977657 2434 SvIV_set(sv, (IV)value);
c2988b20 2435 } else {
607fa7f2 2436 SvUV_set(sv, value);
c2988b20
NC
2437 SvIsUV_on(sv);
2438 }
2439
2440 if (numtype & IS_NUMBER_NOT_INT) {
2441 /* I believe that even if the original PV had decimals,
2442 they are lost beyond the limit of the FP precision.
2443 However, neither is canonical, so both only get p
2444 flags. NWC, 2000/11/25 */
2445 /* Both already have p flags, so do nothing */
2446 } else {
66a1b24b 2447 const NV nv = SvNVX(sv);
c2988b20
NC
2448 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2449 if (SvIVX(sv) == I_V(nv)) {
2450 SvNOK_on(sv);
c2988b20 2451 } else {
c2988b20
NC
2452 /* It had no "." so it must be integer. */
2453 }
00b6aa41 2454 SvIOK_on(sv);
c2988b20
NC
2455 } else {
2456 /* between IV_MAX and NV(UV_MAX).
2457 Could be slightly > UV_MAX */
6fa402ec 2458
c2988b20
NC
2459 if (numtype & IS_NUMBER_NOT_INT) {
2460 /* UV and NV both imprecise. */
2461 } else {
66a1b24b 2462 const UV nv_as_uv = U_V(nv);
c2988b20
NC
2463
2464 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2465 SvNOK_on(sv);
c2988b20 2466 }
00b6aa41 2467 SvIOK_on(sv);
c2988b20
NC
2468 }
2469 }
2470 }
2471 }
2472 }
28e5dec8 2473#endif /* NV_PRESERVES_UV */
93a17b20 2474 }
79072805 2475 else {
f7877b28 2476 if (isGV_with_GP(sv)) {
19f6321d 2477 glob_2number((GV *)sv);
180488f8
NC
2478 return 0.0;
2479 }
2480
041457d9 2481 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
29489e7c 2482 report_uninit(sv);
7e25a7e9
NC
2483 assert (SvTYPE(sv) >= SVt_NV);
2484 /* Typically the caller expects that sv_any is not NULL now. */
2485 /* XXX Ilya implies that this is a bug in callers that assume this
2486 and ideally should be fixed. */
a0d0e21e 2487 return 0.0;
79072805 2488 }
572bbb43 2489#if defined(USE_LONG_DOUBLE)
097ee67d 2490 DEBUG_c({
f93f4e46 2491 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2492 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2493 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2494 RESTORE_NUMERIC_LOCAL();
2495 });
65202027 2496#else
572bbb43 2497 DEBUG_c({
f93f4e46 2498 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2499 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 2500 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2501 RESTORE_NUMERIC_LOCAL();
2502 });
572bbb43 2503#endif
463ee0b2 2504 return SvNVX(sv);
79072805
LW
2505}
2506
645c22ef
DM
2507/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2508 * UV as a string towards the end of buf, and return pointers to start and
2509 * end of it.
2510 *
2511 * We assume that buf is at least TYPE_CHARS(UV) long.
2512 */
2513
864dbfa3 2514static char *
aec46f14 2515S_uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
25da4f38 2516{
25da4f38 2517 char *ptr = buf + TYPE_CHARS(UV);
823a54a3 2518 char * const ebuf = ptr;
25da4f38 2519 int sign;
25da4f38
IZ
2520
2521 if (is_uv)
2522 sign = 0;
2523 else if (iv >= 0) {
2524 uv = iv;
2525 sign = 0;
2526 } else {
2527 uv = -iv;
2528 sign = 1;
2529 }
2530 do {
eb160463 2531 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
2532 } while (uv /= 10);
2533 if (sign)
2534 *--ptr = '-';
2535 *peob = ebuf;
2536 return ptr;
2537}
2538
9af30d34
NC
2539/* stringify_regexp(): private routine for use by sv_2pv_flags(): converts
2540 * a regexp to its stringified form.
2541 */
2542
2543static char *
2544S_stringify_regexp(pTHX_ SV *sv, MAGIC *mg, STRLEN *lp) {
97aff369 2545 dVAR;
00b6aa41 2546 const regexp * const re = (regexp *)mg->mg_obj;
9af30d34
NC
2547
2548 if (!mg->mg_ptr) {
2549 const char *fptr = "msix";
2550 char reflags[6];
2551 char ch;
2552 int left = 0;
2553 int right = 4;
00b6aa41 2554 bool need_newline = 0;
9af30d34
NC
2555 U16 reganch = (U16)((re->reganch & PMf_COMPILETIME) >> 12);
2556
2557 while((ch = *fptr++)) {
2558 if(reganch & 1) {
2559 reflags[left++] = ch;
2560 }
2561 else {
2562 reflags[right--] = ch;
2563 }
2564 reganch >>= 1;
2565 }
2566 if(left != 4) {
2567 reflags[left] = '-';
2568 left = 5;
2569 }
2570
2571 mg->mg_len = re->prelen + 4 + left;
2572 /*
2573 * If /x was used, we have to worry about a regex ending with a
2574 * comment later being embedded within another regex. If so, we don't
2575 * want this regex's "commentization" to leak out to the right part of
2576 * the enclosing regex, we must cap it with a newline.
2577 *
2578 * So, if /x was used, we scan backwards from the end of the regex. If
2579 * we find a '#' before we find a newline, we need to add a newline
2580 * ourself. If we find a '\n' first (or if we don't find '#' or '\n'),
2581 * we don't need to add anything. -jfriedl
2582 */
2583 if (PMf_EXTENDED & re->reganch) {
2584 const char *endptr = re->precomp + re->prelen;
2585 while (endptr >= re->precomp) {
2586 const char c = *(endptr--);
2587 if (c == '\n')
2588 break; /* don't need another */
2589 if (c == '#') {
2590 /* we end while in a comment, so we need a newline */
2591 mg->mg_len++; /* save space for it */
2592 need_newline = 1; /* note to add it */
2593 break;
2594 }
2595 }
2596 }
2597
2598 Newx(mg->mg_ptr, mg->mg_len + 1 + left, char);
2599 mg->mg_ptr[0] = '(';
2600 mg->mg_ptr[1] = '?';
2601 Copy(reflags, mg->mg_ptr+2, left, char);
2602 *(mg->mg_ptr+left+2) = ':';
2603 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
2604 if (need_newline)
2605 mg->mg_ptr[mg->mg_len - 2] = '\n';
2606 mg->mg_ptr[mg->mg_len - 1] = ')';
2607 mg->mg_ptr[mg->mg_len] = 0;
2608 }
2609 PL_reginterp_cnt += re->program[0].next_off;
2610
2611 if (re->reganch & ROPT_UTF8)
2612 SvUTF8_on(sv);
2613 else
2614 SvUTF8_off(sv);
2615 if (lp)
2616 *lp = mg->mg_len;
2617 return mg->mg_ptr;
2618}
2619
645c22ef
DM
2620/*
2621=for apidoc sv_2pv_flags
2622
ff276b08 2623Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
2624If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2625if necessary.
2626Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2627usually end up here too.
2628
2629=cut
2630*/
2631
8d6d96c1
HS
2632char *
2633Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
2634{
97aff369 2635 dVAR;
79072805 2636 register char *s;
79072805 2637
463ee0b2 2638 if (!sv) {
cdb061a3
NC
2639 if (lp)
2640 *lp = 0;
73d840c0 2641 return (char *)"";
463ee0b2 2642 }
8990e307 2643 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
2644 if (flags & SV_GMAGIC)
2645 mg_get(sv);
463ee0b2 2646 if (SvPOKp(sv)) {
cdb061a3
NC
2647 if (lp)
2648 *lp = SvCUR(sv);
10516c54
NC
2649 if (flags & SV_MUTABLE_RETURN)
2650 return SvPVX_mutable(sv);
4d84ee25
NC
2651 if (flags & SV_CONST_RETURN)
2652 return (char *)SvPVX_const(sv);
463ee0b2
LW
2653 return SvPVX(sv);
2654 }
75dfc8ec
NC
2655 if (SvIOKp(sv) || SvNOKp(sv)) {
2656 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
75dfc8ec
NC
2657 STRLEN len;
2658
2659 if (SvIOKp(sv)) {
e80fed9d
JH
2660 len = SvIsUV(sv)
2661#ifdef USE_SNPRINTF
2662 ? snprintf(tbuf, sizeof(tbuf), "%"UVuf, (UV)SvUVX(sv))
2663 : snprintf(tbuf, sizeof(tbuf), "%"IVdf, (IV)SvIVX(sv));
2664#else
2665 ? my_sprintf(tbuf, "%"UVuf, (UV)SvUVX(sv))
2666 : my_sprintf(tbuf, "%"IVdf, (IV)SvIVX(sv));
2667#endif /* #ifdef USE_SNPRINTF */
75dfc8ec 2668 } else {
e8ada2d0
NC
2669 Gconvert(SvNVX(sv), NV_DIG, 0, tbuf);
2670 len = strlen(tbuf);
75dfc8ec 2671 }
b5b886f0
NC
2672 assert(!SvROK(sv));
2673 {
75dfc8ec
NC
2674 dVAR;
2675
2676#ifdef FIXNEGATIVEZERO
e8ada2d0
NC
2677 if (len == 2 && tbuf[0] == '-' && tbuf[1] == '0') {
2678 tbuf[0] = '0';
2679 tbuf[1] = 0;
75dfc8ec
NC
2680 len = 1;
2681 }
2682#endif
2683 SvUPGRADE(sv, SVt_PV);
2684 if (lp)
2685 *lp = len;
2686 s = SvGROW_mutable(sv, len + 1);
2687 SvCUR_set(sv, len);
2688 SvPOKp_on(sv);
e8ada2d0 2689 return memcpy(s, tbuf, len + 1);
75dfc8ec 2690 }
463ee0b2 2691 }
1c7ff15e
NC
2692 if (SvROK(sv)) {
2693 goto return_rok;
2694 }
2695 assert(SvTYPE(sv) >= SVt_PVMG);
2696 /* This falls through to the report_uninit near the end of the
2697 function. */
2698 } else if (SvTHINKFIRST(sv)) {
ed6116ce 2699 if (SvROK(sv)) {
1c7ff15e 2700 return_rok:
deb46114
NC
2701 if (SvAMAGIC(sv)) {
2702 SV *const tmpstr = AMG_CALLun(sv,string);
2703 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2704 /* Unwrap this: */
2705 /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
2706 */
2707
2708 char *pv;
2709 if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
2710 if (flags & SV_CONST_RETURN) {
2711 pv = (char *) SvPVX_const(tmpstr);
2712 } else {
2713 pv = (flags & SV_MUTABLE_RETURN)
2714 ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
2715 }
2716 if (lp)
2717 *lp = SvCUR(tmpstr);
50adf7d2 2718 } else {
deb46114 2719 pv = sv_2pv_flags(tmpstr, lp, flags);
50adf7d2 2720 }
deb46114
NC
2721 if (SvUTF8(tmpstr))
2722 SvUTF8_on(sv);
2723 else
2724 SvUTF8_off(sv);
2725 return pv;
50adf7d2 2726 }
deb46114
NC
2727 }
2728 {
75dfc8ec 2729 SV *tsv;
f9277f47 2730 MAGIC *mg;
d8eae41e
NC
2731 const SV *const referent = (SV*)SvRV(sv);
2732
2733 if (!referent) {
396482e1 2734 tsv = sv_2mortal(newSVpvs("NULLREF"));
042dae7a
NC
2735 } else if (SvTYPE(referent) == SVt_PVMG
2736 && ((SvFLAGS(referent) &
2737 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
2738 == (SVs_OBJECT|SVs_SMG))
2739 && (mg = mg_find(referent, PERL_MAGIC_qr))) {
c445ea15 2740 return stringify_regexp(sv, mg, lp);
d8eae41e
NC
2741 } else {
2742 const char *const typestr = sv_reftype(referent, 0);
2743
2744 tsv = sv_newmortal();
2745 if (SvOBJECT(referent)) {
2746 const char *const name = HvNAME_get(SvSTASH(referent));
2747 Perl_sv_setpvf(aTHX_ tsv, "%s=%s(0x%"UVxf")",
2748 name ? name : "__ANON__" , typestr,
2749 PTR2UV(referent));
2750 }
2751 else
2752 Perl_sv_setpvf(aTHX_ tsv, "%s(0x%"UVxf")", typestr,
2753 PTR2UV(referent));
c080367d 2754 }
042dae7a
NC
2755 if (lp)
2756 *lp = SvCUR(tsv);
2757 return SvPVX(tsv);
463ee0b2 2758 }
79072805 2759 }
0336b60e 2760 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2761 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2762 report_uninit(sv);
cdb061a3
NC
2763 if (lp)
2764 *lp = 0;
73d840c0 2765 return (char *)"";
79072805 2766 }
79072805 2767 }
28e5dec8
JH
2768 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
2769 /* I'm assuming that if both IV and NV are equally valid then
2770 converting the IV is going to be more efficient */
e1ec3a88
AL
2771 const U32 isIOK = SvIOK(sv);
2772 const U32 isUIOK = SvIsUV(sv);
28e5dec8
JH
2773 char buf[TYPE_CHARS(UV)];
2774 char *ebuf, *ptr;
2775
2776 if (SvTYPE(sv) < SVt_PVIV)
2777 sv_upgrade(sv, SVt_PVIV);
4ea1d550 2778 ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
5902b6a9
NC
2779 /* inlined from sv_setpvn */
2780 SvGROW_mutable(sv, (STRLEN)(ebuf - ptr + 1));
4d84ee25 2781 Move(ptr,SvPVX_mutable(sv),ebuf - ptr,char);
28e5dec8
JH
2782 SvCUR_set(sv, ebuf - ptr);
2783 s = SvEND(sv);
2784 *s = '\0';
2785 if (isIOK)
2786 SvIOK_on(sv);
2787 else
2788 SvIOKp_on(sv);
2789 if (isUIOK)
2790 SvIsUV_on(sv);
2791 }
2792 else if (SvNOKp(sv)) {
c81271c3 2793 const int olderrno = errno;
79072805
LW
2794 if (SvTYPE(sv) < SVt_PVNV)
2795 sv_upgrade(sv, SVt_PVNV);
1c846c1f 2796 /* The +20 is pure guesswork. Configure test needed. --jhi */
5902b6a9 2797 s = SvGROW_mutable(sv, NV_DIG + 20);
c81271c3 2798 /* some Xenix systems wipe out errno here */
79072805 2799#ifdef apollo
463ee0b2 2800 if (SvNVX(sv) == 0.0)
79072805
LW
2801 (void)strcpy(s,"0");
2802 else
2803#endif /*apollo*/
bbce6d69 2804 {
2d4389e4 2805 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 2806 }
79072805 2807 errno = olderrno;
a0d0e21e
LW
2808#ifdef FIXNEGATIVEZERO
2809 if (*s == '-' && s[1] == '0' && !s[2])
2810 strcpy(s,"0");
2811#endif
79072805
LW
2812 while (*s) s++;
2813#ifdef hcx
2814 if (s[-1] == '.')
46fc3d4c 2815 *--s = '\0';
79072805
LW
2816#endif
2817 }
79072805 2818 else {
675c862f 2819 if (isGV_with_GP(sv))
19f6321d 2820 return glob_2pv((GV *)sv, lp);
180488f8 2821
041457d9 2822 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
29489e7c 2823 report_uninit(sv);
cdb061a3 2824 if (lp)
00b6aa41 2825 *lp = 0;
25da4f38
IZ
2826 if (SvTYPE(sv) < SVt_PV)
2827 /* Typically the caller expects that sv_any is not NULL now. */
2828 sv_upgrade(sv, SVt_PV);
73d840c0 2829 return (char *)"";
79072805 2830 }
cdb061a3 2831 {
823a54a3 2832 const STRLEN len = s - SvPVX_const(sv);
cdb061a3
NC
2833 if (lp)
2834 *lp = len;
2835 SvCUR_set(sv, len);
2836 }
79072805 2837 SvPOK_on(sv);
1d7c1841 2838 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 2839 PTR2UV(sv),SvPVX_const(sv)));
4d84ee25
NC
2840 if (flags & SV_CONST_RETURN)
2841 return (char *)SvPVX_const(sv);
10516c54
NC
2842 if (flags & SV_MUTABLE_RETURN)
2843 return SvPVX_mutable(sv);
463ee0b2
LW
2844 return SvPVX(sv);
2845}
2846
645c22ef 2847/*
6050d10e
JP
2848=for apidoc sv_copypv
2849
2850Copies a stringified representation of the source SV into the
2851destination SV. Automatically performs any necessary mg_get and
54f0641b 2852coercion of numeric values into strings. Guaranteed to preserve
6050d10e 2853UTF-8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
2854sv_2pv[_flags] but operates directly on an SV instead of just the
2855string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
2856would lose the UTF-8'ness of the PV.
2857
2858=cut
2859*/
2860
2861void
2862Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
2863{
446eaa42 2864 STRLEN len;
53c1dcc0 2865 const char * const s = SvPV_const(ssv,len);
cb50f42d 2866 sv_setpvn(dsv,s,len);
446eaa42 2867 if (SvUTF8(ssv))
cb50f42d 2868 SvUTF8_on(dsv);
446eaa42 2869 else
cb50f42d 2870 SvUTF8_off(dsv);
6050d10e
JP
2871}
2872
2873/*
645c22ef
DM
2874=for apidoc sv_2pvbyte
2875
2876Return a pointer to the byte-encoded representation of the SV, and set *lp
1e54db1a 2877to its length. May cause the SV to be downgraded from UTF-8 as a
645c22ef
DM
2878side-effect.
2879
2880Usually accessed via the C<SvPVbyte> macro.
2881
2882=cut
2883*/
2884
7340a771
GS
2885char *
2886Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
2887{
0875d2fe 2888 sv_utf8_downgrade(sv,0);
97972285 2889 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771
GS
2890}
2891
645c22ef 2892/*
035cbb0e
RGS
2893=for apidoc sv_2pvutf8
2894
2895Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
2896to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
2897
2898Usually accessed via the C<SvPVutf8> macro.
2899
2900=cut
2901*/
645c22ef 2902
7340a771
GS
2903char *
2904Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
2905{
035cbb0e
RGS
2906 sv_utf8_upgrade(sv);
2907 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771 2908}
1c846c1f 2909
7ee2227d 2910
645c22ef
DM
2911/*
2912=for apidoc sv_2bool
2913
2914This function is only called on magical items, and is only used by
8cf8f3d1 2915sv_true() or its macro equivalent.
645c22ef
DM
2916
2917=cut
2918*/
2919
463ee0b2 2920bool
864dbfa3 2921Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 2922{
97aff369 2923 dVAR;
5b295bef 2924 SvGETMAGIC(sv);
463ee0b2 2925
a0d0e21e
LW
2926 if (!SvOK(sv))
2927 return 0;
2928 if (SvROK(sv)) {
fabdb6c0
AL
2929 if (SvAMAGIC(sv)) {
2930 SV * const tmpsv = AMG_CALLun(sv,bool_);
2931 if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2932 return (bool)SvTRUE(tmpsv);
2933 }
2934 return SvRV(sv) != 0;
a0d0e21e 2935 }
463ee0b2 2936 if (SvPOKp(sv)) {
53c1dcc0
AL
2937 register XPV* const Xpvtmp = (XPV*)SvANY(sv);
2938 if (Xpvtmp &&
339049b0 2939 (*sv->sv_u.svu_pv > '0' ||
11343788 2940 Xpvtmp->xpv_cur > 1 ||
339049b0 2941 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
463ee0b2
LW
2942 return 1;
2943 else
2944 return 0;
2945 }
2946 else {
2947 if (SvIOKp(sv))
2948 return SvIVX(sv) != 0;
2949 else {
2950 if (SvNOKp(sv))
2951 return SvNVX(sv) != 0.0;
180488f8 2952 else {
f7877b28 2953 if (isGV_with_GP(sv))
180488f8
NC
2954 return TRUE;
2955 else
2956 return FALSE;
2957 }
463ee0b2
LW
2958 }
2959 }
79072805
LW
2960}
2961
c461cf8f
JH
2962/*
2963=for apidoc sv_utf8_upgrade
2964
78ea37eb 2965Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 2966Forces the SV to string form if it is not already.
4411f3b6
NIS
2967Always sets the SvUTF8 flag to avoid future validity checks even
2968if all the bytes have hibit clear.
c461cf8f 2969
13a6c0e0
JH
2970This is not as a general purpose byte encoding to Unicode interface:
2971use the Encode extension for that.
2972
8d6d96c1
HS
2973=for apidoc sv_utf8_upgrade_flags
2974
78ea37eb 2975Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 2976Forces the SV to string form if it is not already.
8d6d96c1
HS
2977Always sets the SvUTF8 flag to avoid future validity checks even
2978if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
2979will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
2980C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
2981
13a6c0e0
JH
2982This is not as a general purpose byte encoding to Unicode interface:
2983use the Encode extension for that.
2984
8d6d96c1
HS
2985=cut
2986*/
2987
2988STRLEN
2989Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
2990{
97aff369 2991 dVAR;
808c356f
RGS
2992 if (sv == &PL_sv_undef)
2993 return 0;
e0e62c2a
NIS
2994 if (!SvPOK(sv)) {
2995 STRLEN len = 0;
d52b7888
NC
2996 if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
2997 (void) sv_2pv_flags(sv,&len, flags);
2998 if (SvUTF8(sv))
2999 return len;
3000 } else {
3001 (void) SvPV_force(sv,len);
3002 }
e0e62c2a 3003 }
4411f3b6 3004
f5cee72b 3005 if (SvUTF8(sv)) {
5fec3b1d 3006 return SvCUR(sv);
f5cee72b 3007 }
5fec3b1d 3008
765f542d
NC
3009 if (SvIsCOW(sv)) {
3010 sv_force_normal_flags(sv, 0);
db42d148
NIS
3011 }
3012
88632417 3013 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
799ef3cb 3014 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 3015 else { /* Assume Latin-1/EBCDIC */
c4e7c712
NC
3016 /* This function could be much more efficient if we
3017 * had a FLAG in SVs to signal if there are any hibit
3018 * chars in the PV. Given that there isn't such a flag
3019 * make the loop as fast as possible. */
00b6aa41 3020 const U8 * const s = (U8 *) SvPVX_const(sv);
c4420975 3021 const U8 * const e = (U8 *) SvEND(sv);
93524f2b 3022 const U8 *t = s;
c4e7c712
NC
3023
3024 while (t < e) {
53c1dcc0 3025 const U8 ch = *t++;
00b6aa41
AL
3026 /* Check for hi bit */
3027 if (!NATIVE_IS_INVARIANT(ch)) {
3028 STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
3029 U8 * const recoded = bytes_to_utf8((U8*)s, &len);
3030
3031 SvPV_free(sv); /* No longer using what was there before. */
3032 SvPV_set(sv, (char*)recoded);
3033 SvCUR_set(sv, len - 1);
3034 SvLEN_set(sv, len); /* No longer know the real size. */
c4e7c712 3035 break;
00b6aa41 3036 }
c4e7c712
NC
3037 }
3038 /* Mark as UTF-8 even if no hibit - saves scanning loop */
3039 SvUTF8_on(sv);
560a288e 3040 }
4411f3b6 3041 return SvCUR(sv);
560a288e
GS
3042}
3043
c461cf8f
JH
3044/*
3045=for apidoc sv_utf8_downgrade
3046
78ea37eb
TS
3047Attempts to convert the PV of an SV from characters to bytes.
3048If the PV contains a character beyond byte, this conversion will fail;
3049in this case, either returns false or, if C<fail_ok> is not
c461cf8f
JH
3050true, croaks.
3051
13a6c0e0
JH
3052This is not as a general purpose Unicode to byte encoding interface:
3053use the Encode extension for that.
3054
c461cf8f
JH
3055=cut
3056*/
3057
560a288e
GS
3058bool
3059Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
3060{
97aff369 3061 dVAR;
78ea37eb 3062 if (SvPOKp(sv) && SvUTF8(sv)) {
fa301091 3063 if (SvCUR(sv)) {
03cfe0ae 3064 U8 *s;
652088fc 3065 STRLEN len;
fa301091 3066
765f542d
NC
3067 if (SvIsCOW(sv)) {
3068 sv_force_normal_flags(sv, 0);
3069 }
03cfe0ae
NIS
3070 s = (U8 *) SvPV(sv, len);
3071 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
3072 if (fail_ok)
3073 return FALSE;
3074 else {
3075 if (PL_op)
3076 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 3077 OP_DESC(PL_op));
fa301091
JH
3078 else
3079 Perl_croak(aTHX_ "Wide character");
3080 }
4b3603a4 3081 }
b162af07 3082 SvCUR_set(sv, len);
67e989fb 3083 }
560a288e 3084 }
ffebcc3e 3085 SvUTF8_off(sv);
560a288e
GS
3086 return TRUE;
3087}
3088
c461cf8f
JH
3089/*
3090=for apidoc sv_utf8_encode
3091
78ea37eb
TS
3092Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3093flag off so that it looks like octets again.
c461cf8f
JH
3094
3095=cut
3096*/
3097
560a288e
GS
3098void
3099Perl_sv_utf8_encode(pTHX_ register SV *sv)
3100{
4411f3b6 3101 (void) sv_utf8_upgrade(sv);
4c94c214
NC
3102 if (SvIsCOW(sv)) {
3103 sv_force_normal_flags(sv, 0);
3104 }
3105 if (SvREADONLY(sv)) {
3106 Perl_croak(aTHX_ PL_no_modify);
3107 }
560a288e
GS
3108 SvUTF8_off(sv);
3109}
3110
4411f3b6
NIS
3111/*
3112=for apidoc sv_utf8_decode
3113
78ea37eb
TS
3114If the PV of the SV is an octet sequence in UTF-8
3115and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3116so that it looks like a character. If the PV contains only single-byte
3117characters, the C<SvUTF8> flag stays being off.
3118Scans PV for validity and returns false if the PV is invalid UTF-8.
4411f3b6
NIS
3119
3120=cut
3121*/
3122
560a288e
GS
3123bool
3124Perl_sv_utf8_decode(pTHX_ register SV *sv)
3125{
78ea37eb 3126 if (SvPOKp(sv)) {
93524f2b
NC
3127 const U8 *c;
3128 const U8 *e;
9cbac4c7 3129
645c22ef
DM
3130 /* The octets may have got themselves encoded - get them back as
3131 * bytes
3132 */
3133 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
3134 return FALSE;
3135
3136 /* it is actually just a matter of turning the utf8 flag on, but
3137 * we want to make sure everything inside is valid utf8 first.
3138 */
93524f2b 3139 c = (const U8 *) SvPVX_const(sv);
63cd0674 3140 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 3141 return FALSE;
93524f2b 3142 e = (const U8 *) SvEND(sv);
511c2ff0 3143 while (c < e) {
b64e5050 3144 const U8 ch = *c++;
c4d5f83a 3145 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
3146 SvUTF8_on(sv);
3147 break;
3148 }
560a288e 3149 }
560a288e
GS
3150 }
3151 return TRUE;
3152}
3153
954c1994
GS
3154/*
3155=for apidoc sv_setsv
3156
645c22ef
DM
3157Copies the contents of the source SV C<ssv> into the destination SV
3158C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3159function if the source SV needs to be reused. Does not handle 'set' magic.
3160Loosely speaking, it performs a copy-by-value, obliterating any previous
3161content of the destination.
3162
3163You probably want to use one of the assortment of wrappers, such as
3164C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3165C<SvSetMagicSV_nosteal>.
3166
8d6d96c1
HS
3167=for apidoc sv_setsv_flags
3168
645c22ef
DM
3169Copies the contents of the source SV C<ssv> into the destination SV
3170C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3171function if the source SV needs to be reused. Does not handle 'set' magic.
3172Loosely speaking, it performs a copy-by-value, obliterating any previous
3173content of the destination.
3174If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
5fcdf167
NC
3175C<ssv> if appropriate, else not. If the C<flags> parameter has the
3176C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
3177and C<sv_setsv_nomg> are implemented in terms of this function.
645c22ef
DM
3178
3179You probably want to use one of the assortment of wrappers, such as
3180C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3181C<SvSetMagicSV_nosteal>.
3182
3183This is the primary function for copying scalars, and most other
3184copy-ish functions and macros use this underneath.
8d6d96c1
HS
3185
3186=cut
3187*/
3188
5d0301b7 3189static void
2eb42952 3190S_glob_assign_glob(pTHX_ SV *dstr, SV *sstr, const int dtype)
5d0301b7
NC
3191{
3192 if (dtype != SVt_PVGV) {
3193 const char * const name = GvNAME(sstr);
3194 const STRLEN len = GvNAMELEN(sstr);
3195 /* don't upgrade SVt_PVLV: it can hold a glob */
f7877b28
NC
3196 if (dtype != SVt_PVLV) {
3197 if (dtype >= SVt_PV) {
3198 SvPV_free(dstr);
3199 SvPV_set(dstr, 0);
3200 SvLEN_set(dstr, 0);
3201 SvCUR_set(dstr, 0);
3202 }
5d0301b7 3203 sv_upgrade(dstr, SVt_PVGV);
dedf8e73
NC
3204 (void)SvOK_off(dstr);
3205 SvSCREAM_on(dstr);
f7877b28 3206 }
5d0301b7
NC
3207 GvSTASH(dstr) = GvSTASH(sstr);
3208 if (GvSTASH(dstr))
3209 Perl_sv_add_backref(aTHX_ (SV*)GvSTASH(dstr), dstr);
ae8cc45f 3210 gv_name_set((GV *)dstr, name, len, GV_ADD);
5d0301b7
NC
3211 SvFAKE_on(dstr); /* can coerce to non-glob */
3212 }
3213
3214#ifdef GV_UNIQUE_CHECK
3215 if (GvUNIQUE((GV*)dstr)) {
3216 Perl_croak(aTHX_ PL_no_modify);
3217 }
3218#endif
3219
f7877b28
NC
3220 gp_free((GV*)dstr);
3221 SvSCREAM_off(dstr);
5d0301b7 3222 (void)SvOK_off(dstr);
f7877b28 3223 SvSCREAM_on(dstr);
dedf8e73 3224 GvINTRO_off(dstr); /* one-shot flag */
5d0301b7
NC
3225 GvGP(dstr) = gp_ref(GvGP(sstr));
3226 if (SvTAINTED(sstr))
3227 SvTAINT(dstr);
3228 if (GvIMPORTED(dstr) != GVf_IMPORTED
3229 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3230 {
3231 GvIMPORTED_on(dstr);
3232 }
3233 GvMULTI_on(dstr);
3234 return;
3235}
3236
b8473700 3237static void
2eb42952 3238S_glob_assign_ref(pTHX_ SV *dstr, SV *sstr) {
b8473700
NC
3239 SV * const sref = SvREFCNT_inc(SvRV(sstr));
3240 SV *dref = NULL;
3241 const int intro = GvINTRO(dstr);
2440974c 3242 SV **location;
3386d083 3243 U8 import_flag = 0;
27242d61
NC
3244 const U32 stype = SvTYPE(sref);
3245
b8473700
NC
3246
3247#ifdef GV_UNIQUE_CHECK
3248 if (GvUNIQUE((GV*)dstr)) {
3249 Perl_croak(aTHX_ PL_no_modify);
3250 }
3251#endif
3252
3253 if (intro) {
3254 GvINTRO_off(dstr); /* one-shot flag */
3255 GvLINE(dstr) = CopLINE(PL_curcop);
3256 GvEGV(dstr) = (GV*)dstr;
3257 }
3258 GvMULTI_on(dstr);
27242d61 3259 switch (stype) {
b8473700 3260 case SVt_PVCV:
27242d61
NC
3261 location = (SV **) &GvCV(dstr);
3262 import_flag = GVf_IMPORTED_CV;
3263 goto common;
3264 case SVt_PVHV:
3265 location = (SV **) &GvHV(dstr);
3266 import_flag = GVf_IMPORTED_HV;
3267 goto common;
3268 case SVt_PVAV:
3269 location = (SV **) &GvAV(dstr);
3270 import_flag = GVf_IMPORTED_AV;
3271 goto common;
3272 case SVt_PVIO:
3273 location = (SV **) &GvIOp(dstr);
3274 goto common;
3275 case SVt_PVFM:
3276 location = (SV **) &GvFORM(dstr);
3277 default:
3278 location = &GvSV(dstr);
3279 import_flag = GVf_IMPORTED_SV;
3280 common:
b8473700 3281 if (intro) {
27242d61
NC
3282 if (stype == SVt_PVCV) {
3283 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
3284 SvREFCNT_dec(GvCV(dstr));
3285 GvCV(dstr) = NULL;
3286 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3287 PL_sub_generation++;
3288 }
b8473700 3289 }
27242d61 3290 SAVEGENERICSV(*location);
b8473700
NC
3291 }
3292 else
27242d61
NC
3293 dref = *location;
3294 if (stype == SVt_PVCV && *location != sref) {
3295 CV* const cv = (CV*)*location;
b8473700
NC
3296 if (cv) {
3297 if (!GvCVGEN((GV*)dstr) &&
3298 (CvROOT(cv) || CvXSUB(cv)))
3299 {
3300 /* Redefining a sub - warning is mandatory if
3301 it was a const and its value changed. */
3302 if (CvCONST(cv) && CvCONST((CV*)sref)
3303 && cv_const_sv(cv) == cv_const_sv((CV*)sref)) {
6f207bd3 3304 NOOP;
b8473700
NC
3305 /* They are 2 constant subroutines generated from
3306 the same constant. This probably means that
3307 they are really the "same" proxy subroutine
3308 instantiated in 2 places. Most likely this is
3309 when a constant is exported twice. Don't warn.
3310 */
3311 }
3312 else if (ckWARN(WARN_REDEFINE)
3313 || (CvCONST(cv)
3314 && (!CvCONST((CV*)sref)
3315 || sv_cmp(cv_const_sv(cv),
3316 cv_const_sv((CV*)sref))))) {
3317 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
3318 CvCONST(cv)
3319 ? "Constant subroutine %s::%s redefined"
3320 : "Subroutine %s::%s redefined",
3321 HvNAME_get(GvSTASH((GV*)dstr)),
3322 GvENAME((GV*)dstr));
3323 }
3324 }
3325 if (!intro)
cbf82dd0
NC
3326 cv_ckproto_len(cv, (GV*)dstr,
3327 SvPOK(sref) ? SvPVX_const(sref) : NULL,
3328 SvPOK(sref) ? SvCUR(sref) : 0);
b8473700 3329 }
b8473700
NC
3330 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3331 GvASSUMECV_on(dstr);
3332 PL_sub_generation++;
3333 }
2440974c 3334 *location = sref;
3386d083
NC
3335 if (import_flag && !(GvFLAGS(dstr) & import_flag)
3336 && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
3337 GvFLAGS(dstr) |= import_flag;
b8473700
NC
3338 }
3339 break;
3340 }
b37c2d43 3341 SvREFCNT_dec(dref);
b8473700
NC
3342 if (SvTAINTED(sstr))
3343 SvTAINT(dstr);
3344 return;
3345}
3346
8d6d96c1
HS
3347void
3348Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
3349{
97aff369 3350 dVAR;
8990e307
LW
3351 register U32 sflags;
3352 register int dtype;
3353 register int stype;
463ee0b2 3354
79072805
LW
3355 if (sstr == dstr)
3356 return;
765f542d 3357 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 3358 if (!sstr)
3280af22 3359 sstr = &PL_sv_undef;
8990e307
LW
3360 stype = SvTYPE(sstr);
3361 dtype = SvTYPE(dstr);
79072805 3362
a0d0e21e 3363 SvAMAGIC_off(dstr);
7a5fa8a2 3364 if ( SvVOK(dstr) )
ece467f9
JP
3365 {
3366 /* need to nuke the magic */
3367 mg_free(dstr);
3368 SvRMAGICAL_off(dstr);
3369 }
9e7bc3e8 3370
463ee0b2 3371 /* There's a lot of redundancy below but we're going for speed here */
79072805 3372
8990e307 3373 switch (stype) {
79072805 3374 case SVt_NULL:
aece5585 3375 undef_sstr:
20408e3c
GS
3376 if (dtype != SVt_PVGV) {
3377 (void)SvOK_off(dstr);
3378 return;
3379 }
3380 break;
463ee0b2 3381 case SVt_IV:
aece5585
GA
3382 if (SvIOK(sstr)) {
3383 switch (dtype) {
3384 case SVt_NULL:
8990e307 3385 sv_upgrade(dstr, SVt_IV);
aece5585
GA
3386 break;
3387 case SVt_NV:
aece5585
GA
3388 case SVt_RV:
3389 case SVt_PV:
a0d0e21e 3390 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
3391 break;
3392 }
3393 (void)SvIOK_only(dstr);
45977657 3394 SvIV_set(dstr, SvIVX(sstr));
25da4f38
IZ
3395 if (SvIsUV(sstr))
3396 SvIsUV_on(dstr);
37c25af0
NC
3397 /* SvTAINTED can only be true if the SV has taint magic, which in
3398 turn means that the SV type is PVMG (or greater). This is the
3399 case statement for SVt_IV, so this cannot be true (whatever gcov
3400 may say). */
3401 assert(!SvTAINTED(sstr));
aece5585 3402 return;
8990e307 3403 }
aece5585
GA
3404 goto undef_sstr;
3405
463ee0b2 3406 case SVt_NV:
aece5585
GA
3407 if (SvNOK(sstr)) {
3408 switch (dtype) {
3409 case SVt_NULL:
3410 case SVt_IV:
8990e307 3411 sv_upgrade(dstr, SVt_NV);
aece5585
GA
3412 break;
3413 case SVt_RV:
3414 case SVt_PV:
3415 case SVt_PVIV:
a0d0e21e 3416 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
3417 break;
3418 }
9d6ce603 3419 SvNV_set(dstr, SvNVX(sstr));
aece5585 3420 (void)SvNOK_only(dstr);
37c25af0
NC
3421 /* SvTAINTED can only be true if the SV has taint magic, which in
3422 turn means that the SV type is PVMG (or greater). This is the
3423 case statement for SVt_NV, so this cannot be true (whatever gcov
3424 may say). */
3425 assert(!SvTAINTED(sstr));
aece5585 3426 return;
8990e307 3427 }
aece5585
GA
3428 goto undef_sstr;
3429
ed6116ce 3430 case SVt_RV:
8990e307 3431 if (dtype < SVt_RV)
ed6116ce 3432 sv_upgrade(dstr, SVt_RV);
ed6116ce 3433 break;
fc36a67e 3434 case SVt_PVFM:
f8c7b90f 3435#ifdef PERL_OLD_COPY_ON_WRITE
d89fc664
NC
3436 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
3437 if (dtype < SVt_PVIV)
3438 sv_upgrade(dstr, SVt_PVIV);
3439 break;
3440 }
3441 /* Fall through */
3442#endif
3443 case SVt_PV:
8990e307 3444 if (dtype < SVt_PV)
463ee0b2 3445 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
3446 break;
3447 case SVt_PVIV:
8990e307 3448 if (dtype < SVt_PVIV)
463ee0b2 3449 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
3450 break;
3451 case SVt_PVNV:
8990e307 3452 if (dtype < SVt_PVNV)
463ee0b2 3453 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 3454 break;
489f7bfe 3455 default:
a3b680e6
AL
3456 {
3457 const char * const type = sv_reftype(sstr,0);
533c011a 3458 if (PL_op)
a3b680e6 3459 Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_NAME(PL_op));
4633a7c4 3460 else
a3b680e6
AL
3461 Perl_croak(aTHX_ "Bizarre copy of %s", type);
3462 }
4633a7c4
LW
3463 break;
3464
79072805 3465 case SVt_PVGV:
8990e307 3466 if (dtype <= SVt_PVGV) {
d4c19fe8 3467 glob_assign_glob(dstr, sstr, dtype);
b8c701c1 3468 return;
79072805 3469 }
5f66b61c 3470 /*FALLTHROUGH*/
79072805 3471
489f7bfe
NC
3472 case SVt_PVMG:
3473 case SVt_PVLV:
3474 case SVt_PVBM:
8d6d96c1 3475 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 3476 mg_get(sstr);
eb160463 3477 if ((int)SvTYPE(sstr) != stype) {
973f89ab 3478 stype = SvTYPE(sstr);
b8c701c1 3479 if (stype == SVt_PVGV && dtype <= SVt_PVGV) {
d4c19fe8 3480 glob_assign_glob(dstr, sstr, dtype);
b8c701c1
NC
3481 return;
3482 }
973f89ab
CS
3483 }
3484 }
ded42b9f 3485 if (stype == SVt_PVLV)
862a34c6 3486 SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 3487 else
862a34c6 3488 SvUPGRADE(dstr, (U32)stype);
79072805
LW
3489 }
3490
ff920335
NC
3491 /* dstr may have been upgraded. */
3492 dtype = SvTYPE(dstr);
8990e307
LW
3493 sflags = SvFLAGS(sstr);
3494
3495 if (sflags & SVf_ROK) {
acaa9288
NC
3496 if (dtype == SVt_PVGV &&
3497 SvROK(sstr) && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
3498 sstr = SvRV(sstr);
3499 if (sstr == dstr) {
3500 if (GvIMPORTED(dstr) != GVf_IMPORTED
3501 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3502 {
3503 GvIMPORTED_on(dstr);
3504 }
3505 GvMULTI_on(dstr);
3506 return;
3507 }
d4c19fe8 3508 glob_assign_glob(dstr, sstr, dtype);
acaa9288
NC
3509 return;
3510 }
3511
8990e307 3512 if (dtype >= SVt_PV) {
b8c701c1 3513 if (dtype == SVt_PVGV) {
d4c19fe8 3514 glob_assign_ref(dstr, sstr);
b8c701c1
NC
3515 return;
3516 }
3f7c398e 3517 if (SvPVX_const(dstr)) {
8bd4d4c5 3518 SvPV_free(dstr);
b162af07
SP
3519 SvLEN_set(dstr, 0);
3520 SvCUR_set(dstr, 0);
a0d0e21e 3521 }
8990e307 3522 }
a0d0e21e 3523 (void)SvOK_off(dstr);
b162af07 3524 SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
dfd48732
NC
3525 SvFLAGS(dstr) |= sflags & (SVf_ROK|SVf_AMAGIC);
3526 assert(!(sflags & SVp_NOK));
3527 assert(!(sflags & SVp_IOK));
3528 assert(!(sflags & SVf_NOK));
3529 assert(!(sflags & SVf_IOK));
ed6116ce 3530 }
c0c44674
NC
3531 else if (dtype == SVt_PVGV) {
3532 if (!(sflags & SVf_OK)) {
3533 if (ckWARN(WARN_MISC))
3534 Perl_warner(aTHX_ packWARN(WARN_MISC),
3535 "Undefined value assigned to typeglob");
3536 }
3537 else {
3538 GV *gv = gv_fetchsv(sstr, GV_ADD, SVt_PVGV);
3539 if (dstr != (SV*)gv) {
3540 if (GvGP(dstr))
3541 gp_free((GV*)dstr);
3542 GvGP(dstr) = gp_ref(GvGP(gv));
3543 }
3544 }
3545 }
8990e307 3546 else if (sflags & SVp_POK) {
765f542d 3547 bool isSwipe = 0;
79072805
LW
3548
3549 /*
3550 * Check to see if we can just swipe the string. If so, it's a
3551 * possible small lose on short strings, but a big win on long ones.
3f7c398e
SP
3552 * It might even be a win on short strings if SvPVX_const(dstr)
3553 * has to be allocated and SvPVX_const(sstr) has to be freed.
79072805
LW
3554 */
3555
120fac95
NC
3556 /* Whichever path we take through the next code, we want this true,
3557 and doing it now facilitates the COW check. */
3558 (void)SvPOK_only(dstr);
3559
765f542d 3560 if (
b8f9541a
NC
3561 /* We're not already COW */
3562 ((sflags & (SVf_FAKE | SVf_READONLY)) != (SVf_FAKE | SVf_READONLY)
f8c7b90f 3563#ifndef PERL_OLD_COPY_ON_WRITE
b8f9541a
NC
3564 /* or we are, but dstr isn't a suitable target. */
3565 || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
3566#endif
3567 )
765f542d 3568 &&
765f542d
NC
3569 !(isSwipe =
3570 (sflags & SVs_TEMP) && /* slated for free anyway? */
3571 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
5fcdf167
NC
3572 (!(flags & SV_NOSTEAL)) &&
3573 /* and we're allowed to steal temps */
765f542d
NC
3574 SvREFCNT(sstr) == 1 && /* and no other references to it? */
3575 SvLEN(sstr) && /* and really is a string */
645c22ef 3576 /* and won't be needed again, potentially */
765f542d 3577 !(PL_op && PL_op->op_type == OP_AASSIGN))
f8c7b90f 3578#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 3579 && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
120fac95 3580 && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
765f542d
NC
3581 && SvTYPE(sstr) >= SVt_PVIV)
3582#endif
3583 ) {
3584 /* Failed the swipe test, and it's not a shared hash key either.
3585 Have to copy the string. */
3586 STRLEN len = SvCUR(sstr);
3587 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3f7c398e 3588 Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
765f542d
NC
3589 SvCUR_set(dstr, len);
3590 *SvEND(dstr) = '\0';
765f542d 3591 } else {
f8c7b90f 3592 /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
765f542d 3593 be true in here. */
765f542d
NC
3594 /* Either it's a shared hash key, or it's suitable for
3595 copy-on-write or we can swipe the string. */
46187eeb 3596 if (DEBUG_C_TEST) {
ed252734 3597 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
3598 sv_dump(sstr);
3599 sv_dump(dstr);
46187eeb 3600 }
f8c7b90f 3601#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
3602 if (!isSwipe) {
3603 /* I believe I should acquire a global SV mutex if
3604 it's a COW sv (not a shared hash key) to stop
3605 it going un copy-on-write.
3606 If the source SV has gone un copy on write between up there
3607 and down here, then (assert() that) it is of the correct
3608 form to make it copy on write again */
3609 if ((sflags & (SVf_FAKE | SVf_READONLY))
3610 != (SVf_FAKE | SVf_READONLY)) {
3611 SvREADONLY_on(sstr);
3612 SvFAKE_on(sstr);
3613 /* Make the source SV into a loop of 1.
3614 (about to become 2) */
a29f6d03 3615 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
3616 }
3617 }
3618#endif
3619 /* Initial code is common. */
94010e71
NC
3620 if (SvPVX_const(dstr)) { /* we know that dtype >= SVt_PV */
3621 SvPV_free(dstr);
79072805 3622 }
765f542d 3623
765f542d
NC
3624 if (!isSwipe) {
3625 /* making another shared SV. */
3626 STRLEN cur = SvCUR(sstr);
3627 STRLEN len = SvLEN(sstr);
f8c7b90f 3628#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 3629 if (len) {
b8f9541a 3630 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
3631 /* SvIsCOW_normal */
3632 /* splice us in between source and next-after-source. */
a29f6d03
NC
3633 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3634 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 3635 SvPV_set(dstr, SvPVX_mutable(sstr));
a604c751
NC
3636 } else
3637#endif
3638 {
765f542d 3639 /* SvIsCOW_shared_hash */
46187eeb
NC
3640 DEBUG_C(PerlIO_printf(Perl_debug_log,
3641 "Copy on write: Sharing hash\n"));
b8f9541a 3642
bdd68bc3 3643 assert (SvTYPE(dstr) >= SVt_PV);
765f542d 3644 SvPV_set(dstr,
d1db91c6 3645 HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
bdd68bc3 3646 }
87a1ef3d
SP
3647 SvLEN_set(dstr, len);
3648 SvCUR_set(dstr, cur);
765f542d
NC
3649 SvREADONLY_on(dstr);
3650 SvFAKE_on(dstr);
3651 /* Relesase a global SV mutex. */
3652 }
3653 else
765f542d 3654 { /* Passes the swipe test. */
78d1e721 3655 SvPV_set(dstr, SvPVX_mutable(sstr));
765f542d
NC
3656 SvLEN_set(dstr, SvLEN(sstr));
3657 SvCUR_set(dstr, SvCUR(sstr));
3658
3659 SvTEMP_off(dstr);
3660 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
6136c704 3661 SvPV_set(sstr, NULL);
765f542d
NC
3662 SvLEN_set(sstr, 0);
3663 SvCUR_set(sstr, 0);
3664 SvTEMP_off(sstr);
3665 }
3666 }
8990e307 3667 if (sflags & SVp_NOK) {
9d6ce603 3668 SvNV_set(dstr, SvNVX(sstr));
79072805 3669 }
8990e307 3670 if (sflags & SVp_IOK) {
23525414
NC
3671 SvRELEASE_IVX(dstr);
3672 SvIV_set(dstr, SvIVX(sstr));
3673 /* Must do this otherwise some other overloaded use of 0x80000000
3674 gets confused. I guess SVpbm_VALID */
2b1c7e3e 3675 if (sflags & SVf_IVisUV)
25da4f38 3676 SvIsUV_on(dstr);
79072805 3677 }
dd2eae66
NC
3678 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8
3679 |SVf_AMAGIC);
4f2da183
NC
3680 {
3681 const MAGIC * const smg = SvVOK(sstr);
3682 if (smg) {
3683 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
3684 smg->mg_ptr, smg->mg_len);
3685 SvRMAGICAL_on(dstr);
3686 }
7a5fa8a2 3687 }
79072805 3688 }
5d581361 3689 else if (sflags & (SVp_IOK|SVp_NOK)) {
c2468cc7 3690 (void)SvOK_off(dstr);
dd2eae66
NC
3691 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK
3692 |SVf_AMAGIC);
5d581361
NC
3693 if (sflags & SVp_IOK) {
3694 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
3695 SvIV_set(dstr, SvIVX(sstr));
3696 }
3332b3c1 3697 if (sflags & SVp_NOK) {
9d6ce603 3698 SvNV_set(dstr, SvNVX(sstr));
3332b3c1
JH
3699 }
3700 }
79072805 3701 else {
f7877b28 3702 if (isGV_with_GP(sstr)) {
180488f8
NC
3703 /* This stringification rule for globs is spread in 3 places.
3704 This feels bad. FIXME. */
3705 const U32 wasfake = sflags & SVf_FAKE;
3706
3707 /* FAKE globs can get coerced, so need to turn this off
3708 temporarily if it is on. */
3709 SvFAKE_off(sstr);
3710 gv_efullname3(dstr, (GV *)sstr, "*");
3711 SvFLAGS(sstr) |= wasfake;
dd2eae66 3712 SvFLAGS(dstr) |= sflags & SVf_AMAGIC;
180488f8 3713 }
20408e3c
GS
3714 else
3715 (void)SvOK_off(dstr);
a0d0e21e 3716 }
27c9684d
AP
3717 if (SvTAINTED(sstr))
3718 SvTAINT(dstr);
79072805
LW
3719}
3720
954c1994
GS
3721/*
3722=for apidoc sv_setsv_mg
3723
3724Like C<sv_setsv>, but also handles 'set' magic.
3725
3726=cut
3727*/
3728
79072805 3729void
864dbfa3 3730Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
3731{
3732 sv_setsv(dstr,sstr);
3733 SvSETMAGIC(dstr);
3734}
3735
f8c7b90f 3736#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
3737SV *
3738Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
3739{
3740 STRLEN cur = SvCUR(sstr);
3741 STRLEN len = SvLEN(sstr);
3742 register char *new_pv;
3743
3744 if (DEBUG_C_TEST) {
3745 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
3746 sstr, dstr);
3747 sv_dump(sstr);
3748 if (dstr)
3749 sv_dump(dstr);
3750 }
3751
3752 if (dstr) {
3753 if (SvTHINKFIRST(dstr))
3754 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
3f7c398e
SP
3755 else if (SvPVX_const(dstr))
3756 Safefree(SvPVX_const(dstr));
ed252734
NC
3757 }
3758 else
3759 new_SV(dstr);
862a34c6 3760 SvUPGRADE(dstr, SVt_PVIV);
ed252734
NC
3761
3762 assert (SvPOK(sstr));
3763 assert (SvPOKp(sstr));
3764 assert (!SvIOK(sstr));
3765 assert (!SvIOKp(sstr));
3766 assert (!SvNOK(sstr));
3767 assert (!SvNOKp(sstr));
3768
3769 if (SvIsCOW(sstr)) {
3770
3771 if (SvLEN(sstr) == 0) {
3772 /* source is a COW shared hash key. */
ed252734
NC
3773 DEBUG_C(PerlIO_printf(Perl_debug_log,
3774 "Fast copy on write: Sharing hash\n"));
d1db91c6 3775 new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
ed252734
NC
3776 goto common_exit;
3777 }
3778 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3779 } else {
3780 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
862a34c6 3781 SvUPGRADE(sstr, SVt_PVIV);
ed252734
NC
3782 SvREADONLY_on(sstr);
3783 SvFAKE_on(sstr);
3784 DEBUG_C(PerlIO_printf(Perl_debug_log,
3785 "Fast copy on write: Converting sstr to COW\n"));
3786 SV_COW_NEXT_SV_SET(dstr, sstr);
3787 }
3788 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 3789 new_pv = SvPVX_mutable(sstr);
ed252734
NC
3790
3791 common_exit:
3792 SvPV_set(dstr, new_pv);
3793 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
3794 if (SvUTF8(sstr))
3795 SvUTF8_on(dstr);
87a1ef3d
SP
3796 SvLEN_set(dstr, len);
3797 SvCUR_set(dstr, cur);
ed252734
NC
3798 if (DEBUG_C_TEST) {
3799 sv_dump(dstr);
3800 }
3801 return dstr;
3802}
3803#endif
3804
954c1994
GS
3805/*
3806=for apidoc sv_setpvn
3807
3808Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
3809bytes to be copied. If the C<ptr> argument is NULL the SV will become
3810undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
3811
3812=cut
3813*/
3814
ef50df4b 3815void
864dbfa3 3816Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 3817{
97aff369 3818 dVAR;
c6f8c383 3819 register char *dptr;
22c522df 3820
765f542d 3821 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 3822 if (!ptr) {
a0d0e21e 3823 (void)SvOK_off(sv);
463ee0b2
LW
3824 return;
3825 }
22c522df
JH
3826 else {
3827 /* len is STRLEN which is unsigned, need to copy to signed */
a3b680e6 3828 const IV iv = len;
9c5ffd7c
JH
3829 if (iv < 0)
3830 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 3831 }
862a34c6 3832 SvUPGRADE(sv, SVt_PV);
c6f8c383 3833
5902b6a9 3834 dptr = SvGROW(sv, len + 1);
c6f8c383
GA
3835 Move(ptr,dptr,len,char);
3836 dptr[len] = '\0';
79072805 3837 SvCUR_set(sv, len);
1aa99e6b 3838 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3839 SvTAINT(sv);
79072805
LW
3840}
3841
954c1994
GS
3842/*
3843=for apidoc sv_setpvn_mg
3844
3845Like C<sv_setpvn>, but also handles 'set' magic.
3846
3847=cut
3848*/
3849
79072805 3850void
864dbfa3 3851Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
3852{
3853 sv_setpvn(sv,ptr,len);
3854 SvSETMAGIC(sv);
3855}
3856
954c1994
GS
3857/*
3858=for apidoc sv_setpv
3859
3860Copies a string into an SV. The string must be null-terminated. Does not
3861handle 'set' magic. See C<sv_setpv_mg>.
3862
3863=cut
3864*/
3865
ef50df4b 3866void
864dbfa3 3867Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805 3868{
97aff369 3869 dVAR;
79072805
LW
3870 register STRLEN len;
3871
765f542d 3872 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 3873 if (!ptr) {
a0d0e21e 3874 (void)SvOK_off(sv);
463ee0b2
LW
3875 return;
3876 }
79072805 3877 len = strlen(ptr);
862a34c6 3878 SvUPGRADE(sv, SVt_PV);
c6f8c383 3879
79072805 3880 SvGROW(sv, len + 1);
463ee0b2 3881 Move(ptr,SvPVX(sv),len+1,char);
79072805 3882 SvCUR_set(sv, len);
1aa99e6b 3883 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
3884 SvTAINT(sv);
3885}
3886
954c1994
GS
3887/*
3888=for apidoc sv_setpv_mg
3889
3890Like C<sv_setpv>, but also handles 'set' magic.
3891
3892=cut
3893*/
3894
463ee0b2 3895void
864dbfa3 3896Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
3897{
3898 sv_setpv(sv,ptr);
3899 SvSETMAGIC(sv);
3900}
3901
954c1994 3902/*
47518d95 3903=for apidoc sv_usepvn_flags
954c1994 3904
794a0d33
JH
3905Tells an SV to use C<ptr> to find its string value. Normally the
3906string is stored inside the SV but sv_usepvn allows the SV to use an
3907outside string. The C<ptr> should point to memory that was allocated
c1c21316
NC
3908by C<malloc>. The string length, C<len>, must be supplied. By default
3909this function will realloc (i.e. move) the memory pointed to by C<ptr>,
794a0d33
JH
3910so that pointer should not be freed or used by the programmer after
3911giving it to sv_usepvn, and neither should any pointers from "behind"
c1c21316
NC
3912that pointer (e.g. ptr + 1) be used.
3913
3914If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC. If C<flags> &
3915SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
cbf82dd0 3916will be skipped. (i.e. the buffer is actually at least 1 byte longer than
c1c21316 3917C<len>, and already meets the requirements for storing in C<SvPVX>)
954c1994
GS
3918
3919=cut
3920*/
3921
ef50df4b 3922void
47518d95 3923Perl_sv_usepvn_flags(pTHX_ SV *sv, char *ptr, STRLEN len, U32 flags)
463ee0b2 3924{
97aff369 3925 dVAR;
1936d2a7 3926 STRLEN allocate;
765f542d 3927 SV_CHECK_THINKFIRST_COW_DROP(sv);
862a34c6 3928 SvUPGRADE(sv, SVt_PV);
463ee0b2 3929 if (!ptr) {
a0d0e21e 3930 (void)SvOK_off(sv);
47518d95
NC
3931 if (flags & SV_SMAGIC)
3932 SvSETMAGIC(sv);
463ee0b2
LW
3933 return;
3934 }
3f7c398e 3935 if (SvPVX_const(sv))
8bd4d4c5 3936 SvPV_free(sv);
1936d2a7 3937
2e90b4cd
NC
3938 if (flags & SV_HAS_TRAILING_NUL)
3939 assert(ptr[len] == '\0');
3940
c1c21316 3941 allocate = (flags & SV_HAS_TRAILING_NUL)
8f01dc65 3942 ? len + 1: PERL_STRLEN_ROUNDUP(len + 1);
cbf82dd0
NC
3943 if (flags & SV_HAS_TRAILING_NUL) {
3944 /* It's long enough - do nothing.
3945 Specfically Perl_newCONSTSUB is relying on this. */
3946 } else {
69d25b4f 3947#ifdef DEBUGGING
69d25b4f
NC
3948 /* Force a move to shake out bugs in callers. */
3949 char *new_ptr = safemalloc(allocate);
3950 Copy(ptr, new_ptr, len, char);
3951 PoisonFree(ptr,len,char);
3952 Safefree(ptr);
3953 ptr = new_ptr;
69d25b4f 3954#else
c1c21316 3955 ptr = saferealloc (ptr, allocate);
69d25b4f 3956#endif
cbf82dd0 3957 }
f880fe2f 3958 SvPV_set(sv, ptr);
463ee0b2 3959 SvCUR_set(sv, len);
1936d2a7 3960 SvLEN_set(sv, allocate);
c1c21316
NC
3961 if (!(flags & SV_HAS_TRAILING_NUL)) {
3962 *SvEND(sv) = '\0';
3963 }
1aa99e6b 3964 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3965 SvTAINT(sv);
47518d95
NC
3966 if (flags & SV_SMAGIC)
3967 SvSETMAGIC(sv);
ef50df4b
GS
3968}
3969
f8c7b90f 3970#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
3971/* Need to do this *after* making the SV normal, as we need the buffer
3972 pointer to remain valid until after we've copied it. If we let go too early,
3973 another thread could invalidate it by unsharing last of the same hash key
3974 (which it can do by means other than releasing copy-on-write Svs)
3975 or by changing the other copy-on-write SVs in the loop. */
3976STATIC void
bdd68bc3 3977S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, STRLEN len, SV *after)
765f542d
NC
3978{
3979 if (len) { /* this SV was SvIsCOW_normal(sv) */
3980 /* we need to find the SV pointing to us. */
cf5629ad 3981 SV *current = SV_COW_NEXT_SV(after);
7a5fa8a2 3982
765f542d
NC
3983 if (current == sv) {
3984 /* The SV we point to points back to us (there were only two of us
3985 in the loop.)
3986 Hence other SV is no longer copy on write either. */
3987 SvFAKE_off(after);
3988 SvREADONLY_off(after);
3989 } else {
3990 /* We need to follow the pointers around the loop. */
3991 SV *next;
3992 while ((next = SV_COW_NEXT_SV(current)) != sv) {
3993 assert (next);
3994 current = next;
3995 /* don't loop forever if the structure is bust, and we have
3996 a pointer into a closed loop. */
3997 assert (current != after);
3f7c398e 3998 assert (SvPVX_const(current) == pvx);
765f542d
NC
3999 }
4000 /* Make the SV before us point to the SV after us. */
a29f6d03 4001 SV_COW_NEXT_SV_SET(current, after);
765f542d
NC
4002 }
4003 } else {
bdd68bc3 4004 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
765f542d
NC
4005 }
4006}
4007
4008int
4009Perl_sv_release_IVX(pTHX_ register SV *sv)
4010{
4011 if (SvIsCOW(sv))
4012 sv_force_normal_flags(sv, 0);
0c34ef67
MHM
4013 SvOOK_off(sv);
4014 return 0;
765f542d
NC
4015}
4016#endif
645c22ef
DM
4017/*
4018=for apidoc sv_force_normal_flags
4019
4020Undo various types of fakery on an SV: if the PV is a shared string, make
4021a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4022an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4023we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4024then a copy-on-write scalar drops its PV buffer (if any) and becomes
4025SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 4026set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
4027C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4028with flags set to 0.
645c22ef
DM
4029
4030=cut
4031*/
4032
6fc92669 4033void
840a7b70 4034Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 4035{
97aff369 4036 dVAR;
f8c7b90f 4037#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4038 if (SvREADONLY(sv)) {
4039 /* At this point I believe I should acquire a global SV mutex. */
4040 if (SvFAKE(sv)) {
b64e5050 4041 const char * const pvx = SvPVX_const(sv);
a28509cc
AL
4042 const STRLEN len = SvLEN(sv);
4043 const STRLEN cur = SvCUR(sv);
a28509cc 4044 SV * const next = SV_COW_NEXT_SV(sv); /* next COW sv in the loop. */
46187eeb
NC
4045 if (DEBUG_C_TEST) {
4046 PerlIO_printf(Perl_debug_log,
4047 "Copy on write: Force normal %ld\n",
4048 (long) flags);
e419cbc5 4049 sv_dump(sv);
46187eeb 4050 }
765f542d
NC
4051 SvFAKE_off(sv);
4052 SvREADONLY_off(sv);
9f653bb5 4053 /* This SV doesn't own the buffer, so need to Newx() a new one: */
6136c704 4054 SvPV_set(sv, NULL);
87a1ef3d 4055 SvLEN_set(sv, 0);
765f542d
NC
4056 if (flags & SV_COW_DROP_PV) {
4057 /* OK, so we don't need to copy our buffer. */
4058 SvPOK_off(sv);
4059 } else {
4060 SvGROW(sv, cur + 1);
4061 Move(pvx,SvPVX(sv),cur,char);
87a1ef3d 4062 SvCUR_set(sv, cur);
765f542d
NC
4063 *SvEND(sv) = '\0';
4064 }
bdd68bc3 4065 sv_release_COW(sv, pvx, len, next);
46187eeb 4066 if (DEBUG_C_TEST) {
e419cbc5 4067 sv_dump(sv);
46187eeb 4068 }
765f542d 4069 }
923e4eb5 4070 else if (IN_PERL_RUNTIME)
765f542d
NC
4071 Perl_croak(aTHX_ PL_no_modify);
4072 /* At this point I believe that I can drop the global SV mutex. */
4073 }
4074#else
2213622d 4075 if (SvREADONLY(sv)) {
1c846c1f 4076 if (SvFAKE(sv)) {
b64e5050 4077 const char * const pvx = SvPVX_const(sv);
66a1b24b 4078 const STRLEN len = SvCUR(sv);
10bcdfd6
NC
4079 SvFAKE_off(sv);
4080 SvREADONLY_off(sv);
bd61b366 4081 SvPV_set(sv, NULL);
66a1b24b 4082 SvLEN_set(sv, 0);
1c846c1f 4083 SvGROW(sv, len + 1);
706aa1c9 4084 Move(pvx,SvPVX(sv),len,char);
1c846c1f 4085 *SvEND(sv) = '\0';
bdd68bc3 4086 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
1c846c1f 4087 }
923e4eb5 4088 else if (IN_PERL_RUNTIME)
cea2e8a9 4089 Perl_croak(aTHX_ PL_no_modify);
0f15f207 4090 }
765f542d 4091#endif
2213622d 4092 if (SvROK(sv))
840a7b70 4093 sv_unref_flags(sv, flags);
6fc92669
GS
4094 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4095 sv_unglob(sv);
0f15f207 4096}
1c846c1f 4097
645c22ef 4098/*
954c1994
GS
4099=for apidoc sv_chop
4100
1c846c1f 4101Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4102SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4103the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4104string. Uses the "OOK hack".
3f7c398e 4105Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
31869a79 4106refer to the same chunk of data.
954c1994
GS
4107
4108=cut
4109*/
4110
79072805 4111void
f54cb97a 4112Perl_sv_chop(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4113{
4114 register STRLEN delta;
a0d0e21e 4115 if (!ptr || !SvPOKp(sv))
79072805 4116 return;
3f7c398e 4117 delta = ptr - SvPVX_const(sv);
2213622d 4118 SV_CHECK_THINKFIRST(sv);
79072805
LW
4119 if (SvTYPE(sv) < SVt_PVIV)
4120 sv_upgrade(sv,SVt_PVIV);
4121
4122 if (!SvOOK(sv)) {
50483b2c 4123 if (!SvLEN(sv)) { /* make copy of shared string */
3f7c398e 4124 const char *pvx = SvPVX_const(sv);
a28509cc 4125 const STRLEN len = SvCUR(sv);
50483b2c 4126 SvGROW(sv, len + 1);
706aa1c9 4127 Move(pvx,SvPVX(sv),len,char);
50483b2c
JD
4128 *SvEND(sv) = '\0';
4129 }
45977657 4130 SvIV_set(sv, 0);
a4bfb290
AB
4131 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
4132 and we do that anyway inside the SvNIOK_off
4133 */
7a5fa8a2 4134 SvFLAGS(sv) |= SVf_OOK;
79072805 4135 }
a4bfb290 4136 SvNIOK_off(sv);
b162af07
SP
4137 SvLEN_set(sv, SvLEN(sv) - delta);
4138 SvCUR_set(sv, SvCUR(sv) - delta);
f880fe2f 4139 SvPV_set(sv, SvPVX(sv) + delta);
45977657 4140 SvIV_set(sv, SvIVX(sv) + delta);
79072805
LW
4141}
4142
954c1994
GS
4143/*
4144=for apidoc sv_catpvn
4145
4146Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4147C<len> indicates number of bytes to copy. If the SV has the UTF-8
4148status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 4149Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 4150
8d6d96c1
HS
4151=for apidoc sv_catpvn_flags
4152
4153Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4154C<len> indicates number of bytes to copy. If the SV has the UTF-8
4155status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
4156If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4157appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4158in terms of this function.
4159
4160=cut
4161*/
4162
4163void
4164Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
4165{
97aff369 4166 dVAR;
8d6d96c1 4167 STRLEN dlen;
fabdb6c0 4168 const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
8d6d96c1 4169
8d6d96c1
HS
4170 SvGROW(dsv, dlen + slen + 1);
4171 if (sstr == dstr)
3f7c398e 4172 sstr = SvPVX_const(dsv);
8d6d96c1 4173 Move(sstr, SvPVX(dsv) + dlen, slen, char);
b162af07 4174 SvCUR_set(dsv, SvCUR(dsv) + slen);
8d6d96c1
HS
4175 *SvEND(dsv) = '\0';
4176 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
4177 SvTAINT(dsv);
bddd5118
NC
4178 if (flags & SV_SMAGIC)
4179 SvSETMAGIC(dsv);
79072805
LW
4180}
4181
954c1994 4182/*
954c1994
GS
4183=for apidoc sv_catsv
4184
13e8c8e3
JH
4185Concatenates the string from SV C<ssv> onto the end of the string in
4186SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
4187not 'set' magic. See C<sv_catsv_mg>.
954c1994 4188
8d6d96c1
HS
4189=for apidoc sv_catsv_flags
4190
4191Concatenates the string from SV C<ssv> onto the end of the string in
4192SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
4193bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4194and C<sv_catsv_nomg> are implemented in terms of this function.
4195
4196=cut */
4197
ef50df4b 4198void
8d6d96c1 4199Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 4200{
97aff369 4201 dVAR;
bddd5118 4202 if (ssv) {
00b6aa41
AL
4203 STRLEN slen;
4204 const char *spv = SvPV_const(ssv, slen);
4205 if (spv) {
bddd5118
NC
4206 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4207 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4208 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4209 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4210 dsv->sv_flags doesn't have that bit set.
4fd84b44 4211 Andy Dougherty 12 Oct 2001
bddd5118
NC
4212 */
4213 const I32 sutf8 = DO_UTF8(ssv);
4214 I32 dutf8;
13e8c8e3 4215
bddd5118
NC
4216 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4217 mg_get(dsv);
4218 dutf8 = DO_UTF8(dsv);
8d6d96c1 4219
bddd5118
NC
4220 if (dutf8 != sutf8) {
4221 if (dutf8) {
4222 /* Not modifying source SV, so taking a temporary copy. */
00b6aa41 4223 SV* const csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 4224
bddd5118
NC
4225 sv_utf8_upgrade(csv);
4226 spv = SvPV_const(csv, slen);
4227 }
4228 else
4229 sv_utf8_upgrade_nomg(dsv);
13e8c8e3 4230 }
bddd5118 4231 sv_catpvn_nomg(dsv, spv, slen);
e84ff256 4232 }
560a288e 4233 }
bddd5118
NC
4234 if (flags & SV_SMAGIC)
4235 SvSETMAGIC(dsv);
79072805
LW
4236}
4237
954c1994 4238/*
954c1994
GS
4239=for apidoc sv_catpv
4240
4241Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
4242If the SV has the UTF-8 status set, then the bytes appended should be
4243valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 4244
d5ce4a7c 4245=cut */
954c1994 4246
ef50df4b 4247void
0c981600 4248Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805 4249{
97aff369 4250 dVAR;
79072805 4251 register STRLEN len;
463ee0b2 4252 STRLEN tlen;
748a9306 4253 char *junk;
79072805 4254
0c981600 4255 if (!ptr)
79072805 4256 return;
748a9306 4257 junk = SvPV_force(sv, tlen);
0c981600 4258 len = strlen(ptr);
463ee0b2 4259 SvGROW(sv, tlen + len + 1);
0c981600 4260 if (ptr == junk)
3f7c398e 4261 ptr = SvPVX_const(sv);
0c981600 4262 Move(ptr,SvPVX(sv)+tlen,len+1,char);
b162af07 4263 SvCUR_set(sv, SvCUR(sv) + len);
d41ff1b8 4264 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4265 SvTAINT(sv);
79072805
LW
4266}
4267
954c1994
GS
4268/*
4269=for apidoc sv_catpv_mg
4270
4271Like C<sv_catpv>, but also handles 'set' magic.
4272
4273=cut
4274*/
4275
ef50df4b 4276void
0c981600 4277Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 4278{
0c981600 4279 sv_catpv(sv,ptr);
ef50df4b
GS
4280 SvSETMAGIC(sv);
4281}
4282
645c22ef
DM
4283/*
4284=for apidoc newSV
4285
561b68a9
SH
4286Creates a new SV. A non-zero C<len> parameter indicates the number of
4287bytes of preallocated string space the SV should have. An extra byte for a
4288trailing NUL is also reserved. (SvPOK is not set for the SV even if string
4289space is allocated.) The reference count for the new SV is set to 1.
4290
4291In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
4292parameter, I<x>, a debug aid which allowed callers to identify themselves.
4293This aid has been superseded by a new build option, PERL_MEM_LOG (see
4294L<perlhack/PERL_MEM_LOG>). The older API is still there for use in XS
4295modules supporting older perls.
645c22ef
DM
4296
4297=cut
4298*/
4299
79072805 4300SV *
864dbfa3 4301Perl_newSV(pTHX_ STRLEN len)
79072805 4302{
97aff369 4303 dVAR;
79072805 4304 register SV *sv;
1c846c1f 4305
4561caa4 4306 new_SV(sv);
79072805
LW
4307 if (len) {
4308 sv_upgrade(sv, SVt_PV);
4309 SvGROW(sv, len + 1);
4310 }
4311 return sv;
4312}
954c1994 4313/*
92110913 4314=for apidoc sv_magicext
954c1994 4315
68795e93 4316Adds magic to an SV, upgrading it if necessary. Applies the
2d8d5d5a 4317supplied vtable and returns a pointer to the magic added.
92110913 4318
2d8d5d5a
SH
4319Note that C<sv_magicext> will allow things that C<sv_magic> will not.
4320In particular, you can add magic to SvREADONLY SVs, and add more than
4321one instance of the same 'how'.
645c22ef 4322
2d8d5d5a
SH
4323If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
4324stored, if C<namlen> is zero then C<name> is stored as-is and - as another
4325special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
4326to contain an C<SV*> and is stored as-is with its REFCNT incremented.
92110913 4327
2d8d5d5a 4328(This is now used as a subroutine by C<sv_magic>.)
954c1994
GS
4329
4330=cut
4331*/
92110913 4332MAGIC *
92e67595 4333Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, MGVTBL *vtable,
92110913 4334 const char* name, I32 namlen)
79072805 4335{
97aff369 4336 dVAR;
79072805 4337 MAGIC* mg;
68795e93 4338
92110913 4339 if (SvTYPE(sv) < SVt_PVMG) {
862a34c6 4340 SvUPGRADE(sv, SVt_PVMG);
463ee0b2 4341 }
a02a5408 4342 Newxz(mg, 1, MAGIC);
79072805 4343 mg->mg_moremagic = SvMAGIC(sv);
b162af07 4344 SvMAGIC_set(sv, mg);
75f9d97a 4345
05f95b08
SB
4346 /* Sometimes a magic contains a reference loop, where the sv and
4347 object refer to each other. To prevent a reference loop that
4348 would prevent such objects being freed, we look for such loops
4349 and if we find one we avoid incrementing the object refcount.
87f0b213
JH
4350
4351 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 4352 have its REFCNT incremented to keep it in existence.
87f0b213
JH
4353
4354 */
14befaf4
DM
4355 if (!obj || obj == sv ||
4356 how == PERL_MAGIC_arylen ||
4357 how == PERL_MAGIC_qr ||
8d2f4536 4358 how == PERL_MAGIC_symtab ||
75f9d97a
JH
4359 (SvTYPE(obj) == SVt_PVGV &&
4360 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4361 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 4362 GvFORM(obj) == (CV*)sv)))
75f9d97a 4363 {
8990e307 4364 mg->mg_obj = obj;
75f9d97a 4365 }
85e6fe83 4366 else {
b37c2d43 4367 mg->mg_obj = SvREFCNT_inc_simple(obj);
85e6fe83
LW
4368 mg->mg_flags |= MGf_REFCOUNTED;
4369 }
b5ccf5f2
YST
4370
4371 /* Normal self-ties simply pass a null object, and instead of
4372 using mg_obj directly, use the SvTIED_obj macro to produce a
4373 new RV as needed. For glob "self-ties", we are tieing the PVIO
4374 with an RV obj pointing to the glob containing the PVIO. In
4375 this case, to avoid a reference loop, we need to weaken the
4376 reference.
4377 */
4378
4379 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4380 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
4381 {
4382 sv_rvweaken(obj);
4383 }
4384
79072805 4385 mg->mg_type = how;
565764a8 4386 mg->mg_len = namlen;
9cbac4c7 4387 if (name) {
92110913 4388 if (namlen > 0)
1edc1566 4389 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 4390 else if (namlen == HEf_SVKEY)
b37c2d43 4391 mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV*)name);
68795e93 4392 else
92110913 4393 mg->mg_ptr = (char *) name;
9cbac4c7 4394 }
92110913 4395 mg->mg_virtual = vtable;
68795e93 4396
92110913
NIS
4397 mg_magical(sv);
4398 if (SvGMAGICAL(sv))
4399 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4400 return mg;
4401}
4402
4403/*
4404=for apidoc sv_magic
1c846c1f 4405
92110913
NIS
4406Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4407then adds a new magic item of type C<how> to the head of the magic list.
4408
2d8d5d5a
SH
4409See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
4410handling of the C<name> and C<namlen> arguments.
4411
4509d3fb
SB
4412You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
4413to add more than one instance of the same 'how'.
4414
92110913
NIS
4415=cut
4416*/
4417
4418void
4419Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 4420{
97aff369 4421 dVAR;
92e67595 4422 MGVTBL *vtable;
92110913 4423 MAGIC* mg;
92110913 4424
f8c7b90f 4425#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4426 if (SvIsCOW(sv))
4427 sv_force_normal_flags(sv, 0);
4428#endif
92110913 4429 if (SvREADONLY(sv)) {
d8084ca5
DM
4430 if (
4431 /* its okay to attach magic to shared strings; the subsequent
4432 * upgrade to PVMG will unshare the string */
4433 !(SvFAKE(sv) && SvTYPE(sv) < SVt_PVMG)
4434
4435 && IN_PERL_RUNTIME
92110913
NIS
4436 && how != PERL_MAGIC_regex_global
4437 && how != PERL_MAGIC_bm
4438 && how != PERL_MAGIC_fm
4439 && how != PERL_MAGIC_sv
e6469971 4440 && how != PERL_MAGIC_backref
92110913
NIS
4441 )
4442 {
4443 Perl_croak(aTHX_ PL_no_modify);
4444 }
4445 }
4446 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4447 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
4448 /* sv_magic() refuses to add a magic of the same 'how' as an
4449 existing one
92110913 4450 */
2a509ed3 4451 if (how == PERL_MAGIC_taint) {
92110913 4452 mg->mg_len |= 1;
2a509ed3
NC
4453 /* Any scalar which already had taint magic on which someone
4454 (erroneously?) did SvIOK_on() or similar will now be
4455 incorrectly sporting public "OK" flags. */
4456 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4457 }
92110913
NIS
4458 return;
4459 }
4460 }
68795e93 4461
79072805 4462 switch (how) {
14befaf4 4463 case PERL_MAGIC_sv:
92110913 4464 vtable = &PL_vtbl_sv;
79072805 4465 break;
14befaf4 4466 case PERL_MAGIC_overload:
92110913 4467 vtable = &PL_vtbl_amagic;
a0d0e21e 4468 break;
14befaf4 4469 case PERL_MAGIC_overload_elem:
92110913 4470 vtable = &PL_vtbl_amagicelem;
a0d0e21e 4471 break;
14befaf4 4472 case PERL_MAGIC_overload_table:
92110913 4473 vtable = &PL_vtbl_ovrld;
a0d0e21e 4474 break;
14befaf4 4475 case PERL_MAGIC_bm:
92110913 4476 vtable = &PL_vtbl_bm;
79072805 4477 break;
14befaf4 4478 case PERL_MAGIC_regdata:
92110913 4479 vtable = &PL_vtbl_regdata;
6cef1e77 4480 break;
14befaf4 4481 case PERL_MAGIC_regdatum:
92110913 4482 vtable = &PL_vtbl_regdatum;
6cef1e77 4483 break;
14befaf4 4484 case PERL_MAGIC_env:
92110913 4485 vtable = &PL_vtbl_env;
79072805 4486 break;
14befaf4 4487 case PERL_MAGIC_fm:
92110913 4488 vtable = &PL_vtbl_fm;
55497cff 4489 break;
14befaf4 4490 case PERL_MAGIC_envelem:
92110913 4491 vtable = &PL_vtbl_envelem;
79072805 4492 break;
14befaf4 4493 case PERL_MAGIC_regex_global:
92110913 4494 vtable = &PL_vtbl_mglob;
93a17b20 4495 break;
14befaf4 4496 case PERL_MAGIC_isa:
92110913 4497 vtable = &PL_vtbl_isa;
463ee0b2 4498 break;
14befaf4 4499 case PERL_MAGIC_isaelem:
92110913 4500 vtable = &PL_vtbl_isaelem;
463ee0b2 4501 break;
14befaf4 4502 case PERL_MAGIC_nkeys:
92110913 4503 vtable = &PL_vtbl_nkeys;
16660edb 4504 break;
14befaf4 4505 case PERL_MAGIC_dbfile:
aec46f14 4506 vtable = NULL;
93a17b20 4507 break;
14befaf4 4508 case PERL_MAGIC_dbline:
92110913 4509 vtable = &PL_vtbl_dbline;
79072805 4510 break;
36477c24 4511#ifdef USE_LOCALE_COLLATE
14befaf4 4512 case PERL_MAGIC_collxfrm:
92110913 4513 vtable = &PL_vtbl_collxfrm;
bbce6d69 4514 break;
36477c24 4515#endif /* USE_LOCALE_COLLATE */
14befaf4 4516 case PERL_MAGIC_tied:
92110913 4517 vtable = &PL_vtbl_pack;
463ee0b2 4518 break;
14befaf4
DM
4519 case PERL_MAGIC_tiedelem:
4520 case PERL_MAGIC_tiedscalar:
92110913 4521 vtable = &PL_vtbl_packelem;
463ee0b2 4522 break;
14befaf4 4523 case PERL_MAGIC_qr:
92110913 4524 vtable = &PL_vtbl_regexp;
c277df42 4525 break;
b3ca2e83
NC
4526 case PERL_MAGIC_hints:
4527 /* As this vtable is all NULL, we can reuse it. */
14befaf4 4528 case PERL_MAGIC_sig:
92110913 4529 vtable = &PL_vtbl_sig;
79072805 4530 break;
14befaf4 4531 case PERL_MAGIC_sigelem:
92110913 4532 vtable = &PL_vtbl_sigelem;
79072805 4533 break;
14befaf4 4534 case PERL_MAGIC_taint:
92110913 4535 vtable = &PL_vtbl_taint;
463ee0b2 4536 break;
14befaf4 4537 case PERL_MAGIC_uvar:
92110913 4538 vtable = &PL_vtbl_uvar;
79072805 4539 break;
14befaf4 4540 case PERL_MAGIC_vec:
92110913 4541 vtable = &PL_vtbl_vec;
79072805 4542 break;
a3874608 4543 case PERL_MAGIC_arylen_p:
bfcb3514 4544 case PERL_MAGIC_rhash:
8d2f4536 4545 case PERL_MAGIC_symtab:
ece467f9 4546 case PERL_MAGIC_vstring:
aec46f14 4547 vtable = NULL;
ece467f9 4548 break;
7e8c5dac
HS
4549 case PERL_MAGIC_utf8:
4550 vtable = &PL_vtbl_utf8;
4551 break;
14befaf4 4552 case PERL_MAGIC_substr:
92110913 4553 vtable = &PL_vtbl_substr;
79072805 4554 break;
14befaf4 4555 case PERL_MAGIC_defelem:
92110913 4556 vtable = &PL_vtbl_defelem;
5f05dabc 4557 break;
14befaf4 4558 case PERL_MAGIC_arylen:
92110913 4559 vtable = &PL_vtbl_arylen;
79072805 4560 break;
14befaf4 4561 case PERL_MAGIC_pos:
92110913 4562 vtable = &PL_vtbl_pos;
a0d0e21e 4563 break;
14befaf4 4564 case PERL_MAGIC_backref:
92110913 4565 vtable = &PL_vtbl_backref;
810b8aa5 4566 break;
b3ca2e83
NC
4567 case PERL_MAGIC_hintselem:
4568 vtable = &PL_vtbl_hintselem;
4569 break;
14befaf4
DM
4570 case PERL_MAGIC_ext:
4571 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
4572 /* Useful for attaching extension internal data to perl vars. */
4573 /* Note that multiple extensions may clash if magical scalars */
4574 /* etc holding private data from one are passed to another. */
aec46f14 4575 vtable = NULL;
a0d0e21e 4576 break;
79072805 4577 default:
14befaf4 4578 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 4579 }
68795e93 4580
92110913 4581 /* Rest of work is done else where */
aec46f14 4582 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 4583
92110913
NIS
4584 switch (how) {
4585 case PERL_MAGIC_taint:
4586 mg->mg_len = 1;
4587 break;
4588 case PERL_MAGIC_ext:
4589 case PERL_MAGIC_dbfile:
4590 SvRMAGICAL_on(sv);
4591 break;
4592 }
463ee0b2
LW
4593}
4594
c461cf8f
JH
4595/*
4596=for apidoc sv_unmagic
4597
645c22ef 4598Removes all magic of type C<type> from an SV.
c461cf8f
JH
4599
4600=cut
4601*/
4602
463ee0b2 4603int
864dbfa3 4604Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
4605{
4606 MAGIC* mg;
4607 MAGIC** mgp;
91bba347 4608 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2 4609 return 0;
064cf529 4610 mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
463ee0b2
LW
4611 for (mg = *mgp; mg; mg = *mgp) {
4612 if (mg->mg_type == type) {
e1ec3a88 4613 const MGVTBL* const vtbl = mg->mg_virtual;
463ee0b2 4614 *mgp = mg->mg_moremagic;
1d7c1841 4615 if (vtbl && vtbl->svt_free)
fc0dc3b3 4616 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 4617 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 4618 if (mg->mg_len > 0)
1edc1566 4619 Safefree(mg->mg_ptr);
565764a8 4620 else if (mg->mg_len == HEf_SVKEY)
1edc1566 4621 SvREFCNT_dec((SV*)mg->mg_ptr);
d2923cdd 4622 else if (mg->mg_type == PERL_MAGIC_utf8)
7e8c5dac 4623 Safefree(mg->mg_ptr);
9cbac4c7 4624 }
a0d0e21e
LW
4625 if (mg->mg_flags & MGf_REFCOUNTED)
4626 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
4627 Safefree(mg);
4628 }
4629 else
4630 mgp = &mg->mg_moremagic;
79072805 4631 }
91bba347 4632 if (!SvMAGIC(sv)) {
463ee0b2 4633 SvMAGICAL_off(sv);
c268c2a6 4634 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
86f55936 4635 SvMAGIC_set(sv, NULL);
463ee0b2
LW
4636 }
4637
4638 return 0;
79072805
LW
4639}
4640
c461cf8f
JH
4641/*
4642=for apidoc sv_rvweaken
4643
645c22ef
DM
4644Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
4645referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
4646push a back-reference to this RV onto the array of backreferences
4647associated with that magic.
c461cf8f
JH
4648
4649=cut
4650*/
4651
810b8aa5 4652SV *
864dbfa3 4653Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
4654{
4655 SV *tsv;
4656 if (!SvOK(sv)) /* let undefs pass */
4657 return sv;
4658 if (!SvROK(sv))
cea2e8a9 4659 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 4660 else if (SvWEAKREF(sv)) {
810b8aa5 4661 if (ckWARN(WARN_MISC))
9014280d 4662 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
4663 return sv;
4664 }
4665 tsv = SvRV(sv);
e15faf7d 4666 Perl_sv_add_backref(aTHX_ tsv, sv);
810b8aa5 4667 SvWEAKREF_on(sv);
1c846c1f 4668 SvREFCNT_dec(tsv);
810b8aa5
GS
4669 return sv;
4670}
4671
645c22ef
DM
4672/* Give tsv backref magic if it hasn't already got it, then push a
4673 * back-reference to sv onto the array associated with the backref magic.
4674 */
4675
e15faf7d
NC
4676void
4677Perl_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5 4678{
97aff369 4679 dVAR;
810b8aa5 4680 AV *av;
86f55936
NC
4681
4682 if (SvTYPE(tsv) == SVt_PVHV) {
4683 AV **const avp = Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
4684
4685 av = *avp;
4686 if (!av) {
4687 /* There is no AV in the offical place - try a fixup. */
4688 MAGIC *const mg = mg_find(tsv, PERL_MAGIC_backref);
4689
4690 if (mg) {
4691 /* Aha. They've got it stowed in magic. Bring it back. */
4692 av = (AV*)mg->mg_obj;
4693 /* Stop mg_free decreasing the refernce count. */
4694 mg->mg_obj = NULL;
4695 /* Stop mg_free even calling the destructor, given that
4696 there's no AV to free up. */
4697 mg->mg_virtual = 0;
4698 sv_unmagic(tsv, PERL_MAGIC_backref);
4699 } else {
4700 av = newAV();
4701 AvREAL_off(av);
b37c2d43 4702 SvREFCNT_inc_simple_void(av);
86f55936
NC
4703 }
4704 *avp = av;
4705 }
4706 } else {
4707 const MAGIC *const mg
4708 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
4709 if (mg)
4710 av = (AV*)mg->mg_obj;
4711 else {
4712 av = newAV();
4713 AvREAL_off(av);
4714 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
4715 /* av now has a refcnt of 2, which avoids it getting freed
4716 * before us during global cleanup. The extra ref is removed
4717 * by magic_killbackrefs() when tsv is being freed */
4718 }
810b8aa5 4719 }
d91d49e8 4720 if (AvFILLp(av) >= AvMAX(av)) {
d91d49e8
MM
4721 av_extend(av, AvFILLp(av)+1);
4722 }
4723 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
4724}
4725
645c22ef
DM
4726/* delete a back-reference to ourselves from the backref magic associated
4727 * with the SV we point to.
4728 */
4729
1c846c1f 4730STATIC void
e15faf7d 4731S_sv_del_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5 4732{
97aff369 4733 dVAR;
86f55936 4734 AV *av = NULL;
810b8aa5
GS
4735 SV **svp;
4736 I32 i;
86f55936
NC
4737
4738 if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
4739 av = *Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
5b285ea4
NC
4740 /* We mustn't attempt to "fix up" the hash here by moving the
4741 backreference array back to the hv_aux structure, as that is stored
4742 in the main HvARRAY(), and hfreentries assumes that no-one
4743 reallocates HvARRAY() while it is running. */
86f55936
NC
4744 }
4745 if (!av) {
4746 const MAGIC *const mg
4747 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
4748 if (mg)
4749 av = (AV *)mg->mg_obj;
4750 }
4751 if (!av) {
e15faf7d
NC
4752 if (PL_in_clean_all)
4753 return;
cea2e8a9 4754 Perl_croak(aTHX_ "panic: del_backref");
86f55936
NC
4755 }
4756
4757 if (SvIS_FREED(av))
4758 return;
4759
810b8aa5 4760 svp = AvARRAY(av);
6a76db8b
NC
4761 /* We shouldn't be in here more than once, but for paranoia reasons lets
4762 not assume this. */
4763 for (i = AvFILLp(av); i >= 0; i--) {
4764 if (svp[i] == sv) {
4765 const SSize_t fill = AvFILLp(av);
4766 if (i != fill) {
4767 /* We weren't the last entry.
4768 An unordered list has this property that you can take the
4769 last element off the end to fill the hole, and it's still
4770 an unordered list :-)
4771 */
4772 svp[i] = svp[fill];
4773 }
a0714e2c 4774 svp[fill] = NULL;
6a76db8b
NC
4775 AvFILLp(av) = fill - 1;
4776 }
4777 }
810b8aa5
GS
4778}
4779
86f55936
NC
4780int
4781Perl_sv_kill_backrefs(pTHX_ SV *sv, AV *av)
4782{
4783 SV **svp = AvARRAY(av);
4784
4785 PERL_UNUSED_ARG(sv);
4786
4787 /* Not sure why the av can get freed ahead of its sv, but somehow it does
4788 in ext/B/t/bytecode.t test 15 (involving print <DATA>) */
4789 if (svp && !SvIS_FREED(av)) {
4790 SV *const *const last = svp + AvFILLp(av);
4791
4792 while (svp <= last) {
4793 if (*svp) {
4794 SV *const referrer = *svp;
4795 if (SvWEAKREF(referrer)) {
4796 /* XXX Should we check that it hasn't changed? */
4797 SvRV_set(referrer, 0);
4798 SvOK_off(referrer);
4799 SvWEAKREF_off(referrer);
4800 } else if (SvTYPE(referrer) == SVt_PVGV ||
4801 SvTYPE(referrer) == SVt_PVLV) {
4802 /* You lookin' at me? */
4803 assert(GvSTASH(referrer));
4804 assert(GvSTASH(referrer) == (HV*)sv);
4805 GvSTASH(referrer) = 0;
4806 } else {
4807 Perl_croak(aTHX_
4808 "panic: magic_killbackrefs (flags=%"UVxf")",
4809 (UV)SvFLAGS(referrer));
4810 }
4811
a0714e2c 4812 *svp = NULL;
86f55936
NC
4813 }
4814 svp++;
4815 }
4816 }
4817 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
4818 return 0;
4819}
4820
954c1994
GS
4821/*
4822=for apidoc sv_insert
4823
4824Inserts a string at the specified offset/length within the SV. Similar to
4825the Perl substr() function.
4826
4827=cut
4828*/
4829
79072805 4830void
e1ec3a88 4831Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, const char *little, STRLEN littlelen)
79072805 4832{
97aff369 4833 dVAR;
79072805
LW
4834 register char *big;
4835 register char *mid;
4836 register char *midend;
4837 register char *bigend;
4838 register I32 i;
6ff81951 4839 STRLEN curlen;
1c846c1f 4840
79072805 4841
8990e307 4842 if (!bigstr)
cea2e8a9 4843 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 4844 SvPV_force(bigstr, curlen);
60fa28ff 4845 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
4846 if (offset + len > curlen) {
4847 SvGROW(bigstr, offset+len+1);
93524f2b 4848 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
6ff81951
GS
4849 SvCUR_set(bigstr, offset+len);
4850 }
79072805 4851
69b47968 4852 SvTAINT(bigstr);
79072805
LW
4853 i = littlelen - len;
4854 if (i > 0) { /* string might grow */
a0d0e21e 4855 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
4856 mid = big + offset + len;
4857 midend = bigend = big + SvCUR(bigstr);
4858 bigend += i;
4859 *bigend = '\0';
4860 while (midend > mid) /* shove everything down */
4861 *--bigend = *--midend;
4862 Move(little,big+offset,littlelen,char);
b162af07 4863 SvCUR_set(bigstr, SvCUR(bigstr) + i);
79072805
LW
4864 SvSETMAGIC(bigstr);
4865 return;
4866 }
4867 else if (i == 0) {
463ee0b2 4868 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
4869 SvSETMAGIC(bigstr);
4870 return;
4871 }
4872
463ee0b2 4873 big = SvPVX(bigstr);
79072805
LW
4874 mid = big + offset;
4875 midend = mid + len;
4876 bigend = big + SvCUR(bigstr);
4877
4878 if (midend > bigend)
cea2e8a9 4879 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
4880
4881 if (mid - big > bigend - midend) { /* faster to shorten from end */
4882 if (littlelen) {
4883 Move(little, mid, littlelen,char);
4884 mid += littlelen;
4885 }
4886 i = bigend - midend;
4887 if (i > 0) {
4888 Move(midend, mid, i,char);
4889 mid += i;
4890 }
4891 *mid = '\0';
4892 SvCUR_set(bigstr, mid - big);
4893 }
155aba94 4894 else if ((i = mid - big)) { /* faster from front */
79072805
LW
4895 midend -= littlelen;
4896 mid = midend;
4897 sv_chop(bigstr,midend-i);
4898 big += i;
4899 while (i--)
4900 *--midend = *--big;
4901 if (littlelen)
4902 Move(little, mid, littlelen,char);
4903 }
4904 else if (littlelen) {
4905 midend -= littlelen;
4906 sv_chop(bigstr,midend);
4907 Move(little,midend,littlelen,char);
4908 }
4909 else {
4910 sv_chop(bigstr,midend);
4911 }
4912 SvSETMAGIC(bigstr);
4913}
4914
c461cf8f
JH
4915/*
4916=for apidoc sv_replace
4917
4918Make the first argument a copy of the second, then delete the original.
645c22ef
DM
4919The target SV physically takes over ownership of the body of the source SV
4920and inherits its flags; however, the target keeps any magic it owns,
4921and any magic in the source is discarded.
ff276b08 4922Note that this is a rather specialist SV copying operation; most of the
645c22ef 4923time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
4924
4925=cut
4926*/
79072805
LW
4927
4928void
864dbfa3 4929Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805 4930{
97aff369 4931 dVAR;
a3b680e6 4932 const U32 refcnt = SvREFCNT(sv);
765f542d 4933 SV_CHECK_THINKFIRST_COW_DROP(sv);
30e5c352 4934 if (SvREFCNT(nsv) != 1) {
7437becc 4935 Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace() (%"
30e5c352
NC
4936 UVuf " != 1)", (UV) SvREFCNT(nsv));
4937 }
93a17b20 4938 if (SvMAGICAL(sv)) {
a0d0e21e
LW
4939 if (SvMAGICAL(nsv))
4940 mg_free(nsv);
4941 else
4942 sv_upgrade(nsv, SVt_PVMG);
b162af07 4943 SvMAGIC_set(nsv, SvMAGIC(sv));
a0d0e21e 4944 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20 4945 SvMAGICAL_off(sv);
b162af07 4946 SvMAGIC_set(sv, NULL);
93a17b20 4947 }
79072805
LW
4948 SvREFCNT(sv) = 0;
4949 sv_clear(sv);
477f5d66 4950 assert(!SvREFCNT(sv));
fd0854ff
DM
4951#ifdef DEBUG_LEAKING_SCALARS
4952 sv->sv_flags = nsv->sv_flags;
4953 sv->sv_any = nsv->sv_any;
4954 sv->sv_refcnt = nsv->sv_refcnt;
f34d0642 4955 sv->sv_u = nsv->sv_u;
fd0854ff 4956#else
79072805 4957 StructCopy(nsv,sv,SV);
fd0854ff 4958#endif
7b2c381c
NC
4959 /* Currently could join these into one piece of pointer arithmetic, but
4960 it would be unclear. */
4961 if(SvTYPE(sv) == SVt_IV)
4962 SvANY(sv)
339049b0 4963 = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
7b2c381c 4964 else if (SvTYPE(sv) == SVt_RV) {
339049b0 4965 SvANY(sv) = &sv->sv_u.svu_rv;
7b2c381c
NC
4966 }
4967
fd0854ff 4968
f8c7b90f 4969#ifdef PERL_OLD_COPY_ON_WRITE
d3d0e6f1
NC
4970 if (SvIsCOW_normal(nsv)) {
4971 /* We need to follow the pointers around the loop to make the
4972 previous SV point to sv, rather than nsv. */
4973 SV *next;
4974 SV *current = nsv;
4975 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
4976 assert(next);
4977 current = next;
3f7c398e 4978 assert(SvPVX_const(current) == SvPVX_const(nsv));
d3d0e6f1
NC
4979 }
4980 /* Make the SV before us point to the SV after us. */
4981 if (DEBUG_C_TEST) {
4982 PerlIO_printf(Perl_debug_log, "previous is\n");
4983 sv_dump(current);
a29f6d03
NC
4984 PerlIO_printf(Perl_debug_log,
4985 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
4986 (UV) SV_COW_NEXT_SV(current), (UV) sv);
4987 }
a29f6d03 4988 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
4989 }
4990#endif
79072805 4991 SvREFCNT(sv) = refcnt;
1edc1566 4992 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 4993 SvREFCNT(nsv) = 0;
463ee0b2 4994 del_SV(nsv);
79072805
LW
4995}
4996
c461cf8f
JH
4997/*
4998=for apidoc sv_clear
4999
645c22ef
DM
5000Clear an SV: call any destructors, free up any memory used by the body,
5001and free the body itself. The SV's head is I<not> freed, although
5002its type is set to all 1's so that it won't inadvertently be assumed
5003to be live during global destruction etc.
5004This function should only be called when REFCNT is zero. Most of the time
5005you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5006instead.
c461cf8f
JH
5007
5008=cut
5009*/
5010
79072805 5011void
864dbfa3 5012Perl_sv_clear(pTHX_ register SV *sv)
79072805 5013{
27da23d5 5014 dVAR;
82bb6deb 5015 const U32 type = SvTYPE(sv);
8edfc514
NC
5016 const struct body_details *const sv_type_details
5017 = bodies_by_type + type;
82bb6deb 5018
79072805
LW
5019 assert(sv);
5020 assert(SvREFCNT(sv) == 0);
5021
d2a0f284
JC
5022 if (type <= SVt_IV) {
5023 /* See the comment in sv.h about the collusion between this early
5024 return and the overloading of the NULL and IV slots in the size
5025 table. */
82bb6deb 5026 return;
d2a0f284 5027 }
82bb6deb 5028
ed6116ce 5029 if (SvOBJECT(sv)) {
3280af22 5030 if (PL_defstash) { /* Still have a symbol table? */
39644a26 5031 dSP;
893645bd 5032 HV* stash;
d460ef45 5033 do {
b464bac0 5034 CV* destructor;
4e8e7886 5035 stash = SvSTASH(sv);
32251b26 5036 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 5037 if (destructor) {
1b6737cc 5038 SV* const tmpref = newRV(sv);
5cc433a6 5039 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 5040 ENTER;
e788e7d3 5041 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
5042 EXTEND(SP, 2);
5043 PUSHMARK(SP);
5cc433a6 5044 PUSHs(tmpref);
4e8e7886 5045 PUTBACK;
44389ee9 5046 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
7a5fa8a2
NIS
5047
5048
d3acc0f7 5049 POPSTACK;
3095d977 5050 SPAGAIN;
4e8e7886 5051 LEAVE;
5cc433a6
AB
5052 if(SvREFCNT(tmpref) < 2) {
5053 /* tmpref is not kept alive! */
5054 SvREFCNT(sv)--;
b162af07 5055 SvRV_set(tmpref, NULL);
5cc433a6
AB
5056 SvROK_off(tmpref);
5057 }
5058 SvREFCNT_dec(tmpref);
4e8e7886
GS
5059 }
5060 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5061
6f44e0a4
JP
5062
5063 if (SvREFCNT(sv)) {
5064 if (PL_in_clean_objs)
cea2e8a9 5065 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
bfcb3514 5066 HvNAME_get(stash));
6f44e0a4
JP
5067 /* DESTROY gave object new lease on life */
5068 return;
5069 }
a0d0e21e 5070 }
4e8e7886 5071
a0d0e21e 5072 if (SvOBJECT(sv)) {
4e8e7886 5073 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e 5074 SvOBJECT_off(sv); /* Curse the object. */
82bb6deb 5075 if (type != SVt_PVIO)
3280af22 5076 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5077 }
463ee0b2 5078 }
82bb6deb 5079 if (type >= SVt_PVMG) {
885ffcb3
NC
5080 if ((type == SVt_PVMG || type == SVt_PVGV) && SvPAD_OUR(sv)) {
5081 SvREFCNT_dec(OURSTASH(sv));
e736a858 5082 } else if (SvMAGIC(sv))
524189f1 5083 mg_free(sv);
00b1698f 5084 if (type == SVt_PVMG && SvPAD_TYPED(sv))
524189f1
JH
5085 SvREFCNT_dec(SvSTASH(sv));
5086 }
82bb6deb 5087 switch (type) {
8990e307 5088 case SVt_PVIO:
df0bd2f4
GS
5089 if (IoIFP(sv) &&
5090 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5091 IoIFP(sv) != PerlIO_stdout() &&
5092 IoIFP(sv) != PerlIO_stderr())
93578b34 5093 {
f2b5be74 5094 io_close((IO*)sv, FALSE);
93578b34 5095 }
1d7c1841 5096 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5097 PerlDir_close(IoDIRP(sv));
1d7c1841 5098 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5099 Safefree(IoTOP_NAME(sv));
5100 Safefree(IoFMT_NAME(sv));
5101 Safefree(IoBOTTOM_NAME(sv));
82bb6deb 5102 goto freescalar;
79072805 5103 case SVt_PVBM:
a0d0e21e 5104 goto freescalar;
79072805 5105 case SVt_PVCV:
748a9306 5106 case SVt_PVFM:
85e6fe83 5107 cv_undef((CV*)sv);
a0d0e21e 5108 goto freescalar;
79072805 5109 case SVt_PVHV:
86f55936 5110 Perl_hv_kill_backrefs(aTHX_ (HV*)sv);
85e6fe83 5111 hv_undef((HV*)sv);
a0d0e21e 5112 break;
79072805 5113 case SVt_PVAV:
85e6fe83 5114 av_undef((AV*)sv);
a0d0e21e 5115 break;
02270b4e 5116 case SVt_PVLV:
dd28f7bb
DM
5117 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5118 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5119 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5120 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5121 }
5122 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
5123 SvREFCNT_dec(LvTARG(sv));
02270b4e 5124 goto freescalar;
a0d0e21e 5125 case SVt_PVGV:
1edc1566 5126 gp_free((GV*)sv);
acda4c6a
NC
5127 if (GvNAME_HEK(sv)) {
5128 unshare_hek(GvNAME_HEK(sv));
5129 }
893645bd
NC
5130 /* If we're in a stash, we don't own a reference to it. However it does
5131 have a back reference to us, which needs to be cleared. */
5132 if (GvSTASH(sv))
5133 sv_del_backref((SV*)GvSTASH(sv), sv);
79072805 5134 case SVt_PVMG:
79072805
LW
5135 case SVt_PVNV:
5136 case SVt_PVIV:
a0d0e21e 5137 freescalar:
5228ca4e
NC
5138 /* Don't bother with SvOOK_off(sv); as we're only going to free it. */
5139 if (SvOOK(sv)) {
93524f2b 5140 SvPV_set(sv, SvPVX_mutable(sv) - SvIVX(sv));
5228ca4e
NC
5141 /* Don't even bother with turning off the OOK flag. */
5142 }
79072805 5143 case SVt_PV:
a0d0e21e 5144 case SVt_RV:
810b8aa5 5145 if (SvROK(sv)) {
b37c2d43 5146 SV * const target = SvRV(sv);
810b8aa5 5147 if (SvWEAKREF(sv))
e15faf7d 5148 sv_del_backref(target, sv);
810b8aa5 5149 else
e15faf7d 5150 SvREFCNT_dec(target);
810b8aa5 5151 }
f8c7b90f 5152#ifdef PERL_OLD_COPY_ON_WRITE
3f7c398e 5153 else if (SvPVX_const(sv)) {
765f542d
NC
5154 if (SvIsCOW(sv)) {
5155 /* I believe I need to grab the global SV mutex here and
5156 then recheck the COW status. */
46187eeb
NC
5157 if (DEBUG_C_TEST) {
5158 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5159 sv_dump(sv);
46187eeb 5160 }
bdd68bc3
NC
5161 sv_release_COW(sv, SvPVX_const(sv), SvLEN(sv),
5162 SV_COW_NEXT_SV(sv));
765f542d
NC
5163 /* And drop it here. */
5164 SvFAKE_off(sv);
5165 } else if (SvLEN(sv)) {
3f7c398e 5166 Safefree(SvPVX_const(sv));
765f542d
NC
5167 }
5168 }
5169#else
3f7c398e 5170 else if (SvPVX_const(sv) && SvLEN(sv))
94010e71 5171 Safefree(SvPVX_mutable(sv));
3f7c398e 5172 else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
bdd68bc3 5173 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
1c846c1f
NIS
5174 SvFAKE_off(sv);
5175 }
765f542d 5176#endif
79072805
LW
5177 break;
5178 case SVt_NV:
79072805
LW
5179 break;
5180 }
5181
893645bd
NC
5182 SvFLAGS(sv) &= SVf_BREAK;
5183 SvFLAGS(sv) |= SVTYPEMASK;
5184
8edfc514 5185 if (sv_type_details->arena) {
b9502f15 5186 del_body(((char *)SvANY(sv) + sv_type_details->offset),
8edfc514
NC
5187 &PL_body_roots[type]);
5188 }
d2a0f284 5189 else if (sv_type_details->body_size) {
8edfc514
NC
5190 my_safefree(SvANY(sv));
5191 }
79072805
LW
5192}
5193
645c22ef
DM
5194/*
5195=for apidoc sv_newref
5196
5197Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5198instead.
5199
5200=cut
5201*/
5202
79072805 5203SV *
864dbfa3 5204Perl_sv_newref(pTHX_ SV *sv)
79072805 5205{
96a5add6 5206 PERL_UNUSED_CONTEXT;
463ee0b2 5207 if (sv)
4db098f4 5208 (SvREFCNT(sv))++;
79072805
LW
5209 return sv;
5210}
5211
c461cf8f
JH
5212/*
5213=for apidoc sv_free
5214
645c22ef
DM
5215Decrement an SV's reference count, and if it drops to zero, call
5216C<sv_clear> to invoke destructors and free up any memory used by
5217the body; finally, deallocate the SV's head itself.
5218Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5219
5220=cut
5221*/
5222
79072805 5223void
864dbfa3 5224Perl_sv_free(pTHX_ SV *sv)
79072805 5225{
27da23d5 5226 dVAR;
79072805
LW
5227 if (!sv)
5228 return;
a0d0e21e
LW
5229 if (SvREFCNT(sv) == 0) {
5230 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5231 /* this SV's refcnt has been artificially decremented to
5232 * trigger cleanup */
a0d0e21e 5233 return;
3280af22 5234 if (PL_in_clean_all) /* All is fair */
1edc1566 5235 return;
d689ffdd
JP
5236 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5237 /* make sure SvREFCNT(sv)==0 happens very seldom */
5238 SvREFCNT(sv) = (~(U32)0)/2;
5239 return;
5240 }
41e4abd8 5241 if (ckWARN_d(WARN_INTERNAL)) {
d5dede04 5242 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
5243 "Attempt to free unreferenced scalar: SV 0x%"UVxf
5244 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
41e4abd8
NC
5245#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
5246 Perl_dump_sv_child(aTHX_ sv);
5247#endif
5248 }
79072805
LW
5249 return;
5250 }
4db098f4 5251 if (--(SvREFCNT(sv)) > 0)
8990e307 5252 return;
8c4d3c90
NC
5253 Perl_sv_free2(aTHX_ sv);
5254}
5255
5256void
5257Perl_sv_free2(pTHX_ SV *sv)
5258{
27da23d5 5259 dVAR;
463ee0b2
LW
5260#ifdef DEBUGGING
5261 if (SvTEMP(sv)) {
0453d815 5262 if (ckWARN_d(WARN_DEBUGGING))
9014280d 5263 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
472d47bc
SB
5264 "Attempt to free temp prematurely: SV 0x%"UVxf
5265 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 5266 return;
79072805 5267 }
463ee0b2 5268#endif
d689ffdd
JP
5269 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5270 /* make sure SvREFCNT(sv)==0 happens very seldom */
5271 SvREFCNT(sv) = (~(U32)0)/2;
5272 return;
5273 }
79072805 5274 sv_clear(sv);
477f5d66
CS
5275 if (! SvREFCNT(sv))
5276 del_SV(sv);
79072805
LW
5277}
5278
954c1994
GS
5279/*
5280=for apidoc sv_len
5281
645c22ef
DM
5282Returns the length of the string in the SV. Handles magic and type
5283coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5284
5285=cut
5286*/
5287
79072805 5288STRLEN
864dbfa3 5289Perl_sv_len(pTHX_ register SV *sv)
79072805 5290{
463ee0b2 5291 STRLEN len;
79072805
LW
5292
5293 if (!sv)
5294 return 0;
5295
8990e307 5296 if (SvGMAGICAL(sv))
565764a8 5297 len = mg_length(sv);
8990e307 5298 else
4d84ee25 5299 (void)SvPV_const(sv, len);
463ee0b2 5300 return len;
79072805
LW
5301}
5302
c461cf8f
JH
5303/*
5304=for apidoc sv_len_utf8
5305
5306Returns the number of characters in the string in an SV, counting wide
1e54db1a 5307UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5308
5309=cut
5310*/
5311
7e8c5dac
HS
5312/*
5313 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
9564a3bd
NC
5314 * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
5315 * (Note that the mg_len is not the length of the mg_ptr field.
5316 * This allows the cache to store the character length of the string without
5317 * needing to malloc() extra storage to attach to the mg_ptr.)
7a5fa8a2 5318 *
7e8c5dac
HS
5319 */
5320
a0ed51b3 5321STRLEN
864dbfa3 5322Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 5323{
a0ed51b3
LW
5324 if (!sv)
5325 return 0;
5326
a0ed51b3 5327 if (SvGMAGICAL(sv))
b76347f2 5328 return mg_length(sv);
a0ed51b3 5329 else
b76347f2 5330 {
26346457 5331 STRLEN len;
e62f0680 5332 const U8 *s = (U8*)SvPV_const(sv, len);
7e8c5dac 5333
26346457
NC
5334 if (PL_utf8cache) {
5335 STRLEN ulen;
5336 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
5337
5338 if (mg && mg->mg_len != -1) {
5339 ulen = mg->mg_len;
5340 if (PL_utf8cache < 0) {
5341 const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
5342 if (real != ulen) {
5343 /* Need to turn the assertions off otherwise we may
5344 recurse infinitely while printing error messages.
5345 */
5346 SAVEI8(PL_utf8cache);
5347 PL_utf8cache = 0;
5348 Perl_croak(aTHX_ "panic: sv_len_utf8 cache %"UVf
ec07b5e0 5349 " real %"UVf" for %"SVf,
95b63a38 5350 (UV) ulen, (UV) real, (void*)sv);
26346457
NC
5351 }
5352 }
5353 }
5354 else {
5355 ulen = Perl_utf8_length(aTHX_ s, s + len);
5356 if (!SvREADONLY(sv)) {
5357 if (!mg) {
5358 mg = sv_magicext(sv, 0, PERL_MAGIC_utf8,
5359 &PL_vtbl_utf8, 0, 0);
5360 }
cb9e20bb 5361 assert(mg);
26346457 5362 mg->mg_len = ulen;
cb9e20bb 5363 }
cb9e20bb 5364 }
26346457 5365 return ulen;
7e8c5dac 5366 }
26346457 5367 return Perl_utf8_length(aTHX_ s, s + len);
7e8c5dac
HS
5368 }
5369}
5370
9564a3bd
NC
5371/* Walk forwards to find the byte corresponding to the passed in UTF-8
5372 offset. */
bdf30dd6 5373static STRLEN
721e86b6 5374S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
bdf30dd6
NC
5375 STRLEN uoffset)
5376{
5377 const U8 *s = start;
5378
5379 while (s < send && uoffset--)
5380 s += UTF8SKIP(s);
5381 if (s > send) {
5382 /* This is the existing behaviour. Possibly it should be a croak, as
5383 it's actually a bounds error */
5384 s = send;
5385 }
5386 return s - start;
5387}
5388
9564a3bd
NC
5389/* Given the length of the string in both bytes and UTF-8 characters, decide
5390 whether to walk forwards or backwards to find the byte corresponding to
5391 the passed in UTF-8 offset. */
c336ad0b 5392static STRLEN
721e86b6 5393S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
c336ad0b
NC
5394 STRLEN uoffset, STRLEN uend)
5395{
5396 STRLEN backw = uend - uoffset;
5397 if (uoffset < 2 * backw) {
25a8a4ef 5398 /* The assumption is that going forwards is twice the speed of going
c336ad0b
NC
5399 forward (that's where the 2 * backw comes from).
5400 (The real figure of course depends on the UTF-8 data.) */
721e86b6 5401 return sv_pos_u2b_forwards(start, send, uoffset);
c336ad0b
NC
5402 }
5403
5404 while (backw--) {
5405 send--;
5406 while (UTF8_IS_CONTINUATION(*send))
5407 send--;
5408 }
5409 return send - start;
5410}
5411
9564a3bd
NC
5412/* For the string representation of the given scalar, find the byte
5413 corresponding to the passed in UTF-8 offset. uoffset0 and boffset0
5414 give another position in the string, *before* the sought offset, which
5415 (which is always true, as 0, 0 is a valid pair of positions), which should
5416 help reduce the amount of linear searching.
5417 If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
5418 will be used to reduce the amount of linear searching. The cache will be
5419 created if necessary, and the found value offered to it for update. */
28ccbf94
NC
5420static STRLEN
5421S_sv_pos_u2b_cached(pTHX_ SV *sv, MAGIC **mgp, const U8 *const start,
5422 const U8 *const send, STRLEN uoffset,
5423 STRLEN uoffset0, STRLEN boffset0) {
7087a21c 5424 STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy. */
c336ad0b
NC
5425 bool found = FALSE;
5426
75c33c12
NC
5427 assert (uoffset >= uoffset0);
5428
c336ad0b 5429 if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
0905937d 5430 && (*mgp || (*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
d8b2e1f9
NC
5431 if ((*mgp)->mg_ptr) {
5432 STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
5433 if (cache[0] == uoffset) {
5434 /* An exact match. */
5435 return cache[1];
5436 }
ab455f60
NC
5437 if (cache[2] == uoffset) {
5438 /* An exact match. */
5439 return cache[3];
5440 }
668af93f
NC
5441
5442 if (cache[0] < uoffset) {
d8b2e1f9
NC
5443 /* The cache already knows part of the way. */
5444 if (cache[0] > uoffset0) {
5445 /* The cache knows more than the passed in pair */
5446 uoffset0 = cache[0];
5447 boffset0 = cache[1];
5448 }
5449 if ((*mgp)->mg_len != -1) {
5450 /* And we know the end too. */
5451 boffset = boffset0
721e86b6 5452 + sv_pos_u2b_midway(start + boffset0, send,
d8b2e1f9
NC
5453 uoffset - uoffset0,
5454 (*mgp)->mg_len - uoffset0);
5455 } else {
5456 boffset = boffset0
721e86b6 5457 + sv_pos_u2b_forwards(start + boffset0,
d8b2e1f9
NC
5458 send, uoffset - uoffset0);
5459 }
dd7c5fd3
NC
5460 }
5461 else if (cache[2] < uoffset) {
5462 /* We're between the two cache entries. */
5463 if (cache[2] > uoffset0) {
5464 /* and the cache knows more than the passed in pair */
5465 uoffset0 = cache[2];
5466 boffset0 = cache[3];
5467 }
5468
668af93f 5469 boffset = boffset0
721e86b6 5470 + sv_pos_u2b_midway(start + boffset0,
668af93f
NC
5471 start + cache[1],
5472 uoffset - uoffset0,
5473 cache[0] - uoffset0);
dd7c5fd3
NC
5474 } else {
5475 boffset = boffset0
721e86b6 5476 + sv_pos_u2b_midway(start + boffset0,
dd7c5fd3
NC
5477 start + cache[3],
5478 uoffset - uoffset0,
5479 cache[2] - uoffset0);
d8b2e1f9 5480 }
668af93f 5481 found = TRUE;
d8b2e1f9
NC
5482 }
5483 else if ((*mgp)->mg_len != -1) {
75c33c12
NC
5484 /* If we can take advantage of a passed in offset, do so. */
5485 /* In fact, offset0 is either 0, or less than offset, so don't
5486 need to worry about the other possibility. */
5487 boffset = boffset0
721e86b6 5488 + sv_pos_u2b_midway(start + boffset0, send,
75c33c12
NC
5489 uoffset - uoffset0,
5490 (*mgp)->mg_len - uoffset0);
c336ad0b
NC
5491 found = TRUE;
5492 }
28ccbf94 5493 }
c336ad0b
NC
5494
5495 if (!found || PL_utf8cache < 0) {
75c33c12 5496 const STRLEN real_boffset
721e86b6 5497 = boffset0 + sv_pos_u2b_forwards(start + boffset0,
75c33c12
NC
5498 send, uoffset - uoffset0);
5499
c336ad0b
NC
5500 if (found && PL_utf8cache < 0) {
5501 if (real_boffset != boffset) {
5502 /* Need to turn the assertions off otherwise we may recurse
5503 infinitely while printing error messages. */
5504 SAVEI8(PL_utf8cache);
5505 PL_utf8cache = 0;
5506 Perl_croak(aTHX_ "panic: sv_pos_u2b_cache cache %"UVf
5507 " real %"UVf" for %"SVf,
95b63a38 5508 (UV) boffset, (UV) real_boffset, (void*)sv);
c336ad0b
NC
5509 }
5510 }
5511 boffset = real_boffset;
28ccbf94 5512 }
0905937d 5513
ab455f60 5514 S_utf8_mg_pos_cache_update(aTHX_ sv, mgp, boffset, uoffset, send - start);
28ccbf94
NC
5515 return boffset;
5516}
5517
9564a3bd
NC
5518
5519/*
5520=for apidoc sv_pos_u2b
5521
5522Converts the value pointed to by offsetp from a count of UTF-8 chars from
5523the start of the string, to a count of the equivalent number of bytes; if
5524lenp is non-zero, it does the same to lenp, but this time starting from
5525the offset, rather than from the start of the string. Handles magic and
5526type coercion.
5527
5528=cut
5529*/
5530
5531/*
5532 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
5533 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5534 * byte offsets. See also the comments of S_utf8_mg_pos_cache_update().
5535 *
5536 */
5537
a0ed51b3 5538void
864dbfa3 5539Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 5540{
245d4a47 5541 const U8 *start;
a0ed51b3
LW
5542 STRLEN len;
5543
5544 if (!sv)
5545 return;
5546
245d4a47 5547 start = (U8*)SvPV_const(sv, len);
7e8c5dac 5548 if (len) {
bdf30dd6
NC
5549 STRLEN uoffset = (STRLEN) *offsetp;
5550 const U8 * const send = start + len;
0905937d 5551 MAGIC *mg = NULL;
721e86b6 5552 const STRLEN boffset = sv_pos_u2b_cached(sv, &mg, start, send,
28ccbf94 5553 uoffset, 0, 0);
bdf30dd6
NC
5554
5555 *offsetp = (I32) boffset;
5556
5557 if (lenp) {
28ccbf94 5558 /* Convert the relative offset to absolute. */
721e86b6
AL
5559 const STRLEN uoffset2 = uoffset + (STRLEN) *lenp;
5560 const STRLEN boffset2
5561 = sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
28ccbf94 5562 uoffset, boffset) - boffset;
bdf30dd6 5563
28ccbf94 5564 *lenp = boffset2;
bdf30dd6 5565 }
7e8c5dac
HS
5566 }
5567 else {
5568 *offsetp = 0;
5569 if (lenp)
5570 *lenp = 0;
a0ed51b3 5571 }
e23c8137 5572
a0ed51b3
LW
5573 return;
5574}
5575
9564a3bd
NC
5576/* Create and update the UTF8 magic offset cache, with the proffered utf8/
5577 byte length pairing. The (byte) length of the total SV is passed in too,
5578 as blen, because for some (more esoteric) SVs, the call to SvPV_const()
5579 may not have updated SvCUR, so we can't rely on reading it directly.
5580
5581 The proffered utf8/byte length pairing isn't used if the cache already has
5582 two pairs, and swapping either for the proffered pair would increase the
5583 RMS of the intervals between known byte offsets.
5584
5585 The cache itself consists of 4 STRLEN values
5586 0: larger UTF-8 offset
5587 1: corresponding byte offset
5588 2: smaller UTF-8 offset
5589 3: corresponding byte offset
5590
5591 Unused cache pairs have the value 0, 0.
5592 Keeping the cache "backwards" means that the invariant of
5593 cache[0] >= cache[2] is maintained even with empty slots, which means that
5594 the code that uses it doesn't need to worry if only 1 entry has actually
5595 been set to non-zero. It also makes the "position beyond the end of the
5596 cache" logic much simpler, as the first slot is always the one to start
5597 from.
645c22ef 5598*/
ec07b5e0 5599static void
ab455f60
NC
5600S_utf8_mg_pos_cache_update(pTHX_ SV *sv, MAGIC **mgp, STRLEN byte, STRLEN utf8,
5601 STRLEN blen)
ec07b5e0
NC
5602{
5603 STRLEN *cache;
5604 if (SvREADONLY(sv))
5605 return;
5606
5607 if (!*mgp) {
5608 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
5609 0);
5610 (*mgp)->mg_len = -1;
5611 }
5612 assert(*mgp);
5613
5614 if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
5615 Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
5616 (*mgp)->mg_ptr = (char *) cache;
5617 }
5618 assert(cache);
5619
5620 if (PL_utf8cache < 0) {
ef816a78 5621 const U8 *start = (const U8 *) SvPVX_const(sv);
0905937d
NC
5622 const U8 *const end = start + byte;
5623 STRLEN realutf8 = 0;
5624
5625 while (start < end) {
5626 start += UTF8SKIP(start);
5627 realutf8++;
5628 }
5629
5630 /* Can't use S_sv_pos_b2u_forwards as it will scream warnings on
5631 surrogates. FIXME - is it inconsistent that b2u warns, but u2b
5632 doesn't? I don't know whether this difference was introduced with
5633 the caching code in 5.8.1. */
ec07b5e0
NC
5634
5635 if (realutf8 != utf8) {
5636 /* Need to turn the assertions off otherwise we may recurse
5637 infinitely while printing error messages. */
5638 SAVEI8(PL_utf8cache);
5639 PL_utf8cache = 0;
5640 Perl_croak(aTHX_ "panic: utf8_mg_pos_cache_update cache %"UVf
95b63a38 5641 " real %"UVf" for %"SVf, (UV) utf8, (UV) realutf8, (void*)sv);
ec07b5e0
NC
5642 }
5643 }
ab455f60
NC
5644
5645 /* Cache is held with the later position first, to simplify the code
5646 that deals with unbounded ends. */
5647
5648 ASSERT_UTF8_CACHE(cache);
5649 if (cache[1] == 0) {
5650 /* Cache is totally empty */
5651 cache[0] = utf8;
5652 cache[1] = byte;
5653 } else if (cache[3] == 0) {
5654 if (byte > cache[1]) {
5655 /* New one is larger, so goes first. */
5656 cache[2] = cache[0];
5657 cache[3] = cache[1];
5658 cache[0] = utf8;
5659 cache[1] = byte;
5660 } else {
5661 cache[2] = utf8;
5662 cache[3] = byte;
5663 }
5664 } else {
5665#define THREEWAY_SQUARE(a,b,c,d) \
5666 ((float)((d) - (c))) * ((float)((d) - (c))) \
5667 + ((float)((c) - (b))) * ((float)((c) - (b))) \
5668 + ((float)((b) - (a))) * ((float)((b) - (a)))
5669
5670 /* Cache has 2 slots in use, and we know three potential pairs.
5671 Keep the two that give the lowest RMS distance. Do the
5672 calcualation in bytes simply because we always know the byte
5673 length. squareroot has the same ordering as the positive value,
5674 so don't bother with the actual square root. */
5675 const float existing = THREEWAY_SQUARE(0, cache[3], cache[1], blen);
5676 if (byte > cache[1]) {
5677 /* New position is after the existing pair of pairs. */
5678 const float keep_earlier
5679 = THREEWAY_SQUARE(0, cache[3], byte, blen);
5680 const float keep_later
5681 = THREEWAY_SQUARE(0, cache[1], byte, blen);
5682
5683 if (keep_later < keep_earlier) {
5684 if (keep_later < existing) {
5685 cache[2] = cache[0];
5686 cache[3] = cache[1];
5687 cache[0] = utf8;
5688 cache[1] = byte;
5689 }
5690 }
5691 else {
5692 if (keep_earlier < existing) {
5693 cache[0] = utf8;
5694 cache[1] = byte;
5695 }
5696 }
5697 }
57d7fbf1
NC
5698 else if (byte > cache[3]) {
5699 /* New position is between the existing pair of pairs. */
5700 const float keep_earlier
5701 = THREEWAY_SQUARE(0, cache[3], byte, blen);
5702 const float keep_later
5703 = THREEWAY_SQUARE(0, byte, cache[1], blen);
5704
5705 if (keep_later < keep_earlier) {
5706 if (keep_later < existing) {
5707 cache[2] = utf8;
5708 cache[3] = byte;
5709 }
5710 }
5711 else {
5712 if (keep_earlier < existing) {
5713 cache[0] = utf8;
5714 cache[1] = byte;
5715 }
5716 }
5717 }
5718 else {
5719 /* New position is before the existing pair of pairs. */
5720 const float keep_earlier
5721 = THREEWAY_SQUARE(0, byte, cache[3], blen);
5722 const float keep_later
5723 = THREEWAY_SQUARE(0, byte, cache[1], blen);
5724
5725 if (keep_later < keep_earlier) {
5726 if (keep_later < existing) {
5727 cache[2] = utf8;
5728 cache[3] = byte;
5729 }
5730 }
5731 else {
5732 if (keep_earlier < existing) {
5733 cache[0] = cache[2];
5734 cache[1] = cache[3];
5735 cache[2] = utf8;
5736 cache[3] = byte;
5737 }
5738 }
5739 }
ab455f60 5740 }
0905937d 5741 ASSERT_UTF8_CACHE(cache);
ec07b5e0
NC
5742}
5743
5744/* If we don't know the character offset of the end of a region, our only
5745 option is to walk forwards to the target byte offset. */
5746static STRLEN
5747S_sv_pos_b2u_forwards(pTHX_ const U8 *s, const U8 *const target)
5748{
5749 STRLEN len = 0;
5750 while (s < target) {
5751 STRLEN n = 1;
5752
5753 /* Call utf8n_to_uvchr() to validate the sequence
5754 * (unless a simple non-UTF character) */
5755 if (!UTF8_IS_INVARIANT(*s))
5756 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
5757 if (n > 0) {
5758 s += n;
5759 len++;
5760 }
5761 else
5762 break;
5763 }
5764 return len;
5765}
5766
5767/* We already know all of the way, now we may be able to walk back. The same
25a8a4ef
NC
5768 assumption is made as in S_sv_pos_u2b_midway(), namely that walking
5769 backward is half the speed of walking forward. */
ec07b5e0
NC
5770static STRLEN
5771S_sv_pos_b2u_midway(pTHX_ const U8 *s, const U8 *const target, const U8 *end,
5772 STRLEN endu)
5773{
5774 const STRLEN forw = target - s;
5775 STRLEN backw = end - target;
5776
5777 if (forw < 2 * backw) {
5778 return S_sv_pos_b2u_forwards(aTHX_ s, target);
5779 }
5780
5781 while (end > target) {
5782 end--;
5783 while (UTF8_IS_CONTINUATION(*end)) {
5784 end--;
5785 }
5786 endu--;
5787 }
5788 return endu;
5789}
5790
9564a3bd
NC
5791/*
5792=for apidoc sv_pos_b2u
5793
5794Converts the value pointed to by offsetp from a count of bytes from the
5795start of the string, to a count of the equivalent number of UTF-8 chars.
5796Handles magic and type coercion.
5797
5798=cut
5799*/
5800
5801/*
5802 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
5803 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5804 * byte offsets.
5805 *
5806 */
a0ed51b3 5807void
7e8c5dac 5808Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 5809{
83003860 5810 const U8* s;
ec07b5e0 5811 const STRLEN byte = *offsetp;
7087a21c 5812 STRLEN len = 0; /* Actually always set, but let's keep gcc happy. */
ab455f60 5813 STRLEN blen;
ec07b5e0
NC
5814 MAGIC* mg = NULL;
5815 const U8* send;
a922f900 5816 bool found = FALSE;
a0ed51b3
LW
5817
5818 if (!sv)
5819 return;
5820
ab455f60 5821 s = (const U8*)SvPV_const(sv, blen);
7e8c5dac 5822
ab455f60 5823 if (blen < byte)
ec07b5e0 5824 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac 5825
ec07b5e0 5826 send = s + byte;
a67d7df9 5827
ffca234a
NC
5828 if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
5829 && (mg = mg_find(sv, PERL_MAGIC_utf8))) {
5830 if (mg->mg_ptr) {
d4c19fe8 5831 STRLEN * const cache = (STRLEN *) mg->mg_ptr;
b9f984a5 5832 if (cache[1] == byte) {
ec07b5e0
NC
5833 /* An exact match. */
5834 *offsetp = cache[0];
ec07b5e0 5835 return;
7e8c5dac 5836 }
ab455f60
NC
5837 if (cache[3] == byte) {
5838 /* An exact match. */
5839 *offsetp = cache[2];
5840 return;
5841 }
668af93f
NC
5842
5843 if (cache[1] < byte) {
ec07b5e0 5844 /* We already know part of the way. */
b9f984a5
NC
5845 if (mg->mg_len != -1) {
5846 /* Actually, we know the end too. */
5847 len = cache[0]
5848 + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
ab455f60 5849 s + blen, mg->mg_len - cache[0]);
b9f984a5
NC
5850 } else {
5851 len = cache[0]
5852 + S_sv_pos_b2u_forwards(aTHX_ s + cache[1], send);
5853 }
7e8c5dac 5854 }
9f985e4c
NC
5855 else if (cache[3] < byte) {
5856 /* We're between the two cached pairs, so we do the calculation
5857 offset by the byte/utf-8 positions for the earlier pair,
5858 then add the utf-8 characters from the string start to
5859 there. */
5860 len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
5861 s + cache[1], cache[0] - cache[2])
5862 + cache[2];
5863
5864 }
5865 else { /* cache[3] > byte */
5866 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
5867 cache[2]);
7e8c5dac 5868
7e8c5dac 5869 }
ec07b5e0 5870 ASSERT_UTF8_CACHE(cache);
a922f900 5871 found = TRUE;
ffca234a 5872 } else if (mg->mg_len != -1) {
ab455f60 5873 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
a922f900 5874 found = TRUE;
7e8c5dac 5875 }
a0ed51b3 5876 }
a922f900
NC
5877 if (!found || PL_utf8cache < 0) {
5878 const STRLEN real_len = S_sv_pos_b2u_forwards(aTHX_ s, send);
5879
5880 if (found && PL_utf8cache < 0) {
5881 if (len != real_len) {
5882 /* Need to turn the assertions off otherwise we may recurse
5883 infinitely while printing error messages. */
5884 SAVEI8(PL_utf8cache);
5885 PL_utf8cache = 0;
5886 Perl_croak(aTHX_ "panic: sv_pos_b2u cache %"UVf
5887 " real %"UVf" for %"SVf,
95b63a38 5888 (UV) len, (UV) real_len, (void*)sv);
a922f900
NC
5889 }
5890 }
5891 len = real_len;
ec07b5e0
NC
5892 }
5893 *offsetp = len;
5894
ab455f60 5895 S_utf8_mg_pos_cache_update(aTHX_ sv, &mg, byte, len, blen);
a0ed51b3
LW
5896}
5897
954c1994
GS
5898/*
5899=for apidoc sv_eq
5900
5901Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
5902identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5903coerce its args to strings if necessary.
954c1994
GS
5904
5905=cut
5906*/
5907
79072805 5908I32
e01b9e88 5909Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805 5910{
97aff369 5911 dVAR;
e1ec3a88 5912 const char *pv1;
463ee0b2 5913 STRLEN cur1;
e1ec3a88 5914 const char *pv2;
463ee0b2 5915 STRLEN cur2;
e01b9e88 5916 I32 eq = 0;
bd61b366 5917 char *tpv = NULL;
a0714e2c 5918 SV* svrecode = NULL;
79072805 5919
e01b9e88 5920 if (!sv1) {
79072805
LW
5921 pv1 = "";
5922 cur1 = 0;
5923 }
463ee0b2 5924 else
4d84ee25 5925 pv1 = SvPV_const(sv1, cur1);
79072805 5926
e01b9e88
SC
5927 if (!sv2){
5928 pv2 = "";
5929 cur2 = 0;
92d29cee 5930 }
e01b9e88 5931 else
4d84ee25 5932 pv2 = SvPV_const(sv2, cur2);
79072805 5933
cf48d248 5934 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
5935 /* Differing utf8ness.
5936 * Do not UTF8size the comparands as a side-effect. */
5937 if (PL_encoding) {
5938 if (SvUTF8(sv1)) {
553e1bcc
AT
5939 svrecode = newSVpvn(pv2, cur2);
5940 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5941 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
5942 }
5943 else {
553e1bcc
AT
5944 svrecode = newSVpvn(pv1, cur1);
5945 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5946 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
5947 }
5948 /* Now both are in UTF-8. */
0a1bd7ac
DM
5949 if (cur1 != cur2) {
5950 SvREFCNT_dec(svrecode);
799ef3cb 5951 return FALSE;
0a1bd7ac 5952 }
799ef3cb
JH
5953 }
5954 else {
5955 bool is_utf8 = TRUE;
5956
5957 if (SvUTF8(sv1)) {
5958 /* sv1 is the UTF-8 one,
5959 * if is equal it must be downgrade-able */
9d4ba2ae 5960 char * const pv = (char*)bytes_from_utf8((const U8*)pv1,
799ef3cb
JH
5961 &cur1, &is_utf8);
5962 if (pv != pv1)
553e1bcc 5963 pv1 = tpv = pv;
799ef3cb
JH
5964 }
5965 else {
5966 /* sv2 is the UTF-8 one,
5967 * if is equal it must be downgrade-able */
9d4ba2ae 5968 char * const pv = (char *)bytes_from_utf8((const U8*)pv2,
799ef3cb
JH
5969 &cur2, &is_utf8);
5970 if (pv != pv2)
553e1bcc 5971 pv2 = tpv = pv;
799ef3cb
JH
5972 }
5973 if (is_utf8) {
5974 /* Downgrade not possible - cannot be eq */
bf694877 5975 assert (tpv == 0);
799ef3cb
JH
5976 return FALSE;
5977 }
5978 }
cf48d248
JH
5979 }
5980
5981 if (cur1 == cur2)
765f542d 5982 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 5983
b37c2d43 5984 SvREFCNT_dec(svrecode);
553e1bcc
AT
5985 if (tpv)
5986 Safefree(tpv);
cf48d248 5987
e01b9e88 5988 return eq;
79072805
LW
5989}
5990
954c1994
GS
5991/*
5992=for apidoc sv_cmp
5993
5994Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
5995string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
5996C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5997coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
5998
5999=cut
6000*/
6001
79072805 6002I32
e01b9e88 6003Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 6004{
97aff369 6005 dVAR;
560a288e 6006 STRLEN cur1, cur2;
e1ec3a88 6007 const char *pv1, *pv2;
bd61b366 6008 char *tpv = NULL;
cf48d248 6009 I32 cmp;
a0714e2c 6010 SV *svrecode = NULL;
560a288e 6011
e01b9e88
SC
6012 if (!sv1) {
6013 pv1 = "";
560a288e
GS
6014 cur1 = 0;
6015 }
e01b9e88 6016 else
4d84ee25 6017 pv1 = SvPV_const(sv1, cur1);
560a288e 6018
553e1bcc 6019 if (!sv2) {
e01b9e88 6020 pv2 = "";
560a288e
GS
6021 cur2 = 0;
6022 }
e01b9e88 6023 else
4d84ee25 6024 pv2 = SvPV_const(sv2, cur2);
79072805 6025
cf48d248 6026 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6027 /* Differing utf8ness.
6028 * Do not UTF8size the comparands as a side-effect. */
cf48d248 6029 if (SvUTF8(sv1)) {
799ef3cb 6030 if (PL_encoding) {
553e1bcc
AT
6031 svrecode = newSVpvn(pv2, cur2);
6032 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6033 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
6034 }
6035 else {
e1ec3a88 6036 pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
799ef3cb 6037 }
cf48d248
JH
6038 }
6039 else {
799ef3cb 6040 if (PL_encoding) {
553e1bcc
AT
6041 svrecode = newSVpvn(pv1, cur1);
6042 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6043 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
6044 }
6045 else {
e1ec3a88 6046 pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
799ef3cb 6047 }
cf48d248
JH
6048 }
6049 }
6050
e01b9e88 6051 if (!cur1) {
cf48d248 6052 cmp = cur2 ? -1 : 0;
e01b9e88 6053 } else if (!cur2) {
cf48d248
JH
6054 cmp = 1;
6055 } else {
e1ec3a88 6056 const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
6057
6058 if (retval) {
cf48d248 6059 cmp = retval < 0 ? -1 : 1;
e01b9e88 6060 } else if (cur1 == cur2) {
cf48d248
JH
6061 cmp = 0;
6062 } else {
6063 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 6064 }
cf48d248 6065 }
16660edb 6066
b37c2d43 6067 SvREFCNT_dec(svrecode);
553e1bcc
AT
6068 if (tpv)
6069 Safefree(tpv);
cf48d248
JH
6070
6071 return cmp;
bbce6d69 6072}
16660edb 6073
c461cf8f
JH
6074/*
6075=for apidoc sv_cmp_locale
6076
645c22ef
DM
6077Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6078'use bytes' aware, handles get magic, and will coerce its args to strings
6079if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
6080
6081=cut
6082*/
6083
bbce6d69 6084I32
864dbfa3 6085Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 6086{
97aff369 6087 dVAR;
36477c24 6088#ifdef USE_LOCALE_COLLATE
16660edb 6089
bbce6d69 6090 char *pv1, *pv2;
6091 STRLEN len1, len2;
6092 I32 retval;
16660edb 6093
3280af22 6094 if (PL_collation_standard)
bbce6d69 6095 goto raw_compare;
16660edb 6096
bbce6d69 6097 len1 = 0;
8ac85365 6098 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 6099 len2 = 0;
8ac85365 6100 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 6101
bbce6d69 6102 if (!pv1 || !len1) {
6103 if (pv2 && len2)
6104 return -1;
6105 else
6106 goto raw_compare;
6107 }
6108 else {
6109 if (!pv2 || !len2)
6110 return 1;
6111 }
16660edb 6112
bbce6d69 6113 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 6114
bbce6d69 6115 if (retval)
16660edb 6116 return retval < 0 ? -1 : 1;
6117
bbce6d69 6118 /*
6119 * When the result of collation is equality, that doesn't mean
6120 * that there are no differences -- some locales exclude some
6121 * characters from consideration. So to avoid false equalities,
6122 * we use the raw string as a tiebreaker.
6123 */
16660edb 6124
bbce6d69 6125 raw_compare:
5f66b61c 6126 /*FALLTHROUGH*/
16660edb 6127
36477c24 6128#endif /* USE_LOCALE_COLLATE */
16660edb 6129
bbce6d69 6130 return sv_cmp(sv1, sv2);
6131}
79072805 6132
645c22ef 6133
36477c24 6134#ifdef USE_LOCALE_COLLATE
645c22ef 6135
7a4c00b4 6136/*
645c22ef
DM
6137=for apidoc sv_collxfrm
6138
6139Add Collate Transform magic to an SV if it doesn't already have it.
6140
6141Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6142scalar data of the variable, but transformed to such a format that a normal
6143memory comparison can be used to compare the data according to the locale
6144settings.
6145
6146=cut
6147*/
6148
bbce6d69 6149char *
864dbfa3 6150Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 6151{
97aff369 6152 dVAR;
7a4c00b4 6153 MAGIC *mg;
16660edb 6154
14befaf4 6155 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 6156 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
93524f2b
NC
6157 const char *s;
6158 char *xf;
bbce6d69 6159 STRLEN len, xlen;
6160
7a4c00b4 6161 if (mg)
6162 Safefree(mg->mg_ptr);
93524f2b 6163 s = SvPV_const(sv, len);
bbce6d69 6164 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 6165 if (SvREADONLY(sv)) {
6166 SAVEFREEPV(xf);
6167 *nxp = xlen;
3280af22 6168 return xf + sizeof(PL_collation_ix);
ff0cee69 6169 }
7a4c00b4 6170 if (! mg) {
d83f0a82
NC
6171#ifdef PERL_OLD_COPY_ON_WRITE
6172 if (SvIsCOW(sv))
6173 sv_force_normal_flags(sv, 0);
6174#endif
6175 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
6176 0, 0);
7a4c00b4 6177 assert(mg);
bbce6d69 6178 }
7a4c00b4 6179 mg->mg_ptr = xf;
565764a8 6180 mg->mg_len = xlen;
7a4c00b4 6181 }
6182 else {
ff0cee69 6183 if (mg) {
6184 mg->mg_ptr = NULL;
565764a8 6185 mg->mg_len = -1;
ff0cee69 6186 }
bbce6d69 6187 }
6188 }
7a4c00b4 6189 if (mg && mg->mg_ptr) {
565764a8 6190 *nxp = mg->mg_len;
3280af22 6191 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 6192 }
6193 else {
6194 *nxp = 0;
6195 return NULL;
16660edb 6196 }
79072805
LW
6197}
6198
36477c24 6199#endif /* USE_LOCALE_COLLATE */
bbce6d69 6200
c461cf8f
JH
6201/*
6202=for apidoc sv_gets
6203
6204Get a line from the filehandle and store it into the SV, optionally
6205appending to the currently-stored string.
6206
6207=cut
6208*/
6209
79072805 6210char *
864dbfa3 6211Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 6212{
97aff369 6213 dVAR;
e1ec3a88 6214 const char *rsptr;
c07a80fd 6215 STRLEN rslen;
6216 register STDCHAR rslast;
6217 register STDCHAR *bp;
6218 register I32 cnt;
9c5ffd7c 6219 I32 i = 0;
8bfdd7d9 6220 I32 rspara = 0;
c07a80fd 6221
bc44a8a2
NC
6222 if (SvTHINKFIRST(sv))
6223 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
6224 /* XXX. If you make this PVIV, then copy on write can copy scalars read
6225 from <>.
6226 However, perlbench says it's slower, because the existing swipe code
6227 is faster than copy on write.
6228 Swings and roundabouts. */
862a34c6 6229 SvUPGRADE(sv, SVt_PV);
99491443 6230
ff68c719 6231 SvSCREAM_off(sv);
efd8b2ba
AE
6232
6233 if (append) {
6234 if (PerlIO_isutf8(fp)) {
6235 if (!SvUTF8(sv)) {
6236 sv_utf8_upgrade_nomg(sv);
6237 sv_pos_u2b(sv,&append,0);
6238 }
6239 } else if (SvUTF8(sv)) {
561b68a9 6240 SV * const tsv = newSV(0);
efd8b2ba
AE
6241 sv_gets(tsv, fp, 0);
6242 sv_utf8_upgrade_nomg(tsv);
6243 SvCUR_set(sv,append);
6244 sv_catsv(sv,tsv);
6245 sv_free(tsv);
6246 goto return_string_or_null;
6247 }
6248 }
6249
6250 SvPOK_only(sv);
6251 if (PerlIO_isutf8(fp))
6252 SvUTF8_on(sv);
c07a80fd 6253
923e4eb5 6254 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
6255 /* we always read code in line mode */
6256 rsptr = "\n";
6257 rslen = 1;
6258 }
6259 else if (RsSNARF(PL_rs)) {
7a5fa8a2 6260 /* If it is a regular disk file use size from stat() as estimate
acbd132f
JH
6261 of amount we are going to read -- may result in mallocing
6262 more memory than we really need if the layers below reduce
6263 the size we read (e.g. CRLF or a gzip layer).
e468d35b 6264 */
e311fd51 6265 Stat_t st;
e468d35b 6266 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
f54cb97a 6267 const Off_t offset = PerlIO_tell(fp);
58f1856e 6268 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
6269 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6270 }
6271 }
c07a80fd 6272 rsptr = NULL;
6273 rslen = 0;
6274 }
3280af22 6275 else if (RsRECORD(PL_rs)) {
e311fd51 6276 I32 bytesread;
5b2b9c68 6277 char *buffer;
acbd132f 6278 U32 recsize;
5b2b9c68
HM
6279
6280 /* Grab the size of the record we're getting */
acbd132f 6281 recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */
e311fd51 6282 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
6283 /* Go yank in */
6284#ifdef VMS
6285 /* VMS wants read instead of fread, because fread doesn't respect */
6286 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
6287 /* doing, but we've got no other real choice - except avoid stdio
6288 as implementation - perhaps write a :vms layer ?
6289 */
5b2b9c68
HM
6290 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
6291#else
6292 bytesread = PerlIO_read(fp, buffer, recsize);
6293#endif
27e6ca2d
AE
6294 if (bytesread < 0)
6295 bytesread = 0;
e311fd51 6296 SvCUR_set(sv, bytesread += append);
e670df4e 6297 buffer[bytesread] = '\0';
efd8b2ba 6298 goto return_string_or_null;
5b2b9c68 6299 }
3280af22 6300 else if (RsPARA(PL_rs)) {
c07a80fd 6301 rsptr = "\n\n";
6302 rslen = 2;
8bfdd7d9 6303 rspara = 1;
c07a80fd 6304 }
7d59b7e4
NIS
6305 else {
6306 /* Get $/ i.e. PL_rs into same encoding as stream wants */
6307 if (PerlIO_isutf8(fp)) {
6308 rsptr = SvPVutf8(PL_rs, rslen);
6309 }
6310 else {
6311 if (SvUTF8(PL_rs)) {
6312 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
6313 Perl_croak(aTHX_ "Wide character in $/");
6314 }
6315 }
93524f2b 6316 rsptr = SvPV_const(PL_rs, rslen);
7d59b7e4
NIS
6317 }
6318 }
6319
c07a80fd 6320 rslast = rslen ? rsptr[rslen - 1] : '\0';
6321
8bfdd7d9 6322 if (rspara) { /* have to do this both before and after */
79072805 6323 do { /* to make sure file boundaries work right */
760ac839 6324 if (PerlIO_eof(fp))
a0d0e21e 6325 return 0;
760ac839 6326 i = PerlIO_getc(fp);
79072805 6327 if (i != '\n') {
a0d0e21e
LW
6328 if (i == -1)
6329 return 0;
760ac839 6330 PerlIO_ungetc(fp,i);
79072805
LW
6331 break;
6332 }
6333 } while (i != EOF);
6334 }
c07a80fd 6335
760ac839
LW
6336 /* See if we know enough about I/O mechanism to cheat it ! */
6337
6338 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 6339 of abstracting out stdio interface. One call should be cheap
760ac839
LW
6340 enough here - and may even be a macro allowing compile
6341 time optimization.
6342 */
6343
6344 if (PerlIO_fast_gets(fp)) {
6345
6346 /*
6347 * We're going to steal some values from the stdio struct
6348 * and put EVERYTHING in the innermost loop into registers.
6349 */
6350 register STDCHAR *ptr;
6351 STRLEN bpx;
6352 I32 shortbuffered;
6353
16660edb 6354#if defined(VMS) && defined(PERLIO_IS_STDIO)
6355 /* An ungetc()d char is handled separately from the regular
6356 * buffer, so we getc() it back out and stuff it in the buffer.
6357 */
6358 i = PerlIO_getc(fp);
6359 if (i == EOF) return 0;
6360 *(--((*fp)->_ptr)) = (unsigned char) i;
6361 (*fp)->_cnt++;
6362#endif
c07a80fd 6363
c2960299 6364 /* Here is some breathtakingly efficient cheating */
c07a80fd 6365
a20bf0c3 6366 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b 6367 /* make sure we have the room */
7a5fa8a2 6368 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
e468d35b 6369 /* Not room for all of it
7a5fa8a2 6370 if we are looking for a separator and room for some
e468d35b
NIS
6371 */
6372 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7a5fa8a2 6373 /* just process what we have room for */
79072805
LW
6374 shortbuffered = cnt - SvLEN(sv) + append + 1;
6375 cnt -= shortbuffered;
6376 }
6377 else {
6378 shortbuffered = 0;
bbce6d69 6379 /* remember that cnt can be negative */
eb160463 6380 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
6381 }
6382 }
7a5fa8a2 6383 else
79072805 6384 shortbuffered = 0;
3f7c398e 6385 bp = (STDCHAR*)SvPVX_const(sv) + append; /* move these two too to registers */
a20bf0c3 6386 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 6387 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6388 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 6389 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 6390 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6391 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6392 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
6393 for (;;) {
6394 screamer:
93a17b20 6395 if (cnt > 0) {
c07a80fd 6396 if (rslen) {
760ac839
LW
6397 while (cnt > 0) { /* this | eat */
6398 cnt--;
c07a80fd 6399 if ((*bp++ = *ptr++) == rslast) /* really | dust */
6400 goto thats_all_folks; /* screams | sed :-) */
6401 }
6402 }
6403 else {
1c846c1f
NIS
6404 Copy(ptr, bp, cnt, char); /* this | eat */
6405 bp += cnt; /* screams | dust */
c07a80fd 6406 ptr += cnt; /* louder | sed :-) */
a5f75d66 6407 cnt = 0;
93a17b20 6408 }
79072805
LW
6409 }
6410
748a9306 6411 if (shortbuffered) { /* oh well, must extend */
79072805
LW
6412 cnt = shortbuffered;
6413 shortbuffered = 0;
3f7c398e 6414 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6415 SvCUR_set(sv, bpx);
6416 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3f7c398e 6417 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
79072805
LW
6418 continue;
6419 }
6420
16660edb 6421 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
6422 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
6423 PTR2UV(ptr),(long)cnt));
cc00df79 6424 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 6425#if 0
16660edb 6426 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6427 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6428 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6429 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6430#endif
1c846c1f 6431 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 6432 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
6433 another abstraction. */
760ac839 6434 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 6435#if 0
16660edb 6436 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6437 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6438 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6439 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6440#endif
a20bf0c3
JH
6441 cnt = PerlIO_get_cnt(fp);
6442 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 6443 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6444 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 6445
748a9306
LW
6446 if (i == EOF) /* all done for ever? */
6447 goto thats_really_all_folks;
6448
3f7c398e 6449 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6450 SvCUR_set(sv, bpx);
6451 SvGROW(sv, bpx + cnt + 2);
3f7c398e 6452 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
c07a80fd 6453
eb160463 6454 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 6455
c07a80fd 6456 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 6457 goto thats_all_folks;
79072805
LW
6458 }
6459
6460thats_all_folks:
3f7c398e 6461 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
36477c24 6462 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 6463 goto screamer; /* go back to the fray */
79072805
LW
6464thats_really_all_folks:
6465 if (shortbuffered)
6466 cnt += shortbuffered;
16660edb 6467 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6468 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 6469 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 6470 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6471 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6472 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6473 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 6474 *bp = '\0';
3f7c398e 6475 SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv)); /* set length */
16660edb 6476 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 6477 "Screamer: done, len=%ld, string=|%.*s|\n",
3f7c398e 6478 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
760ac839
LW
6479 }
6480 else
79072805 6481 {
6edd2cd5 6482 /*The big, slow, and stupid way. */
27da23d5 6483#ifdef USE_HEAP_INSTEAD_OF_STACK /* Even slower way. */
cbbf8932 6484 STDCHAR *buf = NULL;
a02a5408 6485 Newx(buf, 8192, STDCHAR);
6edd2cd5 6486 assert(buf);
4d2c4e07 6487#else
6edd2cd5 6488 STDCHAR buf[8192];
4d2c4e07 6489#endif
79072805 6490
760ac839 6491screamer2:
c07a80fd 6492 if (rslen) {
00b6aa41 6493 register const STDCHAR * const bpe = buf + sizeof(buf);
760ac839 6494 bp = buf;
eb160463 6495 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
6496 ; /* keep reading */
6497 cnt = bp - buf;
c07a80fd 6498 }
6499 else {
760ac839 6500 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 6501 /* Accomodate broken VAXC compiler, which applies U8 cast to
6502 * both args of ?: operator, causing EOF to change into 255
6503 */
37be0adf 6504 if (cnt > 0)
cbe9e203
JH
6505 i = (U8)buf[cnt - 1];
6506 else
37be0adf 6507 i = EOF;
c07a80fd 6508 }
79072805 6509
cbe9e203
JH
6510 if (cnt < 0)
6511 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
6512 if (append)
6513 sv_catpvn(sv, (char *) buf, cnt);
6514 else
6515 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 6516
6517 if (i != EOF && /* joy */
6518 (!rslen ||
6519 SvCUR(sv) < rslen ||
3f7c398e 6520 memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
6521 {
6522 append = -1;
63e4d877
CS
6523 /*
6524 * If we're reading from a TTY and we get a short read,
6525 * indicating that the user hit his EOF character, we need
6526 * to notice it now, because if we try to read from the TTY
6527 * again, the EOF condition will disappear.
6528 *
6529 * The comparison of cnt to sizeof(buf) is an optimization
6530 * that prevents unnecessary calls to feof().
6531 *
6532 * - jik 9/25/96
6533 */
bb7a0f54 6534 if (!(cnt < (I32)sizeof(buf) && PerlIO_eof(fp)))
63e4d877 6535 goto screamer2;
79072805 6536 }
6edd2cd5 6537
27da23d5 6538#ifdef USE_HEAP_INSTEAD_OF_STACK
6edd2cd5
JH
6539 Safefree(buf);
6540#endif
79072805
LW
6541 }
6542
8bfdd7d9 6543 if (rspara) { /* have to do this both before and after */
c07a80fd 6544 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 6545 i = PerlIO_getc(fp);
79072805 6546 if (i != '\n') {
760ac839 6547 PerlIO_ungetc(fp,i);
79072805
LW
6548 break;
6549 }
6550 }
6551 }
c07a80fd 6552
efd8b2ba 6553return_string_or_null:
bd61b366 6554 return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
79072805
LW
6555}
6556
954c1994
GS
6557/*
6558=for apidoc sv_inc
6559
645c22ef
DM
6560Auto-increment of the value in the SV, doing string to numeric conversion
6561if necessary. Handles 'get' magic.
954c1994
GS
6562
6563=cut
6564*/
6565
79072805 6566void
864dbfa3 6567Perl_sv_inc(pTHX_ register SV *sv)
79072805 6568{
97aff369 6569 dVAR;
79072805 6570 register char *d;
463ee0b2 6571 int flags;
79072805
LW
6572
6573 if (!sv)
6574 return;
5b295bef 6575 SvGETMAGIC(sv);
ed6116ce 6576 if (SvTHINKFIRST(sv)) {
765f542d
NC
6577 if (SvIsCOW(sv))
6578 sv_force_normal_flags(sv, 0);
0f15f207 6579 if (SvREADONLY(sv)) {
923e4eb5 6580 if (IN_PERL_RUNTIME)
cea2e8a9 6581 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6582 }
a0d0e21e 6583 if (SvROK(sv)) {
b5be31e9 6584 IV i;
9e7bc3e8
JD
6585 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
6586 return;
56431972 6587 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6588 sv_unref(sv);
6589 sv_setiv(sv, i);
a0d0e21e 6590 }
ed6116ce 6591 }
8990e307 6592 flags = SvFLAGS(sv);
28e5dec8
JH
6593 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
6594 /* It's (privately or publicly) a float, but not tested as an
6595 integer, so test it to see. */
d460ef45 6596 (void) SvIV(sv);
28e5dec8
JH
6597 flags = SvFLAGS(sv);
6598 }
6599 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6600 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6601#ifdef PERL_PRESERVE_IVUV
28e5dec8 6602 oops_its_int:
59d8ce62 6603#endif
25da4f38
IZ
6604 if (SvIsUV(sv)) {
6605 if (SvUVX(sv) == UV_MAX)
a1e868e7 6606 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
6607 else
6608 (void)SvIOK_only_UV(sv);
607fa7f2 6609 SvUV_set(sv, SvUVX(sv) + 1);
25da4f38
IZ
6610 } else {
6611 if (SvIVX(sv) == IV_MAX)
28e5dec8 6612 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
6613 else {
6614 (void)SvIOK_only(sv);
45977657 6615 SvIV_set(sv, SvIVX(sv) + 1);
1c846c1f 6616 }
55497cff 6617 }
79072805
LW
6618 return;
6619 }
28e5dec8
JH
6620 if (flags & SVp_NOK) {
6621 (void)SvNOK_only(sv);
9d6ce603 6622 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6623 return;
6624 }
6625
3f7c398e 6626 if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
28e5dec8 6627 if ((flags & SVTYPEMASK) < SVt_PVIV)
f5282e15 6628 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
28e5dec8 6629 (void)SvIOK_only(sv);
45977657 6630 SvIV_set(sv, 1);
79072805
LW
6631 return;
6632 }
463ee0b2 6633 d = SvPVX(sv);
79072805
LW
6634 while (isALPHA(*d)) d++;
6635 while (isDIGIT(*d)) d++;
6636 if (*d) {
28e5dec8 6637#ifdef PERL_PRESERVE_IVUV
d1be9408 6638 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
6639 warnings. Probably ought to make the sv_iv_please() that does
6640 the conversion if possible, and silently. */
504618e9 6641 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
6642 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6643 /* Need to try really hard to see if it's an integer.
6644 9.22337203685478e+18 is an integer.
6645 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6646 so $a="9.22337203685478e+18"; $a+0; $a++
6647 needs to be the same as $a="9.22337203685478e+18"; $a++
6648 or we go insane. */
d460ef45 6649
28e5dec8
JH
6650 (void) sv_2iv(sv);
6651 if (SvIOK(sv))
6652 goto oops_its_int;
6653
6654 /* sv_2iv *should* have made this an NV */
6655 if (flags & SVp_NOK) {
6656 (void)SvNOK_only(sv);
9d6ce603 6657 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6658 return;
6659 }
6660 /* I don't think we can get here. Maybe I should assert this
6661 And if we do get here I suspect that sv_setnv will croak. NWC
6662 Fall through. */
6663#if defined(USE_LONG_DOUBLE)
6664 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 6665 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 6666#else
1779d84d 6667 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 6668 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
6669#endif
6670 }
6671#endif /* PERL_PRESERVE_IVUV */
3f7c398e 6672 sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
79072805
LW
6673 return;
6674 }
6675 d--;
3f7c398e 6676 while (d >= SvPVX_const(sv)) {
79072805
LW
6677 if (isDIGIT(*d)) {
6678 if (++*d <= '9')
6679 return;
6680 *(d--) = '0';
6681 }
6682 else {
9d116dd7
JH
6683#ifdef EBCDIC
6684 /* MKS: The original code here died if letters weren't consecutive.
6685 * at least it didn't have to worry about non-C locales. The
6686 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 6687 * arranged in order (although not consecutively) and that only
9d116dd7
JH
6688 * [A-Za-z] are accepted by isALPHA in the C locale.
6689 */
6690 if (*d != 'z' && *d != 'Z') {
6691 do { ++*d; } while (!isALPHA(*d));
6692 return;
6693 }
6694 *(d--) -= 'z' - 'a';
6695#else
79072805
LW
6696 ++*d;
6697 if (isALPHA(*d))
6698 return;
6699 *(d--) -= 'z' - 'a' + 1;
9d116dd7 6700#endif
79072805
LW
6701 }
6702 }
6703 /* oh,oh, the number grew */
6704 SvGROW(sv, SvCUR(sv) + 2);
b162af07 6705 SvCUR_set(sv, SvCUR(sv) + 1);
3f7c398e 6706 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
79072805
LW
6707 *d = d[-1];
6708 if (isDIGIT(d[1]))
6709 *d = '1';
6710 else
6711 *d = d[1];
6712}
6713
954c1994
GS
6714/*
6715=for apidoc sv_dec
6716
645c22ef
DM
6717Auto-decrement of the value in the SV, doing string to numeric conversion
6718if necessary. Handles 'get' magic.
954c1994
GS
6719
6720=cut
6721*/
6722
79072805 6723void
864dbfa3 6724Perl_sv_dec(pTHX_ register SV *sv)
79072805 6725{
97aff369 6726 dVAR;
463ee0b2
LW
6727 int flags;
6728
79072805
LW
6729 if (!sv)
6730 return;
5b295bef 6731 SvGETMAGIC(sv);
ed6116ce 6732 if (SvTHINKFIRST(sv)) {
765f542d
NC
6733 if (SvIsCOW(sv))
6734 sv_force_normal_flags(sv, 0);
0f15f207 6735 if (SvREADONLY(sv)) {
923e4eb5 6736 if (IN_PERL_RUNTIME)
cea2e8a9 6737 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6738 }
a0d0e21e 6739 if (SvROK(sv)) {
b5be31e9 6740 IV i;
9e7bc3e8
JD
6741 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6742 return;
56431972 6743 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6744 sv_unref(sv);
6745 sv_setiv(sv, i);
a0d0e21e 6746 }
ed6116ce 6747 }
28e5dec8
JH
6748 /* Unlike sv_inc we don't have to worry about string-never-numbers
6749 and keeping them magic. But we mustn't warn on punting */
8990e307 6750 flags = SvFLAGS(sv);
28e5dec8
JH
6751 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6752 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6753#ifdef PERL_PRESERVE_IVUV
28e5dec8 6754 oops_its_int:
59d8ce62 6755#endif
25da4f38
IZ
6756 if (SvIsUV(sv)) {
6757 if (SvUVX(sv) == 0) {
6758 (void)SvIOK_only(sv);
45977657 6759 SvIV_set(sv, -1);
25da4f38
IZ
6760 }
6761 else {
6762 (void)SvIOK_only_UV(sv);
f4eee32f 6763 SvUV_set(sv, SvUVX(sv) - 1);
1c846c1f 6764 }
25da4f38
IZ
6765 } else {
6766 if (SvIVX(sv) == IV_MIN)
65202027 6767 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
6768 else {
6769 (void)SvIOK_only(sv);
45977657 6770 SvIV_set(sv, SvIVX(sv) - 1);
1c846c1f 6771 }
55497cff 6772 }
6773 return;
6774 }
28e5dec8 6775 if (flags & SVp_NOK) {
9d6ce603 6776 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
6777 (void)SvNOK_only(sv);
6778 return;
6779 }
8990e307 6780 if (!(flags & SVp_POK)) {
ef088171
NC
6781 if ((flags & SVTYPEMASK) < SVt_PVIV)
6782 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
6783 SvIV_set(sv, -1);
6784 (void)SvIOK_only(sv);
79072805
LW
6785 return;
6786 }
28e5dec8
JH
6787#ifdef PERL_PRESERVE_IVUV
6788 {
504618e9 6789 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
6790 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6791 /* Need to try really hard to see if it's an integer.
6792 9.22337203685478e+18 is an integer.
6793 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6794 so $a="9.22337203685478e+18"; $a+0; $a--
6795 needs to be the same as $a="9.22337203685478e+18"; $a--
6796 or we go insane. */
d460ef45 6797
28e5dec8
JH
6798 (void) sv_2iv(sv);
6799 if (SvIOK(sv))
6800 goto oops_its_int;
6801
6802 /* sv_2iv *should* have made this an NV */
6803 if (flags & SVp_NOK) {
6804 (void)SvNOK_only(sv);
9d6ce603 6805 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
6806 return;
6807 }
6808 /* I don't think we can get here. Maybe I should assert this
6809 And if we do get here I suspect that sv_setnv will croak. NWC
6810 Fall through. */
6811#if defined(USE_LONG_DOUBLE)
6812 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 6813 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 6814#else
1779d84d 6815 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 6816 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
6817#endif
6818 }
6819 }
6820#endif /* PERL_PRESERVE_IVUV */
3f7c398e 6821 sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0); /* punt */
79072805
LW
6822}
6823
954c1994
GS
6824/*
6825=for apidoc sv_mortalcopy
6826
645c22ef 6827Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
6828The new SV is marked as mortal. It will be destroyed "soon", either by an
6829explicit call to FREETMPS, or by an implicit call at places such as
6830statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
6831
6832=cut
6833*/
6834
79072805
LW
6835/* Make a string that will exist for the duration of the expression
6836 * evaluation. Actually, it may have to last longer than that, but
6837 * hopefully we won't free it until it has been assigned to a
6838 * permanent location. */
6839
6840SV *
864dbfa3 6841Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 6842{
97aff369 6843 dVAR;
463ee0b2 6844 register SV *sv;
b881518d 6845
4561caa4 6846 new_SV(sv);
79072805 6847 sv_setsv(sv,oldstr);
677b06e3
GS
6848 EXTEND_MORTAL(1);
6849 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
6850 SvTEMP_on(sv);
6851 return sv;
6852}
6853
954c1994
GS
6854/*
6855=for apidoc sv_newmortal
6856
645c22ef 6857Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
6858set to 1. It will be destroyed "soon", either by an explicit call to
6859FREETMPS, or by an implicit call at places such as statement boundaries.
6860See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
6861
6862=cut
6863*/
6864
8990e307 6865SV *
864dbfa3 6866Perl_sv_newmortal(pTHX)
8990e307 6867{
97aff369 6868 dVAR;
8990e307
LW
6869 register SV *sv;
6870
4561caa4 6871 new_SV(sv);
8990e307 6872 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
6873 EXTEND_MORTAL(1);
6874 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
6875 return sv;
6876}
6877
954c1994
GS
6878/*
6879=for apidoc sv_2mortal
6880
d4236ebc
DM
6881Marks an existing SV as mortal. The SV will be destroyed "soon", either
6882by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
6883statement boundaries. SvTEMP() is turned on which means that the SV's
6884string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
6885and C<sv_mortalcopy>.
954c1994
GS
6886
6887=cut
6888*/
6889
79072805 6890SV *
864dbfa3 6891Perl_sv_2mortal(pTHX_ register SV *sv)
79072805 6892{
27da23d5 6893 dVAR;
79072805 6894 if (!sv)
7a5b473e 6895 return NULL;
d689ffdd 6896 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 6897 return sv;
677b06e3
GS
6898 EXTEND_MORTAL(1);
6899 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 6900 SvTEMP_on(sv);
79072805
LW
6901 return sv;
6902}
6903
954c1994
GS
6904/*
6905=for apidoc newSVpv
6906
6907Creates a new SV and copies a string into it. The reference count for the
6908SV is set to 1. If C<len> is zero, Perl will compute the length using
6909strlen(). For efficiency, consider using C<newSVpvn> instead.
6910
6911=cut
6912*/
6913
79072805 6914SV *
864dbfa3 6915Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 6916{
97aff369 6917 dVAR;
463ee0b2 6918 register SV *sv;
79072805 6919
4561caa4 6920 new_SV(sv);
616d8c9c 6921 sv_setpvn(sv,s,len ? len : strlen(s));
79072805
LW
6922 return sv;
6923}
6924
954c1994
GS
6925/*
6926=for apidoc newSVpvn
6927
6928Creates a new SV and copies a string into it. The reference count for the
1c846c1f 6929SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 6930string. You are responsible for ensuring that the source string is at least
9e09f5f2 6931C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
6932
6933=cut
6934*/
6935
9da1e3b5 6936SV *
864dbfa3 6937Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5 6938{
97aff369 6939 dVAR;
9da1e3b5
MUN
6940 register SV *sv;
6941
6942 new_SV(sv);
9da1e3b5
MUN
6943 sv_setpvn(sv,s,len);
6944 return sv;
6945}
6946
bd08039b
NC
6947
6948/*
926f8064 6949=for apidoc newSVhek
bd08039b
NC
6950
6951Creates a new SV from the hash key structure. It will generate scalars that
5aaec2b4
NC
6952point to the shared string table where possible. Returns a new (undefined)
6953SV if the hek is NULL.
bd08039b
NC
6954
6955=cut
6956*/
6957
6958SV *
c1b02ed8 6959Perl_newSVhek(pTHX_ const HEK *hek)
bd08039b 6960{
97aff369 6961 dVAR;
5aaec2b4
NC
6962 if (!hek) {
6963 SV *sv;
6964
6965 new_SV(sv);
6966 return sv;
6967 }
6968
bd08039b
NC
6969 if (HEK_LEN(hek) == HEf_SVKEY) {
6970 return newSVsv(*(SV**)HEK_KEY(hek));
6971 } else {
6972 const int flags = HEK_FLAGS(hek);
6973 if (flags & HVhek_WASUTF8) {
6974 /* Trouble :-)
6975 Andreas would like keys he put in as utf8 to come back as utf8
6976 */
6977 STRLEN utf8_len = HEK_LEN(hek);
b64e5050
AL
6978 const U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
6979 SV * const sv = newSVpvn ((const char*)as_utf8, utf8_len);
bd08039b
NC
6980
6981 SvUTF8_on (sv);
6982 Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
6983 return sv;
45e34800 6984 } else if (flags & (HVhek_REHASH|HVhek_UNSHARED)) {
bd08039b
NC
6985 /* We don't have a pointer to the hv, so we have to replicate the
6986 flag into every HEK. This hv is using custom a hasing
6987 algorithm. Hence we can't return a shared string scalar, as
6988 that would contain the (wrong) hash value, and might get passed
45e34800
NC
6989 into an hv routine with a regular hash.
6990 Similarly, a hash that isn't using shared hash keys has to have
6991 the flag in every key so that we know not to try to call
6992 share_hek_kek on it. */
bd08039b 6993
b64e5050 6994 SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
bd08039b
NC
6995 if (HEK_UTF8(hek))
6996 SvUTF8_on (sv);
6997 return sv;
6998 }
6999 /* This will be overwhelminly the most common case. */
409dfe77
NC
7000 {
7001 /* Inline most of newSVpvn_share(), because share_hek_hek() is far
7002 more efficient than sharepvn(). */
7003 SV *sv;
7004
7005 new_SV(sv);
7006 sv_upgrade(sv, SVt_PV);
7007 SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
7008 SvCUR_set(sv, HEK_LEN(hek));
7009 SvLEN_set(sv, 0);
7010 SvREADONLY_on(sv);
7011 SvFAKE_on(sv);
7012 SvPOK_on(sv);
7013 if (HEK_UTF8(hek))
7014 SvUTF8_on(sv);
7015 return sv;
7016 }
bd08039b
NC
7017 }
7018}
7019
1c846c1f
NIS
7020/*
7021=for apidoc newSVpvn_share
7022
3f7c398e 7023Creates a new SV with its SvPVX_const pointing to a shared string in the string
645c22ef
DM
7024table. If the string does not already exist in the table, it is created
7025first. Turns on READONLY and FAKE. The string's hash is stored in the UV
7026slot of the SV; if the C<hash> parameter is non-zero, that value is used;
7027otherwise the hash is computed. The idea here is that as the string table
3f7c398e 7028is used for shared hash keys these strings will have SvPVX_const == HeKEY and
645c22ef 7029hash lookup will avoid string compare.
1c846c1f
NIS
7030
7031=cut
7032*/
7033
7034SV *
c3654f1a 7035Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f 7036{
97aff369 7037 dVAR;
1c846c1f 7038 register SV *sv;
c3654f1a 7039 bool is_utf8 = FALSE;
a51caccf
NC
7040 const char *const orig_src = src;
7041
c3654f1a 7042 if (len < 0) {
77caf834 7043 STRLEN tmplen = -len;
c3654f1a 7044 is_utf8 = TRUE;
75a54232 7045 /* See the note in hv.c:hv_fetch() --jhi */
e1ec3a88 7046 src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
75a54232
JH
7047 len = tmplen;
7048 }
1c846c1f 7049 if (!hash)
5afd6d42 7050 PERL_HASH(hash, src, len);
1c846c1f 7051 new_SV(sv);
bdd68bc3 7052 sv_upgrade(sv, SVt_PV);
f880fe2f 7053 SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
b162af07 7054 SvCUR_set(sv, len);
b162af07 7055 SvLEN_set(sv, 0);
1c846c1f
NIS
7056 SvREADONLY_on(sv);
7057 SvFAKE_on(sv);
7058 SvPOK_on(sv);
c3654f1a
IH
7059 if (is_utf8)
7060 SvUTF8_on(sv);
a51caccf
NC
7061 if (src != orig_src)
7062 Safefree(src);
1c846c1f
NIS
7063 return sv;
7064}
7065
645c22ef 7066
cea2e8a9 7067#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7068
7069/* pTHX_ magic can't cope with varargs, so this is a no-context
7070 * version of the main function, (which may itself be aliased to us).
7071 * Don't access this version directly.
7072 */
7073
46fc3d4c 7074SV *
cea2e8a9 7075Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 7076{
cea2e8a9 7077 dTHX;
46fc3d4c 7078 register SV *sv;
7079 va_list args;
46fc3d4c 7080 va_start(args, pat);
c5be433b 7081 sv = vnewSVpvf(pat, &args);
46fc3d4c 7082 va_end(args);
7083 return sv;
7084}
cea2e8a9 7085#endif
46fc3d4c 7086
954c1994
GS
7087/*
7088=for apidoc newSVpvf
7089
645c22ef 7090Creates a new SV and initializes it with the string formatted like
954c1994
GS
7091C<sprintf>.
7092
7093=cut
7094*/
7095
cea2e8a9
GS
7096SV *
7097Perl_newSVpvf(pTHX_ const char* pat, ...)
7098{
7099 register SV *sv;
7100 va_list args;
cea2e8a9 7101 va_start(args, pat);
c5be433b 7102 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
7103 va_end(args);
7104 return sv;
7105}
46fc3d4c 7106
645c22ef
DM
7107/* backend for newSVpvf() and newSVpvf_nocontext() */
7108
79072805 7109SV *
c5be433b
GS
7110Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
7111{
97aff369 7112 dVAR;
c5be433b
GS
7113 register SV *sv;
7114 new_SV(sv);
4608196e 7115 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
7116 return sv;
7117}
7118
954c1994
GS
7119/*
7120=for apidoc newSVnv
7121
7122Creates a new SV and copies a floating point value into it.
7123The reference count for the SV is set to 1.
7124
7125=cut
7126*/
7127
c5be433b 7128SV *
65202027 7129Perl_newSVnv(pTHX_ NV n)
79072805 7130{
97aff369 7131 dVAR;
463ee0b2 7132 register SV *sv;
79072805 7133
4561caa4 7134 new_SV(sv);
79072805
LW
7135 sv_setnv(sv,n);
7136 return sv;
7137}
7138
954c1994
GS
7139/*
7140=for apidoc newSViv
7141
7142Creates a new SV and copies an integer into it. The reference count for the
7143SV is set to 1.
7144
7145=cut
7146*/
7147
79072805 7148SV *
864dbfa3 7149Perl_newSViv(pTHX_ IV i)
79072805 7150{
97aff369 7151 dVAR;
463ee0b2 7152 register SV *sv;
79072805 7153
4561caa4 7154 new_SV(sv);
79072805
LW
7155 sv_setiv(sv,i);
7156 return sv;
7157}
7158
954c1994 7159/*
1a3327fb
JH
7160=for apidoc newSVuv
7161
7162Creates a new SV and copies an unsigned integer into it.
7163The reference count for the SV is set to 1.
7164
7165=cut
7166*/
7167
7168SV *
7169Perl_newSVuv(pTHX_ UV u)
7170{
97aff369 7171 dVAR;
1a3327fb
JH
7172 register SV *sv;
7173
7174 new_SV(sv);
7175 sv_setuv(sv,u);
7176 return sv;
7177}
7178
7179/*
954c1994
GS
7180=for apidoc newRV_noinc
7181
7182Creates an RV wrapper for an SV. The reference count for the original
7183SV is B<not> incremented.
7184
7185=cut
7186*/
7187
2304df62 7188SV *
864dbfa3 7189Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62 7190{
97aff369 7191 dVAR;
2304df62
AD
7192 register SV *sv;
7193
4561caa4 7194 new_SV(sv);
2304df62 7195 sv_upgrade(sv, SVt_RV);
76e3520e 7196 SvTEMP_off(tmpRef);
b162af07 7197 SvRV_set(sv, tmpRef);
2304df62 7198 SvROK_on(sv);
2304df62
AD
7199 return sv;
7200}
7201
ff276b08 7202/* newRV_inc is the official function name to use now.
645c22ef
DM
7203 * newRV_inc is in fact #defined to newRV in sv.h
7204 */
7205
5f05dabc 7206SV *
7f466ec7 7207Perl_newRV(pTHX_ SV *sv)
5f05dabc 7208{
97aff369 7209 dVAR;
7f466ec7 7210 return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
5f05dabc 7211}
5f05dabc 7212
954c1994
GS
7213/*
7214=for apidoc newSVsv
7215
7216Creates a new SV which is an exact duplicate of the original SV.
645c22ef 7217(Uses C<sv_setsv>).
954c1994
GS
7218
7219=cut
7220*/
7221
79072805 7222SV *
864dbfa3 7223Perl_newSVsv(pTHX_ register SV *old)
79072805 7224{
97aff369 7225 dVAR;
463ee0b2 7226 register SV *sv;
79072805
LW
7227
7228 if (!old)
7a5b473e 7229 return NULL;
8990e307 7230 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 7231 if (ckWARN_d(WARN_INTERNAL))
9014280d 7232 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
a0714e2c 7233 return NULL;
79072805 7234 }
4561caa4 7235 new_SV(sv);
e90aabeb
NC
7236 /* SV_GMAGIC is the default for sv_setv()
7237 SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
7238 with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
7239 sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
463ee0b2 7240 return sv;
79072805
LW
7241}
7242
645c22ef
DM
7243/*
7244=for apidoc sv_reset
7245
7246Underlying implementation for the C<reset> Perl function.
7247Note that the perl-level function is vaguely deprecated.
7248
7249=cut
7250*/
7251
79072805 7252void
e1ec3a88 7253Perl_sv_reset(pTHX_ register const char *s, HV *stash)
79072805 7254{
27da23d5 7255 dVAR;
4802d5d7 7256 char todo[PERL_UCHAR_MAX+1];
79072805 7257
49d8d3a1
MB
7258 if (!stash)
7259 return;
7260
79072805 7261 if (!*s) { /* reset ?? searches */
aec46f14 7262 MAGIC * const mg = mg_find((SV *)stash, PERL_MAGIC_symtab);
8d2f4536
NC
7263 if (mg) {
7264 PMOP *pm = (PMOP *) mg->mg_obj;
7265 while (pm) {
7266 pm->op_pmdynflags &= ~PMdf_USED;
7267 pm = pm->op_pmnext;
7268 }
79072805
LW
7269 }
7270 return;
7271 }
7272
7273 /* reset variables */
7274
7275 if (!HvARRAY(stash))
7276 return;
463ee0b2
LW
7277
7278 Zero(todo, 256, char);
79072805 7279 while (*s) {
b464bac0
AL
7280 I32 max;
7281 I32 i = (unsigned char)*s;
79072805
LW
7282 if (s[1] == '-') {
7283 s += 2;
7284 }
4802d5d7 7285 max = (unsigned char)*s++;
79072805 7286 for ( ; i <= max; i++) {
463ee0b2
LW
7287 todo[i] = 1;
7288 }
a0d0e21e 7289 for (i = 0; i <= (I32) HvMAX(stash); i++) {
b464bac0 7290 HE *entry;
79072805 7291 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7292 entry;
7293 entry = HeNEXT(entry))
7294 {
b464bac0
AL
7295 register GV *gv;
7296 register SV *sv;
7297
1edc1566 7298 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7299 continue;
1edc1566 7300 gv = (GV*)HeVAL(entry);
79072805 7301 sv = GvSV(gv);
e203899d
NC
7302 if (sv) {
7303 if (SvTHINKFIRST(sv)) {
7304 if (!SvREADONLY(sv) && SvROK(sv))
7305 sv_unref(sv);
7306 /* XXX Is this continue a bug? Why should THINKFIRST
7307 exempt us from resetting arrays and hashes? */
7308 continue;
7309 }
7310 SvOK_off(sv);
7311 if (SvTYPE(sv) >= SVt_PV) {
7312 SvCUR_set(sv, 0);
bd61b366 7313 if (SvPVX_const(sv) != NULL)
e203899d
NC
7314 *SvPVX(sv) = '\0';
7315 SvTAINT(sv);
7316 }
79072805
LW
7317 }
7318 if (GvAV(gv)) {
7319 av_clear(GvAV(gv));
7320 }
bfcb3514 7321 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
b0269e46
AB
7322#if defined(VMS)
7323 Perl_die(aTHX_ "Can't reset %%ENV on this system");
7324#else /* ! VMS */
463ee0b2 7325 hv_clear(GvHV(gv));
b0269e46
AB
7326# if defined(USE_ENVIRON_ARRAY)
7327 if (gv == PL_envgv)
7328 my_clearenv();
7329# endif /* USE_ENVIRON_ARRAY */
7330#endif /* VMS */
79072805
LW
7331 }
7332 }
7333 }
7334 }
7335}
7336
645c22ef
DM
7337/*
7338=for apidoc sv_2io
7339
7340Using various gambits, try to get an IO from an SV: the IO slot if its a
7341GV; or the recursive result if we're an RV; or the IO slot of the symbol
7342named after the PV if we're a string.
7343
7344=cut
7345*/
7346
46fc3d4c 7347IO*
864dbfa3 7348Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 7349{
7350 IO* io;
7351 GV* gv;
7352
7353 switch (SvTYPE(sv)) {
7354 case SVt_PVIO:
7355 io = (IO*)sv;
7356 break;
7357 case SVt_PVGV:
7358 gv = (GV*)sv;
7359 io = GvIO(gv);
7360 if (!io)
cea2e8a9 7361 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 7362 break;
7363 default:
7364 if (!SvOK(sv))
cea2e8a9 7365 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 7366 if (SvROK(sv))
7367 return sv_2io(SvRV(sv));
f776e3cd 7368 gv = gv_fetchsv(sv, 0, SVt_PVIO);
46fc3d4c 7369 if (gv)
7370 io = GvIO(gv);
7371 else
7372 io = 0;
7373 if (!io)
95b63a38 7374 Perl_croak(aTHX_ "Bad filehandle: %"SVf, (void*)sv);
46fc3d4c 7375 break;
7376 }
7377 return io;
7378}
7379
645c22ef
DM
7380/*
7381=for apidoc sv_2cv
7382
7383Using various gambits, try to get a CV from an SV; in addition, try if
7384possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
f2c0649b 7385The flags in C<lref> are passed to sv_fetchsv.
645c22ef
DM
7386
7387=cut
7388*/
7389
79072805 7390CV *
864dbfa3 7391Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 7392{
27da23d5 7393 dVAR;
a0714e2c 7394 GV *gv = NULL;
601f1833 7395 CV *cv = NULL;
79072805 7396
85dec29a
NC
7397 if (!sv) {
7398 *st = NULL;
7399 *gvp = NULL;
7400 return NULL;
7401 }
79072805 7402 switch (SvTYPE(sv)) {
79072805
LW
7403 case SVt_PVCV:
7404 *st = CvSTASH(sv);
a0714e2c 7405 *gvp = NULL;
79072805
LW
7406 return (CV*)sv;
7407 case SVt_PVHV:
7408 case SVt_PVAV:
ef58ba18 7409 *st = NULL;
a0714e2c 7410 *gvp = NULL;
601f1833 7411 return NULL;
8990e307
LW
7412 case SVt_PVGV:
7413 gv = (GV*)sv;
a0d0e21e 7414 *gvp = gv;
8990e307
LW
7415 *st = GvESTASH(gv);
7416 goto fix_gv;
7417
79072805 7418 default:
5b295bef 7419 SvGETMAGIC(sv);
a0d0e21e 7420 if (SvROK(sv)) {
823a54a3 7421 SV * const *sp = &sv; /* Used in tryAMAGICunDEREF macro. */
f5284f61
IZ
7422 tryAMAGICunDEREF(to_cv);
7423
62f274bf
GS
7424 sv = SvRV(sv);
7425 if (SvTYPE(sv) == SVt_PVCV) {
7426 cv = (CV*)sv;
a0714e2c 7427 *gvp = NULL;
62f274bf
GS
7428 *st = CvSTASH(cv);
7429 return cv;
7430 }
7431 else if(isGV(sv))
7432 gv = (GV*)sv;
7433 else
cea2e8a9 7434 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 7435 }
62f274bf 7436 else if (isGV(sv))
79072805
LW
7437 gv = (GV*)sv;
7438 else
7a5fd60d 7439 gv = gv_fetchsv(sv, lref, SVt_PVCV);
79072805 7440 *gvp = gv;
ef58ba18
NC
7441 if (!gv) {
7442 *st = NULL;
601f1833 7443 return NULL;
ef58ba18 7444 }
e26df76a
NC
7445 /* Some flags to gv_fetchsv mean don't really create the GV */
7446 if (SvTYPE(gv) != SVt_PVGV) {
7447 *st = NULL;
7448 return NULL;
7449 }
79072805 7450 *st = GvESTASH(gv);
8990e307 7451 fix_gv:
8ebc5c01 7452 if (lref && !GvCVu(gv)) {
4633a7c4 7453 SV *tmpsv;
748a9306 7454 ENTER;
561b68a9 7455 tmpsv = newSV(0);
bd61b366 7456 gv_efullname3(tmpsv, gv, NULL);
f6ec51f7
GS
7457 /* XXX this is probably not what they think they're getting.
7458 * It has the same effect as "sub name;", i.e. just a forward
7459 * declaration! */
774d564b 7460 newSUB(start_subparse(FALSE, 0),
4633a7c4 7461 newSVOP(OP_CONST, 0, tmpsv),
5f66b61c 7462 NULL, NULL);
748a9306 7463 LEAVE;
8ebc5c01 7464 if (!GvCVu(gv))
35c1215d 7465 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
95b63a38 7466 (void*)sv);
8990e307 7467 }
8ebc5c01 7468 return GvCVu(gv);
79072805
LW
7469 }
7470}
7471
c461cf8f
JH
7472/*
7473=for apidoc sv_true
7474
7475Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
7476Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
7477instead use an in-line version.
c461cf8f
JH
7478
7479=cut
7480*/
7481
79072805 7482I32
864dbfa3 7483Perl_sv_true(pTHX_ register SV *sv)
79072805 7484{
8990e307
LW
7485 if (!sv)
7486 return 0;
79072805 7487 if (SvPOK(sv)) {
823a54a3
AL
7488 register const XPV* const tXpv = (XPV*)SvANY(sv);
7489 if (tXpv &&
c2f1de04 7490 (tXpv->xpv_cur > 1 ||
339049b0 7491 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
79072805
LW
7492 return 1;
7493 else
7494 return 0;
7495 }
7496 else {
7497 if (SvIOK(sv))
463ee0b2 7498 return SvIVX(sv) != 0;
79072805
LW
7499 else {
7500 if (SvNOK(sv))
463ee0b2 7501 return SvNVX(sv) != 0.0;
79072805 7502 else
463ee0b2 7503 return sv_2bool(sv);
79072805
LW
7504 }
7505 }
7506}
79072805 7507
645c22ef 7508/*
c461cf8f
JH
7509=for apidoc sv_pvn_force
7510
7511Get a sensible string out of the SV somehow.
645c22ef
DM
7512A private implementation of the C<SvPV_force> macro for compilers which
7513can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 7514
8d6d96c1
HS
7515=for apidoc sv_pvn_force_flags
7516
7517Get a sensible string out of the SV somehow.
7518If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
7519appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
7520implemented in terms of this function.
645c22ef
DM
7521You normally want to use the various wrapper macros instead: see
7522C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
7523
7524=cut
7525*/
7526
7527char *
7528Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
7529{
97aff369 7530 dVAR;
6fc92669 7531 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 7532 sv_force_normal_flags(sv, 0);
1c846c1f 7533
a0d0e21e 7534 if (SvPOK(sv)) {
13c5b33c
NC
7535 if (lp)
7536 *lp = SvCUR(sv);
a0d0e21e
LW
7537 }
7538 else {
a3b680e6 7539 char *s;
13c5b33c
NC
7540 STRLEN len;
7541
4d84ee25 7542 if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
b64e5050 7543 const char * const ref = sv_reftype(sv,0);
4d84ee25
NC
7544 if (PL_op)
7545 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
b64e5050 7546 ref, OP_NAME(PL_op));
4d84ee25 7547 else
b64e5050 7548 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
4d84ee25 7549 }
b64e5050 7550 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
cea2e8a9 7551 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 7552 OP_NAME(PL_op));
b64e5050 7553 s = sv_2pv_flags(sv, &len, flags);
13c5b33c
NC
7554 if (lp)
7555 *lp = len;
7556
3f7c398e 7557 if (s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */
a0d0e21e
LW
7558 if (SvROK(sv))
7559 sv_unref(sv);
862a34c6 7560 SvUPGRADE(sv, SVt_PV); /* Never FALSE */
a0d0e21e 7561 SvGROW(sv, len + 1);
706aa1c9 7562 Move(s,SvPVX(sv),len,char);
a0d0e21e
LW
7563 SvCUR_set(sv, len);
7564 *SvEND(sv) = '\0';
7565 }
7566 if (!SvPOK(sv)) {
7567 SvPOK_on(sv); /* validate pointer */
7568 SvTAINT(sv);
1d7c1841 7569 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 7570 PTR2UV(sv),SvPVX_const(sv)));
a0d0e21e
LW
7571 }
7572 }
4d84ee25 7573 return SvPVX_mutable(sv);
a0d0e21e
LW
7574}
7575
645c22ef 7576/*
645c22ef
DM
7577=for apidoc sv_pvbyten_force
7578
0feed65a 7579The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
645c22ef
DM
7580
7581=cut
7582*/
7583
7340a771
GS
7584char *
7585Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
7586{
46ec2f14 7587 sv_pvn_force(sv,lp);
ffebcc3e 7588 sv_utf8_downgrade(sv,0);
46ec2f14
TS
7589 *lp = SvCUR(sv);
7590 return SvPVX(sv);
7340a771
GS
7591}
7592
645c22ef 7593/*
c461cf8f
JH
7594=for apidoc sv_pvutf8n_force
7595
0feed65a 7596The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
c461cf8f
JH
7597
7598=cut
7599*/
7600
7340a771
GS
7601char *
7602Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
7603{
46ec2f14 7604 sv_pvn_force(sv,lp);
560a288e 7605 sv_utf8_upgrade(sv);
46ec2f14
TS
7606 *lp = SvCUR(sv);
7607 return SvPVX(sv);
7340a771
GS
7608}
7609
c461cf8f
JH
7610/*
7611=for apidoc sv_reftype
7612
7613Returns a string describing what the SV is a reference to.
7614
7615=cut
7616*/
7617
1cb0ed9b 7618char *
bfed75c6 7619Perl_sv_reftype(pTHX_ const SV *sv, int ob)
a0d0e21e 7620{
07409e01
NC
7621 /* The fact that I don't need to downcast to char * everywhere, only in ?:
7622 inside return suggests a const propagation bug in g++. */
c86bf373 7623 if (ob && SvOBJECT(sv)) {
1b6737cc 7624 char * const name = HvNAME_get(SvSTASH(sv));
07409e01 7625 return name ? name : (char *) "__ANON__";
c86bf373 7626 }
a0d0e21e
LW
7627 else {
7628 switch (SvTYPE(sv)) {
7629 case SVt_NULL:
7630 case SVt_IV:
7631 case SVt_NV:
7632 case SVt_RV:
7633 case SVt_PV:
7634 case SVt_PVIV:
7635 case SVt_PVNV:
7636 case SVt_PVMG:
7637 case SVt_PVBM:
1cb0ed9b 7638 if (SvVOK(sv))
439cb1c4 7639 return "VSTRING";
a0d0e21e
LW
7640 if (SvROK(sv))
7641 return "REF";
7642 else
7643 return "SCALAR";
1cb0ed9b 7644
07409e01 7645 case SVt_PVLV: return (char *) (SvROK(sv) ? "REF"
be65207d
DM
7646 /* tied lvalues should appear to be
7647 * scalars for backwards compatitbility */
7648 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
07409e01 7649 ? "SCALAR" : "LVALUE");
a0d0e21e
LW
7650 case SVt_PVAV: return "ARRAY";
7651 case SVt_PVHV: return "HASH";
7652 case SVt_PVCV: return "CODE";
7653 case SVt_PVGV: return "GLOB";
1d2dff63 7654 case SVt_PVFM: return "FORMAT";
27f9d8f3 7655 case SVt_PVIO: return "IO";
a0d0e21e
LW
7656 default: return "UNKNOWN";
7657 }
7658 }
7659}
7660
954c1994
GS
7661/*
7662=for apidoc sv_isobject
7663
7664Returns a boolean indicating whether the SV is an RV pointing to a blessed
7665object. If the SV is not an RV, or if the object is not blessed, then this
7666will return false.
7667
7668=cut
7669*/
7670
463ee0b2 7671int
864dbfa3 7672Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 7673{
68dc0745 7674 if (!sv)
7675 return 0;
5b295bef 7676 SvGETMAGIC(sv);
85e6fe83
LW
7677 if (!SvROK(sv))
7678 return 0;
7679 sv = (SV*)SvRV(sv);
7680 if (!SvOBJECT(sv))
7681 return 0;
7682 return 1;
7683}
7684
954c1994
GS
7685/*
7686=for apidoc sv_isa
7687
7688Returns a boolean indicating whether the SV is blessed into the specified
7689class. This does not check for subtypes; use C<sv_derived_from> to verify
7690an inheritance relationship.
7691
7692=cut
7693*/
7694
85e6fe83 7695int
864dbfa3 7696Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 7697{
bfcb3514 7698 const char *hvname;
68dc0745 7699 if (!sv)
7700 return 0;
5b295bef 7701 SvGETMAGIC(sv);
ed6116ce 7702 if (!SvROK(sv))
463ee0b2 7703 return 0;
ed6116ce
LW
7704 sv = (SV*)SvRV(sv);
7705 if (!SvOBJECT(sv))
463ee0b2 7706 return 0;
bfcb3514
NC
7707 hvname = HvNAME_get(SvSTASH(sv));
7708 if (!hvname)
e27ad1f2 7709 return 0;
463ee0b2 7710
bfcb3514 7711 return strEQ(hvname, name);
463ee0b2
LW
7712}
7713
954c1994
GS
7714/*
7715=for apidoc newSVrv
7716
7717Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
7718it will be upgraded to one. If C<classname> is non-null then the new SV will
7719be blessed in the specified package. The new SV is returned and its
7720reference count is 1.
7721
7722=cut
7723*/
7724
463ee0b2 7725SV*
864dbfa3 7726Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 7727{
97aff369 7728 dVAR;
463ee0b2
LW
7729 SV *sv;
7730
4561caa4 7731 new_SV(sv);
51cf62d8 7732
765f542d 7733 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 7734 SvAMAGIC_off(rv);
51cf62d8 7735
0199fce9 7736 if (SvTYPE(rv) >= SVt_PVMG) {
a3b680e6 7737 const U32 refcnt = SvREFCNT(rv);
0199fce9
JD
7738 SvREFCNT(rv) = 0;
7739 sv_clear(rv);
7740 SvFLAGS(rv) = 0;
7741 SvREFCNT(rv) = refcnt;
0199fce9 7742
dc5494d2
NC
7743 sv_upgrade(rv, SVt_RV);
7744 } else if (SvROK(rv)) {
7745 SvREFCNT_dec(SvRV(rv));
7746 } else if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
7747 sv_upgrade(rv, SVt_RV);
7748 else if (SvTYPE(rv) > SVt_RV) {
8bd4d4c5 7749 SvPV_free(rv);
0199fce9
JD
7750 SvCUR_set(rv, 0);
7751 SvLEN_set(rv, 0);
7752 }
51cf62d8 7753
0c34ef67 7754 SvOK_off(rv);
b162af07 7755 SvRV_set(rv, sv);
ed6116ce 7756 SvROK_on(rv);
463ee0b2 7757
a0d0e21e 7758 if (classname) {
1b6737cc 7759 HV* const stash = gv_stashpv(classname, TRUE);
a0d0e21e
LW
7760 (void)sv_bless(rv, stash);
7761 }
7762 return sv;
7763}
7764
954c1994
GS
7765/*
7766=for apidoc sv_setref_pv
7767
7768Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
7769argument will be upgraded to an RV. That RV will be modified to point to
7770the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7771into the SV. The C<classname> argument indicates the package for the
bd61b366 7772blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7773will have a reference count of 1, and the RV will be returned.
954c1994
GS
7774
7775Do not use with other Perl types such as HV, AV, SV, CV, because those
7776objects will become corrupted by the pointer copy process.
7777
7778Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7779
7780=cut
7781*/
7782
a0d0e21e 7783SV*
864dbfa3 7784Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 7785{
97aff369 7786 dVAR;
189b2af5 7787 if (!pv) {
3280af22 7788 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
7789 SvSETMAGIC(rv);
7790 }
a0d0e21e 7791 else
56431972 7792 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
7793 return rv;
7794}
7795
954c1994
GS
7796/*
7797=for apidoc sv_setref_iv
7798
7799Copies an integer into a new SV, optionally blessing the SV. The C<rv>
7800argument will be upgraded to an RV. That RV will be modified to point to
7801the new SV. The C<classname> argument indicates the package for the
bd61b366 7802blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7803will have a reference count of 1, and the RV will be returned.
954c1994
GS
7804
7805=cut
7806*/
7807
a0d0e21e 7808SV*
864dbfa3 7809Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
7810{
7811 sv_setiv(newSVrv(rv,classname), iv);
7812 return rv;
7813}
7814
954c1994 7815/*
e1c57cef
JH
7816=for apidoc sv_setref_uv
7817
7818Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
7819argument will be upgraded to an RV. That RV will be modified to point to
7820the new SV. The C<classname> argument indicates the package for the
bd61b366 7821blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7822will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
7823
7824=cut
7825*/
7826
7827SV*
7828Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
7829{
7830 sv_setuv(newSVrv(rv,classname), uv);
7831 return rv;
7832}
7833
7834/*
954c1994
GS
7835=for apidoc sv_setref_nv
7836
7837Copies a double into a new SV, optionally blessing the SV. The C<rv>
7838argument will be upgraded to an RV. That RV will be modified to point to
7839the new SV. The C<classname> argument indicates the package for the
bd61b366 7840blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7841will have a reference count of 1, and the RV will be returned.
954c1994
GS
7842
7843=cut
7844*/
7845
a0d0e21e 7846SV*
65202027 7847Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
7848{
7849 sv_setnv(newSVrv(rv,classname), nv);
7850 return rv;
7851}
463ee0b2 7852
954c1994
GS
7853/*
7854=for apidoc sv_setref_pvn
7855
7856Copies a string into a new SV, optionally blessing the SV. The length of the
7857string must be specified with C<n>. The C<rv> argument will be upgraded to
7858an RV. That RV will be modified to point to the new SV. The C<classname>
7859argument indicates the package for the blessing. Set C<classname> to
bd61b366 7860C<NULL> to avoid the blessing. The new SV will have a reference count
d34c2299 7861of 1, and the RV will be returned.
954c1994
GS
7862
7863Note that C<sv_setref_pv> copies the pointer while this copies the string.
7864
7865=cut
7866*/
7867
a0d0e21e 7868SV*
1b6737cc 7869Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, const char *pv, STRLEN n)
a0d0e21e
LW
7870{
7871 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
7872 return rv;
7873}
7874
954c1994
GS
7875/*
7876=for apidoc sv_bless
7877
7878Blesses an SV into a specified package. The SV must be an RV. The package
7879must be designated by its stash (see C<gv_stashpv()>). The reference count
7880of the SV is unaffected.
7881
7882=cut
7883*/
7884
a0d0e21e 7885SV*
864dbfa3 7886Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 7887{
97aff369 7888 dVAR;
76e3520e 7889 SV *tmpRef;
a0d0e21e 7890 if (!SvROK(sv))
cea2e8a9 7891 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
7892 tmpRef = SvRV(sv);
7893 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
7894 if (SvREADONLY(tmpRef))
cea2e8a9 7895 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
7896 if (SvOBJECT(tmpRef)) {
7897 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7898 --PL_sv_objcount;
76e3520e 7899 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 7900 }
a0d0e21e 7901 }
76e3520e
GS
7902 SvOBJECT_on(tmpRef);
7903 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7904 ++PL_sv_objcount;
862a34c6 7905 SvUPGRADE(tmpRef, SVt_PVMG);
b37c2d43 7906 SvSTASH_set(tmpRef, (HV*)SvREFCNT_inc_simple(stash));
a0d0e21e 7907
2e3febc6
CS
7908 if (Gv_AMG(stash))
7909 SvAMAGIC_on(sv);
7910 else
7911 SvAMAGIC_off(sv);
a0d0e21e 7912
1edbfb88
AB
7913 if(SvSMAGICAL(tmpRef))
7914 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
7915 mg_set(tmpRef);
7916
7917
ecdeb87c 7918
a0d0e21e
LW
7919 return sv;
7920}
7921
645c22ef 7922/* Downgrades a PVGV to a PVMG.
645c22ef
DM
7923 */
7924
76e3520e 7925STATIC void
cea2e8a9 7926S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 7927{
97aff369 7928 dVAR;
850fabdf 7929 void *xpvmg;
b37c2d43 7930 SV * const temp = sv_newmortal();
850fabdf 7931
a0d0e21e
LW
7932 assert(SvTYPE(sv) == SVt_PVGV);
7933 SvFAKE_off(sv);
180488f8
NC
7934 gv_efullname3(temp, (GV *) sv, "*");
7935
f7877b28 7936 if (GvGP(sv)) {
1edc1566 7937 gp_free((GV*)sv);
f7877b28 7938 }
e826b3c7 7939 if (GvSTASH(sv)) {
e15faf7d 7940 sv_del_backref((SV*)GvSTASH(sv), sv);
5c284bb0 7941 GvSTASH(sv) = NULL;
e826b3c7 7942 }
a5f75d66 7943 GvMULTI_off(sv);
acda4c6a
NC
7944 if (GvNAME_HEK(sv)) {
7945 unshare_hek(GvNAME_HEK(sv));
7946 }
dedf8e73 7947 SvSCREAM_off(sv);
850fabdf
GS
7948
7949 /* need to keep SvANY(sv) in the right arena */
7950 xpvmg = new_XPVMG();
7951 StructCopy(SvANY(sv), xpvmg, XPVMG);
7952 del_XPVGV(SvANY(sv));
7953 SvANY(sv) = xpvmg;
7954
a0d0e21e
LW
7955 SvFLAGS(sv) &= ~SVTYPEMASK;
7956 SvFLAGS(sv) |= SVt_PVMG;
180488f8
NC
7957
7958 /* Intentionally not calling any local SET magic, as this isn't so much a
7959 set operation as merely an internal storage change. */
7960 sv_setsv_flags(sv, temp, 0);
a0d0e21e
LW
7961}
7962
954c1994 7963/*
840a7b70 7964=for apidoc sv_unref_flags
954c1994
GS
7965
7966Unsets the RV status of the SV, and decrements the reference count of
7967whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
7968as a reversal of C<newSVrv>. The C<cflags> argument can contain
7969C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
7970(otherwise the decrementing is conditional on the reference count being
7971different from one or the reference being a readonly SV).
7889fe52 7972See C<SvROK_off>.
954c1994
GS
7973
7974=cut
7975*/
7976
ed6116ce 7977void
e15faf7d 7978Perl_sv_unref_flags(pTHX_ SV *ref, U32 flags)
ed6116ce 7979{
b64e5050 7980 SV* const target = SvRV(ref);
810b8aa5 7981
e15faf7d
NC
7982 if (SvWEAKREF(ref)) {
7983 sv_del_backref(target, ref);
7984 SvWEAKREF_off(ref);
7985 SvRV_set(ref, NULL);
810b8aa5
GS
7986 return;
7987 }
e15faf7d
NC
7988 SvRV_set(ref, NULL);
7989 SvROK_off(ref);
7990 /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
04ca4930 7991 assigned to as BEGIN {$a = \"Foo"} will fail. */
e15faf7d
NC
7992 if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
7993 SvREFCNT_dec(target);
840a7b70 7994 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
e15faf7d 7995 sv_2mortal(target); /* Schedule for freeing later */
ed6116ce 7996}
8990e307 7997
840a7b70 7998/*
645c22ef
DM
7999=for apidoc sv_untaint
8000
8001Untaint an SV. Use C<SvTAINTED_off> instead.
8002=cut
8003*/
8004
bbce6d69 8005void
864dbfa3 8006Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 8007{
13f57bf8 8008 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
b64e5050 8009 MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 8010 if (mg)
565764a8 8011 mg->mg_len &= ~1;
36477c24 8012 }
bbce6d69 8013}
8014
645c22ef
DM
8015/*
8016=for apidoc sv_tainted
8017
8018Test an SV for taintedness. Use C<SvTAINTED> instead.
8019=cut
8020*/
8021
bbce6d69 8022bool
864dbfa3 8023Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 8024{
13f57bf8 8025 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
823a54a3 8026 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
2ddb8a4f 8027 if (mg && (mg->mg_len & 1) )
36477c24 8028 return TRUE;
8029 }
8030 return FALSE;
bbce6d69 8031}
8032
09540bc3
JH
8033/*
8034=for apidoc sv_setpviv
8035
8036Copies an integer into the given SV, also updating its string value.
8037Does not handle 'set' magic. See C<sv_setpviv_mg>.
8038
8039=cut
8040*/
8041
8042void
8043Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
8044{
8045 char buf[TYPE_CHARS(UV)];
8046 char *ebuf;
b64e5050 8047 char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
09540bc3
JH
8048
8049 sv_setpvn(sv, ptr, ebuf - ptr);
8050}
8051
8052/*
8053=for apidoc sv_setpviv_mg
8054
8055Like C<sv_setpviv>, but also handles 'set' magic.
8056
8057=cut
8058*/
8059
8060void
8061Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
8062{
df7eb254 8063 sv_setpviv(sv, iv);
09540bc3
JH
8064 SvSETMAGIC(sv);
8065}
8066
cea2e8a9 8067#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8068
8069/* pTHX_ magic can't cope with varargs, so this is a no-context
8070 * version of the main function, (which may itself be aliased to us).
8071 * Don't access this version directly.
8072 */
8073
cea2e8a9
GS
8074void
8075Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
8076{
8077 dTHX;
8078 va_list args;
8079 va_start(args, pat);
c5be433b 8080 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
8081 va_end(args);
8082}
8083
645c22ef
DM
8084/* pTHX_ magic can't cope with varargs, so this is a no-context
8085 * version of the main function, (which may itself be aliased to us).
8086 * Don't access this version directly.
8087 */
cea2e8a9
GS
8088
8089void
8090Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
8091{
8092 dTHX;
8093 va_list args;
8094 va_start(args, pat);
c5be433b 8095 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 8096 va_end(args);
cea2e8a9
GS
8097}
8098#endif
8099
954c1994
GS
8100/*
8101=for apidoc sv_setpvf
8102
bffc3d17
SH
8103Works like C<sv_catpvf> but copies the text into the SV instead of
8104appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
8105
8106=cut
8107*/
8108
46fc3d4c 8109void
864dbfa3 8110Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8111{
8112 va_list args;
46fc3d4c 8113 va_start(args, pat);
c5be433b 8114 sv_vsetpvf(sv, pat, &args);
46fc3d4c 8115 va_end(args);
8116}
8117
bffc3d17
SH
8118/*
8119=for apidoc sv_vsetpvf
8120
8121Works like C<sv_vcatpvf> but copies the text into the SV instead of
8122appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
8123
8124Usually used via its frontend C<sv_setpvf>.
8125
8126=cut
8127*/
645c22ef 8128
c5be433b
GS
8129void
8130Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8131{
4608196e 8132 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b 8133}
ef50df4b 8134
954c1994
GS
8135/*
8136=for apidoc sv_setpvf_mg
8137
8138Like C<sv_setpvf>, but also handles 'set' magic.
8139
8140=cut
8141*/
8142
ef50df4b 8143void
864dbfa3 8144Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8145{
8146 va_list args;
ef50df4b 8147 va_start(args, pat);
c5be433b 8148 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 8149 va_end(args);
c5be433b
GS
8150}
8151
bffc3d17
SH
8152/*
8153=for apidoc sv_vsetpvf_mg
8154
8155Like C<sv_vsetpvf>, but also handles 'set' magic.
8156
8157Usually used via its frontend C<sv_setpvf_mg>.
8158
8159=cut
8160*/
645c22ef 8161
c5be433b
GS
8162void
8163Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8164{
4608196e 8165 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
8166 SvSETMAGIC(sv);
8167}
8168
cea2e8a9 8169#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8170
8171/* pTHX_ magic can't cope with varargs, so this is a no-context
8172 * version of the main function, (which may itself be aliased to us).
8173 * Don't access this version directly.
8174 */
8175
cea2e8a9
GS
8176void
8177Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
8178{
8179 dTHX;
8180 va_list args;
8181 va_start(args, pat);
c5be433b 8182 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
8183 va_end(args);
8184}
8185
645c22ef
DM
8186/* pTHX_ magic can't cope with varargs, so this is a no-context
8187 * version of the main function, (which may itself be aliased to us).
8188 * Don't access this version directly.
8189 */
8190
cea2e8a9
GS
8191void
8192Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
8193{
8194 dTHX;
8195 va_list args;
8196 va_start(args, pat);
c5be433b 8197 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 8198 va_end(args);
cea2e8a9
GS
8199}
8200#endif
8201
954c1994
GS
8202/*
8203=for apidoc sv_catpvf
8204
d5ce4a7c
GA
8205Processes its arguments like C<sprintf> and appends the formatted
8206output to an SV. If the appended data contains "wide" characters
8207(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
8208and characters >255 formatted with %c), the original SV might get
bffc3d17 8209upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
8210C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
8211valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 8212
d5ce4a7c 8213=cut */
954c1994 8214
46fc3d4c 8215void
864dbfa3 8216Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8217{
8218 va_list args;
46fc3d4c 8219 va_start(args, pat);
c5be433b 8220 sv_vcatpvf(sv, pat, &args);
46fc3d4c 8221 va_end(args);
8222}
8223
bffc3d17
SH
8224/*
8225=for apidoc sv_vcatpvf
8226
8227Processes its arguments like C<vsprintf> and appends the formatted output
8228to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
8229
8230Usually used via its frontend C<sv_catpvf>.
8231
8232=cut
8233*/
645c22ef 8234
ef50df4b 8235void
c5be433b
GS
8236Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8237{
4608196e 8238 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
8239}
8240
954c1994
GS
8241/*
8242=for apidoc sv_catpvf_mg
8243
8244Like C<sv_catpvf>, but also handles 'set' magic.
8245
8246=cut
8247*/
8248
c5be433b 8249void
864dbfa3 8250Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8251{
8252 va_list args;
ef50df4b 8253 va_start(args, pat);
c5be433b 8254 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 8255 va_end(args);
c5be433b
GS
8256}
8257
bffc3d17
SH
8258/*
8259=for apidoc sv_vcatpvf_mg
8260
8261Like C<sv_vcatpvf>, but also handles 'set' magic.
8262
8263Usually used via its frontend C<sv_catpvf_mg>.
8264
8265=cut
8266*/
645c22ef 8267
c5be433b
GS
8268void
8269Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8270{
4608196e 8271 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
8272 SvSETMAGIC(sv);
8273}
8274
954c1994
GS
8275/*
8276=for apidoc sv_vsetpvfn
8277
bffc3d17 8278Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
8279appending it.
8280
bffc3d17 8281Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 8282
954c1994
GS
8283=cut
8284*/
8285
46fc3d4c 8286void
7d5ea4e7 8287Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8288{
8289 sv_setpvn(sv, "", 0);
7d5ea4e7 8290 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 8291}
8292
2d00ba3b 8293STATIC I32
9dd79c3f 8294S_expect_number(pTHX_ char** pattern)
211dfcf1 8295{
97aff369 8296 dVAR;
211dfcf1
HS
8297 I32 var = 0;
8298 switch (**pattern) {
8299 case '1': case '2': case '3':
8300 case '4': case '5': case '6':
8301 case '7': case '8': case '9':
2fba7546
GA
8302 var = *(*pattern)++ - '0';
8303 while (isDIGIT(**pattern)) {
5f66b61c 8304 const I32 tmp = var * 10 + (*(*pattern)++ - '0');
2fba7546
GA
8305 if (tmp < var)
8306 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_NAME(PL_op) : "sv_vcatpvfn"));
8307 var = tmp;
8308 }
211dfcf1
HS
8309 }
8310 return var;
8311}
211dfcf1 8312
c445ea15
AL
8313STATIC char *
8314S_F0convert(NV nv, char *endbuf, STRLEN *len)
4151a5fe 8315{
a3b680e6 8316 const int neg = nv < 0;
4151a5fe 8317 UV uv;
4151a5fe
IZ
8318
8319 if (neg)
8320 nv = -nv;
8321 if (nv < UV_MAX) {
b464bac0 8322 char *p = endbuf;
4151a5fe 8323 nv += 0.5;
028f8eaa 8324 uv = (UV)nv;
4151a5fe
IZ
8325 if (uv & 1 && uv == nv)
8326 uv--; /* Round to even */
8327 do {
a3b680e6 8328 const unsigned dig = uv % 10;
4151a5fe
IZ
8329 *--p = '0' + dig;
8330 } while (uv /= 10);
8331 if (neg)
8332 *--p = '-';
8333 *len = endbuf - p;
8334 return p;
8335 }
bd61b366 8336 return NULL;
4151a5fe
IZ
8337}
8338
8339
954c1994
GS
8340/*
8341=for apidoc sv_vcatpvfn
8342
8343Processes its arguments like C<vsprintf> and appends the formatted output
8344to an SV. Uses an array of SVs if the C style variable argument list is
8345missing (NULL). When running with taint checks enabled, indicates via
8346C<maybe_tainted> if results are untrustworthy (often due to the use of
8347locales).
8348
bffc3d17 8349Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 8350
954c1994
GS
8351=cut
8352*/
8353
8896765a
RB
8354
8355#define VECTORIZE_ARGS vecsv = va_arg(*args, SV*);\
8356 vecstr = (U8*)SvPV_const(vecsv,veclen);\
8357 vec_utf8 = DO_UTF8(vecsv);
8358
1ef29b0e
RGS
8359/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
8360
46fc3d4c 8361void
7d5ea4e7 8362Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8363{
97aff369 8364 dVAR;
46fc3d4c 8365 char *p;
8366 char *q;
a3b680e6 8367 const char *patend;
fc36a67e 8368 STRLEN origlen;
46fc3d4c 8369 I32 svix = 0;
27da23d5 8370 static const char nullstr[] = "(null)";
a0714e2c 8371 SV *argsv = NULL;
b464bac0
AL
8372 bool has_utf8 = DO_UTF8(sv); /* has the result utf8? */
8373 const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
a0714e2c 8374 SV *nsv = NULL;
4151a5fe
IZ
8375 /* Times 4: a decimal digit takes more than 3 binary digits.
8376 * NV_DIG: mantissa takes than many decimal digits.
8377 * Plus 32: Playing safe. */
8378 char ebuf[IV_DIG * 4 + NV_DIG + 32];
8379 /* large enough for "%#.#f" --chip */
8380 /* what about long double NVs? --jhi */
db79b45b 8381
53c1dcc0
AL
8382 PERL_UNUSED_ARG(maybe_tainted);
8383
46fc3d4c 8384 /* no matter what, this is a string now */
fc36a67e 8385 (void)SvPV_force(sv, origlen);
46fc3d4c 8386
8896765a 8387 /* special-case "", "%s", and "%-p" (SVf - see below) */
46fc3d4c 8388 if (patlen == 0)
8389 return;
0dbb1585 8390 if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
2d03de9c
AL
8391 if (args) {
8392 const char * const s = va_arg(*args, char*);
8393 sv_catpv(sv, s ? s : nullstr);
8394 }
8395 else if (svix < svmax) {
8396 sv_catsv(sv, *svargs);
2d03de9c
AL
8397 }
8398 return;
0dbb1585 8399 }
8896765a
RB
8400 if (args && patlen == 3 && pat[0] == '%' &&
8401 pat[1] == '-' && pat[2] == 'p') {
8402 argsv = va_arg(*args, SV*);
8403 sv_catsv(sv, argsv);
8896765a 8404 return;
46fc3d4c 8405 }
8406
1d917b39 8407#ifndef USE_LONG_DOUBLE
4151a5fe 8408 /* special-case "%.<number>[gf]" */
7af36d83 8409 if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
4151a5fe
IZ
8410 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
8411 unsigned digits = 0;
8412 const char *pp;
8413
8414 pp = pat + 2;
8415 while (*pp >= '0' && *pp <= '9')
8416 digits = 10 * digits + (*pp++ - '0');
028f8eaa 8417 if (pp - pat == (int)patlen - 1) {
4151a5fe
IZ
8418 NV nv;
8419
7af36d83 8420 if (svix < svmax)
4151a5fe
IZ
8421 nv = SvNV(*svargs);
8422 else
8423 return;
8424 if (*pp == 'g') {
2873255c
NC
8425 /* Add check for digits != 0 because it seems that some
8426 gconverts are buggy in this case, and we don't yet have
8427 a Configure test for this. */
8428 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
8429 /* 0, point, slack */
2e59c212 8430 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
8431 sv_catpv(sv, ebuf);
8432 if (*ebuf) /* May return an empty string for digits==0 */
8433 return;
8434 }
8435 } else if (!digits) {
8436 STRLEN l;
8437
8438 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
8439 sv_catpvn(sv, p, l);
8440 return;
8441 }
8442 }
8443 }
8444 }
1d917b39 8445#endif /* !USE_LONG_DOUBLE */
4151a5fe 8446
2cf2cfc6 8447 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 8448 has_utf8 = TRUE;
2cf2cfc6 8449
46fc3d4c 8450 patend = (char*)pat + patlen;
8451 for (p = (char*)pat; p < patend; p = q) {
8452 bool alt = FALSE;
8453 bool left = FALSE;
b22c7a20 8454 bool vectorize = FALSE;
211dfcf1 8455 bool vectorarg = FALSE;
2cf2cfc6 8456 bool vec_utf8 = FALSE;
46fc3d4c 8457 char fill = ' ';
8458 char plus = 0;
8459 char intsize = 0;
8460 STRLEN width = 0;
fc36a67e 8461 STRLEN zeros = 0;
46fc3d4c 8462 bool has_precis = FALSE;
8463 STRLEN precis = 0;
c445ea15 8464 const I32 osvix = svix;
2cf2cfc6 8465 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
8466#ifdef HAS_LDBL_SPRINTF_BUG
8467 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 8468 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
8469 bool fix_ldbl_sprintf_bug = FALSE;
8470#endif
205f51d8 8471
46fc3d4c 8472 char esignbuf[4];
89ebb4a3 8473 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 8474 STRLEN esignlen = 0;
8475
bd61b366 8476 const char *eptr = NULL;
fc36a67e 8477 STRLEN elen = 0;
a0714e2c 8478 SV *vecsv = NULL;
4608196e 8479 const U8 *vecstr = NULL;
b22c7a20 8480 STRLEN veclen = 0;
934abaf1 8481 char c = 0;
46fc3d4c 8482 int i;
9c5ffd7c 8483 unsigned base = 0;
8c8eb53c
RB
8484 IV iv = 0;
8485 UV uv = 0;
9e5b023a
JH
8486 /* we need a long double target in case HAS_LONG_DOUBLE but
8487 not USE_LONG_DOUBLE
8488 */
35fff930 8489#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
8490 long double nv;
8491#else
65202027 8492 NV nv;
9e5b023a 8493#endif
46fc3d4c 8494 STRLEN have;
8495 STRLEN need;
8496 STRLEN gap;
7af36d83 8497 const char *dotstr = ".";
b22c7a20 8498 STRLEN dotstrlen = 1;
211dfcf1 8499 I32 efix = 0; /* explicit format parameter index */
eb3fce90 8500 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
8501 I32 epix = 0; /* explicit precision index */
8502 I32 evix = 0; /* explicit vector index */
eb3fce90 8503 bool asterisk = FALSE;
46fc3d4c 8504
211dfcf1 8505 /* echo everything up to the next format specification */
46fc3d4c 8506 for (q = p; q < patend && *q != '%'; ++q) ;
8507 if (q > p) {
db79b45b
JH
8508 if (has_utf8 && !pat_utf8)
8509 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
8510 else
8511 sv_catpvn(sv, p, q - p);
46fc3d4c 8512 p = q;
8513 }
8514 if (q++ >= patend)
8515 break;
8516
211dfcf1
HS
8517/*
8518 We allow format specification elements in this order:
8519 \d+\$ explicit format parameter index
8520 [-+ 0#]+ flags
a472f209 8521 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 8522 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
8523 \d+|\*(\d+\$)? width using optional (optionally specified) arg
8524 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
8525 [hlqLV] size
8896765a
RB
8526 [%bcdefginopsuxDFOUX] format (mandatory)
8527*/
8528
8529 if (args) {
8530/*
8531 As of perl5.9.3, printf format checking is on by default.
8532 Internally, perl uses %p formats to provide an escape to
8533 some extended formatting. This block deals with those
8534 extensions: if it does not match, (char*)q is reset and
8535 the normal format processing code is used.
8536
8537 Currently defined extensions are:
8538 %p include pointer address (standard)
8539 %-p (SVf) include an SV (previously %_)
8540 %-<num>p include an SV with precision <num>
8541 %1p (VDf) include a v-string (as %vd)
8542 %<num>p reserved for future extensions
8543
8544 Robin Barker 2005-07-14
211dfcf1 8545*/
8896765a
RB
8546 char* r = q;
8547 bool sv = FALSE;
8548 STRLEN n = 0;
8549 if (*q == '-')
8550 sv = *q++;
c445ea15 8551 n = expect_number(&q);
8896765a
RB
8552 if (*q++ == 'p') {
8553 if (sv) { /* SVf */
8554 if (n) {
8555 precis = n;
8556 has_precis = TRUE;
8557 }
8558 argsv = va_arg(*args, SV*);
8559 eptr = SvPVx_const(argsv, elen);
8560 if (DO_UTF8(argsv))
8561 is_utf8 = TRUE;
8562 goto string;
8563 }
8564#if vdNUMBER
8565 else if (n == vdNUMBER) { /* VDf */
8566 vectorize = TRUE;
8567 VECTORIZE_ARGS
8568 goto format_vd;
8569 }
8570#endif
8571 else if (n) {
8572 if (ckWARN_d(WARN_INTERNAL))
8573 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
8574 "internal %%<num>p might conflict with future printf extensions");
8575 }
8576 }
8577 q = r;
8578 }
8579
c445ea15 8580 if ( (width = expect_number(&q)) ) {
211dfcf1
HS
8581 if (*q == '$') {
8582 ++q;
8583 efix = width;
8584 } else {
8585 goto gotwidth;
8586 }
8587 }
8588
fc36a67e 8589 /* FLAGS */
8590
46fc3d4c 8591 while (*q) {
8592 switch (*q) {
8593 case ' ':
8594 case '+':
8595 plus = *q++;
8596 continue;
8597
8598 case '-':
8599 left = TRUE;
8600 q++;
8601 continue;
8602
8603 case '0':
8604 fill = *q++;
8605 continue;
8606
8607 case '#':
8608 alt = TRUE;
8609 q++;
8610 continue;
8611
fc36a67e 8612 default:
8613 break;
8614 }
8615 break;
8616 }
46fc3d4c 8617
211dfcf1 8618 tryasterisk:
eb3fce90 8619 if (*q == '*') {
211dfcf1 8620 q++;
c445ea15 8621 if ( (ewix = expect_number(&q)) )
211dfcf1
HS
8622 if (*q++ != '$')
8623 goto unknown;
eb3fce90 8624 asterisk = TRUE;
211dfcf1
HS
8625 }
8626 if (*q == 'v') {
eb3fce90 8627 q++;
211dfcf1
HS
8628 if (vectorize)
8629 goto unknown;
9cbac4c7 8630 if ((vectorarg = asterisk)) {
211dfcf1
HS
8631 evix = ewix;
8632 ewix = 0;
8633 asterisk = FALSE;
8634 }
8635 vectorize = TRUE;
8636 goto tryasterisk;
eb3fce90
JH
8637 }
8638
211dfcf1 8639 if (!asterisk)
858a90f9 8640 {
7a5fa8a2 8641 if( *q == '0' )
f3583277 8642 fill = *q++;
c445ea15 8643 width = expect_number(&q);
858a90f9 8644 }
211dfcf1
HS
8645
8646 if (vectorize) {
8647 if (vectorarg) {
8648 if (args)
8649 vecsv = va_arg(*args, SV*);
7ad96abb
NC
8650 else if (evix) {
8651 vecsv = (evix > 0 && evix <= svmax)
8652 ? svargs[evix-1] : &PL_sv_undef;
8653 } else {
8654 vecsv = svix < svmax ? svargs[svix++] : &PL_sv_undef;
8655 }
245d4a47 8656 dotstr = SvPV_const(vecsv, dotstrlen);
640283f5
NC
8657 /* Keep the DO_UTF8 test *after* the SvPV call, else things go
8658 bad with tied or overloaded values that return UTF8. */
211dfcf1 8659 if (DO_UTF8(vecsv))
2cf2cfc6 8660 is_utf8 = TRUE;
640283f5
NC
8661 else if (has_utf8) {
8662 vecsv = sv_mortalcopy(vecsv);
8663 sv_utf8_upgrade(vecsv);
8664 dotstr = SvPV_const(vecsv, dotstrlen);
8665 is_utf8 = TRUE;
8666 }
211dfcf1
HS
8667 }
8668 if (args) {
8896765a 8669 VECTORIZE_ARGS
eb3fce90 8670 }
7ad96abb 8671 else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
211dfcf1 8672 vecsv = svargs[efix ? efix-1 : svix++];
245d4a47 8673 vecstr = (U8*)SvPV_const(vecsv,veclen);
2cf2cfc6 8674 vec_utf8 = DO_UTF8(vecsv);
96b8f7ce
JP
8675
8676 /* if this is a version object, we need to convert
8677 * back into v-string notation and then let the
8678 * vectorize happen normally
d7aa5382 8679 */
96b8f7ce
JP
8680 if (sv_derived_from(vecsv, "version")) {
8681 char *version = savesvpv(vecsv);
34ba6322
SP
8682 if ( hv_exists((HV*)SvRV(vecsv), "alpha", 5 ) ) {
8683 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
8684 "vector argument not supported with alpha versions");
8685 goto unknown;
8686 }
96b8f7ce
JP
8687 vecsv = sv_newmortal();
8688 /* scan_vstring is expected to be called during
8689 * tokenization, so we need to fake up the end
8690 * of the buffer for it
8691 */
8692 PL_bufend = version + veclen;
8693 scan_vstring(version, vecsv);
8694 vecstr = (U8*)SvPV_const(vecsv, veclen);
8695 vec_utf8 = DO_UTF8(vecsv);
8696 Safefree(version);
d7aa5382 8697 }
211dfcf1
HS
8698 }
8699 else {
8700 vecstr = (U8*)"";
8701 veclen = 0;
8702 }
eb3fce90 8703 }
fc36a67e 8704
eb3fce90 8705 if (asterisk) {
fc36a67e 8706 if (args)
8707 i = va_arg(*args, int);
8708 else
eb3fce90
JH
8709 i = (ewix ? ewix <= svmax : svix < svmax) ?
8710 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8711 left |= (i < 0);
8712 width = (i < 0) ? -i : i;
fc36a67e 8713 }
211dfcf1 8714 gotwidth:
fc36a67e 8715
8716 /* PRECISION */
46fc3d4c 8717
fc36a67e 8718 if (*q == '.') {
8719 q++;
8720 if (*q == '*') {
211dfcf1 8721 q++;
c445ea15 8722 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
7b8dd722
HS
8723 goto unknown;
8724 /* XXX: todo, support specified precision parameter */
8725 if (epix)
211dfcf1 8726 goto unknown;
46fc3d4c 8727 if (args)
8728 i = va_arg(*args, int);
8729 else
eb3fce90
JH
8730 i = (ewix ? ewix <= svmax : svix < svmax)
8731 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8732 precis = (i < 0) ? 0 : i;
fc36a67e 8733 }
8734 else {
8735 precis = 0;
8736 while (isDIGIT(*q))
8737 precis = precis * 10 + (*q++ - '0');
8738 }
8739 has_precis = TRUE;
8740 }
46fc3d4c 8741
fc36a67e 8742 /* SIZE */
46fc3d4c 8743
fc36a67e 8744 switch (*q) {
c623ac67
GS
8745#ifdef WIN32
8746 case 'I': /* Ix, I32x, and I64x */
8747# ifdef WIN64
8748 if (q[1] == '6' && q[2] == '4') {
8749 q += 3;
8750 intsize = 'q';
8751 break;
8752 }
8753# endif
8754 if (q[1] == '3' && q[2] == '2') {
8755 q += 3;
8756 break;
8757 }
8758# ifdef WIN64
8759 intsize = 'q';
8760# endif
8761 q++;
8762 break;
8763#endif
9e5b023a 8764#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 8765 case 'L': /* Ld */
5f66b61c 8766 /*FALLTHROUGH*/
e5c81feb 8767#ifdef HAS_QUAD
6f9bb7fd 8768 case 'q': /* qd */
9e5b023a 8769#endif
6f9bb7fd
GS
8770 intsize = 'q';
8771 q++;
8772 break;
8773#endif
fc36a67e 8774 case 'l':
9e5b023a 8775#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 8776 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 8777 intsize = 'q';
8778 q += 2;
46fc3d4c 8779 break;
cf2093f6 8780 }
fc36a67e 8781#endif
5f66b61c 8782 /*FALLTHROUGH*/
fc36a67e 8783 case 'h':
5f66b61c 8784 /*FALLTHROUGH*/
fc36a67e 8785 case 'V':
8786 intsize = *q++;
46fc3d4c 8787 break;
8788 }
8789
fc36a67e 8790 /* CONVERSION */
8791
211dfcf1
HS
8792 if (*q == '%') {
8793 eptr = q++;
8794 elen = 1;
26372e71
GA
8795 if (vectorize) {
8796 c = '%';
8797 goto unknown;
8798 }
211dfcf1
HS
8799 goto string;
8800 }
8801
26372e71 8802 if (!vectorize && !args) {
86c51f8b
NC
8803 if (efix) {
8804 const I32 i = efix-1;
8805 argsv = (i >= 0 && i < svmax) ? svargs[i] : &PL_sv_undef;
8806 } else {
8807 argsv = (svix >= 0 && svix < svmax)
8808 ? svargs[svix++] : &PL_sv_undef;
8809 }
863811b2 8810 }
211dfcf1 8811
46fc3d4c 8812 switch (c = *q++) {
8813
8814 /* STRINGS */
8815
46fc3d4c 8816 case 'c':
26372e71
GA
8817 if (vectorize)
8818 goto unknown;
8819 uv = (args) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
8820 if ((uv > 255 ||
8821 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 8822 && !IN_BYTES) {
dfe13c55 8823 eptr = (char*)utf8buf;
9041c2e3 8824 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 8825 is_utf8 = TRUE;
7e2040f0
GS
8826 }
8827 else {
8828 c = (char)uv;
8829 eptr = &c;
8830 elen = 1;
a0ed51b3 8831 }
46fc3d4c 8832 goto string;
8833
46fc3d4c 8834 case 's':
26372e71
GA
8835 if (vectorize)
8836 goto unknown;
8837 if (args) {
fc36a67e 8838 eptr = va_arg(*args, char*);
c635e13b 8839 if (eptr)
1d7c1841
GS
8840#ifdef MACOS_TRADITIONAL
8841 /* On MacOS, %#s format is used for Pascal strings */
8842 if (alt)
8843 elen = *eptr++;
8844 else
8845#endif
c635e13b 8846 elen = strlen(eptr);
8847 else {
27da23d5 8848 eptr = (char *)nullstr;
c635e13b 8849 elen = sizeof nullstr - 1;
8850 }
46fc3d4c 8851 }
211dfcf1 8852 else {
4d84ee25 8853 eptr = SvPVx_const(argsv, elen);
7e2040f0 8854 if (DO_UTF8(argsv)) {
a0ed51b3
LW
8855 if (has_precis && precis < elen) {
8856 I32 p = precis;
7e2040f0 8857 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
8858 precis = p;
8859 }
8860 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 8861 width += elen - sv_len_utf8(argsv);
a0ed51b3 8862 }
2cf2cfc6 8863 is_utf8 = TRUE;
a0ed51b3
LW
8864 }
8865 }
fc36a67e 8866
46fc3d4c 8867 string:
8868 if (has_precis && elen > precis)
8869 elen = precis;
8870 break;
8871
8872 /* INTEGERS */
8873
fc36a67e 8874 case 'p':
be75b157 8875 if (alt || vectorize)
c2e66d9e 8876 goto unknown;
211dfcf1 8877 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 8878 base = 16;
8879 goto integer;
8880
46fc3d4c 8881 case 'D':
29fe7a80 8882#ifdef IV_IS_QUAD
22f3ae8c 8883 intsize = 'q';
29fe7a80 8884#else
46fc3d4c 8885 intsize = 'l';
29fe7a80 8886#endif
5f66b61c 8887 /*FALLTHROUGH*/
46fc3d4c 8888 case 'd':
8889 case 'i':
8896765a
RB
8890#if vdNUMBER
8891 format_vd:
8892#endif
b22c7a20 8893 if (vectorize) {
ba210ebe 8894 STRLEN ulen;
211dfcf1
HS
8895 if (!veclen)
8896 continue;
2cf2cfc6
A
8897 if (vec_utf8)
8898 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8899 UTF8_ALLOW_ANYUV);
b22c7a20 8900 else {
e83d50c9 8901 uv = *vecstr;
b22c7a20
GS
8902 ulen = 1;
8903 }
8904 vecstr += ulen;
8905 veclen -= ulen;
e83d50c9
JP
8906 if (plus)
8907 esignbuf[esignlen++] = plus;
b22c7a20
GS
8908 }
8909 else if (args) {
46fc3d4c 8910 switch (intsize) {
8911 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 8912 case 'l': iv = va_arg(*args, long); break;
fc36a67e 8913 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 8914 default: iv = va_arg(*args, int); break;
cf2093f6
JH
8915#ifdef HAS_QUAD
8916 case 'q': iv = va_arg(*args, Quad_t); break;
8917#endif
46fc3d4c 8918 }
8919 }
8920 else {
b10c0dba 8921 IV tiv = SvIVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 8922 switch (intsize) {
b10c0dba
MHM
8923 case 'h': iv = (short)tiv; break;
8924 case 'l': iv = (long)tiv; break;
8925 case 'V':
8926 default: iv = tiv; break;
cf2093f6 8927#ifdef HAS_QUAD
b10c0dba 8928 case 'q': iv = (Quad_t)tiv; break;
cf2093f6 8929#endif
46fc3d4c 8930 }
8931 }
e83d50c9
JP
8932 if ( !vectorize ) /* we already set uv above */
8933 {
8934 if (iv >= 0) {
8935 uv = iv;
8936 if (plus)
8937 esignbuf[esignlen++] = plus;
8938 }
8939 else {
8940 uv = -iv;
8941 esignbuf[esignlen++] = '-';
8942 }
46fc3d4c 8943 }
8944 base = 10;
8945 goto integer;
8946
fc36a67e 8947 case 'U':
29fe7a80 8948#ifdef IV_IS_QUAD
22f3ae8c 8949 intsize = 'q';
29fe7a80 8950#else
fc36a67e 8951 intsize = 'l';
29fe7a80 8952#endif
5f66b61c 8953 /*FALLTHROUGH*/
fc36a67e 8954 case 'u':
8955 base = 10;
8956 goto uns_integer;
8957
4f19785b
WSI
8958 case 'b':
8959 base = 2;
8960 goto uns_integer;
8961
46fc3d4c 8962 case 'O':
29fe7a80 8963#ifdef IV_IS_QUAD
22f3ae8c 8964 intsize = 'q';
29fe7a80 8965#else
46fc3d4c 8966 intsize = 'l';
29fe7a80 8967#endif
5f66b61c 8968 /*FALLTHROUGH*/
46fc3d4c 8969 case 'o':
8970 base = 8;
8971 goto uns_integer;
8972
8973 case 'X':
46fc3d4c 8974 case 'x':
8975 base = 16;
46fc3d4c 8976
8977 uns_integer:
b22c7a20 8978 if (vectorize) {
ba210ebe 8979 STRLEN ulen;
b22c7a20 8980 vector:
211dfcf1
HS
8981 if (!veclen)
8982 continue;
2cf2cfc6
A
8983 if (vec_utf8)
8984 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8985 UTF8_ALLOW_ANYUV);
b22c7a20 8986 else {
a05b299f 8987 uv = *vecstr;
b22c7a20
GS
8988 ulen = 1;
8989 }
8990 vecstr += ulen;
8991 veclen -= ulen;
8992 }
8993 else if (args) {
46fc3d4c 8994 switch (intsize) {
8995 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 8996 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 8997 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 8998 default: uv = va_arg(*args, unsigned); break;
cf2093f6 8999#ifdef HAS_QUAD
9e3321a5 9000 case 'q': uv = va_arg(*args, Uquad_t); break;
cf2093f6 9001#endif
46fc3d4c 9002 }
9003 }
9004 else {
b10c0dba 9005 UV tuv = SvUVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 9006 switch (intsize) {
b10c0dba
MHM
9007 case 'h': uv = (unsigned short)tuv; break;
9008 case 'l': uv = (unsigned long)tuv; break;
9009 case 'V':
9010 default: uv = tuv; break;
cf2093f6 9011#ifdef HAS_QUAD
b10c0dba 9012 case 'q': uv = (Uquad_t)tuv; break;
cf2093f6 9013#endif
46fc3d4c 9014 }
9015 }
9016
9017 integer:
4d84ee25
NC
9018 {
9019 char *ptr = ebuf + sizeof ebuf;
9020 switch (base) {
9021 unsigned dig;
9022 case 16:
9023 if (!uv)
9024 alt = FALSE;
9025 p = (char*)((c == 'X')
9026 ? "0123456789ABCDEF" : "0123456789abcdef");
9027 do {
9028 dig = uv & 15;
9029 *--ptr = p[dig];
9030 } while (uv >>= 4);
9031 if (alt) {
9032 esignbuf[esignlen++] = '0';
9033 esignbuf[esignlen++] = c; /* 'x' or 'X' */
9034 }
9035 break;
9036 case 8:
9037 do {
9038 dig = uv & 7;
9039 *--ptr = '0' + dig;
9040 } while (uv >>= 3);
9041 if (alt && *ptr != '0')
9042 *--ptr = '0';
9043 break;
9044 case 2:
ed2b91d2
GA
9045 if (!uv)
9046 alt = FALSE;
4d84ee25
NC
9047 do {
9048 dig = uv & 1;
9049 *--ptr = '0' + dig;
9050 } while (uv >>= 1);
9051 if (alt) {
9052 esignbuf[esignlen++] = '0';
9053 esignbuf[esignlen++] = 'b';
9054 }
9055 break;
9056 default: /* it had better be ten or less */
9057 do {
9058 dig = uv % base;
9059 *--ptr = '0' + dig;
9060 } while (uv /= base);
9061 break;
46fc3d4c 9062 }
4d84ee25
NC
9063 elen = (ebuf + sizeof ebuf) - ptr;
9064 eptr = ptr;
9065 if (has_precis) {
9066 if (precis > elen)
9067 zeros = precis - elen;
9068 else if (precis == 0 && elen == 1 && *eptr == '0')
9069 elen = 0;
eda88b6d 9070 }
c10ed8b9 9071 }
46fc3d4c 9072 break;
9073
9074 /* FLOATING POINT */
9075
fc36a67e 9076 case 'F':
9077 c = 'f'; /* maybe %F isn't supported here */
5f66b61c 9078 /*FALLTHROUGH*/
46fc3d4c 9079 case 'e': case 'E':
fc36a67e 9080 case 'f':
46fc3d4c 9081 case 'g': case 'G':
26372e71
GA
9082 if (vectorize)
9083 goto unknown;
46fc3d4c 9084
9085 /* This is evil, but floating point is even more evil */
9086
9e5b023a
JH
9087 /* for SV-style calling, we can only get NV
9088 for C-style calling, we assume %f is double;
9089 for simplicity we allow any of %Lf, %llf, %qf for long double
9090 */
9091 switch (intsize) {
9092 case 'V':
9093#if defined(USE_LONG_DOUBLE)
9094 intsize = 'q';
9095#endif
9096 break;
8a2e3f14 9097/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364 9098 case 'l':
5f66b61c 9099 /*FALLTHROUGH*/
9e5b023a
JH
9100 default:
9101#if defined(USE_LONG_DOUBLE)
9102 intsize = args ? 0 : 'q';
9103#endif
9104 break;
9105 case 'q':
9106#if defined(HAS_LONG_DOUBLE)
9107 break;
9108#else
5f66b61c 9109 /*FALLTHROUGH*/
9e5b023a
JH
9110#endif
9111 case 'h':
9e5b023a
JH
9112 goto unknown;
9113 }
9114
9115 /* now we need (long double) if intsize == 'q', else (double) */
26372e71 9116 nv = (args) ?
35fff930
JH
9117#if LONG_DOUBLESIZE > DOUBLESIZE
9118 intsize == 'q' ?
205f51d8
AS
9119 va_arg(*args, long double) :
9120 va_arg(*args, double)
35fff930 9121#else
205f51d8 9122 va_arg(*args, double)
35fff930 9123#endif
9e5b023a 9124 : SvNVx(argsv);
fc36a67e 9125
9126 need = 0;
9127 if (c != 'e' && c != 'E') {
9128 i = PERL_INT_MIN;
9e5b023a
JH
9129 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9130 will cast our (long double) to (double) */
73b309ea 9131 (void)Perl_frexp(nv, &i);
fc36a67e 9132 if (i == PERL_INT_MIN)
cea2e8a9 9133 Perl_die(aTHX_ "panic: frexp");
c635e13b 9134 if (i > 0)
fc36a67e 9135 need = BIT_DIGITS(i);
9136 }
9137 need += has_precis ? precis : 6; /* known default */
20f6aaab 9138
fc36a67e 9139 if (need < width)
9140 need = width;
9141
20f6aaab
AS
9142#ifdef HAS_LDBL_SPRINTF_BUG
9143 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9144 with sfio - Allen <allens@cpan.org> */
9145
9146# ifdef DBL_MAX
9147# define MY_DBL_MAX DBL_MAX
9148# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9149# if DOUBLESIZE >= 8
9150# define MY_DBL_MAX 1.7976931348623157E+308L
9151# else
9152# define MY_DBL_MAX 3.40282347E+38L
9153# endif
9154# endif
9155
9156# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9157# define MY_DBL_MAX_BUG 1L
20f6aaab 9158# else
205f51d8 9159# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9160# endif
20f6aaab 9161
205f51d8
AS
9162# ifdef DBL_MIN
9163# define MY_DBL_MIN DBL_MIN
9164# else /* XXX guessing! -Allen */
9165# if DOUBLESIZE >= 8
9166# define MY_DBL_MIN 2.2250738585072014E-308L
9167# else
9168# define MY_DBL_MIN 1.17549435E-38L
9169# endif
9170# endif
20f6aaab 9171
205f51d8
AS
9172 if ((intsize == 'q') && (c == 'f') &&
9173 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9174 (need < DBL_DIG)) {
9175 /* it's going to be short enough that
9176 * long double precision is not needed */
9177
9178 if ((nv <= 0L) && (nv >= -0L))
9179 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9180 else {
9181 /* would use Perl_fp_class as a double-check but not
9182 * functional on IRIX - see perl.h comments */
9183
9184 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9185 /* It's within the range that a double can represent */
9186#if defined(DBL_MAX) && !defined(DBL_MIN)
9187 if ((nv >= ((long double)1/DBL_MAX)) ||
9188 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9189#endif
205f51d8 9190 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9191 }
205f51d8
AS
9192 }
9193 if (fix_ldbl_sprintf_bug == TRUE) {
9194 double temp;
9195
9196 intsize = 0;
9197 temp = (double)nv;
9198 nv = (NV)temp;
9199 }
20f6aaab 9200 }
205f51d8
AS
9201
9202# undef MY_DBL_MAX
9203# undef MY_DBL_MAX_BUG
9204# undef MY_DBL_MIN
9205
20f6aaab
AS
9206#endif /* HAS_LDBL_SPRINTF_BUG */
9207
46fc3d4c 9208 need += 20; /* fudge factor */
80252599
GS
9209 if (PL_efloatsize < need) {
9210 Safefree(PL_efloatbuf);
9211 PL_efloatsize = need + 20; /* more fudge */
a02a5408 9212 Newx(PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9213 PL_efloatbuf[0] = '\0';
46fc3d4c 9214 }
9215
4151a5fe
IZ
9216 if ( !(width || left || plus || alt) && fill != '0'
9217 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
9218 /* See earlier comment about buggy Gconvert when digits,
9219 aka precis is 0 */
9220 if ( c == 'g' && precis) {
2e59c212 9221 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4150c189
NC
9222 /* May return an empty string for digits==0 */
9223 if (*PL_efloatbuf) {
9224 elen = strlen(PL_efloatbuf);
4151a5fe 9225 goto float_converted;
4150c189 9226 }
4151a5fe
IZ
9227 } else if ( c == 'f' && !precis) {
9228 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9229 break;
9230 }
9231 }
4d84ee25
NC
9232 {
9233 char *ptr = ebuf + sizeof ebuf;
9234 *--ptr = '\0';
9235 *--ptr = c;
9236 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9e5b023a 9237#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
4d84ee25
NC
9238 if (intsize == 'q') {
9239 /* Copy the one or more characters in a long double
9240 * format before the 'base' ([efgEFG]) character to
9241 * the format string. */
9242 static char const prifldbl[] = PERL_PRIfldbl;
9243 char const *p = prifldbl + sizeof(prifldbl) - 3;
9244 while (p >= prifldbl) { *--ptr = *p--; }
9245 }
65202027 9246#endif
4d84ee25
NC
9247 if (has_precis) {
9248 base = precis;
9249 do { *--ptr = '0' + (base % 10); } while (base /= 10);
9250 *--ptr = '.';
9251 }
9252 if (width) {
9253 base = width;
9254 do { *--ptr = '0' + (base % 10); } while (base /= 10);
9255 }
9256 if (fill == '0')
9257 *--ptr = fill;
9258 if (left)
9259 *--ptr = '-';
9260 if (plus)
9261 *--ptr = plus;
9262 if (alt)
9263 *--ptr = '#';
9264 *--ptr = '%';
9265
9266 /* No taint. Otherwise we are in the strange situation
9267 * where printf() taints but print($float) doesn't.
9268 * --jhi */
9e5b023a 9269#if defined(HAS_LONG_DOUBLE)
4150c189 9270 elen = ((intsize == 'q')
e80fed9d
JH
9271# ifdef USE_SNPRINTF
9272 ? snprintf(PL_efloatbuf, PL_efloatsize, ptr, nv)
9273 : snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)nv));
9274# else
4150c189
NC
9275 ? my_sprintf(PL_efloatbuf, ptr, nv)
9276 : my_sprintf(PL_efloatbuf, ptr, (double)nv));
e80fed9d 9277# endif /* #ifdef USE_SNPRINTF */
9e5b023a 9278#else
4150c189 9279 elen = my_sprintf(PL_efloatbuf, ptr, nv);
9e5b023a 9280#endif
4d84ee25 9281 }
4151a5fe 9282 float_converted:
80252599 9283 eptr = PL_efloatbuf;
46fc3d4c 9284 break;
9285
fc36a67e 9286 /* SPECIAL */
9287
9288 case 'n':
26372e71
GA
9289 if (vectorize)
9290 goto unknown;
fc36a67e 9291 i = SvCUR(sv) - origlen;
26372e71 9292 if (args) {
c635e13b 9293 switch (intsize) {
9294 case 'h': *(va_arg(*args, short*)) = i; break;
9295 default: *(va_arg(*args, int*)) = i; break;
9296 case 'l': *(va_arg(*args, long*)) = i; break;
9297 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
9298#ifdef HAS_QUAD
9299 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
9300#endif
c635e13b 9301 }
fc36a67e 9302 }
9dd79c3f 9303 else
211dfcf1 9304 sv_setuv_mg(argsv, (UV)i);
fc36a67e 9305 continue; /* not "break" */
9306
9307 /* UNKNOWN */
9308
46fc3d4c 9309 default:
fc36a67e 9310 unknown:
041457d9
DM
9311 if (!args
9312 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
9313 && ckWARN(WARN_PRINTF))
9314 {
c4420975 9315 SV * const msg = sv_newmortal();
35c1215d
NC
9316 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9317 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 9318 if (c) {
0f4b6630 9319 if (isPRINT(c))
1c846c1f 9320 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
9321 "\"%%%c\"", c & 0xFF);
9322 else
9323 Perl_sv_catpvf(aTHX_ msg,
57def98f 9324 "\"%%\\%03"UVof"\"",
0f4b6630 9325 (UV)c & 0xFF);
0f4b6630 9326 } else
396482e1 9327 sv_catpvs(msg, "end of string");
95b63a38 9328 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, (void*)msg); /* yes, this is reentrant */
c635e13b 9329 }
fb73857a 9330
9331 /* output mangled stuff ... */
9332 if (c == '\0')
9333 --q;
46fc3d4c 9334 eptr = p;
9335 elen = q - p;
fb73857a 9336
9337 /* ... right here, because formatting flags should not apply */
9338 SvGROW(sv, SvCUR(sv) + elen + 1);
9339 p = SvEND(sv);
4459522c 9340 Copy(eptr, p, elen, char);
fb73857a 9341 p += elen;
9342 *p = '\0';
3f7c398e 9343 SvCUR_set(sv, p - SvPVX_const(sv));
58e33a90 9344 svix = osvix;
fb73857a 9345 continue; /* not "break" */
46fc3d4c 9346 }
9347
6c94ec8b
HS
9348 /* calculate width before utf8_upgrade changes it */
9349 have = esignlen + zeros + elen;
ed2b91d2
GA
9350 if (have < zeros)
9351 Perl_croak_nocontext(PL_memory_wrap);
6c94ec8b 9352
d2876be5
JH
9353 if (is_utf8 != has_utf8) {
9354 if (is_utf8) {
9355 if (SvCUR(sv))
9356 sv_utf8_upgrade(sv);
9357 }
9358 else {
53c1dcc0 9359 SV * const nsv = sv_2mortal(newSVpvn(eptr, elen));
d2876be5 9360 sv_utf8_upgrade(nsv);
93524f2b 9361 eptr = SvPVX_const(nsv);
d2876be5
JH
9362 elen = SvCUR(nsv);
9363 }
9364 SvGROW(sv, SvCUR(sv) + elen + 1);
9365 p = SvEND(sv);
9366 *p = '\0';
9367 }
6af65485 9368
46fc3d4c 9369 need = (have > width ? have : width);
9370 gap = need - have;
9371
d2641cbd
PC
9372 if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
9373 Perl_croak_nocontext(PL_memory_wrap);
b22c7a20 9374 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 9375 p = SvEND(sv);
9376 if (esignlen && fill == '0') {
53c1dcc0 9377 int i;
eb160463 9378 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9379 *p++ = esignbuf[i];
9380 }
9381 if (gap && !left) {
9382 memset(p, fill, gap);
9383 p += gap;
9384 }
9385 if (esignlen && fill != '0') {
53c1dcc0 9386 int i;
eb160463 9387 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9388 *p++ = esignbuf[i];
9389 }
fc36a67e 9390 if (zeros) {
53c1dcc0 9391 int i;
fc36a67e 9392 for (i = zeros; i; i--)
9393 *p++ = '0';
9394 }
46fc3d4c 9395 if (elen) {
4459522c 9396 Copy(eptr, p, elen, char);
46fc3d4c 9397 p += elen;
9398 }
9399 if (gap && left) {
9400 memset(p, ' ', gap);
9401 p += gap;
9402 }
b22c7a20
GS
9403 if (vectorize) {
9404 if (veclen) {
4459522c 9405 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
9406 p += dotstrlen;
9407 }
9408 else
9409 vectorize = FALSE; /* done iterating over vecstr */
9410 }
2cf2cfc6
A
9411 if (is_utf8)
9412 has_utf8 = TRUE;
9413 if (has_utf8)
7e2040f0 9414 SvUTF8_on(sv);
46fc3d4c 9415 *p = '\0';
3f7c398e 9416 SvCUR_set(sv, p - SvPVX_const(sv));
b22c7a20
GS
9417 if (vectorize) {
9418 esignlen = 0;
9419 goto vector;
9420 }
46fc3d4c 9421 }
9422}
51371543 9423
645c22ef
DM
9424/* =========================================================================
9425
9426=head1 Cloning an interpreter
9427
9428All the macros and functions in this section are for the private use of
9429the main function, perl_clone().
9430
9431The foo_dup() functions make an exact copy of an existing foo thinngy.
9432During the course of a cloning, a hash table is used to map old addresses
9433to new addresses. The table is created and manipulated with the
9434ptr_table_* functions.
9435
9436=cut
9437
9438============================================================================*/
9439
9440
1d7c1841
GS
9441#if defined(USE_ITHREADS)
9442
d4c19fe8 9443/* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
1d7c1841
GS
9444#ifndef GpREFCNT_inc
9445# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
9446#endif
9447
9448
a41cc44e
NC
9449/* Certain cases in Perl_ss_dup have been merged, by relying on the fact
9450 that currently av_dup and hv_dup are the same as sv_dup. If this changes,
9451 please unmerge ss_dup. */
d2d73c3e 9452#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
7f466ec7 9453#define sv_dup_inc_NN(s,t) SvREFCNT_inc_NN(sv_dup(s,t))
d2d73c3e
AB
9454#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
9455#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9456#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
9457#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9458#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
9459#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9460#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
9461#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
9462#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
9463#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
6136c704
AL
9464#define SAVEPV(p) ((p) ? savepv(p) : NULL)
9465#define SAVEPVN(p,n) ((p) ? savepvn(p,n) : NULL)
8cf8f3d1 9466
d2d73c3e 9467
d2f185dc
AMS
9468/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
9469 regcomp.c. AMS 20010712 */
645c22ef 9470
1d7c1841 9471REGEXP *
53c1dcc0 9472Perl_re_dup(pTHX_ const REGEXP *r, CLONE_PARAMS *param)
1d7c1841 9473{
27da23d5 9474 dVAR;
d2f185dc
AMS
9475 REGEXP *ret;
9476 int i, len, npar;
9477 struct reg_substr_datum *s;
9478
9479 if (!r)
9480 return (REGEXP *)NULL;
9481
9482 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
9483 return ret;
9484
9485 len = r->offsets[0];
9486 npar = r->nparens+1;
9487
a02a5408 9488 Newxc(ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
d2f185dc
AMS
9489 Copy(r->program, ret->program, len+1, regnode);
9490
a02a5408 9491 Newx(ret->startp, npar, I32);
d2f185dc 9492 Copy(r->startp, ret->startp, npar, I32);
a02a5408 9493 Newx(ret->endp, npar, I32);
d2f185dc
AMS
9494 Copy(r->startp, ret->startp, npar, I32);
9495
a02a5408 9496 Newx(ret->substrs, 1, struct reg_substr_data);
d2f185dc
AMS
9497 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
9498 s->min_offset = r->substrs->data[i].min_offset;
9499 s->max_offset = r->substrs->data[i].max_offset;
9500 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 9501 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
9502 }
9503
70612e96 9504 ret->regstclass = NULL;
d2f185dc
AMS
9505 if (r->data) {
9506 struct reg_data *d;
e1ec3a88 9507 const int count = r->data->count;
53c1dcc0 9508 int i;
d2f185dc 9509
a02a5408 9510 Newxc(d, sizeof(struct reg_data) + count*sizeof(void *),
d2f185dc 9511 char, struct reg_data);
a02a5408 9512 Newx(d->what, count, U8);
d2f185dc
AMS
9513
9514 d->count = count;
9515 for (i = 0; i < count; i++) {
9516 d->what[i] = r->data->what[i];
9517 switch (d->what[i]) {
a3621e74
YO
9518 /* legal options are one of: sfpont
9519 see also regcomp.h and pregfree() */
d2f185dc
AMS
9520 case 's':
9521 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
9522 break;
9523 case 'p':
9524 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
9525 break;
9526 case 'f':
9527 /* This is cheating. */
a02a5408 9528 Newx(d->data[i], 1, struct regnode_charclass_class);
d2f185dc
AMS
9529 StructCopy(r->data->data[i], d->data[i],
9530 struct regnode_charclass_class);
70612e96 9531 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
9532 break;
9533 case 'o':
33773810
AMS
9534 /* Compiled op trees are readonly, and can thus be
9535 shared without duplication. */
b34c0dd4 9536 OP_REFCNT_LOCK;
9b978d73 9537 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
b34c0dd4 9538 OP_REFCNT_UNLOCK;
9b978d73 9539 break;
d2f185dc
AMS
9540 case 'n':
9541 d->data[i] = r->data->data[i];
9542 break;
a3621e74
YO
9543 case 't':
9544 d->data[i] = r->data->data[i];
9545 OP_REFCNT_LOCK;
9546 ((reg_trie_data*)d->data[i])->refcount++;
9547 OP_REFCNT_UNLOCK;
9548 break;
9549 default:
9550 Perl_croak(aTHX_ "panic: re_dup unknown data code '%c'", r->data->what[i]);
d2f185dc
AMS
9551 }
9552 }
9553
9554 ret->data = d;
9555 }
9556 else
9557 ret->data = NULL;
9558
a02a5408 9559 Newx(ret->offsets, 2*len+1, U32);
d2f185dc
AMS
9560 Copy(r->offsets, ret->offsets, 2*len+1, U32);
9561
e01c5899 9562 ret->precomp = SAVEPVN(r->precomp, r->prelen);
d2f185dc
AMS
9563 ret->refcnt = r->refcnt;
9564 ret->minlen = r->minlen;
9565 ret->prelen = r->prelen;
9566 ret->nparens = r->nparens;
9567 ret->lastparen = r->lastparen;
9568 ret->lastcloseparen = r->lastcloseparen;
9569 ret->reganch = r->reganch;
9570
70612e96
RG
9571 ret->sublen = r->sublen;
9572
9573 if (RX_MATCH_COPIED(ret))
e01c5899 9574 ret->subbeg = SAVEPVN(r->subbeg, r->sublen);
70612e96 9575 else
bd61b366 9576 ret->subbeg = NULL;
f8c7b90f 9577#ifdef PERL_OLD_COPY_ON_WRITE
a0714e2c 9578 ret->saved_copy = NULL;
9a26048b 9579#endif
70612e96 9580
d2f185dc
AMS
9581 ptr_table_store(PL_ptr_table, r, ret);
9582 return ret;
1d7c1841
GS
9583}
9584
d2d73c3e 9585/* duplicate a file handle */
645c22ef 9586
1d7c1841 9587PerlIO *
a8fc9800 9588Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
9589{
9590 PerlIO *ret;
53c1dcc0
AL
9591
9592 PERL_UNUSED_ARG(type);
73d840c0 9593
1d7c1841
GS
9594 if (!fp)
9595 return (PerlIO*)NULL;
9596
9597 /* look for it in the table first */
9598 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
9599 if (ret)
9600 return ret;
9601
9602 /* create anew and remember what it is */
ecdeb87c 9603 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
9604 ptr_table_store(PL_ptr_table, fp, ret);
9605 return ret;
9606}
9607
645c22ef
DM
9608/* duplicate a directory handle */
9609
1d7c1841
GS
9610DIR *
9611Perl_dirp_dup(pTHX_ DIR *dp)
9612{
96a5add6 9613 PERL_UNUSED_CONTEXT;
1d7c1841
GS
9614 if (!dp)
9615 return (DIR*)NULL;
9616 /* XXX TODO */
9617 return dp;
9618}
9619
ff276b08 9620/* duplicate a typeglob */
645c22ef 9621
1d7c1841 9622GP *
a8fc9800 9623Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
9624{
9625 GP *ret;
b37c2d43 9626
1d7c1841
GS
9627 if (!gp)
9628 return (GP*)NULL;
9629 /* look for it in the table first */
9630 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
9631 if (ret)
9632 return ret;
9633
9634 /* create anew and remember what it is */
a02a5408 9635 Newxz(ret, 1, GP);
1d7c1841
GS
9636 ptr_table_store(PL_ptr_table, gp, ret);
9637
9638 /* clone */
9639 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
9640 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
9641 ret->gp_io = io_dup_inc(gp->gp_io, param);
9642 ret->gp_form = cv_dup_inc(gp->gp_form, param);
9643 ret->gp_av = av_dup_inc(gp->gp_av, param);
9644 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
9645 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
9646 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841 9647 ret->gp_cvgen = gp->gp_cvgen;
1d7c1841 9648 ret->gp_line = gp->gp_line;
f4890806 9649 ret->gp_file_hek = hek_dup(gp->gp_file_hek, param);
1d7c1841
GS
9650 return ret;
9651}
9652
645c22ef
DM
9653/* duplicate a chain of magic */
9654
1d7c1841 9655MAGIC *
a8fc9800 9656Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 9657{
cb359b41
JH
9658 MAGIC *mgprev = (MAGIC*)NULL;
9659 MAGIC *mgret;
1d7c1841
GS
9660 if (!mg)
9661 return (MAGIC*)NULL;
9662 /* look for it in the table first */
9663 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
9664 if (mgret)
9665 return mgret;
9666
9667 for (; mg; mg = mg->mg_moremagic) {
9668 MAGIC *nmg;
a02a5408 9669 Newxz(nmg, 1, MAGIC);
cb359b41 9670 if (mgprev)
1d7c1841 9671 mgprev->mg_moremagic = nmg;
cb359b41
JH
9672 else
9673 mgret = nmg;
1d7c1841
GS
9674 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
9675 nmg->mg_private = mg->mg_private;
9676 nmg->mg_type = mg->mg_type;
9677 nmg->mg_flags = mg->mg_flags;
14befaf4 9678 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 9679 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 9680 }
05bd4103 9681 else if(mg->mg_type == PERL_MAGIC_backref) {
d7cbc7b5
NC
9682 /* The backref AV has its reference count deliberately bumped by
9683 1. */
9684 nmg->mg_obj = SvREFCNT_inc(av_dup_inc((AV*) mg->mg_obj, param));
05bd4103 9685 }
8d2f4536
NC
9686 else if (mg->mg_type == PERL_MAGIC_symtab) {
9687 nmg->mg_obj = mg->mg_obj;
9688 }
1d7c1841
GS
9689 else {
9690 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
9691 ? sv_dup_inc(mg->mg_obj, param)
9692 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
9693 }
9694 nmg->mg_len = mg->mg_len;
9695 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 9696 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 9697 if (mg->mg_len > 0) {
1d7c1841 9698 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
9699 if (mg->mg_type == PERL_MAGIC_overload_table &&
9700 AMT_AMAGIC((AMT*)mg->mg_ptr))
9701 {
c445ea15 9702 const AMT * const amtp = (AMT*)mg->mg_ptr;
0bcc34c2 9703 AMT * const namtp = (AMT*)nmg->mg_ptr;
1d7c1841
GS
9704 I32 i;
9705 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 9706 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
9707 }
9708 }
9709 }
9710 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 9711 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 9712 }
68795e93
NIS
9713 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
9714 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
9715 }
1d7c1841
GS
9716 mgprev = nmg;
9717 }
9718 return mgret;
9719}
9720
645c22ef
DM
9721/* create a new pointer-mapping table */
9722
1d7c1841
GS
9723PTR_TBL_t *
9724Perl_ptr_table_new(pTHX)
9725{
9726 PTR_TBL_t *tbl;
96a5add6
AL
9727 PERL_UNUSED_CONTEXT;
9728
a02a5408 9729 Newxz(tbl, 1, PTR_TBL_t);
1d7c1841
GS
9730 tbl->tbl_max = 511;
9731 tbl->tbl_items = 0;
a02a5408 9732 Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
1d7c1841
GS
9733 return tbl;
9734}
9735
7119fd33
NC
9736#define PTR_TABLE_HASH(ptr) \
9737 ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
134ca3d6 9738
93e68bfb
JC
9739/*
9740 we use the PTE_SVSLOT 'reservation' made above, both here (in the
9741 following define) and at call to new_body_inline made below in
9742 Perl_ptr_table_store()
9743 */
9744
9745#define del_pte(p) del_body_type(p, PTE_SVSLOT)
32e691d0 9746
645c22ef
DM
9747/* map an existing pointer using a table */
9748
7bf61b54 9749STATIC PTR_TBL_ENT_t *
b0e6ae5b 9750S_ptr_table_find(PTR_TBL_t *tbl, const void *sv) {
1d7c1841 9751 PTR_TBL_ENT_t *tblent;
4373e329 9752 const UV hash = PTR_TABLE_HASH(sv);
1d7c1841
GS
9753 assert(tbl);
9754 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
9755 for (; tblent; tblent = tblent->next) {
9756 if (tblent->oldval == sv)
7bf61b54 9757 return tblent;
1d7c1841 9758 }
d4c19fe8 9759 return NULL;
7bf61b54
NC
9760}
9761
9762void *
9763Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, const void *sv)
9764{
b0e6ae5b 9765 PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
96a5add6 9766 PERL_UNUSED_CONTEXT;
d4c19fe8 9767 return tblent ? tblent->newval : NULL;
1d7c1841
GS
9768}
9769
645c22ef
DM
9770/* add a new entry to a pointer-mapping table */
9771
1d7c1841 9772void
44f8325f 9773Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, const void *oldsv, void *newsv)
1d7c1841 9774{
0c9fdfe0 9775 PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
96a5add6 9776 PERL_UNUSED_CONTEXT;
1d7c1841 9777
7bf61b54
NC
9778 if (tblent) {
9779 tblent->newval = newsv;
9780 } else {
9781 const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
9782
d2a0f284
JC
9783 new_body_inline(tblent, PTE_SVSLOT);
9784
7bf61b54
NC
9785 tblent->oldval = oldsv;
9786 tblent->newval = newsv;
9787 tblent->next = tbl->tbl_ary[entry];
9788 tbl->tbl_ary[entry] = tblent;
9789 tbl->tbl_items++;
9790 if (tblent->next && tbl->tbl_items > tbl->tbl_max)
9791 ptr_table_split(tbl);
1d7c1841 9792 }
1d7c1841
GS
9793}
9794
645c22ef
DM
9795/* double the hash bucket size of an existing ptr table */
9796
1d7c1841
GS
9797void
9798Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
9799{
9800 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
4373e329 9801 const UV oldsize = tbl->tbl_max + 1;
1d7c1841
GS
9802 UV newsize = oldsize * 2;
9803 UV i;
96a5add6 9804 PERL_UNUSED_CONTEXT;
1d7c1841
GS
9805
9806 Renew(ary, newsize, PTR_TBL_ENT_t*);
9807 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
9808 tbl->tbl_max = --newsize;
9809 tbl->tbl_ary = ary;
9810 for (i=0; i < oldsize; i++, ary++) {
9811 PTR_TBL_ENT_t **curentp, **entp, *ent;
9812 if (!*ary)
9813 continue;
9814 curentp = ary + oldsize;
9815 for (entp = ary, ent = *ary; ent; ent = *entp) {
134ca3d6 9816 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
9817 *entp = ent->next;
9818 ent->next = *curentp;
9819 *curentp = ent;
9820 continue;
9821 }
9822 else
9823 entp = &ent->next;
9824 }
9825 }
9826}
9827
645c22ef
DM
9828/* remove all the entries from a ptr table */
9829
a0739874
DM
9830void
9831Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
9832{
d5cefff9 9833 if (tbl && tbl->tbl_items) {
c445ea15 9834 register PTR_TBL_ENT_t * const * const array = tbl->tbl_ary;
d5cefff9 9835 UV riter = tbl->tbl_max;
a0739874 9836
d5cefff9
NC
9837 do {
9838 PTR_TBL_ENT_t *entry = array[riter];
ab1e7f95 9839
d5cefff9 9840 while (entry) {
00b6aa41 9841 PTR_TBL_ENT_t * const oentry = entry;
d5cefff9
NC
9842 entry = entry->next;
9843 del_pte(oentry);
9844 }
9845 } while (riter--);
a0739874 9846
d5cefff9
NC
9847 tbl->tbl_items = 0;
9848 }
a0739874
DM
9849}
9850
645c22ef
DM
9851/* clear and free a ptr table */
9852
a0739874
DM
9853void
9854Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
9855{
9856 if (!tbl) {
9857 return;
9858 }
9859 ptr_table_clear(tbl);
9860 Safefree(tbl->tbl_ary);
9861 Safefree(tbl);
9862}
9863
5bd07a3d 9864
83841fad 9865void
eb86f8b3 9866Perl_rvpv_dup(pTHX_ SV *dstr, const SV *sstr, CLONE_PARAMS* param)
83841fad
NIS
9867{
9868 if (SvROK(sstr)) {
b162af07
SP
9869 SvRV_set(dstr, SvWEAKREF(sstr)
9870 ? sv_dup(SvRV(sstr), param)
9871 : sv_dup_inc(SvRV(sstr), param));
f880fe2f 9872
83841fad 9873 }
3f7c398e 9874 else if (SvPVX_const(sstr)) {
83841fad
NIS
9875 /* Has something there */
9876 if (SvLEN(sstr)) {
68795e93 9877 /* Normal PV - clone whole allocated space */
3f7c398e 9878 SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
d3d0e6f1
NC
9879 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
9880 /* Not that normal - actually sstr is copy on write.
9881 But we are a true, independant SV, so: */
9882 SvREADONLY_off(dstr);
9883 SvFAKE_off(dstr);
9884 }
68795e93 9885 }
83841fad
NIS
9886 else {
9887 /* Special case - not normally malloced for some reason */
f7877b28
NC
9888 if (isGV_with_GP(sstr)) {
9889 /* Don't need to do anything here. */
9890 }
9891 else if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
ef10be65
NC
9892 /* A "shared" PV - clone it as "shared" PV */
9893 SvPV_set(dstr,
9894 HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
9895 param)));
83841fad
NIS
9896 }
9897 else {
9898 /* Some other special case - random pointer */
f880fe2f 9899 SvPV_set(dstr, SvPVX(sstr));
d3d0e6f1 9900 }
83841fad
NIS
9901 }
9902 }
9903 else {
4608196e 9904 /* Copy the NULL */
f880fe2f 9905 if (SvTYPE(dstr) == SVt_RV)
b162af07 9906 SvRV_set(dstr, NULL);
f880fe2f 9907 else
6136c704 9908 SvPV_set(dstr, NULL);
83841fad
NIS
9909 }
9910}
9911
662fb8b2
NC
9912/* duplicate an SV of any type (including AV, HV etc) */
9913
1d7c1841 9914SV *
eb86f8b3 9915Perl_sv_dup(pTHX_ const SV *sstr, CLONE_PARAMS* param)
1d7c1841 9916{
27da23d5 9917 dVAR;
1d7c1841
GS
9918 SV *dstr;
9919
9920 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
6136c704 9921 return NULL;
1d7c1841
GS
9922 /* look for it in the table first */
9923 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
9924 if (dstr)
9925 return dstr;
9926
0405e91e
AB
9927 if(param->flags & CLONEf_JOIN_IN) {
9928 /** We are joining here so we don't want do clone
9929 something that is bad **/
eb86f8b3
AL
9930 if (SvTYPE(sstr) == SVt_PVHV) {
9931 const char * const hvname = HvNAME_get(sstr);
9932 if (hvname)
9933 /** don't clone stashes if they already exist **/
9934 return (SV*)gv_stashpv(hvname,0);
0405e91e
AB
9935 }
9936 }
9937
1d7c1841
GS
9938 /* create anew and remember what it is */
9939 new_SV(dstr);
fd0854ff
DM
9940
9941#ifdef DEBUG_LEAKING_SCALARS
9942 dstr->sv_debug_optype = sstr->sv_debug_optype;
9943 dstr->sv_debug_line = sstr->sv_debug_line;
9944 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
9945 dstr->sv_debug_cloned = 1;
fd0854ff 9946 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
fd0854ff
DM
9947#endif
9948
1d7c1841
GS
9949 ptr_table_store(PL_ptr_table, sstr, dstr);
9950
9951 /* clone */
9952 SvFLAGS(dstr) = SvFLAGS(sstr);
9953 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
9954 SvREFCNT(dstr) = 0; /* must be before any other dups! */
9955
9956#ifdef DEBUGGING
3f7c398e 9957 if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
1d7c1841 9958 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
3f7c398e 9959 PL_watch_pvx, SvPVX_const(sstr));
1d7c1841
GS
9960#endif
9961
9660f481
DM
9962 /* don't clone objects whose class has asked us not to */
9963 if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
9964 SvFLAGS(dstr) &= ~SVTYPEMASK;
9965 SvOBJECT_off(dstr);
9966 return dstr;
9967 }
9968
1d7c1841
GS
9969 switch (SvTYPE(sstr)) {
9970 case SVt_NULL:
9971 SvANY(dstr) = NULL;
9972 break;
9973 case SVt_IV:
339049b0 9974 SvANY(dstr) = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
45977657 9975 SvIV_set(dstr, SvIVX(sstr));
1d7c1841
GS
9976 break;
9977 case SVt_NV:
9978 SvANY(dstr) = new_XNV();
9d6ce603 9979 SvNV_set(dstr, SvNVX(sstr));
1d7c1841
GS
9980 break;
9981 case SVt_RV:
339049b0 9982 SvANY(dstr) = &(dstr->sv_u.svu_rv);
83841fad 9983 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841 9984 break;
662fb8b2
NC
9985 default:
9986 {
9987 /* These are all the types that need complex bodies allocating. */
662fb8b2 9988 void *new_body;
2bcc16b3
NC
9989 const svtype sv_type = SvTYPE(sstr);
9990 const struct body_details *const sv_type_details
9991 = bodies_by_type + sv_type;
662fb8b2 9992
93e68bfb 9993 switch (sv_type) {
662fb8b2 9994 default:
bb263b4e 9995 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
662fb8b2
NC
9996 break;
9997
662fb8b2
NC
9998 case SVt_PVGV:
9999 if (GvUNIQUE((GV*)sstr)) {
6f207bd3 10000 NOOP; /* Do sharing here, and fall through */
662fb8b2 10001 }
c22188b4
NC
10002 case SVt_PVIO:
10003 case SVt_PVFM:
10004 case SVt_PVHV:
10005 case SVt_PVAV:
93e68bfb 10006 case SVt_PVBM:
662fb8b2 10007 case SVt_PVCV:
662fb8b2 10008 case SVt_PVLV:
662fb8b2 10009 case SVt_PVMG:
662fb8b2 10010 case SVt_PVNV:
662fb8b2 10011 case SVt_PVIV:
662fb8b2 10012 case SVt_PV:
d2a0f284 10013 assert(sv_type_details->body_size);
c22188b4 10014 if (sv_type_details->arena) {
d2a0f284 10015 new_body_inline(new_body, sv_type);
c22188b4 10016 new_body
b9502f15 10017 = (void*)((char*)new_body - sv_type_details->offset);
c22188b4
NC
10018 } else {
10019 new_body = new_NOARENA(sv_type_details);
10020 }
1d7c1841 10021 }
662fb8b2
NC
10022 assert(new_body);
10023 SvANY(dstr) = new_body;
10024
2bcc16b3 10025#ifndef PURIFY
b9502f15
NC
10026 Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
10027 ((char*)SvANY(dstr)) + sv_type_details->offset,
f32993d6 10028 sv_type_details->copy, char);
2bcc16b3
NC
10029#else
10030 Copy(((char*)SvANY(sstr)),
10031 ((char*)SvANY(dstr)),
d2a0f284 10032 sv_type_details->body_size + sv_type_details->offset, char);
2bcc16b3 10033#endif
662fb8b2 10034
f7877b28
NC
10035 if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
10036 && !isGV_with_GP(dstr))
662fb8b2
NC
10037 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10038
10039 /* The Copy above means that all the source (unduplicated) pointers
10040 are now in the destination. We can check the flags and the
10041 pointers in either, but it's possible that there's less cache
10042 missing by always going for the destination.
10043 FIXME - instrument and check that assumption */
f32993d6 10044 if (sv_type >= SVt_PVMG) {
885ffcb3
NC
10045 if ((sv_type == SVt_PVMG) && SvPAD_OUR(dstr)) {
10046 OURSTASH_set(dstr, hv_dup_inc(OURSTASH(dstr), param));
e736a858 10047 } else if (SvMAGIC(dstr))
662fb8b2
NC
10048 SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
10049 if (SvSTASH(dstr))
10050 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
1d7c1841 10051 }
662fb8b2 10052
f32993d6
NC
10053 /* The cast silences a GCC warning about unhandled types. */
10054 switch ((int)sv_type) {
662fb8b2
NC
10055 case SVt_PV:
10056 break;
10057 case SVt_PVIV:
10058 break;
10059 case SVt_PVNV:
10060 break;
10061 case SVt_PVMG:
10062 break;
10063 case SVt_PVBM:
10064 break;
10065 case SVt_PVLV:
10066 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
10067 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
10068 LvTARG(dstr) = dstr;
10069 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
10070 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(dstr), 0, param);
10071 else
10072 LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
10073 break;
10074 case SVt_PVGV:
acda4c6a
NC
10075 if (GvNAME_HEK(dstr))
10076 GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
f5c1e807 10077
e15faf7d
NC
10078 /* Don't call sv_add_backref here as it's going to be created
10079 as part of the magic cloning of the symbol table. */
f7877b28
NC
10080 GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
10081 if(isGV_with_GP(sstr)) {
10082 /* Danger Will Robinson - GvGP(dstr) isn't initialised
10083 at the point of this comment. */
10084 GvGP(dstr) = gp_dup(GvGP(sstr), param);
10085 (void)GpREFCNT_inc(GvGP(dstr));
10086 } else
10087 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
662fb8b2
NC
10088 break;
10089 case SVt_PVIO:
10090 IoIFP(dstr) = fp_dup(IoIFP(dstr), IoTYPE(dstr), param);
10091 if (IoOFP(dstr) == IoIFP(sstr))
10092 IoOFP(dstr) = IoIFP(dstr);
10093 else
10094 IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
10095 /* PL_rsfp_filters entries have fake IoDIRP() */
662fb8b2
NC
10096 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
10097 /* I have no idea why fake dirp (rsfps)
10098 should be treated differently but otherwise
10099 we end up with leaks -- sky*/
10100 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(dstr), param);
10101 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(dstr), param);
10102 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(dstr), param);
10103 } else {
10104 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(dstr), param);
10105 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(dstr), param);
10106 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(dstr), param);
100ce7e1
NC
10107 if (IoDIRP(dstr)) {
10108 IoDIRP(dstr) = dirp_dup(IoDIRP(dstr));
10109 } else {
6f207bd3 10110 NOOP;
100ce7e1
NC
10111 /* IoDIRP(dstr) is already a copy of IoDIRP(sstr) */
10112 }
662fb8b2
NC
10113 }
10114 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(dstr));
10115 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(dstr));
10116 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(dstr));
10117 break;
10118 case SVt_PVAV:
10119 if (AvARRAY((AV*)sstr)) {
10120 SV **dst_ary, **src_ary;
10121 SSize_t items = AvFILLp((AV*)sstr) + 1;
10122
10123 src_ary = AvARRAY((AV*)sstr);
a02a5408 10124 Newxz(dst_ary, AvMAX((AV*)sstr)+1, SV*);
662fb8b2
NC
10125 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
10126 SvPV_set(dstr, (char*)dst_ary);
10127 AvALLOC((AV*)dstr) = dst_ary;
10128 if (AvREAL((AV*)sstr)) {
10129 while (items-- > 0)
10130 *dst_ary++ = sv_dup_inc(*src_ary++, param);
10131 }
10132 else {
10133 while (items-- > 0)
10134 *dst_ary++ = sv_dup(*src_ary++, param);
10135 }
10136 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10137 while (items-- > 0) {
10138 *dst_ary++ = &PL_sv_undef;
10139 }
bfcb3514 10140 }
662fb8b2 10141 else {
bd61b366 10142 SvPV_set(dstr, NULL);
662fb8b2 10143 AvALLOC((AV*)dstr) = (SV**)NULL;
b79f7545 10144 }
662fb8b2
NC
10145 break;
10146 case SVt_PVHV:
10147 {
cbbf8932 10148 HEK *hvname = NULL;
662fb8b2
NC
10149
10150 if (HvARRAY((HV*)sstr)) {
10151 STRLEN i = 0;
10152 const bool sharekeys = !!HvSHAREKEYS(sstr);
10153 XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
10154 XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
10155 char *darray;
a02a5408 10156 Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
662fb8b2
NC
10157 + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
10158 char);
10159 HvARRAY(dstr) = (HE**)darray;
10160 while (i <= sxhv->xhv_max) {
5c4138a0 10161 const HE *source = HvARRAY(sstr)[i];
662fb8b2
NC
10162 HvARRAY(dstr)[i] = source
10163 ? he_dup(source, sharekeys, param) : 0;
10164 ++i;
10165 }
10166 if (SvOOK(sstr)) {
00b6aa41
AL
10167 struct xpvhv_aux * const saux = HvAUX(sstr);
10168 struct xpvhv_aux * const daux = HvAUX(dstr);
662fb8b2
NC
10169 /* This flag isn't copied. */
10170 /* SvOOK_on(hv) attacks the IV flags. */
10171 SvFLAGS(dstr) |= SVf_OOK;
10172
10173 hvname = saux->xhv_name;
dd690478
NC
10174 daux->xhv_name
10175 = hvname ? hek_dup(hvname, param) : hvname;
662fb8b2
NC
10176
10177 daux->xhv_riter = saux->xhv_riter;
10178 daux->xhv_eiter = saux->xhv_eiter
dd690478
NC
10179 ? he_dup(saux->xhv_eiter,
10180 (bool)!!HvSHAREKEYS(sstr), param) : 0;
86f55936
NC
10181 daux->xhv_backreferences = saux->xhv_backreferences
10182 ? (AV*) SvREFCNT_inc(
10183 sv_dup((SV*)saux->
10184 xhv_backreferences,
10185 param))
10186 : 0;
662fb8b2
NC
10187 }
10188 }
10189 else {
bd61b366 10190 SvPV_set(dstr, NULL);
662fb8b2
NC
10191 }
10192 /* Record stashes for possible cloning in Perl_clone(). */
10193 if(hvname)
10194 av_push(param->stashes, dstr);
10195 }
10196 break;
662fb8b2 10197 case SVt_PVCV:
bb172083
NC
10198 if (!(param->flags & CLONEf_COPY_STACKS)) {
10199 CvDEPTH(dstr) = 0;
10200 }
10201 case SVt_PVFM:
662fb8b2
NC
10202 /* NOTE: not refcounted */
10203 CvSTASH(dstr) = hv_dup(CvSTASH(dstr), param);
10204 OP_REFCNT_LOCK;
d04ba589
NC
10205 if (!CvISXSUB(dstr))
10206 CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
662fb8b2 10207 OP_REFCNT_UNLOCK;
cfae286e 10208 if (CvCONST(dstr) && CvISXSUB(dstr)) {
662fb8b2
NC
10209 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(dstr)) ?
10210 SvREFCNT_inc(CvXSUBANY(dstr).any_ptr) :
10211 sv_dup_inc((SV *)CvXSUBANY(dstr).any_ptr, param);
10212 }
10213 /* don't dup if copying back - CvGV isn't refcounted, so the
10214 * duped GV may never be freed. A bit of a hack! DAPM */
10215 CvGV(dstr) = (param->flags & CLONEf_JOIN_IN) ?
a0714e2c 10216 NULL : gv_dup(CvGV(dstr), param) ;
662fb8b2
NC
10217 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
10218 CvOUTSIDE(dstr) =
10219 CvWEAKOUTSIDE(sstr)
10220 ? cv_dup( CvOUTSIDE(dstr), param)
10221 : cv_dup_inc(CvOUTSIDE(dstr), param);
aed2304a 10222 if (!CvISXSUB(dstr))
662fb8b2
NC
10223 CvFILE(dstr) = SAVEPV(CvFILE(dstr));
10224 break;
bfcb3514 10225 }
1d7c1841 10226 }
1d7c1841
GS
10227 }
10228
10229 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
10230 ++PL_sv_objcount;
10231
10232 return dstr;
d2d73c3e 10233 }
1d7c1841 10234
645c22ef
DM
10235/* duplicate a context */
10236
1d7c1841 10237PERL_CONTEXT *
a8fc9800 10238Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
10239{
10240 PERL_CONTEXT *ncxs;
10241
10242 if (!cxs)
10243 return (PERL_CONTEXT*)NULL;
10244
10245 /* look for it in the table first */
10246 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
10247 if (ncxs)
10248 return ncxs;
10249
10250 /* create anew and remember what it is */
a02a5408 10251 Newxz(ncxs, max + 1, PERL_CONTEXT);
1d7c1841
GS
10252 ptr_table_store(PL_ptr_table, cxs, ncxs);
10253
10254 while (ix >= 0) {
c445ea15
AL
10255 PERL_CONTEXT * const cx = &cxs[ix];
10256 PERL_CONTEXT * const ncx = &ncxs[ix];
1d7c1841
GS
10257 ncx->cx_type = cx->cx_type;
10258 if (CxTYPE(cx) == CXt_SUBST) {
10259 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
10260 }
10261 else {
10262 ncx->blk_oldsp = cx->blk_oldsp;
10263 ncx->blk_oldcop = cx->blk_oldcop;
1d7c1841
GS
10264 ncx->blk_oldmarksp = cx->blk_oldmarksp;
10265 ncx->blk_oldscopesp = cx->blk_oldscopesp;
10266 ncx->blk_oldpm = cx->blk_oldpm;
10267 ncx->blk_gimme = cx->blk_gimme;
10268 switch (CxTYPE(cx)) {
10269 case CXt_SUB:
10270 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
10271 ? cv_dup_inc(cx->blk_sub.cv, param)
10272 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 10273 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 10274 ? av_dup_inc(cx->blk_sub.argarray, param)
7d49f689 10275 : NULL);
d2d73c3e 10276 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
10277 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
10278 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10279 ncx->blk_sub.lval = cx->blk_sub.lval;
f39bc417 10280 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
10281 break;
10282 case CXt_EVAL:
10283 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
10284 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 10285 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 10286 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 10287 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
f39bc417 10288 ncx->blk_eval.retop = cx->blk_eval.retop;
1d7c1841
GS
10289 break;
10290 case CXt_LOOP:
10291 ncx->blk_loop.label = cx->blk_loop.label;
10292 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
10293 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
10294 ncx->blk_loop.next_op = cx->blk_loop.next_op;
10295 ncx->blk_loop.last_op = cx->blk_loop.last_op;
10296 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
10297 ? cx->blk_loop.iterdata
d2d73c3e 10298 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
10299 ncx->blk_loop.oldcomppad
10300 = (PAD*)ptr_table_fetch(PL_ptr_table,
10301 cx->blk_loop.oldcomppad);
d2d73c3e
AB
10302 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
10303 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
10304 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
10305 ncx->blk_loop.iterix = cx->blk_loop.iterix;
10306 ncx->blk_loop.itermax = cx->blk_loop.itermax;
10307 break;
10308 case CXt_FORMAT:
d2d73c3e
AB
10309 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
10310 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
10311 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841 10312 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
f39bc417 10313 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
10314 break;
10315 case CXt_BLOCK:
10316 case CXt_NULL:
10317 break;
10318 }
10319 }
10320 --ix;
10321 }
10322 return ncxs;
10323}
10324
645c22ef
DM
10325/* duplicate a stack info structure */
10326
1d7c1841 10327PERL_SI *
a8fc9800 10328Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
10329{
10330 PERL_SI *nsi;
10331
10332 if (!si)
10333 return (PERL_SI*)NULL;
10334
10335 /* look for it in the table first */
10336 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
10337 if (nsi)
10338 return nsi;
10339
10340 /* create anew and remember what it is */
a02a5408 10341 Newxz(nsi, 1, PERL_SI);
1d7c1841
GS
10342 ptr_table_store(PL_ptr_table, si, nsi);
10343
d2d73c3e 10344 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
10345 nsi->si_cxix = si->si_cxix;
10346 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 10347 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 10348 nsi->si_type = si->si_type;
d2d73c3e
AB
10349 nsi->si_prev = si_dup(si->si_prev, param);
10350 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
10351 nsi->si_markoff = si->si_markoff;
10352
10353 return nsi;
10354}
10355
10356#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
10357#define TOPINT(ss,ix) ((ss)[ix].any_i32)
10358#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
10359#define TOPLONG(ss,ix) ((ss)[ix].any_long)
10360#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
10361#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
10362#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
10363#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
10364#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
10365#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
10366#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
10367#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
10368#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
10369#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
10370
10371/* XXXXX todo */
10372#define pv_dup_inc(p) SAVEPV(p)
10373#define pv_dup(p) SAVEPV(p)
10374#define svp_dup_inc(p,pp) any_dup(p,pp)
10375
645c22ef
DM
10376/* map any object to the new equivent - either something in the
10377 * ptr table, or something in the interpreter structure
10378 */
10379
1d7c1841 10380void *
53c1dcc0 10381Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
1d7c1841
GS
10382{
10383 void *ret;
10384
10385 if (!v)
10386 return (void*)NULL;
10387
10388 /* look for it in the table first */
10389 ret = ptr_table_fetch(PL_ptr_table, v);
10390 if (ret)
10391 return ret;
10392
10393 /* see if it is part of the interpreter structure */
10394 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 10395 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 10396 else {
1d7c1841 10397 ret = v;
05ec9bb3 10398 }
1d7c1841
GS
10399
10400 return ret;
10401}
10402
645c22ef
DM
10403/* duplicate the save stack */
10404
1d7c1841 10405ANY *
a8fc9800 10406Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841 10407{
53c1dcc0
AL
10408 ANY * const ss = proto_perl->Tsavestack;
10409 const I32 max = proto_perl->Tsavestack_max;
10410 I32 ix = proto_perl->Tsavestack_ix;
1d7c1841
GS
10411 ANY *nss;
10412 SV *sv;
10413 GV *gv;
10414 AV *av;
10415 HV *hv;
10416 void* ptr;
10417 int intval;
10418 long longval;
10419 GP *gp;
10420 IV iv;
c4e33207 10421 char *c = NULL;
1d7c1841 10422 void (*dptr) (void*);
acfe0abc 10423 void (*dxptr) (pTHX_ void*);
1d7c1841 10424
a02a5408 10425 Newxz(nss, max, ANY);
1d7c1841
GS
10426
10427 while (ix > 0) {
b464bac0 10428 I32 i = POPINT(ss,ix);
1d7c1841
GS
10429 TOPINT(nss,ix) = i;
10430 switch (i) {
10431 case SAVEt_ITEM: /* normal string */
a41cc44e 10432 case SAVEt_SV: /* scalar reference */
1d7c1841 10433 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10434 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10435 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10436 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10437 break;
05ec9bb3
NIS
10438 case SAVEt_SHARED_PVREF: /* char* in shared space */
10439 c = (char*)POPPTR(ss,ix);
10440 TOPPTR(nss,ix) = savesharedpv(c);
10441 ptr = POPPTR(ss,ix);
10442 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10443 break;
1d7c1841
GS
10444 case SAVEt_GENERIC_SVREF: /* generic sv */
10445 case SAVEt_SVREF: /* scalar reference */
10446 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10447 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10448 ptr = POPPTR(ss,ix);
10449 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
10450 break;
a41cc44e 10451 case SAVEt_HV: /* hash reference */
1d7c1841 10452 case SAVEt_AV: /* array reference */
337d28f5
NC
10453 sv = POPPTR(ss,ix);
10454 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10455 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10456 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10457 break;
10458 case SAVEt_INT: /* int reference */
10459 ptr = POPPTR(ss,ix);
10460 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10461 intval = (int)POPINT(ss,ix);
10462 TOPINT(nss,ix) = intval;
10463 break;
10464 case SAVEt_LONG: /* long reference */
10465 ptr = POPPTR(ss,ix);
10466 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10467 longval = (long)POPLONG(ss,ix);
10468 TOPLONG(nss,ix) = longval;
10469 break;
10470 case SAVEt_I32: /* I32 reference */
10471 case SAVEt_I16: /* I16 reference */
10472 case SAVEt_I8: /* I8 reference */
88effcc9 10473 case SAVEt_COP_ARYBASE: /* call CopARYBASE_set */
1d7c1841
GS
10474 ptr = POPPTR(ss,ix);
10475 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10476 i = POPINT(ss,ix);
10477 TOPINT(nss,ix) = i;
10478 break;
10479 case SAVEt_IV: /* IV reference */
10480 ptr = POPPTR(ss,ix);
10481 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10482 iv = POPIV(ss,ix);
10483 TOPIV(nss,ix) = iv;
10484 break;
a41cc44e
NC
10485 case SAVEt_HPTR: /* HV* reference */
10486 case SAVEt_APTR: /* AV* reference */
1d7c1841
GS
10487 case SAVEt_SPTR: /* SV* reference */
10488 ptr = POPPTR(ss,ix);
10489 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10490 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10491 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
10492 break;
10493 case SAVEt_VPTR: /* random* reference */
10494 ptr = POPPTR(ss,ix);
10495 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10496 ptr = POPPTR(ss,ix);
10497 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10498 break;
b03d03b0 10499 case SAVEt_GENERIC_PVREF: /* generic char* */
1d7c1841
GS
10500 case SAVEt_PPTR: /* char* reference */
10501 ptr = POPPTR(ss,ix);
10502 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10503 c = (char*)POPPTR(ss,ix);
10504 TOPPTR(nss,ix) = pv_dup(c);
10505 break;
1d7c1841
GS
10506 case SAVEt_NSTAB:
10507 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10508 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10509 break;
10510 case SAVEt_GP: /* scalar reference */
10511 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 10512 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
10513 (void)GpREFCNT_inc(gp);
10514 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 10515 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
10516 c = (char*)POPPTR(ss,ix);
10517 TOPPTR(nss,ix) = pv_dup(c);
10518 iv = POPIV(ss,ix);
10519 TOPIV(nss,ix) = iv;
10520 iv = POPIV(ss,ix);
10521 TOPIV(nss,ix) = iv;
10522 break;
10523 case SAVEt_FREESV:
26d9b02f 10524 case SAVEt_MORTALIZESV:
1d7c1841 10525 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10526 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10527 break;
10528 case SAVEt_FREEOP:
10529 ptr = POPPTR(ss,ix);
10530 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
10531 /* these are assumed to be refcounted properly */
53c1dcc0 10532 OP *o;
1d7c1841
GS
10533 switch (((OP*)ptr)->op_type) {
10534 case OP_LEAVESUB:
10535 case OP_LEAVESUBLV:
10536 case OP_LEAVEEVAL:
10537 case OP_LEAVE:
10538 case OP_SCOPE:
10539 case OP_LEAVEWRITE:
e977893f
GS
10540 TOPPTR(nss,ix) = ptr;
10541 o = (OP*)ptr;
10542 OpREFCNT_inc(o);
1d7c1841
GS
10543 break;
10544 default:
5f66b61c 10545 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
10546 break;
10547 }
10548 }
10549 else
5f66b61c 10550 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
10551 break;
10552 case SAVEt_FREEPV:
10553 c = (char*)POPPTR(ss,ix);
10554 TOPPTR(nss,ix) = pv_dup_inc(c);
10555 break;
10556 case SAVEt_CLEARSV:
10557 longval = POPLONG(ss,ix);
10558 TOPLONG(nss,ix) = longval;
10559 break;
10560 case SAVEt_DELETE:
10561 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10562 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10563 c = (char*)POPPTR(ss,ix);
10564 TOPPTR(nss,ix) = pv_dup_inc(c);
10565 i = POPINT(ss,ix);
10566 TOPINT(nss,ix) = i;
10567 break;
10568 case SAVEt_DESTRUCTOR:
10569 ptr = POPPTR(ss,ix);
10570 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10571 dptr = POPDPTR(ss,ix);
8141890a
JH
10572 TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
10573 any_dup(FPTR2DPTR(void *, dptr),
10574 proto_perl));
1d7c1841
GS
10575 break;
10576 case SAVEt_DESTRUCTOR_X:
10577 ptr = POPPTR(ss,ix);
10578 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10579 dxptr = POPDXPTR(ss,ix);
8141890a
JH
10580 TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
10581 any_dup(FPTR2DPTR(void *, dxptr),
10582 proto_perl));
1d7c1841
GS
10583 break;
10584 case SAVEt_REGCONTEXT:
10585 case SAVEt_ALLOC:
10586 i = POPINT(ss,ix);
10587 TOPINT(nss,ix) = i;
10588 ix -= i;
10589 break;
10590 case SAVEt_STACK_POS: /* Position on Perl stack */
10591 i = POPINT(ss,ix);
10592 TOPINT(nss,ix) = i;
10593 break;
10594 case SAVEt_AELEM: /* array element */
10595 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10596 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10597 i = POPINT(ss,ix);
10598 TOPINT(nss,ix) = i;
10599 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10600 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
10601 break;
10602 case SAVEt_HELEM: /* hash element */
10603 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10604 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10605 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10606 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10607 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10608 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10609 break;
10610 case SAVEt_OP:
10611 ptr = POPPTR(ss,ix);
10612 TOPPTR(nss,ix) = ptr;
10613 break;
10614 case SAVEt_HINTS:
10615 i = POPINT(ss,ix);
10616 TOPINT(nss,ix) = i;
b3ca2e83 10617 ptr = POPPTR(ss,ix);
080ac856 10618 if (ptr) {
7b6dd8c3 10619 HINTS_REFCNT_LOCK;
080ac856 10620 ((struct refcounted_he *)ptr)->refcounted_he_refcnt++;
7b6dd8c3
NC
10621 HINTS_REFCNT_UNLOCK;
10622 }
cbb1fbea 10623 TOPPTR(nss,ix) = ptr;
a8f8b6a7
NC
10624 if (i & HINT_LOCALIZE_HH) {
10625 hv = (HV*)POPPTR(ss,ix);
10626 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
10627 }
1d7c1841 10628 break;
c4410b1b
GS
10629 case SAVEt_COMPPAD:
10630 av = (AV*)POPPTR(ss,ix);
58ed4fbe 10631 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 10632 break;
c3564e5c
GS
10633 case SAVEt_PADSV:
10634 longval = (long)POPLONG(ss,ix);
10635 TOPLONG(nss,ix) = longval;
10636 ptr = POPPTR(ss,ix);
10637 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10638 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10639 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 10640 break;
a1bb4754 10641 case SAVEt_BOOL:
38d8b13e 10642 ptr = POPPTR(ss,ix);
b9609c01 10643 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 10644 longval = (long)POPBOOL(ss,ix);
b9609c01 10645 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 10646 break;
8bd2680e
MHM
10647 case SAVEt_SET_SVFLAGS:
10648 i = POPINT(ss,ix);
10649 TOPINT(nss,ix) = i;
10650 i = POPINT(ss,ix);
10651 TOPINT(nss,ix) = i;
10652 sv = (SV*)POPPTR(ss,ix);
10653 TOPPTR(nss,ix) = sv_dup(sv, param);
10654 break;
5bfb7d0e
NC
10655 case SAVEt_RE_STATE:
10656 {
10657 const struct re_save_state *const old_state
10658 = (struct re_save_state *)
10659 (ss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
10660 struct re_save_state *const new_state
10661 = (struct re_save_state *)
10662 (nss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
10663
10664 Copy(old_state, new_state, 1, struct re_save_state);
10665 ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
10666
10667 new_state->re_state_bostr
10668 = pv_dup(old_state->re_state_bostr);
10669 new_state->re_state_reginput
10670 = pv_dup(old_state->re_state_reginput);
5bfb7d0e
NC
10671 new_state->re_state_regeol
10672 = pv_dup(old_state->re_state_regeol);
10673 new_state->re_state_regstartp
10674 = any_dup(old_state->re_state_regstartp, proto_perl);
10675 new_state->re_state_regendp
10676 = any_dup(old_state->re_state_regendp, proto_perl);
10677 new_state->re_state_reglastparen
10678 = any_dup(old_state->re_state_reglastparen, proto_perl);
10679 new_state->re_state_reglastcloseparen
10680 = any_dup(old_state->re_state_reglastcloseparen,
10681 proto_perl);
5bfb7d0e
NC
10682 /* XXX This just has to be broken. The old save_re_context
10683 code did SAVEGENERICPV(PL_reg_start_tmp);
10684 PL_reg_start_tmp is char **.
10685 Look above to what the dup code does for
10686 SAVEt_GENERIC_PVREF
10687 It can never have worked.
10688 So this is merely a faithful copy of the exiting bug: */
10689 new_state->re_state_reg_start_tmp
10690 = (char **) pv_dup((char *)
10691 old_state->re_state_reg_start_tmp);
10692 /* I assume that it only ever "worked" because no-one called
10693 (pseudo)fork while the regexp engine had re-entered itself.
10694 */
5bfb7d0e
NC
10695#ifdef PERL_OLD_COPY_ON_WRITE
10696 new_state->re_state_nrs
10697 = sv_dup(old_state->re_state_nrs, param);
10698#endif
10699 new_state->re_state_reg_magic
10700 = any_dup(old_state->re_state_reg_magic, proto_perl);
10701 new_state->re_state_reg_oldcurpm
10702 = any_dup(old_state->re_state_reg_oldcurpm, proto_perl);
10703 new_state->re_state_reg_curpm
10704 = any_dup(old_state->re_state_reg_curpm, proto_perl);
10705 new_state->re_state_reg_oldsaved
10706 = pv_dup(old_state->re_state_reg_oldsaved);
10707 new_state->re_state_reg_poscache
10708 = pv_dup(old_state->re_state_reg_poscache);
5bfb7d0e
NC
10709 new_state->re_state_reg_starttry
10710 = pv_dup(old_state->re_state_reg_starttry);
5bfb7d0e
NC
10711 break;
10712 }
68da3b2f
NC
10713 case SAVEt_COMPILE_WARNINGS:
10714 ptr = POPPTR(ss,ix);
10715 TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
7b6dd8c3 10716 break;
1d7c1841 10717 default:
ca05af4a 10718 Perl_croak(aTHX_ "panic: ss_dup inconsistency (%"IVdf")", (IV) i);
1d7c1841
GS
10719 }
10720 }
10721
bd81e77b
NC
10722 return nss;
10723}
10724
10725
10726/* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
10727 * flag to the result. This is done for each stash before cloning starts,
10728 * so we know which stashes want their objects cloned */
10729
10730static void
10731do_mark_cloneable_stash(pTHX_ SV *sv)
10732{
10733 const HEK * const hvname = HvNAME_HEK((HV*)sv);
10734 if (hvname) {
10735 GV* const cloner = gv_fetchmethod_autoload((HV*)sv, "CLONE_SKIP", 0);
10736 SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
10737 if (cloner && GvCV(cloner)) {
10738 dSP;
10739 UV status;
10740
10741 ENTER;
10742 SAVETMPS;
10743 PUSHMARK(SP);
10744 XPUSHs(sv_2mortal(newSVhek(hvname)));
10745 PUTBACK;
10746 call_sv((SV*)GvCV(cloner), G_SCALAR);
10747 SPAGAIN;
10748 status = POPu;
10749 PUTBACK;
10750 FREETMPS;
10751 LEAVE;
10752 if (status)
10753 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
10754 }
10755 }
10756}
10757
10758
10759
10760/*
10761=for apidoc perl_clone
10762
10763Create and return a new interpreter by cloning the current one.
10764
10765perl_clone takes these flags as parameters:
10766
10767CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
10768without it we only clone the data and zero the stacks,
10769with it we copy the stacks and the new perl interpreter is
10770ready to run at the exact same point as the previous one.
10771The pseudo-fork code uses COPY_STACKS while the
10772threads->new doesn't.
10773
10774CLONEf_KEEP_PTR_TABLE
10775perl_clone keeps a ptr_table with the pointer of the old
10776variable as a key and the new variable as a value,
10777this allows it to check if something has been cloned and not
10778clone it again but rather just use the value and increase the
10779refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
10780the ptr_table using the function
10781C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
10782reason to keep it around is if you want to dup some of your own
10783variable who are outside the graph perl scans, example of this
10784code is in threads.xs create
10785
10786CLONEf_CLONE_HOST
10787This is a win32 thing, it is ignored on unix, it tells perls
10788win32host code (which is c++) to clone itself, this is needed on
10789win32 if you want to run two threads at the same time,
10790if you just want to do some stuff in a separate perl interpreter
10791and then throw it away and return to the original one,
10792you don't need to do anything.
10793
10794=cut
10795*/
10796
10797/* XXX the above needs expanding by someone who actually understands it ! */
10798EXTERN_C PerlInterpreter *
10799perl_clone_host(PerlInterpreter* proto_perl, UV flags);
10800
10801PerlInterpreter *
10802perl_clone(PerlInterpreter *proto_perl, UV flags)
10803{
10804 dVAR;
10805#ifdef PERL_IMPLICIT_SYS
10806
10807 /* perlhost.h so we need to call into it
10808 to clone the host, CPerlHost should have a c interface, sky */
10809
10810 if (flags & CLONEf_CLONE_HOST) {
10811 return perl_clone_host(proto_perl,flags);
10812 }
10813 return perl_clone_using(proto_perl, flags,
10814 proto_perl->IMem,
10815 proto_perl->IMemShared,
10816 proto_perl->IMemParse,
10817 proto_perl->IEnv,
10818 proto_perl->IStdIO,
10819 proto_perl->ILIO,
10820 proto_perl->IDir,
10821 proto_perl->ISock,
10822 proto_perl->IProc);
10823}
10824
10825PerlInterpreter *
10826perl_clone_using(PerlInterpreter *proto_perl, UV flags,
10827 struct IPerlMem* ipM, struct IPerlMem* ipMS,
10828 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
10829 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
10830 struct IPerlDir* ipD, struct IPerlSock* ipS,
10831 struct IPerlProc* ipP)
10832{
10833 /* XXX many of the string copies here can be optimized if they're
10834 * constants; they need to be allocated as common memory and just
10835 * their pointers copied. */
10836
10837 IV i;
10838 CLONE_PARAMS clone_params;
5f66b61c 10839 CLONE_PARAMS* const param = &clone_params;
bd81e77b 10840
5f66b61c 10841 PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
bd81e77b
NC
10842 /* for each stash, determine whether its objects should be cloned */
10843 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
10844 PERL_SET_THX(my_perl);
10845
10846# ifdef DEBUGGING
7e337ee0 10847 PoisonNew(my_perl, 1, PerlInterpreter);
5f66b61c
AL
10848 PL_op = NULL;
10849 PL_curcop = NULL;
bd81e77b
NC
10850 PL_markstack = 0;
10851 PL_scopestack = 0;
10852 PL_savestack = 0;
10853 PL_savestack_ix = 0;
10854 PL_savestack_max = -1;
10855 PL_sig_pending = 0;
10856 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
10857# else /* !DEBUGGING */
10858 Zero(my_perl, 1, PerlInterpreter);
10859# endif /* DEBUGGING */
10860
10861 /* host pointers */
10862 PL_Mem = ipM;
10863 PL_MemShared = ipMS;
10864 PL_MemParse = ipMP;
10865 PL_Env = ipE;
10866 PL_StdIO = ipStd;
10867 PL_LIO = ipLIO;
10868 PL_Dir = ipD;
10869 PL_Sock = ipS;
10870 PL_Proc = ipP;
10871#else /* !PERL_IMPLICIT_SYS */
10872 IV i;
10873 CLONE_PARAMS clone_params;
10874 CLONE_PARAMS* param = &clone_params;
5f66b61c 10875 PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
bd81e77b
NC
10876 /* for each stash, determine whether its objects should be cloned */
10877 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
10878 PERL_SET_THX(my_perl);
10879
10880# ifdef DEBUGGING
7e337ee0 10881 PoisonNew(my_perl, 1, PerlInterpreter);
5f66b61c
AL
10882 PL_op = NULL;
10883 PL_curcop = NULL;
bd81e77b
NC
10884 PL_markstack = 0;
10885 PL_scopestack = 0;
10886 PL_savestack = 0;
10887 PL_savestack_ix = 0;
10888 PL_savestack_max = -1;
10889 PL_sig_pending = 0;
10890 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
10891# else /* !DEBUGGING */
10892 Zero(my_perl, 1, PerlInterpreter);
10893# endif /* DEBUGGING */
10894#endif /* PERL_IMPLICIT_SYS */
10895 param->flags = flags;
10896 param->proto_perl = proto_perl;
10897
7cb608b5
NC
10898 INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
10899
fdda85ca 10900 PL_body_arenas = NULL;
bd81e77b
NC
10901 Zero(&PL_body_roots, 1, PL_body_roots);
10902
10903 PL_nice_chunk = NULL;
10904 PL_nice_chunk_size = 0;
10905 PL_sv_count = 0;
10906 PL_sv_objcount = 0;
a0714e2c
SS
10907 PL_sv_root = NULL;
10908 PL_sv_arenaroot = NULL;
bd81e77b
NC
10909
10910 PL_debug = proto_perl->Idebug;
10911
10912 PL_hash_seed = proto_perl->Ihash_seed;
10913 PL_rehash_seed = proto_perl->Irehash_seed;
10914
10915#ifdef USE_REENTRANT_API
10916 /* XXX: things like -Dm will segfault here in perlio, but doing
10917 * PERL_SET_CONTEXT(proto_perl);
10918 * breaks too many other things
10919 */
10920 Perl_reentrant_init(aTHX);
10921#endif
10922
10923 /* create SV map for pointer relocation */
10924 PL_ptr_table = ptr_table_new();
10925
10926 /* initialize these special pointers as early as possible */
10927 SvANY(&PL_sv_undef) = NULL;
10928 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
10929 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
10930 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
10931
10932 SvANY(&PL_sv_no) = new_XPVNV();
10933 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
10934 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
10935 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
bb7a0f54 10936 SvPV_set(&PL_sv_no, savepvn(PL_No, 0));
bd81e77b
NC
10937 SvCUR_set(&PL_sv_no, 0);
10938 SvLEN_set(&PL_sv_no, 1);
10939 SvIV_set(&PL_sv_no, 0);
10940 SvNV_set(&PL_sv_no, 0);
10941 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
10942
10943 SvANY(&PL_sv_yes) = new_XPVNV();
10944 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
10945 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
10946 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
bb7a0f54 10947 SvPV_set(&PL_sv_yes, savepvn(PL_Yes, 1));
bd81e77b
NC
10948 SvCUR_set(&PL_sv_yes, 1);
10949 SvLEN_set(&PL_sv_yes, 2);
10950 SvIV_set(&PL_sv_yes, 1);
10951 SvNV_set(&PL_sv_yes, 1);
10952 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
10953
10954 /* create (a non-shared!) shared string table */
10955 PL_strtab = newHV();
10956 HvSHAREKEYS_off(PL_strtab);
10957 hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
10958 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
10959
10960 PL_compiling = proto_perl->Icompiling;
10961
10962 /* These two PVs will be free'd special way so must set them same way op.c does */
10963 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
10964 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
10965
10966 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
10967 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
10968
10969 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
72dc9ed5 10970 PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
bd81e77b
NC
10971 if (!specialCopIO(PL_compiling.cop_io))
10972 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
cbb1fbea
NC
10973 if (PL_compiling.cop_hints) {
10974 HINTS_REFCNT_LOCK;
10975 PL_compiling.cop_hints->refcounted_he_refcnt++;
10976 HINTS_REFCNT_UNLOCK;
10977 }
bd81e77b
NC
10978 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
10979
10980 /* pseudo environmental stuff */
10981 PL_origargc = proto_perl->Iorigargc;
10982 PL_origargv = proto_perl->Iorigargv;
10983
10984 param->stashes = newAV(); /* Setup array of objects to call clone on */
10985
10986 /* Set tainting stuff before PerlIO_debug can possibly get called */
10987 PL_tainting = proto_perl->Itainting;
10988 PL_taint_warn = proto_perl->Itaint_warn;
10989
10990#ifdef PERLIO_LAYERS
10991 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
10992 PerlIO_clone(aTHX_ proto_perl, param);
10993#endif
10994
10995 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
10996 PL_incgv = gv_dup(proto_perl->Iincgv, param);
10997 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
10998 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
10999 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
11000 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
11001
11002 /* switches */
11003 PL_minus_c = proto_perl->Iminus_c;
11004 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
11005 PL_localpatches = proto_perl->Ilocalpatches;
11006 PL_splitstr = proto_perl->Isplitstr;
11007 PL_preprocess = proto_perl->Ipreprocess;
11008 PL_minus_n = proto_perl->Iminus_n;
11009 PL_minus_p = proto_perl->Iminus_p;
11010 PL_minus_l = proto_perl->Iminus_l;
11011 PL_minus_a = proto_perl->Iminus_a;
bc9b29db 11012 PL_minus_E = proto_perl->Iminus_E;
bd81e77b
NC
11013 PL_minus_F = proto_perl->Iminus_F;
11014 PL_doswitches = proto_perl->Idoswitches;
11015 PL_dowarn = proto_perl->Idowarn;
11016 PL_doextract = proto_perl->Idoextract;
11017 PL_sawampersand = proto_perl->Isawampersand;
11018 PL_unsafe = proto_perl->Iunsafe;
11019 PL_inplace = SAVEPV(proto_perl->Iinplace);
11020 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
11021 PL_perldb = proto_perl->Iperldb;
11022 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
11023 PL_exit_flags = proto_perl->Iexit_flags;
11024
11025 /* magical thingies */
11026 /* XXX time(&PL_basetime) when asked for? */
11027 PL_basetime = proto_perl->Ibasetime;
11028 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
11029
11030 PL_maxsysfd = proto_perl->Imaxsysfd;
bd81e77b
NC
11031 PL_statusvalue = proto_perl->Istatusvalue;
11032#ifdef VMS
11033 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
11034#else
11035 PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
11036#endif
11037 PL_encoding = sv_dup(proto_perl->Iencoding, param);
11038
11039 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
11040 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
11041 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
11042
11043 /* Clone the regex array */
11044 PL_regex_padav = newAV();
11045 {
11046 const I32 len = av_len((AV*)proto_perl->Iregex_padav);
7a5b473e 11047 SV* const * const regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
bd81e77b 11048 IV i;
7f466ec7 11049 av_push(PL_regex_padav, sv_dup_inc_NN(regexen[0],param));
bd81e77b 11050 for(i = 1; i <= len; i++) {
7a5b473e
AL
11051 const SV * const regex = regexen[i];
11052 SV * const sv =
11053 SvREPADTMP(regex)
11054 ? sv_dup_inc(regex, param)
11055 : SvREFCNT_inc(
11056 newSViv(PTR2IV(re_dup(
11057 INT2PTR(REGEXP *, SvIVX(regex)), param))))
11058 ;
11059 av_push(PL_regex_padav, sv);
bd81e77b
NC
11060 }
11061 }
11062 PL_regex_pad = AvARRAY(PL_regex_padav);
11063
11064 /* shortcuts to various I/O objects */
11065 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
11066 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
11067 PL_defgv = gv_dup(proto_perl->Idefgv, param);
11068 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
11069 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
11070 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841 11071
bd81e77b
NC
11072 /* shortcuts to regexp stuff */
11073 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
9660f481 11074
bd81e77b
NC
11075 /* shortcuts to misc objects */
11076 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
9660f481 11077
bd81e77b
NC
11078 /* shortcuts to debugging objects */
11079 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
11080 PL_DBline = gv_dup(proto_perl->IDBline, param);
11081 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
11082 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
11083 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
11084 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
11085 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
11086 PL_lineary = av_dup(proto_perl->Ilineary, param);
11087 PL_dbargs = av_dup(proto_perl->Idbargs, param);
9660f481 11088
bd81e77b
NC
11089 /* symbol tables */
11090 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
11091 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
11092 PL_debstash = hv_dup(proto_perl->Idebstash, param);
11093 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
11094 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
11095
11096 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
11097 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
11098 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
11099 PL_endav = av_dup_inc(proto_perl->Iendav, param);
11100 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
11101 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
11102
11103 PL_sub_generation = proto_perl->Isub_generation;
11104
11105 /* funky return mechanisms */
11106 PL_forkprocess = proto_perl->Iforkprocess;
11107
11108 /* subprocess state */
11109 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
11110
11111 /* internal state */
11112 PL_maxo = proto_perl->Imaxo;
11113 if (proto_perl->Iop_mask)
11114 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11115 else
bd61b366 11116 PL_op_mask = NULL;
bd81e77b
NC
11117 /* PL_asserting = proto_perl->Iasserting; */
11118
11119 /* current interpreter roots */
11120 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
11121 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
11122 PL_main_start = proto_perl->Imain_start;
11123 PL_eval_root = proto_perl->Ieval_root;
11124 PL_eval_start = proto_perl->Ieval_start;
11125
11126 /* runtime control stuff */
11127 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
11128 PL_copline = proto_perl->Icopline;
11129
11130 PL_filemode = proto_perl->Ifilemode;
11131 PL_lastfd = proto_perl->Ilastfd;
11132 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
11133 PL_Argv = NULL;
bd61b366 11134 PL_Cmd = NULL;
bd81e77b
NC
11135 PL_gensym = proto_perl->Igensym;
11136 PL_preambled = proto_perl->Ipreambled;
11137 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
11138 PL_laststatval = proto_perl->Ilaststatval;
11139 PL_laststype = proto_perl->Ilaststype;
a0714e2c 11140 PL_mess_sv = NULL;
bd81e77b
NC
11141
11142 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
11143
11144 /* interpreter atexit processing */
11145 PL_exitlistlen = proto_perl->Iexitlistlen;
11146 if (PL_exitlistlen) {
11147 Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11148 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
9660f481 11149 }
bd81e77b
NC
11150 else
11151 PL_exitlist = (PerlExitListEntry*)NULL;
f16dd614
DM
11152
11153 PL_my_cxt_size = proto_perl->Imy_cxt_size;
4c901e72 11154 if (PL_my_cxt_size) {
f16dd614
DM
11155 Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
11156 Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
11157 }
11158 else
11159 PL_my_cxt_list = (void**)NULL;
bd81e77b
NC
11160 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
11161 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
11162 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
11163
11164 PL_profiledata = NULL;
11165 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
11166 /* PL_rsfp_filters entries have fake IoDIRP() */
11167 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
9660f481 11168
bd81e77b 11169 PL_compcv = cv_dup(proto_perl->Icompcv, param);
9660f481 11170
bd81e77b 11171 PAD_CLONE_VARS(proto_perl, param);
9660f481 11172
bd81e77b
NC
11173#ifdef HAVE_INTERP_INTERN
11174 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11175#endif
645c22ef 11176
bd81e77b
NC
11177 /* more statics moved here */
11178 PL_generation = proto_perl->Igeneration;
11179 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
645c22ef 11180
bd81e77b
NC
11181 PL_in_clean_objs = proto_perl->Iin_clean_objs;
11182 PL_in_clean_all = proto_perl->Iin_clean_all;
6a78b4db 11183
bd81e77b
NC
11184 PL_uid = proto_perl->Iuid;
11185 PL_euid = proto_perl->Ieuid;
11186 PL_gid = proto_perl->Igid;
11187 PL_egid = proto_perl->Iegid;
11188 PL_nomemok = proto_perl->Inomemok;
11189 PL_an = proto_perl->Ian;
11190 PL_evalseq = proto_perl->Ievalseq;
11191 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
11192 PL_origalen = proto_perl->Iorigalen;
11193#ifdef PERL_USES_PL_PIDSTATUS
11194 PL_pidstatus = newHV(); /* XXX flag for cloning? */
11195#endif
11196 PL_osname = SAVEPV(proto_perl->Iosname);
11197 PL_sighandlerp = proto_perl->Isighandlerp;
6a78b4db 11198
bd81e77b 11199 PL_runops = proto_perl->Irunops;
6a78b4db 11200
bd81e77b 11201 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
6a78b4db 11202
bd81e77b
NC
11203#ifdef CSH
11204 PL_cshlen = proto_perl->Icshlen;
11205 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
11206#endif
645c22ef 11207
bd81e77b
NC
11208 PL_lex_state = proto_perl->Ilex_state;
11209 PL_lex_defer = proto_perl->Ilex_defer;
11210 PL_lex_expect = proto_perl->Ilex_expect;
11211 PL_lex_formbrack = proto_perl->Ilex_formbrack;
11212 PL_lex_dojoin = proto_perl->Ilex_dojoin;
11213 PL_lex_starts = proto_perl->Ilex_starts;
11214 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
11215 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
11216 PL_lex_op = proto_perl->Ilex_op;
11217 PL_lex_inpat = proto_perl->Ilex_inpat;
11218 PL_lex_inwhat = proto_perl->Ilex_inwhat;
11219 PL_lex_brackets = proto_perl->Ilex_brackets;
11220 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
11221 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
11222 PL_lex_casemods = proto_perl->Ilex_casemods;
11223 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
11224 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
645c22ef 11225
5db06880
NC
11226#ifdef PERL_MAD
11227 Copy(proto_perl->Inexttoke, PL_nexttoke, 5, NEXTTOKE);
11228 PL_lasttoke = proto_perl->Ilasttoke;
5336380d
NC
11229 PL_realtokenstart = proto_perl->Irealtokenstart;
11230 PL_faketokens = proto_perl->Ifaketokens;
11231 PL_thismad = proto_perl->Ithismad;
11232 PL_thistoken = proto_perl->Ithistoken;
11233 PL_thisopen = proto_perl->Ithisopen;
11234 PL_thisstuff = proto_perl->Ithisstuff;
11235 PL_thisclose = proto_perl->Ithisclose;
11236 PL_thiswhite = proto_perl->Ithiswhite;
11237 PL_nextwhite = proto_perl->Inextwhite;
11238 PL_skipwhite = proto_perl->Iskipwhite;
11239 PL_endwhite = proto_perl->Iendwhite;
11240 PL_curforce = proto_perl->Icurforce;
5db06880 11241#else
bd81e77b
NC
11242 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
11243 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
11244 PL_nexttoke = proto_perl->Inexttoke;
5db06880 11245#endif
c43294b8 11246
bd81e77b
NC
11247 /* XXX This is probably masking the deeper issue of why
11248 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
11249 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
11250 * (A little debugging with a watchpoint on it may help.)
11251 */
11252 if (SvANY(proto_perl->Ilinestr)) {
11253 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
11254 i = proto_perl->Ibufptr - SvPVX_const(proto_perl->Ilinestr);
11255 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11256 i = proto_perl->Ioldbufptr - SvPVX_const(proto_perl->Ilinestr);
11257 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11258 i = proto_perl->Ioldoldbufptr - SvPVX_const(proto_perl->Ilinestr);
11259 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11260 i = proto_perl->Ilinestart - SvPVX_const(proto_perl->Ilinestr);
11261 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11262 }
11263 else {
561b68a9 11264 PL_linestr = newSV(79);
bd81e77b
NC
11265 sv_upgrade(PL_linestr,SVt_PVIV);
11266 sv_setpvn(PL_linestr,"",0);
11267 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
11268 }
11269 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
11270 PL_pending_ident = proto_perl->Ipending_ident;
11271 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
11272
11273 PL_expect = proto_perl->Iexpect;
11274
11275 PL_multi_start = proto_perl->Imulti_start;
11276 PL_multi_end = proto_perl->Imulti_end;
11277 PL_multi_open = proto_perl->Imulti_open;
11278 PL_multi_close = proto_perl->Imulti_close;
11279
11280 PL_error_count = proto_perl->Ierror_count;
11281 PL_subline = proto_perl->Isubline;
11282 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
c43294b8 11283
bd81e77b
NC
11284 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
11285 if (SvANY(proto_perl->Ilinestr)) {
11286 i = proto_perl->Ilast_uni - SvPVX_const(proto_perl->Ilinestr);
11287 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11288 i = proto_perl->Ilast_lop - SvPVX_const(proto_perl->Ilinestr);
11289 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11290 PL_last_lop_op = proto_perl->Ilast_lop_op;
11291 }
11292 else {
11293 PL_last_uni = SvPVX(PL_linestr);
11294 PL_last_lop = SvPVX(PL_linestr);
11295 PL_last_lop_op = 0;
11296 }
11297 PL_in_my = proto_perl->Iin_my;
11298 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
11299#ifdef FCRYPT
11300 PL_cryptseen = proto_perl->Icryptseen;
11301#endif
1d7c1841 11302
bd81e77b 11303 PL_hints = proto_perl->Ihints;
1d7c1841 11304
bd81e77b 11305 PL_amagic_generation = proto_perl->Iamagic_generation;
d2d73c3e 11306
bd81e77b
NC
11307#ifdef USE_LOCALE_COLLATE
11308 PL_collation_ix = proto_perl->Icollation_ix;
11309 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
11310 PL_collation_standard = proto_perl->Icollation_standard;
11311 PL_collxfrm_base = proto_perl->Icollxfrm_base;
11312 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
11313#endif /* USE_LOCALE_COLLATE */
1d7c1841 11314
bd81e77b
NC
11315#ifdef USE_LOCALE_NUMERIC
11316 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
11317 PL_numeric_standard = proto_perl->Inumeric_standard;
11318 PL_numeric_local = proto_perl->Inumeric_local;
11319 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
11320#endif /* !USE_LOCALE_NUMERIC */
1d7c1841 11321
bd81e77b
NC
11322 /* utf8 character classes */
11323 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
11324 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
11325 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
11326 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
11327 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
11328 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
11329 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
11330 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
11331 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
11332 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
11333 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
11334 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
11335 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
11336 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
11337 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
11338 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
11339 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
11340 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
11341 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
11342 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 11343
bd81e77b
NC
11344 /* Did the locale setup indicate UTF-8? */
11345 PL_utf8locale = proto_perl->Iutf8locale;
11346 /* Unicode features (see perlrun/-C) */
11347 PL_unicode = proto_perl->Iunicode;
1d7c1841 11348
bd81e77b
NC
11349 /* Pre-5.8 signals control */
11350 PL_signals = proto_perl->Isignals;
1d7c1841 11351
bd81e77b
NC
11352 /* times() ticks per second */
11353 PL_clocktick = proto_perl->Iclocktick;
1d7c1841 11354
bd81e77b
NC
11355 /* Recursion stopper for PerlIO_find_layer */
11356 PL_in_load_module = proto_perl->Iin_load_module;
8df990a8 11357
bd81e77b
NC
11358 /* sort() routine */
11359 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
e5dd39fc 11360
bd81e77b
NC
11361 /* Not really needed/useful since the reenrant_retint is "volatile",
11362 * but do it for consistency's sake. */
11363 PL_reentrant_retint = proto_perl->Ireentrant_retint;
1d7c1841 11364
bd81e77b
NC
11365 /* Hooks to shared SVs and locks. */
11366 PL_sharehook = proto_perl->Isharehook;
11367 PL_lockhook = proto_perl->Ilockhook;
11368 PL_unlockhook = proto_perl->Iunlockhook;
11369 PL_threadhook = proto_perl->Ithreadhook;
1d7c1841 11370
bd81e77b
NC
11371 PL_runops_std = proto_perl->Irunops_std;
11372 PL_runops_dbg = proto_perl->Irunops_dbg;
1d7c1841 11373
bd81e77b
NC
11374#ifdef THREADS_HAVE_PIDS
11375 PL_ppid = proto_perl->Ippid;
11376#endif
1d7c1841 11377
bd81e77b 11378 /* swatch cache */
5c284bb0 11379 PL_last_swash_hv = NULL; /* reinits on demand */
bd81e77b
NC
11380 PL_last_swash_klen = 0;
11381 PL_last_swash_key[0]= '\0';
11382 PL_last_swash_tmps = (U8*)NULL;
11383 PL_last_swash_slen = 0;
1d7c1841 11384
bd81e77b
NC
11385 PL_glob_index = proto_perl->Iglob_index;
11386 PL_srand_called = proto_perl->Isrand_called;
11387 PL_uudmap['M'] = 0; /* reinits on demand */
bd61b366 11388 PL_bitcount = NULL; /* reinits on demand */
05ec9bb3 11389
bd81e77b
NC
11390 if (proto_perl->Ipsig_pend) {
11391 Newxz(PL_psig_pend, SIG_SIZE, int);
11392 }
11393 else {
11394 PL_psig_pend = (int*)NULL;
11395 }
05ec9bb3 11396
bd81e77b
NC
11397 if (proto_perl->Ipsig_ptr) {
11398 Newxz(PL_psig_ptr, SIG_SIZE, SV*);
11399 Newxz(PL_psig_name, SIG_SIZE, SV*);
11400 for (i = 1; i < SIG_SIZE; i++) {
11401 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
11402 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
11403 }
11404 }
11405 else {
11406 PL_psig_ptr = (SV**)NULL;
11407 PL_psig_name = (SV**)NULL;
11408 }
05ec9bb3 11409
bd81e77b 11410 /* thrdvar.h stuff */
1d7c1841 11411
bd81e77b
NC
11412 if (flags & CLONEf_COPY_STACKS) {
11413 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
11414 PL_tmps_ix = proto_perl->Ttmps_ix;
11415 PL_tmps_max = proto_perl->Ttmps_max;
11416 PL_tmps_floor = proto_perl->Ttmps_floor;
11417 Newxz(PL_tmps_stack, PL_tmps_max, SV*);
11418 i = 0;
11419 while (i <= PL_tmps_ix) {
11420 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
11421 ++i;
11422 }
d2d73c3e 11423
bd81e77b
NC
11424 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
11425 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
11426 Newxz(PL_markstack, i, I32);
11427 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
11428 - proto_perl->Tmarkstack);
11429 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
11430 - proto_perl->Tmarkstack);
11431 Copy(proto_perl->Tmarkstack, PL_markstack,
11432 PL_markstack_ptr - PL_markstack + 1, I32);
d2d73c3e 11433
bd81e77b
NC
11434 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
11435 * NOTE: unlike the others! */
11436 PL_scopestack_ix = proto_perl->Tscopestack_ix;
11437 PL_scopestack_max = proto_perl->Tscopestack_max;
11438 Newxz(PL_scopestack, PL_scopestack_max, I32);
11439 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
d419787a 11440
bd81e77b
NC
11441 /* NOTE: si_dup() looks at PL_markstack */
11442 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
d2d73c3e 11443
bd81e77b
NC
11444 /* PL_curstack = PL_curstackinfo->si_stack; */
11445 PL_curstack = av_dup(proto_perl->Tcurstack, param);
11446 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841 11447
bd81e77b
NC
11448 /* next PUSHs() etc. set *(PL_stack_sp+1) */
11449 PL_stack_base = AvARRAY(PL_curstack);
11450 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
11451 - proto_perl->Tstack_base);
11452 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
1d7c1841 11453
bd81e77b
NC
11454 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
11455 * NOTE: unlike the others! */
11456 PL_savestack_ix = proto_perl->Tsavestack_ix;
11457 PL_savestack_max = proto_perl->Tsavestack_max;
11458 /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
11459 PL_savestack = ss_dup(proto_perl, param);
11460 }
11461 else {
11462 init_stacks();
11463 ENTER; /* perl_destruct() wants to LEAVE; */
34394ecd
DM
11464
11465 /* although we're not duplicating the tmps stack, we should still
11466 * add entries for any SVs on the tmps stack that got cloned by a
11467 * non-refcount means (eg a temp in @_); otherwise they will be
11468 * orphaned
11469 */
11470 for (i = 0; i<= proto_perl->Ttmps_ix; i++) {
6136c704 11471 SV * const nsv = (SV*)ptr_table_fetch(PL_ptr_table,
34394ecd
DM
11472 proto_perl->Ttmps_stack[i]);
11473 if (nsv && !SvREFCNT(nsv)) {
11474 EXTEND_MORTAL(1);
b37c2d43 11475 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple(nsv);
34394ecd
DM
11476 }
11477 }
bd81e77b 11478 }
1d7c1841 11479
bd81e77b
NC
11480 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
11481 PL_top_env = &PL_start_env;
1d7c1841 11482
bd81e77b 11483 PL_op = proto_perl->Top;
4a4c6fe3 11484
a0714e2c 11485 PL_Sv = NULL;
bd81e77b
NC
11486 PL_Xpv = (XPV*)NULL;
11487 PL_na = proto_perl->Tna;
1fcf4c12 11488
bd81e77b
NC
11489 PL_statbuf = proto_perl->Tstatbuf;
11490 PL_statcache = proto_perl->Tstatcache;
11491 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
11492 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
11493#ifdef HAS_TIMES
11494 PL_timesbuf = proto_perl->Ttimesbuf;
11495#endif
1d7c1841 11496
bd81e77b
NC
11497 PL_tainted = proto_perl->Ttainted;
11498 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
11499 PL_rs = sv_dup_inc(proto_perl->Trs, param);
11500 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
11501 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
11502 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
11503 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
11504 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
11505 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
11506 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841 11507
bd81e77b
NC
11508 PL_restartop = proto_perl->Trestartop;
11509 PL_in_eval = proto_perl->Tin_eval;
11510 PL_delaymagic = proto_perl->Tdelaymagic;
11511 PL_dirty = proto_perl->Tdirty;
11512 PL_localizing = proto_perl->Tlocalizing;
1d7c1841 11513
bd81e77b 11514 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
4608196e 11515 PL_hv_fetch_ent_mh = NULL;
bd81e77b 11516 PL_modcount = proto_perl->Tmodcount;
5f66b61c 11517 PL_lastgotoprobe = NULL;
bd81e77b 11518 PL_dumpindent = proto_perl->Tdumpindent;
1d7c1841 11519
bd81e77b
NC
11520 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
11521 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
11522 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
11523 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
bd61b366 11524 PL_efloatbuf = NULL; /* reinits on demand */
bd81e77b 11525 PL_efloatsize = 0; /* reinits on demand */
d2d73c3e 11526
bd81e77b 11527 /* regex stuff */
1d7c1841 11528
bd81e77b
NC
11529 PL_screamfirst = NULL;
11530 PL_screamnext = NULL;
11531 PL_maxscream = -1; /* reinits on demand */
a0714e2c 11532 PL_lastscream = NULL;
1d7c1841 11533
bd81e77b 11534 PL_watchaddr = NULL;
bd61b366 11535 PL_watchok = NULL;
1d7c1841 11536
bd81e77b 11537 PL_regdummy = proto_perl->Tregdummy;
bd81e77b
NC
11538 PL_colorset = 0; /* reinits PL_colors[] */
11539 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841 11540
bd81e77b
NC
11541 /* RE engine - function pointers */
11542 PL_regcompp = proto_perl->Tregcompp;
11543 PL_regexecp = proto_perl->Tregexecp;
11544 PL_regint_start = proto_perl->Tregint_start;
11545 PL_regint_string = proto_perl->Tregint_string;
11546 PL_regfree = proto_perl->Tregfree;
46ab3289 11547 Zero(&PL_reg_state, 1, struct re_save_state);
bd81e77b 11548 PL_reginterp_cnt = 0;
5d9a96ca 11549 PL_regmatch_slab = NULL;
1d7c1841 11550
bd81e77b
NC
11551 /* Pluggable optimizer */
11552 PL_peepp = proto_perl->Tpeepp;
1d7c1841 11553
bd81e77b 11554 PL_stashcache = newHV();
1d7c1841 11555
bd81e77b
NC
11556 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
11557 ptr_table_free(PL_ptr_table);
11558 PL_ptr_table = NULL;
11559 }
1d7c1841 11560
bd81e77b
NC
11561 /* Call the ->CLONE method, if it exists, for each of the stashes
11562 identified by sv_dup() above.
11563 */
11564 while(av_len(param->stashes) != -1) {
11565 HV* const stash = (HV*) av_shift(param->stashes);
11566 GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
11567 if (cloner && GvCV(cloner)) {
11568 dSP;
11569 ENTER;
11570 SAVETMPS;
11571 PUSHMARK(SP);
11572 XPUSHs(sv_2mortal(newSVhek(HvNAME_HEK(stash))));
11573 PUTBACK;
11574 call_sv((SV*)GvCV(cloner), G_DISCARD);
11575 FREETMPS;
11576 LEAVE;
11577 }
1d7c1841 11578 }
1d7c1841 11579
bd81e77b 11580 SvREFCNT_dec(param->stashes);
1d7c1841 11581
bd81e77b
NC
11582 /* orphaned? eg threads->new inside BEGIN or use */
11583 if (PL_compcv && ! SvREFCNT(PL_compcv)) {
b37c2d43 11584 SvREFCNT_inc_simple_void(PL_compcv);
bd81e77b
NC
11585 SAVEFREESV(PL_compcv);
11586 }
dd2155a4 11587
bd81e77b
NC
11588 return my_perl;
11589}
1d7c1841 11590
bd81e77b 11591#endif /* USE_ITHREADS */
1d7c1841 11592
bd81e77b
NC
11593/*
11594=head1 Unicode Support
1d7c1841 11595
bd81e77b 11596=for apidoc sv_recode_to_utf8
1d7c1841 11597
bd81e77b
NC
11598The encoding is assumed to be an Encode object, on entry the PV
11599of the sv is assumed to be octets in that encoding, and the sv
11600will be converted into Unicode (and UTF-8).
1d7c1841 11601
bd81e77b
NC
11602If the sv already is UTF-8 (or if it is not POK), or if the encoding
11603is not a reference, nothing is done to the sv. If the encoding is not
11604an C<Encode::XS> Encoding object, bad things will happen.
11605(See F<lib/encoding.pm> and L<Encode>).
1d7c1841 11606
bd81e77b 11607The PV of the sv is returned.
1d7c1841 11608
bd81e77b 11609=cut */
1d7c1841 11610
bd81e77b
NC
11611char *
11612Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
11613{
11614 dVAR;
11615 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
11616 SV *uni;
11617 STRLEN len;
11618 const char *s;
11619 dSP;
11620 ENTER;
11621 SAVETMPS;
11622 save_re_context();
11623 PUSHMARK(sp);
11624 EXTEND(SP, 3);
11625 XPUSHs(encoding);
11626 XPUSHs(sv);
11627/*
11628 NI-S 2002/07/09
11629 Passing sv_yes is wrong - it needs to be or'ed set of constants
11630 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
11631 remove converted chars from source.
1d7c1841 11632
bd81e77b 11633 Both will default the value - let them.
1d7c1841 11634
bd81e77b
NC
11635 XPUSHs(&PL_sv_yes);
11636*/
11637 PUTBACK;
11638 call_method("decode", G_SCALAR);
11639 SPAGAIN;
11640 uni = POPs;
11641 PUTBACK;
11642 s = SvPV_const(uni, len);
11643 if (s != SvPVX_const(sv)) {
11644 SvGROW(sv, len + 1);
11645 Move(s, SvPVX(sv), len + 1, char);
11646 SvCUR_set(sv, len);
11647 }
11648 FREETMPS;
11649 LEAVE;
11650 SvUTF8_on(sv);
11651 return SvPVX(sv);
389edf32 11652 }
bd81e77b
NC
11653 return SvPOKp(sv) ? SvPVX(sv) : NULL;
11654}
1d7c1841 11655
bd81e77b
NC
11656/*
11657=for apidoc sv_cat_decode
1d7c1841 11658
bd81e77b
NC
11659The encoding is assumed to be an Encode object, the PV of the ssv is
11660assumed to be octets in that encoding and decoding the input starts
11661from the position which (PV + *offset) pointed to. The dsv will be
11662concatenated the decoded UTF-8 string from ssv. Decoding will terminate
11663when the string tstr appears in decoding output or the input ends on
11664the PV of the ssv. The value which the offset points will be modified
11665to the last input position on the ssv.
1d7c1841 11666
bd81e77b 11667Returns TRUE if the terminator was found, else returns FALSE.
1d7c1841 11668
bd81e77b
NC
11669=cut */
11670
11671bool
11672Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
11673 SV *ssv, int *offset, char *tstr, int tlen)
11674{
11675 dVAR;
11676 bool ret = FALSE;
11677 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
11678 SV *offsv;
11679 dSP;
11680 ENTER;
11681 SAVETMPS;
11682 save_re_context();
11683 PUSHMARK(sp);
11684 EXTEND(SP, 6);
11685 XPUSHs(encoding);
11686 XPUSHs(dsv);
11687 XPUSHs(ssv);
11688 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
11689 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
11690 PUTBACK;
11691 call_method("cat_decode", G_SCALAR);
11692 SPAGAIN;
11693 ret = SvTRUE(TOPs);
11694 *offset = SvIV(offsv);
11695 PUTBACK;
11696 FREETMPS;
11697 LEAVE;
389edf32 11698 }
bd81e77b
NC
11699 else
11700 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
11701 return ret;
1d7c1841 11702
bd81e77b 11703}
1d7c1841 11704
bd81e77b
NC
11705/* ---------------------------------------------------------------------
11706 *
11707 * support functions for report_uninit()
11708 */
1d7c1841 11709
bd81e77b
NC
11710/* the maxiumum size of array or hash where we will scan looking
11711 * for the undefined element that triggered the warning */
1d7c1841 11712
bd81e77b 11713#define FUV_MAX_SEARCH_SIZE 1000
1d7c1841 11714
bd81e77b
NC
11715/* Look for an entry in the hash whose value has the same SV as val;
11716 * If so, return a mortal copy of the key. */
1d7c1841 11717
bd81e77b
NC
11718STATIC SV*
11719S_find_hash_subscript(pTHX_ HV *hv, SV* val)
11720{
11721 dVAR;
11722 register HE **array;
11723 I32 i;
6c3182a5 11724
bd81e77b
NC
11725 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
11726 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
a0714e2c 11727 return NULL;
6c3182a5 11728
bd81e77b 11729 array = HvARRAY(hv);
6c3182a5 11730
bd81e77b
NC
11731 for (i=HvMAX(hv); i>0; i--) {
11732 register HE *entry;
11733 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
11734 if (HeVAL(entry) != val)
11735 continue;
11736 if ( HeVAL(entry) == &PL_sv_undef ||
11737 HeVAL(entry) == &PL_sv_placeholder)
11738 continue;
11739 if (!HeKEY(entry))
a0714e2c 11740 return NULL;
bd81e77b
NC
11741 if (HeKLEN(entry) == HEf_SVKEY)
11742 return sv_mortalcopy(HeKEY_sv(entry));
11743 return sv_2mortal(newSVpvn(HeKEY(entry), HeKLEN(entry)));
11744 }
11745 }
a0714e2c 11746 return NULL;
bd81e77b 11747}
6c3182a5 11748
bd81e77b
NC
11749/* Look for an entry in the array whose value has the same SV as val;
11750 * If so, return the index, otherwise return -1. */
6c3182a5 11751
bd81e77b
NC
11752STATIC I32
11753S_find_array_subscript(pTHX_ AV *av, SV* val)
11754{
97aff369 11755 dVAR;
bd81e77b
NC
11756 SV** svp;
11757 I32 i;
11758 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
11759 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
11760 return -1;
57c6e6d2 11761
bd81e77b
NC
11762 svp = AvARRAY(av);
11763 for (i=AvFILLp(av); i>=0; i--) {
11764 if (svp[i] == val && svp[i] != &PL_sv_undef)
11765 return i;
11766 }
11767 return -1;
11768}
15a5279a 11769
bd81e77b
NC
11770/* S_varname(): return the name of a variable, optionally with a subscript.
11771 * If gv is non-zero, use the name of that global, along with gvtype (one
11772 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
11773 * targ. Depending on the value of the subscript_type flag, return:
11774 */
bce260cd 11775
bd81e77b
NC
11776#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
11777#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
11778#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
11779#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
bce260cd 11780
bd81e77b
NC
11781STATIC SV*
11782S_varname(pTHX_ GV *gv, const char gvtype, PADOFFSET targ,
11783 SV* keyname, I32 aindex, int subscript_type)
11784{
1d7c1841 11785
bd81e77b
NC
11786 SV * const name = sv_newmortal();
11787 if (gv) {
11788 char buffer[2];
11789 buffer[0] = gvtype;
11790 buffer[1] = 0;
1d7c1841 11791
bd81e77b 11792 /* as gv_fullname4(), but add literal '^' for $^FOO names */
66fe0623 11793
bd81e77b 11794 gv_fullname4(name, gv, buffer, 0);
1d7c1841 11795
bd81e77b
NC
11796 if ((unsigned int)SvPVX(name)[1] <= 26) {
11797 buffer[0] = '^';
11798 buffer[1] = SvPVX(name)[1] + 'A' - 1;
1d7c1841 11799
bd81e77b
NC
11800 /* Swap the 1 unprintable control character for the 2 byte pretty
11801 version - ie substr($name, 1, 1) = $buffer; */
11802 sv_insert(name, 1, 1, buffer, 2);
1d7c1841 11803 }
bd81e77b
NC
11804 }
11805 else {
11806 U32 unused;
11807 CV * const cv = find_runcv(&unused);
11808 SV *sv;
11809 AV *av;
1d7c1841 11810
bd81e77b 11811 if (!cv || !CvPADLIST(cv))
a0714e2c 11812 return NULL;
bd81e77b
NC
11813 av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
11814 sv = *av_fetch(av, targ, FALSE);
11815 /* SvLEN in a pad name is not to be trusted */
11816 sv_setpv(name, SvPV_nolen_const(sv));
11817 }
1d7c1841 11818
bd81e77b 11819 if (subscript_type == FUV_SUBSCRIPT_HASH) {
561b68a9 11820 SV * const sv = newSV(0);
bd81e77b
NC
11821 *SvPVX(name) = '$';
11822 Perl_sv_catpvf(aTHX_ name, "{%s}",
11823 pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
11824 SvREFCNT_dec(sv);
11825 }
11826 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
11827 *SvPVX(name) = '$';
11828 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
11829 }
11830 else if (subscript_type == FUV_SUBSCRIPT_WITHIN)
89529cee 11831 Perl_sv_insert(aTHX_ name, 0, 0, STR_WITH_LEN("within "));
1d7c1841 11832
bd81e77b
NC
11833 return name;
11834}
1d7c1841 11835
1d7c1841 11836
bd81e77b
NC
11837/*
11838=for apidoc find_uninit_var
1d7c1841 11839
bd81e77b
NC
11840Find the name of the undefined variable (if any) that caused the operator o
11841to issue a "Use of uninitialized value" warning.
11842If match is true, only return a name if it's value matches uninit_sv.
11843So roughly speaking, if a unary operator (such as OP_COS) generates a
11844warning, then following the direct child of the op may yield an
11845OP_PADSV or OP_GV that gives the name of the undefined variable. On the
11846other hand, with OP_ADD there are two branches to follow, so we only print
11847the variable name if we get an exact match.
1d7c1841 11848
bd81e77b 11849The name is returned as a mortal SV.
1d7c1841 11850
bd81e77b
NC
11851Assumes that PL_op is the op that originally triggered the error, and that
11852PL_comppad/PL_curpad points to the currently executing pad.
1d7c1841 11853
bd81e77b
NC
11854=cut
11855*/
1d7c1841 11856
bd81e77b
NC
11857STATIC SV *
11858S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
11859{
11860 dVAR;
11861 SV *sv;
11862 AV *av;
11863 GV *gv;
11864 OP *o, *o2, *kid;
1d7c1841 11865
bd81e77b
NC
11866 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
11867 uninit_sv == &PL_sv_placeholder)))
a0714e2c 11868 return NULL;
1d7c1841 11869
bd81e77b 11870 switch (obase->op_type) {
1d7c1841 11871
bd81e77b
NC
11872 case OP_RV2AV:
11873 case OP_RV2HV:
11874 case OP_PADAV:
11875 case OP_PADHV:
11876 {
11877 const bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
11878 const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
11879 I32 index = 0;
a0714e2c 11880 SV *keysv = NULL;
bd81e77b 11881 int subscript_type = FUV_SUBSCRIPT_WITHIN;
1d7c1841 11882
bd81e77b
NC
11883 if (pad) { /* @lex, %lex */
11884 sv = PAD_SVl(obase->op_targ);
a0714e2c 11885 gv = NULL;
bd81e77b
NC
11886 }
11887 else {
11888 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
11889 /* @global, %global */
11890 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
11891 if (!gv)
11892 break;
11893 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
11894 }
11895 else /* @{expr}, %{expr} */
11896 return find_uninit_var(cUNOPx(obase)->op_first,
11897 uninit_sv, match);
11898 }
1d7c1841 11899
bd81e77b
NC
11900 /* attempt to find a match within the aggregate */
11901 if (hash) {
d4c19fe8 11902 keysv = find_hash_subscript((HV*)sv, uninit_sv);
bd81e77b
NC
11903 if (keysv)
11904 subscript_type = FUV_SUBSCRIPT_HASH;
11905 }
11906 else {
e15d5972 11907 index = find_array_subscript((AV*)sv, uninit_sv);
bd81e77b
NC
11908 if (index >= 0)
11909 subscript_type = FUV_SUBSCRIPT_ARRAY;
11910 }
1d7c1841 11911
bd81e77b
NC
11912 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
11913 break;
1d7c1841 11914
bd81e77b
NC
11915 return varname(gv, hash ? '%' : '@', obase->op_targ,
11916 keysv, index, subscript_type);
11917 }
1d7c1841 11918
bd81e77b
NC
11919 case OP_PADSV:
11920 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
11921 break;
a0714e2c
SS
11922 return varname(NULL, '$', obase->op_targ,
11923 NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 11924
bd81e77b
NC
11925 case OP_GVSV:
11926 gv = cGVOPx_gv(obase);
11927 if (!gv || (match && GvSV(gv) != uninit_sv))
11928 break;
a0714e2c 11929 return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 11930
bd81e77b
NC
11931 case OP_AELEMFAST:
11932 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
11933 if (match) {
11934 SV **svp;
11935 av = (AV*)PAD_SV(obase->op_targ);
11936 if (!av || SvRMAGICAL(av))
11937 break;
11938 svp = av_fetch(av, (I32)obase->op_private, FALSE);
11939 if (!svp || *svp != uninit_sv)
11940 break;
11941 }
a0714e2c
SS
11942 return varname(NULL, '$', obase->op_targ,
11943 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11944 }
11945 else {
11946 gv = cGVOPx_gv(obase);
11947 if (!gv)
11948 break;
11949 if (match) {
11950 SV **svp;
11951 av = GvAV(gv);
11952 if (!av || SvRMAGICAL(av))
11953 break;
11954 svp = av_fetch(av, (I32)obase->op_private, FALSE);
11955 if (!svp || *svp != uninit_sv)
11956 break;
11957 }
11958 return varname(gv, '$', 0,
a0714e2c 11959 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11960 }
11961 break;
1d7c1841 11962
bd81e77b
NC
11963 case OP_EXISTS:
11964 o = cUNOPx(obase)->op_first;
11965 if (!o || o->op_type != OP_NULL ||
11966 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
11967 break;
11968 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
a2efc822 11969
bd81e77b
NC
11970 case OP_AELEM:
11971 case OP_HELEM:
11972 if (PL_op == obase)
11973 /* $a[uninit_expr] or $h{uninit_expr} */
11974 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
081fc587 11975
a0714e2c 11976 gv = NULL;
bd81e77b
NC
11977 o = cBINOPx(obase)->op_first;
11978 kid = cBINOPx(obase)->op_last;
8cf8f3d1 11979
bd81e77b 11980 /* get the av or hv, and optionally the gv */
a0714e2c 11981 sv = NULL;
bd81e77b
NC
11982 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
11983 sv = PAD_SV(o->op_targ);
11984 }
11985 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
11986 && cUNOPo->op_first->op_type == OP_GV)
11987 {
11988 gv = cGVOPx_gv(cUNOPo->op_first);
11989 if (!gv)
11990 break;
11991 sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
11992 }
11993 if (!sv)
11994 break;
11995
11996 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
11997 /* index is constant */
11998 if (match) {
11999 if (SvMAGICAL(sv))
12000 break;
12001 if (obase->op_type == OP_HELEM) {
12002 HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
12003 if (!he || HeVAL(he) != uninit_sv)
12004 break;
12005 }
12006 else {
00b6aa41 12007 SV * const * const svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
bd81e77b
NC
12008 if (!svp || *svp != uninit_sv)
12009 break;
12010 }
12011 }
12012 if (obase->op_type == OP_HELEM)
12013 return varname(gv, '%', o->op_targ,
12014 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
12015 else
a0714e2c 12016 return varname(gv, '@', o->op_targ, NULL,
bd81e77b 12017 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
12018 }
12019 else {
12020 /* index is an expression;
12021 * attempt to find a match within the aggregate */
12022 if (obase->op_type == OP_HELEM) {
d4c19fe8 12023 SV * const keysv = find_hash_subscript((HV*)sv, uninit_sv);
bd81e77b
NC
12024 if (keysv)
12025 return varname(gv, '%', o->op_targ,
12026 keysv, 0, FUV_SUBSCRIPT_HASH);
12027 }
12028 else {
d4c19fe8 12029 const I32 index = find_array_subscript((AV*)sv, uninit_sv);
bd81e77b
NC
12030 if (index >= 0)
12031 return varname(gv, '@', o->op_targ,
a0714e2c 12032 NULL, index, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
12033 }
12034 if (match)
12035 break;
12036 return varname(gv,
12037 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
12038 ? '@' : '%',
a0714e2c 12039 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
f284b03f 12040 }
bd81e77b 12041 break;
dc507217 12042
bd81e77b
NC
12043 case OP_AASSIGN:
12044 /* only examine RHS */
12045 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
6d26897e 12046
bd81e77b
NC
12047 case OP_OPEN:
12048 o = cUNOPx(obase)->op_first;
12049 if (o->op_type == OP_PUSHMARK)
12050 o = o->op_sibling;
1d7c1841 12051
bd81e77b
NC
12052 if (!o->op_sibling) {
12053 /* one-arg version of open is highly magical */
a0ae6670 12054
bd81e77b
NC
12055 if (o->op_type == OP_GV) { /* open FOO; */
12056 gv = cGVOPx_gv(o);
12057 if (match && GvSV(gv) != uninit_sv)
12058 break;
12059 return varname(gv, '$', 0,
a0714e2c 12060 NULL, 0, FUV_SUBSCRIPT_NONE);
bd81e77b
NC
12061 }
12062 /* other possibilities not handled are:
12063 * open $x; or open my $x; should return '${*$x}'
12064 * open expr; should return '$'.expr ideally
12065 */
12066 break;
12067 }
12068 goto do_op;
ccfc67b7 12069
bd81e77b
NC
12070 /* ops where $_ may be an implicit arg */
12071 case OP_TRANS:
12072 case OP_SUBST:
12073 case OP_MATCH:
12074 if ( !(obase->op_flags & OPf_STACKED)) {
12075 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
12076 ? PAD_SVl(obase->op_targ)
12077 : DEFSV))
12078 {
12079 sv = sv_newmortal();
12080 sv_setpvn(sv, "$_", 2);
12081 return sv;
12082 }
12083 }
12084 goto do_op;
9f4817db 12085
bd81e77b
NC
12086 case OP_PRTF:
12087 case OP_PRINT:
12088 /* skip filehandle as it can't produce 'undef' warning */
12089 o = cUNOPx(obase)->op_first;
12090 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
12091 o = o->op_sibling->op_sibling;
12092 goto do_op2;
9f4817db 12093
9f4817db 12094
bd81e77b
NC
12095 case OP_RV2SV:
12096 case OP_CUSTOM:
12097 case OP_ENTERSUB:
12098 match = 1; /* XS or custom code could trigger random warnings */
12099 goto do_op;
9f4817db 12100
bd81e77b
NC
12101 case OP_SCHOMP:
12102 case OP_CHOMP:
12103 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
396482e1 12104 return sv_2mortal(newSVpvs("${$/}"));
5f66b61c 12105 /*FALLTHROUGH*/
5d170f3a 12106
bd81e77b
NC
12107 default:
12108 do_op:
12109 if (!(obase->op_flags & OPf_KIDS))
12110 break;
12111 o = cUNOPx(obase)->op_first;
12112
12113 do_op2:
12114 if (!o)
12115 break;
f9893866 12116
bd81e77b
NC
12117 /* if all except one arg are constant, or have no side-effects,
12118 * or are optimized away, then it's unambiguous */
5f66b61c 12119 o2 = NULL;
bd81e77b 12120 for (kid=o; kid; kid = kid->op_sibling) {
e15d5972
AL
12121 if (kid) {
12122 const OPCODE type = kid->op_type;
12123 if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
12124 || (type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
12125 || (type == OP_PUSHMARK)
bd81e77b 12126 )
bd81e77b 12127 continue;
e15d5972 12128 }
bd81e77b 12129 if (o2) { /* more than one found */
5f66b61c 12130 o2 = NULL;
bd81e77b
NC
12131 break;
12132 }
12133 o2 = kid;
12134 }
12135 if (o2)
12136 return find_uninit_var(o2, uninit_sv, match);
7a5fa8a2 12137
bd81e77b
NC
12138 /* scan all args */
12139 while (o) {
12140 sv = find_uninit_var(o, uninit_sv, 1);
12141 if (sv)
12142 return sv;
12143 o = o->op_sibling;
d0063567 12144 }
bd81e77b 12145 break;
f9893866 12146 }
a0714e2c 12147 return NULL;
9f4817db
JH
12148}
12149
220e2d4e 12150
bd81e77b
NC
12151/*
12152=for apidoc report_uninit
68795e93 12153
bd81e77b 12154Print appropriate "Use of uninitialized variable" warning
220e2d4e 12155
bd81e77b
NC
12156=cut
12157*/
220e2d4e 12158
bd81e77b
NC
12159void
12160Perl_report_uninit(pTHX_ SV* uninit_sv)
220e2d4e 12161{
97aff369 12162 dVAR;
bd81e77b 12163 if (PL_op) {
a0714e2c 12164 SV* varname = NULL;
bd81e77b
NC
12165 if (uninit_sv) {
12166 varname = find_uninit_var(PL_op, uninit_sv,0);
12167 if (varname)
12168 sv_insert(varname, 0, 0, " ", 1);
12169 }
12170 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
12171 varname ? SvPV_nolen_const(varname) : "",
12172 " in ", OP_DESC(PL_op));
220e2d4e 12173 }
a73e8557 12174 else
bd81e77b
NC
12175 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
12176 "", "", "");
220e2d4e 12177}
f9893866 12178
241d1a3b
NC
12179/*
12180 * Local variables:
12181 * c-indentation-style: bsd
12182 * c-basic-offset: 4
12183 * indent-tabs-mode: t
12184 * End:
12185 *
37442d52
RGS
12186 * ex: set ts=8 sts=4 sw=4 noet:
12187 */