This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perldiag.pod additions to go with change #26602.
[perl5.git] / sv.c
CommitLineData
a0d0e21e 1/* sv.c
79072805 2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
b94e2f88 4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others
79072805
LW
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
a0d0e21e 9 * "I wonder what the Entish is for 'yes' and 'no'," he thought.
645c22ef
DM
10 *
11 *
5e045b90
AMS
12 * This file contains the code that creates, manipulates and destroys
13 * scalar values (SVs). The other types (AV, HV, GV, etc.) reuse the
14 * structure of an SV, so their creation and destruction is handled
15 * here; higher-level functions are in av.c, hv.c, and so on. Opcode
16 * level functions (eg. substr, split, join) for each of the types are
17 * in the pp*.c files.
79072805
LW
18 */
19
20#include "EXTERN.h"
864dbfa3 21#define PERL_IN_SV_C
79072805 22#include "perl.h"
d2f185dc 23#include "regcomp.h"
79072805 24
51371543 25#define FCALL *f
2c5424a7 26
2f8ed50e
OS
27#ifdef __Lynx__
28/* Missing proto on LynxOS */
29 char *gconvert(double, int, int, char *);
30#endif
31
e23c8137
JH
32#ifdef PERL_UTF8_CACHE_ASSERT
33/* The cache element 0 is the Unicode offset;
34 * the cache element 1 is the byte offset of the element 0;
35 * the cache element 2 is the Unicode length of the substring;
36 * the cache element 3 is the byte length of the substring;
37 * The checking of the substring side would be good
38 * but substr() has enough code paths to make my head spin;
39 * if adding more checks watch out for the following tests:
40 * t/op/index.t t/op/length.t t/op/pat.t t/op/substr.t
41 * lib/utf8.t lib/Unicode/Collate/t/index.t
42 * --jhi
43 */
44#define ASSERT_UTF8_CACHE(cache) \
45 STMT_START { if (cache) { assert((cache)[0] <= (cache)[1]); } } STMT_END
46#else
47#define ASSERT_UTF8_CACHE(cache) NOOP
48#endif
49
f8c7b90f 50#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 51#define SV_COW_NEXT_SV(sv) INT2PTR(SV *,SvUVX(sv))
607fa7f2 52#define SV_COW_NEXT_SV_SET(current,next) SvUV_set(current, PTR2UV(next))
b5ccf5f2 53/* This is a pessimistic view. Scalar must be purely a read-write PV to copy-
765f542d 54 on-write. */
765f542d 55#endif
645c22ef
DM
56
57/* ============================================================================
58
59=head1 Allocation and deallocation of SVs.
60
5e045b90
AMS
61An SV (or AV, HV, etc.) is allocated in two parts: the head (struct sv,
62av, hv...) contains type and reference count information, as well as a
63pointer to the body (struct xrv, xpv, xpviv...), which contains fields
64specific to each type.
65
93e68bfb
JC
66In all but the most memory-paranoid configuations (ex: PURIFY), this
67allocation is done using arenas, which by default are approximately 4K
68chunks of memory parcelled up into N heads or bodies (of same size).
69Sv-bodies are allocated by their sv-type, guaranteeing size
70consistency needed to allocate safely from arrays.
71
72The first slot in each arena is reserved, and is used to hold a link
73to the next arena. In the case of heads, the unused first slot also
74contains some flags and a note of the number of slots. Snaked through
75each arena chain is a linked list of free items; when this becomes
76empty, an extra arena is allocated and divided up into N items which
77are threaded into the free list.
645c22ef
DM
78
79The following global variables are associated with arenas:
80
81 PL_sv_arenaroot pointer to list of SV arenas
82 PL_sv_root pointer to list of free SV structures
83
93e68bfb
JC
84 PL_body_arenaroots[] array of pointers to list of arenas, 1 per svtype
85 PL_body_roots[] array of pointers to list of free bodies of svtype
86 arrays are indexed by the svtype needed
645c22ef 87
93e68bfb
JC
88Note that some of the larger and more rarely used body types (eg
89xpvio) are not allocated using arenas, but are instead just
90malloc()/free()ed as required.
91
92In addition, a few SV heads are not allocated from an arena, but are
93instead directly created as static or auto variables, eg PL_sv_undef.
94The size of arenas can be changed from the default by setting
95PERL_ARENA_SIZE appropriately at compile time.
645c22ef
DM
96
97The SV arena serves the secondary purpose of allowing still-live SVs
98to be located and destroyed during final cleanup.
99
100At the lowest level, the macros new_SV() and del_SV() grab and free
101an SV head. (If debugging with -DD, del_SV() calls the function S_del_sv()
102to return the SV to the free list with error checking.) new_SV() calls
103more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
104SVs in the free list have their SvTYPE field set to all ones.
105
106Similarly, there are macros new_XIV()/del_XIV(), new_XNV()/del_XNV() etc
107that allocate and return individual body types. Normally these are mapped
ff276b08
RG
108to the arena-manipulating functions new_xiv()/del_xiv() etc, but may be
109instead mapped directly to malloc()/free() if PURIFY is defined. The
645c22ef
DM
110new/del functions remove from, or add to, the appropriate PL_foo_root
111list, and call more_xiv() etc to add a new arena if the list is empty.
112
ff276b08 113At the time of very final cleanup, sv_free_arenas() is called from
645c22ef 114perl_destruct() to physically free all the arenas allocated since the
6a93a7e5 115start of the interpreter.
645c22ef
DM
116
117Manipulation of any of the PL_*root pointers is protected by enclosing
118LOCK_SV_MUTEX; ... UNLOCK_SV_MUTEX calls which should Do the Right Thing
119if threads are enabled.
120
121The function visit() scans the SV arenas list, and calls a specified
122function for each SV it finds which is still live - ie which has an SvTYPE
123other than all 1's, and a non-zero SvREFCNT. visit() is used by the
124following functions (specified as [function that calls visit()] / [function
125called by visit() for each SV]):
126
127 sv_report_used() / do_report_used()
f2524eef 128 dump all remaining SVs (debugging aid)
645c22ef
DM
129
130 sv_clean_objs() / do_clean_objs(),do_clean_named_objs()
131 Attempt to free all objects pointed to by RVs,
132 and, unless DISABLE_DESTRUCTOR_KLUDGE is defined,
133 try to do the same for all objects indirectly
134 referenced by typeglobs too. Called once from
135 perl_destruct(), prior to calling sv_clean_all()
136 below.
137
138 sv_clean_all() / do_clean_all()
139 SvREFCNT_dec(sv) each remaining SV, possibly
140 triggering an sv_free(). It also sets the
141 SVf_BREAK flag on the SV to indicate that the
142 refcnt has been artificially lowered, and thus
143 stopping sv_free() from giving spurious warnings
144 about SVs which unexpectedly have a refcnt
145 of zero. called repeatedly from perl_destruct()
146 until there are no SVs left.
147
93e68bfb 148=head2 Arena allocator API Summary
645c22ef
DM
149
150Private API to rest of sv.c
151
152 new_SV(), del_SV(),
153
154 new_XIV(), del_XIV(),
155 new_XNV(), del_XNV(),
156 etc
157
158Public API:
159
8cf8f3d1 160 sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
645c22ef
DM
161
162
163=cut
164
165============================================================================ */
166
167
51371543 168
4561caa4
CS
169/*
170 * "A time to plant, and a time to uproot what was planted..."
171 */
172
77354fb4
NC
173/*
174 * nice_chunk and nice_chunk size need to be set
175 * and queried under the protection of sv_mutex
176 */
177void
178Perl_offer_nice_chunk(pTHX_ void *chunk, U32 chunk_size)
179{
180 void *new_chunk;
181 U32 new_chunk_size;
182 LOCK_SV_MUTEX;
183 new_chunk = (void *)(chunk);
184 new_chunk_size = (chunk_size);
185 if (new_chunk_size > PL_nice_chunk_size) {
186 Safefree(PL_nice_chunk);
187 PL_nice_chunk = (char *) new_chunk;
188 PL_nice_chunk_size = new_chunk_size;
189 } else {
190 Safefree(chunk);
191 }
192 UNLOCK_SV_MUTEX;
193}
cac9b346 194
fd0854ff 195#ifdef DEBUG_LEAKING_SCALARS
22162ca8 196# define FREE_SV_DEBUG_FILE(sv) Safefree((sv)->sv_debug_file)
fd0854ff
DM
197#else
198# define FREE_SV_DEBUG_FILE(sv)
199#endif
200
48614a46
NC
201#ifdef PERL_POISON
202# define SvARENA_CHAIN(sv) ((sv)->sv_u.svu_rv)
203/* Whilst I'd love to do this, it seems that things like to check on
204 unreferenced scalars
205# define POSION_SV_HEAD(sv) Poison(sv, 1, struct STRUCT_SV)
206*/
207# define POSION_SV_HEAD(sv) Poison(&SvANY(sv), 1, void *), \
208 Poison(&SvREFCNT(sv), 1, U32)
209#else
210# define SvARENA_CHAIN(sv) SvANY(sv)
211# define POSION_SV_HEAD(sv)
212#endif
213
053fc874
GS
214#define plant_SV(p) \
215 STMT_START { \
fd0854ff 216 FREE_SV_DEBUG_FILE(p); \
48614a46
NC
217 POSION_SV_HEAD(p); \
218 SvARENA_CHAIN(p) = (void *)PL_sv_root; \
053fc874
GS
219 SvFLAGS(p) = SVTYPEMASK; \
220 PL_sv_root = (p); \
221 --PL_sv_count; \
222 } STMT_END
a0d0e21e 223
fba3b22e 224/* sv_mutex must be held while calling uproot_SV() */
053fc874
GS
225#define uproot_SV(p) \
226 STMT_START { \
227 (p) = PL_sv_root; \
48614a46 228 PL_sv_root = (SV*)SvARENA_CHAIN(p); \
053fc874
GS
229 ++PL_sv_count; \
230 } STMT_END
231
645c22ef 232
cac9b346
NC
233/* make some more SVs by adding another arena */
234
235/* sv_mutex must be held while calling more_sv() */
236STATIC SV*
237S_more_sv(pTHX)
238{
239 SV* sv;
240
241 if (PL_nice_chunk) {
242 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
243 PL_nice_chunk = Nullch;
244 PL_nice_chunk_size = 0;
245 }
246 else {
247 char *chunk; /* must use New here to match call to */
a02a5408 248 Newx(chunk,PERL_ARENA_SIZE,char); /* Safefree() in sv_free_arenas() */
2e7ed132 249 sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
cac9b346
NC
250 }
251 uproot_SV(sv);
252 return sv;
253}
254
645c22ef
DM
255/* new_SV(): return a new, empty SV head */
256
eba0f806
DM
257#ifdef DEBUG_LEAKING_SCALARS
258/* provide a real function for a debugger to play with */
259STATIC SV*
260S_new_SV(pTHX)
261{
262 SV* sv;
263
264 LOCK_SV_MUTEX;
265 if (PL_sv_root)
266 uproot_SV(sv);
267 else
cac9b346 268 sv = S_more_sv(aTHX);
eba0f806
DM
269 UNLOCK_SV_MUTEX;
270 SvANY(sv) = 0;
271 SvREFCNT(sv) = 1;
272 SvFLAGS(sv) = 0;
fd0854ff
DM
273 sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
274 sv->sv_debug_line = (U16) ((PL_copline == NOLINE) ?
275 (PL_curcop ? CopLINE(PL_curcop) : 0) : PL_copline);
276 sv->sv_debug_inpad = 0;
277 sv->sv_debug_cloned = 0;
fd0854ff 278 sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
fd0854ff 279
eba0f806
DM
280 return sv;
281}
282# define new_SV(p) (p)=S_new_SV(aTHX)
283
284#else
285# define new_SV(p) \
053fc874
GS
286 STMT_START { \
287 LOCK_SV_MUTEX; \
288 if (PL_sv_root) \
289 uproot_SV(p); \
290 else \
cac9b346 291 (p) = S_more_sv(aTHX); \
053fc874
GS
292 UNLOCK_SV_MUTEX; \
293 SvANY(p) = 0; \
294 SvREFCNT(p) = 1; \
295 SvFLAGS(p) = 0; \
296 } STMT_END
eba0f806 297#endif
463ee0b2 298
645c22ef
DM
299
300/* del_SV(): return an empty SV head to the free list */
301
a0d0e21e 302#ifdef DEBUGGING
4561caa4 303
053fc874
GS
304#define del_SV(p) \
305 STMT_START { \
306 LOCK_SV_MUTEX; \
aea4f609 307 if (DEBUG_D_TEST) \
053fc874
GS
308 del_sv(p); \
309 else \
310 plant_SV(p); \
311 UNLOCK_SV_MUTEX; \
312 } STMT_END
a0d0e21e 313
76e3520e 314STATIC void
cea2e8a9 315S_del_sv(pTHX_ SV *p)
463ee0b2 316{
aea4f609 317 if (DEBUG_D_TEST) {
4633a7c4 318 SV* sva;
a3b680e6 319 bool ok = 0;
3280af22 320 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
53c1dcc0
AL
321 const SV * const sv = sva + 1;
322 const SV * const svend = &sva[SvREFCNT(sva)];
c0ff570e 323 if (p >= sv && p < svend) {
a0d0e21e 324 ok = 1;
c0ff570e
NC
325 break;
326 }
a0d0e21e
LW
327 }
328 if (!ok) {
0453d815 329 if (ckWARN_d(WARN_INTERNAL))
9014280d 330 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
331 "Attempt to free non-arena SV: 0x%"UVxf
332 pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
a0d0e21e
LW
333 return;
334 }
335 }
4561caa4 336 plant_SV(p);
463ee0b2 337}
a0d0e21e 338
4561caa4
CS
339#else /* ! DEBUGGING */
340
341#define del_SV(p) plant_SV(p)
342
343#endif /* DEBUGGING */
463ee0b2 344
645c22ef
DM
345
346/*
ccfc67b7
JH
347=head1 SV Manipulation Functions
348
645c22ef
DM
349=for apidoc sv_add_arena
350
351Given a chunk of memory, link it to the head of the list of arenas,
352and split it into a list of free SVs.
353
354=cut
355*/
356
4633a7c4 357void
864dbfa3 358Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
463ee0b2 359{
0bd48802 360 SV* const sva = (SV*)ptr;
463ee0b2
LW
361 register SV* sv;
362 register SV* svend;
4633a7c4
LW
363
364 /* The first SV in an arena isn't an SV. */
3280af22 365 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
366 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
367 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
368
3280af22
NIS
369 PL_sv_arenaroot = sva;
370 PL_sv_root = sva + 1;
4633a7c4
LW
371
372 svend = &sva[SvREFCNT(sva) - 1];
373 sv = sva + 1;
463ee0b2 374 while (sv < svend) {
48614a46 375 SvARENA_CHAIN(sv) = (void *)(SV*)(sv + 1);
03e36789 376#ifdef DEBUGGING
978b032e 377 SvREFCNT(sv) = 0;
03e36789
NC
378#endif
379 /* Must always set typemask because it's awlays checked in on cleanup
380 when the arenas are walked looking for objects. */
8990e307 381 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
382 sv++;
383 }
48614a46 384 SvARENA_CHAIN(sv) = 0;
03e36789
NC
385#ifdef DEBUGGING
386 SvREFCNT(sv) = 0;
387#endif
4633a7c4
LW
388 SvFLAGS(sv) = SVTYPEMASK;
389}
390
055972dc
DM
391/* visit(): call the named function for each non-free SV in the arenas
392 * whose flags field matches the flags/mask args. */
645c22ef 393
5226ed68 394STATIC I32
055972dc 395S_visit(pTHX_ SVFUNC_t f, U32 flags, U32 mask)
8990e307 396{
4633a7c4 397 SV* sva;
5226ed68 398 I32 visited = 0;
8990e307 399
3280af22 400 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
53c1dcc0 401 register const SV * const svend = &sva[SvREFCNT(sva)];
a3b680e6 402 register SV* sv;
4561caa4 403 for (sv = sva + 1; sv < svend; ++sv) {
055972dc
DM
404 if (SvTYPE(sv) != SVTYPEMASK
405 && (sv->sv_flags & mask) == flags
406 && SvREFCNT(sv))
407 {
acfe0abc 408 (FCALL)(aTHX_ sv);
5226ed68
JH
409 ++visited;
410 }
8990e307
LW
411 }
412 }
5226ed68 413 return visited;
8990e307
LW
414}
415
758a08c3
JH
416#ifdef DEBUGGING
417
645c22ef
DM
418/* called by sv_report_used() for each live SV */
419
420static void
acfe0abc 421do_report_used(pTHX_ SV *sv)
645c22ef
DM
422{
423 if (SvTYPE(sv) != SVTYPEMASK) {
424 PerlIO_printf(Perl_debug_log, "****\n");
425 sv_dump(sv);
426 }
427}
758a08c3 428#endif
645c22ef
DM
429
430/*
431=for apidoc sv_report_used
432
433Dump the contents of all SVs not yet freed. (Debugging aid).
434
435=cut
436*/
437
8990e307 438void
864dbfa3 439Perl_sv_report_used(pTHX)
4561caa4 440{
ff270d3a 441#ifdef DEBUGGING
055972dc 442 visit(do_report_used, 0, 0);
ff270d3a 443#endif
4561caa4
CS
444}
445
645c22ef
DM
446/* called by sv_clean_objs() for each live SV */
447
448static void
e15faf7d 449do_clean_objs(pTHX_ SV *ref)
645c22ef 450{
823a54a3
AL
451 if (SvROK(ref)) {
452 SV * const target = SvRV(ref);
453 if (SvOBJECT(target)) {
454 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(ref)));
455 if (SvWEAKREF(ref)) {
456 sv_del_backref(target, ref);
457 SvWEAKREF_off(ref);
458 SvRV_set(ref, NULL);
459 } else {
460 SvROK_off(ref);
461 SvRV_set(ref, NULL);
462 SvREFCNT_dec(target);
463 }
645c22ef
DM
464 }
465 }
466
467 /* XXX Might want to check arrays, etc. */
468}
469
470/* called by sv_clean_objs() for each live SV */
471
472#ifndef DISABLE_DESTRUCTOR_KLUDGE
473static void
acfe0abc 474do_clean_named_objs(pTHX_ SV *sv)
645c22ef
DM
475{
476 if (SvTYPE(sv) == SVt_PVGV && GvGP(sv)) {
c69033f2
NC
477 if ((
478#ifdef PERL_DONT_CREATE_GVSV
479 GvSV(sv) &&
480#endif
481 SvOBJECT(GvSV(sv))) ||
645c22ef
DM
482 (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
483 (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
484 (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
485 (GvCV(sv) && SvOBJECT(GvCV(sv))) )
486 {
487 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
ec5f3c78 488 SvFLAGS(sv) |= SVf_BREAK;
645c22ef
DM
489 SvREFCNT_dec(sv);
490 }
491 }
492}
493#endif
494
495/*
496=for apidoc sv_clean_objs
497
498Attempt to destroy all objects not yet freed
499
500=cut
501*/
502
4561caa4 503void
864dbfa3 504Perl_sv_clean_objs(pTHX)
4561caa4 505{
3280af22 506 PL_in_clean_objs = TRUE;
055972dc 507 visit(do_clean_objs, SVf_ROK, SVf_ROK);
4561caa4 508#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 509 /* some barnacles may yet remain, clinging to typeglobs */
055972dc 510 visit(do_clean_named_objs, SVt_PVGV, SVTYPEMASK);
4561caa4 511#endif
3280af22 512 PL_in_clean_objs = FALSE;
4561caa4
CS
513}
514
645c22ef
DM
515/* called by sv_clean_all() for each live SV */
516
517static void
acfe0abc 518do_clean_all(pTHX_ SV *sv)
645c22ef
DM
519{
520 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
521 SvFLAGS(sv) |= SVf_BREAK;
0e705b3b 522 if (PL_comppad == (AV*)sv) {
7d49f689 523 PL_comppad = NULL;
0e705b3b
DM
524 PL_curpad = Null(SV**);
525 }
645c22ef
DM
526 SvREFCNT_dec(sv);
527}
528
529/*
530=for apidoc sv_clean_all
531
532Decrement the refcnt of each remaining SV, possibly triggering a
533cleanup. This function may have to be called multiple times to free
ff276b08 534SVs which are in complex self-referential hierarchies.
645c22ef
DM
535
536=cut
537*/
538
5226ed68 539I32
864dbfa3 540Perl_sv_clean_all(pTHX)
8990e307 541{
5226ed68 542 I32 cleaned;
3280af22 543 PL_in_clean_all = TRUE;
055972dc 544 cleaned = visit(do_clean_all, 0,0);
3280af22 545 PL_in_clean_all = FALSE;
5226ed68 546 return cleaned;
8990e307 547}
463ee0b2 548
7cfef17e
NC
549static void
550S_free_arena(pTHX_ void **root) {
551 while (root) {
1b6737cc 552 void ** const next = *(void **)root;
7cfef17e
NC
553 Safefree(root);
554 root = next;
555 }
556}
557
645c22ef
DM
558/*
559=for apidoc sv_free_arenas
560
561Deallocate the memory used by all arenas. Note that all the individual SV
562heads and bodies within the arenas must already have been freed.
563
564=cut
565*/
7cfef17e
NC
566#define free_arena(name) \
567 STMT_START { \
568 S_free_arena(aTHX_ (void**) PL_ ## name ## _arenaroot); \
569 PL_ ## name ## _arenaroot = 0; \
570 PL_ ## name ## _root = 0; \
571 } STMT_END
572
4633a7c4 573void
864dbfa3 574Perl_sv_free_arenas(pTHX)
4633a7c4
LW
575{
576 SV* sva;
577 SV* svanext;
93e68bfb 578 int i;
4633a7c4
LW
579
580 /* Free arenas here, but be careful about fake ones. (We assume
581 contiguity of the fake ones with the corresponding real ones.) */
582
3280af22 583 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
584 svanext = (SV*) SvANY(sva);
585 while (svanext && SvFAKE(svanext))
586 svanext = (SV*) SvANY(svanext);
587
588 if (!SvFAKE(sva))
1df70142 589 Safefree(sva);
4633a7c4 590 }
93e68bfb
JC
591
592 for (i=0; i<SVt_LAST; i++) {
593 S_free_arena(aTHX_ (void**) PL_body_arenaroots[i]);
594 PL_body_arenaroots[i] = 0;
595 PL_body_roots[i] = 0;
596 }
597
43c5f42d 598 Safefree(PL_nice_chunk);
3280af22
NIS
599 PL_nice_chunk = Nullch;
600 PL_nice_chunk_size = 0;
601 PL_sv_arenaroot = 0;
602 PL_sv_root = 0;
4633a7c4
LW
603}
604
bd81e77b
NC
605/*
606 Here are mid-level routines that manage the allocation of bodies out
607 of the various arenas. There are 5 kinds of arenas:
29489e7c 608
bd81e77b
NC
609 1. SV-head arenas, which are discussed and handled above
610 2. regular body arenas
611 3. arenas for reduced-size bodies
612 4. Hash-Entry arenas
613 5. pte arenas (thread related)
29489e7c 614
bd81e77b
NC
615 Arena types 2 & 3 are chained by body-type off an array of
616 arena-root pointers, which is indexed by svtype. Some of the
617 larger/less used body types are malloced singly, since a large
618 unused block of them is wasteful. Also, several svtypes dont have
619 bodies; the data fits into the sv-head itself. The arena-root
620 pointer thus has a few unused root-pointers (which may be hijacked
621 later for arena types 4,5)
29489e7c 622
bd81e77b
NC
623 3 differs from 2 as an optimization; some body types have several
624 unused fields in the front of the structure (which are kept in-place
625 for consistency). These bodies can be allocated in smaller chunks,
626 because the leading fields arent accessed. Pointers to such bodies
627 are decremented to point at the unused 'ghost' memory, knowing that
628 the pointers are used with offsets to the real memory.
29489e7c 629
bd81e77b
NC
630 HE, HEK arenas are managed separately, with separate code, but may
631 be merge-able later..
632
633 PTE arenas are not sv-bodies, but they share these mid-level
634 mechanics, so are considered here. The new mid-level mechanics rely
635 on the sv_type of the body being allocated, so we just reserve one
636 of the unused body-slots for PTEs, then use it in those (2) PTE
637 contexts below (line ~10k)
638*/
639
640STATIC void *
641S_more_bodies (pTHX_ size_t size, svtype sv_type)
29489e7c 642{
00b6aa41
AL
643 void ** const arena_root = &PL_body_arenaroots[sv_type];
644 void ** const root = &PL_body_roots[sv_type];
bd81e77b
NC
645 char *start;
646 const char *end;
647 const size_t count = PERL_ARENA_SIZE / size;
29489e7c 648
bd81e77b
NC
649 Newx(start, count*size, char);
650 *((void **) start) = *arena_root;
651 *arena_root = (void *)start;
29489e7c 652
bd81e77b 653 end = start + (count-1) * size;
29489e7c 654
bd81e77b
NC
655 /* The initial slot is used to link the arenas together, so it isn't to be
656 linked into the list of ready-to-use bodies. */
29489e7c 657
bd81e77b 658 start += size;
29489e7c 659
bd81e77b 660 *root = (void *)start;
29489e7c 661
bd81e77b
NC
662 while (start < end) {
663 char * const next = start + size;
664 *(void**) start = (void *)next;
665 start = next;
29489e7c 666 }
bd81e77b
NC
667 *(void **)start = 0;
668
669 return *root;
29489e7c
DM
670}
671
bd81e77b 672/* grab a new thing from the free list, allocating more if necessary */
29489e7c 673
bd81e77b 674/* 1st, the inline version */
29489e7c 675
bd81e77b
NC
676#define new_body_inline(xpv, size, sv_type) \
677 STMT_START { \
00b6aa41 678 void ** const r3wt = &PL_body_roots[sv_type]; \
bd81e77b
NC
679 LOCK_SV_MUTEX; \
680 xpv = *((void **)(r3wt)) \
681 ? *((void **)(r3wt)) : S_more_bodies(aTHX_ size, sv_type); \
682 *(r3wt) = *(void**)(xpv); \
683 UNLOCK_SV_MUTEX; \
684 } STMT_END
29489e7c 685
bd81e77b 686/* now use the inline version in the proper function */
29489e7c 687
bd81e77b 688#ifndef PURIFY
9393da09 689
bd81e77b
NC
690/* This isn't being used with -DPURIFY, so don't declare it. Otherwise
691 compilers issue warnings. */
9393da09 692
bd81e77b
NC
693STATIC void *
694S_new_body(pTHX_ size_t size, svtype sv_type)
695{
696 void *xpv;
697 new_body_inline(xpv, size, sv_type);
698 return xpv;
699}
9393da09 700
bd81e77b 701#endif
53c1dcc0 702
bd81e77b 703/* return a thing to the free list */
29489e7c 704
bd81e77b
NC
705#define del_body(thing, root) \
706 STMT_START { \
00b6aa41 707 void ** const thing_copy = (void **)thing;\
bd81e77b
NC
708 LOCK_SV_MUTEX; \
709 *thing_copy = *root; \
710 *root = (void*)thing_copy; \
711 UNLOCK_SV_MUTEX; \
712 } STMT_END
29489e7c 713
bd81e77b
NC
714/*
715 Revisiting type 3 arenas, there are 4 body-types which have some
716 members that are never accessed. They are XPV, XPVIV, XPVAV,
717 XPVHV, which have corresponding types: xpv_allocated,
718 xpviv_allocated, xpvav_allocated, xpvhv_allocated,
29489e7c 719
bd81e77b
NC
720 For these types, the arenas are carved up into *_allocated size
721 chunks, we thus avoid wasted memory for those unaccessed members.
722 When bodies are allocated, we adjust the pointer back in memory by
723 the size of the bit not allocated, so it's as if we allocated the
724 full structure. (But things will all go boom if you write to the
725 part that is "not there", because you'll be overwriting the last
726 members of the preceding structure in memory.)
29489e7c 727
bd81e77b
NC
728 We calculate the correction using the STRUCT_OFFSET macro. For example, if
729 xpv_allocated is the same structure as XPV then the two OFFSETs sum to zero,
730 and the pointer is unchanged. If the allocated structure is smaller (no
731 initial NV actually allocated) then the net effect is to subtract the size
732 of the NV from the pointer, to return a new pointer as if an initial NV were
733 actually allocated.
29489e7c 734
bd81e77b
NC
735 This is the same trick as was used for NV and IV bodies. Ironically it
736 doesn't need to be used for NV bodies any more, because NV is now at the
737 start of the structure. IV bodies don't need it either, because they are
738 no longer allocated. */
29489e7c 739
bd81e77b
NC
740/* The following 2 arrays hide the above details in a pair of
741 lookup-tables, allowing us to be body-type agnostic.
29489e7c 742
bd81e77b
NC
743 size maps svtype to its body's allocated size.
744 offset maps svtype to the body-pointer adjustment needed
29489e7c 745
bd81e77b
NC
746 NB: elements in latter are 0 or <0, and are added during
747 allocation, and subtracted during deallocation. It may be clearer
748 to invert the values, and call it shrinkage_by_svtype.
29489e7c
DM
749*/
750
bd81e77b
NC
751struct body_details {
752 size_t size; /* Size to allocate */
753 size_t copy; /* Size of structure to copy (may be shorter) */
754 size_t offset;
755 bool cant_upgrade; /* Can upgrade this type */
756 bool zero_nv; /* zero the NV when upgrading from this */
757 bool arena; /* Allocated from an arena */
758};
29489e7c 759
bd81e77b
NC
760#define HADNV FALSE
761#define NONV TRUE
29489e7c 762
bd81e77b
NC
763#ifdef PURIFY
764/* With -DPURFIY we allocate everything directly, and don't use arenas.
765 This seems a rather elegant way to simplify some of the code below. */
766#define HASARENA FALSE
767#else
768#define HASARENA TRUE
769#endif
770#define NOARENA FALSE
29489e7c 771
bd81e77b 772/* A macro to work out the offset needed to subtract from a pointer to (say)
29489e7c 773
bd81e77b
NC
774typedef struct {
775 STRLEN xpv_cur;
776 STRLEN xpv_len;
777} xpv_allocated;
29489e7c 778
bd81e77b 779to make its members accessible via a pointer to (say)
29489e7c 780
bd81e77b
NC
781struct xpv {
782 NV xnv_nv;
783 STRLEN xpv_cur;
784 STRLEN xpv_len;
785};
29489e7c 786
bd81e77b 787*/
29489e7c 788
bd81e77b
NC
789#define relative_STRUCT_OFFSET(longer, shorter, member) \
790 (STRUCT_OFFSET(shorter, member) - STRUCT_OFFSET(longer, member))
29489e7c 791
bd81e77b
NC
792/* Calculate the length to copy. Specifically work out the length less any
793 final padding the compiler needed to add. See the comment in sv_upgrade
794 for why copying the padding proved to be a bug. */
29489e7c 795
bd81e77b
NC
796#define copy_length(type, last_member) \
797 STRUCT_OFFSET(type, last_member) \
798 + sizeof (((type*)SvANY((SV*)0))->last_member)
29489e7c 799
bd81e77b
NC
800static const struct body_details bodies_by_type[] = {
801 {0, 0, 0, FALSE, NONV, NOARENA},
802 /* IVs are in the head, so the allocation size is 0 */
803 {0, sizeof(IV), STRUCT_OFFSET(XPVIV, xiv_iv), FALSE, NONV, NOARENA},
804 /* 8 bytes on most ILP32 with IEEE doubles */
805 {sizeof(NV), sizeof(NV), 0, FALSE, HADNV, HASARENA},
806 /* RVs are in the head now */
807 /* However, this slot is overloaded and used by the pte */
808 {0, 0, 0, FALSE, NONV, NOARENA},
809 /* 8 bytes on most ILP32 with IEEE doubles */
810 {sizeof(xpv_allocated),
811 copy_length(XPV, xpv_len)
d41c018a
NC
812 - relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
813 + relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
bd81e77b
NC
814 FALSE, NONV, HASARENA},
815 /* 12 */
816 {sizeof(xpviv_allocated),
817 copy_length(XPVIV, xiv_u)
d41c018a
NC
818 - relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
819 + relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
bd81e77b
NC
820 FALSE, NONV, HASARENA},
821 /* 20 */
822 {sizeof(XPVNV), copy_length(XPVNV, xiv_u), 0, FALSE, HADNV, HASARENA},
823 /* 28 */
824 {sizeof(XPVMG), copy_length(XPVMG, xmg_stash), 0, FALSE, HADNV, HASARENA},
825 /* 36 */
826 {sizeof(XPVBM), sizeof(XPVBM), 0, TRUE, HADNV, HASARENA},
827 /* 48 */
828 {sizeof(XPVGV), sizeof(XPVGV), 0, TRUE, HADNV, HASARENA},
829 /* 64 */
830 {sizeof(XPVLV), sizeof(XPVLV), 0, TRUE, HADNV, HASARENA},
831 /* 20 */
832 {sizeof(xpvav_allocated),
833 copy_length(XPVAV, xmg_stash)
d41c018a
NC
834 - relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
835 + relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
bd81e77b
NC
836 TRUE, HADNV, HASARENA},
837 /* 20 */
838 {sizeof(xpvhv_allocated),
839 copy_length(XPVHV, xmg_stash)
d41c018a
NC
840 - relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
841 + relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
bd81e77b
NC
842 TRUE, HADNV, HASARENA},
843 /* 76 */
844 {sizeof(XPVCV), sizeof(XPVCV), 0, TRUE, HADNV, HASARENA},
845 /* 80 */
846 {sizeof(XPVFM), sizeof(XPVFM), 0, TRUE, HADNV, NOARENA},
847 /* 84 */
848 {sizeof(XPVIO), sizeof(XPVIO), 0, TRUE, HADNV, NOARENA}
849};
29489e7c 850
bd81e77b
NC
851#define new_body_type(sv_type) \
852 (void *)((char *)S_new_body(aTHX_ bodies_by_type[sv_type].size, sv_type)\
853 - bodies_by_type[sv_type].offset)
29489e7c 854
bd81e77b
NC
855#define del_body_type(p, sv_type) \
856 del_body(p, &PL_body_roots[sv_type])
29489e7c 857
29489e7c 858
bd81e77b
NC
859#define new_body_allocated(sv_type) \
860 (void *)((char *)S_new_body(aTHX_ bodies_by_type[sv_type].size, sv_type)\
861 - bodies_by_type[sv_type].offset)
29489e7c 862
bd81e77b
NC
863#define del_body_allocated(p, sv_type) \
864 del_body(p + bodies_by_type[sv_type].offset, &PL_body_roots[sv_type])
29489e7c 865
29489e7c 866
bd81e77b
NC
867#define my_safemalloc(s) (void*)safemalloc(s)
868#define my_safecalloc(s) (void*)safecalloc(s, 1)
869#define my_safefree(p) safefree((char*)p)
29489e7c 870
bd81e77b 871#ifdef PURIFY
29489e7c 872
bd81e77b
NC
873#define new_XNV() my_safemalloc(sizeof(XPVNV))
874#define del_XNV(p) my_safefree(p)
29489e7c 875
bd81e77b
NC
876#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
877#define del_XPVNV(p) my_safefree(p)
29489e7c 878
bd81e77b
NC
879#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
880#define del_XPVAV(p) my_safefree(p)
29489e7c 881
bd81e77b
NC
882#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
883#define del_XPVHV(p) my_safefree(p)
29489e7c 884
bd81e77b
NC
885#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
886#define del_XPVMG(p) my_safefree(p)
29489e7c 887
bd81e77b
NC
888#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
889#define del_XPVGV(p) my_safefree(p)
29489e7c 890
bd81e77b 891#else /* !PURIFY */
29489e7c 892
bd81e77b
NC
893#define new_XNV() new_body_type(SVt_NV)
894#define del_XNV(p) del_body_type(p, SVt_NV)
29489e7c 895
bd81e77b
NC
896#define new_XPVNV() new_body_type(SVt_PVNV)
897#define del_XPVNV(p) del_body_type(p, SVt_PVNV)
29489e7c 898
bd81e77b
NC
899#define new_XPVAV() new_body_allocated(SVt_PVAV)
900#define del_XPVAV(p) del_body_allocated(p, SVt_PVAV)
645c22ef 901
bd81e77b
NC
902#define new_XPVHV() new_body_allocated(SVt_PVHV)
903#define del_XPVHV(p) del_body_allocated(p, SVt_PVHV)
645c22ef 904
bd81e77b
NC
905#define new_XPVMG() new_body_type(SVt_PVMG)
906#define del_XPVMG(p) del_body_type(p, SVt_PVMG)
645c22ef 907
bd81e77b
NC
908#define new_XPVGV() new_body_type(SVt_PVGV)
909#define del_XPVGV(p) del_body_type(p, SVt_PVGV)
1d7c1841 910
bd81e77b 911#endif /* PURIFY */
93e68bfb 912
bd81e77b 913/* no arena for you! */
93e68bfb 914
bd81e77b
NC
915#define new_NOARENA(details) \
916 my_safemalloc((details)->size + (details)->offset)
917#define new_NOARENAZ(details) \
918 my_safecalloc((details)->size + (details)->offset)
93e68bfb 919
bd81e77b
NC
920/*
921=for apidoc sv_upgrade
93e68bfb 922
bd81e77b
NC
923Upgrade an SV to a more complex form. Generally adds a new body type to the
924SV, then copies across as much information as possible from the old body.
925You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
93e68bfb 926
bd81e77b 927=cut
93e68bfb 928*/
93e68bfb 929
bd81e77b
NC
930void
931Perl_sv_upgrade(pTHX_ register SV *sv, U32 new_type)
cac9b346 932{
bd81e77b
NC
933 void* old_body;
934 void* new_body;
935 const U32 old_type = SvTYPE(sv);
936 const struct body_details *const old_type_details
937 = bodies_by_type + old_type;
938 const struct body_details *new_type_details = bodies_by_type + new_type;
cac9b346 939
bd81e77b
NC
940 if (new_type != SVt_PV && SvIsCOW(sv)) {
941 sv_force_normal_flags(sv, 0);
942 }
cac9b346 943
bd81e77b
NC
944 if (old_type == new_type)
945 return;
cac9b346 946
bd81e77b
NC
947 if (old_type > new_type)
948 Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
949 (int)old_type, (int)new_type);
cac9b346 950
cac9b346 951
bd81e77b 952 old_body = SvANY(sv);
de042e1d 953
bd81e77b
NC
954 /* Copying structures onto other structures that have been neatly zeroed
955 has a subtle gotcha. Consider XPVMG
cac9b346 956
bd81e77b
NC
957 +------+------+------+------+------+-------+-------+
958 | NV | CUR | LEN | IV | MAGIC | STASH |
959 +------+------+------+------+------+-------+-------+
960 0 4 8 12 16 20 24 28
645c22ef 961
bd81e77b
NC
962 where NVs are aligned to 8 bytes, so that sizeof that structure is
963 actually 32 bytes long, with 4 bytes of padding at the end:
08742458 964
bd81e77b
NC
965 +------+------+------+------+------+-------+-------+------+
966 | NV | CUR | LEN | IV | MAGIC | STASH | ??? |
967 +------+------+------+------+------+-------+-------+------+
968 0 4 8 12 16 20 24 28 32
08742458 969
bd81e77b 970 so what happens if you allocate memory for this structure:
30f9da9e 971
bd81e77b
NC
972 +------+------+------+------+------+-------+-------+------+------+...
973 | NV | CUR | LEN | IV | MAGIC | STASH | GP | NAME |
974 +------+------+------+------+------+-------+-------+------+------+...
975 0 4 8 12 16 20 24 28 32 36
bfc44f79 976
bd81e77b
NC
977 zero it, then copy sizeof(XPVMG) bytes on top of it? Not quite what you
978 expect, because you copy the area marked ??? onto GP. Now, ??? may have
979 started out as zero once, but it's quite possible that it isn't. So now,
980 rather than a nicely zeroed GP, you have it pointing somewhere random.
981 Bugs ensue.
bfc44f79 982
bd81e77b
NC
983 (In fact, GP ends up pointing at a previous GP structure, because the
984 principle cause of the padding in XPVMG getting garbage is a copy of
985 sizeof(XPVMG) bytes from a XPVGV structure in sv_unglob)
30f9da9e 986
bd81e77b
NC
987 So we are careful and work out the size of used parts of all the
988 structures. */
bfc44f79 989
bd81e77b
NC
990 switch (old_type) {
991 case SVt_NULL:
992 break;
993 case SVt_IV:
994 if (new_type < SVt_PVIV) {
995 new_type = (new_type == SVt_NV)
996 ? SVt_PVNV : SVt_PVIV;
997 new_type_details = bodies_by_type + new_type;
998 }
999 break;
1000 case SVt_NV:
1001 if (new_type < SVt_PVNV) {
1002 new_type = SVt_PVNV;
1003 new_type_details = bodies_by_type + new_type;
1004 }
1005 break;
1006 case SVt_RV:
1007 break;
1008 case SVt_PV:
1009 assert(new_type > SVt_PV);
1010 assert(SVt_IV < SVt_PV);
1011 assert(SVt_NV < SVt_PV);
1012 break;
1013 case SVt_PVIV:
1014 break;
1015 case SVt_PVNV:
1016 break;
1017 case SVt_PVMG:
1018 /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1019 there's no way that it can be safely upgraded, because perl.c
1020 expects to Safefree(SvANY(PL_mess_sv)) */
1021 assert(sv != PL_mess_sv);
1022 /* This flag bit is used to mean other things in other scalar types.
1023 Given that it only has meaning inside the pad, it shouldn't be set
1024 on anything that can get upgraded. */
1025 assert((SvFLAGS(sv) & SVpad_TYPED) == 0);
1026 break;
1027 default:
1028 if (old_type_details->cant_upgrade)
1029 Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
1030 }
645c22ef 1031
bd81e77b
NC
1032 SvFLAGS(sv) &= ~SVTYPEMASK;
1033 SvFLAGS(sv) |= new_type;
932e9ff9 1034
bd81e77b
NC
1035 switch (new_type) {
1036 case SVt_NULL:
1037 Perl_croak(aTHX_ "Can't upgrade to undef");
1038 case SVt_IV:
1039 assert(old_type == SVt_NULL);
1040 SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
1041 SvIV_set(sv, 0);
1042 return;
1043 case SVt_NV:
1044 assert(old_type == SVt_NULL);
1045 SvANY(sv) = new_XNV();
1046 SvNV_set(sv, 0);
1047 return;
1048 case SVt_RV:
1049 assert(old_type == SVt_NULL);
1050 SvANY(sv) = &sv->sv_u.svu_rv;
1051 SvRV_set(sv, 0);
1052 return;
1053 case SVt_PVHV:
1054 SvANY(sv) = new_XPVHV();
1055 HvFILL(sv) = 0;
1056 HvMAX(sv) = 0;
1057 HvTOTALKEYS(sv) = 0;
645c22ef 1058
bd81e77b 1059 goto hv_av_common;
aeb18a1e 1060
bd81e77b
NC
1061 case SVt_PVAV:
1062 SvANY(sv) = new_XPVAV();
1063 AvMAX(sv) = -1;
1064 AvFILLp(sv) = -1;
1065 AvALLOC(sv) = 0;
1066 AvREAL_only(sv);
aeb18a1e 1067
bd81e77b
NC
1068 hv_av_common:
1069 /* SVt_NULL isn't the only thing upgraded to AV or HV.
1070 The target created by newSVrv also is, and it can have magic.
1071 However, it never has SvPVX set.
1072 */
1073 if (old_type >= SVt_RV) {
1074 assert(SvPVX_const(sv) == 0);
1075 }
aeb18a1e 1076
bd81e77b
NC
1077 /* Could put this in the else clause below, as PVMG must have SvPVX
1078 0 already (the assertion above) */
1079 SvPV_set(sv, (char*)0);
93e68bfb 1080
bd81e77b
NC
1081 if (old_type >= SVt_PVMG) {
1082 SvMAGIC_set(sv, ((XPVMG*)old_body)->xmg_magic);
1083 SvSTASH_set(sv, ((XPVMG*)old_body)->xmg_stash);
1084 } else {
1085 SvMAGIC_set(sv, 0);
1086 SvSTASH_set(sv, 0);
1087 }
1088 break;
93e68bfb 1089
93e68bfb 1090
bd81e77b
NC
1091 case SVt_PVIV:
1092 /* XXX Is this still needed? Was it ever needed? Surely as there is
1093 no route from NV to PVIV, NOK can never be true */
1094 assert(!SvNOKp(sv));
1095 assert(!SvNOK(sv));
1096 case SVt_PVIO:
1097 case SVt_PVFM:
1098 case SVt_PVBM:
1099 case SVt_PVGV:
1100 case SVt_PVCV:
1101 case SVt_PVLV:
1102 case SVt_PVMG:
1103 case SVt_PVNV:
1104 case SVt_PV:
93e68bfb 1105
bd81e77b
NC
1106 assert(new_type_details->size);
1107 /* We always allocated the full length item with PURIFY. To do this
1108 we fake things so that arena is false for all 16 types.. */
1109 if(new_type_details->arena) {
1110 /* This points to the start of the allocated area. */
1111 new_body_inline(new_body, new_type_details->size, new_type);
1112 Zero(new_body, new_type_details->size, char);
1113 new_body = ((char *)new_body) - new_type_details->offset;
1114 } else {
1115 new_body = new_NOARENAZ(new_type_details);
1116 }
1117 SvANY(sv) = new_body;
5e2fc214 1118
bd81e77b
NC
1119 if (old_type_details->copy) {
1120 Copy((char *)old_body + old_type_details->offset,
1121 (char *)new_body + old_type_details->offset,
1122 old_type_details->copy, char);
1123 }
1124
1125#ifndef NV_ZERO_IS_ALLBITS_ZERO
f2524eef
JC
1126 /* If NV 0.0 is stores as all bits 0 then Zero() already creates a
1127 * correct 0.0 for us. */
bd81e77b
NC
1128 if (old_type_details->zero_nv)
1129 SvNV_set(sv, 0);
82048762 1130#endif
5e2fc214 1131
bd81e77b 1132 if (new_type == SVt_PVIO)
f2524eef 1133 IoPAGE_LEN(sv) = 60;
bd81e77b
NC
1134 if (old_type < SVt_RV)
1135 SvPV_set(sv, 0);
1136 break;
1137 default:
1138 Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu", new_type);
1139 }
73171d91 1140
bd81e77b
NC
1141 if (old_type_details->size) {
1142 /* If the old body had an allocated size, then we need to free it. */
1143#ifdef PURIFY
1144 my_safefree(old_body);
1145#else
1146 del_body((void*)((char*)old_body + old_type_details->offset),
1147 &PL_body_roots[old_type]);
1148#endif
1149 }
1150}
73171d91 1151
bd81e77b
NC
1152/*
1153=for apidoc sv_backoff
73171d91 1154
bd81e77b
NC
1155Remove any string offset. You should normally use the C<SvOOK_off> macro
1156wrapper instead.
73171d91 1157
bd81e77b 1158=cut
73171d91
NC
1159*/
1160
bd81e77b
NC
1161int
1162Perl_sv_backoff(pTHX_ register SV *sv)
1163{
1164 assert(SvOOK(sv));
1165 assert(SvTYPE(sv) != SVt_PVHV);
1166 assert(SvTYPE(sv) != SVt_PVAV);
1167 if (SvIVX(sv)) {
1168 const char * const s = SvPVX_const(sv);
1169 SvLEN_set(sv, SvLEN(sv) + SvIVX(sv));
1170 SvPV_set(sv, SvPVX(sv) - SvIVX(sv));
1171 SvIV_set(sv, 0);
1172 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1173 }
1174 SvFLAGS(sv) &= ~SVf_OOK;
1175 return 0;
1176}
73171d91 1177
bd81e77b
NC
1178/*
1179=for apidoc sv_grow
73171d91 1180
bd81e77b
NC
1181Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
1182upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
1183Use the C<SvGROW> wrapper instead.
93e68bfb 1184
bd81e77b
NC
1185=cut
1186*/
93e68bfb 1187
bd81e77b
NC
1188char *
1189Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
1190{
1191 register char *s;
93e68bfb 1192
bd81e77b
NC
1193#ifdef HAS_64K_LIMIT
1194 if (newlen >= 0x10000) {
1195 PerlIO_printf(Perl_debug_log,
1196 "Allocation too large: %"UVxf"\n", (UV)newlen);
1197 my_exit(1);
1198 }
1199#endif /* HAS_64K_LIMIT */
1200 if (SvROK(sv))
1201 sv_unref(sv);
1202 if (SvTYPE(sv) < SVt_PV) {
1203 sv_upgrade(sv, SVt_PV);
1204 s = SvPVX_mutable(sv);
1205 }
1206 else if (SvOOK(sv)) { /* pv is offset? */
1207 sv_backoff(sv);
1208 s = SvPVX_mutable(sv);
1209 if (newlen > SvLEN(sv))
1210 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1211#ifdef HAS_64K_LIMIT
1212 if (newlen >= 0x10000)
1213 newlen = 0xFFFF;
1214#endif
1215 }
1216 else
1217 s = SvPVX_mutable(sv);
aeb18a1e 1218
bd81e77b
NC
1219 if (newlen > SvLEN(sv)) { /* need more room? */
1220 newlen = PERL_STRLEN_ROUNDUP(newlen);
1221 if (SvLEN(sv) && s) {
1222#ifdef MYMALLOC
1223 const STRLEN l = malloced_size((void*)SvPVX_const(sv));
1224 if (newlen <= l) {
1225 SvLEN_set(sv, l);
1226 return s;
1227 } else
1228#endif
1229 s = saferealloc(s, newlen);
1230 }
1231 else {
1232 s = safemalloc(newlen);
1233 if (SvPVX_const(sv) && SvCUR(sv)) {
1234 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1235 }
1236 }
1237 SvPV_set(sv, s);
1238 SvLEN_set(sv, newlen);
1239 }
1240 return s;
1241}
aeb18a1e 1242
bd81e77b
NC
1243/*
1244=for apidoc sv_setiv
932e9ff9 1245
bd81e77b
NC
1246Copies an integer into the given SV, upgrading first if necessary.
1247Does not handle 'set' magic. See also C<sv_setiv_mg>.
463ee0b2 1248
bd81e77b
NC
1249=cut
1250*/
463ee0b2 1251
bd81e77b
NC
1252void
1253Perl_sv_setiv(pTHX_ register SV *sv, IV i)
1254{
1255 SV_CHECK_THINKFIRST_COW_DROP(sv);
1256 switch (SvTYPE(sv)) {
1257 case SVt_NULL:
1258 sv_upgrade(sv, SVt_IV);
1259 break;
1260 case SVt_NV:
1261 sv_upgrade(sv, SVt_PVNV);
1262 break;
1263 case SVt_RV:
1264 case SVt_PV:
1265 sv_upgrade(sv, SVt_PVIV);
1266 break;
463ee0b2 1267
bd81e77b
NC
1268 case SVt_PVGV:
1269 case SVt_PVAV:
1270 case SVt_PVHV:
1271 case SVt_PVCV:
1272 case SVt_PVFM:
1273 case SVt_PVIO:
1274 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1275 OP_DESC(PL_op));
1276 }
1277 (void)SvIOK_only(sv); /* validate number */
1278 SvIV_set(sv, i);
1279 SvTAINT(sv);
1280}
932e9ff9 1281
bd81e77b
NC
1282/*
1283=for apidoc sv_setiv_mg
d33b2eba 1284
bd81e77b 1285Like C<sv_setiv>, but also handles 'set' magic.
1c846c1f 1286
bd81e77b
NC
1287=cut
1288*/
d33b2eba 1289
bd81e77b
NC
1290void
1291Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
1292{
1293 sv_setiv(sv,i);
1294 SvSETMAGIC(sv);
1295}
727879eb 1296
bd81e77b
NC
1297/*
1298=for apidoc sv_setuv
d33b2eba 1299
bd81e77b
NC
1300Copies an unsigned integer into the given SV, upgrading first if necessary.
1301Does not handle 'set' magic. See also C<sv_setuv_mg>.
9b94d1dd 1302
bd81e77b
NC
1303=cut
1304*/
d33b2eba 1305
bd81e77b
NC
1306void
1307Perl_sv_setuv(pTHX_ register SV *sv, UV u)
1308{
1309 /* With these two if statements:
1310 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d33b2eba 1311
bd81e77b
NC
1312 without
1313 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
1c846c1f 1314
bd81e77b
NC
1315 If you wish to remove them, please benchmark to see what the effect is
1316 */
1317 if (u <= (UV)IV_MAX) {
1318 sv_setiv(sv, (IV)u);
1319 return;
1320 }
1321 sv_setiv(sv, 0);
1322 SvIsUV_on(sv);
1323 SvUV_set(sv, u);
1324}
d33b2eba 1325
bd81e77b
NC
1326/*
1327=for apidoc sv_setuv_mg
727879eb 1328
bd81e77b 1329Like C<sv_setuv>, but also handles 'set' magic.
9b94d1dd 1330
bd81e77b
NC
1331=cut
1332*/
5e2fc214 1333
bd81e77b
NC
1334void
1335Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
1336{
1337 sv_setiv(sv, 0);
1338 SvIsUV_on(sv);
1339 sv_setuv(sv,u);
1340 SvSETMAGIC(sv);
1341}
5e2fc214 1342
954c1994 1343/*
bd81e77b 1344=for apidoc sv_setnv
954c1994 1345
bd81e77b
NC
1346Copies a double into the given SV, upgrading first if necessary.
1347Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
1348
1349=cut
1350*/
1351
63f97190 1352void
bd81e77b 1353Perl_sv_setnv(pTHX_ register SV *sv, NV num)
79072805 1354{
bd81e77b
NC
1355 SV_CHECK_THINKFIRST_COW_DROP(sv);
1356 switch (SvTYPE(sv)) {
79072805 1357 case SVt_NULL:
79072805 1358 case SVt_IV:
bd81e77b 1359 sv_upgrade(sv, SVt_NV);
79072805 1360 break;
ed6116ce 1361 case SVt_RV:
79072805 1362 case SVt_PV:
79072805 1363 case SVt_PVIV:
bd81e77b 1364 sv_upgrade(sv, SVt_PVNV);
79072805 1365 break;
bd4b1eb5 1366
bd4b1eb5 1367 case SVt_PVGV:
bd81e77b
NC
1368 case SVt_PVAV:
1369 case SVt_PVHV:
79072805 1370 case SVt_PVCV:
bd81e77b
NC
1371 case SVt_PVFM:
1372 case SVt_PVIO:
1373 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1374 OP_NAME(PL_op));
2068cd4d 1375 }
bd81e77b
NC
1376 SvNV_set(sv, num);
1377 (void)SvNOK_only(sv); /* validate number */
1378 SvTAINT(sv);
79072805
LW
1379}
1380
645c22ef 1381/*
bd81e77b 1382=for apidoc sv_setnv_mg
645c22ef 1383
bd81e77b 1384Like C<sv_setnv>, but also handles 'set' magic.
645c22ef
DM
1385
1386=cut
1387*/
1388
bd81e77b
NC
1389void
1390Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
79072805 1391{
bd81e77b
NC
1392 sv_setnv(sv,num);
1393 SvSETMAGIC(sv);
79072805
LW
1394}
1395
bd81e77b
NC
1396/* Print an "isn't numeric" warning, using a cleaned-up,
1397 * printable version of the offending string
1398 */
954c1994 1399
bd81e77b
NC
1400STATIC void
1401S_not_a_number(pTHX_ SV *sv)
79072805 1402{
bd81e77b
NC
1403 SV *dsv;
1404 char tmpbuf[64];
1405 const char *pv;
94463019
JH
1406
1407 if (DO_UTF8(sv)) {
d0043bd1 1408 dsv = sv_2mortal(newSVpvn("", 0));
94463019
JH
1409 pv = sv_uni_display(dsv, sv, 10, 0);
1410 } else {
1411 char *d = tmpbuf;
551405c4 1412 const char * const limit = tmpbuf + sizeof(tmpbuf) - 8;
94463019
JH
1413 /* each *s can expand to 4 chars + "...\0",
1414 i.e. need room for 8 chars */
ecdeb87c 1415
00b6aa41
AL
1416 const char *s = SvPVX_const(sv);
1417 const char * const end = s + SvCUR(sv);
1418 for ( ; s < end && d < limit; s++ ) {
94463019
JH
1419 int ch = *s & 0xFF;
1420 if (ch & 128 && !isPRINT_LC(ch)) {
1421 *d++ = 'M';
1422 *d++ = '-';
1423 ch &= 127;
1424 }
1425 if (ch == '\n') {
1426 *d++ = '\\';
1427 *d++ = 'n';
1428 }
1429 else if (ch == '\r') {
1430 *d++ = '\\';
1431 *d++ = 'r';
1432 }
1433 else if (ch == '\f') {
1434 *d++ = '\\';
1435 *d++ = 'f';
1436 }
1437 else if (ch == '\\') {
1438 *d++ = '\\';
1439 *d++ = '\\';
1440 }
1441 else if (ch == '\0') {
1442 *d++ = '\\';
1443 *d++ = '0';
1444 }
1445 else if (isPRINT_LC(ch))
1446 *d++ = ch;
1447 else {
1448 *d++ = '^';
1449 *d++ = toCTRL(ch);
1450 }
1451 }
1452 if (s < end) {
1453 *d++ = '.';
1454 *d++ = '.';
1455 *d++ = '.';
1456 }
1457 *d = '\0';
1458 pv = tmpbuf;
a0d0e21e 1459 }
a0d0e21e 1460
533c011a 1461 if (PL_op)
9014280d 1462 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
1463 "Argument \"%s\" isn't numeric in %s", pv,
1464 OP_DESC(PL_op));
a0d0e21e 1465 else
9014280d 1466 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 1467 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
1468}
1469
c2988b20
NC
1470/*
1471=for apidoc looks_like_number
1472
645c22ef
DM
1473Test if the content of an SV looks like a number (or is a number).
1474C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1475non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
1476
1477=cut
1478*/
1479
1480I32
1481Perl_looks_like_number(pTHX_ SV *sv)
1482{
a3b680e6 1483 register const char *sbegin;
c2988b20
NC
1484 STRLEN len;
1485
1486 if (SvPOK(sv)) {
3f7c398e 1487 sbegin = SvPVX_const(sv);
c2988b20
NC
1488 len = SvCUR(sv);
1489 }
1490 else if (SvPOKp(sv))
83003860 1491 sbegin = SvPV_const(sv, len);
c2988b20 1492 else
e0ab1c0e 1493 return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
c2988b20
NC
1494 return grok_number(sbegin, len, NULL);
1495}
25da4f38
IZ
1496
1497/* Actually, ISO C leaves conversion of UV to IV undefined, but
1498 until proven guilty, assume that things are not that bad... */
1499
645c22ef
DM
1500/*
1501 NV_PRESERVES_UV:
1502
1503 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
1504 an IV (an assumption perl has been based on to date) it becomes necessary
1505 to remove the assumption that the NV always carries enough precision to
1506 recreate the IV whenever needed, and that the NV is the canonical form.
1507 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 1508 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
1509 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1510 1) to distinguish between IV/UV/NV slots that have cached a valid
1511 conversion where precision was lost and IV/UV/NV slots that have a
1512 valid conversion which has lost no precision
645c22ef 1513 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
1514 would lose precision, the precise conversion (or differently
1515 imprecise conversion) is also performed and cached, to prevent
1516 requests for different numeric formats on the same SV causing
1517 lossy conversion chains. (lossless conversion chains are perfectly
1518 acceptable (still))
1519
1520
1521 flags are used:
1522 SvIOKp is true if the IV slot contains a valid value
1523 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
1524 SvNOKp is true if the NV slot contains a valid value
1525 SvNOK is true only if the NV value is accurate
1526
1527 so
645c22ef 1528 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
1529 IV(or UV) would lose accuracy over a direct conversion from PV to
1530 IV(or UV). If it would, cache both conversions, return NV, but mark
1531 SV as IOK NOKp (ie not NOK).
1532
645c22ef 1533 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
1534 NV would lose accuracy over a direct conversion from PV to NV. If it
1535 would, cache both conversions, flag similarly.
1536
1537 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1538 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
1539 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1540 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 1541 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 1542
645c22ef
DM
1543 The benefit of this is that operations such as pp_add know that if
1544 SvIOK is true for both left and right operands, then integer addition
1545 can be used instead of floating point (for cases where the result won't
1546 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
1547 loss of precision compared with integer addition.
1548
1549 * making IV and NV equal status should make maths accurate on 64 bit
1550 platforms
1551 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 1552 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
1553 looking for SvIOK and checking for overflow will not outweigh the
1554 fp to integer speedup)
1555 * will slow down integer operations (callers of SvIV) on "inaccurate"
1556 values, as the change from SvIOK to SvIOKp will cause a call into
1557 sv_2iv each time rather than a macro access direct to the IV slot
1558 * should speed up number->string conversion on integers as IV is
645c22ef 1559 favoured when IV and NV are equally accurate
28e5dec8
JH
1560
1561 ####################################################################
645c22ef
DM
1562 You had better be using SvIOK_notUV if you want an IV for arithmetic:
1563 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1564 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
1565 ####################################################################
1566
645c22ef 1567 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
1568 performance ratio.
1569*/
1570
1571#ifndef NV_PRESERVES_UV
645c22ef
DM
1572# define IS_NUMBER_UNDERFLOW_IV 1
1573# define IS_NUMBER_UNDERFLOW_UV 2
1574# define IS_NUMBER_IV_AND_UV 2
1575# define IS_NUMBER_OVERFLOW_IV 4
1576# define IS_NUMBER_OVERFLOW_UV 5
1577
1578/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
1579
1580/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
1581STATIC int
645c22ef 1582S_sv_2iuv_non_preserve(pTHX_ register SV *sv, I32 numtype)
28e5dec8 1583{
3f7c398e 1584 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
1585 if (SvNVX(sv) < (NV)IV_MIN) {
1586 (void)SvIOKp_on(sv);
1587 (void)SvNOK_on(sv);
45977657 1588 SvIV_set(sv, IV_MIN);
28e5dec8
JH
1589 return IS_NUMBER_UNDERFLOW_IV;
1590 }
1591 if (SvNVX(sv) > (NV)UV_MAX) {
1592 (void)SvIOKp_on(sv);
1593 (void)SvNOK_on(sv);
1594 SvIsUV_on(sv);
607fa7f2 1595 SvUV_set(sv, UV_MAX);
28e5dec8
JH
1596 return IS_NUMBER_OVERFLOW_UV;
1597 }
c2988b20
NC
1598 (void)SvIOKp_on(sv);
1599 (void)SvNOK_on(sv);
1600 /* Can't use strtol etc to convert this string. (See truth table in
1601 sv_2iv */
1602 if (SvNVX(sv) <= (UV)IV_MAX) {
45977657 1603 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
1604 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1605 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
1606 } else {
1607 /* Integer is imprecise. NOK, IOKp */
1608 }
1609 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1610 }
1611 SvIsUV_on(sv);
607fa7f2 1612 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
1613 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
1614 if (SvUVX(sv) == UV_MAX) {
1615 /* As we know that NVs don't preserve UVs, UV_MAX cannot
1616 possibly be preserved by NV. Hence, it must be overflow.
1617 NOK, IOKp */
1618 return IS_NUMBER_OVERFLOW_UV;
1619 }
1620 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
1621 } else {
1622 /* Integer is imprecise. NOK, IOKp */
28e5dec8 1623 }
c2988b20 1624 return IS_NUMBER_OVERFLOW_IV;
28e5dec8 1625}
645c22ef
DM
1626#endif /* !NV_PRESERVES_UV*/
1627
af359546
NC
1628STATIC bool
1629S_sv_2iuv_common(pTHX_ SV *sv) {
1630 if (SvNOKp(sv)) {
28e5dec8
JH
1631 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
1632 * without also getting a cached IV/UV from it at the same time
1633 * (ie PV->NV conversion should detect loss of accuracy and cache
af359546
NC
1634 * IV or UV at same time to avoid this. */
1635 /* IV-over-UV optimisation - choose to cache IV if possible */
25da4f38
IZ
1636
1637 if (SvTYPE(sv) == SVt_NV)
1638 sv_upgrade(sv, SVt_PVNV);
1639
28e5dec8
JH
1640 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
1641 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
1642 certainly cast into the IV range at IV_MAX, whereas the correct
1643 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
1644 cases go to UV */
1645 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 1646 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
1647 if (SvNVX(sv) == (NV) SvIVX(sv)
1648#ifndef NV_PRESERVES_UV
1649 && (((UV)1 << NV_PRESERVES_UV_BITS) >
1650 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
1651 /* Don't flag it as "accurately an integer" if the number
1652 came from a (by definition imprecise) NV operation, and
1653 we're outside the range of NV integer precision */
1654#endif
1655 ) {
1656 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
1657 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 1658 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
1659 PTR2UV(sv),
1660 SvNVX(sv),
1661 SvIVX(sv)));
1662
1663 } else {
1664 /* IV not precise. No need to convert from PV, as NV
1665 conversion would already have cached IV if it detected
1666 that PV->IV would be better than PV->NV->IV
1667 flags already correct - don't set public IOK. */
1668 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 1669 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
1670 PTR2UV(sv),
1671 SvNVX(sv),
1672 SvIVX(sv)));
1673 }
1674 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
1675 but the cast (NV)IV_MIN rounds to a the value less (more
1676 negative) than IV_MIN which happens to be equal to SvNVX ??
1677 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
1678 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
1679 (NV)UVX == NVX are both true, but the values differ. :-(
1680 Hopefully for 2s complement IV_MIN is something like
1681 0x8000000000000000 which will be exact. NWC */
d460ef45 1682 }
25da4f38 1683 else {
607fa7f2 1684 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
1685 if (
1686 (SvNVX(sv) == (NV) SvUVX(sv))
1687#ifndef NV_PRESERVES_UV
1688 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
1689 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
1690 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
1691 /* Don't flag it as "accurately an integer" if the number
1692 came from a (by definition imprecise) NV operation, and
1693 we're outside the range of NV integer precision */
1694#endif
1695 )
1696 SvIOK_on(sv);
25da4f38 1697 SvIsUV_on(sv);
1c846c1f 1698 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 1699 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 1700 PTR2UV(sv),
57def98f
JH
1701 SvUVX(sv),
1702 SvUVX(sv)));
25da4f38 1703 }
748a9306
LW
1704 }
1705 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 1706 UV value;
504618e9 1707 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
af359546 1708 /* We want to avoid a possible problem when we cache an IV/ a UV which
25da4f38 1709 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
1710 the same as the direct translation of the initial string
1711 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
1712 be careful to ensure that the value with the .456 is around if the
1713 NV value is requested in the future).
1c846c1f 1714
af359546 1715 This means that if we cache such an IV/a UV, we need to cache the
25da4f38 1716 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 1717 cache the NV if we are sure it's not needed.
25da4f38 1718 */
16b7a9a4 1719
c2988b20
NC
1720 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
1721 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
1722 == IS_NUMBER_IN_UV) {
5e045b90 1723 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
1724 if (SvTYPE(sv) < SVt_PVIV)
1725 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 1726 (void)SvIOK_on(sv);
c2988b20
NC
1727 } else if (SvTYPE(sv) < SVt_PVNV)
1728 sv_upgrade(sv, SVt_PVNV);
28e5dec8 1729
f2524eef 1730 /* If NVs preserve UVs then we only use the UV value if we know that
c2988b20
NC
1731 we aren't going to call atof() below. If NVs don't preserve UVs
1732 then the value returned may have more precision than atof() will
1733 return, even though value isn't perfectly accurate. */
1734 if ((numtype & (IS_NUMBER_IN_UV
1735#ifdef NV_PRESERVES_UV
1736 | IS_NUMBER_NOT_INT
1737#endif
1738 )) == IS_NUMBER_IN_UV) {
1739 /* This won't turn off the public IOK flag if it was set above */
1740 (void)SvIOKp_on(sv);
1741
1742 if (!(numtype & IS_NUMBER_NEG)) {
1743 /* positive */;
1744 if (value <= (UV)IV_MAX) {
45977657 1745 SvIV_set(sv, (IV)value);
c2988b20 1746 } else {
af359546 1747 /* it didn't overflow, and it was positive. */
607fa7f2 1748 SvUV_set(sv, value);
c2988b20
NC
1749 SvIsUV_on(sv);
1750 }
1751 } else {
1752 /* 2s complement assumption */
1753 if (value <= (UV)IV_MIN) {
45977657 1754 SvIV_set(sv, -(IV)value);
c2988b20
NC
1755 } else {
1756 /* Too negative for an IV. This is a double upgrade, but
d1be9408 1757 I'm assuming it will be rare. */
c2988b20
NC
1758 if (SvTYPE(sv) < SVt_PVNV)
1759 sv_upgrade(sv, SVt_PVNV);
1760 SvNOK_on(sv);
1761 SvIOK_off(sv);
1762 SvIOKp_on(sv);
9d6ce603 1763 SvNV_set(sv, -(NV)value);
45977657 1764 SvIV_set(sv, IV_MIN);
c2988b20
NC
1765 }
1766 }
1767 }
1768 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
1769 will be in the previous block to set the IV slot, and the next
1770 block to set the NV slot. So no else here. */
1771
1772 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
1773 != IS_NUMBER_IN_UV) {
1774 /* It wasn't an (integer that doesn't overflow the UV). */
3f7c398e 1775 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8 1776
c2988b20
NC
1777 if (! numtype && ckWARN(WARN_NUMERIC))
1778 not_a_number(sv);
28e5dec8 1779
65202027 1780#if defined(USE_LONG_DOUBLE)
c2988b20
NC
1781 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
1782 PTR2UV(sv), SvNVX(sv)));
65202027 1783#else
1779d84d 1784 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 1785 PTR2UV(sv), SvNVX(sv)));
65202027 1786#endif
28e5dec8 1787
28e5dec8 1788#ifdef NV_PRESERVES_UV
af359546
NC
1789 (void)SvIOKp_on(sv);
1790 (void)SvNOK_on(sv);
1791 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
1792 SvIV_set(sv, I_V(SvNVX(sv)));
1793 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1794 SvIOK_on(sv);
1795 } else {
1796 /* Integer is imprecise. NOK, IOKp */
1797 }
1798 /* UV will not work better than IV */
1799 } else {
1800 if (SvNVX(sv) > (NV)UV_MAX) {
1801 SvIsUV_on(sv);
1802 /* Integer is inaccurate. NOK, IOKp, is UV */
1803 SvUV_set(sv, UV_MAX);
af359546
NC
1804 } else {
1805 SvUV_set(sv, U_V(SvNVX(sv)));
1806 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
1807 NV preservse UV so can do correct comparison. */
1808 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
1809 SvIOK_on(sv);
af359546
NC
1810 } else {
1811 /* Integer is imprecise. NOK, IOKp, is UV */
af359546
NC
1812 }
1813 }
4b0c9573 1814 SvIsUV_on(sv);
af359546 1815 }
28e5dec8 1816#else /* NV_PRESERVES_UV */
c2988b20
NC
1817 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
1818 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
af359546 1819 /* The IV/UV slot will have been set from value returned by
c2988b20
NC
1820 grok_number above. The NV slot has just been set using
1821 Atof. */
560b0c46 1822 SvNOK_on(sv);
c2988b20
NC
1823 assert (SvIOKp(sv));
1824 } else {
1825 if (((UV)1 << NV_PRESERVES_UV_BITS) >
1826 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
1827 /* Small enough to preserve all bits. */
1828 (void)SvIOKp_on(sv);
1829 SvNOK_on(sv);
45977657 1830 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
1831 if ((NV)(SvIVX(sv)) == SvNVX(sv))
1832 SvIOK_on(sv);
1833 /* Assumption: first non-preserved integer is < IV_MAX,
1834 this NV is in the preserved range, therefore: */
1835 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
1836 < (UV)IV_MAX)) {
32fdb065 1837 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
1838 }
1839 } else {
1840 /* IN_UV NOT_INT
1841 0 0 already failed to read UV.
1842 0 1 already failed to read UV.
1843 1 0 you won't get here in this case. IV/UV
1844 slot set, public IOK, Atof() unneeded.
1845 1 1 already read UV.
1846 so there's no point in sv_2iuv_non_preserve() attempting
1847 to use atol, strtol, strtoul etc. */
40a17c4c 1848 sv_2iuv_non_preserve (sv, numtype);
c2988b20
NC
1849 }
1850 }
28e5dec8 1851#endif /* NV_PRESERVES_UV */
25da4f38 1852 }
af359546
NC
1853 }
1854 else {
1855 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1856 if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
1857 report_uninit(sv);
1858 }
25da4f38
IZ
1859 if (SvTYPE(sv) < SVt_IV)
1860 /* Typically the caller expects that sv_any is not NULL now. */
1861 sv_upgrade(sv, SVt_IV);
af359546
NC
1862 /* Return 0 from the caller. */
1863 return TRUE;
1864 }
1865 return FALSE;
1866}
1867
1868/*
1869=for apidoc sv_2iv_flags
1870
1871Return the integer value of an SV, doing any necessary string
1872conversion. If flags includes SV_GMAGIC, does an mg_get() first.
1873Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
1874
1875=cut
1876*/
1877
1878IV
1879Perl_sv_2iv_flags(pTHX_ register SV *sv, I32 flags)
1880{
1881 if (!sv)
a0d0e21e 1882 return 0;
af359546
NC
1883 if (SvGMAGICAL(sv)) {
1884 if (flags & SV_GMAGIC)
1885 mg_get(sv);
1886 if (SvIOKp(sv))
1887 return SvIVX(sv);
1888 if (SvNOKp(sv)) {
1889 return I_V(SvNVX(sv));
1890 }
71c558c3
NC
1891 if (SvPOKp(sv) && SvLEN(sv)) {
1892 UV value;
1893 const int numtype
1894 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
1895
1896 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
1897 == IS_NUMBER_IN_UV) {
1898 /* It's definitely an integer */
1899 if (numtype & IS_NUMBER_NEG) {
1900 if (value < (UV)IV_MIN)
1901 return -(IV)value;
1902 } else {
1903 if (value < (UV)IV_MAX)
1904 return (IV)value;
1905 }
1906 }
1907 if (!numtype) {
1908 if (ckWARN(WARN_NUMERIC))
1909 not_a_number(sv);
1910 }
1911 return I_V(Atof(SvPVX_const(sv)));
1912 }
1c7ff15e
NC
1913 if (SvROK(sv)) {
1914 goto return_rok;
af359546 1915 }
1c7ff15e
NC
1916 assert(SvTYPE(sv) >= SVt_PVMG);
1917 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 1918 } else if (SvTHINKFIRST(sv)) {
af359546 1919 if (SvROK(sv)) {
1c7ff15e 1920 return_rok:
af359546
NC
1921 if (SvAMAGIC(sv)) {
1922 SV * const tmpstr=AMG_CALLun(sv,numer);
1923 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
1924 return SvIV(tmpstr);
1925 }
1926 }
1927 return PTR2IV(SvRV(sv));
1928 }
1929 if (SvIsCOW(sv)) {
1930 sv_force_normal_flags(sv, 0);
1931 }
1932 if (SvREADONLY(sv) && !SvOK(sv)) {
1933 if (ckWARN(WARN_UNINITIALIZED))
1934 report_uninit(sv);
1935 return 0;
1936 }
1937 }
1938 if (!SvIOKp(sv)) {
1939 if (S_sv_2iuv_common(aTHX_ sv))
1940 return 0;
79072805 1941 }
1d7c1841
GS
1942 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
1943 PTR2UV(sv),SvIVX(sv)));
25da4f38 1944 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
1945}
1946
645c22ef 1947/*
891f9566 1948=for apidoc sv_2uv_flags
645c22ef
DM
1949
1950Return the unsigned integer value of an SV, doing any necessary string
891f9566
YST
1951conversion. If flags includes SV_GMAGIC, does an mg_get() first.
1952Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
645c22ef
DM
1953
1954=cut
1955*/
1956
ff68c719 1957UV
891f9566 1958Perl_sv_2uv_flags(pTHX_ register SV *sv, I32 flags)
ff68c719 1959{
1960 if (!sv)
1961 return 0;
1962 if (SvGMAGICAL(sv)) {
891f9566
YST
1963 if (flags & SV_GMAGIC)
1964 mg_get(sv);
ff68c719 1965 if (SvIOKp(sv))
1966 return SvUVX(sv);
1967 if (SvNOKp(sv))
1968 return U_V(SvNVX(sv));
71c558c3
NC
1969 if (SvPOKp(sv) && SvLEN(sv)) {
1970 UV value;
1971 const int numtype
1972 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
1973
1974 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
1975 == IS_NUMBER_IN_UV) {
1976 /* It's definitely an integer */
1977 if (!(numtype & IS_NUMBER_NEG))
1978 return value;
1979 }
1980 if (!numtype) {
1981 if (ckWARN(WARN_NUMERIC))
1982 not_a_number(sv);
1983 }
1984 return U_V(Atof(SvPVX_const(sv)));
1985 }
1c7ff15e
NC
1986 if (SvROK(sv)) {
1987 goto return_rok;
3fe9a6f1 1988 }
1c7ff15e
NC
1989 assert(SvTYPE(sv) >= SVt_PVMG);
1990 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 1991 } else if (SvTHINKFIRST(sv)) {
ff68c719 1992 if (SvROK(sv)) {
1c7ff15e 1993 return_rok:
deb46114
NC
1994 if (SvAMAGIC(sv)) {
1995 SV *const tmpstr = AMG_CALLun(sv,numer);
1996 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
1997 return SvUV(tmpstr);
1998 }
1999 }
2000 return PTR2UV(SvRV(sv));
ff68c719 2001 }
765f542d
NC
2002 if (SvIsCOW(sv)) {
2003 sv_force_normal_flags(sv, 0);
8a818333 2004 }
0336b60e 2005 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2006 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2007 report_uninit(sv);
ff68c719 2008 return 0;
2009 }
2010 }
af359546
NC
2011 if (!SvIOKp(sv)) {
2012 if (S_sv_2iuv_common(aTHX_ sv))
2013 return 0;
ff68c719 2014 }
25da4f38 2015
1d7c1841
GS
2016 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2017 PTR2UV(sv),SvUVX(sv)));
25da4f38 2018 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 2019}
2020
645c22ef
DM
2021/*
2022=for apidoc sv_2nv
2023
2024Return the num value of an SV, doing any necessary string or integer
2025conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
2026macros.
2027
2028=cut
2029*/
2030
65202027 2031NV
864dbfa3 2032Perl_sv_2nv(pTHX_ register SV *sv)
79072805
LW
2033{
2034 if (!sv)
2035 return 0.0;
8990e307 2036 if (SvGMAGICAL(sv)) {
463ee0b2
LW
2037 mg_get(sv);
2038 if (SvNOKp(sv))
2039 return SvNVX(sv);
a0d0e21e 2040 if (SvPOKp(sv) && SvLEN(sv)) {
041457d9 2041 if (!SvIOKp(sv) && ckWARN(WARN_NUMERIC) &&
504618e9 2042 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
a0d0e21e 2043 not_a_number(sv);
3f7c398e 2044 return Atof(SvPVX_const(sv));
a0d0e21e 2045 }
25da4f38 2046 if (SvIOKp(sv)) {
1c846c1f 2047 if (SvIsUV(sv))
65202027 2048 return (NV)SvUVX(sv);
25da4f38 2049 else
65202027 2050 return (NV)SvIVX(sv);
47a72cb8
NC
2051 }
2052 if (SvROK(sv)) {
2053 goto return_rok;
2054 }
2055 assert(SvTYPE(sv) >= SVt_PVMG);
2056 /* This falls through to the report_uninit near the end of the
2057 function. */
2058 } else if (SvTHINKFIRST(sv)) {
a0d0e21e 2059 if (SvROK(sv)) {
47a72cb8 2060 return_rok:
deb46114
NC
2061 if (SvAMAGIC(sv)) {
2062 SV *const tmpstr = AMG_CALLun(sv,numer);
2063 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2064 return SvNV(tmpstr);
2065 }
2066 }
2067 return PTR2NV(SvRV(sv));
a0d0e21e 2068 }
765f542d
NC
2069 if (SvIsCOW(sv)) {
2070 sv_force_normal_flags(sv, 0);
8a818333 2071 }
0336b60e 2072 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 2073 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2074 report_uninit(sv);
ed6116ce
LW
2075 return 0.0;
2076 }
79072805
LW
2077 }
2078 if (SvTYPE(sv) < SVt_NV) {
7e25a7e9
NC
2079 /* The logic to use SVt_PVNV if necessary is in sv_upgrade. */
2080 sv_upgrade(sv, SVt_NV);
906f284f 2081#ifdef USE_LONG_DOUBLE
097ee67d 2082 DEBUG_c({
f93f4e46 2083 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2084 PerlIO_printf(Perl_debug_log,
2085 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2086 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2087 RESTORE_NUMERIC_LOCAL();
2088 });
65202027 2089#else
572bbb43 2090 DEBUG_c({
f93f4e46 2091 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2092 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 2093 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2094 RESTORE_NUMERIC_LOCAL();
2095 });
572bbb43 2096#endif
79072805
LW
2097 }
2098 else if (SvTYPE(sv) < SVt_PVNV)
2099 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
2100 if (SvNOKp(sv)) {
2101 return SvNVX(sv);
61604483 2102 }
59d8ce62 2103 if (SvIOKp(sv)) {
9d6ce603 2104 SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
28e5dec8
JH
2105#ifdef NV_PRESERVES_UV
2106 SvNOK_on(sv);
2107#else
2108 /* Only set the public NV OK flag if this NV preserves the IV */
2109 /* Check it's not 0xFFFFFFFFFFFFFFFF */
2110 if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2111 : (SvIVX(sv) == I_V(SvNVX(sv))))
2112 SvNOK_on(sv);
2113 else
2114 SvNOKp_on(sv);
2115#endif
93a17b20 2116 }
748a9306 2117 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2118 UV value;
3f7c398e 2119 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
041457d9 2120 if (!SvIOKp(sv) && !numtype && ckWARN(WARN_NUMERIC))
a0d0e21e 2121 not_a_number(sv);
28e5dec8 2122#ifdef NV_PRESERVES_UV
c2988b20
NC
2123 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2124 == IS_NUMBER_IN_UV) {
5e045b90 2125 /* It's definitely an integer */
9d6ce603 2126 SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
c2988b20 2127 } else
3f7c398e 2128 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2129 SvNOK_on(sv);
2130#else
3f7c398e 2131 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2132 /* Only set the public NV OK flag if this NV preserves the value in
2133 the PV at least as well as an IV/UV would.
2134 Not sure how to do this 100% reliably. */
2135 /* if that shift count is out of range then Configure's test is
2136 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2137 UV_BITS */
2138 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 2139 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 2140 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
2141 } else if (!(numtype & IS_NUMBER_IN_UV)) {
2142 /* Can't use strtol etc to convert this string, so don't try.
2143 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
2144 SvNOK_on(sv);
2145 } else {
2146 /* value has been set. It may not be precise. */
2147 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2148 /* 2s complement assumption for (UV)IV_MIN */
2149 SvNOK_on(sv); /* Integer is too negative. */
2150 } else {
2151 SvNOKp_on(sv);
2152 SvIOKp_on(sv);
6fa402ec 2153
c2988b20 2154 if (numtype & IS_NUMBER_NEG) {
45977657 2155 SvIV_set(sv, -(IV)value);
c2988b20 2156 } else if (value <= (UV)IV_MAX) {
45977657 2157 SvIV_set(sv, (IV)value);
c2988b20 2158 } else {
607fa7f2 2159 SvUV_set(sv, value);
c2988b20
NC
2160 SvIsUV_on(sv);
2161 }
2162
2163 if (numtype & IS_NUMBER_NOT_INT) {
2164 /* I believe that even if the original PV had decimals,
2165 they are lost beyond the limit of the FP precision.
2166 However, neither is canonical, so both only get p
2167 flags. NWC, 2000/11/25 */
2168 /* Both already have p flags, so do nothing */
2169 } else {
66a1b24b 2170 const NV nv = SvNVX(sv);
c2988b20
NC
2171 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2172 if (SvIVX(sv) == I_V(nv)) {
2173 SvNOK_on(sv);
c2988b20 2174 } else {
c2988b20
NC
2175 /* It had no "." so it must be integer. */
2176 }
00b6aa41 2177 SvIOK_on(sv);
c2988b20
NC
2178 } else {
2179 /* between IV_MAX and NV(UV_MAX).
2180 Could be slightly > UV_MAX */
6fa402ec 2181
c2988b20
NC
2182 if (numtype & IS_NUMBER_NOT_INT) {
2183 /* UV and NV both imprecise. */
2184 } else {
66a1b24b 2185 const UV nv_as_uv = U_V(nv);
c2988b20
NC
2186
2187 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2188 SvNOK_on(sv);
c2988b20 2189 }
00b6aa41 2190 SvIOK_on(sv);
c2988b20
NC
2191 }
2192 }
2193 }
2194 }
2195 }
28e5dec8 2196#endif /* NV_PRESERVES_UV */
93a17b20 2197 }
79072805 2198 else {
041457d9 2199 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
29489e7c 2200 report_uninit(sv);
7e25a7e9
NC
2201 assert (SvTYPE(sv) >= SVt_NV);
2202 /* Typically the caller expects that sv_any is not NULL now. */
2203 /* XXX Ilya implies that this is a bug in callers that assume this
2204 and ideally should be fixed. */
a0d0e21e 2205 return 0.0;
79072805 2206 }
572bbb43 2207#if defined(USE_LONG_DOUBLE)
097ee67d 2208 DEBUG_c({
f93f4e46 2209 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2210 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2211 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2212 RESTORE_NUMERIC_LOCAL();
2213 });
65202027 2214#else
572bbb43 2215 DEBUG_c({
f93f4e46 2216 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2217 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 2218 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2219 RESTORE_NUMERIC_LOCAL();
2220 });
572bbb43 2221#endif
463ee0b2 2222 return SvNVX(sv);
79072805
LW
2223}
2224
645c22ef
DM
2225/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2226 * UV as a string towards the end of buf, and return pointers to start and
2227 * end of it.
2228 *
2229 * We assume that buf is at least TYPE_CHARS(UV) long.
2230 */
2231
864dbfa3 2232static char *
aec46f14 2233S_uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
25da4f38 2234{
25da4f38 2235 char *ptr = buf + TYPE_CHARS(UV);
823a54a3 2236 char * const ebuf = ptr;
25da4f38 2237 int sign;
25da4f38
IZ
2238
2239 if (is_uv)
2240 sign = 0;
2241 else if (iv >= 0) {
2242 uv = iv;
2243 sign = 0;
2244 } else {
2245 uv = -iv;
2246 sign = 1;
2247 }
2248 do {
eb160463 2249 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
2250 } while (uv /= 10);
2251 if (sign)
2252 *--ptr = '-';
2253 *peob = ebuf;
2254 return ptr;
2255}
2256
9af30d34
NC
2257/* stringify_regexp(): private routine for use by sv_2pv_flags(): converts
2258 * a regexp to its stringified form.
2259 */
2260
2261static char *
2262S_stringify_regexp(pTHX_ SV *sv, MAGIC *mg, STRLEN *lp) {
00b6aa41 2263 const regexp * const re = (regexp *)mg->mg_obj;
9af30d34
NC
2264
2265 if (!mg->mg_ptr) {
2266 const char *fptr = "msix";
2267 char reflags[6];
2268 char ch;
2269 int left = 0;
2270 int right = 4;
00b6aa41 2271 bool need_newline = 0;
9af30d34
NC
2272 U16 reganch = (U16)((re->reganch & PMf_COMPILETIME) >> 12);
2273
2274 while((ch = *fptr++)) {
2275 if(reganch & 1) {
2276 reflags[left++] = ch;
2277 }
2278 else {
2279 reflags[right--] = ch;
2280 }
2281 reganch >>= 1;
2282 }
2283 if(left != 4) {
2284 reflags[left] = '-';
2285 left = 5;
2286 }
2287
2288 mg->mg_len = re->prelen + 4 + left;
2289 /*
2290 * If /x was used, we have to worry about a regex ending with a
2291 * comment later being embedded within another regex. If so, we don't
2292 * want this regex's "commentization" to leak out to the right part of
2293 * the enclosing regex, we must cap it with a newline.
2294 *
2295 * So, if /x was used, we scan backwards from the end of the regex. If
2296 * we find a '#' before we find a newline, we need to add a newline
2297 * ourself. If we find a '\n' first (or if we don't find '#' or '\n'),
2298 * we don't need to add anything. -jfriedl
2299 */
2300 if (PMf_EXTENDED & re->reganch) {
2301 const char *endptr = re->precomp + re->prelen;
2302 while (endptr >= re->precomp) {
2303 const char c = *(endptr--);
2304 if (c == '\n')
2305 break; /* don't need another */
2306 if (c == '#') {
2307 /* we end while in a comment, so we need a newline */
2308 mg->mg_len++; /* save space for it */
2309 need_newline = 1; /* note to add it */
2310 break;
2311 }
2312 }
2313 }
2314
2315 Newx(mg->mg_ptr, mg->mg_len + 1 + left, char);
2316 mg->mg_ptr[0] = '(';
2317 mg->mg_ptr[1] = '?';
2318 Copy(reflags, mg->mg_ptr+2, left, char);
2319 *(mg->mg_ptr+left+2) = ':';
2320 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
2321 if (need_newline)
2322 mg->mg_ptr[mg->mg_len - 2] = '\n';
2323 mg->mg_ptr[mg->mg_len - 1] = ')';
2324 mg->mg_ptr[mg->mg_len] = 0;
2325 }
2326 PL_reginterp_cnt += re->program[0].next_off;
2327
2328 if (re->reganch & ROPT_UTF8)
2329 SvUTF8_on(sv);
2330 else
2331 SvUTF8_off(sv);
2332 if (lp)
2333 *lp = mg->mg_len;
2334 return mg->mg_ptr;
2335}
2336
645c22ef
DM
2337/*
2338=for apidoc sv_2pv_flags
2339
ff276b08 2340Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
2341If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2342if necessary.
2343Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2344usually end up here too.
2345
2346=cut
2347*/
2348
8d6d96c1
HS
2349char *
2350Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
2351{
79072805 2352 register char *s;
79072805 2353
463ee0b2 2354 if (!sv) {
cdb061a3
NC
2355 if (lp)
2356 *lp = 0;
73d840c0 2357 return (char *)"";
463ee0b2 2358 }
8990e307 2359 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
2360 if (flags & SV_GMAGIC)
2361 mg_get(sv);
463ee0b2 2362 if (SvPOKp(sv)) {
cdb061a3
NC
2363 if (lp)
2364 *lp = SvCUR(sv);
10516c54
NC
2365 if (flags & SV_MUTABLE_RETURN)
2366 return SvPVX_mutable(sv);
4d84ee25
NC
2367 if (flags & SV_CONST_RETURN)
2368 return (char *)SvPVX_const(sv);
463ee0b2
LW
2369 return SvPVX(sv);
2370 }
75dfc8ec
NC
2371 if (SvIOKp(sv) || SvNOKp(sv)) {
2372 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
75dfc8ec
NC
2373 STRLEN len;
2374
2375 if (SvIOKp(sv)) {
e8ada2d0
NC
2376 len = SvIsUV(sv) ? my_sprintf(tbuf,"%"UVuf, (UV)SvUVX(sv))
2377 : my_sprintf(tbuf,"%"IVdf, (IV)SvIVX(sv));
75dfc8ec 2378 } else {
e8ada2d0
NC
2379 Gconvert(SvNVX(sv), NV_DIG, 0, tbuf);
2380 len = strlen(tbuf);
75dfc8ec
NC
2381 }
2382 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
2383 /* Sneaky stuff here */
00b6aa41 2384 SV * const tsv = newSVpvn(tbuf, len);
75dfc8ec
NC
2385
2386 sv_2mortal(tsv);
2387 if (lp)
2388 *lp = SvCUR(tsv);
2389 return SvPVX(tsv);
2390 }
2391 else {
2392 dVAR;
2393
2394#ifdef FIXNEGATIVEZERO
e8ada2d0
NC
2395 if (len == 2 && tbuf[0] == '-' && tbuf[1] == '0') {
2396 tbuf[0] = '0';
2397 tbuf[1] = 0;
75dfc8ec
NC
2398 len = 1;
2399 }
2400#endif
2401 SvUPGRADE(sv, SVt_PV);
2402 if (lp)
2403 *lp = len;
2404 s = SvGROW_mutable(sv, len + 1);
2405 SvCUR_set(sv, len);
2406 SvPOKp_on(sv);
e8ada2d0 2407 return memcpy(s, tbuf, len + 1);
75dfc8ec 2408 }
463ee0b2 2409 }
1c7ff15e
NC
2410 if (SvROK(sv)) {
2411 goto return_rok;
2412 }
2413 assert(SvTYPE(sv) >= SVt_PVMG);
2414 /* This falls through to the report_uninit near the end of the
2415 function. */
2416 } else if (SvTHINKFIRST(sv)) {
ed6116ce 2417 if (SvROK(sv)) {
1c7ff15e 2418 return_rok:
deb46114
NC
2419 if (SvAMAGIC(sv)) {
2420 SV *const tmpstr = AMG_CALLun(sv,string);
2421 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2422 /* Unwrap this: */
2423 /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
2424 */
2425
2426 char *pv;
2427 if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
2428 if (flags & SV_CONST_RETURN) {
2429 pv = (char *) SvPVX_const(tmpstr);
2430 } else {
2431 pv = (flags & SV_MUTABLE_RETURN)
2432 ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
2433 }
2434 if (lp)
2435 *lp = SvCUR(tmpstr);
50adf7d2 2436 } else {
deb46114 2437 pv = sv_2pv_flags(tmpstr, lp, flags);
50adf7d2 2438 }
deb46114
NC
2439 if (SvUTF8(tmpstr))
2440 SvUTF8_on(sv);
2441 else
2442 SvUTF8_off(sv);
2443 return pv;
50adf7d2 2444 }
deb46114
NC
2445 }
2446 {
75dfc8ec 2447 SV *tsv;
f9277f47 2448 MAGIC *mg;
d8eae41e
NC
2449 const SV *const referent = (SV*)SvRV(sv);
2450
2451 if (!referent) {
042dae7a
NC
2452 tsv = sv_2mortal(newSVpvn("NULLREF", 7));
2453 } else if (SvTYPE(referent) == SVt_PVMG
2454 && ((SvFLAGS(referent) &
2455 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
2456 == (SVs_OBJECT|SVs_SMG))
2457 && (mg = mg_find(referent, PERL_MAGIC_qr))) {
c445ea15 2458 return stringify_regexp(sv, mg, lp);
d8eae41e
NC
2459 } else {
2460 const char *const typestr = sv_reftype(referent, 0);
2461
2462 tsv = sv_newmortal();
2463 if (SvOBJECT(referent)) {
2464 const char *const name = HvNAME_get(SvSTASH(referent));
2465 Perl_sv_setpvf(aTHX_ tsv, "%s=%s(0x%"UVxf")",
2466 name ? name : "__ANON__" , typestr,
2467 PTR2UV(referent));
2468 }
2469 else
2470 Perl_sv_setpvf(aTHX_ tsv, "%s(0x%"UVxf")", typestr,
2471 PTR2UV(referent));
c080367d 2472 }
042dae7a
NC
2473 if (lp)
2474 *lp = SvCUR(tsv);
2475 return SvPVX(tsv);
463ee0b2 2476 }
79072805 2477 }
0336b60e 2478 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2479 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2480 report_uninit(sv);
cdb061a3
NC
2481 if (lp)
2482 *lp = 0;
73d840c0 2483 return (char *)"";
79072805 2484 }
79072805 2485 }
28e5dec8
JH
2486 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
2487 /* I'm assuming that if both IV and NV are equally valid then
2488 converting the IV is going to be more efficient */
e1ec3a88
AL
2489 const U32 isIOK = SvIOK(sv);
2490 const U32 isUIOK = SvIsUV(sv);
28e5dec8
JH
2491 char buf[TYPE_CHARS(UV)];
2492 char *ebuf, *ptr;
2493
2494 if (SvTYPE(sv) < SVt_PVIV)
2495 sv_upgrade(sv, SVt_PVIV);
4ea1d550 2496 ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
5902b6a9
NC
2497 /* inlined from sv_setpvn */
2498 SvGROW_mutable(sv, (STRLEN)(ebuf - ptr + 1));
4d84ee25 2499 Move(ptr,SvPVX_mutable(sv),ebuf - ptr,char);
28e5dec8
JH
2500 SvCUR_set(sv, ebuf - ptr);
2501 s = SvEND(sv);
2502 *s = '\0';
2503 if (isIOK)
2504 SvIOK_on(sv);
2505 else
2506 SvIOKp_on(sv);
2507 if (isUIOK)
2508 SvIsUV_on(sv);
2509 }
2510 else if (SvNOKp(sv)) {
c81271c3 2511 const int olderrno = errno;
79072805
LW
2512 if (SvTYPE(sv) < SVt_PVNV)
2513 sv_upgrade(sv, SVt_PVNV);
1c846c1f 2514 /* The +20 is pure guesswork. Configure test needed. --jhi */
5902b6a9 2515 s = SvGROW_mutable(sv, NV_DIG + 20);
c81271c3 2516 /* some Xenix systems wipe out errno here */
79072805 2517#ifdef apollo
463ee0b2 2518 if (SvNVX(sv) == 0.0)
79072805
LW
2519 (void)strcpy(s,"0");
2520 else
2521#endif /*apollo*/
bbce6d69 2522 {
2d4389e4 2523 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 2524 }
79072805 2525 errno = olderrno;
a0d0e21e
LW
2526#ifdef FIXNEGATIVEZERO
2527 if (*s == '-' && s[1] == '0' && !s[2])
2528 strcpy(s,"0");
2529#endif
79072805
LW
2530 while (*s) s++;
2531#ifdef hcx
2532 if (s[-1] == '.')
46fc3d4c 2533 *--s = '\0';
79072805
LW
2534#endif
2535 }
79072805 2536 else {
041457d9 2537 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
29489e7c 2538 report_uninit(sv);
cdb061a3 2539 if (lp)
00b6aa41 2540 *lp = 0;
25da4f38
IZ
2541 if (SvTYPE(sv) < SVt_PV)
2542 /* Typically the caller expects that sv_any is not NULL now. */
2543 sv_upgrade(sv, SVt_PV);
73d840c0 2544 return (char *)"";
79072805 2545 }
cdb061a3 2546 {
823a54a3 2547 const STRLEN len = s - SvPVX_const(sv);
cdb061a3
NC
2548 if (lp)
2549 *lp = len;
2550 SvCUR_set(sv, len);
2551 }
79072805 2552 SvPOK_on(sv);
1d7c1841 2553 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 2554 PTR2UV(sv),SvPVX_const(sv)));
4d84ee25
NC
2555 if (flags & SV_CONST_RETURN)
2556 return (char *)SvPVX_const(sv);
10516c54
NC
2557 if (flags & SV_MUTABLE_RETURN)
2558 return SvPVX_mutable(sv);
463ee0b2
LW
2559 return SvPVX(sv);
2560}
2561
645c22ef 2562/*
6050d10e
JP
2563=for apidoc sv_copypv
2564
2565Copies a stringified representation of the source SV into the
2566destination SV. Automatically performs any necessary mg_get and
54f0641b 2567coercion of numeric values into strings. Guaranteed to preserve
6050d10e 2568UTF-8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
2569sv_2pv[_flags] but operates directly on an SV instead of just the
2570string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
2571would lose the UTF-8'ness of the PV.
2572
2573=cut
2574*/
2575
2576void
2577Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
2578{
446eaa42 2579 STRLEN len;
53c1dcc0 2580 const char * const s = SvPV_const(ssv,len);
cb50f42d 2581 sv_setpvn(dsv,s,len);
446eaa42 2582 if (SvUTF8(ssv))
cb50f42d 2583 SvUTF8_on(dsv);
446eaa42 2584 else
cb50f42d 2585 SvUTF8_off(dsv);
6050d10e
JP
2586}
2587
2588/*
645c22ef
DM
2589=for apidoc sv_2pvbyte
2590
2591Return a pointer to the byte-encoded representation of the SV, and set *lp
1e54db1a 2592to its length. May cause the SV to be downgraded from UTF-8 as a
645c22ef
DM
2593side-effect.
2594
2595Usually accessed via the C<SvPVbyte> macro.
2596
2597=cut
2598*/
2599
7340a771
GS
2600char *
2601Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
2602{
0875d2fe 2603 sv_utf8_downgrade(sv,0);
97972285 2604 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771
GS
2605}
2606
645c22ef 2607/*
035cbb0e
RGS
2608=for apidoc sv_2pvutf8
2609
2610Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
2611to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
2612
2613Usually accessed via the C<SvPVutf8> macro.
2614
2615=cut
2616*/
645c22ef 2617
7340a771
GS
2618char *
2619Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
2620{
035cbb0e
RGS
2621 sv_utf8_upgrade(sv);
2622 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771 2623}
1c846c1f 2624
7ee2227d 2625
645c22ef
DM
2626/*
2627=for apidoc sv_2bool
2628
2629This function is only called on magical items, and is only used by
8cf8f3d1 2630sv_true() or its macro equivalent.
645c22ef
DM
2631
2632=cut
2633*/
2634
463ee0b2 2635bool
864dbfa3 2636Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 2637{
5b295bef 2638 SvGETMAGIC(sv);
463ee0b2 2639
a0d0e21e
LW
2640 if (!SvOK(sv))
2641 return 0;
2642 if (SvROK(sv)) {
fabdb6c0
AL
2643 if (SvAMAGIC(sv)) {
2644 SV * const tmpsv = AMG_CALLun(sv,bool_);
2645 if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2646 return (bool)SvTRUE(tmpsv);
2647 }
2648 return SvRV(sv) != 0;
a0d0e21e 2649 }
463ee0b2 2650 if (SvPOKp(sv)) {
53c1dcc0
AL
2651 register XPV* const Xpvtmp = (XPV*)SvANY(sv);
2652 if (Xpvtmp &&
339049b0 2653 (*sv->sv_u.svu_pv > '0' ||
11343788 2654 Xpvtmp->xpv_cur > 1 ||
339049b0 2655 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
463ee0b2
LW
2656 return 1;
2657 else
2658 return 0;
2659 }
2660 else {
2661 if (SvIOKp(sv))
2662 return SvIVX(sv) != 0;
2663 else {
2664 if (SvNOKp(sv))
2665 return SvNVX(sv) != 0.0;
2666 else
2667 return FALSE;
2668 }
2669 }
79072805
LW
2670}
2671
c461cf8f
JH
2672/*
2673=for apidoc sv_utf8_upgrade
2674
78ea37eb 2675Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 2676Forces the SV to string form if it is not already.
4411f3b6
NIS
2677Always sets the SvUTF8 flag to avoid future validity checks even
2678if all the bytes have hibit clear.
c461cf8f 2679
13a6c0e0
JH
2680This is not as a general purpose byte encoding to Unicode interface:
2681use the Encode extension for that.
2682
8d6d96c1
HS
2683=for apidoc sv_utf8_upgrade_flags
2684
78ea37eb 2685Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 2686Forces the SV to string form if it is not already.
8d6d96c1
HS
2687Always sets the SvUTF8 flag to avoid future validity checks even
2688if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
2689will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
2690C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
2691
13a6c0e0
JH
2692This is not as a general purpose byte encoding to Unicode interface:
2693use the Encode extension for that.
2694
8d6d96c1
HS
2695=cut
2696*/
2697
2698STRLEN
2699Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
2700{
808c356f
RGS
2701 if (sv == &PL_sv_undef)
2702 return 0;
e0e62c2a
NIS
2703 if (!SvPOK(sv)) {
2704 STRLEN len = 0;
d52b7888
NC
2705 if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
2706 (void) sv_2pv_flags(sv,&len, flags);
2707 if (SvUTF8(sv))
2708 return len;
2709 } else {
2710 (void) SvPV_force(sv,len);
2711 }
e0e62c2a 2712 }
4411f3b6 2713
f5cee72b 2714 if (SvUTF8(sv)) {
5fec3b1d 2715 return SvCUR(sv);
f5cee72b 2716 }
5fec3b1d 2717
765f542d
NC
2718 if (SvIsCOW(sv)) {
2719 sv_force_normal_flags(sv, 0);
db42d148
NIS
2720 }
2721
88632417 2722 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
799ef3cb 2723 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 2724 else { /* Assume Latin-1/EBCDIC */
c4e7c712
NC
2725 /* This function could be much more efficient if we
2726 * had a FLAG in SVs to signal if there are any hibit
2727 * chars in the PV. Given that there isn't such a flag
2728 * make the loop as fast as possible. */
00b6aa41 2729 const U8 * const s = (U8 *) SvPVX_const(sv);
c4420975 2730 const U8 * const e = (U8 *) SvEND(sv);
93524f2b 2731 const U8 *t = s;
c4e7c712
NC
2732
2733 while (t < e) {
53c1dcc0 2734 const U8 ch = *t++;
00b6aa41
AL
2735 /* Check for hi bit */
2736 if (!NATIVE_IS_INVARIANT(ch)) {
2737 STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
2738 U8 * const recoded = bytes_to_utf8((U8*)s, &len);
2739
2740 SvPV_free(sv); /* No longer using what was there before. */
2741 SvPV_set(sv, (char*)recoded);
2742 SvCUR_set(sv, len - 1);
2743 SvLEN_set(sv, len); /* No longer know the real size. */
c4e7c712 2744 break;
00b6aa41 2745 }
c4e7c712
NC
2746 }
2747 /* Mark as UTF-8 even if no hibit - saves scanning loop */
2748 SvUTF8_on(sv);
560a288e 2749 }
4411f3b6 2750 return SvCUR(sv);
560a288e
GS
2751}
2752
c461cf8f
JH
2753/*
2754=for apidoc sv_utf8_downgrade
2755
78ea37eb
TS
2756Attempts to convert the PV of an SV from characters to bytes.
2757If the PV contains a character beyond byte, this conversion will fail;
2758in this case, either returns false or, if C<fail_ok> is not
c461cf8f
JH
2759true, croaks.
2760
13a6c0e0
JH
2761This is not as a general purpose Unicode to byte encoding interface:
2762use the Encode extension for that.
2763
c461cf8f
JH
2764=cut
2765*/
2766
560a288e
GS
2767bool
2768Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
2769{
78ea37eb 2770 if (SvPOKp(sv) && SvUTF8(sv)) {
fa301091 2771 if (SvCUR(sv)) {
03cfe0ae 2772 U8 *s;
652088fc 2773 STRLEN len;
fa301091 2774
765f542d
NC
2775 if (SvIsCOW(sv)) {
2776 sv_force_normal_flags(sv, 0);
2777 }
03cfe0ae
NIS
2778 s = (U8 *) SvPV(sv, len);
2779 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
2780 if (fail_ok)
2781 return FALSE;
2782 else {
2783 if (PL_op)
2784 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 2785 OP_DESC(PL_op));
fa301091
JH
2786 else
2787 Perl_croak(aTHX_ "Wide character");
2788 }
4b3603a4 2789 }
b162af07 2790 SvCUR_set(sv, len);
67e989fb 2791 }
560a288e 2792 }
ffebcc3e 2793 SvUTF8_off(sv);
560a288e
GS
2794 return TRUE;
2795}
2796
c461cf8f
JH
2797/*
2798=for apidoc sv_utf8_encode
2799
78ea37eb
TS
2800Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
2801flag off so that it looks like octets again.
c461cf8f
JH
2802
2803=cut
2804*/
2805
560a288e
GS
2806void
2807Perl_sv_utf8_encode(pTHX_ register SV *sv)
2808{
4411f3b6 2809 (void) sv_utf8_upgrade(sv);
4c94c214
NC
2810 if (SvIsCOW(sv)) {
2811 sv_force_normal_flags(sv, 0);
2812 }
2813 if (SvREADONLY(sv)) {
2814 Perl_croak(aTHX_ PL_no_modify);
2815 }
560a288e
GS
2816 SvUTF8_off(sv);
2817}
2818
4411f3b6
NIS
2819/*
2820=for apidoc sv_utf8_decode
2821
78ea37eb
TS
2822If the PV of the SV is an octet sequence in UTF-8
2823and contains a multiple-byte character, the C<SvUTF8> flag is turned on
2824so that it looks like a character. If the PV contains only single-byte
2825characters, the C<SvUTF8> flag stays being off.
2826Scans PV for validity and returns false if the PV is invalid UTF-8.
4411f3b6
NIS
2827
2828=cut
2829*/
2830
560a288e
GS
2831bool
2832Perl_sv_utf8_decode(pTHX_ register SV *sv)
2833{
78ea37eb 2834 if (SvPOKp(sv)) {
93524f2b
NC
2835 const U8 *c;
2836 const U8 *e;
9cbac4c7 2837
645c22ef
DM
2838 /* The octets may have got themselves encoded - get them back as
2839 * bytes
2840 */
2841 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
2842 return FALSE;
2843
2844 /* it is actually just a matter of turning the utf8 flag on, but
2845 * we want to make sure everything inside is valid utf8 first.
2846 */
93524f2b 2847 c = (const U8 *) SvPVX_const(sv);
63cd0674 2848 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 2849 return FALSE;
93524f2b 2850 e = (const U8 *) SvEND(sv);
511c2ff0 2851 while (c < e) {
b64e5050 2852 const U8 ch = *c++;
c4d5f83a 2853 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
2854 SvUTF8_on(sv);
2855 break;
2856 }
560a288e 2857 }
560a288e
GS
2858 }
2859 return TRUE;
2860}
2861
954c1994
GS
2862/*
2863=for apidoc sv_setsv
2864
645c22ef
DM
2865Copies the contents of the source SV C<ssv> into the destination SV
2866C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
2867function if the source SV needs to be reused. Does not handle 'set' magic.
2868Loosely speaking, it performs a copy-by-value, obliterating any previous
2869content of the destination.
2870
2871You probably want to use one of the assortment of wrappers, such as
2872C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
2873C<SvSetMagicSV_nosteal>.
2874
8d6d96c1
HS
2875=for apidoc sv_setsv_flags
2876
645c22ef
DM
2877Copies the contents of the source SV C<ssv> into the destination SV
2878C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
2879function if the source SV needs to be reused. Does not handle 'set' magic.
2880Loosely speaking, it performs a copy-by-value, obliterating any previous
2881content of the destination.
2882If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
5fcdf167
NC
2883C<ssv> if appropriate, else not. If the C<flags> parameter has the
2884C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
2885and C<sv_setsv_nomg> are implemented in terms of this function.
645c22ef
DM
2886
2887You probably want to use one of the assortment of wrappers, such as
2888C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
2889C<SvSetMagicSV_nosteal>.
2890
2891This is the primary function for copying scalars, and most other
2892copy-ish functions and macros use this underneath.
8d6d96c1
HS
2893
2894=cut
2895*/
2896
2897void
2898Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
2899{
8990e307
LW
2900 register U32 sflags;
2901 register int dtype;
2902 register int stype;
463ee0b2 2903
79072805
LW
2904 if (sstr == dstr)
2905 return;
765f542d 2906 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 2907 if (!sstr)
3280af22 2908 sstr = &PL_sv_undef;
8990e307
LW
2909 stype = SvTYPE(sstr);
2910 dtype = SvTYPE(dstr);
79072805 2911
a0d0e21e 2912 SvAMAGIC_off(dstr);
7a5fa8a2 2913 if ( SvVOK(dstr) )
ece467f9
JP
2914 {
2915 /* need to nuke the magic */
2916 mg_free(dstr);
2917 SvRMAGICAL_off(dstr);
2918 }
9e7bc3e8 2919
463ee0b2 2920 /* There's a lot of redundancy below but we're going for speed here */
79072805 2921
8990e307 2922 switch (stype) {
79072805 2923 case SVt_NULL:
aece5585 2924 undef_sstr:
20408e3c
GS
2925 if (dtype != SVt_PVGV) {
2926 (void)SvOK_off(dstr);
2927 return;
2928 }
2929 break;
463ee0b2 2930 case SVt_IV:
aece5585
GA
2931 if (SvIOK(sstr)) {
2932 switch (dtype) {
2933 case SVt_NULL:
8990e307 2934 sv_upgrade(dstr, SVt_IV);
aece5585
GA
2935 break;
2936 case SVt_NV:
8990e307 2937 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
2938 break;
2939 case SVt_RV:
2940 case SVt_PV:
a0d0e21e 2941 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
2942 break;
2943 }
2944 (void)SvIOK_only(dstr);
45977657 2945 SvIV_set(dstr, SvIVX(sstr));
25da4f38
IZ
2946 if (SvIsUV(sstr))
2947 SvIsUV_on(dstr);
27c9684d
AP
2948 if (SvTAINTED(sstr))
2949 SvTAINT(dstr);
aece5585 2950 return;
8990e307 2951 }
aece5585
GA
2952 goto undef_sstr;
2953
463ee0b2 2954 case SVt_NV:
aece5585
GA
2955 if (SvNOK(sstr)) {
2956 switch (dtype) {
2957 case SVt_NULL:
2958 case SVt_IV:
8990e307 2959 sv_upgrade(dstr, SVt_NV);
aece5585
GA
2960 break;
2961 case SVt_RV:
2962 case SVt_PV:
2963 case SVt_PVIV:
a0d0e21e 2964 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
2965 break;
2966 }
9d6ce603 2967 SvNV_set(dstr, SvNVX(sstr));
aece5585 2968 (void)SvNOK_only(dstr);
27c9684d
AP
2969 if (SvTAINTED(sstr))
2970 SvTAINT(dstr);
aece5585 2971 return;
8990e307 2972 }
aece5585
GA
2973 goto undef_sstr;
2974
ed6116ce 2975 case SVt_RV:
8990e307 2976 if (dtype < SVt_RV)
ed6116ce 2977 sv_upgrade(dstr, SVt_RV);
c07a80fd 2978 else if (dtype == SVt_PVGV &&
23bb1b96 2979 SvROK(sstr) && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
c07a80fd 2980 sstr = SvRV(sstr);
a5f75d66 2981 if (sstr == dstr) {
1d7c1841
GS
2982 if (GvIMPORTED(dstr) != GVf_IMPORTED
2983 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2984 {
a5f75d66 2985 GvIMPORTED_on(dstr);
1d7c1841 2986 }
a5f75d66
AD
2987 GvMULTI_on(dstr);
2988 return;
2989 }
c07a80fd 2990 goto glob_assign;
2991 }
ed6116ce 2992 break;
fc36a67e 2993 case SVt_PVFM:
f8c7b90f 2994#ifdef PERL_OLD_COPY_ON_WRITE
d89fc664
NC
2995 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
2996 if (dtype < SVt_PVIV)
2997 sv_upgrade(dstr, SVt_PVIV);
2998 break;
2999 }
3000 /* Fall through */
3001#endif
3002 case SVt_PV:
8990e307 3003 if (dtype < SVt_PV)
463ee0b2 3004 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
3005 break;
3006 case SVt_PVIV:
8990e307 3007 if (dtype < SVt_PVIV)
463ee0b2 3008 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
3009 break;
3010 case SVt_PVNV:
8990e307 3011 if (dtype < SVt_PVNV)
463ee0b2 3012 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 3013 break;
4633a7c4
LW
3014 case SVt_PVAV:
3015 case SVt_PVHV:
3016 case SVt_PVCV:
4633a7c4 3017 case SVt_PVIO:
a3b680e6
AL
3018 {
3019 const char * const type = sv_reftype(sstr,0);
533c011a 3020 if (PL_op)
a3b680e6 3021 Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_NAME(PL_op));
4633a7c4 3022 else
a3b680e6
AL
3023 Perl_croak(aTHX_ "Bizarre copy of %s", type);
3024 }
4633a7c4
LW
3025 break;
3026
79072805 3027 case SVt_PVGV:
8990e307 3028 if (dtype <= SVt_PVGV) {
c07a80fd 3029 glob_assign:
a5f75d66 3030 if (dtype != SVt_PVGV) {
a3b680e6
AL
3031 const char * const name = GvNAME(sstr);
3032 const STRLEN len = GvNAMELEN(sstr);
b76195c2
DM
3033 /* don't upgrade SVt_PVLV: it can hold a glob */
3034 if (dtype != SVt_PVLV)
3035 sv_upgrade(dstr, SVt_PVGV);
14befaf4 3036 sv_magic(dstr, dstr, PERL_MAGIC_glob, Nullch, 0);
e15faf7d
NC
3037 GvSTASH(dstr) = GvSTASH(sstr);
3038 if (GvSTASH(dstr))
3039 Perl_sv_add_backref(aTHX_ (SV*)GvSTASH(dstr), dstr);
a0d0e21e
LW
3040 GvNAME(dstr) = savepvn(name, len);
3041 GvNAMELEN(dstr) = len;
3042 SvFAKE_on(dstr); /* can coerce to non-glob */
3043 }
5bd07a3d 3044
7fb37951
AMS
3045#ifdef GV_UNIQUE_CHECK
3046 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
3047 Perl_croak(aTHX_ PL_no_modify);
3048 }
3049#endif
3050
a0d0e21e 3051 (void)SvOK_off(dstr);
a5f75d66 3052 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 3053 gp_free((GV*)dstr);
79072805 3054 GvGP(dstr) = gp_ref(GvGP(sstr));
27c9684d
AP
3055 if (SvTAINTED(sstr))
3056 SvTAINT(dstr);
1d7c1841
GS
3057 if (GvIMPORTED(dstr) != GVf_IMPORTED
3058 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3059 {
a5f75d66 3060 GvIMPORTED_on(dstr);
1d7c1841 3061 }
a5f75d66 3062 GvMULTI_on(dstr);
79072805
LW
3063 return;
3064 }
3065 /* FALL THROUGH */
3066
3067 default:
8d6d96c1 3068 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 3069 mg_get(sstr);
eb160463 3070 if ((int)SvTYPE(sstr) != stype) {
973f89ab
CS
3071 stype = SvTYPE(sstr);
3072 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
3073 goto glob_assign;
3074 }
3075 }
ded42b9f 3076 if (stype == SVt_PVLV)
862a34c6 3077 SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 3078 else
862a34c6 3079 SvUPGRADE(dstr, (U32)stype);
79072805
LW
3080 }
3081
8990e307
LW
3082 sflags = SvFLAGS(sstr);
3083
3084 if (sflags & SVf_ROK) {
3085 if (dtype >= SVt_PV) {
3086 if (dtype == SVt_PVGV) {
823a54a3 3087 SV * const sref = SvREFCNT_inc(SvRV(sstr));
cbbf8932 3088 SV *dref = NULL;
a3b680e6 3089 const int intro = GvINTRO(dstr);
a0d0e21e 3090
7fb37951
AMS
3091#ifdef GV_UNIQUE_CHECK
3092 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
3093 Perl_croak(aTHX_ PL_no_modify);
3094 }
3095#endif
3096
a0d0e21e 3097 if (intro) {
a5f75d66 3098 GvINTRO_off(dstr); /* one-shot flag */
1d7c1841 3099 GvLINE(dstr) = CopLINE(PL_curcop);
1edc1566 3100 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 3101 }
a5f75d66 3102 GvMULTI_on(dstr);
8990e307
LW
3103 switch (SvTYPE(sref)) {
3104 case SVt_PVAV:
a0d0e21e 3105 if (intro)
890ed176 3106 SAVEGENERICSV(GvAV(dstr));
a0d0e21e
LW
3107 else
3108 dref = (SV*)GvAV(dstr);
8990e307 3109 GvAV(dstr) = (AV*)sref;
39bac7f7 3110 if (!GvIMPORTED_AV(dstr)
1d7c1841
GS
3111 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3112 {
a5f75d66 3113 GvIMPORTED_AV_on(dstr);
1d7c1841 3114 }
8990e307
LW
3115 break;
3116 case SVt_PVHV:
a0d0e21e 3117 if (intro)
890ed176 3118 SAVEGENERICSV(GvHV(dstr));
a0d0e21e
LW
3119 else
3120 dref = (SV*)GvHV(dstr);
8990e307 3121 GvHV(dstr) = (HV*)sref;
39bac7f7 3122 if (!GvIMPORTED_HV(dstr)
1d7c1841
GS
3123 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3124 {
a5f75d66 3125 GvIMPORTED_HV_on(dstr);
1d7c1841 3126 }
8990e307
LW
3127 break;
3128 case SVt_PVCV:
8ebc5c01 3129 if (intro) {
3130 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
3131 SvREFCNT_dec(GvCV(dstr));
3132 GvCV(dstr) = Nullcv;
68dc0745 3133 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 3134 PL_sub_generation++;
8ebc5c01 3135 }
890ed176 3136 SAVEGENERICSV(GvCV(dstr));
8ebc5c01 3137 }
68dc0745 3138 else
3139 dref = (SV*)GvCV(dstr);
3140 if (GvCV(dstr) != (CV*)sref) {
823a54a3 3141 CV* const cv = GvCV(dstr);
4633a7c4 3142 if (cv) {
68dc0745 3143 if (!GvCVGEN((GV*)dstr) &&
3144 (CvROOT(cv) || CvXSUB(cv)))
3145 {
beab0874
JT
3146 /* Redefining a sub - warning is mandatory if
3147 it was a const and its value changed. */
2111d928
NC
3148 if (CvCONST(cv) && CvCONST((CV*)sref)
3149 && cv_const_sv(cv)
3150 == cv_const_sv((CV*)sref)) {
3151 /* They are 2 constant subroutines
3152 generated from the same constant.
3153 This probably means that they are
3154 really the "same" proxy subroutine
3155 instantiated in 2 places. Most likely
3156 this is when a constant is exported
3157 twice. Don't warn. */
3158 }
3159 else if (ckWARN(WARN_REDEFINE)
beab0874
JT
3160 || (CvCONST(cv)
3161 && (!CvCONST((CV*)sref)
3162 || sv_cmp(cv_const_sv(cv),
3163 cv_const_sv((CV*)sref)))))
3164 {
9014280d 3165 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
beab0874 3166 CvCONST(cv)
910764e6
RGS
3167 ? "Constant subroutine %s::%s redefined"
3168 : "Subroutine %s::%s redefined",
bfcb3514 3169 HvNAME_get(GvSTASH((GV*)dstr)),
beab0874
JT
3170 GvENAME((GV*)dstr));
3171 }
9607fc9c 3172 }
fb24441d
RGS
3173 if (!intro)
3174 cv_ckproto(cv, (GV*)dstr,
93524f2b
NC
3175 SvPOK(sref)
3176 ? SvPVX_const(sref) : Nullch);
4633a7c4 3177 }
a5f75d66 3178 GvCV(dstr) = (CV*)sref;
7a4c00b4 3179 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 3180 GvASSUMECV_on(dstr);
3280af22 3181 PL_sub_generation++;
a5f75d66 3182 }
39bac7f7 3183 if (!GvIMPORTED_CV(dstr)
1d7c1841
GS
3184 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3185 {
a5f75d66 3186 GvIMPORTED_CV_on(dstr);
1d7c1841 3187 }
8990e307 3188 break;
91bba347
LW
3189 case SVt_PVIO:
3190 if (intro)
890ed176 3191 SAVEGENERICSV(GvIOp(dstr));
91bba347
LW
3192 else
3193 dref = (SV*)GvIOp(dstr);
3194 GvIOp(dstr) = (IO*)sref;
3195 break;
f4d13ee9
JH
3196 case SVt_PVFM:
3197 if (intro)
890ed176 3198 SAVEGENERICSV(GvFORM(dstr));
f4d13ee9
JH
3199 else
3200 dref = (SV*)GvFORM(dstr);
3201 GvFORM(dstr) = (CV*)sref;
3202 break;
8990e307 3203 default:
a0d0e21e 3204 if (intro)
890ed176 3205 SAVEGENERICSV(GvSV(dstr));
a0d0e21e
LW
3206 else
3207 dref = (SV*)GvSV(dstr);
8990e307 3208 GvSV(dstr) = sref;
39bac7f7 3209 if (!GvIMPORTED_SV(dstr)
1d7c1841
GS
3210 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3211 {
a5f75d66 3212 GvIMPORTED_SV_on(dstr);
1d7c1841 3213 }
8990e307
LW
3214 break;
3215 }
3216 if (dref)
3217 SvREFCNT_dec(dref);
27c9684d
AP
3218 if (SvTAINTED(sstr))
3219 SvTAINT(dstr);
8990e307
LW
3220 return;
3221 }
3f7c398e 3222 if (SvPVX_const(dstr)) {
8bd4d4c5 3223 SvPV_free(dstr);
b162af07
SP
3224 SvLEN_set(dstr, 0);
3225 SvCUR_set(dstr, 0);
a0d0e21e 3226 }
8990e307 3227 }
a0d0e21e 3228 (void)SvOK_off(dstr);
b162af07 3229 SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
ed6116ce 3230 SvROK_on(dstr);
8990e307 3231 if (sflags & SVp_NOK) {
3332b3c1
JH
3232 SvNOKp_on(dstr);
3233 /* Only set the public OK flag if the source has public OK. */
3234 if (sflags & SVf_NOK)
3235 SvFLAGS(dstr) |= SVf_NOK;
9d6ce603 3236 SvNV_set(dstr, SvNVX(sstr));
ed6116ce 3237 }
8990e307 3238 if (sflags & SVp_IOK) {
3332b3c1
JH
3239 (void)SvIOKp_on(dstr);
3240 if (sflags & SVf_IOK)
3241 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 3242 if (sflags & SVf_IVisUV)
25da4f38 3243 SvIsUV_on(dstr);
45977657 3244 SvIV_set(dstr, SvIVX(sstr));
ed6116ce 3245 }
a0d0e21e
LW
3246 if (SvAMAGIC(sstr)) {
3247 SvAMAGIC_on(dstr);
3248 }
ed6116ce 3249 }
8990e307 3250 else if (sflags & SVp_POK) {
765f542d 3251 bool isSwipe = 0;
79072805
LW
3252
3253 /*
3254 * Check to see if we can just swipe the string. If so, it's a
3255 * possible small lose on short strings, but a big win on long ones.
3f7c398e
SP
3256 * It might even be a win on short strings if SvPVX_const(dstr)
3257 * has to be allocated and SvPVX_const(sstr) has to be freed.
79072805
LW
3258 */
3259
120fac95
NC
3260 /* Whichever path we take through the next code, we want this true,
3261 and doing it now facilitates the COW check. */
3262 (void)SvPOK_only(dstr);
3263
765f542d 3264 if (
b8f9541a
NC
3265 /* We're not already COW */
3266 ((sflags & (SVf_FAKE | SVf_READONLY)) != (SVf_FAKE | SVf_READONLY)
f8c7b90f 3267#ifndef PERL_OLD_COPY_ON_WRITE
b8f9541a
NC
3268 /* or we are, but dstr isn't a suitable target. */
3269 || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
3270#endif
3271 )
765f542d 3272 &&
765f542d
NC
3273 !(isSwipe =
3274 (sflags & SVs_TEMP) && /* slated for free anyway? */
3275 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
5fcdf167
NC
3276 (!(flags & SV_NOSTEAL)) &&
3277 /* and we're allowed to steal temps */
765f542d
NC
3278 SvREFCNT(sstr) == 1 && /* and no other references to it? */
3279 SvLEN(sstr) && /* and really is a string */
645c22ef 3280 /* and won't be needed again, potentially */
765f542d 3281 !(PL_op && PL_op->op_type == OP_AASSIGN))
f8c7b90f 3282#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 3283 && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
120fac95 3284 && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
765f542d
NC
3285 && SvTYPE(sstr) >= SVt_PVIV)
3286#endif
3287 ) {
3288 /* Failed the swipe test, and it's not a shared hash key either.
3289 Have to copy the string. */
3290 STRLEN len = SvCUR(sstr);
3291 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3f7c398e 3292 Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
765f542d
NC
3293 SvCUR_set(dstr, len);
3294 *SvEND(dstr) = '\0';
765f542d 3295 } else {
f8c7b90f 3296 /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
765f542d 3297 be true in here. */
765f542d
NC
3298 /* Either it's a shared hash key, or it's suitable for
3299 copy-on-write or we can swipe the string. */
46187eeb 3300 if (DEBUG_C_TEST) {
ed252734 3301 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
3302 sv_dump(sstr);
3303 sv_dump(dstr);
46187eeb 3304 }
f8c7b90f 3305#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
3306 if (!isSwipe) {
3307 /* I believe I should acquire a global SV mutex if
3308 it's a COW sv (not a shared hash key) to stop
3309 it going un copy-on-write.
3310 If the source SV has gone un copy on write between up there
3311 and down here, then (assert() that) it is of the correct
3312 form to make it copy on write again */
3313 if ((sflags & (SVf_FAKE | SVf_READONLY))
3314 != (SVf_FAKE | SVf_READONLY)) {
3315 SvREADONLY_on(sstr);
3316 SvFAKE_on(sstr);
3317 /* Make the source SV into a loop of 1.
3318 (about to become 2) */
a29f6d03 3319 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
3320 }
3321 }
3322#endif
3323 /* Initial code is common. */
94010e71
NC
3324 if (SvPVX_const(dstr)) { /* we know that dtype >= SVt_PV */
3325 SvPV_free(dstr);
79072805 3326 }
765f542d 3327
765f542d
NC
3328 if (!isSwipe) {
3329 /* making another shared SV. */
3330 STRLEN cur = SvCUR(sstr);
3331 STRLEN len = SvLEN(sstr);
f8c7b90f 3332#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 3333 if (len) {
b8f9541a 3334 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
3335 /* SvIsCOW_normal */
3336 /* splice us in between source and next-after-source. */
a29f6d03
NC
3337 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3338 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 3339 SvPV_set(dstr, SvPVX_mutable(sstr));
a604c751
NC
3340 } else
3341#endif
3342 {
765f542d 3343 /* SvIsCOW_shared_hash */
46187eeb
NC
3344 DEBUG_C(PerlIO_printf(Perl_debug_log,
3345 "Copy on write: Sharing hash\n"));
b8f9541a 3346
bdd68bc3 3347 assert (SvTYPE(dstr) >= SVt_PV);
765f542d 3348 SvPV_set(dstr,
d1db91c6 3349 HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
bdd68bc3 3350 }
87a1ef3d
SP
3351 SvLEN_set(dstr, len);
3352 SvCUR_set(dstr, cur);
765f542d
NC
3353 SvREADONLY_on(dstr);
3354 SvFAKE_on(dstr);
3355 /* Relesase a global SV mutex. */
3356 }
3357 else
765f542d 3358 { /* Passes the swipe test. */
78d1e721 3359 SvPV_set(dstr, SvPVX_mutable(sstr));
765f542d
NC
3360 SvLEN_set(dstr, SvLEN(sstr));
3361 SvCUR_set(dstr, SvCUR(sstr));
3362
3363 SvTEMP_off(dstr);
3364 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
3365 SvPV_set(sstr, Nullch);
3366 SvLEN_set(sstr, 0);
3367 SvCUR_set(sstr, 0);
3368 SvTEMP_off(sstr);
3369 }
3370 }
9aa983d2 3371 if (sflags & SVf_UTF8)
a7cb1f99 3372 SvUTF8_on(dstr);
8990e307 3373 if (sflags & SVp_NOK) {
3332b3c1
JH
3374 SvNOKp_on(dstr);
3375 if (sflags & SVf_NOK)
3376 SvFLAGS(dstr) |= SVf_NOK;
9d6ce603 3377 SvNV_set(dstr, SvNVX(sstr));
79072805 3378 }
8990e307 3379 if (sflags & SVp_IOK) {
3332b3c1
JH
3380 (void)SvIOKp_on(dstr);
3381 if (sflags & SVf_IOK)
3382 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 3383 if (sflags & SVf_IVisUV)
25da4f38 3384 SvIsUV_on(dstr);
45977657 3385 SvIV_set(dstr, SvIVX(sstr));
79072805 3386 }
92f0c265 3387 if (SvVOK(sstr)) {
00b6aa41 3388 const MAGIC * const smg = mg_find(sstr,PERL_MAGIC_vstring);
ece467f9
JP
3389 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
3390 smg->mg_ptr, smg->mg_len);
439cb1c4 3391 SvRMAGICAL_on(dstr);
7a5fa8a2 3392 }
79072805 3393 }
8990e307 3394 else if (sflags & SVp_IOK) {
3332b3c1
JH
3395 if (sflags & SVf_IOK)
3396 (void)SvIOK_only(dstr);
3397 else {
9cbac4c7
DM
3398 (void)SvOK_off(dstr);
3399 (void)SvIOKp_on(dstr);
3332b3c1
JH
3400 }
3401 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2b1c7e3e 3402 if (sflags & SVf_IVisUV)
25da4f38 3403 SvIsUV_on(dstr);
45977657 3404 SvIV_set(dstr, SvIVX(sstr));
3332b3c1
JH
3405 if (sflags & SVp_NOK) {
3406 if (sflags & SVf_NOK)
3407 (void)SvNOK_on(dstr);
3408 else
3409 (void)SvNOKp_on(dstr);
9d6ce603 3410 SvNV_set(dstr, SvNVX(sstr));
3332b3c1
JH
3411 }
3412 }
3413 else if (sflags & SVp_NOK) {
3414 if (sflags & SVf_NOK)
3415 (void)SvNOK_only(dstr);
3416 else {
9cbac4c7 3417 (void)SvOK_off(dstr);
3332b3c1
JH
3418 SvNOKp_on(dstr);
3419 }
9d6ce603 3420 SvNV_set(dstr, SvNVX(sstr));
79072805
LW
3421 }
3422 else {
20408e3c 3423 if (dtype == SVt_PVGV) {
e476b1b5 3424 if (ckWARN(WARN_MISC))
9014280d 3425 Perl_warner(aTHX_ packWARN(WARN_MISC), "Undefined value assigned to typeglob");
20408e3c
GS
3426 }
3427 else
3428 (void)SvOK_off(dstr);
a0d0e21e 3429 }
27c9684d
AP
3430 if (SvTAINTED(sstr))
3431 SvTAINT(dstr);
79072805
LW
3432}
3433
954c1994
GS
3434/*
3435=for apidoc sv_setsv_mg
3436
3437Like C<sv_setsv>, but also handles 'set' magic.
3438
3439=cut
3440*/
3441
79072805 3442void
864dbfa3 3443Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
3444{
3445 sv_setsv(dstr,sstr);
3446 SvSETMAGIC(dstr);
3447}
3448
f8c7b90f 3449#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
3450SV *
3451Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
3452{
3453 STRLEN cur = SvCUR(sstr);
3454 STRLEN len = SvLEN(sstr);
3455 register char *new_pv;
3456
3457 if (DEBUG_C_TEST) {
3458 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
3459 sstr, dstr);
3460 sv_dump(sstr);
3461 if (dstr)
3462 sv_dump(dstr);
3463 }
3464
3465 if (dstr) {
3466 if (SvTHINKFIRST(dstr))
3467 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
3f7c398e
SP
3468 else if (SvPVX_const(dstr))
3469 Safefree(SvPVX_const(dstr));
ed252734
NC
3470 }
3471 else
3472 new_SV(dstr);
862a34c6 3473 SvUPGRADE(dstr, SVt_PVIV);
ed252734
NC
3474
3475 assert (SvPOK(sstr));
3476 assert (SvPOKp(sstr));
3477 assert (!SvIOK(sstr));
3478 assert (!SvIOKp(sstr));
3479 assert (!SvNOK(sstr));
3480 assert (!SvNOKp(sstr));
3481
3482 if (SvIsCOW(sstr)) {
3483
3484 if (SvLEN(sstr) == 0) {
3485 /* source is a COW shared hash key. */
ed252734
NC
3486 DEBUG_C(PerlIO_printf(Perl_debug_log,
3487 "Fast copy on write: Sharing hash\n"));
d1db91c6 3488 new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
ed252734
NC
3489 goto common_exit;
3490 }
3491 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3492 } else {
3493 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
862a34c6 3494 SvUPGRADE(sstr, SVt_PVIV);
ed252734
NC
3495 SvREADONLY_on(sstr);
3496 SvFAKE_on(sstr);
3497 DEBUG_C(PerlIO_printf(Perl_debug_log,
3498 "Fast copy on write: Converting sstr to COW\n"));
3499 SV_COW_NEXT_SV_SET(dstr, sstr);
3500 }
3501 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 3502 new_pv = SvPVX_mutable(sstr);
ed252734
NC
3503
3504 common_exit:
3505 SvPV_set(dstr, new_pv);
3506 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
3507 if (SvUTF8(sstr))
3508 SvUTF8_on(dstr);
87a1ef3d
SP
3509 SvLEN_set(dstr, len);
3510 SvCUR_set(dstr, cur);
ed252734
NC
3511 if (DEBUG_C_TEST) {
3512 sv_dump(dstr);
3513 }
3514 return dstr;
3515}
3516#endif
3517
954c1994
GS
3518/*
3519=for apidoc sv_setpvn
3520
3521Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
3522bytes to be copied. If the C<ptr> argument is NULL the SV will become
3523undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
3524
3525=cut
3526*/
3527
ef50df4b 3528void
864dbfa3 3529Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 3530{
c6f8c383 3531 register char *dptr;
22c522df 3532
765f542d 3533 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 3534 if (!ptr) {
a0d0e21e 3535 (void)SvOK_off(sv);
463ee0b2
LW
3536 return;
3537 }
22c522df
JH
3538 else {
3539 /* len is STRLEN which is unsigned, need to copy to signed */
a3b680e6 3540 const IV iv = len;
9c5ffd7c
JH
3541 if (iv < 0)
3542 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 3543 }
862a34c6 3544 SvUPGRADE(sv, SVt_PV);
c6f8c383 3545
5902b6a9 3546 dptr = SvGROW(sv, len + 1);
c6f8c383
GA
3547 Move(ptr,dptr,len,char);
3548 dptr[len] = '\0';
79072805 3549 SvCUR_set(sv, len);
1aa99e6b 3550 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3551 SvTAINT(sv);
79072805
LW
3552}
3553
954c1994
GS
3554/*
3555=for apidoc sv_setpvn_mg
3556
3557Like C<sv_setpvn>, but also handles 'set' magic.
3558
3559=cut
3560*/
3561
79072805 3562void
864dbfa3 3563Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
3564{
3565 sv_setpvn(sv,ptr,len);
3566 SvSETMAGIC(sv);
3567}
3568
954c1994
GS
3569/*
3570=for apidoc sv_setpv
3571
3572Copies a string into an SV. The string must be null-terminated. Does not
3573handle 'set' magic. See C<sv_setpv_mg>.
3574
3575=cut
3576*/
3577
ef50df4b 3578void
864dbfa3 3579Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
3580{
3581 register STRLEN len;
3582
765f542d 3583 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 3584 if (!ptr) {
a0d0e21e 3585 (void)SvOK_off(sv);
463ee0b2
LW
3586 return;
3587 }
79072805 3588 len = strlen(ptr);
862a34c6 3589 SvUPGRADE(sv, SVt_PV);
c6f8c383 3590
79072805 3591 SvGROW(sv, len + 1);
463ee0b2 3592 Move(ptr,SvPVX(sv),len+1,char);
79072805 3593 SvCUR_set(sv, len);
1aa99e6b 3594 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
3595 SvTAINT(sv);
3596}
3597
954c1994
GS
3598/*
3599=for apidoc sv_setpv_mg
3600
3601Like C<sv_setpv>, but also handles 'set' magic.
3602
3603=cut
3604*/
3605
463ee0b2 3606void
864dbfa3 3607Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
3608{
3609 sv_setpv(sv,ptr);
3610 SvSETMAGIC(sv);
3611}
3612
954c1994
GS
3613/*
3614=for apidoc sv_usepvn
3615
3616Tells an SV to use C<ptr> to find its string value. Normally the string is
1c846c1f 3617stored inside the SV but sv_usepvn allows the SV to use an outside string.
954c1994
GS
3618The C<ptr> should point to memory that was allocated by C<malloc>. The
3619string length, C<len>, must be supplied. This function will realloc the
3620memory pointed to by C<ptr>, so that pointer should not be freed or used by
3621the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
3622See C<sv_usepvn_mg>.
3623
3624=cut
3625*/
3626
ef50df4b 3627void
864dbfa3 3628Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 3629{
1936d2a7 3630 STRLEN allocate;
765f542d 3631 SV_CHECK_THINKFIRST_COW_DROP(sv);
862a34c6 3632 SvUPGRADE(sv, SVt_PV);
463ee0b2 3633 if (!ptr) {
a0d0e21e 3634 (void)SvOK_off(sv);
463ee0b2
LW
3635 return;
3636 }
3f7c398e 3637 if (SvPVX_const(sv))
8bd4d4c5 3638 SvPV_free(sv);
1936d2a7
NC
3639
3640 allocate = PERL_STRLEN_ROUNDUP(len + 1);
7a9b70e9 3641 ptr = saferealloc (ptr, allocate);
f880fe2f 3642 SvPV_set(sv, ptr);
463ee0b2 3643 SvCUR_set(sv, len);
1936d2a7 3644 SvLEN_set(sv, allocate);
463ee0b2 3645 *SvEND(sv) = '\0';
1aa99e6b 3646 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3647 SvTAINT(sv);
79072805
LW
3648}
3649
954c1994
GS
3650/*
3651=for apidoc sv_usepvn_mg
3652
3653Like C<sv_usepvn>, but also handles 'set' magic.
3654
3655=cut
3656*/
3657
ef50df4b 3658void
864dbfa3 3659Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 3660{
51c1089b 3661 sv_usepvn(sv,ptr,len);
ef50df4b
GS
3662 SvSETMAGIC(sv);
3663}
3664
f8c7b90f 3665#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
3666/* Need to do this *after* making the SV normal, as we need the buffer
3667 pointer to remain valid until after we've copied it. If we let go too early,
3668 another thread could invalidate it by unsharing last of the same hash key
3669 (which it can do by means other than releasing copy-on-write Svs)
3670 or by changing the other copy-on-write SVs in the loop. */
3671STATIC void
bdd68bc3 3672S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, STRLEN len, SV *after)
765f542d
NC
3673{
3674 if (len) { /* this SV was SvIsCOW_normal(sv) */
3675 /* we need to find the SV pointing to us. */
aec46f14 3676 SV * const current = SV_COW_NEXT_SV(after);
7a5fa8a2 3677
765f542d
NC
3678 if (current == sv) {
3679 /* The SV we point to points back to us (there were only two of us
3680 in the loop.)
3681 Hence other SV is no longer copy on write either. */
3682 SvFAKE_off(after);
3683 SvREADONLY_off(after);
3684 } else {
3685 /* We need to follow the pointers around the loop. */
3686 SV *next;
3687 while ((next = SV_COW_NEXT_SV(current)) != sv) {
3688 assert (next);
3689 current = next;
3690 /* don't loop forever if the structure is bust, and we have
3691 a pointer into a closed loop. */
3692 assert (current != after);
3f7c398e 3693 assert (SvPVX_const(current) == pvx);
765f542d
NC
3694 }
3695 /* Make the SV before us point to the SV after us. */
a29f6d03 3696 SV_COW_NEXT_SV_SET(current, after);
765f542d
NC
3697 }
3698 } else {
bdd68bc3 3699 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
765f542d
NC
3700 }
3701}
3702
3703int
3704Perl_sv_release_IVX(pTHX_ register SV *sv)
3705{
3706 if (SvIsCOW(sv))
3707 sv_force_normal_flags(sv, 0);
0c34ef67
MHM
3708 SvOOK_off(sv);
3709 return 0;
765f542d
NC
3710}
3711#endif
645c22ef
DM
3712/*
3713=for apidoc sv_force_normal_flags
3714
3715Undo various types of fakery on an SV: if the PV is a shared string, make
3716a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
3717an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
3718we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
3719then a copy-on-write scalar drops its PV buffer (if any) and becomes
3720SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 3721set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
3722C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
3723with flags set to 0.
645c22ef
DM
3724
3725=cut
3726*/
3727
6fc92669 3728void
840a7b70 3729Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 3730{
f8c7b90f 3731#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
3732 if (SvREADONLY(sv)) {
3733 /* At this point I believe I should acquire a global SV mutex. */
3734 if (SvFAKE(sv)) {
b64e5050 3735 const char * const pvx = SvPVX_const(sv);
a28509cc
AL
3736 const STRLEN len = SvLEN(sv);
3737 const STRLEN cur = SvCUR(sv);
a28509cc 3738 SV * const next = SV_COW_NEXT_SV(sv); /* next COW sv in the loop. */
46187eeb
NC
3739 if (DEBUG_C_TEST) {
3740 PerlIO_printf(Perl_debug_log,
3741 "Copy on write: Force normal %ld\n",
3742 (long) flags);
e419cbc5 3743 sv_dump(sv);
46187eeb 3744 }
765f542d
NC
3745 SvFAKE_off(sv);
3746 SvREADONLY_off(sv);
9f653bb5 3747 /* This SV doesn't own the buffer, so need to Newx() a new one: */
f880fe2f 3748 SvPV_set(sv, (char*)0);
87a1ef3d 3749 SvLEN_set(sv, 0);
765f542d
NC
3750 if (flags & SV_COW_DROP_PV) {
3751 /* OK, so we don't need to copy our buffer. */
3752 SvPOK_off(sv);
3753 } else {
3754 SvGROW(sv, cur + 1);
3755 Move(pvx,SvPVX(sv),cur,char);
87a1ef3d 3756 SvCUR_set(sv, cur);
765f542d
NC
3757 *SvEND(sv) = '\0';
3758 }
bdd68bc3 3759 sv_release_COW(sv, pvx, len, next);
46187eeb 3760 if (DEBUG_C_TEST) {
e419cbc5 3761 sv_dump(sv);
46187eeb 3762 }
765f542d 3763 }
923e4eb5 3764 else if (IN_PERL_RUNTIME)
765f542d
NC
3765 Perl_croak(aTHX_ PL_no_modify);
3766 /* At this point I believe that I can drop the global SV mutex. */
3767 }
3768#else
2213622d 3769 if (SvREADONLY(sv)) {
1c846c1f 3770 if (SvFAKE(sv)) {
b64e5050 3771 const char * const pvx = SvPVX_const(sv);
66a1b24b 3772 const STRLEN len = SvCUR(sv);
10bcdfd6
NC
3773 SvFAKE_off(sv);
3774 SvREADONLY_off(sv);
66a1b24b
AL
3775 SvPV_set(sv, Nullch);
3776 SvLEN_set(sv, 0);
1c846c1f 3777 SvGROW(sv, len + 1);
706aa1c9 3778 Move(pvx,SvPVX(sv),len,char);
1c846c1f 3779 *SvEND(sv) = '\0';
bdd68bc3 3780 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
1c846c1f 3781 }
923e4eb5 3782 else if (IN_PERL_RUNTIME)
cea2e8a9 3783 Perl_croak(aTHX_ PL_no_modify);
0f15f207 3784 }
765f542d 3785#endif
2213622d 3786 if (SvROK(sv))
840a7b70 3787 sv_unref_flags(sv, flags);
6fc92669
GS
3788 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
3789 sv_unglob(sv);
0f15f207 3790}
1c846c1f 3791
645c22ef 3792/*
954c1994
GS
3793=for apidoc sv_chop
3794
1c846c1f 3795Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
3796SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
3797the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 3798string. Uses the "OOK hack".
3f7c398e 3799Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
31869a79 3800refer to the same chunk of data.
954c1994
GS
3801
3802=cut
3803*/
3804
79072805 3805void
f54cb97a 3806Perl_sv_chop(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
3807{
3808 register STRLEN delta;
a0d0e21e 3809 if (!ptr || !SvPOKp(sv))
79072805 3810 return;
3f7c398e 3811 delta = ptr - SvPVX_const(sv);
2213622d 3812 SV_CHECK_THINKFIRST(sv);
79072805
LW
3813 if (SvTYPE(sv) < SVt_PVIV)
3814 sv_upgrade(sv,SVt_PVIV);
3815
3816 if (!SvOOK(sv)) {
50483b2c 3817 if (!SvLEN(sv)) { /* make copy of shared string */
3f7c398e 3818 const char *pvx = SvPVX_const(sv);
a28509cc 3819 const STRLEN len = SvCUR(sv);
50483b2c 3820 SvGROW(sv, len + 1);
706aa1c9 3821 Move(pvx,SvPVX(sv),len,char);
50483b2c
JD
3822 *SvEND(sv) = '\0';
3823 }
45977657 3824 SvIV_set(sv, 0);
a4bfb290
AB
3825 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
3826 and we do that anyway inside the SvNIOK_off
3827 */
7a5fa8a2 3828 SvFLAGS(sv) |= SVf_OOK;
79072805 3829 }
a4bfb290 3830 SvNIOK_off(sv);
b162af07
SP
3831 SvLEN_set(sv, SvLEN(sv) - delta);
3832 SvCUR_set(sv, SvCUR(sv) - delta);
f880fe2f 3833 SvPV_set(sv, SvPVX(sv) + delta);
45977657 3834 SvIV_set(sv, SvIVX(sv) + delta);
79072805
LW
3835}
3836
954c1994
GS
3837/*
3838=for apidoc sv_catpvn
3839
3840Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
3841C<len> indicates number of bytes to copy. If the SV has the UTF-8
3842status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 3843Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 3844
8d6d96c1
HS
3845=for apidoc sv_catpvn_flags
3846
3847Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
3848C<len> indicates number of bytes to copy. If the SV has the UTF-8
3849status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
3850If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
3851appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
3852in terms of this function.
3853
3854=cut
3855*/
3856
3857void
3858Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
3859{
3860 STRLEN dlen;
fabdb6c0 3861 const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
8d6d96c1 3862
8d6d96c1
HS
3863 SvGROW(dsv, dlen + slen + 1);
3864 if (sstr == dstr)
3f7c398e 3865 sstr = SvPVX_const(dsv);
8d6d96c1 3866 Move(sstr, SvPVX(dsv) + dlen, slen, char);
b162af07 3867 SvCUR_set(dsv, SvCUR(dsv) + slen);
8d6d96c1
HS
3868 *SvEND(dsv) = '\0';
3869 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
3870 SvTAINT(dsv);
bddd5118
NC
3871 if (flags & SV_SMAGIC)
3872 SvSETMAGIC(dsv);
79072805
LW
3873}
3874
954c1994 3875/*
954c1994
GS
3876=for apidoc sv_catsv
3877
13e8c8e3
JH
3878Concatenates the string from SV C<ssv> onto the end of the string in
3879SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
3880not 'set' magic. See C<sv_catsv_mg>.
954c1994 3881
8d6d96c1
HS
3882=for apidoc sv_catsv_flags
3883
3884Concatenates the string from SV C<ssv> onto the end of the string in
3885SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
3886bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
3887and C<sv_catsv_nomg> are implemented in terms of this function.
3888
3889=cut */
3890
ef50df4b 3891void
8d6d96c1 3892Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 3893{
bddd5118 3894 if (ssv) {
00b6aa41
AL
3895 STRLEN slen;
3896 const char *spv = SvPV_const(ssv, slen);
3897 if (spv) {
bddd5118
NC
3898 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
3899 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
3900 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
3901 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
3902 dsv->sv_flags doesn't have that bit set.
4fd84b44 3903 Andy Dougherty 12 Oct 2001
bddd5118
NC
3904 */
3905 const I32 sutf8 = DO_UTF8(ssv);
3906 I32 dutf8;
13e8c8e3 3907
bddd5118
NC
3908 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
3909 mg_get(dsv);
3910 dutf8 = DO_UTF8(dsv);
8d6d96c1 3911
bddd5118
NC
3912 if (dutf8 != sutf8) {
3913 if (dutf8) {
3914 /* Not modifying source SV, so taking a temporary copy. */
00b6aa41 3915 SV* const csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 3916
bddd5118
NC
3917 sv_utf8_upgrade(csv);
3918 spv = SvPV_const(csv, slen);
3919 }
3920 else
3921 sv_utf8_upgrade_nomg(dsv);
13e8c8e3 3922 }
bddd5118 3923 sv_catpvn_nomg(dsv, spv, slen);
e84ff256 3924 }
560a288e 3925 }
bddd5118
NC
3926 if (flags & SV_SMAGIC)
3927 SvSETMAGIC(dsv);
79072805
LW
3928}
3929
954c1994 3930/*
954c1994
GS
3931=for apidoc sv_catpv
3932
3933Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
3934If the SV has the UTF-8 status set, then the bytes appended should be
3935valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 3936
d5ce4a7c 3937=cut */
954c1994 3938
ef50df4b 3939void
0c981600 3940Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
3941{
3942 register STRLEN len;
463ee0b2 3943 STRLEN tlen;
748a9306 3944 char *junk;
79072805 3945
0c981600 3946 if (!ptr)
79072805 3947 return;
748a9306 3948 junk = SvPV_force(sv, tlen);
0c981600 3949 len = strlen(ptr);
463ee0b2 3950 SvGROW(sv, tlen + len + 1);
0c981600 3951 if (ptr == junk)
3f7c398e 3952 ptr = SvPVX_const(sv);
0c981600 3953 Move(ptr,SvPVX(sv)+tlen,len+1,char);
b162af07 3954 SvCUR_set(sv, SvCUR(sv) + len);
d41ff1b8 3955 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3956 SvTAINT(sv);
79072805
LW
3957}
3958
954c1994
GS
3959/*
3960=for apidoc sv_catpv_mg
3961
3962Like C<sv_catpv>, but also handles 'set' magic.
3963
3964=cut
3965*/
3966
ef50df4b 3967void
0c981600 3968Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 3969{
0c981600 3970 sv_catpv(sv,ptr);
ef50df4b
GS
3971 SvSETMAGIC(sv);
3972}
3973
645c22ef
DM
3974/*
3975=for apidoc newSV
3976
3977Create a new null SV, or if len > 0, create a new empty SVt_PV type SV
3978with an initial PV allocation of len+1. Normally accessed via the C<NEWSV>
3979macro.
3980
3981=cut
3982*/
3983
79072805 3984SV *
864dbfa3 3985Perl_newSV(pTHX_ STRLEN len)
79072805
LW
3986{
3987 register SV *sv;
1c846c1f 3988
4561caa4 3989 new_SV(sv);
79072805
LW
3990 if (len) {
3991 sv_upgrade(sv, SVt_PV);
3992 SvGROW(sv, len + 1);
3993 }
3994 return sv;
3995}
954c1994 3996/*
92110913 3997=for apidoc sv_magicext
954c1994 3998
68795e93 3999Adds magic to an SV, upgrading it if necessary. Applies the
2d8d5d5a 4000supplied vtable and returns a pointer to the magic added.
92110913 4001
2d8d5d5a
SH
4002Note that C<sv_magicext> will allow things that C<sv_magic> will not.
4003In particular, you can add magic to SvREADONLY SVs, and add more than
4004one instance of the same 'how'.
645c22ef 4005
2d8d5d5a
SH
4006If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
4007stored, if C<namlen> is zero then C<name> is stored as-is and - as another
4008special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
4009to contain an C<SV*> and is stored as-is with its REFCNT incremented.
92110913 4010
2d8d5d5a 4011(This is now used as a subroutine by C<sv_magic>.)
954c1994
GS
4012
4013=cut
4014*/
92110913 4015MAGIC *
e1ec3a88 4016Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, const MGVTBL *vtable,
92110913 4017 const char* name, I32 namlen)
79072805
LW
4018{
4019 MAGIC* mg;
68795e93 4020
92110913 4021 if (SvTYPE(sv) < SVt_PVMG) {
862a34c6 4022 SvUPGRADE(sv, SVt_PVMG);
463ee0b2 4023 }
a02a5408 4024 Newxz(mg, 1, MAGIC);
79072805 4025 mg->mg_moremagic = SvMAGIC(sv);
b162af07 4026 SvMAGIC_set(sv, mg);
75f9d97a 4027
05f95b08
SB
4028 /* Sometimes a magic contains a reference loop, where the sv and
4029 object refer to each other. To prevent a reference loop that
4030 would prevent such objects being freed, we look for such loops
4031 and if we find one we avoid incrementing the object refcount.
87f0b213
JH
4032
4033 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 4034 have its REFCNT incremented to keep it in existence.
87f0b213
JH
4035
4036 */
14befaf4
DM
4037 if (!obj || obj == sv ||
4038 how == PERL_MAGIC_arylen ||
4039 how == PERL_MAGIC_qr ||
8d2f4536 4040 how == PERL_MAGIC_symtab ||
75f9d97a
JH
4041 (SvTYPE(obj) == SVt_PVGV &&
4042 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4043 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 4044 GvFORM(obj) == (CV*)sv)))
75f9d97a 4045 {
8990e307 4046 mg->mg_obj = obj;
75f9d97a 4047 }
85e6fe83 4048 else {
8990e307 4049 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
4050 mg->mg_flags |= MGf_REFCOUNTED;
4051 }
b5ccf5f2
YST
4052
4053 /* Normal self-ties simply pass a null object, and instead of
4054 using mg_obj directly, use the SvTIED_obj macro to produce a
4055 new RV as needed. For glob "self-ties", we are tieing the PVIO
4056 with an RV obj pointing to the glob containing the PVIO. In
4057 this case, to avoid a reference loop, we need to weaken the
4058 reference.
4059 */
4060
4061 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4062 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
4063 {
4064 sv_rvweaken(obj);
4065 }
4066
79072805 4067 mg->mg_type = how;
565764a8 4068 mg->mg_len = namlen;
9cbac4c7 4069 if (name) {
92110913 4070 if (namlen > 0)
1edc1566 4071 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 4072 else if (namlen == HEf_SVKEY)
1edc1566 4073 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
68795e93 4074 else
92110913 4075 mg->mg_ptr = (char *) name;
9cbac4c7 4076 }
92110913 4077 mg->mg_virtual = vtable;
68795e93 4078
92110913
NIS
4079 mg_magical(sv);
4080 if (SvGMAGICAL(sv))
4081 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4082 return mg;
4083}
4084
4085/*
4086=for apidoc sv_magic
1c846c1f 4087
92110913
NIS
4088Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4089then adds a new magic item of type C<how> to the head of the magic list.
4090
2d8d5d5a
SH
4091See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
4092handling of the C<name> and C<namlen> arguments.
4093
4509d3fb
SB
4094You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
4095to add more than one instance of the same 'how'.
4096
92110913
NIS
4097=cut
4098*/
4099
4100void
4101Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 4102{
aec46f14 4103 const MGVTBL *vtable;
92110913 4104 MAGIC* mg;
92110913 4105
f8c7b90f 4106#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4107 if (SvIsCOW(sv))
4108 sv_force_normal_flags(sv, 0);
4109#endif
92110913 4110 if (SvREADONLY(sv)) {
d8084ca5
DM
4111 if (
4112 /* its okay to attach magic to shared strings; the subsequent
4113 * upgrade to PVMG will unshare the string */
4114 !(SvFAKE(sv) && SvTYPE(sv) < SVt_PVMG)
4115
4116 && IN_PERL_RUNTIME
92110913
NIS
4117 && how != PERL_MAGIC_regex_global
4118 && how != PERL_MAGIC_bm
4119 && how != PERL_MAGIC_fm
4120 && how != PERL_MAGIC_sv
e6469971 4121 && how != PERL_MAGIC_backref
92110913
NIS
4122 )
4123 {
4124 Perl_croak(aTHX_ PL_no_modify);
4125 }
4126 }
4127 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4128 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
4129 /* sv_magic() refuses to add a magic of the same 'how' as an
4130 existing one
92110913
NIS
4131 */
4132 if (how == PERL_MAGIC_taint)
4133 mg->mg_len |= 1;
4134 return;
4135 }
4136 }
68795e93 4137
79072805 4138 switch (how) {
14befaf4 4139 case PERL_MAGIC_sv:
92110913 4140 vtable = &PL_vtbl_sv;
79072805 4141 break;
14befaf4 4142 case PERL_MAGIC_overload:
92110913 4143 vtable = &PL_vtbl_amagic;
a0d0e21e 4144 break;
14befaf4 4145 case PERL_MAGIC_overload_elem:
92110913 4146 vtable = &PL_vtbl_amagicelem;
a0d0e21e 4147 break;
14befaf4 4148 case PERL_MAGIC_overload_table:
92110913 4149 vtable = &PL_vtbl_ovrld;
a0d0e21e 4150 break;
14befaf4 4151 case PERL_MAGIC_bm:
92110913 4152 vtable = &PL_vtbl_bm;
79072805 4153 break;
14befaf4 4154 case PERL_MAGIC_regdata:
92110913 4155 vtable = &PL_vtbl_regdata;
6cef1e77 4156 break;
14befaf4 4157 case PERL_MAGIC_regdatum:
92110913 4158 vtable = &PL_vtbl_regdatum;
6cef1e77 4159 break;
14befaf4 4160 case PERL_MAGIC_env:
92110913 4161 vtable = &PL_vtbl_env;
79072805 4162 break;
14befaf4 4163 case PERL_MAGIC_fm:
92110913 4164 vtable = &PL_vtbl_fm;
55497cff 4165 break;
14befaf4 4166 case PERL_MAGIC_envelem:
92110913 4167 vtable = &PL_vtbl_envelem;
79072805 4168 break;
14befaf4 4169 case PERL_MAGIC_regex_global:
92110913 4170 vtable = &PL_vtbl_mglob;
93a17b20 4171 break;
14befaf4 4172 case PERL_MAGIC_isa:
92110913 4173 vtable = &PL_vtbl_isa;
463ee0b2 4174 break;
14befaf4 4175 case PERL_MAGIC_isaelem:
92110913 4176 vtable = &PL_vtbl_isaelem;
463ee0b2 4177 break;
14befaf4 4178 case PERL_MAGIC_nkeys:
92110913 4179 vtable = &PL_vtbl_nkeys;
16660edb 4180 break;
14befaf4 4181 case PERL_MAGIC_dbfile:
aec46f14 4182 vtable = NULL;
93a17b20 4183 break;
14befaf4 4184 case PERL_MAGIC_dbline:
92110913 4185 vtable = &PL_vtbl_dbline;
79072805 4186 break;
36477c24 4187#ifdef USE_LOCALE_COLLATE
14befaf4 4188 case PERL_MAGIC_collxfrm:
92110913 4189 vtable = &PL_vtbl_collxfrm;
bbce6d69 4190 break;
36477c24 4191#endif /* USE_LOCALE_COLLATE */
14befaf4 4192 case PERL_MAGIC_tied:
92110913 4193 vtable = &PL_vtbl_pack;
463ee0b2 4194 break;
14befaf4
DM
4195 case PERL_MAGIC_tiedelem:
4196 case PERL_MAGIC_tiedscalar:
92110913 4197 vtable = &PL_vtbl_packelem;
463ee0b2 4198 break;
14befaf4 4199 case PERL_MAGIC_qr:
92110913 4200 vtable = &PL_vtbl_regexp;
c277df42 4201 break;
14befaf4 4202 case PERL_MAGIC_sig:
92110913 4203 vtable = &PL_vtbl_sig;
79072805 4204 break;
14befaf4 4205 case PERL_MAGIC_sigelem:
92110913 4206 vtable = &PL_vtbl_sigelem;
79072805 4207 break;
14befaf4 4208 case PERL_MAGIC_taint:
92110913 4209 vtable = &PL_vtbl_taint;
463ee0b2 4210 break;
14befaf4 4211 case PERL_MAGIC_uvar:
92110913 4212 vtable = &PL_vtbl_uvar;
79072805 4213 break;
14befaf4 4214 case PERL_MAGIC_vec:
92110913 4215 vtable = &PL_vtbl_vec;
79072805 4216 break;
a3874608 4217 case PERL_MAGIC_arylen_p:
bfcb3514 4218 case PERL_MAGIC_rhash:
8d2f4536 4219 case PERL_MAGIC_symtab:
ece467f9 4220 case PERL_MAGIC_vstring:
aec46f14 4221 vtable = NULL;
ece467f9 4222 break;
7e8c5dac
HS
4223 case PERL_MAGIC_utf8:
4224 vtable = &PL_vtbl_utf8;
4225 break;
14befaf4 4226 case PERL_MAGIC_substr:
92110913 4227 vtable = &PL_vtbl_substr;
79072805 4228 break;
14befaf4 4229 case PERL_MAGIC_defelem:
92110913 4230 vtable = &PL_vtbl_defelem;
5f05dabc 4231 break;
14befaf4 4232 case PERL_MAGIC_glob:
92110913 4233 vtable = &PL_vtbl_glob;
79072805 4234 break;
14befaf4 4235 case PERL_MAGIC_arylen:
92110913 4236 vtable = &PL_vtbl_arylen;
79072805 4237 break;
14befaf4 4238 case PERL_MAGIC_pos:
92110913 4239 vtable = &PL_vtbl_pos;
a0d0e21e 4240 break;
14befaf4 4241 case PERL_MAGIC_backref:
92110913 4242 vtable = &PL_vtbl_backref;
810b8aa5 4243 break;
14befaf4
DM
4244 case PERL_MAGIC_ext:
4245 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
4246 /* Useful for attaching extension internal data to perl vars. */
4247 /* Note that multiple extensions may clash if magical scalars */
4248 /* etc holding private data from one are passed to another. */
aec46f14 4249 vtable = NULL;
a0d0e21e 4250 break;
79072805 4251 default:
14befaf4 4252 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 4253 }
68795e93 4254
92110913 4255 /* Rest of work is done else where */
aec46f14 4256 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 4257
92110913
NIS
4258 switch (how) {
4259 case PERL_MAGIC_taint:
4260 mg->mg_len = 1;
4261 break;
4262 case PERL_MAGIC_ext:
4263 case PERL_MAGIC_dbfile:
4264 SvRMAGICAL_on(sv);
4265 break;
4266 }
463ee0b2
LW
4267}
4268
c461cf8f
JH
4269/*
4270=for apidoc sv_unmagic
4271
645c22ef 4272Removes all magic of type C<type> from an SV.
c461cf8f
JH
4273
4274=cut
4275*/
4276
463ee0b2 4277int
864dbfa3 4278Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
4279{
4280 MAGIC* mg;
4281 MAGIC** mgp;
91bba347 4282 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
4283 return 0;
4284 mgp = &SvMAGIC(sv);
4285 for (mg = *mgp; mg; mg = *mgp) {
4286 if (mg->mg_type == type) {
e1ec3a88 4287 const MGVTBL* const vtbl = mg->mg_virtual;
463ee0b2 4288 *mgp = mg->mg_moremagic;
1d7c1841 4289 if (vtbl && vtbl->svt_free)
fc0dc3b3 4290 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 4291 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 4292 if (mg->mg_len > 0)
1edc1566 4293 Safefree(mg->mg_ptr);
565764a8 4294 else if (mg->mg_len == HEf_SVKEY)
1edc1566 4295 SvREFCNT_dec((SV*)mg->mg_ptr);
7e8c5dac
HS
4296 else if (mg->mg_type == PERL_MAGIC_utf8 && mg->mg_ptr)
4297 Safefree(mg->mg_ptr);
9cbac4c7 4298 }
a0d0e21e
LW
4299 if (mg->mg_flags & MGf_REFCOUNTED)
4300 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
4301 Safefree(mg);
4302 }
4303 else
4304 mgp = &mg->mg_moremagic;
79072805 4305 }
91bba347 4306 if (!SvMAGIC(sv)) {
463ee0b2 4307 SvMAGICAL_off(sv);
86f55936
NC
4308 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
4309 SvMAGIC_set(sv, NULL);
463ee0b2
LW
4310 }
4311
4312 return 0;
79072805
LW
4313}
4314
c461cf8f
JH
4315/*
4316=for apidoc sv_rvweaken
4317
645c22ef
DM
4318Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
4319referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
4320push a back-reference to this RV onto the array of backreferences
4321associated with that magic.
c461cf8f
JH
4322
4323=cut
4324*/
4325
810b8aa5 4326SV *
864dbfa3 4327Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
4328{
4329 SV *tsv;
4330 if (!SvOK(sv)) /* let undefs pass */
4331 return sv;
4332 if (!SvROK(sv))
cea2e8a9 4333 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 4334 else if (SvWEAKREF(sv)) {
810b8aa5 4335 if (ckWARN(WARN_MISC))
9014280d 4336 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
4337 return sv;
4338 }
4339 tsv = SvRV(sv);
e15faf7d 4340 Perl_sv_add_backref(aTHX_ tsv, sv);
810b8aa5 4341 SvWEAKREF_on(sv);
1c846c1f 4342 SvREFCNT_dec(tsv);
810b8aa5
GS
4343 return sv;
4344}
4345
645c22ef
DM
4346/* Give tsv backref magic if it hasn't already got it, then push a
4347 * back-reference to sv onto the array associated with the backref magic.
4348 */
4349
e15faf7d
NC
4350void
4351Perl_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
4352{
4353 AV *av;
86f55936
NC
4354
4355 if (SvTYPE(tsv) == SVt_PVHV) {
4356 AV **const avp = Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
4357
4358 av = *avp;
4359 if (!av) {
4360 /* There is no AV in the offical place - try a fixup. */
4361 MAGIC *const mg = mg_find(tsv, PERL_MAGIC_backref);
4362
4363 if (mg) {
4364 /* Aha. They've got it stowed in magic. Bring it back. */
4365 av = (AV*)mg->mg_obj;
4366 /* Stop mg_free decreasing the refernce count. */
4367 mg->mg_obj = NULL;
4368 /* Stop mg_free even calling the destructor, given that
4369 there's no AV to free up. */
4370 mg->mg_virtual = 0;
4371 sv_unmagic(tsv, PERL_MAGIC_backref);
4372 } else {
4373 av = newAV();
4374 AvREAL_off(av);
4375 SvREFCNT_inc(av);
4376 }
4377 *avp = av;
4378 }
4379 } else {
4380 const MAGIC *const mg
4381 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
4382 if (mg)
4383 av = (AV*)mg->mg_obj;
4384 else {
4385 av = newAV();
4386 AvREAL_off(av);
4387 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
4388 /* av now has a refcnt of 2, which avoids it getting freed
4389 * before us during global cleanup. The extra ref is removed
4390 * by magic_killbackrefs() when tsv is being freed */
4391 }
810b8aa5 4392 }
d91d49e8 4393 if (AvFILLp(av) >= AvMAX(av)) {
d91d49e8
MM
4394 av_extend(av, AvFILLp(av)+1);
4395 }
4396 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
4397}
4398
645c22ef
DM
4399/* delete a back-reference to ourselves from the backref magic associated
4400 * with the SV we point to.
4401 */
4402
1c846c1f 4403STATIC void
e15faf7d 4404S_sv_del_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5 4405{
86f55936 4406 AV *av = NULL;
810b8aa5
GS
4407 SV **svp;
4408 I32 i;
86f55936
NC
4409
4410 if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
4411 av = *Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
5b285ea4
NC
4412 /* We mustn't attempt to "fix up" the hash here by moving the
4413 backreference array back to the hv_aux structure, as that is stored
4414 in the main HvARRAY(), and hfreentries assumes that no-one
4415 reallocates HvARRAY() while it is running. */
86f55936
NC
4416 }
4417 if (!av) {
4418 const MAGIC *const mg
4419 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
4420 if (mg)
4421 av = (AV *)mg->mg_obj;
4422 }
4423 if (!av) {
e15faf7d
NC
4424 if (PL_in_clean_all)
4425 return;
cea2e8a9 4426 Perl_croak(aTHX_ "panic: del_backref");
86f55936
NC
4427 }
4428
4429 if (SvIS_FREED(av))
4430 return;
4431
810b8aa5 4432 svp = AvARRAY(av);
6a76db8b
NC
4433 /* We shouldn't be in here more than once, but for paranoia reasons lets
4434 not assume this. */
4435 for (i = AvFILLp(av); i >= 0; i--) {
4436 if (svp[i] == sv) {
4437 const SSize_t fill = AvFILLp(av);
4438 if (i != fill) {
4439 /* We weren't the last entry.
4440 An unordered list has this property that you can take the
4441 last element off the end to fill the hole, and it's still
4442 an unordered list :-)
4443 */
4444 svp[i] = svp[fill];
4445 }
4446 svp[fill] = Nullsv;
4447 AvFILLp(av) = fill - 1;
4448 }
4449 }
810b8aa5
GS
4450}
4451
86f55936
NC
4452int
4453Perl_sv_kill_backrefs(pTHX_ SV *sv, AV *av)
4454{
4455 SV **svp = AvARRAY(av);
4456
4457 PERL_UNUSED_ARG(sv);
4458
4459 /* Not sure why the av can get freed ahead of its sv, but somehow it does
4460 in ext/B/t/bytecode.t test 15 (involving print <DATA>) */
4461 if (svp && !SvIS_FREED(av)) {
4462 SV *const *const last = svp + AvFILLp(av);
4463
4464 while (svp <= last) {
4465 if (*svp) {
4466 SV *const referrer = *svp;
4467 if (SvWEAKREF(referrer)) {
4468 /* XXX Should we check that it hasn't changed? */
4469 SvRV_set(referrer, 0);
4470 SvOK_off(referrer);
4471 SvWEAKREF_off(referrer);
4472 } else if (SvTYPE(referrer) == SVt_PVGV ||
4473 SvTYPE(referrer) == SVt_PVLV) {
4474 /* You lookin' at me? */
4475 assert(GvSTASH(referrer));
4476 assert(GvSTASH(referrer) == (HV*)sv);
4477 GvSTASH(referrer) = 0;
4478 } else {
4479 Perl_croak(aTHX_
4480 "panic: magic_killbackrefs (flags=%"UVxf")",
4481 (UV)SvFLAGS(referrer));
4482 }
4483
4484 *svp = Nullsv;
4485 }
4486 svp++;
4487 }
4488 }
4489 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
4490 return 0;
4491}
4492
954c1994
GS
4493/*
4494=for apidoc sv_insert
4495
4496Inserts a string at the specified offset/length within the SV. Similar to
4497the Perl substr() function.
4498
4499=cut
4500*/
4501
79072805 4502void
e1ec3a88 4503Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, const char *little, STRLEN littlelen)
79072805
LW
4504{
4505 register char *big;
4506 register char *mid;
4507 register char *midend;
4508 register char *bigend;
4509 register I32 i;
6ff81951 4510 STRLEN curlen;
1c846c1f 4511
79072805 4512
8990e307 4513 if (!bigstr)
cea2e8a9 4514 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 4515 SvPV_force(bigstr, curlen);
60fa28ff 4516 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
4517 if (offset + len > curlen) {
4518 SvGROW(bigstr, offset+len+1);
93524f2b 4519 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
6ff81951
GS
4520 SvCUR_set(bigstr, offset+len);
4521 }
79072805 4522
69b47968 4523 SvTAINT(bigstr);
79072805
LW
4524 i = littlelen - len;
4525 if (i > 0) { /* string might grow */
a0d0e21e 4526 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
4527 mid = big + offset + len;
4528 midend = bigend = big + SvCUR(bigstr);
4529 bigend += i;
4530 *bigend = '\0';
4531 while (midend > mid) /* shove everything down */
4532 *--bigend = *--midend;
4533 Move(little,big+offset,littlelen,char);
b162af07 4534 SvCUR_set(bigstr, SvCUR(bigstr) + i);
79072805
LW
4535 SvSETMAGIC(bigstr);
4536 return;
4537 }
4538 else if (i == 0) {
463ee0b2 4539 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
4540 SvSETMAGIC(bigstr);
4541 return;
4542 }
4543
463ee0b2 4544 big = SvPVX(bigstr);
79072805
LW
4545 mid = big + offset;
4546 midend = mid + len;
4547 bigend = big + SvCUR(bigstr);
4548
4549 if (midend > bigend)
cea2e8a9 4550 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
4551
4552 if (mid - big > bigend - midend) { /* faster to shorten from end */
4553 if (littlelen) {
4554 Move(little, mid, littlelen,char);
4555 mid += littlelen;
4556 }
4557 i = bigend - midend;
4558 if (i > 0) {
4559 Move(midend, mid, i,char);
4560 mid += i;
4561 }
4562 *mid = '\0';
4563 SvCUR_set(bigstr, mid - big);
4564 }
155aba94 4565 else if ((i = mid - big)) { /* faster from front */
79072805
LW
4566 midend -= littlelen;
4567 mid = midend;
4568 sv_chop(bigstr,midend-i);
4569 big += i;
4570 while (i--)
4571 *--midend = *--big;
4572 if (littlelen)
4573 Move(little, mid, littlelen,char);
4574 }
4575 else if (littlelen) {
4576 midend -= littlelen;
4577 sv_chop(bigstr,midend);
4578 Move(little,midend,littlelen,char);
4579 }
4580 else {
4581 sv_chop(bigstr,midend);
4582 }
4583 SvSETMAGIC(bigstr);
4584}
4585
c461cf8f
JH
4586/*
4587=for apidoc sv_replace
4588
4589Make the first argument a copy of the second, then delete the original.
645c22ef
DM
4590The target SV physically takes over ownership of the body of the source SV
4591and inherits its flags; however, the target keeps any magic it owns,
4592and any magic in the source is discarded.
ff276b08 4593Note that this is a rather specialist SV copying operation; most of the
645c22ef 4594time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
4595
4596=cut
4597*/
79072805
LW
4598
4599void
864dbfa3 4600Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805 4601{
a3b680e6 4602 const U32 refcnt = SvREFCNT(sv);
765f542d 4603 SV_CHECK_THINKFIRST_COW_DROP(sv);
30e5c352 4604 if (SvREFCNT(nsv) != 1) {
7437becc 4605 Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace() (%"
30e5c352
NC
4606 UVuf " != 1)", (UV) SvREFCNT(nsv));
4607 }
93a17b20 4608 if (SvMAGICAL(sv)) {
a0d0e21e
LW
4609 if (SvMAGICAL(nsv))
4610 mg_free(nsv);
4611 else
4612 sv_upgrade(nsv, SVt_PVMG);
b162af07 4613 SvMAGIC_set(nsv, SvMAGIC(sv));
a0d0e21e 4614 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20 4615 SvMAGICAL_off(sv);
b162af07 4616 SvMAGIC_set(sv, NULL);
93a17b20 4617 }
79072805
LW
4618 SvREFCNT(sv) = 0;
4619 sv_clear(sv);
477f5d66 4620 assert(!SvREFCNT(sv));
fd0854ff
DM
4621#ifdef DEBUG_LEAKING_SCALARS
4622 sv->sv_flags = nsv->sv_flags;
4623 sv->sv_any = nsv->sv_any;
4624 sv->sv_refcnt = nsv->sv_refcnt;
f34d0642 4625 sv->sv_u = nsv->sv_u;
fd0854ff 4626#else
79072805 4627 StructCopy(nsv,sv,SV);
fd0854ff 4628#endif
7b2c381c
NC
4629 /* Currently could join these into one piece of pointer arithmetic, but
4630 it would be unclear. */
4631 if(SvTYPE(sv) == SVt_IV)
4632 SvANY(sv)
339049b0 4633 = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
7b2c381c 4634 else if (SvTYPE(sv) == SVt_RV) {
339049b0 4635 SvANY(sv) = &sv->sv_u.svu_rv;
7b2c381c
NC
4636 }
4637
fd0854ff 4638
f8c7b90f 4639#ifdef PERL_OLD_COPY_ON_WRITE
d3d0e6f1
NC
4640 if (SvIsCOW_normal(nsv)) {
4641 /* We need to follow the pointers around the loop to make the
4642 previous SV point to sv, rather than nsv. */
4643 SV *next;
4644 SV *current = nsv;
4645 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
4646 assert(next);
4647 current = next;
3f7c398e 4648 assert(SvPVX_const(current) == SvPVX_const(nsv));
d3d0e6f1
NC
4649 }
4650 /* Make the SV before us point to the SV after us. */
4651 if (DEBUG_C_TEST) {
4652 PerlIO_printf(Perl_debug_log, "previous is\n");
4653 sv_dump(current);
a29f6d03
NC
4654 PerlIO_printf(Perl_debug_log,
4655 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
4656 (UV) SV_COW_NEXT_SV(current), (UV) sv);
4657 }
a29f6d03 4658 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
4659 }
4660#endif
79072805 4661 SvREFCNT(sv) = refcnt;
1edc1566 4662 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 4663 SvREFCNT(nsv) = 0;
463ee0b2 4664 del_SV(nsv);
79072805
LW
4665}
4666
c461cf8f
JH
4667/*
4668=for apidoc sv_clear
4669
645c22ef
DM
4670Clear an SV: call any destructors, free up any memory used by the body,
4671and free the body itself. The SV's head is I<not> freed, although
4672its type is set to all 1's so that it won't inadvertently be assumed
4673to be live during global destruction etc.
4674This function should only be called when REFCNT is zero. Most of the time
4675you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
4676instead.
c461cf8f
JH
4677
4678=cut
4679*/
4680
79072805 4681void
864dbfa3 4682Perl_sv_clear(pTHX_ register SV *sv)
79072805 4683{
27da23d5 4684 dVAR;
82bb6deb 4685 const U32 type = SvTYPE(sv);
8edfc514
NC
4686 const struct body_details *const sv_type_details
4687 = bodies_by_type + type;
82bb6deb 4688
79072805
LW
4689 assert(sv);
4690 assert(SvREFCNT(sv) == 0);
4691
82bb6deb
NC
4692 if (type <= SVt_IV)
4693 return;
4694
ed6116ce 4695 if (SvOBJECT(sv)) {
3280af22 4696 if (PL_defstash) { /* Still have a symbol table? */
39644a26 4697 dSP;
893645bd 4698 HV* stash;
d460ef45 4699 do {
b464bac0 4700 CV* destructor;
4e8e7886 4701 stash = SvSTASH(sv);
32251b26 4702 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 4703 if (destructor) {
1b6737cc 4704 SV* const tmpref = newRV(sv);
5cc433a6 4705 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 4706 ENTER;
e788e7d3 4707 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
4708 EXTEND(SP, 2);
4709 PUSHMARK(SP);
5cc433a6 4710 PUSHs(tmpref);
4e8e7886 4711 PUTBACK;
44389ee9 4712 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
7a5fa8a2
NIS
4713
4714
d3acc0f7 4715 POPSTACK;
3095d977 4716 SPAGAIN;
4e8e7886 4717 LEAVE;
5cc433a6
AB
4718 if(SvREFCNT(tmpref) < 2) {
4719 /* tmpref is not kept alive! */
4720 SvREFCNT(sv)--;
b162af07 4721 SvRV_set(tmpref, NULL);
5cc433a6
AB
4722 SvROK_off(tmpref);
4723 }
4724 SvREFCNT_dec(tmpref);
4e8e7886
GS
4725 }
4726 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 4727
6f44e0a4
JP
4728
4729 if (SvREFCNT(sv)) {
4730 if (PL_in_clean_objs)
cea2e8a9 4731 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
bfcb3514 4732 HvNAME_get(stash));
6f44e0a4
JP
4733 /* DESTROY gave object new lease on life */
4734 return;
4735 }
a0d0e21e 4736 }
4e8e7886 4737
a0d0e21e 4738 if (SvOBJECT(sv)) {
4e8e7886 4739 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e 4740 SvOBJECT_off(sv); /* Curse the object. */
82bb6deb 4741 if (type != SVt_PVIO)
3280af22 4742 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 4743 }
463ee0b2 4744 }
82bb6deb 4745 if (type >= SVt_PVMG) {
524189f1
JH
4746 if (SvMAGIC(sv))
4747 mg_free(sv);
82bb6deb 4748 if (type == SVt_PVMG && SvFLAGS(sv) & SVpad_TYPED)
524189f1
JH
4749 SvREFCNT_dec(SvSTASH(sv));
4750 }
82bb6deb 4751 switch (type) {
8990e307 4752 case SVt_PVIO:
df0bd2f4
GS
4753 if (IoIFP(sv) &&
4754 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 4755 IoIFP(sv) != PerlIO_stdout() &&
4756 IoIFP(sv) != PerlIO_stderr())
93578b34 4757 {
f2b5be74 4758 io_close((IO*)sv, FALSE);
93578b34 4759 }
1d7c1841 4760 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 4761 PerlDir_close(IoDIRP(sv));
1d7c1841 4762 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
4763 Safefree(IoTOP_NAME(sv));
4764 Safefree(IoFMT_NAME(sv));
4765 Safefree(IoBOTTOM_NAME(sv));
82bb6deb 4766 goto freescalar;
79072805 4767 case SVt_PVBM:
a0d0e21e 4768 goto freescalar;
79072805 4769 case SVt_PVCV:
748a9306 4770 case SVt_PVFM:
85e6fe83 4771 cv_undef((CV*)sv);
a0d0e21e 4772 goto freescalar;
79072805 4773 case SVt_PVHV:
86f55936 4774 Perl_hv_kill_backrefs(aTHX_ (HV*)sv);
85e6fe83 4775 hv_undef((HV*)sv);
a0d0e21e 4776 break;
79072805 4777 case SVt_PVAV:
85e6fe83 4778 av_undef((AV*)sv);
a0d0e21e 4779 break;
02270b4e 4780 case SVt_PVLV:
dd28f7bb
DM
4781 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
4782 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
4783 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
4784 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
4785 }
4786 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
4787 SvREFCNT_dec(LvTARG(sv));
02270b4e 4788 goto freescalar;
a0d0e21e 4789 case SVt_PVGV:
1edc1566 4790 gp_free((GV*)sv);
a0d0e21e 4791 Safefree(GvNAME(sv));
893645bd
NC
4792 /* If we're in a stash, we don't own a reference to it. However it does
4793 have a back reference to us, which needs to be cleared. */
4794 if (GvSTASH(sv))
4795 sv_del_backref((SV*)GvSTASH(sv), sv);
79072805 4796 case SVt_PVMG:
79072805
LW
4797 case SVt_PVNV:
4798 case SVt_PVIV:
a0d0e21e 4799 freescalar:
5228ca4e
NC
4800 /* Don't bother with SvOOK_off(sv); as we're only going to free it. */
4801 if (SvOOK(sv)) {
93524f2b 4802 SvPV_set(sv, SvPVX_mutable(sv) - SvIVX(sv));
5228ca4e
NC
4803 /* Don't even bother with turning off the OOK flag. */
4804 }
79072805 4805 case SVt_PV:
a0d0e21e 4806 case SVt_RV:
810b8aa5 4807 if (SvROK(sv)) {
e15faf7d 4808 SV *target = SvRV(sv);
810b8aa5 4809 if (SvWEAKREF(sv))
e15faf7d 4810 sv_del_backref(target, sv);
810b8aa5 4811 else
e15faf7d 4812 SvREFCNT_dec(target);
810b8aa5 4813 }
f8c7b90f 4814#ifdef PERL_OLD_COPY_ON_WRITE
3f7c398e 4815 else if (SvPVX_const(sv)) {
765f542d
NC
4816 if (SvIsCOW(sv)) {
4817 /* I believe I need to grab the global SV mutex here and
4818 then recheck the COW status. */
46187eeb
NC
4819 if (DEBUG_C_TEST) {
4820 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 4821 sv_dump(sv);
46187eeb 4822 }
bdd68bc3
NC
4823 sv_release_COW(sv, SvPVX_const(sv), SvLEN(sv),
4824 SV_COW_NEXT_SV(sv));
765f542d
NC
4825 /* And drop it here. */
4826 SvFAKE_off(sv);
4827 } else if (SvLEN(sv)) {
3f7c398e 4828 Safefree(SvPVX_const(sv));
765f542d
NC
4829 }
4830 }
4831#else
3f7c398e 4832 else if (SvPVX_const(sv) && SvLEN(sv))
94010e71 4833 Safefree(SvPVX_mutable(sv));
3f7c398e 4834 else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
bdd68bc3 4835 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
1c846c1f
NIS
4836 SvFAKE_off(sv);
4837 }
765f542d 4838#endif
79072805
LW
4839 break;
4840 case SVt_NV:
79072805
LW
4841 break;
4842 }
4843
893645bd
NC
4844 SvFLAGS(sv) &= SVf_BREAK;
4845 SvFLAGS(sv) |= SVTYPEMASK;
4846
8edfc514 4847 if (sv_type_details->arena) {
b9502f15 4848 del_body(((char *)SvANY(sv) + sv_type_details->offset),
8edfc514
NC
4849 &PL_body_roots[type]);
4850 }
4851 else if (sv_type_details->size) {
4852 my_safefree(SvANY(sv));
4853 }
79072805
LW
4854}
4855
645c22ef
DM
4856/*
4857=for apidoc sv_newref
4858
4859Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
4860instead.
4861
4862=cut
4863*/
4864
79072805 4865SV *
864dbfa3 4866Perl_sv_newref(pTHX_ SV *sv)
79072805 4867{
463ee0b2 4868 if (sv)
4db098f4 4869 (SvREFCNT(sv))++;
79072805
LW
4870 return sv;
4871}
4872
c461cf8f
JH
4873/*
4874=for apidoc sv_free
4875
645c22ef
DM
4876Decrement an SV's reference count, and if it drops to zero, call
4877C<sv_clear> to invoke destructors and free up any memory used by
4878the body; finally, deallocate the SV's head itself.
4879Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
4880
4881=cut
4882*/
4883
79072805 4884void
864dbfa3 4885Perl_sv_free(pTHX_ SV *sv)
79072805 4886{
27da23d5 4887 dVAR;
79072805
LW
4888 if (!sv)
4889 return;
a0d0e21e
LW
4890 if (SvREFCNT(sv) == 0) {
4891 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
4892 /* this SV's refcnt has been artificially decremented to
4893 * trigger cleanup */
a0d0e21e 4894 return;
3280af22 4895 if (PL_in_clean_all) /* All is fair */
1edc1566 4896 return;
d689ffdd
JP
4897 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
4898 /* make sure SvREFCNT(sv)==0 happens very seldom */
4899 SvREFCNT(sv) = (~(U32)0)/2;
4900 return;
4901 }
41e4abd8 4902 if (ckWARN_d(WARN_INTERNAL)) {
d5dede04 4903 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
4904 "Attempt to free unreferenced scalar: SV 0x%"UVxf
4905 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
41e4abd8
NC
4906#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
4907 Perl_dump_sv_child(aTHX_ sv);
4908#endif
4909 }
79072805
LW
4910 return;
4911 }
4db098f4 4912 if (--(SvREFCNT(sv)) > 0)
8990e307 4913 return;
8c4d3c90
NC
4914 Perl_sv_free2(aTHX_ sv);
4915}
4916
4917void
4918Perl_sv_free2(pTHX_ SV *sv)
4919{
27da23d5 4920 dVAR;
463ee0b2
LW
4921#ifdef DEBUGGING
4922 if (SvTEMP(sv)) {
0453d815 4923 if (ckWARN_d(WARN_DEBUGGING))
9014280d 4924 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
472d47bc
SB
4925 "Attempt to free temp prematurely: SV 0x%"UVxf
4926 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 4927 return;
79072805 4928 }
463ee0b2 4929#endif
d689ffdd
JP
4930 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
4931 /* make sure SvREFCNT(sv)==0 happens very seldom */
4932 SvREFCNT(sv) = (~(U32)0)/2;
4933 return;
4934 }
79072805 4935 sv_clear(sv);
477f5d66
CS
4936 if (! SvREFCNT(sv))
4937 del_SV(sv);
79072805
LW
4938}
4939
954c1994
GS
4940/*
4941=for apidoc sv_len
4942
645c22ef
DM
4943Returns the length of the string in the SV. Handles magic and type
4944coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
4945
4946=cut
4947*/
4948
79072805 4949STRLEN
864dbfa3 4950Perl_sv_len(pTHX_ register SV *sv)
79072805 4951{
463ee0b2 4952 STRLEN len;
79072805
LW
4953
4954 if (!sv)
4955 return 0;
4956
8990e307 4957 if (SvGMAGICAL(sv))
565764a8 4958 len = mg_length(sv);
8990e307 4959 else
4d84ee25 4960 (void)SvPV_const(sv, len);
463ee0b2 4961 return len;
79072805
LW
4962}
4963
c461cf8f
JH
4964/*
4965=for apidoc sv_len_utf8
4966
4967Returns the number of characters in the string in an SV, counting wide
1e54db1a 4968UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
4969
4970=cut
4971*/
4972
7e8c5dac
HS
4973/*
4974 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
4975 * mg_ptr is used, by sv_pos_u2b(), see the comments of S_utf8_mg_pos_init().
4976 * (Note that the mg_len is not the length of the mg_ptr field.)
7a5fa8a2 4977 *
7e8c5dac
HS
4978 */
4979
a0ed51b3 4980STRLEN
864dbfa3 4981Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 4982{
a0ed51b3
LW
4983 if (!sv)
4984 return 0;
4985
a0ed51b3 4986 if (SvGMAGICAL(sv))
b76347f2 4987 return mg_length(sv);
a0ed51b3 4988 else
b76347f2 4989 {
7e8c5dac 4990 STRLEN len, ulen;
e62f0680 4991 const U8 *s = (U8*)SvPV_const(sv, len);
7e8c5dac
HS
4992 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
4993
e23c8137 4994 if (mg && mg->mg_len != -1 && (mg->mg_len > 0 || len == 0)) {
7e8c5dac 4995 ulen = mg->mg_len;
e23c8137
JH
4996#ifdef PERL_UTF8_CACHE_ASSERT
4997 assert(ulen == Perl_utf8_length(aTHX_ s, s + len));
4998#endif
4999 }
7e8c5dac
HS
5000 else {
5001 ulen = Perl_utf8_length(aTHX_ s, s + len);
5002 if (!mg && !SvREADONLY(sv)) {
5003 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
5004 mg = mg_find(sv, PERL_MAGIC_utf8);
5005 assert(mg);
5006 }
5007 if (mg)
5008 mg->mg_len = ulen;
5009 }
5010 return ulen;
5011 }
5012}
5013
5014/* S_utf8_mg_pos_init() is used to initialize the mg_ptr field of
5015 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5016 * between UTF-8 and byte offsets. There are two (substr offset and substr
5017 * length, the i offset, PERL_MAGIC_UTF8_CACHESIZE) times two (UTF-8 offset
5018 * and byte offset) cache positions.
5019 *
5020 * The mg_len field is used by sv_len_utf8(), see its comments.
5021 * Note that the mg_len is not the length of the mg_ptr field.
5022 *
5023 */
5024STATIC bool
245d4a47
NC
5025S_utf8_mg_pos_init(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i,
5026 I32 offsetp, const U8 *s, const U8 *start)
7e8c5dac 5027{
7a5fa8a2 5028 bool found = FALSE;
7e8c5dac
HS
5029
5030 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
8f78557a 5031 if (!*mgp)
27da23d5 5032 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0, 0);
7e8c5dac 5033 assert(*mgp);
b76347f2 5034
7e8c5dac
HS
5035 if ((*mgp)->mg_ptr)
5036 *cachep = (STRLEN *) (*mgp)->mg_ptr;
5037 else {
a02a5408 5038 Newxz(*cachep, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7e8c5dac
HS
5039 (*mgp)->mg_ptr = (char *) *cachep;
5040 }
5041 assert(*cachep);
5042
a3b680e6 5043 (*cachep)[i] = offsetp;
7e8c5dac
HS
5044 (*cachep)[i+1] = s - start;
5045 found = TRUE;
a0ed51b3 5046 }
7e8c5dac
HS
5047
5048 return found;
a0ed51b3
LW
5049}
5050
645c22ef 5051/*
7e8c5dac
HS
5052 * S_utf8_mg_pos() is used to query and update mg_ptr field of
5053 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5054 * between UTF-8 and byte offsets. See also the comments of
5055 * S_utf8_mg_pos_init().
5056 *
5057 */
5058STATIC bool
245d4a47 5059S_utf8_mg_pos(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, I32 uoff, const U8 **sp, const U8 *start, const U8 *send)
7e8c5dac
HS
5060{
5061 bool found = FALSE;
5062
5063 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
5064 if (!*mgp)
5065 *mgp = mg_find(sv, PERL_MAGIC_utf8);
5066 if (*mgp && (*mgp)->mg_ptr) {
5067 *cachep = (STRLEN *) (*mgp)->mg_ptr;
e23c8137 5068 ASSERT_UTF8_CACHE(*cachep);
667208dd 5069 if ((*cachep)[i] == (STRLEN)uoff) /* An exact match. */
7a5fa8a2 5070 found = TRUE;
7e8c5dac
HS
5071 else { /* We will skip to the right spot. */
5072 STRLEN forw = 0;
5073 STRLEN backw = 0;
a3b680e6 5074 const U8* p = NULL;
7e8c5dac
HS
5075
5076 /* The assumption is that going backward is half
5077 * the speed of going forward (that's where the
5078 * 2 * backw in the below comes from). (The real
5079 * figure of course depends on the UTF-8 data.) */
5080
667208dd 5081 if ((*cachep)[i] > (STRLEN)uoff) {
7e8c5dac 5082 forw = uoff;
667208dd 5083 backw = (*cachep)[i] - (STRLEN)uoff;
7e8c5dac
HS
5084
5085 if (forw < 2 * backw)
5086 p = start;
5087 else
5088 p = start + (*cachep)[i+1];
5089 }
5090 /* Try this only for the substr offset (i == 0),
5091 * not for the substr length (i == 2). */
5092 else if (i == 0) { /* (*cachep)[i] < uoff */
a3b680e6 5093 const STRLEN ulen = sv_len_utf8(sv);
7e8c5dac 5094
667208dd
JH
5095 if ((STRLEN)uoff < ulen) {
5096 forw = (STRLEN)uoff - (*cachep)[i];
5097 backw = ulen - (STRLEN)uoff;
7e8c5dac
HS
5098
5099 if (forw < 2 * backw)
5100 p = start + (*cachep)[i+1];
5101 else
5102 p = send;
5103 }
5104
5105 /* If the string is not long enough for uoff,
5106 * we could extend it, but not at this low a level. */
5107 }
5108
5109 if (p) {
5110 if (forw < 2 * backw) {
5111 while (forw--)
5112 p += UTF8SKIP(p);
5113 }
5114 else {
5115 while (backw--) {
5116 p--;
5117 while (UTF8_IS_CONTINUATION(*p))
5118 p--;
5119 }
5120 }
5121
5122 /* Update the cache. */
667208dd 5123 (*cachep)[i] = (STRLEN)uoff;
7e8c5dac 5124 (*cachep)[i+1] = p - start;
8f78557a
AE
5125
5126 /* Drop the stale "length" cache */
5127 if (i == 0) {
5128 (*cachep)[2] = 0;
5129 (*cachep)[3] = 0;
5130 }
7a5fa8a2 5131
7e8c5dac
HS
5132 found = TRUE;
5133 }
5134 }
5135 if (found) { /* Setup the return values. */
5136 *offsetp = (*cachep)[i+1];
5137 *sp = start + *offsetp;
5138 if (*sp >= send) {
5139 *sp = send;
5140 *offsetp = send - start;
5141 }
5142 else if (*sp < start) {
5143 *sp = start;
5144 *offsetp = 0;
5145 }
5146 }
5147 }
e23c8137
JH
5148#ifdef PERL_UTF8_CACHE_ASSERT
5149 if (found) {
5150 U8 *s = start;
5151 I32 n = uoff;
5152
5153 while (n-- && s < send)
5154 s += UTF8SKIP(s);
5155
5156 if (i == 0) {
5157 assert(*offsetp == s - start);
5158 assert((*cachep)[0] == (STRLEN)uoff);
5159 assert((*cachep)[1] == *offsetp);
5160 }
5161 ASSERT_UTF8_CACHE(*cachep);
5162 }
5163#endif
7e8c5dac 5164 }
e23c8137 5165
7e8c5dac
HS
5166 return found;
5167}
7a5fa8a2 5168
7e8c5dac 5169/*
645c22ef
DM
5170=for apidoc sv_pos_u2b
5171
1e54db1a 5172Converts the value pointed to by offsetp from a count of UTF-8 chars from
645c22ef
DM
5173the start of the string, to a count of the equivalent number of bytes; if
5174lenp is non-zero, it does the same to lenp, but this time starting from
5175the offset, rather than from the start of the string. Handles magic and
5176type coercion.
5177
5178=cut
5179*/
5180
7e8c5dac
HS
5181/*
5182 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
5183 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5184 * byte offsets. See also the comments of S_utf8_mg_pos().
5185 *
5186 */
5187
a0ed51b3 5188void
864dbfa3 5189Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 5190{
245d4a47 5191 const U8 *start;
a0ed51b3
LW
5192 STRLEN len;
5193
5194 if (!sv)
5195 return;
5196
245d4a47 5197 start = (U8*)SvPV_const(sv, len);
7e8c5dac 5198 if (len) {
b464bac0 5199 STRLEN boffset = 0;
cbbf8932 5200 STRLEN *cache = NULL;
245d4a47
NC
5201 const U8 *s = start;
5202 I32 uoffset = *offsetp;
9d4ba2ae 5203 const U8 * const send = s + len;
cbbf8932
AL
5204 MAGIC *mg = NULL;
5205 bool found = utf8_mg_pos(sv, &mg, &cache, 0, offsetp, *offsetp, &s, start, send);
7e8c5dac 5206
7e8c5dac
HS
5207 if (!found && uoffset > 0) {
5208 while (s < send && uoffset--)
5209 s += UTF8SKIP(s);
5210 if (s >= send)
5211 s = send;
a3b680e6 5212 if (utf8_mg_pos_init(sv, &mg, &cache, 0, *offsetp, s, start))
7e8c5dac
HS
5213 boffset = cache[1];
5214 *offsetp = s - start;
5215 }
5216 if (lenp) {
5217 found = FALSE;
5218 start = s;
ec062429 5219 if (utf8_mg_pos(sv, &mg, &cache, 2, lenp, *lenp, &s, start, send)) {
7e8c5dac
HS
5220 *lenp -= boffset;
5221 found = TRUE;
5222 }
5223 if (!found && *lenp > 0) {
5224 I32 ulen = *lenp;
5225 if (ulen > 0)
5226 while (s < send && ulen--)
5227 s += UTF8SKIP(s);
5228 if (s >= send)
5229 s = send;
a3b680e6 5230 utf8_mg_pos_init(sv, &mg, &cache, 2, *lenp, s, start);
7e8c5dac
HS
5231 }
5232 *lenp = s - start;
5233 }
e23c8137 5234 ASSERT_UTF8_CACHE(cache);
7e8c5dac
HS
5235 }
5236 else {
5237 *offsetp = 0;
5238 if (lenp)
5239 *lenp = 0;
a0ed51b3 5240 }
e23c8137 5241
a0ed51b3
LW
5242 return;
5243}
5244
645c22ef
DM
5245/*
5246=for apidoc sv_pos_b2u
5247
5248Converts the value pointed to by offsetp from a count of bytes from the
1e54db1a 5249start of the string, to a count of the equivalent number of UTF-8 chars.
645c22ef
DM
5250Handles magic and type coercion.
5251
5252=cut
5253*/
5254
7e8c5dac
HS
5255/*
5256 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
5257 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5258 * byte offsets. See also the comments of S_utf8_mg_pos().
5259 *
5260 */
5261
a0ed51b3 5262void
7e8c5dac 5263Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 5264{
83003860 5265 const U8* s;
a0ed51b3
LW
5266 STRLEN len;
5267
5268 if (!sv)
5269 return;
5270
83003860 5271 s = (const U8*)SvPV_const(sv, len);
eb160463 5272 if ((I32)len < *offsetp)
a0dbb045 5273 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac 5274 else {
83003860 5275 const U8* send = s + *offsetp;
7e8c5dac
HS
5276 MAGIC* mg = NULL;
5277 STRLEN *cache = NULL;
5278
5279 len = 0;
5280
5281 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
5282 mg = mg_find(sv, PERL_MAGIC_utf8);
5283 if (mg && mg->mg_ptr) {
5284 cache = (STRLEN *) mg->mg_ptr;
c5661c80 5285 if (cache[1] == (STRLEN)*offsetp) {
7e8c5dac
HS
5286 /* An exact match. */
5287 *offsetp = cache[0];
5288
5289 return;
5290 }
c5661c80 5291 else if (cache[1] < (STRLEN)*offsetp) {
7e8c5dac
HS
5292 /* We already know part of the way. */
5293 len = cache[0];
5294 s += cache[1];
7a5fa8a2 5295 /* Let the below loop do the rest. */
7e8c5dac
HS
5296 }
5297 else { /* cache[1] > *offsetp */
5298 /* We already know all of the way, now we may
5299 * be able to walk back. The same assumption
5300 * is made as in S_utf8_mg_pos(), namely that
5301 * walking backward is twice slower than
5302 * walking forward. */
9d4ba2ae 5303 const STRLEN forw = *offsetp;
7e8c5dac
HS
5304 STRLEN backw = cache[1] - *offsetp;
5305
5306 if (!(forw < 2 * backw)) {
83003860 5307 const U8 *p = s + cache[1];
7e8c5dac 5308 STRLEN ubackw = 0;
7a5fa8a2 5309
a5b510f2
AE
5310 cache[1] -= backw;
5311
7e8c5dac
HS
5312 while (backw--) {
5313 p--;
0aeb64d0 5314 while (UTF8_IS_CONTINUATION(*p)) {
7e8c5dac 5315 p--;
0aeb64d0
JH
5316 backw--;
5317 }
7e8c5dac
HS
5318 ubackw++;
5319 }
5320
5321 cache[0] -= ubackw;
0aeb64d0 5322 *offsetp = cache[0];
a67d7df9
TS
5323
5324 /* Drop the stale "length" cache */
5325 cache[2] = 0;
5326 cache[3] = 0;
5327
0aeb64d0 5328 return;
7e8c5dac
HS
5329 }
5330 }
5331 }
e23c8137 5332 ASSERT_UTF8_CACHE(cache);
a0dbb045 5333 }
7e8c5dac
HS
5334
5335 while (s < send) {
5336 STRLEN n = 1;
5337
5338 /* Call utf8n_to_uvchr() to validate the sequence
5339 * (unless a simple non-UTF character) */
5340 if (!UTF8_IS_INVARIANT(*s))
5341 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
5342 if (n > 0) {
5343 s += n;
5344 len++;
5345 }
5346 else
5347 break;
5348 }
5349
5350 if (!SvREADONLY(sv)) {
5351 if (!mg) {
5352 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
5353 mg = mg_find(sv, PERL_MAGIC_utf8);
5354 }
5355 assert(mg);
5356
5357 if (!mg->mg_ptr) {
a02a5408 5358 Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7e8c5dac
HS
5359 mg->mg_ptr = (char *) cache;
5360 }
5361 assert(cache);
5362
5363 cache[0] = len;
5364 cache[1] = *offsetp;
a67d7df9
TS
5365 /* Drop the stale "length" cache */
5366 cache[2] = 0;
5367 cache[3] = 0;
7e8c5dac
HS
5368 }
5369
5370 *offsetp = len;
a0ed51b3 5371 }
a0ed51b3
LW
5372 return;
5373}
5374
954c1994
GS
5375/*
5376=for apidoc sv_eq
5377
5378Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
5379identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5380coerce its args to strings if necessary.
954c1994
GS
5381
5382=cut
5383*/
5384
79072805 5385I32
e01b9e88 5386Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805 5387{
e1ec3a88 5388 const char *pv1;
463ee0b2 5389 STRLEN cur1;
e1ec3a88 5390 const char *pv2;
463ee0b2 5391 STRLEN cur2;
e01b9e88 5392 I32 eq = 0;
553e1bcc
AT
5393 char *tpv = Nullch;
5394 SV* svrecode = Nullsv;
79072805 5395
e01b9e88 5396 if (!sv1) {
79072805
LW
5397 pv1 = "";
5398 cur1 = 0;
5399 }
463ee0b2 5400 else
4d84ee25 5401 pv1 = SvPV_const(sv1, cur1);
79072805 5402
e01b9e88
SC
5403 if (!sv2){
5404 pv2 = "";
5405 cur2 = 0;
92d29cee 5406 }
e01b9e88 5407 else
4d84ee25 5408 pv2 = SvPV_const(sv2, cur2);
79072805 5409
cf48d248 5410 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
5411 /* Differing utf8ness.
5412 * Do not UTF8size the comparands as a side-effect. */
5413 if (PL_encoding) {
5414 if (SvUTF8(sv1)) {
553e1bcc
AT
5415 svrecode = newSVpvn(pv2, cur2);
5416 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5417 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
5418 }
5419 else {
553e1bcc
AT
5420 svrecode = newSVpvn(pv1, cur1);
5421 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5422 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
5423 }
5424 /* Now both are in UTF-8. */
0a1bd7ac
DM
5425 if (cur1 != cur2) {
5426 SvREFCNT_dec(svrecode);
799ef3cb 5427 return FALSE;
0a1bd7ac 5428 }
799ef3cb
JH
5429 }
5430 else {
5431 bool is_utf8 = TRUE;
5432
5433 if (SvUTF8(sv1)) {
5434 /* sv1 is the UTF-8 one,
5435 * if is equal it must be downgrade-able */
9d4ba2ae 5436 char * const pv = (char*)bytes_from_utf8((const U8*)pv1,
799ef3cb
JH
5437 &cur1, &is_utf8);
5438 if (pv != pv1)
553e1bcc 5439 pv1 = tpv = pv;
799ef3cb
JH
5440 }
5441 else {
5442 /* sv2 is the UTF-8 one,
5443 * if is equal it must be downgrade-able */
9d4ba2ae 5444 char * const pv = (char *)bytes_from_utf8((const U8*)pv2,
799ef3cb
JH
5445 &cur2, &is_utf8);
5446 if (pv != pv2)
553e1bcc 5447 pv2 = tpv = pv;
799ef3cb
JH
5448 }
5449 if (is_utf8) {
5450 /* Downgrade not possible - cannot be eq */
bf694877 5451 assert (tpv == 0);
799ef3cb
JH
5452 return FALSE;
5453 }
5454 }
cf48d248
JH
5455 }
5456
5457 if (cur1 == cur2)
765f542d 5458 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 5459
553e1bcc
AT
5460 if (svrecode)
5461 SvREFCNT_dec(svrecode);
799ef3cb 5462
553e1bcc
AT
5463 if (tpv)
5464 Safefree(tpv);
cf48d248 5465
e01b9e88 5466 return eq;
79072805
LW
5467}
5468
954c1994
GS
5469/*
5470=for apidoc sv_cmp
5471
5472Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
5473string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
5474C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5475coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
5476
5477=cut
5478*/
5479
79072805 5480I32
e01b9e88 5481Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 5482{
560a288e 5483 STRLEN cur1, cur2;
e1ec3a88
AL
5484 const char *pv1, *pv2;
5485 char *tpv = Nullch;
cf48d248 5486 I32 cmp;
553e1bcc 5487 SV *svrecode = Nullsv;
560a288e 5488
e01b9e88
SC
5489 if (!sv1) {
5490 pv1 = "";
560a288e
GS
5491 cur1 = 0;
5492 }
e01b9e88 5493 else
4d84ee25 5494 pv1 = SvPV_const(sv1, cur1);
560a288e 5495
553e1bcc 5496 if (!sv2) {
e01b9e88 5497 pv2 = "";
560a288e
GS
5498 cur2 = 0;
5499 }
e01b9e88 5500 else
4d84ee25 5501 pv2 = SvPV_const(sv2, cur2);
79072805 5502
cf48d248 5503 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
5504 /* Differing utf8ness.
5505 * Do not UTF8size the comparands as a side-effect. */
cf48d248 5506 if (SvUTF8(sv1)) {
799ef3cb 5507 if (PL_encoding) {
553e1bcc
AT
5508 svrecode = newSVpvn(pv2, cur2);
5509 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5510 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
5511 }
5512 else {
e1ec3a88 5513 pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
799ef3cb 5514 }
cf48d248
JH
5515 }
5516 else {
799ef3cb 5517 if (PL_encoding) {
553e1bcc
AT
5518 svrecode = newSVpvn(pv1, cur1);
5519 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5520 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
5521 }
5522 else {
e1ec3a88 5523 pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
799ef3cb 5524 }
cf48d248
JH
5525 }
5526 }
5527
e01b9e88 5528 if (!cur1) {
cf48d248 5529 cmp = cur2 ? -1 : 0;
e01b9e88 5530 } else if (!cur2) {
cf48d248
JH
5531 cmp = 1;
5532 } else {
e1ec3a88 5533 const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
5534
5535 if (retval) {
cf48d248 5536 cmp = retval < 0 ? -1 : 1;
e01b9e88 5537 } else if (cur1 == cur2) {
cf48d248
JH
5538 cmp = 0;
5539 } else {
5540 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 5541 }
cf48d248 5542 }
16660edb 5543
553e1bcc
AT
5544 if (svrecode)
5545 SvREFCNT_dec(svrecode);
799ef3cb 5546
553e1bcc
AT
5547 if (tpv)
5548 Safefree(tpv);
cf48d248
JH
5549
5550 return cmp;
bbce6d69 5551}
16660edb 5552
c461cf8f
JH
5553/*
5554=for apidoc sv_cmp_locale
5555
645c22ef
DM
5556Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
5557'use bytes' aware, handles get magic, and will coerce its args to strings
5558if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
5559
5560=cut
5561*/
5562
bbce6d69 5563I32
864dbfa3 5564Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 5565{
36477c24 5566#ifdef USE_LOCALE_COLLATE
16660edb 5567
bbce6d69 5568 char *pv1, *pv2;
5569 STRLEN len1, len2;
5570 I32 retval;
16660edb 5571
3280af22 5572 if (PL_collation_standard)
bbce6d69 5573 goto raw_compare;
16660edb 5574
bbce6d69 5575 len1 = 0;
8ac85365 5576 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 5577 len2 = 0;
8ac85365 5578 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 5579
bbce6d69 5580 if (!pv1 || !len1) {
5581 if (pv2 && len2)
5582 return -1;
5583 else
5584 goto raw_compare;
5585 }
5586 else {
5587 if (!pv2 || !len2)
5588 return 1;
5589 }
16660edb 5590
bbce6d69 5591 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 5592
bbce6d69 5593 if (retval)
16660edb 5594 return retval < 0 ? -1 : 1;
5595
bbce6d69 5596 /*
5597 * When the result of collation is equality, that doesn't mean
5598 * that there are no differences -- some locales exclude some
5599 * characters from consideration. So to avoid false equalities,
5600 * we use the raw string as a tiebreaker.
5601 */
16660edb 5602
bbce6d69 5603 raw_compare:
5604 /* FALL THROUGH */
16660edb 5605
36477c24 5606#endif /* USE_LOCALE_COLLATE */
16660edb 5607
bbce6d69 5608 return sv_cmp(sv1, sv2);
5609}
79072805 5610
645c22ef 5611
36477c24 5612#ifdef USE_LOCALE_COLLATE
645c22ef 5613
7a4c00b4 5614/*
645c22ef
DM
5615=for apidoc sv_collxfrm
5616
5617Add Collate Transform magic to an SV if it doesn't already have it.
5618
5619Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
5620scalar data of the variable, but transformed to such a format that a normal
5621memory comparison can be used to compare the data according to the locale
5622settings.
5623
5624=cut
5625*/
5626
bbce6d69 5627char *
864dbfa3 5628Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 5629{
7a4c00b4 5630 MAGIC *mg;
16660edb 5631
14befaf4 5632 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 5633 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
93524f2b
NC
5634 const char *s;
5635 char *xf;
bbce6d69 5636 STRLEN len, xlen;
5637
7a4c00b4 5638 if (mg)
5639 Safefree(mg->mg_ptr);
93524f2b 5640 s = SvPV_const(sv, len);
bbce6d69 5641 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 5642 if (SvREADONLY(sv)) {
5643 SAVEFREEPV(xf);
5644 *nxp = xlen;
3280af22 5645 return xf + sizeof(PL_collation_ix);
ff0cee69 5646 }
7a4c00b4 5647 if (! mg) {
14befaf4
DM
5648 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
5649 mg = mg_find(sv, PERL_MAGIC_collxfrm);
7a4c00b4 5650 assert(mg);
bbce6d69 5651 }
7a4c00b4 5652 mg->mg_ptr = xf;
565764a8 5653 mg->mg_len = xlen;
7a4c00b4 5654 }
5655 else {
ff0cee69 5656 if (mg) {
5657 mg->mg_ptr = NULL;
565764a8 5658 mg->mg_len = -1;
ff0cee69 5659 }
bbce6d69 5660 }
5661 }
7a4c00b4 5662 if (mg && mg->mg_ptr) {
565764a8 5663 *nxp = mg->mg_len;
3280af22 5664 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 5665 }
5666 else {
5667 *nxp = 0;
5668 return NULL;
16660edb 5669 }
79072805
LW
5670}
5671
36477c24 5672#endif /* USE_LOCALE_COLLATE */
bbce6d69 5673
c461cf8f
JH
5674/*
5675=for apidoc sv_gets
5676
5677Get a line from the filehandle and store it into the SV, optionally
5678appending to the currently-stored string.
5679
5680=cut
5681*/
5682
79072805 5683char *
864dbfa3 5684Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 5685{
e1ec3a88 5686 const char *rsptr;
c07a80fd 5687 STRLEN rslen;
5688 register STDCHAR rslast;
5689 register STDCHAR *bp;
5690 register I32 cnt;
9c5ffd7c 5691 I32 i = 0;
8bfdd7d9 5692 I32 rspara = 0;
e311fd51 5693 I32 recsize;
c07a80fd 5694
bc44a8a2
NC
5695 if (SvTHINKFIRST(sv))
5696 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
5697 /* XXX. If you make this PVIV, then copy on write can copy scalars read
5698 from <>.
5699 However, perlbench says it's slower, because the existing swipe code
5700 is faster than copy on write.
5701 Swings and roundabouts. */
862a34c6 5702 SvUPGRADE(sv, SVt_PV);
99491443 5703
ff68c719 5704 SvSCREAM_off(sv);
efd8b2ba
AE
5705
5706 if (append) {
5707 if (PerlIO_isutf8(fp)) {
5708 if (!SvUTF8(sv)) {
5709 sv_utf8_upgrade_nomg(sv);
5710 sv_pos_u2b(sv,&append,0);
5711 }
5712 } else if (SvUTF8(sv)) {
1b6737cc 5713 SV * const tsv = NEWSV(0,0);
efd8b2ba
AE
5714 sv_gets(tsv, fp, 0);
5715 sv_utf8_upgrade_nomg(tsv);
5716 SvCUR_set(sv,append);
5717 sv_catsv(sv,tsv);
5718 sv_free(tsv);
5719 goto return_string_or_null;
5720 }
5721 }
5722
5723 SvPOK_only(sv);
5724 if (PerlIO_isutf8(fp))
5725 SvUTF8_on(sv);
c07a80fd 5726
923e4eb5 5727 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
5728 /* we always read code in line mode */
5729 rsptr = "\n";
5730 rslen = 1;
5731 }
5732 else if (RsSNARF(PL_rs)) {
7a5fa8a2
NIS
5733 /* If it is a regular disk file use size from stat() as estimate
5734 of amount we are going to read - may result in malloc-ing
5735 more memory than we realy need if layers bellow reduce
e468d35b
NIS
5736 size we read (e.g. CRLF or a gzip layer)
5737 */
e311fd51 5738 Stat_t st;
e468d35b 5739 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
f54cb97a 5740 const Off_t offset = PerlIO_tell(fp);
58f1856e 5741 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
5742 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
5743 }
5744 }
c07a80fd 5745 rsptr = NULL;
5746 rslen = 0;
5747 }
3280af22 5748 else if (RsRECORD(PL_rs)) {
e311fd51 5749 I32 bytesread;
5b2b9c68
HM
5750 char *buffer;
5751
5752 /* Grab the size of the record we're getting */
3280af22 5753 recsize = SvIV(SvRV(PL_rs));
e311fd51 5754 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
5755 /* Go yank in */
5756#ifdef VMS
5757 /* VMS wants read instead of fread, because fread doesn't respect */
5758 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
5759 /* doing, but we've got no other real choice - except avoid stdio
5760 as implementation - perhaps write a :vms layer ?
5761 */
5b2b9c68
HM
5762 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
5763#else
5764 bytesread = PerlIO_read(fp, buffer, recsize);
5765#endif
27e6ca2d
AE
5766 if (bytesread < 0)
5767 bytesread = 0;
e311fd51 5768 SvCUR_set(sv, bytesread += append);
e670df4e 5769 buffer[bytesread] = '\0';
efd8b2ba 5770 goto return_string_or_null;
5b2b9c68 5771 }
3280af22 5772 else if (RsPARA(PL_rs)) {
c07a80fd 5773 rsptr = "\n\n";
5774 rslen = 2;
8bfdd7d9 5775 rspara = 1;
c07a80fd 5776 }
7d59b7e4
NIS
5777 else {
5778 /* Get $/ i.e. PL_rs into same encoding as stream wants */
5779 if (PerlIO_isutf8(fp)) {
5780 rsptr = SvPVutf8(PL_rs, rslen);
5781 }
5782 else {
5783 if (SvUTF8(PL_rs)) {
5784 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
5785 Perl_croak(aTHX_ "Wide character in $/");
5786 }
5787 }
93524f2b 5788 rsptr = SvPV_const(PL_rs, rslen);
7d59b7e4
NIS
5789 }
5790 }
5791
c07a80fd 5792 rslast = rslen ? rsptr[rslen - 1] : '\0';
5793
8bfdd7d9 5794 if (rspara) { /* have to do this both before and after */
79072805 5795 do { /* to make sure file boundaries work right */
760ac839 5796 if (PerlIO_eof(fp))
a0d0e21e 5797 return 0;
760ac839 5798 i = PerlIO_getc(fp);
79072805 5799 if (i != '\n') {
a0d0e21e
LW
5800 if (i == -1)
5801 return 0;
760ac839 5802 PerlIO_ungetc(fp,i);
79072805
LW
5803 break;
5804 }
5805 } while (i != EOF);
5806 }
c07a80fd 5807
760ac839
LW
5808 /* See if we know enough about I/O mechanism to cheat it ! */
5809
5810 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 5811 of abstracting out stdio interface. One call should be cheap
760ac839
LW
5812 enough here - and may even be a macro allowing compile
5813 time optimization.
5814 */
5815
5816 if (PerlIO_fast_gets(fp)) {
5817
5818 /*
5819 * We're going to steal some values from the stdio struct
5820 * and put EVERYTHING in the innermost loop into registers.
5821 */
5822 register STDCHAR *ptr;
5823 STRLEN bpx;
5824 I32 shortbuffered;
5825
16660edb 5826#if defined(VMS) && defined(PERLIO_IS_STDIO)
5827 /* An ungetc()d char is handled separately from the regular
5828 * buffer, so we getc() it back out and stuff it in the buffer.
5829 */
5830 i = PerlIO_getc(fp);
5831 if (i == EOF) return 0;
5832 *(--((*fp)->_ptr)) = (unsigned char) i;
5833 (*fp)->_cnt++;
5834#endif
c07a80fd 5835
c2960299 5836 /* Here is some breathtakingly efficient cheating */
c07a80fd 5837
a20bf0c3 5838 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b 5839 /* make sure we have the room */
7a5fa8a2 5840 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
e468d35b 5841 /* Not room for all of it
7a5fa8a2 5842 if we are looking for a separator and room for some
e468d35b
NIS
5843 */
5844 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7a5fa8a2 5845 /* just process what we have room for */
79072805
LW
5846 shortbuffered = cnt - SvLEN(sv) + append + 1;
5847 cnt -= shortbuffered;
5848 }
5849 else {
5850 shortbuffered = 0;
bbce6d69 5851 /* remember that cnt can be negative */
eb160463 5852 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
5853 }
5854 }
7a5fa8a2 5855 else
79072805 5856 shortbuffered = 0;
3f7c398e 5857 bp = (STDCHAR*)SvPVX_const(sv) + append; /* move these two too to registers */
a20bf0c3 5858 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 5859 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5860 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 5861 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 5862 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5863 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5864 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
5865 for (;;) {
5866 screamer:
93a17b20 5867 if (cnt > 0) {
c07a80fd 5868 if (rslen) {
760ac839
LW
5869 while (cnt > 0) { /* this | eat */
5870 cnt--;
c07a80fd 5871 if ((*bp++ = *ptr++) == rslast) /* really | dust */
5872 goto thats_all_folks; /* screams | sed :-) */
5873 }
5874 }
5875 else {
1c846c1f
NIS
5876 Copy(ptr, bp, cnt, char); /* this | eat */
5877 bp += cnt; /* screams | dust */
c07a80fd 5878 ptr += cnt; /* louder | sed :-) */
a5f75d66 5879 cnt = 0;
93a17b20 5880 }
79072805
LW
5881 }
5882
748a9306 5883 if (shortbuffered) { /* oh well, must extend */
79072805
LW
5884 cnt = shortbuffered;
5885 shortbuffered = 0;
3f7c398e 5886 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
5887 SvCUR_set(sv, bpx);
5888 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3f7c398e 5889 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
79072805
LW
5890 continue;
5891 }
5892
16660edb 5893 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
5894 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
5895 PTR2UV(ptr),(long)cnt));
cc00df79 5896 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 5897#if 0
16660edb 5898 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5899 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5900 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5901 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 5902#endif
1c846c1f 5903 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 5904 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
5905 another abstraction. */
760ac839 5906 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 5907#if 0
16660edb 5908 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5909 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5910 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5911 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 5912#endif
a20bf0c3
JH
5913 cnt = PerlIO_get_cnt(fp);
5914 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 5915 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5916 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 5917
748a9306
LW
5918 if (i == EOF) /* all done for ever? */
5919 goto thats_really_all_folks;
5920
3f7c398e 5921 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
5922 SvCUR_set(sv, bpx);
5923 SvGROW(sv, bpx + cnt + 2);
3f7c398e 5924 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
c07a80fd 5925
eb160463 5926 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 5927
c07a80fd 5928 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 5929 goto thats_all_folks;
79072805
LW
5930 }
5931
5932thats_all_folks:
3f7c398e 5933 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
36477c24 5934 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 5935 goto screamer; /* go back to the fray */
79072805
LW
5936thats_really_all_folks:
5937 if (shortbuffered)
5938 cnt += shortbuffered;
16660edb 5939 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5940 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 5941 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 5942 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5943 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5944 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5945 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 5946 *bp = '\0';
3f7c398e 5947 SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv)); /* set length */
16660edb 5948 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 5949 "Screamer: done, len=%ld, string=|%.*s|\n",
3f7c398e 5950 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
760ac839
LW
5951 }
5952 else
79072805 5953 {
6edd2cd5 5954 /*The big, slow, and stupid way. */
27da23d5 5955#ifdef USE_HEAP_INSTEAD_OF_STACK /* Even slower way. */
cbbf8932 5956 STDCHAR *buf = NULL;
a02a5408 5957 Newx(buf, 8192, STDCHAR);
6edd2cd5 5958 assert(buf);
4d2c4e07 5959#else
6edd2cd5 5960 STDCHAR buf[8192];
4d2c4e07 5961#endif
79072805 5962
760ac839 5963screamer2:
c07a80fd 5964 if (rslen) {
00b6aa41 5965 register const STDCHAR * const bpe = buf + sizeof(buf);
760ac839 5966 bp = buf;
eb160463 5967 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
5968 ; /* keep reading */
5969 cnt = bp - buf;
c07a80fd 5970 }
5971 else {
760ac839 5972 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 5973 /* Accomodate broken VAXC compiler, which applies U8 cast to
5974 * both args of ?: operator, causing EOF to change into 255
5975 */
37be0adf 5976 if (cnt > 0)
cbe9e203
JH
5977 i = (U8)buf[cnt - 1];
5978 else
37be0adf 5979 i = EOF;
c07a80fd 5980 }
79072805 5981
cbe9e203
JH
5982 if (cnt < 0)
5983 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
5984 if (append)
5985 sv_catpvn(sv, (char *) buf, cnt);
5986 else
5987 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 5988
5989 if (i != EOF && /* joy */
5990 (!rslen ||
5991 SvCUR(sv) < rslen ||
3f7c398e 5992 memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
5993 {
5994 append = -1;
63e4d877
CS
5995 /*
5996 * If we're reading from a TTY and we get a short read,
5997 * indicating that the user hit his EOF character, we need
5998 * to notice it now, because if we try to read from the TTY
5999 * again, the EOF condition will disappear.
6000 *
6001 * The comparison of cnt to sizeof(buf) is an optimization
6002 * that prevents unnecessary calls to feof().
6003 *
6004 * - jik 9/25/96
6005 */
6006 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
6007 goto screamer2;
79072805 6008 }
6edd2cd5 6009
27da23d5 6010#ifdef USE_HEAP_INSTEAD_OF_STACK
6edd2cd5
JH
6011 Safefree(buf);
6012#endif
79072805
LW
6013 }
6014
8bfdd7d9 6015 if (rspara) { /* have to do this both before and after */
c07a80fd 6016 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 6017 i = PerlIO_getc(fp);
79072805 6018 if (i != '\n') {
760ac839 6019 PerlIO_ungetc(fp,i);
79072805
LW
6020 break;
6021 }
6022 }
6023 }
c07a80fd 6024
efd8b2ba 6025return_string_or_null:
c07a80fd 6026 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
6027}
6028
954c1994
GS
6029/*
6030=for apidoc sv_inc
6031
645c22ef
DM
6032Auto-increment of the value in the SV, doing string to numeric conversion
6033if necessary. Handles 'get' magic.
954c1994
GS
6034
6035=cut
6036*/
6037
79072805 6038void
864dbfa3 6039Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
6040{
6041 register char *d;
463ee0b2 6042 int flags;
79072805
LW
6043
6044 if (!sv)
6045 return;
5b295bef 6046 SvGETMAGIC(sv);
ed6116ce 6047 if (SvTHINKFIRST(sv)) {
765f542d
NC
6048 if (SvIsCOW(sv))
6049 sv_force_normal_flags(sv, 0);
0f15f207 6050 if (SvREADONLY(sv)) {
923e4eb5 6051 if (IN_PERL_RUNTIME)
cea2e8a9 6052 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6053 }
a0d0e21e 6054 if (SvROK(sv)) {
b5be31e9 6055 IV i;
9e7bc3e8
JD
6056 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
6057 return;
56431972 6058 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6059 sv_unref(sv);
6060 sv_setiv(sv, i);
a0d0e21e 6061 }
ed6116ce 6062 }
8990e307 6063 flags = SvFLAGS(sv);
28e5dec8
JH
6064 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
6065 /* It's (privately or publicly) a float, but not tested as an
6066 integer, so test it to see. */
d460ef45 6067 (void) SvIV(sv);
28e5dec8
JH
6068 flags = SvFLAGS(sv);
6069 }
6070 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6071 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6072#ifdef PERL_PRESERVE_IVUV
28e5dec8 6073 oops_its_int:
59d8ce62 6074#endif
25da4f38
IZ
6075 if (SvIsUV(sv)) {
6076 if (SvUVX(sv) == UV_MAX)
a1e868e7 6077 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
6078 else
6079 (void)SvIOK_only_UV(sv);
607fa7f2 6080 SvUV_set(sv, SvUVX(sv) + 1);
25da4f38
IZ
6081 } else {
6082 if (SvIVX(sv) == IV_MAX)
28e5dec8 6083 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
6084 else {
6085 (void)SvIOK_only(sv);
45977657 6086 SvIV_set(sv, SvIVX(sv) + 1);
1c846c1f 6087 }
55497cff 6088 }
79072805
LW
6089 return;
6090 }
28e5dec8
JH
6091 if (flags & SVp_NOK) {
6092 (void)SvNOK_only(sv);
9d6ce603 6093 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6094 return;
6095 }
6096
3f7c398e 6097 if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
28e5dec8 6098 if ((flags & SVTYPEMASK) < SVt_PVIV)
f5282e15 6099 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
28e5dec8 6100 (void)SvIOK_only(sv);
45977657 6101 SvIV_set(sv, 1);
79072805
LW
6102 return;
6103 }
463ee0b2 6104 d = SvPVX(sv);
79072805
LW
6105 while (isALPHA(*d)) d++;
6106 while (isDIGIT(*d)) d++;
6107 if (*d) {
28e5dec8 6108#ifdef PERL_PRESERVE_IVUV
d1be9408 6109 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
6110 warnings. Probably ought to make the sv_iv_please() that does
6111 the conversion if possible, and silently. */
504618e9 6112 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
6113 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6114 /* Need to try really hard to see if it's an integer.
6115 9.22337203685478e+18 is an integer.
6116 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6117 so $a="9.22337203685478e+18"; $a+0; $a++
6118 needs to be the same as $a="9.22337203685478e+18"; $a++
6119 or we go insane. */
d460ef45 6120
28e5dec8
JH
6121 (void) sv_2iv(sv);
6122 if (SvIOK(sv))
6123 goto oops_its_int;
6124
6125 /* sv_2iv *should* have made this an NV */
6126 if (flags & SVp_NOK) {
6127 (void)SvNOK_only(sv);
9d6ce603 6128 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6129 return;
6130 }
6131 /* I don't think we can get here. Maybe I should assert this
6132 And if we do get here I suspect that sv_setnv will croak. NWC
6133 Fall through. */
6134#if defined(USE_LONG_DOUBLE)
6135 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 6136 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 6137#else
1779d84d 6138 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 6139 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
6140#endif
6141 }
6142#endif /* PERL_PRESERVE_IVUV */
3f7c398e 6143 sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
79072805
LW
6144 return;
6145 }
6146 d--;
3f7c398e 6147 while (d >= SvPVX_const(sv)) {
79072805
LW
6148 if (isDIGIT(*d)) {
6149 if (++*d <= '9')
6150 return;
6151 *(d--) = '0';
6152 }
6153 else {
9d116dd7
JH
6154#ifdef EBCDIC
6155 /* MKS: The original code here died if letters weren't consecutive.
6156 * at least it didn't have to worry about non-C locales. The
6157 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 6158 * arranged in order (although not consecutively) and that only
9d116dd7
JH
6159 * [A-Za-z] are accepted by isALPHA in the C locale.
6160 */
6161 if (*d != 'z' && *d != 'Z') {
6162 do { ++*d; } while (!isALPHA(*d));
6163 return;
6164 }
6165 *(d--) -= 'z' - 'a';
6166#else
79072805
LW
6167 ++*d;
6168 if (isALPHA(*d))
6169 return;
6170 *(d--) -= 'z' - 'a' + 1;
9d116dd7 6171#endif
79072805
LW
6172 }
6173 }
6174 /* oh,oh, the number grew */
6175 SvGROW(sv, SvCUR(sv) + 2);
b162af07 6176 SvCUR_set(sv, SvCUR(sv) + 1);
3f7c398e 6177 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
79072805
LW
6178 *d = d[-1];
6179 if (isDIGIT(d[1]))
6180 *d = '1';
6181 else
6182 *d = d[1];
6183}
6184
954c1994
GS
6185/*
6186=for apidoc sv_dec
6187
645c22ef
DM
6188Auto-decrement of the value in the SV, doing string to numeric conversion
6189if necessary. Handles 'get' magic.
954c1994
GS
6190
6191=cut
6192*/
6193
79072805 6194void
864dbfa3 6195Perl_sv_dec(pTHX_ register SV *sv)
79072805 6196{
463ee0b2
LW
6197 int flags;
6198
79072805
LW
6199 if (!sv)
6200 return;
5b295bef 6201 SvGETMAGIC(sv);
ed6116ce 6202 if (SvTHINKFIRST(sv)) {
765f542d
NC
6203 if (SvIsCOW(sv))
6204 sv_force_normal_flags(sv, 0);
0f15f207 6205 if (SvREADONLY(sv)) {
923e4eb5 6206 if (IN_PERL_RUNTIME)
cea2e8a9 6207 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6208 }
a0d0e21e 6209 if (SvROK(sv)) {
b5be31e9 6210 IV i;
9e7bc3e8
JD
6211 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6212 return;
56431972 6213 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6214 sv_unref(sv);
6215 sv_setiv(sv, i);
a0d0e21e 6216 }
ed6116ce 6217 }
28e5dec8
JH
6218 /* Unlike sv_inc we don't have to worry about string-never-numbers
6219 and keeping them magic. But we mustn't warn on punting */
8990e307 6220 flags = SvFLAGS(sv);
28e5dec8
JH
6221 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6222 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6223#ifdef PERL_PRESERVE_IVUV
28e5dec8 6224 oops_its_int:
59d8ce62 6225#endif
25da4f38
IZ
6226 if (SvIsUV(sv)) {
6227 if (SvUVX(sv) == 0) {
6228 (void)SvIOK_only(sv);
45977657 6229 SvIV_set(sv, -1);
25da4f38
IZ
6230 }
6231 else {
6232 (void)SvIOK_only_UV(sv);
f4eee32f 6233 SvUV_set(sv, SvUVX(sv) - 1);
1c846c1f 6234 }
25da4f38
IZ
6235 } else {
6236 if (SvIVX(sv) == IV_MIN)
65202027 6237 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
6238 else {
6239 (void)SvIOK_only(sv);
45977657 6240 SvIV_set(sv, SvIVX(sv) - 1);
1c846c1f 6241 }
55497cff 6242 }
6243 return;
6244 }
28e5dec8 6245 if (flags & SVp_NOK) {
9d6ce603 6246 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
6247 (void)SvNOK_only(sv);
6248 return;
6249 }
8990e307 6250 if (!(flags & SVp_POK)) {
ef088171
NC
6251 if ((flags & SVTYPEMASK) < SVt_PVIV)
6252 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
6253 SvIV_set(sv, -1);
6254 (void)SvIOK_only(sv);
79072805
LW
6255 return;
6256 }
28e5dec8
JH
6257#ifdef PERL_PRESERVE_IVUV
6258 {
504618e9 6259 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
6260 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6261 /* Need to try really hard to see if it's an integer.
6262 9.22337203685478e+18 is an integer.
6263 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6264 so $a="9.22337203685478e+18"; $a+0; $a--
6265 needs to be the same as $a="9.22337203685478e+18"; $a--
6266 or we go insane. */
d460ef45 6267
28e5dec8
JH
6268 (void) sv_2iv(sv);
6269 if (SvIOK(sv))
6270 goto oops_its_int;
6271
6272 /* sv_2iv *should* have made this an NV */
6273 if (flags & SVp_NOK) {
6274 (void)SvNOK_only(sv);
9d6ce603 6275 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
6276 return;
6277 }
6278 /* I don't think we can get here. Maybe I should assert this
6279 And if we do get here I suspect that sv_setnv will croak. NWC
6280 Fall through. */
6281#if defined(USE_LONG_DOUBLE)
6282 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 6283 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 6284#else
1779d84d 6285 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 6286 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
6287#endif
6288 }
6289 }
6290#endif /* PERL_PRESERVE_IVUV */
3f7c398e 6291 sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0); /* punt */
79072805
LW
6292}
6293
954c1994
GS
6294/*
6295=for apidoc sv_mortalcopy
6296
645c22ef 6297Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
6298The new SV is marked as mortal. It will be destroyed "soon", either by an
6299explicit call to FREETMPS, or by an implicit call at places such as
6300statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
6301
6302=cut
6303*/
6304
79072805
LW
6305/* Make a string that will exist for the duration of the expression
6306 * evaluation. Actually, it may have to last longer than that, but
6307 * hopefully we won't free it until it has been assigned to a
6308 * permanent location. */
6309
6310SV *
864dbfa3 6311Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 6312{
463ee0b2 6313 register SV *sv;
b881518d 6314
4561caa4 6315 new_SV(sv);
79072805 6316 sv_setsv(sv,oldstr);
677b06e3
GS
6317 EXTEND_MORTAL(1);
6318 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
6319 SvTEMP_on(sv);
6320 return sv;
6321}
6322
954c1994
GS
6323/*
6324=for apidoc sv_newmortal
6325
645c22ef 6326Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
6327set to 1. It will be destroyed "soon", either by an explicit call to
6328FREETMPS, or by an implicit call at places such as statement boundaries.
6329See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
6330
6331=cut
6332*/
6333
8990e307 6334SV *
864dbfa3 6335Perl_sv_newmortal(pTHX)
8990e307
LW
6336{
6337 register SV *sv;
6338
4561caa4 6339 new_SV(sv);
8990e307 6340 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
6341 EXTEND_MORTAL(1);
6342 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
6343 return sv;
6344}
6345
954c1994
GS
6346/*
6347=for apidoc sv_2mortal
6348
d4236ebc
DM
6349Marks an existing SV as mortal. The SV will be destroyed "soon", either
6350by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
6351statement boundaries. SvTEMP() is turned on which means that the SV's
6352string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
6353and C<sv_mortalcopy>.
954c1994
GS
6354
6355=cut
6356*/
6357
79072805 6358SV *
864dbfa3 6359Perl_sv_2mortal(pTHX_ register SV *sv)
79072805 6360{
27da23d5 6361 dVAR;
79072805 6362 if (!sv)
7a5b473e 6363 return NULL;
d689ffdd 6364 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 6365 return sv;
677b06e3
GS
6366 EXTEND_MORTAL(1);
6367 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 6368 SvTEMP_on(sv);
79072805
LW
6369 return sv;
6370}
6371
954c1994
GS
6372/*
6373=for apidoc newSVpv
6374
6375Creates a new SV and copies a string into it. The reference count for the
6376SV is set to 1. If C<len> is zero, Perl will compute the length using
6377strlen(). For efficiency, consider using C<newSVpvn> instead.
6378
6379=cut
6380*/
6381
79072805 6382SV *
864dbfa3 6383Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 6384{
463ee0b2 6385 register SV *sv;
79072805 6386
4561caa4 6387 new_SV(sv);
616d8c9c 6388 sv_setpvn(sv,s,len ? len : strlen(s));
79072805
LW
6389 return sv;
6390}
6391
954c1994
GS
6392/*
6393=for apidoc newSVpvn
6394
6395Creates a new SV and copies a string into it. The reference count for the
1c846c1f 6396SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 6397string. You are responsible for ensuring that the source string is at least
9e09f5f2 6398C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
6399
6400=cut
6401*/
6402
9da1e3b5 6403SV *
864dbfa3 6404Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
6405{
6406 register SV *sv;
6407
6408 new_SV(sv);
9da1e3b5
MUN
6409 sv_setpvn(sv,s,len);
6410 return sv;
6411}
6412
bd08039b
NC
6413
6414/*
926f8064 6415=for apidoc newSVhek
bd08039b
NC
6416
6417Creates a new SV from the hash key structure. It will generate scalars that
5aaec2b4
NC
6418point to the shared string table where possible. Returns a new (undefined)
6419SV if the hek is NULL.
bd08039b
NC
6420
6421=cut
6422*/
6423
6424SV *
c1b02ed8 6425Perl_newSVhek(pTHX_ const HEK *hek)
bd08039b 6426{
5aaec2b4
NC
6427 if (!hek) {
6428 SV *sv;
6429
6430 new_SV(sv);
6431 return sv;
6432 }
6433
bd08039b
NC
6434 if (HEK_LEN(hek) == HEf_SVKEY) {
6435 return newSVsv(*(SV**)HEK_KEY(hek));
6436 } else {
6437 const int flags = HEK_FLAGS(hek);
6438 if (flags & HVhek_WASUTF8) {
6439 /* Trouble :-)
6440 Andreas would like keys he put in as utf8 to come back as utf8
6441 */
6442 STRLEN utf8_len = HEK_LEN(hek);
b64e5050
AL
6443 const U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
6444 SV * const sv = newSVpvn ((const char*)as_utf8, utf8_len);
bd08039b
NC
6445
6446 SvUTF8_on (sv);
6447 Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
6448 return sv;
6449 } else if (flags & HVhek_REHASH) {
6450 /* We don't have a pointer to the hv, so we have to replicate the
6451 flag into every HEK. This hv is using custom a hasing
6452 algorithm. Hence we can't return a shared string scalar, as
6453 that would contain the (wrong) hash value, and might get passed
6454 into an hv routine with a regular hash */
6455
b64e5050 6456 SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
bd08039b
NC
6457 if (HEK_UTF8(hek))
6458 SvUTF8_on (sv);
6459 return sv;
6460 }
6461 /* This will be overwhelminly the most common case. */
6462 return newSVpvn_share(HEK_KEY(hek),
6463 (HEK_UTF8(hek) ? -HEK_LEN(hek) : HEK_LEN(hek)),
6464 HEK_HASH(hek));
6465 }
6466}
6467
1c846c1f
NIS
6468/*
6469=for apidoc newSVpvn_share
6470
3f7c398e 6471Creates a new SV with its SvPVX_const pointing to a shared string in the string
645c22ef
DM
6472table. If the string does not already exist in the table, it is created
6473first. Turns on READONLY and FAKE. The string's hash is stored in the UV
6474slot of the SV; if the C<hash> parameter is non-zero, that value is used;
6475otherwise the hash is computed. The idea here is that as the string table
3f7c398e 6476is used for shared hash keys these strings will have SvPVX_const == HeKEY and
645c22ef 6477hash lookup will avoid string compare.
1c846c1f
NIS
6478
6479=cut
6480*/
6481
6482SV *
c3654f1a 6483Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
6484{
6485 register SV *sv;
c3654f1a
IH
6486 bool is_utf8 = FALSE;
6487 if (len < 0) {
77caf834 6488 STRLEN tmplen = -len;
c3654f1a 6489 is_utf8 = TRUE;
75a54232 6490 /* See the note in hv.c:hv_fetch() --jhi */
e1ec3a88 6491 src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
75a54232
JH
6492 len = tmplen;
6493 }
1c846c1f 6494 if (!hash)
5afd6d42 6495 PERL_HASH(hash, src, len);
1c846c1f 6496 new_SV(sv);
bdd68bc3 6497 sv_upgrade(sv, SVt_PV);
f880fe2f 6498 SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
b162af07 6499 SvCUR_set(sv, len);
b162af07 6500 SvLEN_set(sv, 0);
1c846c1f
NIS
6501 SvREADONLY_on(sv);
6502 SvFAKE_on(sv);
6503 SvPOK_on(sv);
c3654f1a
IH
6504 if (is_utf8)
6505 SvUTF8_on(sv);
1c846c1f
NIS
6506 return sv;
6507}
6508
645c22ef 6509
cea2e8a9 6510#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
6511
6512/* pTHX_ magic can't cope with varargs, so this is a no-context
6513 * version of the main function, (which may itself be aliased to us).
6514 * Don't access this version directly.
6515 */
6516
46fc3d4c 6517SV *
cea2e8a9 6518Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 6519{
cea2e8a9 6520 dTHX;
46fc3d4c 6521 register SV *sv;
6522 va_list args;
46fc3d4c 6523 va_start(args, pat);
c5be433b 6524 sv = vnewSVpvf(pat, &args);
46fc3d4c 6525 va_end(args);
6526 return sv;
6527}
cea2e8a9 6528#endif
46fc3d4c 6529
954c1994
GS
6530/*
6531=for apidoc newSVpvf
6532
645c22ef 6533Creates a new SV and initializes it with the string formatted like
954c1994
GS
6534C<sprintf>.
6535
6536=cut
6537*/
6538
cea2e8a9
GS
6539SV *
6540Perl_newSVpvf(pTHX_ const char* pat, ...)
6541{
6542 register SV *sv;
6543 va_list args;
cea2e8a9 6544 va_start(args, pat);
c5be433b 6545 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
6546 va_end(args);
6547 return sv;
6548}
46fc3d4c 6549
645c22ef
DM
6550/* backend for newSVpvf() and newSVpvf_nocontext() */
6551
79072805 6552SV *
c5be433b
GS
6553Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
6554{
6555 register SV *sv;
6556 new_SV(sv);
6557 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
6558 return sv;
6559}
6560
954c1994
GS
6561/*
6562=for apidoc newSVnv
6563
6564Creates a new SV and copies a floating point value into it.
6565The reference count for the SV is set to 1.
6566
6567=cut
6568*/
6569
c5be433b 6570SV *
65202027 6571Perl_newSVnv(pTHX_ NV n)
79072805 6572{
463ee0b2 6573 register SV *sv;
79072805 6574
4561caa4 6575 new_SV(sv);
79072805
LW
6576 sv_setnv(sv,n);
6577 return sv;
6578}
6579
954c1994
GS
6580/*
6581=for apidoc newSViv
6582
6583Creates a new SV and copies an integer into it. The reference count for the
6584SV is set to 1.
6585
6586=cut
6587*/
6588
79072805 6589SV *
864dbfa3 6590Perl_newSViv(pTHX_ IV i)
79072805 6591{
463ee0b2 6592 register SV *sv;
79072805 6593
4561caa4 6594 new_SV(sv);
79072805
LW
6595 sv_setiv(sv,i);
6596 return sv;
6597}
6598
954c1994 6599/*
1a3327fb
JH
6600=for apidoc newSVuv
6601
6602Creates a new SV and copies an unsigned integer into it.
6603The reference count for the SV is set to 1.
6604
6605=cut
6606*/
6607
6608SV *
6609Perl_newSVuv(pTHX_ UV u)
6610{
6611 register SV *sv;
6612
6613 new_SV(sv);
6614 sv_setuv(sv,u);
6615 return sv;
6616}
6617
6618/*
954c1994
GS
6619=for apidoc newRV_noinc
6620
6621Creates an RV wrapper for an SV. The reference count for the original
6622SV is B<not> incremented.
6623
6624=cut
6625*/
6626
2304df62 6627SV *
864dbfa3 6628Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
6629{
6630 register SV *sv;
6631
4561caa4 6632 new_SV(sv);
2304df62 6633 sv_upgrade(sv, SVt_RV);
76e3520e 6634 SvTEMP_off(tmpRef);
b162af07 6635 SvRV_set(sv, tmpRef);
2304df62 6636 SvROK_on(sv);
2304df62
AD
6637 return sv;
6638}
6639
ff276b08 6640/* newRV_inc is the official function name to use now.
645c22ef
DM
6641 * newRV_inc is in fact #defined to newRV in sv.h
6642 */
6643
5f05dabc 6644SV *
864dbfa3 6645Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 6646{
5f6447b6 6647 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 6648}
5f05dabc 6649
954c1994
GS
6650/*
6651=for apidoc newSVsv
6652
6653Creates a new SV which is an exact duplicate of the original SV.
645c22ef 6654(Uses C<sv_setsv>).
954c1994
GS
6655
6656=cut
6657*/
6658
79072805 6659SV *
864dbfa3 6660Perl_newSVsv(pTHX_ register SV *old)
79072805 6661{
463ee0b2 6662 register SV *sv;
79072805
LW
6663
6664 if (!old)
7a5b473e 6665 return NULL;
8990e307 6666 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 6667 if (ckWARN_d(WARN_INTERNAL))
9014280d 6668 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
79072805
LW
6669 return Nullsv;
6670 }
4561caa4 6671 new_SV(sv);
e90aabeb
NC
6672 /* SV_GMAGIC is the default for sv_setv()
6673 SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
6674 with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
6675 sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
463ee0b2 6676 return sv;
79072805
LW
6677}
6678
645c22ef
DM
6679/*
6680=for apidoc sv_reset
6681
6682Underlying implementation for the C<reset> Perl function.
6683Note that the perl-level function is vaguely deprecated.
6684
6685=cut
6686*/
6687
79072805 6688void
e1ec3a88 6689Perl_sv_reset(pTHX_ register const char *s, HV *stash)
79072805 6690{
27da23d5 6691 dVAR;
4802d5d7 6692 char todo[PERL_UCHAR_MAX+1];
79072805 6693
49d8d3a1
MB
6694 if (!stash)
6695 return;
6696
79072805 6697 if (!*s) { /* reset ?? searches */
aec46f14 6698 MAGIC * const mg = mg_find((SV *)stash, PERL_MAGIC_symtab);
8d2f4536
NC
6699 if (mg) {
6700 PMOP *pm = (PMOP *) mg->mg_obj;
6701 while (pm) {
6702 pm->op_pmdynflags &= ~PMdf_USED;
6703 pm = pm->op_pmnext;
6704 }
79072805
LW
6705 }
6706 return;
6707 }
6708
6709 /* reset variables */
6710
6711 if (!HvARRAY(stash))
6712 return;
463ee0b2
LW
6713
6714 Zero(todo, 256, char);
79072805 6715 while (*s) {
b464bac0
AL
6716 I32 max;
6717 I32 i = (unsigned char)*s;
79072805
LW
6718 if (s[1] == '-') {
6719 s += 2;
6720 }
4802d5d7 6721 max = (unsigned char)*s++;
79072805 6722 for ( ; i <= max; i++) {
463ee0b2
LW
6723 todo[i] = 1;
6724 }
a0d0e21e 6725 for (i = 0; i <= (I32) HvMAX(stash); i++) {
b464bac0 6726 HE *entry;
79072805 6727 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
6728 entry;
6729 entry = HeNEXT(entry))
6730 {
b464bac0
AL
6731 register GV *gv;
6732 register SV *sv;
6733
1edc1566 6734 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 6735 continue;
1edc1566 6736 gv = (GV*)HeVAL(entry);
79072805 6737 sv = GvSV(gv);
e203899d
NC
6738 if (sv) {
6739 if (SvTHINKFIRST(sv)) {
6740 if (!SvREADONLY(sv) && SvROK(sv))
6741 sv_unref(sv);
6742 /* XXX Is this continue a bug? Why should THINKFIRST
6743 exempt us from resetting arrays and hashes? */
6744 continue;
6745 }
6746 SvOK_off(sv);
6747 if (SvTYPE(sv) >= SVt_PV) {
6748 SvCUR_set(sv, 0);
6749 if (SvPVX_const(sv) != Nullch)
6750 *SvPVX(sv) = '\0';
6751 SvTAINT(sv);
6752 }
79072805
LW
6753 }
6754 if (GvAV(gv)) {
6755 av_clear(GvAV(gv));
6756 }
bfcb3514 6757 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
b0269e46
AB
6758#if defined(VMS)
6759 Perl_die(aTHX_ "Can't reset %%ENV on this system");
6760#else /* ! VMS */
463ee0b2 6761 hv_clear(GvHV(gv));
b0269e46
AB
6762# if defined(USE_ENVIRON_ARRAY)
6763 if (gv == PL_envgv)
6764 my_clearenv();
6765# endif /* USE_ENVIRON_ARRAY */
6766#endif /* VMS */
79072805
LW
6767 }
6768 }
6769 }
6770 }
6771}
6772
645c22ef
DM
6773/*
6774=for apidoc sv_2io
6775
6776Using various gambits, try to get an IO from an SV: the IO slot if its a
6777GV; or the recursive result if we're an RV; or the IO slot of the symbol
6778named after the PV if we're a string.
6779
6780=cut
6781*/
6782
46fc3d4c 6783IO*
864dbfa3 6784Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 6785{
6786 IO* io;
6787 GV* gv;
6788
6789 switch (SvTYPE(sv)) {
6790 case SVt_PVIO:
6791 io = (IO*)sv;
6792 break;
6793 case SVt_PVGV:
6794 gv = (GV*)sv;
6795 io = GvIO(gv);
6796 if (!io)
cea2e8a9 6797 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 6798 break;
6799 default:
6800 if (!SvOK(sv))
cea2e8a9 6801 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 6802 if (SvROK(sv))
6803 return sv_2io(SvRV(sv));
f776e3cd 6804 gv = gv_fetchsv(sv, 0, SVt_PVIO);
46fc3d4c 6805 if (gv)
6806 io = GvIO(gv);
6807 else
6808 io = 0;
6809 if (!io)
35c1215d 6810 Perl_croak(aTHX_ "Bad filehandle: %"SVf, sv);
46fc3d4c 6811 break;
6812 }
6813 return io;
6814}
6815
645c22ef
DM
6816/*
6817=for apidoc sv_2cv
6818
6819Using various gambits, try to get a CV from an SV; in addition, try if
6820possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
f2c0649b 6821The flags in C<lref> are passed to sv_fetchsv.
645c22ef
DM
6822
6823=cut
6824*/
6825
79072805 6826CV *
864dbfa3 6827Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 6828{
27da23d5 6829 dVAR;
c04a4dfe
JH
6830 GV *gv = Nullgv;
6831 CV *cv = Nullcv;
79072805
LW
6832
6833 if (!sv)
ef58ba18 6834 return *st = NULL, *gvp = Nullgv, Nullcv;
79072805 6835 switch (SvTYPE(sv)) {
79072805
LW
6836 case SVt_PVCV:
6837 *st = CvSTASH(sv);
6838 *gvp = Nullgv;
6839 return (CV*)sv;
6840 case SVt_PVHV:
6841 case SVt_PVAV:
ef58ba18 6842 *st = NULL;
79072805
LW
6843 *gvp = Nullgv;
6844 return Nullcv;
8990e307
LW
6845 case SVt_PVGV:
6846 gv = (GV*)sv;
a0d0e21e 6847 *gvp = gv;
8990e307
LW
6848 *st = GvESTASH(gv);
6849 goto fix_gv;
6850
79072805 6851 default:
5b295bef 6852 SvGETMAGIC(sv);
a0d0e21e 6853 if (SvROK(sv)) {
823a54a3 6854 SV * const *sp = &sv; /* Used in tryAMAGICunDEREF macro. */
f5284f61
IZ
6855 tryAMAGICunDEREF(to_cv);
6856
62f274bf
GS
6857 sv = SvRV(sv);
6858 if (SvTYPE(sv) == SVt_PVCV) {
6859 cv = (CV*)sv;
6860 *gvp = Nullgv;
6861 *st = CvSTASH(cv);
6862 return cv;
6863 }
6864 else if(isGV(sv))
6865 gv = (GV*)sv;
6866 else
cea2e8a9 6867 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 6868 }
62f274bf 6869 else if (isGV(sv))
79072805
LW
6870 gv = (GV*)sv;
6871 else
7a5fd60d 6872 gv = gv_fetchsv(sv, lref, SVt_PVCV);
79072805 6873 *gvp = gv;
ef58ba18
NC
6874 if (!gv) {
6875 *st = NULL;
79072805 6876 return Nullcv;
ef58ba18 6877 }
e26df76a
NC
6878 /* Some flags to gv_fetchsv mean don't really create the GV */
6879 if (SvTYPE(gv) != SVt_PVGV) {
6880 *st = NULL;
6881 return NULL;
6882 }
79072805 6883 *st = GvESTASH(gv);
8990e307 6884 fix_gv:
8ebc5c01 6885 if (lref && !GvCVu(gv)) {
4633a7c4 6886 SV *tmpsv;
748a9306 6887 ENTER;
4633a7c4 6888 tmpsv = NEWSV(704,0);
16660edb 6889 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
6890 /* XXX this is probably not what they think they're getting.
6891 * It has the same effect as "sub name;", i.e. just a forward
6892 * declaration! */
774d564b 6893 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
6894 newSVOP(OP_CONST, 0, tmpsv),
6895 Nullop,
8990e307 6896 Nullop);
748a9306 6897 LEAVE;
8ebc5c01 6898 if (!GvCVu(gv))
35c1215d
NC
6899 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
6900 sv);
8990e307 6901 }
8ebc5c01 6902 return GvCVu(gv);
79072805
LW
6903 }
6904}
6905
c461cf8f
JH
6906/*
6907=for apidoc sv_true
6908
6909Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
6910Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
6911instead use an in-line version.
c461cf8f
JH
6912
6913=cut
6914*/
6915
79072805 6916I32
864dbfa3 6917Perl_sv_true(pTHX_ register SV *sv)
79072805 6918{
8990e307
LW
6919 if (!sv)
6920 return 0;
79072805 6921 if (SvPOK(sv)) {
823a54a3
AL
6922 register const XPV* const tXpv = (XPV*)SvANY(sv);
6923 if (tXpv &&
c2f1de04 6924 (tXpv->xpv_cur > 1 ||
339049b0 6925 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
79072805
LW
6926 return 1;
6927 else
6928 return 0;
6929 }
6930 else {
6931 if (SvIOK(sv))
463ee0b2 6932 return SvIVX(sv) != 0;
79072805
LW
6933 else {
6934 if (SvNOK(sv))
463ee0b2 6935 return SvNVX(sv) != 0.0;
79072805 6936 else
463ee0b2 6937 return sv_2bool(sv);
79072805
LW
6938 }
6939 }
6940}
79072805 6941
645c22ef 6942/*
c461cf8f
JH
6943=for apidoc sv_pvn_force
6944
6945Get a sensible string out of the SV somehow.
645c22ef
DM
6946A private implementation of the C<SvPV_force> macro for compilers which
6947can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 6948
8d6d96c1
HS
6949=for apidoc sv_pvn_force_flags
6950
6951Get a sensible string out of the SV somehow.
6952If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
6953appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
6954implemented in terms of this function.
645c22ef
DM
6955You normally want to use the various wrapper macros instead: see
6956C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
6957
6958=cut
6959*/
6960
6961char *
6962Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
6963{
a0d0e21e 6964
6fc92669 6965 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 6966 sv_force_normal_flags(sv, 0);
1c846c1f 6967
a0d0e21e 6968 if (SvPOK(sv)) {
13c5b33c
NC
6969 if (lp)
6970 *lp = SvCUR(sv);
a0d0e21e
LW
6971 }
6972 else {
a3b680e6 6973 char *s;
13c5b33c
NC
6974 STRLEN len;
6975
4d84ee25 6976 if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
b64e5050 6977 const char * const ref = sv_reftype(sv,0);
4d84ee25
NC
6978 if (PL_op)
6979 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
b64e5050 6980 ref, OP_NAME(PL_op));
4d84ee25 6981 else
b64e5050 6982 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
4d84ee25 6983 }
b64e5050 6984 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
cea2e8a9 6985 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 6986 OP_NAME(PL_op));
b64e5050 6987 s = sv_2pv_flags(sv, &len, flags);
13c5b33c
NC
6988 if (lp)
6989 *lp = len;
6990
3f7c398e 6991 if (s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */
a0d0e21e
LW
6992 if (SvROK(sv))
6993 sv_unref(sv);
862a34c6 6994 SvUPGRADE(sv, SVt_PV); /* Never FALSE */
a0d0e21e 6995 SvGROW(sv, len + 1);
706aa1c9 6996 Move(s,SvPVX(sv),len,char);
a0d0e21e
LW
6997 SvCUR_set(sv, len);
6998 *SvEND(sv) = '\0';
6999 }
7000 if (!SvPOK(sv)) {
7001 SvPOK_on(sv); /* validate pointer */
7002 SvTAINT(sv);
1d7c1841 7003 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 7004 PTR2UV(sv),SvPVX_const(sv)));
a0d0e21e
LW
7005 }
7006 }
4d84ee25 7007 return SvPVX_mutable(sv);
a0d0e21e
LW
7008}
7009
645c22ef 7010/*
645c22ef
DM
7011=for apidoc sv_pvbyten_force
7012
0feed65a 7013The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
645c22ef
DM
7014
7015=cut
7016*/
7017
7340a771
GS
7018char *
7019Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
7020{
46ec2f14 7021 sv_pvn_force(sv,lp);
ffebcc3e 7022 sv_utf8_downgrade(sv,0);
46ec2f14
TS
7023 *lp = SvCUR(sv);
7024 return SvPVX(sv);
7340a771
GS
7025}
7026
645c22ef 7027/*
c461cf8f
JH
7028=for apidoc sv_pvutf8n_force
7029
0feed65a 7030The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
c461cf8f
JH
7031
7032=cut
7033*/
7034
7340a771
GS
7035char *
7036Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
7037{
46ec2f14 7038 sv_pvn_force(sv,lp);
560a288e 7039 sv_utf8_upgrade(sv);
46ec2f14
TS
7040 *lp = SvCUR(sv);
7041 return SvPVX(sv);
7340a771
GS
7042}
7043
c461cf8f
JH
7044/*
7045=for apidoc sv_reftype
7046
7047Returns a string describing what the SV is a reference to.
7048
7049=cut
7050*/
7051
1cb0ed9b 7052char *
bfed75c6 7053Perl_sv_reftype(pTHX_ const SV *sv, int ob)
a0d0e21e 7054{
07409e01
NC
7055 /* The fact that I don't need to downcast to char * everywhere, only in ?:
7056 inside return suggests a const propagation bug in g++. */
c86bf373 7057 if (ob && SvOBJECT(sv)) {
1b6737cc 7058 char * const name = HvNAME_get(SvSTASH(sv));
07409e01 7059 return name ? name : (char *) "__ANON__";
c86bf373 7060 }
a0d0e21e
LW
7061 else {
7062 switch (SvTYPE(sv)) {
7063 case SVt_NULL:
7064 case SVt_IV:
7065 case SVt_NV:
7066 case SVt_RV:
7067 case SVt_PV:
7068 case SVt_PVIV:
7069 case SVt_PVNV:
7070 case SVt_PVMG:
7071 case SVt_PVBM:
1cb0ed9b 7072 if (SvVOK(sv))
439cb1c4 7073 return "VSTRING";
a0d0e21e
LW
7074 if (SvROK(sv))
7075 return "REF";
7076 else
7077 return "SCALAR";
1cb0ed9b 7078
07409e01 7079 case SVt_PVLV: return (char *) (SvROK(sv) ? "REF"
be65207d
DM
7080 /* tied lvalues should appear to be
7081 * scalars for backwards compatitbility */
7082 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
07409e01 7083 ? "SCALAR" : "LVALUE");
a0d0e21e
LW
7084 case SVt_PVAV: return "ARRAY";
7085 case SVt_PVHV: return "HASH";
7086 case SVt_PVCV: return "CODE";
7087 case SVt_PVGV: return "GLOB";
1d2dff63 7088 case SVt_PVFM: return "FORMAT";
27f9d8f3 7089 case SVt_PVIO: return "IO";
a0d0e21e
LW
7090 default: return "UNKNOWN";
7091 }
7092 }
7093}
7094
954c1994
GS
7095/*
7096=for apidoc sv_isobject
7097
7098Returns a boolean indicating whether the SV is an RV pointing to a blessed
7099object. If the SV is not an RV, or if the object is not blessed, then this
7100will return false.
7101
7102=cut
7103*/
7104
463ee0b2 7105int
864dbfa3 7106Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 7107{
68dc0745 7108 if (!sv)
7109 return 0;
5b295bef 7110 SvGETMAGIC(sv);
85e6fe83
LW
7111 if (!SvROK(sv))
7112 return 0;
7113 sv = (SV*)SvRV(sv);
7114 if (!SvOBJECT(sv))
7115 return 0;
7116 return 1;
7117}
7118
954c1994
GS
7119/*
7120=for apidoc sv_isa
7121
7122Returns a boolean indicating whether the SV is blessed into the specified
7123class. This does not check for subtypes; use C<sv_derived_from> to verify
7124an inheritance relationship.
7125
7126=cut
7127*/
7128
85e6fe83 7129int
864dbfa3 7130Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 7131{
bfcb3514 7132 const char *hvname;
68dc0745 7133 if (!sv)
7134 return 0;
5b295bef 7135 SvGETMAGIC(sv);
ed6116ce 7136 if (!SvROK(sv))
463ee0b2 7137 return 0;
ed6116ce
LW
7138 sv = (SV*)SvRV(sv);
7139 if (!SvOBJECT(sv))
463ee0b2 7140 return 0;
bfcb3514
NC
7141 hvname = HvNAME_get(SvSTASH(sv));
7142 if (!hvname)
e27ad1f2 7143 return 0;
463ee0b2 7144
bfcb3514 7145 return strEQ(hvname, name);
463ee0b2
LW
7146}
7147
954c1994
GS
7148/*
7149=for apidoc newSVrv
7150
7151Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
7152it will be upgraded to one. If C<classname> is non-null then the new SV will
7153be blessed in the specified package. The new SV is returned and its
7154reference count is 1.
7155
7156=cut
7157*/
7158
463ee0b2 7159SV*
864dbfa3 7160Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 7161{
463ee0b2
LW
7162 SV *sv;
7163
4561caa4 7164 new_SV(sv);
51cf62d8 7165
765f542d 7166 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 7167 SvAMAGIC_off(rv);
51cf62d8 7168
0199fce9 7169 if (SvTYPE(rv) >= SVt_PVMG) {
a3b680e6 7170 const U32 refcnt = SvREFCNT(rv);
0199fce9
JD
7171 SvREFCNT(rv) = 0;
7172 sv_clear(rv);
7173 SvFLAGS(rv) = 0;
7174 SvREFCNT(rv) = refcnt;
7175 }
7176
51cf62d8 7177 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
7178 sv_upgrade(rv, SVt_RV);
7179 else if (SvTYPE(rv) > SVt_RV) {
8bd4d4c5 7180 SvPV_free(rv);
0199fce9
JD
7181 SvCUR_set(rv, 0);
7182 SvLEN_set(rv, 0);
7183 }
51cf62d8 7184
0c34ef67 7185 SvOK_off(rv);
b162af07 7186 SvRV_set(rv, sv);
ed6116ce 7187 SvROK_on(rv);
463ee0b2 7188
a0d0e21e 7189 if (classname) {
1b6737cc 7190 HV* const stash = gv_stashpv(classname, TRUE);
a0d0e21e
LW
7191 (void)sv_bless(rv, stash);
7192 }
7193 return sv;
7194}
7195
954c1994
GS
7196/*
7197=for apidoc sv_setref_pv
7198
7199Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
7200argument will be upgraded to an RV. That RV will be modified to point to
7201the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7202into the SV. The C<classname> argument indicates the package for the
7203blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 7204will have a reference count of 1, and the RV will be returned.
954c1994
GS
7205
7206Do not use with other Perl types such as HV, AV, SV, CV, because those
7207objects will become corrupted by the pointer copy process.
7208
7209Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7210
7211=cut
7212*/
7213
a0d0e21e 7214SV*
864dbfa3 7215Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 7216{
189b2af5 7217 if (!pv) {
3280af22 7218 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
7219 SvSETMAGIC(rv);
7220 }
a0d0e21e 7221 else
56431972 7222 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
7223 return rv;
7224}
7225
954c1994
GS
7226/*
7227=for apidoc sv_setref_iv
7228
7229Copies an integer into a new SV, optionally blessing the SV. The C<rv>
7230argument will be upgraded to an RV. That RV will be modified to point to
7231the new SV. The C<classname> argument indicates the package for the
7232blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 7233will have a reference count of 1, and the RV will be returned.
954c1994
GS
7234
7235=cut
7236*/
7237
a0d0e21e 7238SV*
864dbfa3 7239Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
7240{
7241 sv_setiv(newSVrv(rv,classname), iv);
7242 return rv;
7243}
7244
954c1994 7245/*
e1c57cef
JH
7246=for apidoc sv_setref_uv
7247
7248Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
7249argument will be upgraded to an RV. That RV will be modified to point to
7250the new SV. The C<classname> argument indicates the package for the
7251blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 7252will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
7253
7254=cut
7255*/
7256
7257SV*
7258Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
7259{
7260 sv_setuv(newSVrv(rv,classname), uv);
7261 return rv;
7262}
7263
7264/*
954c1994
GS
7265=for apidoc sv_setref_nv
7266
7267Copies a double into a new SV, optionally blessing the SV. The C<rv>
7268argument will be upgraded to an RV. That RV will be modified to point to
7269the new SV. The C<classname> argument indicates the package for the
7270blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 7271will have a reference count of 1, and the RV will be returned.
954c1994
GS
7272
7273=cut
7274*/
7275
a0d0e21e 7276SV*
65202027 7277Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
7278{
7279 sv_setnv(newSVrv(rv,classname), nv);
7280 return rv;
7281}
463ee0b2 7282
954c1994
GS
7283/*
7284=for apidoc sv_setref_pvn
7285
7286Copies a string into a new SV, optionally blessing the SV. The length of the
7287string must be specified with C<n>. The C<rv> argument will be upgraded to
7288an RV. That RV will be modified to point to the new SV. The C<classname>
7289argument indicates the package for the blessing. Set C<classname> to
7a5fa8a2 7290C<Nullch> to avoid the blessing. The new SV will have a reference count
d34c2299 7291of 1, and the RV will be returned.
954c1994
GS
7292
7293Note that C<sv_setref_pv> copies the pointer while this copies the string.
7294
7295=cut
7296*/
7297
a0d0e21e 7298SV*
1b6737cc 7299Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, const char *pv, STRLEN n)
a0d0e21e
LW
7300{
7301 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
7302 return rv;
7303}
7304
954c1994
GS
7305/*
7306=for apidoc sv_bless
7307
7308Blesses an SV into a specified package. The SV must be an RV. The package
7309must be designated by its stash (see C<gv_stashpv()>). The reference count
7310of the SV is unaffected.
7311
7312=cut
7313*/
7314
a0d0e21e 7315SV*
864dbfa3 7316Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 7317{
76e3520e 7318 SV *tmpRef;
a0d0e21e 7319 if (!SvROK(sv))
cea2e8a9 7320 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
7321 tmpRef = SvRV(sv);
7322 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
7323 if (SvREADONLY(tmpRef))
cea2e8a9 7324 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
7325 if (SvOBJECT(tmpRef)) {
7326 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7327 --PL_sv_objcount;
76e3520e 7328 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 7329 }
a0d0e21e 7330 }
76e3520e
GS
7331 SvOBJECT_on(tmpRef);
7332 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7333 ++PL_sv_objcount;
862a34c6 7334 SvUPGRADE(tmpRef, SVt_PVMG);
b162af07 7335 SvSTASH_set(tmpRef, (HV*)SvREFCNT_inc(stash));
a0d0e21e 7336
2e3febc6
CS
7337 if (Gv_AMG(stash))
7338 SvAMAGIC_on(sv);
7339 else
7340 SvAMAGIC_off(sv);
a0d0e21e 7341
1edbfb88
AB
7342 if(SvSMAGICAL(tmpRef))
7343 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
7344 mg_set(tmpRef);
7345
7346
ecdeb87c 7347
a0d0e21e
LW
7348 return sv;
7349}
7350
645c22ef 7351/* Downgrades a PVGV to a PVMG.
645c22ef
DM
7352 */
7353
76e3520e 7354STATIC void
cea2e8a9 7355S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 7356{
850fabdf
GS
7357 void *xpvmg;
7358
a0d0e21e
LW
7359 assert(SvTYPE(sv) == SVt_PVGV);
7360 SvFAKE_off(sv);
7361 if (GvGP(sv))
1edc1566 7362 gp_free((GV*)sv);
e826b3c7 7363 if (GvSTASH(sv)) {
e15faf7d 7364 sv_del_backref((SV*)GvSTASH(sv), sv);
5c284bb0 7365 GvSTASH(sv) = NULL;
e826b3c7 7366 }
14befaf4 7367 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 7368 Safefree(GvNAME(sv));
a5f75d66 7369 GvMULTI_off(sv);
850fabdf
GS
7370
7371 /* need to keep SvANY(sv) in the right arena */
7372 xpvmg = new_XPVMG();
7373 StructCopy(SvANY(sv), xpvmg, XPVMG);
7374 del_XPVGV(SvANY(sv));
7375 SvANY(sv) = xpvmg;
7376
a0d0e21e
LW
7377 SvFLAGS(sv) &= ~SVTYPEMASK;
7378 SvFLAGS(sv) |= SVt_PVMG;
7379}
7380
954c1994 7381/*
840a7b70 7382=for apidoc sv_unref_flags
954c1994
GS
7383
7384Unsets the RV status of the SV, and decrements the reference count of
7385whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
7386as a reversal of C<newSVrv>. The C<cflags> argument can contain
7387C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
7388(otherwise the decrementing is conditional on the reference count being
7389different from one or the reference being a readonly SV).
7889fe52 7390See C<SvROK_off>.
954c1994
GS
7391
7392=cut
7393*/
7394
ed6116ce 7395void
e15faf7d 7396Perl_sv_unref_flags(pTHX_ SV *ref, U32 flags)
ed6116ce 7397{
b64e5050 7398 SV* const target = SvRV(ref);
810b8aa5 7399
e15faf7d
NC
7400 if (SvWEAKREF(ref)) {
7401 sv_del_backref(target, ref);
7402 SvWEAKREF_off(ref);
7403 SvRV_set(ref, NULL);
810b8aa5
GS
7404 return;
7405 }
e15faf7d
NC
7406 SvRV_set(ref, NULL);
7407 SvROK_off(ref);
7408 /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
04ca4930 7409 assigned to as BEGIN {$a = \"Foo"} will fail. */
e15faf7d
NC
7410 if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
7411 SvREFCNT_dec(target);
840a7b70 7412 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
e15faf7d 7413 sv_2mortal(target); /* Schedule for freeing later */
ed6116ce 7414}
8990e307 7415
840a7b70 7416/*
645c22ef
DM
7417=for apidoc sv_untaint
7418
7419Untaint an SV. Use C<SvTAINTED_off> instead.
7420=cut
7421*/
7422
bbce6d69 7423void
864dbfa3 7424Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 7425{
13f57bf8 7426 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
b64e5050 7427 MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 7428 if (mg)
565764a8 7429 mg->mg_len &= ~1;
36477c24 7430 }
bbce6d69 7431}
7432
645c22ef
DM
7433/*
7434=for apidoc sv_tainted
7435
7436Test an SV for taintedness. Use C<SvTAINTED> instead.
7437=cut
7438*/
7439
bbce6d69 7440bool
864dbfa3 7441Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 7442{
13f57bf8 7443 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
823a54a3 7444 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
2ddb8a4f 7445 if (mg && (mg->mg_len & 1) )
36477c24 7446 return TRUE;
7447 }
7448 return FALSE;
bbce6d69 7449}
7450
09540bc3
JH
7451/*
7452=for apidoc sv_setpviv
7453
7454Copies an integer into the given SV, also updating its string value.
7455Does not handle 'set' magic. See C<sv_setpviv_mg>.
7456
7457=cut
7458*/
7459
7460void
7461Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
7462{
7463 char buf[TYPE_CHARS(UV)];
7464 char *ebuf;
b64e5050 7465 char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
09540bc3
JH
7466
7467 sv_setpvn(sv, ptr, ebuf - ptr);
7468}
7469
7470/*
7471=for apidoc sv_setpviv_mg
7472
7473Like C<sv_setpviv>, but also handles 'set' magic.
7474
7475=cut
7476*/
7477
7478void
7479Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
7480{
df7eb254 7481 sv_setpviv(sv, iv);
09540bc3
JH
7482 SvSETMAGIC(sv);
7483}
7484
cea2e8a9 7485#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7486
7487/* pTHX_ magic can't cope with varargs, so this is a no-context
7488 * version of the main function, (which may itself be aliased to us).
7489 * Don't access this version directly.
7490 */
7491
cea2e8a9
GS
7492void
7493Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
7494{
7495 dTHX;
7496 va_list args;
7497 va_start(args, pat);
c5be433b 7498 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
7499 va_end(args);
7500}
7501
645c22ef
DM
7502/* pTHX_ magic can't cope with varargs, so this is a no-context
7503 * version of the main function, (which may itself be aliased to us).
7504 * Don't access this version directly.
7505 */
cea2e8a9
GS
7506
7507void
7508Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
7509{
7510 dTHX;
7511 va_list args;
7512 va_start(args, pat);
c5be433b 7513 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 7514 va_end(args);
cea2e8a9
GS
7515}
7516#endif
7517
954c1994
GS
7518/*
7519=for apidoc sv_setpvf
7520
bffc3d17
SH
7521Works like C<sv_catpvf> but copies the text into the SV instead of
7522appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
7523
7524=cut
7525*/
7526
46fc3d4c 7527void
864dbfa3 7528Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 7529{
7530 va_list args;
46fc3d4c 7531 va_start(args, pat);
c5be433b 7532 sv_vsetpvf(sv, pat, &args);
46fc3d4c 7533 va_end(args);
7534}
7535
bffc3d17
SH
7536/*
7537=for apidoc sv_vsetpvf
7538
7539Works like C<sv_vcatpvf> but copies the text into the SV instead of
7540appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
7541
7542Usually used via its frontend C<sv_setpvf>.
7543
7544=cut
7545*/
645c22ef 7546
c5be433b
GS
7547void
7548Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7549{
7550 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7551}
ef50df4b 7552
954c1994
GS
7553/*
7554=for apidoc sv_setpvf_mg
7555
7556Like C<sv_setpvf>, but also handles 'set' magic.
7557
7558=cut
7559*/
7560
ef50df4b 7561void
864dbfa3 7562Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
7563{
7564 va_list args;
ef50df4b 7565 va_start(args, pat);
c5be433b 7566 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 7567 va_end(args);
c5be433b
GS
7568}
7569
bffc3d17
SH
7570/*
7571=for apidoc sv_vsetpvf_mg
7572
7573Like C<sv_vsetpvf>, but also handles 'set' magic.
7574
7575Usually used via its frontend C<sv_setpvf_mg>.
7576
7577=cut
7578*/
645c22ef 7579
c5be433b
GS
7580void
7581Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7582{
7583 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
7584 SvSETMAGIC(sv);
7585}
7586
cea2e8a9 7587#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7588
7589/* pTHX_ magic can't cope with varargs, so this is a no-context
7590 * version of the main function, (which may itself be aliased to us).
7591 * Don't access this version directly.
7592 */
7593
cea2e8a9
GS
7594void
7595Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
7596{
7597 dTHX;
7598 va_list args;
7599 va_start(args, pat);
c5be433b 7600 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
7601 va_end(args);
7602}
7603
645c22ef
DM
7604/* pTHX_ magic can't cope with varargs, so this is a no-context
7605 * version of the main function, (which may itself be aliased to us).
7606 * Don't access this version directly.
7607 */
7608
cea2e8a9
GS
7609void
7610Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
7611{
7612 dTHX;
7613 va_list args;
7614 va_start(args, pat);
c5be433b 7615 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 7616 va_end(args);
cea2e8a9
GS
7617}
7618#endif
7619
954c1994
GS
7620/*
7621=for apidoc sv_catpvf
7622
d5ce4a7c
GA
7623Processes its arguments like C<sprintf> and appends the formatted
7624output to an SV. If the appended data contains "wide" characters
7625(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
7626and characters >255 formatted with %c), the original SV might get
bffc3d17 7627upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
7628C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
7629valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 7630
d5ce4a7c 7631=cut */
954c1994 7632
46fc3d4c 7633void
864dbfa3 7634Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 7635{
7636 va_list args;
46fc3d4c 7637 va_start(args, pat);
c5be433b 7638 sv_vcatpvf(sv, pat, &args);
46fc3d4c 7639 va_end(args);
7640}
7641
bffc3d17
SH
7642/*
7643=for apidoc sv_vcatpvf
7644
7645Processes its arguments like C<vsprintf> and appends the formatted output
7646to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
7647
7648Usually used via its frontend C<sv_catpvf>.
7649
7650=cut
7651*/
645c22ef 7652
ef50df4b 7653void
c5be433b
GS
7654Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7655{
7656 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7657}
7658
954c1994
GS
7659/*
7660=for apidoc sv_catpvf_mg
7661
7662Like C<sv_catpvf>, but also handles 'set' magic.
7663
7664=cut
7665*/
7666
c5be433b 7667void
864dbfa3 7668Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
7669{
7670 va_list args;
ef50df4b 7671 va_start(args, pat);
c5be433b 7672 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 7673 va_end(args);
c5be433b
GS
7674}
7675
bffc3d17
SH
7676/*
7677=for apidoc sv_vcatpvf_mg
7678
7679Like C<sv_vcatpvf>, but also handles 'set' magic.
7680
7681Usually used via its frontend C<sv_catpvf_mg>.
7682
7683=cut
7684*/
645c22ef 7685
c5be433b
GS
7686void
7687Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7688{
7689 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
7690 SvSETMAGIC(sv);
7691}
7692
954c1994
GS
7693/*
7694=for apidoc sv_vsetpvfn
7695
bffc3d17 7696Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
7697appending it.
7698
bffc3d17 7699Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 7700
954c1994
GS
7701=cut
7702*/
7703
46fc3d4c 7704void
7d5ea4e7 7705Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 7706{
7707 sv_setpvn(sv, "", 0);
7d5ea4e7 7708 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 7709}
7710
2d00ba3b 7711STATIC I32
9dd79c3f 7712S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
7713{
7714 I32 var = 0;
7715 switch (**pattern) {
7716 case '1': case '2': case '3':
7717 case '4': case '5': case '6':
7718 case '7': case '8': case '9':
2fba7546
GA
7719 var = *(*pattern)++ - '0';
7720 while (isDIGIT(**pattern)) {
7721 I32 tmp = var * 10 + (*(*pattern)++ - '0');
7722 if (tmp < var)
7723 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_NAME(PL_op) : "sv_vcatpvfn"));
7724 var = tmp;
7725 }
211dfcf1
HS
7726 }
7727 return var;
7728}
211dfcf1 7729
c445ea15
AL
7730STATIC char *
7731S_F0convert(NV nv, char *endbuf, STRLEN *len)
4151a5fe 7732{
a3b680e6 7733 const int neg = nv < 0;
4151a5fe 7734 UV uv;
4151a5fe
IZ
7735
7736 if (neg)
7737 nv = -nv;
7738 if (nv < UV_MAX) {
b464bac0 7739 char *p = endbuf;
4151a5fe 7740 nv += 0.5;
028f8eaa 7741 uv = (UV)nv;
4151a5fe
IZ
7742 if (uv & 1 && uv == nv)
7743 uv--; /* Round to even */
7744 do {
a3b680e6 7745 const unsigned dig = uv % 10;
4151a5fe
IZ
7746 *--p = '0' + dig;
7747 } while (uv /= 10);
7748 if (neg)
7749 *--p = '-';
7750 *len = endbuf - p;
7751 return p;
7752 }
7753 return Nullch;
7754}
7755
7756
954c1994
GS
7757/*
7758=for apidoc sv_vcatpvfn
7759
7760Processes its arguments like C<vsprintf> and appends the formatted output
7761to an SV. Uses an array of SVs if the C style variable argument list is
7762missing (NULL). When running with taint checks enabled, indicates via
7763C<maybe_tainted> if results are untrustworthy (often due to the use of
7764locales).
7765
bffc3d17 7766Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 7767
954c1994
GS
7768=cut
7769*/
7770
8896765a
RB
7771
7772#define VECTORIZE_ARGS vecsv = va_arg(*args, SV*);\
7773 vecstr = (U8*)SvPV_const(vecsv,veclen);\
7774 vec_utf8 = DO_UTF8(vecsv);
7775
1ef29b0e
RGS
7776/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
7777
46fc3d4c 7778void
7d5ea4e7 7779Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 7780{
7781 char *p;
7782 char *q;
a3b680e6 7783 const char *patend;
fc36a67e 7784 STRLEN origlen;
46fc3d4c 7785 I32 svix = 0;
27da23d5 7786 static const char nullstr[] = "(null)";
9c5ffd7c 7787 SV *argsv = Nullsv;
b464bac0
AL
7788 bool has_utf8 = DO_UTF8(sv); /* has the result utf8? */
7789 const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
db79b45b 7790 SV *nsv = Nullsv;
4151a5fe
IZ
7791 /* Times 4: a decimal digit takes more than 3 binary digits.
7792 * NV_DIG: mantissa takes than many decimal digits.
7793 * Plus 32: Playing safe. */
7794 char ebuf[IV_DIG * 4 + NV_DIG + 32];
7795 /* large enough for "%#.#f" --chip */
7796 /* what about long double NVs? --jhi */
db79b45b 7797
53c1dcc0
AL
7798 PERL_UNUSED_ARG(maybe_tainted);
7799
46fc3d4c 7800 /* no matter what, this is a string now */
fc36a67e 7801 (void)SvPV_force(sv, origlen);
46fc3d4c 7802
8896765a 7803 /* special-case "", "%s", and "%-p" (SVf - see below) */
46fc3d4c 7804 if (patlen == 0)
7805 return;
0dbb1585 7806 if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
2d03de9c
AL
7807 if (args) {
7808 const char * const s = va_arg(*args, char*);
7809 sv_catpv(sv, s ? s : nullstr);
7810 }
7811 else if (svix < svmax) {
7812 sv_catsv(sv, *svargs);
2d03de9c
AL
7813 }
7814 return;
0dbb1585 7815 }
8896765a
RB
7816 if (args && patlen == 3 && pat[0] == '%' &&
7817 pat[1] == '-' && pat[2] == 'p') {
7818 argsv = va_arg(*args, SV*);
7819 sv_catsv(sv, argsv);
8896765a 7820 return;
46fc3d4c 7821 }
7822
1d917b39 7823#ifndef USE_LONG_DOUBLE
4151a5fe 7824 /* special-case "%.<number>[gf]" */
7af36d83 7825 if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
4151a5fe
IZ
7826 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
7827 unsigned digits = 0;
7828 const char *pp;
7829
7830 pp = pat + 2;
7831 while (*pp >= '0' && *pp <= '9')
7832 digits = 10 * digits + (*pp++ - '0');
028f8eaa 7833 if (pp - pat == (int)patlen - 1) {
4151a5fe
IZ
7834 NV nv;
7835
7af36d83 7836 if (svix < svmax)
4151a5fe
IZ
7837 nv = SvNV(*svargs);
7838 else
7839 return;
7840 if (*pp == 'g') {
2873255c
NC
7841 /* Add check for digits != 0 because it seems that some
7842 gconverts are buggy in this case, and we don't yet have
7843 a Configure test for this. */
7844 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
7845 /* 0, point, slack */
2e59c212 7846 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
7847 sv_catpv(sv, ebuf);
7848 if (*ebuf) /* May return an empty string for digits==0 */
7849 return;
7850 }
7851 } else if (!digits) {
7852 STRLEN l;
7853
7854 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
7855 sv_catpvn(sv, p, l);
7856 return;
7857 }
7858 }
7859 }
7860 }
1d917b39 7861#endif /* !USE_LONG_DOUBLE */
4151a5fe 7862
2cf2cfc6 7863 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 7864 has_utf8 = TRUE;
2cf2cfc6 7865
46fc3d4c 7866 patend = (char*)pat + patlen;
7867 for (p = (char*)pat; p < patend; p = q) {
7868 bool alt = FALSE;
7869 bool left = FALSE;
b22c7a20 7870 bool vectorize = FALSE;
211dfcf1 7871 bool vectorarg = FALSE;
2cf2cfc6 7872 bool vec_utf8 = FALSE;
46fc3d4c 7873 char fill = ' ';
7874 char plus = 0;
7875 char intsize = 0;
7876 STRLEN width = 0;
fc36a67e 7877 STRLEN zeros = 0;
46fc3d4c 7878 bool has_precis = FALSE;
7879 STRLEN precis = 0;
c445ea15 7880 const I32 osvix = svix;
2cf2cfc6 7881 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
7882#ifdef HAS_LDBL_SPRINTF_BUG
7883 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 7884 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
7885 bool fix_ldbl_sprintf_bug = FALSE;
7886#endif
205f51d8 7887
46fc3d4c 7888 char esignbuf[4];
89ebb4a3 7889 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 7890 STRLEN esignlen = 0;
7891
4d84ee25 7892 const char *eptr = Nullch;
fc36a67e 7893 STRLEN elen = 0;
81f715da 7894 SV *vecsv = Nullsv;
245d4a47 7895 const U8 *vecstr = Null(U8*);
b22c7a20 7896 STRLEN veclen = 0;
934abaf1 7897 char c = 0;
46fc3d4c 7898 int i;
9c5ffd7c 7899 unsigned base = 0;
8c8eb53c
RB
7900 IV iv = 0;
7901 UV uv = 0;
9e5b023a
JH
7902 /* we need a long double target in case HAS_LONG_DOUBLE but
7903 not USE_LONG_DOUBLE
7904 */
35fff930 7905#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
7906 long double nv;
7907#else
65202027 7908 NV nv;
9e5b023a 7909#endif
46fc3d4c 7910 STRLEN have;
7911 STRLEN need;
7912 STRLEN gap;
7af36d83 7913 const char *dotstr = ".";
b22c7a20 7914 STRLEN dotstrlen = 1;
211dfcf1 7915 I32 efix = 0; /* explicit format parameter index */
eb3fce90 7916 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
7917 I32 epix = 0; /* explicit precision index */
7918 I32 evix = 0; /* explicit vector index */
eb3fce90 7919 bool asterisk = FALSE;
46fc3d4c 7920
211dfcf1 7921 /* echo everything up to the next format specification */
46fc3d4c 7922 for (q = p; q < patend && *q != '%'; ++q) ;
7923 if (q > p) {
db79b45b
JH
7924 if (has_utf8 && !pat_utf8)
7925 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
7926 else
7927 sv_catpvn(sv, p, q - p);
46fc3d4c 7928 p = q;
7929 }
7930 if (q++ >= patend)
7931 break;
7932
211dfcf1
HS
7933/*
7934 We allow format specification elements in this order:
7935 \d+\$ explicit format parameter index
7936 [-+ 0#]+ flags
a472f209 7937 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 7938 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
7939 \d+|\*(\d+\$)? width using optional (optionally specified) arg
7940 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
7941 [hlqLV] size
8896765a
RB
7942 [%bcdefginopsuxDFOUX] format (mandatory)
7943*/
7944
7945 if (args) {
7946/*
7947 As of perl5.9.3, printf format checking is on by default.
7948 Internally, perl uses %p formats to provide an escape to
7949 some extended formatting. This block deals with those
7950 extensions: if it does not match, (char*)q is reset and
7951 the normal format processing code is used.
7952
7953 Currently defined extensions are:
7954 %p include pointer address (standard)
7955 %-p (SVf) include an SV (previously %_)
7956 %-<num>p include an SV with precision <num>
7957 %1p (VDf) include a v-string (as %vd)
7958 %<num>p reserved for future extensions
7959
7960 Robin Barker 2005-07-14
211dfcf1 7961*/
8896765a
RB
7962 char* r = q;
7963 bool sv = FALSE;
7964 STRLEN n = 0;
7965 if (*q == '-')
7966 sv = *q++;
c445ea15 7967 n = expect_number(&q);
8896765a
RB
7968 if (*q++ == 'p') {
7969 if (sv) { /* SVf */
7970 if (n) {
7971 precis = n;
7972 has_precis = TRUE;
7973 }
7974 argsv = va_arg(*args, SV*);
7975 eptr = SvPVx_const(argsv, elen);
7976 if (DO_UTF8(argsv))
7977 is_utf8 = TRUE;
7978 goto string;
7979 }
7980#if vdNUMBER
7981 else if (n == vdNUMBER) { /* VDf */
7982 vectorize = TRUE;
7983 VECTORIZE_ARGS
7984 goto format_vd;
7985 }
7986#endif
7987 else if (n) {
7988 if (ckWARN_d(WARN_INTERNAL))
7989 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
7990 "internal %%<num>p might conflict with future printf extensions");
7991 }
7992 }
7993 q = r;
7994 }
7995
c445ea15 7996 if ( (width = expect_number(&q)) ) {
211dfcf1
HS
7997 if (*q == '$') {
7998 ++q;
7999 efix = width;
8000 } else {
8001 goto gotwidth;
8002 }
8003 }
8004
fc36a67e 8005 /* FLAGS */
8006
46fc3d4c 8007 while (*q) {
8008 switch (*q) {
8009 case ' ':
8010 case '+':
8011 plus = *q++;
8012 continue;
8013
8014 case '-':
8015 left = TRUE;
8016 q++;
8017 continue;
8018
8019 case '0':
8020 fill = *q++;
8021 continue;
8022
8023 case '#':
8024 alt = TRUE;
8025 q++;
8026 continue;
8027
fc36a67e 8028 default:
8029 break;
8030 }
8031 break;
8032 }
46fc3d4c 8033
211dfcf1 8034 tryasterisk:
eb3fce90 8035 if (*q == '*') {
211dfcf1 8036 q++;
c445ea15 8037 if ( (ewix = expect_number(&q)) )
211dfcf1
HS
8038 if (*q++ != '$')
8039 goto unknown;
eb3fce90 8040 asterisk = TRUE;
211dfcf1
HS
8041 }
8042 if (*q == 'v') {
eb3fce90 8043 q++;
211dfcf1
HS
8044 if (vectorize)
8045 goto unknown;
9cbac4c7 8046 if ((vectorarg = asterisk)) {
211dfcf1
HS
8047 evix = ewix;
8048 ewix = 0;
8049 asterisk = FALSE;
8050 }
8051 vectorize = TRUE;
8052 goto tryasterisk;
eb3fce90
JH
8053 }
8054
211dfcf1 8055 if (!asterisk)
858a90f9 8056 {
7a5fa8a2 8057 if( *q == '0' )
f3583277 8058 fill = *q++;
c445ea15 8059 width = expect_number(&q);
858a90f9 8060 }
211dfcf1
HS
8061
8062 if (vectorize) {
8063 if (vectorarg) {
8064 if (args)
8065 vecsv = va_arg(*args, SV*);
7ad96abb
NC
8066 else if (evix) {
8067 vecsv = (evix > 0 && evix <= svmax)
8068 ? svargs[evix-1] : &PL_sv_undef;
8069 } else {
8070 vecsv = svix < svmax ? svargs[svix++] : &PL_sv_undef;
8071 }
245d4a47 8072 dotstr = SvPV_const(vecsv, dotstrlen);
640283f5
NC
8073 /* Keep the DO_UTF8 test *after* the SvPV call, else things go
8074 bad with tied or overloaded values that return UTF8. */
211dfcf1 8075 if (DO_UTF8(vecsv))
2cf2cfc6 8076 is_utf8 = TRUE;
640283f5
NC
8077 else if (has_utf8) {
8078 vecsv = sv_mortalcopy(vecsv);
8079 sv_utf8_upgrade(vecsv);
8080 dotstr = SvPV_const(vecsv, dotstrlen);
8081 is_utf8 = TRUE;
8082 }
211dfcf1
HS
8083 }
8084 if (args) {
8896765a 8085 VECTORIZE_ARGS
eb3fce90 8086 }
7ad96abb 8087 else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
211dfcf1 8088 vecsv = svargs[efix ? efix-1 : svix++];
245d4a47 8089 vecstr = (U8*)SvPV_const(vecsv,veclen);
2cf2cfc6 8090 vec_utf8 = DO_UTF8(vecsv);
96b8f7ce
JP
8091
8092 /* if this is a version object, we need to convert
8093 * back into v-string notation and then let the
8094 * vectorize happen normally
d7aa5382 8095 */
96b8f7ce
JP
8096 if (sv_derived_from(vecsv, "version")) {
8097 char *version = savesvpv(vecsv);
8098 vecsv = sv_newmortal();
8099 /* scan_vstring is expected to be called during
8100 * tokenization, so we need to fake up the end
8101 * of the buffer for it
8102 */
8103 PL_bufend = version + veclen;
8104 scan_vstring(version, vecsv);
8105 vecstr = (U8*)SvPV_const(vecsv, veclen);
8106 vec_utf8 = DO_UTF8(vecsv);
8107 Safefree(version);
d7aa5382 8108 }
211dfcf1
HS
8109 }
8110 else {
8111 vecstr = (U8*)"";
8112 veclen = 0;
8113 }
eb3fce90 8114 }
fc36a67e 8115
eb3fce90 8116 if (asterisk) {
fc36a67e 8117 if (args)
8118 i = va_arg(*args, int);
8119 else
eb3fce90
JH
8120 i = (ewix ? ewix <= svmax : svix < svmax) ?
8121 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8122 left |= (i < 0);
8123 width = (i < 0) ? -i : i;
fc36a67e 8124 }
211dfcf1 8125 gotwidth:
fc36a67e 8126
8127 /* PRECISION */
46fc3d4c 8128
fc36a67e 8129 if (*q == '.') {
8130 q++;
8131 if (*q == '*') {
211dfcf1 8132 q++;
c445ea15 8133 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
7b8dd722
HS
8134 goto unknown;
8135 /* XXX: todo, support specified precision parameter */
8136 if (epix)
211dfcf1 8137 goto unknown;
46fc3d4c 8138 if (args)
8139 i = va_arg(*args, int);
8140 else
eb3fce90
JH
8141 i = (ewix ? ewix <= svmax : svix < svmax)
8142 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8143 precis = (i < 0) ? 0 : i;
fc36a67e 8144 }
8145 else {
8146 precis = 0;
8147 while (isDIGIT(*q))
8148 precis = precis * 10 + (*q++ - '0');
8149 }
8150 has_precis = TRUE;
8151 }
46fc3d4c 8152
fc36a67e 8153 /* SIZE */
46fc3d4c 8154
fc36a67e 8155 switch (*q) {
c623ac67
GS
8156#ifdef WIN32
8157 case 'I': /* Ix, I32x, and I64x */
8158# ifdef WIN64
8159 if (q[1] == '6' && q[2] == '4') {
8160 q += 3;
8161 intsize = 'q';
8162 break;
8163 }
8164# endif
8165 if (q[1] == '3' && q[2] == '2') {
8166 q += 3;
8167 break;
8168 }
8169# ifdef WIN64
8170 intsize = 'q';
8171# endif
8172 q++;
8173 break;
8174#endif
9e5b023a 8175#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 8176 case 'L': /* Ld */
e5c81feb 8177 /* FALL THROUGH */
e5c81feb 8178#ifdef HAS_QUAD
6f9bb7fd 8179 case 'q': /* qd */
9e5b023a 8180#endif
6f9bb7fd
GS
8181 intsize = 'q';
8182 q++;
8183 break;
8184#endif
fc36a67e 8185 case 'l':
9e5b023a 8186#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 8187 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 8188 intsize = 'q';
8189 q += 2;
46fc3d4c 8190 break;
cf2093f6 8191 }
fc36a67e 8192#endif
6f9bb7fd 8193 /* FALL THROUGH */
fc36a67e 8194 case 'h':
cf2093f6 8195 /* FALL THROUGH */
fc36a67e 8196 case 'V':
8197 intsize = *q++;
46fc3d4c 8198 break;
8199 }
8200
fc36a67e 8201 /* CONVERSION */
8202
211dfcf1
HS
8203 if (*q == '%') {
8204 eptr = q++;
8205 elen = 1;
26372e71
GA
8206 if (vectorize) {
8207 c = '%';
8208 goto unknown;
8209 }
211dfcf1
HS
8210 goto string;
8211 }
8212
26372e71 8213 if (!vectorize && !args) {
86c51f8b
NC
8214 if (efix) {
8215 const I32 i = efix-1;
8216 argsv = (i >= 0 && i < svmax) ? svargs[i] : &PL_sv_undef;
8217 } else {
8218 argsv = (svix >= 0 && svix < svmax)
8219 ? svargs[svix++] : &PL_sv_undef;
8220 }
863811b2 8221 }
211dfcf1 8222
46fc3d4c 8223 switch (c = *q++) {
8224
8225 /* STRINGS */
8226
46fc3d4c 8227 case 'c':
26372e71
GA
8228 if (vectorize)
8229 goto unknown;
8230 uv = (args) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
8231 if ((uv > 255 ||
8232 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 8233 && !IN_BYTES) {
dfe13c55 8234 eptr = (char*)utf8buf;
9041c2e3 8235 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 8236 is_utf8 = TRUE;
7e2040f0
GS
8237 }
8238 else {
8239 c = (char)uv;
8240 eptr = &c;
8241 elen = 1;
a0ed51b3 8242 }
46fc3d4c 8243 goto string;
8244
46fc3d4c 8245 case 's':
26372e71
GA
8246 if (vectorize)
8247 goto unknown;
8248 if (args) {
fc36a67e 8249 eptr = va_arg(*args, char*);
c635e13b 8250 if (eptr)
1d7c1841
GS
8251#ifdef MACOS_TRADITIONAL
8252 /* On MacOS, %#s format is used for Pascal strings */
8253 if (alt)
8254 elen = *eptr++;
8255 else
8256#endif
c635e13b 8257 elen = strlen(eptr);
8258 else {
27da23d5 8259 eptr = (char *)nullstr;
c635e13b 8260 elen = sizeof nullstr - 1;
8261 }
46fc3d4c 8262 }
211dfcf1 8263 else {
4d84ee25 8264 eptr = SvPVx_const(argsv, elen);
7e2040f0 8265 if (DO_UTF8(argsv)) {
a0ed51b3
LW
8266 if (has_precis && precis < elen) {
8267 I32 p = precis;
7e2040f0 8268 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
8269 precis = p;
8270 }
8271 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 8272 width += elen - sv_len_utf8(argsv);
a0ed51b3 8273 }
2cf2cfc6 8274 is_utf8 = TRUE;
a0ed51b3
LW
8275 }
8276 }
fc36a67e 8277
46fc3d4c 8278 string:
8279 if (has_precis && elen > precis)
8280 elen = precis;
8281 break;
8282
8283 /* INTEGERS */
8284
fc36a67e 8285 case 'p':
be75b157 8286 if (alt || vectorize)
c2e66d9e 8287 goto unknown;
211dfcf1 8288 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 8289 base = 16;
8290 goto integer;
8291
46fc3d4c 8292 case 'D':
29fe7a80 8293#ifdef IV_IS_QUAD
22f3ae8c 8294 intsize = 'q';
29fe7a80 8295#else
46fc3d4c 8296 intsize = 'l';
29fe7a80 8297#endif
46fc3d4c 8298 /* FALL THROUGH */
8299 case 'd':
8300 case 'i':
8896765a
RB
8301#if vdNUMBER
8302 format_vd:
8303#endif
b22c7a20 8304 if (vectorize) {
ba210ebe 8305 STRLEN ulen;
211dfcf1
HS
8306 if (!veclen)
8307 continue;
2cf2cfc6
A
8308 if (vec_utf8)
8309 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8310 UTF8_ALLOW_ANYUV);
b22c7a20 8311 else {
e83d50c9 8312 uv = *vecstr;
b22c7a20
GS
8313 ulen = 1;
8314 }
8315 vecstr += ulen;
8316 veclen -= ulen;
e83d50c9
JP
8317 if (plus)
8318 esignbuf[esignlen++] = plus;
b22c7a20
GS
8319 }
8320 else if (args) {
46fc3d4c 8321 switch (intsize) {
8322 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 8323 case 'l': iv = va_arg(*args, long); break;
fc36a67e 8324 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 8325 default: iv = va_arg(*args, int); break;
cf2093f6
JH
8326#ifdef HAS_QUAD
8327 case 'q': iv = va_arg(*args, Quad_t); break;
8328#endif
46fc3d4c 8329 }
8330 }
8331 else {
b10c0dba 8332 IV tiv = SvIVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 8333 switch (intsize) {
b10c0dba
MHM
8334 case 'h': iv = (short)tiv; break;
8335 case 'l': iv = (long)tiv; break;
8336 case 'V':
8337 default: iv = tiv; break;
cf2093f6 8338#ifdef HAS_QUAD
b10c0dba 8339 case 'q': iv = (Quad_t)tiv; break;
cf2093f6 8340#endif
46fc3d4c 8341 }
8342 }
e83d50c9
JP
8343 if ( !vectorize ) /* we already set uv above */
8344 {
8345 if (iv >= 0) {
8346 uv = iv;
8347 if (plus)
8348 esignbuf[esignlen++] = plus;
8349 }
8350 else {
8351 uv = -iv;
8352 esignbuf[esignlen++] = '-';
8353 }
46fc3d4c 8354 }
8355 base = 10;
8356 goto integer;
8357
fc36a67e 8358 case 'U':
29fe7a80 8359#ifdef IV_IS_QUAD
22f3ae8c 8360 intsize = 'q';
29fe7a80 8361#else
fc36a67e 8362 intsize = 'l';
29fe7a80 8363#endif
fc36a67e 8364 /* FALL THROUGH */
8365 case 'u':
8366 base = 10;
8367 goto uns_integer;
8368
4f19785b
WSI
8369 case 'b':
8370 base = 2;
8371 goto uns_integer;
8372
46fc3d4c 8373 case 'O':
29fe7a80 8374#ifdef IV_IS_QUAD
22f3ae8c 8375 intsize = 'q';
29fe7a80 8376#else
46fc3d4c 8377 intsize = 'l';
29fe7a80 8378#endif
46fc3d4c 8379 /* FALL THROUGH */
8380 case 'o':
8381 base = 8;
8382 goto uns_integer;
8383
8384 case 'X':
46fc3d4c 8385 case 'x':
8386 base = 16;
46fc3d4c 8387
8388 uns_integer:
b22c7a20 8389 if (vectorize) {
ba210ebe 8390 STRLEN ulen;
b22c7a20 8391 vector:
211dfcf1
HS
8392 if (!veclen)
8393 continue;
2cf2cfc6
A
8394 if (vec_utf8)
8395 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8396 UTF8_ALLOW_ANYUV);
b22c7a20 8397 else {
a05b299f 8398 uv = *vecstr;
b22c7a20
GS
8399 ulen = 1;
8400 }
8401 vecstr += ulen;
8402 veclen -= ulen;
8403 }
8404 else if (args) {
46fc3d4c 8405 switch (intsize) {
8406 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 8407 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 8408 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 8409 default: uv = va_arg(*args, unsigned); break;
cf2093f6 8410#ifdef HAS_QUAD
9e3321a5 8411 case 'q': uv = va_arg(*args, Uquad_t); break;
cf2093f6 8412#endif
46fc3d4c 8413 }
8414 }
8415 else {
b10c0dba 8416 UV tuv = SvUVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 8417 switch (intsize) {
b10c0dba
MHM
8418 case 'h': uv = (unsigned short)tuv; break;
8419 case 'l': uv = (unsigned long)tuv; break;
8420 case 'V':
8421 default: uv = tuv; break;
cf2093f6 8422#ifdef HAS_QUAD
b10c0dba 8423 case 'q': uv = (Uquad_t)tuv; break;
cf2093f6 8424#endif
46fc3d4c 8425 }
8426 }
8427
8428 integer:
4d84ee25
NC
8429 {
8430 char *ptr = ebuf + sizeof ebuf;
8431 switch (base) {
8432 unsigned dig;
8433 case 16:
8434 if (!uv)
8435 alt = FALSE;
8436 p = (char*)((c == 'X')
8437 ? "0123456789ABCDEF" : "0123456789abcdef");
8438 do {
8439 dig = uv & 15;
8440 *--ptr = p[dig];
8441 } while (uv >>= 4);
8442 if (alt) {
8443 esignbuf[esignlen++] = '0';
8444 esignbuf[esignlen++] = c; /* 'x' or 'X' */
8445 }
8446 break;
8447 case 8:
8448 do {
8449 dig = uv & 7;
8450 *--ptr = '0' + dig;
8451 } while (uv >>= 3);
8452 if (alt && *ptr != '0')
8453 *--ptr = '0';
8454 break;
8455 case 2:
ed2b91d2
GA
8456 if (!uv)
8457 alt = FALSE;
4d84ee25
NC
8458 do {
8459 dig = uv & 1;
8460 *--ptr = '0' + dig;
8461 } while (uv >>= 1);
8462 if (alt) {
8463 esignbuf[esignlen++] = '0';
8464 esignbuf[esignlen++] = 'b';
8465 }
8466 break;
8467 default: /* it had better be ten or less */
8468 do {
8469 dig = uv % base;
8470 *--ptr = '0' + dig;
8471 } while (uv /= base);
8472 break;
46fc3d4c 8473 }
4d84ee25
NC
8474 elen = (ebuf + sizeof ebuf) - ptr;
8475 eptr = ptr;
8476 if (has_precis) {
8477 if (precis > elen)
8478 zeros = precis - elen;
8479 else if (precis == 0 && elen == 1 && *eptr == '0')
8480 elen = 0;
eda88b6d 8481 }
c10ed8b9 8482 }
46fc3d4c 8483 break;
8484
8485 /* FLOATING POINT */
8486
fc36a67e 8487 case 'F':
8488 c = 'f'; /* maybe %F isn't supported here */
8489 /* FALL THROUGH */
46fc3d4c 8490 case 'e': case 'E':
fc36a67e 8491 case 'f':
46fc3d4c 8492 case 'g': case 'G':
26372e71
GA
8493 if (vectorize)
8494 goto unknown;
46fc3d4c 8495
8496 /* This is evil, but floating point is even more evil */
8497
9e5b023a
JH
8498 /* for SV-style calling, we can only get NV
8499 for C-style calling, we assume %f is double;
8500 for simplicity we allow any of %Lf, %llf, %qf for long double
8501 */
8502 switch (intsize) {
8503 case 'V':
8504#if defined(USE_LONG_DOUBLE)
8505 intsize = 'q';
8506#endif
8507 break;
8a2e3f14 8508/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364
HS
8509 case 'l':
8510 /* FALL THROUGH */
9e5b023a
JH
8511 default:
8512#if defined(USE_LONG_DOUBLE)
8513 intsize = args ? 0 : 'q';
8514#endif
8515 break;
8516 case 'q':
8517#if defined(HAS_LONG_DOUBLE)
8518 break;
8519#else
8520 /* FALL THROUGH */
8521#endif
8522 case 'h':
9e5b023a
JH
8523 goto unknown;
8524 }
8525
8526 /* now we need (long double) if intsize == 'q', else (double) */
26372e71 8527 nv = (args) ?
35fff930
JH
8528#if LONG_DOUBLESIZE > DOUBLESIZE
8529 intsize == 'q' ?
205f51d8
AS
8530 va_arg(*args, long double) :
8531 va_arg(*args, double)
35fff930 8532#else
205f51d8 8533 va_arg(*args, double)
35fff930 8534#endif
9e5b023a 8535 : SvNVx(argsv);
fc36a67e 8536
8537 need = 0;
8538 if (c != 'e' && c != 'E') {
8539 i = PERL_INT_MIN;
9e5b023a
JH
8540 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
8541 will cast our (long double) to (double) */
73b309ea 8542 (void)Perl_frexp(nv, &i);
fc36a67e 8543 if (i == PERL_INT_MIN)
cea2e8a9 8544 Perl_die(aTHX_ "panic: frexp");
c635e13b 8545 if (i > 0)
fc36a67e 8546 need = BIT_DIGITS(i);
8547 }
8548 need += has_precis ? precis : 6; /* known default */
20f6aaab 8549
fc36a67e 8550 if (need < width)
8551 need = width;
8552
20f6aaab
AS
8553#ifdef HAS_LDBL_SPRINTF_BUG
8554 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
8555 with sfio - Allen <allens@cpan.org> */
8556
8557# ifdef DBL_MAX
8558# define MY_DBL_MAX DBL_MAX
8559# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
8560# if DOUBLESIZE >= 8
8561# define MY_DBL_MAX 1.7976931348623157E+308L
8562# else
8563# define MY_DBL_MAX 3.40282347E+38L
8564# endif
8565# endif
8566
8567# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
8568# define MY_DBL_MAX_BUG 1L
20f6aaab 8569# else
205f51d8 8570# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 8571# endif
20f6aaab 8572
205f51d8
AS
8573# ifdef DBL_MIN
8574# define MY_DBL_MIN DBL_MIN
8575# else /* XXX guessing! -Allen */
8576# if DOUBLESIZE >= 8
8577# define MY_DBL_MIN 2.2250738585072014E-308L
8578# else
8579# define MY_DBL_MIN 1.17549435E-38L
8580# endif
8581# endif
20f6aaab 8582
205f51d8
AS
8583 if ((intsize == 'q') && (c == 'f') &&
8584 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
8585 (need < DBL_DIG)) {
8586 /* it's going to be short enough that
8587 * long double precision is not needed */
8588
8589 if ((nv <= 0L) && (nv >= -0L))
8590 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
8591 else {
8592 /* would use Perl_fp_class as a double-check but not
8593 * functional on IRIX - see perl.h comments */
8594
8595 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
8596 /* It's within the range that a double can represent */
8597#if defined(DBL_MAX) && !defined(DBL_MIN)
8598 if ((nv >= ((long double)1/DBL_MAX)) ||
8599 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 8600#endif
205f51d8 8601 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 8602 }
205f51d8
AS
8603 }
8604 if (fix_ldbl_sprintf_bug == TRUE) {
8605 double temp;
8606
8607 intsize = 0;
8608 temp = (double)nv;
8609 nv = (NV)temp;
8610 }
20f6aaab 8611 }
205f51d8
AS
8612
8613# undef MY_DBL_MAX
8614# undef MY_DBL_MAX_BUG
8615# undef MY_DBL_MIN
8616
20f6aaab
AS
8617#endif /* HAS_LDBL_SPRINTF_BUG */
8618
46fc3d4c 8619 need += 20; /* fudge factor */
80252599
GS
8620 if (PL_efloatsize < need) {
8621 Safefree(PL_efloatbuf);
8622 PL_efloatsize = need + 20; /* more fudge */
a02a5408 8623 Newx(PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 8624 PL_efloatbuf[0] = '\0';
46fc3d4c 8625 }
8626
4151a5fe
IZ
8627 if ( !(width || left || plus || alt) && fill != '0'
8628 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
8629 /* See earlier comment about buggy Gconvert when digits,
8630 aka precis is 0 */
8631 if ( c == 'g' && precis) {
2e59c212 8632 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4150c189
NC
8633 /* May return an empty string for digits==0 */
8634 if (*PL_efloatbuf) {
8635 elen = strlen(PL_efloatbuf);
4151a5fe 8636 goto float_converted;
4150c189 8637 }
4151a5fe
IZ
8638 } else if ( c == 'f' && !precis) {
8639 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
8640 break;
8641 }
8642 }
4d84ee25
NC
8643 {
8644 char *ptr = ebuf + sizeof ebuf;
8645 *--ptr = '\0';
8646 *--ptr = c;
8647 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9e5b023a 8648#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
4d84ee25
NC
8649 if (intsize == 'q') {
8650 /* Copy the one or more characters in a long double
8651 * format before the 'base' ([efgEFG]) character to
8652 * the format string. */
8653 static char const prifldbl[] = PERL_PRIfldbl;
8654 char const *p = prifldbl + sizeof(prifldbl) - 3;
8655 while (p >= prifldbl) { *--ptr = *p--; }
8656 }
65202027 8657#endif
4d84ee25
NC
8658 if (has_precis) {
8659 base = precis;
8660 do { *--ptr = '0' + (base % 10); } while (base /= 10);
8661 *--ptr = '.';
8662 }
8663 if (width) {
8664 base = width;
8665 do { *--ptr = '0' + (base % 10); } while (base /= 10);
8666 }
8667 if (fill == '0')
8668 *--ptr = fill;
8669 if (left)
8670 *--ptr = '-';
8671 if (plus)
8672 *--ptr = plus;
8673 if (alt)
8674 *--ptr = '#';
8675 *--ptr = '%';
8676
8677 /* No taint. Otherwise we are in the strange situation
8678 * where printf() taints but print($float) doesn't.
8679 * --jhi */
9e5b023a 8680#if defined(HAS_LONG_DOUBLE)
4150c189
NC
8681 elen = ((intsize == 'q')
8682 ? my_sprintf(PL_efloatbuf, ptr, nv)
8683 : my_sprintf(PL_efloatbuf, ptr, (double)nv));
9e5b023a 8684#else
4150c189 8685 elen = my_sprintf(PL_efloatbuf, ptr, nv);
9e5b023a 8686#endif
4d84ee25 8687 }
4151a5fe 8688 float_converted:
80252599 8689 eptr = PL_efloatbuf;
46fc3d4c 8690 break;
8691
fc36a67e 8692 /* SPECIAL */
8693
8694 case 'n':
26372e71
GA
8695 if (vectorize)
8696 goto unknown;
fc36a67e 8697 i = SvCUR(sv) - origlen;
26372e71 8698 if (args) {
c635e13b 8699 switch (intsize) {
8700 case 'h': *(va_arg(*args, short*)) = i; break;
8701 default: *(va_arg(*args, int*)) = i; break;
8702 case 'l': *(va_arg(*args, long*)) = i; break;
8703 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
8704#ifdef HAS_QUAD
8705 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
8706#endif
c635e13b 8707 }
fc36a67e 8708 }
9dd79c3f 8709 else
211dfcf1 8710 sv_setuv_mg(argsv, (UV)i);
fc36a67e 8711 continue; /* not "break" */
8712
8713 /* UNKNOWN */
8714
46fc3d4c 8715 default:
fc36a67e 8716 unknown:
041457d9
DM
8717 if (!args
8718 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
8719 && ckWARN(WARN_PRINTF))
8720 {
c4420975 8721 SV * const msg = sv_newmortal();
35c1215d
NC
8722 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
8723 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 8724 if (c) {
0f4b6630 8725 if (isPRINT(c))
1c846c1f 8726 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
8727 "\"%%%c\"", c & 0xFF);
8728 else
8729 Perl_sv_catpvf(aTHX_ msg,
57def98f 8730 "\"%%\\%03"UVof"\"",
0f4b6630 8731 (UV)c & 0xFF);
0f4b6630 8732 } else
c635e13b 8733 sv_catpv(msg, "end of string");
9014280d 8734 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 8735 }
fb73857a 8736
8737 /* output mangled stuff ... */
8738 if (c == '\0')
8739 --q;
46fc3d4c 8740 eptr = p;
8741 elen = q - p;
fb73857a 8742
8743 /* ... right here, because formatting flags should not apply */
8744 SvGROW(sv, SvCUR(sv) + elen + 1);
8745 p = SvEND(sv);
4459522c 8746 Copy(eptr, p, elen, char);
fb73857a 8747 p += elen;
8748 *p = '\0';
3f7c398e 8749 SvCUR_set(sv, p - SvPVX_const(sv));
58e33a90 8750 svix = osvix;
fb73857a 8751 continue; /* not "break" */
46fc3d4c 8752 }
8753
6c94ec8b
HS
8754 /* calculate width before utf8_upgrade changes it */
8755 have = esignlen + zeros + elen;
ed2b91d2
GA
8756 if (have < zeros)
8757 Perl_croak_nocontext(PL_memory_wrap);
6c94ec8b 8758
d2876be5
JH
8759 if (is_utf8 != has_utf8) {
8760 if (is_utf8) {
8761 if (SvCUR(sv))
8762 sv_utf8_upgrade(sv);
8763 }
8764 else {
53c1dcc0 8765 SV * const nsv = sv_2mortal(newSVpvn(eptr, elen));
d2876be5 8766 sv_utf8_upgrade(nsv);
93524f2b 8767 eptr = SvPVX_const(nsv);
d2876be5
JH
8768 elen = SvCUR(nsv);
8769 }
8770 SvGROW(sv, SvCUR(sv) + elen + 1);
8771 p = SvEND(sv);
8772 *p = '\0';
8773 }
6af65485 8774
46fc3d4c 8775 need = (have > width ? have : width);
8776 gap = need - have;
8777
d2641cbd
PC
8778 if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
8779 Perl_croak_nocontext(PL_memory_wrap);
b22c7a20 8780 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 8781 p = SvEND(sv);
8782 if (esignlen && fill == '0') {
53c1dcc0 8783 int i;
eb160463 8784 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 8785 *p++ = esignbuf[i];
8786 }
8787 if (gap && !left) {
8788 memset(p, fill, gap);
8789 p += gap;
8790 }
8791 if (esignlen && fill != '0') {
53c1dcc0 8792 int i;
eb160463 8793 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 8794 *p++ = esignbuf[i];
8795 }
fc36a67e 8796 if (zeros) {
53c1dcc0 8797 int i;
fc36a67e 8798 for (i = zeros; i; i--)
8799 *p++ = '0';
8800 }
46fc3d4c 8801 if (elen) {
4459522c 8802 Copy(eptr, p, elen, char);
46fc3d4c 8803 p += elen;
8804 }
8805 if (gap && left) {
8806 memset(p, ' ', gap);
8807 p += gap;
8808 }
b22c7a20
GS
8809 if (vectorize) {
8810 if (veclen) {
4459522c 8811 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
8812 p += dotstrlen;
8813 }
8814 else
8815 vectorize = FALSE; /* done iterating over vecstr */
8816 }
2cf2cfc6
A
8817 if (is_utf8)
8818 has_utf8 = TRUE;
8819 if (has_utf8)
7e2040f0 8820 SvUTF8_on(sv);
46fc3d4c 8821 *p = '\0';
3f7c398e 8822 SvCUR_set(sv, p - SvPVX_const(sv));
b22c7a20
GS
8823 if (vectorize) {
8824 esignlen = 0;
8825 goto vector;
8826 }
46fc3d4c 8827 }
8828}
51371543 8829
645c22ef
DM
8830/* =========================================================================
8831
8832=head1 Cloning an interpreter
8833
8834All the macros and functions in this section are for the private use of
8835the main function, perl_clone().
8836
8837The foo_dup() functions make an exact copy of an existing foo thinngy.
8838During the course of a cloning, a hash table is used to map old addresses
8839to new addresses. The table is created and manipulated with the
8840ptr_table_* functions.
8841
8842=cut
8843
8844============================================================================*/
8845
8846
1d7c1841
GS
8847#if defined(USE_ITHREADS)
8848
1d7c1841
GS
8849#ifndef GpREFCNT_inc
8850# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
8851#endif
8852
8853
d2d73c3e
AB
8854#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
8855#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
8856#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8857#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
8858#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8859#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
8860#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8861#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
8862#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
8863#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
8864#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
8865#define SAVEPV(p) (p ? savepv(p) : Nullch)
8866#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 8867
d2d73c3e 8868
d2f185dc
AMS
8869/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
8870 regcomp.c. AMS 20010712 */
645c22ef 8871
1d7c1841 8872REGEXP *
53c1dcc0 8873Perl_re_dup(pTHX_ const REGEXP *r, CLONE_PARAMS *param)
1d7c1841 8874{
27da23d5 8875 dVAR;
d2f185dc
AMS
8876 REGEXP *ret;
8877 int i, len, npar;
8878 struct reg_substr_datum *s;
8879
8880 if (!r)
8881 return (REGEXP *)NULL;
8882
8883 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
8884 return ret;
8885
8886 len = r->offsets[0];
8887 npar = r->nparens+1;
8888
a02a5408 8889 Newxc(ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
d2f185dc
AMS
8890 Copy(r->program, ret->program, len+1, regnode);
8891
a02a5408 8892 Newx(ret->startp, npar, I32);
d2f185dc 8893 Copy(r->startp, ret->startp, npar, I32);
a02a5408 8894 Newx(ret->endp, npar, I32);
d2f185dc
AMS
8895 Copy(r->startp, ret->startp, npar, I32);
8896
a02a5408 8897 Newx(ret->substrs, 1, struct reg_substr_data);
d2f185dc
AMS
8898 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
8899 s->min_offset = r->substrs->data[i].min_offset;
8900 s->max_offset = r->substrs->data[i].max_offset;
8901 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 8902 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
8903 }
8904
70612e96 8905 ret->regstclass = NULL;
d2f185dc
AMS
8906 if (r->data) {
8907 struct reg_data *d;
e1ec3a88 8908 const int count = r->data->count;
53c1dcc0 8909 int i;
d2f185dc 8910
a02a5408 8911 Newxc(d, sizeof(struct reg_data) + count*sizeof(void *),
d2f185dc 8912 char, struct reg_data);
a02a5408 8913 Newx(d->what, count, U8);
d2f185dc
AMS
8914
8915 d->count = count;
8916 for (i = 0; i < count; i++) {
8917 d->what[i] = r->data->what[i];
8918 switch (d->what[i]) {
a3621e74
YO
8919 /* legal options are one of: sfpont
8920 see also regcomp.h and pregfree() */
d2f185dc
AMS
8921 case 's':
8922 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
8923 break;
8924 case 'p':
8925 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
8926 break;
8927 case 'f':
8928 /* This is cheating. */
a02a5408 8929 Newx(d->data[i], 1, struct regnode_charclass_class);
d2f185dc
AMS
8930 StructCopy(r->data->data[i], d->data[i],
8931 struct regnode_charclass_class);
70612e96 8932 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
8933 break;
8934 case 'o':
33773810
AMS
8935 /* Compiled op trees are readonly, and can thus be
8936 shared without duplication. */
b34c0dd4 8937 OP_REFCNT_LOCK;
9b978d73 8938 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
b34c0dd4 8939 OP_REFCNT_UNLOCK;
9b978d73 8940 break;
d2f185dc
AMS
8941 case 'n':
8942 d->data[i] = r->data->data[i];
8943 break;
a3621e74
YO
8944 case 't':
8945 d->data[i] = r->data->data[i];
8946 OP_REFCNT_LOCK;
8947 ((reg_trie_data*)d->data[i])->refcount++;
8948 OP_REFCNT_UNLOCK;
8949 break;
8950 default:
8951 Perl_croak(aTHX_ "panic: re_dup unknown data code '%c'", r->data->what[i]);
d2f185dc
AMS
8952 }
8953 }
8954
8955 ret->data = d;
8956 }
8957 else
8958 ret->data = NULL;
8959
a02a5408 8960 Newx(ret->offsets, 2*len+1, U32);
d2f185dc
AMS
8961 Copy(r->offsets, ret->offsets, 2*len+1, U32);
8962
e01c5899 8963 ret->precomp = SAVEPVN(r->precomp, r->prelen);
d2f185dc
AMS
8964 ret->refcnt = r->refcnt;
8965 ret->minlen = r->minlen;
8966 ret->prelen = r->prelen;
8967 ret->nparens = r->nparens;
8968 ret->lastparen = r->lastparen;
8969 ret->lastcloseparen = r->lastcloseparen;
8970 ret->reganch = r->reganch;
8971
70612e96
RG
8972 ret->sublen = r->sublen;
8973
8974 if (RX_MATCH_COPIED(ret))
e01c5899 8975 ret->subbeg = SAVEPVN(r->subbeg, r->sublen);
70612e96
RG
8976 else
8977 ret->subbeg = Nullch;
f8c7b90f 8978#ifdef PERL_OLD_COPY_ON_WRITE
9a26048b
NC
8979 ret->saved_copy = Nullsv;
8980#endif
70612e96 8981
d2f185dc
AMS
8982 ptr_table_store(PL_ptr_table, r, ret);
8983 return ret;
1d7c1841
GS
8984}
8985
d2d73c3e 8986/* duplicate a file handle */
645c22ef 8987
1d7c1841 8988PerlIO *
a8fc9800 8989Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
8990{
8991 PerlIO *ret;
53c1dcc0
AL
8992
8993 PERL_UNUSED_ARG(type);
73d840c0 8994
1d7c1841
GS
8995 if (!fp)
8996 return (PerlIO*)NULL;
8997
8998 /* look for it in the table first */
8999 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
9000 if (ret)
9001 return ret;
9002
9003 /* create anew and remember what it is */
ecdeb87c 9004 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
9005 ptr_table_store(PL_ptr_table, fp, ret);
9006 return ret;
9007}
9008
645c22ef
DM
9009/* duplicate a directory handle */
9010
1d7c1841
GS
9011DIR *
9012Perl_dirp_dup(pTHX_ DIR *dp)
9013{
9014 if (!dp)
9015 return (DIR*)NULL;
9016 /* XXX TODO */
9017 return dp;
9018}
9019
ff276b08 9020/* duplicate a typeglob */
645c22ef 9021
1d7c1841 9022GP *
a8fc9800 9023Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
9024{
9025 GP *ret;
9026 if (!gp)
9027 return (GP*)NULL;
9028 /* look for it in the table first */
9029 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
9030 if (ret)
9031 return ret;
9032
9033 /* create anew and remember what it is */
a02a5408 9034 Newxz(ret, 1, GP);
1d7c1841
GS
9035 ptr_table_store(PL_ptr_table, gp, ret);
9036
9037 /* clone */
9038 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
9039 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
9040 ret->gp_io = io_dup_inc(gp->gp_io, param);
9041 ret->gp_form = cv_dup_inc(gp->gp_form, param);
9042 ret->gp_av = av_dup_inc(gp->gp_av, param);
9043 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
9044 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
9045 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841 9046 ret->gp_cvgen = gp->gp_cvgen;
1d7c1841
GS
9047 ret->gp_line = gp->gp_line;
9048 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
9049 return ret;
9050}
9051
645c22ef
DM
9052/* duplicate a chain of magic */
9053
1d7c1841 9054MAGIC *
a8fc9800 9055Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 9056{
cb359b41
JH
9057 MAGIC *mgprev = (MAGIC*)NULL;
9058 MAGIC *mgret;
1d7c1841
GS
9059 if (!mg)
9060 return (MAGIC*)NULL;
9061 /* look for it in the table first */
9062 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
9063 if (mgret)
9064 return mgret;
9065
9066 for (; mg; mg = mg->mg_moremagic) {
9067 MAGIC *nmg;
a02a5408 9068 Newxz(nmg, 1, MAGIC);
cb359b41 9069 if (mgprev)
1d7c1841 9070 mgprev->mg_moremagic = nmg;
cb359b41
JH
9071 else
9072 mgret = nmg;
1d7c1841
GS
9073 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
9074 nmg->mg_private = mg->mg_private;
9075 nmg->mg_type = mg->mg_type;
9076 nmg->mg_flags = mg->mg_flags;
14befaf4 9077 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 9078 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 9079 }
05bd4103 9080 else if(mg->mg_type == PERL_MAGIC_backref) {
d7cbc7b5
NC
9081 /* The backref AV has its reference count deliberately bumped by
9082 1. */
9083 nmg->mg_obj = SvREFCNT_inc(av_dup_inc((AV*) mg->mg_obj, param));
05bd4103 9084 }
8d2f4536
NC
9085 else if (mg->mg_type == PERL_MAGIC_symtab) {
9086 nmg->mg_obj = mg->mg_obj;
9087 }
1d7c1841
GS
9088 else {
9089 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
9090 ? sv_dup_inc(mg->mg_obj, param)
9091 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
9092 }
9093 nmg->mg_len = mg->mg_len;
9094 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 9095 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 9096 if (mg->mg_len > 0) {
1d7c1841 9097 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
9098 if (mg->mg_type == PERL_MAGIC_overload_table &&
9099 AMT_AMAGIC((AMT*)mg->mg_ptr))
9100 {
c445ea15 9101 const AMT * const amtp = (AMT*)mg->mg_ptr;
0bcc34c2 9102 AMT * const namtp = (AMT*)nmg->mg_ptr;
1d7c1841
GS
9103 I32 i;
9104 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 9105 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
9106 }
9107 }
9108 }
9109 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 9110 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 9111 }
68795e93
NIS
9112 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
9113 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
9114 }
1d7c1841
GS
9115 mgprev = nmg;
9116 }
9117 return mgret;
9118}
9119
645c22ef
DM
9120/* create a new pointer-mapping table */
9121
1d7c1841
GS
9122PTR_TBL_t *
9123Perl_ptr_table_new(pTHX)
9124{
9125 PTR_TBL_t *tbl;
a02a5408 9126 Newxz(tbl, 1, PTR_TBL_t);
1d7c1841
GS
9127 tbl->tbl_max = 511;
9128 tbl->tbl_items = 0;
a02a5408 9129 Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
1d7c1841
GS
9130 return tbl;
9131}
9132
7119fd33
NC
9133#define PTR_TABLE_HASH(ptr) \
9134 ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
134ca3d6 9135
93e68bfb
JC
9136/*
9137 we use the PTE_SVSLOT 'reservation' made above, both here (in the
9138 following define) and at call to new_body_inline made below in
9139 Perl_ptr_table_store()
9140 */
9141
9142#define del_pte(p) del_body_type(p, PTE_SVSLOT)
32e691d0 9143
645c22ef
DM
9144/* map an existing pointer using a table */
9145
7bf61b54 9146STATIC PTR_TBL_ENT_t *
e4cd1874 9147S_ptr_table_find(pTHX_ PTR_TBL_t *tbl, const void *sv) {
1d7c1841 9148 PTR_TBL_ENT_t *tblent;
4373e329 9149 const UV hash = PTR_TABLE_HASH(sv);
1d7c1841
GS
9150 assert(tbl);
9151 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
9152 for (; tblent; tblent = tblent->next) {
9153 if (tblent->oldval == sv)
7bf61b54 9154 return tblent;
1d7c1841 9155 }
7bf61b54
NC
9156 return 0;
9157}
9158
9159void *
9160Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, const void *sv)
9161{
e4cd1874 9162 PTR_TBL_ENT_t const *const tblent = S_ptr_table_find(aTHX_ tbl, sv);
7bf61b54 9163 return tblent ? tblent->newval : (void *) 0;
1d7c1841
GS
9164}
9165
645c22ef
DM
9166/* add a new entry to a pointer-mapping table */
9167
1d7c1841 9168void
44f8325f 9169Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, const void *oldsv, void *newsv)
1d7c1841 9170{
e4cd1874 9171 PTR_TBL_ENT_t *tblent = S_ptr_table_find(aTHX_ tbl, oldsv);
1d7c1841 9172
7bf61b54
NC
9173 if (tblent) {
9174 tblent->newval = newsv;
9175 } else {
9176 const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
9177
9178 new_body_inline(tblent, sizeof(struct ptr_tbl_ent), PTE_SVSLOT);
9179 tblent->oldval = oldsv;
9180 tblent->newval = newsv;
9181 tblent->next = tbl->tbl_ary[entry];
9182 tbl->tbl_ary[entry] = tblent;
9183 tbl->tbl_items++;
9184 if (tblent->next && tbl->tbl_items > tbl->tbl_max)
9185 ptr_table_split(tbl);
1d7c1841 9186 }
1d7c1841
GS
9187}
9188
645c22ef
DM
9189/* double the hash bucket size of an existing ptr table */
9190
1d7c1841
GS
9191void
9192Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
9193{
9194 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
4373e329 9195 const UV oldsize = tbl->tbl_max + 1;
1d7c1841
GS
9196 UV newsize = oldsize * 2;
9197 UV i;
9198
9199 Renew(ary, newsize, PTR_TBL_ENT_t*);
9200 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
9201 tbl->tbl_max = --newsize;
9202 tbl->tbl_ary = ary;
9203 for (i=0; i < oldsize; i++, ary++) {
9204 PTR_TBL_ENT_t **curentp, **entp, *ent;
9205 if (!*ary)
9206 continue;
9207 curentp = ary + oldsize;
9208 for (entp = ary, ent = *ary; ent; ent = *entp) {
134ca3d6 9209 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
9210 *entp = ent->next;
9211 ent->next = *curentp;
9212 *curentp = ent;
9213 continue;
9214 }
9215 else
9216 entp = &ent->next;
9217 }
9218 }
9219}
9220
645c22ef
DM
9221/* remove all the entries from a ptr table */
9222
a0739874
DM
9223void
9224Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
9225{
d5cefff9 9226 if (tbl && tbl->tbl_items) {
c445ea15 9227 register PTR_TBL_ENT_t * const * const array = tbl->tbl_ary;
d5cefff9 9228 UV riter = tbl->tbl_max;
a0739874 9229
d5cefff9
NC
9230 do {
9231 PTR_TBL_ENT_t *entry = array[riter];
ab1e7f95 9232
d5cefff9 9233 while (entry) {
00b6aa41 9234 PTR_TBL_ENT_t * const oentry = entry;
d5cefff9
NC
9235 entry = entry->next;
9236 del_pte(oentry);
9237 }
9238 } while (riter--);
a0739874 9239
d5cefff9
NC
9240 tbl->tbl_items = 0;
9241 }
a0739874
DM
9242}
9243
645c22ef
DM
9244/* clear and free a ptr table */
9245
a0739874
DM
9246void
9247Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
9248{
9249 if (!tbl) {
9250 return;
9251 }
9252 ptr_table_clear(tbl);
9253 Safefree(tbl->tbl_ary);
9254 Safefree(tbl);
9255}
9256
5bd07a3d 9257
83841fad 9258void
eb86f8b3 9259Perl_rvpv_dup(pTHX_ SV *dstr, const SV *sstr, CLONE_PARAMS* param)
83841fad
NIS
9260{
9261 if (SvROK(sstr)) {
b162af07
SP
9262 SvRV_set(dstr, SvWEAKREF(sstr)
9263 ? sv_dup(SvRV(sstr), param)
9264 : sv_dup_inc(SvRV(sstr), param));
f880fe2f 9265
83841fad 9266 }
3f7c398e 9267 else if (SvPVX_const(sstr)) {
83841fad
NIS
9268 /* Has something there */
9269 if (SvLEN(sstr)) {
68795e93 9270 /* Normal PV - clone whole allocated space */
3f7c398e 9271 SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
d3d0e6f1
NC
9272 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
9273 /* Not that normal - actually sstr is copy on write.
9274 But we are a true, independant SV, so: */
9275 SvREADONLY_off(dstr);
9276 SvFAKE_off(dstr);
9277 }
68795e93 9278 }
83841fad
NIS
9279 else {
9280 /* Special case - not normally malloced for some reason */
ef10be65
NC
9281 if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
9282 /* A "shared" PV - clone it as "shared" PV */
9283 SvPV_set(dstr,
9284 HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
9285 param)));
83841fad
NIS
9286 }
9287 else {
9288 /* Some other special case - random pointer */
f880fe2f 9289 SvPV_set(dstr, SvPVX(sstr));
d3d0e6f1 9290 }
83841fad
NIS
9291 }
9292 }
9293 else {
9294 /* Copy the Null */
f880fe2f 9295 if (SvTYPE(dstr) == SVt_RV)
b162af07 9296 SvRV_set(dstr, NULL);
f880fe2f
SP
9297 else
9298 SvPV_set(dstr, 0);
83841fad
NIS
9299 }
9300}
9301
662fb8b2
NC
9302/* duplicate an SV of any type (including AV, HV etc) */
9303
1d7c1841 9304SV *
eb86f8b3 9305Perl_sv_dup(pTHX_ const SV *sstr, CLONE_PARAMS* param)
1d7c1841 9306{
27da23d5 9307 dVAR;
1d7c1841
GS
9308 SV *dstr;
9309
9310 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
9311 return Nullsv;
9312 /* look for it in the table first */
9313 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
9314 if (dstr)
9315 return dstr;
9316
0405e91e
AB
9317 if(param->flags & CLONEf_JOIN_IN) {
9318 /** We are joining here so we don't want do clone
9319 something that is bad **/
eb86f8b3
AL
9320 if (SvTYPE(sstr) == SVt_PVHV) {
9321 const char * const hvname = HvNAME_get(sstr);
9322 if (hvname)
9323 /** don't clone stashes if they already exist **/
9324 return (SV*)gv_stashpv(hvname,0);
0405e91e
AB
9325 }
9326 }
9327
1d7c1841
GS
9328 /* create anew and remember what it is */
9329 new_SV(dstr);
fd0854ff
DM
9330
9331#ifdef DEBUG_LEAKING_SCALARS
9332 dstr->sv_debug_optype = sstr->sv_debug_optype;
9333 dstr->sv_debug_line = sstr->sv_debug_line;
9334 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
9335 dstr->sv_debug_cloned = 1;
fd0854ff 9336 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
fd0854ff
DM
9337#endif
9338
1d7c1841
GS
9339 ptr_table_store(PL_ptr_table, sstr, dstr);
9340
9341 /* clone */
9342 SvFLAGS(dstr) = SvFLAGS(sstr);
9343 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
9344 SvREFCNT(dstr) = 0; /* must be before any other dups! */
9345
9346#ifdef DEBUGGING
3f7c398e 9347 if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
1d7c1841 9348 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
3f7c398e 9349 PL_watch_pvx, SvPVX_const(sstr));
1d7c1841
GS
9350#endif
9351
9660f481
DM
9352 /* don't clone objects whose class has asked us not to */
9353 if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
9354 SvFLAGS(dstr) &= ~SVTYPEMASK;
9355 SvOBJECT_off(dstr);
9356 return dstr;
9357 }
9358
1d7c1841
GS
9359 switch (SvTYPE(sstr)) {
9360 case SVt_NULL:
9361 SvANY(dstr) = NULL;
9362 break;
9363 case SVt_IV:
339049b0 9364 SvANY(dstr) = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
45977657 9365 SvIV_set(dstr, SvIVX(sstr));
1d7c1841
GS
9366 break;
9367 case SVt_NV:
9368 SvANY(dstr) = new_XNV();
9d6ce603 9369 SvNV_set(dstr, SvNVX(sstr));
1d7c1841
GS
9370 break;
9371 case SVt_RV:
339049b0 9372 SvANY(dstr) = &(dstr->sv_u.svu_rv);
83841fad 9373 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841 9374 break;
662fb8b2
NC
9375 default:
9376 {
9377 /* These are all the types that need complex bodies allocating. */
662fb8b2 9378 void *new_body;
2bcc16b3
NC
9379 const svtype sv_type = SvTYPE(sstr);
9380 const struct body_details *const sv_type_details
9381 = bodies_by_type + sv_type;
662fb8b2 9382
93e68bfb 9383 switch (sv_type) {
662fb8b2
NC
9384 default:
9385 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]",
9386 (IV)SvTYPE(sstr));
9387 break;
9388
662fb8b2
NC
9389 case SVt_PVGV:
9390 if (GvUNIQUE((GV*)sstr)) {
93e68bfb 9391 /* Do sharing here, and fall through */
662fb8b2 9392 }
c22188b4
NC
9393 case SVt_PVIO:
9394 case SVt_PVFM:
9395 case SVt_PVHV:
9396 case SVt_PVAV:
93e68bfb 9397 case SVt_PVBM:
662fb8b2 9398 case SVt_PVCV:
662fb8b2 9399 case SVt_PVLV:
662fb8b2 9400 case SVt_PVMG:
662fb8b2 9401 case SVt_PVNV:
662fb8b2 9402 case SVt_PVIV:
662fb8b2 9403 case SVt_PV:
3043b442 9404 assert(sv_type_details->size);
c22188b4 9405 if (sv_type_details->arena) {
3043b442 9406 new_body_inline(new_body, sv_type_details->size, sv_type);
c22188b4 9407 new_body
b9502f15 9408 = (void*)((char*)new_body - sv_type_details->offset);
c22188b4
NC
9409 } else {
9410 new_body = new_NOARENA(sv_type_details);
9411 }
1d7c1841 9412 }
662fb8b2
NC
9413 assert(new_body);
9414 SvANY(dstr) = new_body;
9415
2bcc16b3 9416#ifndef PURIFY
b9502f15
NC
9417 Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
9418 ((char*)SvANY(dstr)) + sv_type_details->offset,
f32993d6 9419 sv_type_details->copy, char);
2bcc16b3
NC
9420#else
9421 Copy(((char*)SvANY(sstr)),
9422 ((char*)SvANY(dstr)),
b9502f15 9423 sv_type_details->size + sv_type_details->offset, char);
2bcc16b3 9424#endif
662fb8b2 9425
f32993d6 9426 if (sv_type != SVt_PVAV && sv_type != SVt_PVHV)
662fb8b2
NC
9427 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9428
9429 /* The Copy above means that all the source (unduplicated) pointers
9430 are now in the destination. We can check the flags and the
9431 pointers in either, but it's possible that there's less cache
9432 missing by always going for the destination.
9433 FIXME - instrument and check that assumption */
f32993d6 9434 if (sv_type >= SVt_PVMG) {
662fb8b2
NC
9435 if (SvMAGIC(dstr))
9436 SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
9437 if (SvSTASH(dstr))
9438 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
1d7c1841 9439 }
662fb8b2 9440
f32993d6
NC
9441 /* The cast silences a GCC warning about unhandled types. */
9442 switch ((int)sv_type) {
662fb8b2
NC
9443 case SVt_PV:
9444 break;
9445 case SVt_PVIV:
9446 break;
9447 case SVt_PVNV:
9448 break;
9449 case SVt_PVMG:
9450 break;
9451 case SVt_PVBM:
9452 break;
9453 case SVt_PVLV:
9454 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
9455 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
9456 LvTARG(dstr) = dstr;
9457 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
9458 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(dstr), 0, param);
9459 else
9460 LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
9461 break;
9462 case SVt_PVGV:
9463 GvNAME(dstr) = SAVEPVN(GvNAME(dstr), GvNAMELEN(dstr));
e15faf7d
NC
9464 GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
9465 /* Don't call sv_add_backref here as it's going to be created
9466 as part of the magic cloning of the symbol table. */
662fb8b2
NC
9467 GvGP(dstr) = gp_dup(GvGP(dstr), param);
9468 (void)GpREFCNT_inc(GvGP(dstr));
9469 break;
9470 case SVt_PVIO:
9471 IoIFP(dstr) = fp_dup(IoIFP(dstr), IoTYPE(dstr), param);
9472 if (IoOFP(dstr) == IoIFP(sstr))
9473 IoOFP(dstr) = IoIFP(dstr);
9474 else
9475 IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
9476 /* PL_rsfp_filters entries have fake IoDIRP() */
9477 if (IoDIRP(dstr) && !(IoFLAGS(dstr) & IOf_FAKE_DIRP))
9478 IoDIRP(dstr) = dirp_dup(IoDIRP(dstr));
9479 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
9480 /* I have no idea why fake dirp (rsfps)
9481 should be treated differently but otherwise
9482 we end up with leaks -- sky*/
9483 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(dstr), param);
9484 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(dstr), param);
9485 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(dstr), param);
9486 } else {
9487 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(dstr), param);
9488 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(dstr), param);
9489 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(dstr), param);
9490 }
9491 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(dstr));
9492 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(dstr));
9493 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(dstr));
9494 break;
9495 case SVt_PVAV:
9496 if (AvARRAY((AV*)sstr)) {
9497 SV **dst_ary, **src_ary;
9498 SSize_t items = AvFILLp((AV*)sstr) + 1;
9499
9500 src_ary = AvARRAY((AV*)sstr);
a02a5408 9501 Newxz(dst_ary, AvMAX((AV*)sstr)+1, SV*);
662fb8b2
NC
9502 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
9503 SvPV_set(dstr, (char*)dst_ary);
9504 AvALLOC((AV*)dstr) = dst_ary;
9505 if (AvREAL((AV*)sstr)) {
9506 while (items-- > 0)
9507 *dst_ary++ = sv_dup_inc(*src_ary++, param);
9508 }
9509 else {
9510 while (items-- > 0)
9511 *dst_ary++ = sv_dup(*src_ary++, param);
9512 }
9513 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
9514 while (items-- > 0) {
9515 *dst_ary++ = &PL_sv_undef;
9516 }
bfcb3514 9517 }
662fb8b2
NC
9518 else {
9519 SvPV_set(dstr, Nullch);
9520 AvALLOC((AV*)dstr) = (SV**)NULL;
b79f7545 9521 }
662fb8b2
NC
9522 break;
9523 case SVt_PVHV:
9524 {
cbbf8932 9525 HEK *hvname = NULL;
662fb8b2
NC
9526
9527 if (HvARRAY((HV*)sstr)) {
9528 STRLEN i = 0;
9529 const bool sharekeys = !!HvSHAREKEYS(sstr);
9530 XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
9531 XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
9532 char *darray;
a02a5408 9533 Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
662fb8b2
NC
9534 + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
9535 char);
9536 HvARRAY(dstr) = (HE**)darray;
9537 while (i <= sxhv->xhv_max) {
5c4138a0 9538 const HE *source = HvARRAY(sstr)[i];
662fb8b2
NC
9539 HvARRAY(dstr)[i] = source
9540 ? he_dup(source, sharekeys, param) : 0;
9541 ++i;
9542 }
9543 if (SvOOK(sstr)) {
00b6aa41
AL
9544 struct xpvhv_aux * const saux = HvAUX(sstr);
9545 struct xpvhv_aux * const daux = HvAUX(dstr);
662fb8b2
NC
9546 /* This flag isn't copied. */
9547 /* SvOOK_on(hv) attacks the IV flags. */
9548 SvFLAGS(dstr) |= SVf_OOK;
9549
9550 hvname = saux->xhv_name;
dd690478
NC
9551 daux->xhv_name
9552 = hvname ? hek_dup(hvname, param) : hvname;
662fb8b2
NC
9553
9554 daux->xhv_riter = saux->xhv_riter;
9555 daux->xhv_eiter = saux->xhv_eiter
dd690478
NC
9556 ? he_dup(saux->xhv_eiter,
9557 (bool)!!HvSHAREKEYS(sstr), param) : 0;
86f55936
NC
9558 daux->xhv_backreferences = saux->xhv_backreferences
9559 ? (AV*) SvREFCNT_inc(
9560 sv_dup((SV*)saux->
9561 xhv_backreferences,
9562 param))
9563 : 0;
662fb8b2
NC
9564 }
9565 }
9566 else {
9567 SvPV_set(dstr, Nullch);
9568 }
9569 /* Record stashes for possible cloning in Perl_clone(). */
9570 if(hvname)
9571 av_push(param->stashes, dstr);
9572 }
9573 break;
9574 case SVt_PVFM:
9575 case SVt_PVCV:
9576 /* NOTE: not refcounted */
9577 CvSTASH(dstr) = hv_dup(CvSTASH(dstr), param);
9578 OP_REFCNT_LOCK;
9579 CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
9580 OP_REFCNT_UNLOCK;
9581 if (CvCONST(dstr)) {
9582 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(dstr)) ?
9583 SvREFCNT_inc(CvXSUBANY(dstr).any_ptr) :
9584 sv_dup_inc((SV *)CvXSUBANY(dstr).any_ptr, param);
9585 }
9586 /* don't dup if copying back - CvGV isn't refcounted, so the
9587 * duped GV may never be freed. A bit of a hack! DAPM */
9588 CvGV(dstr) = (param->flags & CLONEf_JOIN_IN) ?
9589 Nullgv : gv_dup(CvGV(dstr), param) ;
9590 if (!(param->flags & CLONEf_COPY_STACKS)) {
9591 CvDEPTH(dstr) = 0;
9592 }
9593 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
9594 CvOUTSIDE(dstr) =
9595 CvWEAKOUTSIDE(sstr)
9596 ? cv_dup( CvOUTSIDE(dstr), param)
9597 : cv_dup_inc(CvOUTSIDE(dstr), param);
9598 if (!CvXSUB(dstr))
9599 CvFILE(dstr) = SAVEPV(CvFILE(dstr));
9600 break;
bfcb3514 9601 }
1d7c1841 9602 }
1d7c1841
GS
9603 }
9604
9605 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
9606 ++PL_sv_objcount;
9607
9608 return dstr;
d2d73c3e 9609 }
1d7c1841 9610
645c22ef
DM
9611/* duplicate a context */
9612
1d7c1841 9613PERL_CONTEXT *
a8fc9800 9614Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
9615{
9616 PERL_CONTEXT *ncxs;
9617
9618 if (!cxs)
9619 return (PERL_CONTEXT*)NULL;
9620
9621 /* look for it in the table first */
9622 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
9623 if (ncxs)
9624 return ncxs;
9625
9626 /* create anew and remember what it is */
a02a5408 9627 Newxz(ncxs, max + 1, PERL_CONTEXT);
1d7c1841
GS
9628 ptr_table_store(PL_ptr_table, cxs, ncxs);
9629
9630 while (ix >= 0) {
c445ea15
AL
9631 PERL_CONTEXT * const cx = &cxs[ix];
9632 PERL_CONTEXT * const ncx = &ncxs[ix];
1d7c1841
GS
9633 ncx->cx_type = cx->cx_type;
9634 if (CxTYPE(cx) == CXt_SUBST) {
9635 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
9636 }
9637 else {
9638 ncx->blk_oldsp = cx->blk_oldsp;
9639 ncx->blk_oldcop = cx->blk_oldcop;
1d7c1841
GS
9640 ncx->blk_oldmarksp = cx->blk_oldmarksp;
9641 ncx->blk_oldscopesp = cx->blk_oldscopesp;
9642 ncx->blk_oldpm = cx->blk_oldpm;
9643 ncx->blk_gimme = cx->blk_gimme;
9644 switch (CxTYPE(cx)) {
9645 case CXt_SUB:
9646 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
9647 ? cv_dup_inc(cx->blk_sub.cv, param)
9648 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 9649 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 9650 ? av_dup_inc(cx->blk_sub.argarray, param)
7d49f689 9651 : NULL);
d2d73c3e 9652 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
9653 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
9654 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
9655 ncx->blk_sub.lval = cx->blk_sub.lval;
f39bc417 9656 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
9657 break;
9658 case CXt_EVAL:
9659 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
9660 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 9661 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 9662 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 9663 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
f39bc417 9664 ncx->blk_eval.retop = cx->blk_eval.retop;
1d7c1841
GS
9665 break;
9666 case CXt_LOOP:
9667 ncx->blk_loop.label = cx->blk_loop.label;
9668 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
9669 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
9670 ncx->blk_loop.next_op = cx->blk_loop.next_op;
9671 ncx->blk_loop.last_op = cx->blk_loop.last_op;
9672 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
9673 ? cx->blk_loop.iterdata
d2d73c3e 9674 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
9675 ncx->blk_loop.oldcomppad
9676 = (PAD*)ptr_table_fetch(PL_ptr_table,
9677 cx->blk_loop.oldcomppad);
d2d73c3e
AB
9678 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
9679 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
9680 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
9681 ncx->blk_loop.iterix = cx->blk_loop.iterix;
9682 ncx->blk_loop.itermax = cx->blk_loop.itermax;
9683 break;
9684 case CXt_FORMAT:
d2d73c3e
AB
9685 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
9686 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
9687 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841 9688 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
f39bc417 9689 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
9690 break;
9691 case CXt_BLOCK:
9692 case CXt_NULL:
9693 break;
9694 }
9695 }
9696 --ix;
9697 }
9698 return ncxs;
9699}
9700
645c22ef
DM
9701/* duplicate a stack info structure */
9702
1d7c1841 9703PERL_SI *
a8fc9800 9704Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
9705{
9706 PERL_SI *nsi;
9707
9708 if (!si)
9709 return (PERL_SI*)NULL;
9710
9711 /* look for it in the table first */
9712 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
9713 if (nsi)
9714 return nsi;
9715
9716 /* create anew and remember what it is */
a02a5408 9717 Newxz(nsi, 1, PERL_SI);
1d7c1841
GS
9718 ptr_table_store(PL_ptr_table, si, nsi);
9719
d2d73c3e 9720 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
9721 nsi->si_cxix = si->si_cxix;
9722 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 9723 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 9724 nsi->si_type = si->si_type;
d2d73c3e
AB
9725 nsi->si_prev = si_dup(si->si_prev, param);
9726 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
9727 nsi->si_markoff = si->si_markoff;
9728
9729 return nsi;
9730}
9731
9732#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
9733#define TOPINT(ss,ix) ((ss)[ix].any_i32)
9734#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
9735#define TOPLONG(ss,ix) ((ss)[ix].any_long)
9736#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
9737#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
9738#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
9739#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
9740#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
9741#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
9742#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
9743#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
9744#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
9745#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
9746
9747/* XXXXX todo */
9748#define pv_dup_inc(p) SAVEPV(p)
9749#define pv_dup(p) SAVEPV(p)
9750#define svp_dup_inc(p,pp) any_dup(p,pp)
9751
645c22ef
DM
9752/* map any object to the new equivent - either something in the
9753 * ptr table, or something in the interpreter structure
9754 */
9755
1d7c1841 9756void *
53c1dcc0 9757Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
1d7c1841
GS
9758{
9759 void *ret;
9760
9761 if (!v)
9762 return (void*)NULL;
9763
9764 /* look for it in the table first */
9765 ret = ptr_table_fetch(PL_ptr_table, v);
9766 if (ret)
9767 return ret;
9768
9769 /* see if it is part of the interpreter structure */
9770 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 9771 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 9772 else {
1d7c1841 9773 ret = v;
05ec9bb3 9774 }
1d7c1841
GS
9775
9776 return ret;
9777}
9778
645c22ef
DM
9779/* duplicate the save stack */
9780
1d7c1841 9781ANY *
a8fc9800 9782Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841 9783{
53c1dcc0
AL
9784 ANY * const ss = proto_perl->Tsavestack;
9785 const I32 max = proto_perl->Tsavestack_max;
9786 I32 ix = proto_perl->Tsavestack_ix;
1d7c1841
GS
9787 ANY *nss;
9788 SV *sv;
9789 GV *gv;
9790 AV *av;
9791 HV *hv;
9792 void* ptr;
9793 int intval;
9794 long longval;
9795 GP *gp;
9796 IV iv;
c4e33207 9797 char *c = NULL;
1d7c1841 9798 void (*dptr) (void*);
acfe0abc 9799 void (*dxptr) (pTHX_ void*);
1d7c1841 9800
a02a5408 9801 Newxz(nss, max, ANY);
1d7c1841
GS
9802
9803 while (ix > 0) {
b464bac0 9804 I32 i = POPINT(ss,ix);
1d7c1841
GS
9805 TOPINT(nss,ix) = i;
9806 switch (i) {
9807 case SAVEt_ITEM: /* normal string */
9808 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9809 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9810 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9811 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9812 break;
9813 case SAVEt_SV: /* scalar reference */
9814 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9815 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9816 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9817 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 9818 break;
f4dd75d9
GS
9819 case SAVEt_GENERIC_PVREF: /* generic char* */
9820 c = (char*)POPPTR(ss,ix);
9821 TOPPTR(nss,ix) = pv_dup(c);
9822 ptr = POPPTR(ss,ix);
9823 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9824 break;
05ec9bb3
NIS
9825 case SAVEt_SHARED_PVREF: /* char* in shared space */
9826 c = (char*)POPPTR(ss,ix);
9827 TOPPTR(nss,ix) = savesharedpv(c);
9828 ptr = POPPTR(ss,ix);
9829 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9830 break;
1d7c1841
GS
9831 case SAVEt_GENERIC_SVREF: /* generic sv */
9832 case SAVEt_SVREF: /* scalar reference */
9833 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9834 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9835 ptr = POPPTR(ss,ix);
9836 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
9837 break;
9838 case SAVEt_AV: /* array reference */
9839 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9840 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 9841 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9842 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9843 break;
9844 case SAVEt_HV: /* hash reference */
9845 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9846 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 9847 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9848 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9849 break;
9850 case SAVEt_INT: /* int reference */
9851 ptr = POPPTR(ss,ix);
9852 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9853 intval = (int)POPINT(ss,ix);
9854 TOPINT(nss,ix) = intval;
9855 break;
9856 case SAVEt_LONG: /* long reference */
9857 ptr = POPPTR(ss,ix);
9858 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9859 longval = (long)POPLONG(ss,ix);
9860 TOPLONG(nss,ix) = longval;
9861 break;
9862 case SAVEt_I32: /* I32 reference */
9863 case SAVEt_I16: /* I16 reference */
9864 case SAVEt_I8: /* I8 reference */
9865 ptr = POPPTR(ss,ix);
9866 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9867 i = POPINT(ss,ix);
9868 TOPINT(nss,ix) = i;
9869 break;
9870 case SAVEt_IV: /* IV reference */
9871 ptr = POPPTR(ss,ix);
9872 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9873 iv = POPIV(ss,ix);
9874 TOPIV(nss,ix) = iv;
9875 break;
9876 case SAVEt_SPTR: /* SV* reference */
9877 ptr = POPPTR(ss,ix);
9878 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9879 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9880 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
9881 break;
9882 case SAVEt_VPTR: /* random* reference */
9883 ptr = POPPTR(ss,ix);
9884 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9885 ptr = POPPTR(ss,ix);
9886 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9887 break;
9888 case SAVEt_PPTR: /* char* reference */
9889 ptr = POPPTR(ss,ix);
9890 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9891 c = (char*)POPPTR(ss,ix);
9892 TOPPTR(nss,ix) = pv_dup(c);
9893 break;
9894 case SAVEt_HPTR: /* HV* reference */
9895 ptr = POPPTR(ss,ix);
9896 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9897 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9898 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
9899 break;
9900 case SAVEt_APTR: /* AV* reference */
9901 ptr = POPPTR(ss,ix);
9902 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9903 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9904 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
9905 break;
9906 case SAVEt_NSTAB:
9907 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9908 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9909 break;
9910 case SAVEt_GP: /* scalar reference */
9911 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 9912 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
9913 (void)GpREFCNT_inc(gp);
9914 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 9915 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
9916 c = (char*)POPPTR(ss,ix);
9917 TOPPTR(nss,ix) = pv_dup(c);
9918 iv = POPIV(ss,ix);
9919 TOPIV(nss,ix) = iv;
9920 iv = POPIV(ss,ix);
9921 TOPIV(nss,ix) = iv;
9922 break;
9923 case SAVEt_FREESV:
26d9b02f 9924 case SAVEt_MORTALIZESV:
1d7c1841 9925 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9926 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9927 break;
9928 case SAVEt_FREEOP:
9929 ptr = POPPTR(ss,ix);
9930 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
9931 /* these are assumed to be refcounted properly */
53c1dcc0 9932 OP *o;
1d7c1841
GS
9933 switch (((OP*)ptr)->op_type) {
9934 case OP_LEAVESUB:
9935 case OP_LEAVESUBLV:
9936 case OP_LEAVEEVAL:
9937 case OP_LEAVE:
9938 case OP_SCOPE:
9939 case OP_LEAVEWRITE:
e977893f
GS
9940 TOPPTR(nss,ix) = ptr;
9941 o = (OP*)ptr;
9942 OpREFCNT_inc(o);
1d7c1841
GS
9943 break;
9944 default:
9945 TOPPTR(nss,ix) = Nullop;
9946 break;
9947 }
9948 }
9949 else
9950 TOPPTR(nss,ix) = Nullop;
9951 break;
9952 case SAVEt_FREEPV:
9953 c = (char*)POPPTR(ss,ix);
9954 TOPPTR(nss,ix) = pv_dup_inc(c);
9955 break;
9956 case SAVEt_CLEARSV:
9957 longval = POPLONG(ss,ix);
9958 TOPLONG(nss,ix) = longval;
9959 break;
9960 case SAVEt_DELETE:
9961 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9962 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
9963 c = (char*)POPPTR(ss,ix);
9964 TOPPTR(nss,ix) = pv_dup_inc(c);
9965 i = POPINT(ss,ix);
9966 TOPINT(nss,ix) = i;
9967 break;
9968 case SAVEt_DESTRUCTOR:
9969 ptr = POPPTR(ss,ix);
9970 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
9971 dptr = POPDPTR(ss,ix);
8141890a
JH
9972 TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
9973 any_dup(FPTR2DPTR(void *, dptr),
9974 proto_perl));
1d7c1841
GS
9975 break;
9976 case SAVEt_DESTRUCTOR_X:
9977 ptr = POPPTR(ss,ix);
9978 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
9979 dxptr = POPDXPTR(ss,ix);
8141890a
JH
9980 TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
9981 any_dup(FPTR2DPTR(void *, dxptr),
9982 proto_perl));
1d7c1841
GS
9983 break;
9984 case SAVEt_REGCONTEXT:
9985 case SAVEt_ALLOC:
9986 i = POPINT(ss,ix);
9987 TOPINT(nss,ix) = i;
9988 ix -= i;
9989 break;
9990 case SAVEt_STACK_POS: /* Position on Perl stack */
9991 i = POPINT(ss,ix);
9992 TOPINT(nss,ix) = i;
9993 break;
9994 case SAVEt_AELEM: /* array element */
9995 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9996 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9997 i = POPINT(ss,ix);
9998 TOPINT(nss,ix) = i;
9999 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10000 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
10001 break;
10002 case SAVEt_HELEM: /* hash element */
10003 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10004 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10005 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10006 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10007 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10008 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10009 break;
10010 case SAVEt_OP:
10011 ptr = POPPTR(ss,ix);
10012 TOPPTR(nss,ix) = ptr;
10013 break;
10014 case SAVEt_HINTS:
10015 i = POPINT(ss,ix);
10016 TOPINT(nss,ix) = i;
10017 break;
c4410b1b
GS
10018 case SAVEt_COMPPAD:
10019 av = (AV*)POPPTR(ss,ix);
58ed4fbe 10020 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 10021 break;
c3564e5c
GS
10022 case SAVEt_PADSV:
10023 longval = (long)POPLONG(ss,ix);
10024 TOPLONG(nss,ix) = longval;
10025 ptr = POPPTR(ss,ix);
10026 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10027 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10028 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 10029 break;
a1bb4754 10030 case SAVEt_BOOL:
38d8b13e 10031 ptr = POPPTR(ss,ix);
b9609c01 10032 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 10033 longval = (long)POPBOOL(ss,ix);
b9609c01 10034 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 10035 break;
8bd2680e
MHM
10036 case SAVEt_SET_SVFLAGS:
10037 i = POPINT(ss,ix);
10038 TOPINT(nss,ix) = i;
10039 i = POPINT(ss,ix);
10040 TOPINT(nss,ix) = i;
10041 sv = (SV*)POPPTR(ss,ix);
10042 TOPPTR(nss,ix) = sv_dup(sv, param);
10043 break;
1d7c1841
GS
10044 default:
10045 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
10046 }
10047 }
10048
bd81e77b
NC
10049 return nss;
10050}
10051
10052
10053/* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
10054 * flag to the result. This is done for each stash before cloning starts,
10055 * so we know which stashes want their objects cloned */
10056
10057static void
10058do_mark_cloneable_stash(pTHX_ SV *sv)
10059{
10060 const HEK * const hvname = HvNAME_HEK((HV*)sv);
10061 if (hvname) {
10062 GV* const cloner = gv_fetchmethod_autoload((HV*)sv, "CLONE_SKIP", 0);
10063 SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
10064 if (cloner && GvCV(cloner)) {
10065 dSP;
10066 UV status;
10067
10068 ENTER;
10069 SAVETMPS;
10070 PUSHMARK(SP);
10071 XPUSHs(sv_2mortal(newSVhek(hvname)));
10072 PUTBACK;
10073 call_sv((SV*)GvCV(cloner), G_SCALAR);
10074 SPAGAIN;
10075 status = POPu;
10076 PUTBACK;
10077 FREETMPS;
10078 LEAVE;
10079 if (status)
10080 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
10081 }
10082 }
10083}
10084
10085
10086
10087/*
10088=for apidoc perl_clone
10089
10090Create and return a new interpreter by cloning the current one.
10091
10092perl_clone takes these flags as parameters:
10093
10094CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
10095without it we only clone the data and zero the stacks,
10096with it we copy the stacks and the new perl interpreter is
10097ready to run at the exact same point as the previous one.
10098The pseudo-fork code uses COPY_STACKS while the
10099threads->new doesn't.
10100
10101CLONEf_KEEP_PTR_TABLE
10102perl_clone keeps a ptr_table with the pointer of the old
10103variable as a key and the new variable as a value,
10104this allows it to check if something has been cloned and not
10105clone it again but rather just use the value and increase the
10106refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
10107the ptr_table using the function
10108C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
10109reason to keep it around is if you want to dup some of your own
10110variable who are outside the graph perl scans, example of this
10111code is in threads.xs create
10112
10113CLONEf_CLONE_HOST
10114This is a win32 thing, it is ignored on unix, it tells perls
10115win32host code (which is c++) to clone itself, this is needed on
10116win32 if you want to run two threads at the same time,
10117if you just want to do some stuff in a separate perl interpreter
10118and then throw it away and return to the original one,
10119you don't need to do anything.
10120
10121=cut
10122*/
10123
10124/* XXX the above needs expanding by someone who actually understands it ! */
10125EXTERN_C PerlInterpreter *
10126perl_clone_host(PerlInterpreter* proto_perl, UV flags);
10127
10128PerlInterpreter *
10129perl_clone(PerlInterpreter *proto_perl, UV flags)
10130{
10131 dVAR;
10132#ifdef PERL_IMPLICIT_SYS
10133
10134 /* perlhost.h so we need to call into it
10135 to clone the host, CPerlHost should have a c interface, sky */
10136
10137 if (flags & CLONEf_CLONE_HOST) {
10138 return perl_clone_host(proto_perl,flags);
10139 }
10140 return perl_clone_using(proto_perl, flags,
10141 proto_perl->IMem,
10142 proto_perl->IMemShared,
10143 proto_perl->IMemParse,
10144 proto_perl->IEnv,
10145 proto_perl->IStdIO,
10146 proto_perl->ILIO,
10147 proto_perl->IDir,
10148 proto_perl->ISock,
10149 proto_perl->IProc);
10150}
10151
10152PerlInterpreter *
10153perl_clone_using(PerlInterpreter *proto_perl, UV flags,
10154 struct IPerlMem* ipM, struct IPerlMem* ipMS,
10155 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
10156 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
10157 struct IPerlDir* ipD, struct IPerlSock* ipS,
10158 struct IPerlProc* ipP)
10159{
10160 /* XXX many of the string copies here can be optimized if they're
10161 * constants; they need to be allocated as common memory and just
10162 * their pointers copied. */
10163
10164 IV i;
10165 CLONE_PARAMS clone_params;
10166 CLONE_PARAMS* param = &clone_params;
10167
10168 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
10169 /* for each stash, determine whether its objects should be cloned */
10170 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
10171 PERL_SET_THX(my_perl);
10172
10173# ifdef DEBUGGING
10174 Poison(my_perl, 1, PerlInterpreter);
10175 PL_op = Nullop;
10176 PL_curcop = (COP *)Nullop;
10177 PL_markstack = 0;
10178 PL_scopestack = 0;
10179 PL_savestack = 0;
10180 PL_savestack_ix = 0;
10181 PL_savestack_max = -1;
10182 PL_sig_pending = 0;
10183 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
10184# else /* !DEBUGGING */
10185 Zero(my_perl, 1, PerlInterpreter);
10186# endif /* DEBUGGING */
10187
10188 /* host pointers */
10189 PL_Mem = ipM;
10190 PL_MemShared = ipMS;
10191 PL_MemParse = ipMP;
10192 PL_Env = ipE;
10193 PL_StdIO = ipStd;
10194 PL_LIO = ipLIO;
10195 PL_Dir = ipD;
10196 PL_Sock = ipS;
10197 PL_Proc = ipP;
10198#else /* !PERL_IMPLICIT_SYS */
10199 IV i;
10200 CLONE_PARAMS clone_params;
10201 CLONE_PARAMS* param = &clone_params;
10202 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
10203 /* for each stash, determine whether its objects should be cloned */
10204 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
10205 PERL_SET_THX(my_perl);
10206
10207# ifdef DEBUGGING
10208 Poison(my_perl, 1, PerlInterpreter);
10209 PL_op = Nullop;
10210 PL_curcop = (COP *)Nullop;
10211 PL_markstack = 0;
10212 PL_scopestack = 0;
10213 PL_savestack = 0;
10214 PL_savestack_ix = 0;
10215 PL_savestack_max = -1;
10216 PL_sig_pending = 0;
10217 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
10218# else /* !DEBUGGING */
10219 Zero(my_perl, 1, PerlInterpreter);
10220# endif /* DEBUGGING */
10221#endif /* PERL_IMPLICIT_SYS */
10222 param->flags = flags;
10223 param->proto_perl = proto_perl;
10224
10225 Zero(&PL_body_arenaroots, 1, PL_body_arenaroots);
10226 Zero(&PL_body_roots, 1, PL_body_roots);
10227
10228 PL_nice_chunk = NULL;
10229 PL_nice_chunk_size = 0;
10230 PL_sv_count = 0;
10231 PL_sv_objcount = 0;
10232 PL_sv_root = Nullsv;
10233 PL_sv_arenaroot = Nullsv;
10234
10235 PL_debug = proto_perl->Idebug;
10236
10237 PL_hash_seed = proto_perl->Ihash_seed;
10238 PL_rehash_seed = proto_perl->Irehash_seed;
10239
10240#ifdef USE_REENTRANT_API
10241 /* XXX: things like -Dm will segfault here in perlio, but doing
10242 * PERL_SET_CONTEXT(proto_perl);
10243 * breaks too many other things
10244 */
10245 Perl_reentrant_init(aTHX);
10246#endif
10247
10248 /* create SV map for pointer relocation */
10249 PL_ptr_table = ptr_table_new();
10250
10251 /* initialize these special pointers as early as possible */
10252 SvANY(&PL_sv_undef) = NULL;
10253 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
10254 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
10255 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
10256
10257 SvANY(&PL_sv_no) = new_XPVNV();
10258 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
10259 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
10260 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
10261 SvPV_set(&PL_sv_no, SAVEPVN(PL_No, 0));
10262 SvCUR_set(&PL_sv_no, 0);
10263 SvLEN_set(&PL_sv_no, 1);
10264 SvIV_set(&PL_sv_no, 0);
10265 SvNV_set(&PL_sv_no, 0);
10266 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
10267
10268 SvANY(&PL_sv_yes) = new_XPVNV();
10269 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
10270 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
10271 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
10272 SvPV_set(&PL_sv_yes, SAVEPVN(PL_Yes, 1));
10273 SvCUR_set(&PL_sv_yes, 1);
10274 SvLEN_set(&PL_sv_yes, 2);
10275 SvIV_set(&PL_sv_yes, 1);
10276 SvNV_set(&PL_sv_yes, 1);
10277 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
10278
10279 /* create (a non-shared!) shared string table */
10280 PL_strtab = newHV();
10281 HvSHAREKEYS_off(PL_strtab);
10282 hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
10283 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
10284
10285 PL_compiling = proto_perl->Icompiling;
10286
10287 /* These two PVs will be free'd special way so must set them same way op.c does */
10288 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
10289 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
10290
10291 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
10292 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
10293
10294 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
10295 if (!specialWARN(PL_compiling.cop_warnings))
10296 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
10297 if (!specialCopIO(PL_compiling.cop_io))
10298 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
10299 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
10300
10301 /* pseudo environmental stuff */
10302 PL_origargc = proto_perl->Iorigargc;
10303 PL_origargv = proto_perl->Iorigargv;
10304
10305 param->stashes = newAV(); /* Setup array of objects to call clone on */
10306
10307 /* Set tainting stuff before PerlIO_debug can possibly get called */
10308 PL_tainting = proto_perl->Itainting;
10309 PL_taint_warn = proto_perl->Itaint_warn;
10310
10311#ifdef PERLIO_LAYERS
10312 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
10313 PerlIO_clone(aTHX_ proto_perl, param);
10314#endif
10315
10316 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
10317 PL_incgv = gv_dup(proto_perl->Iincgv, param);
10318 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
10319 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
10320 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
10321 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
10322
10323 /* switches */
10324 PL_minus_c = proto_perl->Iminus_c;
10325 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
10326 PL_localpatches = proto_perl->Ilocalpatches;
10327 PL_splitstr = proto_perl->Isplitstr;
10328 PL_preprocess = proto_perl->Ipreprocess;
10329 PL_minus_n = proto_perl->Iminus_n;
10330 PL_minus_p = proto_perl->Iminus_p;
10331 PL_minus_l = proto_perl->Iminus_l;
10332 PL_minus_a = proto_perl->Iminus_a;
bc9b29db 10333 PL_minus_E = proto_perl->Iminus_E;
bd81e77b
NC
10334 PL_minus_F = proto_perl->Iminus_F;
10335 PL_doswitches = proto_perl->Idoswitches;
10336 PL_dowarn = proto_perl->Idowarn;
10337 PL_doextract = proto_perl->Idoextract;
10338 PL_sawampersand = proto_perl->Isawampersand;
10339 PL_unsafe = proto_perl->Iunsafe;
10340 PL_inplace = SAVEPV(proto_perl->Iinplace);
10341 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
10342 PL_perldb = proto_perl->Iperldb;
10343 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
10344 PL_exit_flags = proto_perl->Iexit_flags;
10345
10346 /* magical thingies */
10347 /* XXX time(&PL_basetime) when asked for? */
10348 PL_basetime = proto_perl->Ibasetime;
10349 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
10350
10351 PL_maxsysfd = proto_perl->Imaxsysfd;
10352 PL_multiline = proto_perl->Imultiline;
10353 PL_statusvalue = proto_perl->Istatusvalue;
10354#ifdef VMS
10355 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
10356#else
10357 PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
10358#endif
10359 PL_encoding = sv_dup(proto_perl->Iencoding, param);
10360
10361 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
10362 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
10363 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
10364
10365 /* Clone the regex array */
10366 PL_regex_padav = newAV();
10367 {
10368 const I32 len = av_len((AV*)proto_perl->Iregex_padav);
7a5b473e 10369 SV* const * const regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
bd81e77b
NC
10370 IV i;
10371 av_push(PL_regex_padav,
10372 sv_dup_inc(regexen[0],param));
10373 for(i = 1; i <= len; i++) {
7a5b473e
AL
10374 const SV * const regex = regexen[i];
10375 SV * const sv =
10376 SvREPADTMP(regex)
10377 ? sv_dup_inc(regex, param)
10378 : SvREFCNT_inc(
10379 newSViv(PTR2IV(re_dup(
10380 INT2PTR(REGEXP *, SvIVX(regex)), param))))
10381 ;
10382 av_push(PL_regex_padav, sv);
bd81e77b
NC
10383 }
10384 }
10385 PL_regex_pad = AvARRAY(PL_regex_padav);
10386
10387 /* shortcuts to various I/O objects */
10388 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
10389 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
10390 PL_defgv = gv_dup(proto_perl->Idefgv, param);
10391 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
10392 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
10393 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841 10394
bd81e77b
NC
10395 /* shortcuts to regexp stuff */
10396 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
9660f481 10397
bd81e77b
NC
10398 /* shortcuts to misc objects */
10399 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
9660f481 10400
bd81e77b
NC
10401 /* shortcuts to debugging objects */
10402 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
10403 PL_DBline = gv_dup(proto_perl->IDBline, param);
10404 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
10405 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
10406 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
10407 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
10408 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
10409 PL_lineary = av_dup(proto_perl->Ilineary, param);
10410 PL_dbargs = av_dup(proto_perl->Idbargs, param);
9660f481 10411
bd81e77b
NC
10412 /* symbol tables */
10413 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
10414 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
10415 PL_debstash = hv_dup(proto_perl->Idebstash, param);
10416 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
10417 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
10418
10419 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
10420 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
10421 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
10422 PL_endav = av_dup_inc(proto_perl->Iendav, param);
10423 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
10424 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
10425
10426 PL_sub_generation = proto_perl->Isub_generation;
10427
10428 /* funky return mechanisms */
10429 PL_forkprocess = proto_perl->Iforkprocess;
10430
10431 /* subprocess state */
10432 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
10433
10434 /* internal state */
10435 PL_maxo = proto_perl->Imaxo;
10436 if (proto_perl->Iop_mask)
10437 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
10438 else
10439 PL_op_mask = Nullch;
10440 /* PL_asserting = proto_perl->Iasserting; */
10441
10442 /* current interpreter roots */
10443 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
10444 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
10445 PL_main_start = proto_perl->Imain_start;
10446 PL_eval_root = proto_perl->Ieval_root;
10447 PL_eval_start = proto_perl->Ieval_start;
10448
10449 /* runtime control stuff */
10450 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
10451 PL_copline = proto_perl->Icopline;
10452
10453 PL_filemode = proto_perl->Ifilemode;
10454 PL_lastfd = proto_perl->Ilastfd;
10455 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
10456 PL_Argv = NULL;
10457 PL_Cmd = Nullch;
10458 PL_gensym = proto_perl->Igensym;
10459 PL_preambled = proto_perl->Ipreambled;
10460 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
10461 PL_laststatval = proto_perl->Ilaststatval;
10462 PL_laststype = proto_perl->Ilaststype;
10463 PL_mess_sv = Nullsv;
10464
10465 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
10466
10467 /* interpreter atexit processing */
10468 PL_exitlistlen = proto_perl->Iexitlistlen;
10469 if (PL_exitlistlen) {
10470 Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
10471 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
9660f481 10472 }
bd81e77b
NC
10473 else
10474 PL_exitlist = (PerlExitListEntry*)NULL;
f16dd614
DM
10475
10476 PL_my_cxt_size = proto_perl->Imy_cxt_size;
4c901e72 10477 if (PL_my_cxt_size) {
f16dd614
DM
10478 Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
10479 Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
10480 }
10481 else
10482 PL_my_cxt_list = (void**)NULL;
bd81e77b
NC
10483 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
10484 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
10485 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
10486
10487 PL_profiledata = NULL;
10488 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
10489 /* PL_rsfp_filters entries have fake IoDIRP() */
10490 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
9660f481 10491
bd81e77b 10492 PL_compcv = cv_dup(proto_perl->Icompcv, param);
9660f481 10493
bd81e77b 10494 PAD_CLONE_VARS(proto_perl, param);
9660f481 10495
bd81e77b
NC
10496#ifdef HAVE_INTERP_INTERN
10497 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
10498#endif
645c22ef 10499
bd81e77b
NC
10500 /* more statics moved here */
10501 PL_generation = proto_perl->Igeneration;
10502 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
645c22ef 10503
bd81e77b
NC
10504 PL_in_clean_objs = proto_perl->Iin_clean_objs;
10505 PL_in_clean_all = proto_perl->Iin_clean_all;
6a78b4db 10506
bd81e77b
NC
10507 PL_uid = proto_perl->Iuid;
10508 PL_euid = proto_perl->Ieuid;
10509 PL_gid = proto_perl->Igid;
10510 PL_egid = proto_perl->Iegid;
10511 PL_nomemok = proto_perl->Inomemok;
10512 PL_an = proto_perl->Ian;
10513 PL_evalseq = proto_perl->Ievalseq;
10514 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
10515 PL_origalen = proto_perl->Iorigalen;
10516#ifdef PERL_USES_PL_PIDSTATUS
10517 PL_pidstatus = newHV(); /* XXX flag for cloning? */
10518#endif
10519 PL_osname = SAVEPV(proto_perl->Iosname);
10520 PL_sighandlerp = proto_perl->Isighandlerp;
6a78b4db 10521
bd81e77b 10522 PL_runops = proto_perl->Irunops;
6a78b4db 10523
bd81e77b 10524 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
6a78b4db 10525
bd81e77b
NC
10526#ifdef CSH
10527 PL_cshlen = proto_perl->Icshlen;
10528 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
10529#endif
645c22ef 10530
bd81e77b
NC
10531 PL_lex_state = proto_perl->Ilex_state;
10532 PL_lex_defer = proto_perl->Ilex_defer;
10533 PL_lex_expect = proto_perl->Ilex_expect;
10534 PL_lex_formbrack = proto_perl->Ilex_formbrack;
10535 PL_lex_dojoin = proto_perl->Ilex_dojoin;
10536 PL_lex_starts = proto_perl->Ilex_starts;
10537 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
10538 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
10539 PL_lex_op = proto_perl->Ilex_op;
10540 PL_lex_inpat = proto_perl->Ilex_inpat;
10541 PL_lex_inwhat = proto_perl->Ilex_inwhat;
10542 PL_lex_brackets = proto_perl->Ilex_brackets;
10543 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
10544 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
10545 PL_lex_casemods = proto_perl->Ilex_casemods;
10546 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
10547 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
645c22ef 10548
bd81e77b
NC
10549 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
10550 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
10551 PL_nexttoke = proto_perl->Inexttoke;
c43294b8 10552
bd81e77b
NC
10553 /* XXX This is probably masking the deeper issue of why
10554 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
10555 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
10556 * (A little debugging with a watchpoint on it may help.)
10557 */
10558 if (SvANY(proto_perl->Ilinestr)) {
10559 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
10560 i = proto_perl->Ibufptr - SvPVX_const(proto_perl->Ilinestr);
10561 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10562 i = proto_perl->Ioldbufptr - SvPVX_const(proto_perl->Ilinestr);
10563 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10564 i = proto_perl->Ioldoldbufptr - SvPVX_const(proto_perl->Ilinestr);
10565 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10566 i = proto_perl->Ilinestart - SvPVX_const(proto_perl->Ilinestr);
10567 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10568 }
10569 else {
10570 PL_linestr = NEWSV(65,79);
10571 sv_upgrade(PL_linestr,SVt_PVIV);
10572 sv_setpvn(PL_linestr,"",0);
10573 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
10574 }
10575 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
10576 PL_pending_ident = proto_perl->Ipending_ident;
10577 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
10578
10579 PL_expect = proto_perl->Iexpect;
10580
10581 PL_multi_start = proto_perl->Imulti_start;
10582 PL_multi_end = proto_perl->Imulti_end;
10583 PL_multi_open = proto_perl->Imulti_open;
10584 PL_multi_close = proto_perl->Imulti_close;
10585
10586 PL_error_count = proto_perl->Ierror_count;
10587 PL_subline = proto_perl->Isubline;
10588 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
c43294b8 10589
bd81e77b
NC
10590 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
10591 if (SvANY(proto_perl->Ilinestr)) {
10592 i = proto_perl->Ilast_uni - SvPVX_const(proto_perl->Ilinestr);
10593 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10594 i = proto_perl->Ilast_lop - SvPVX_const(proto_perl->Ilinestr);
10595 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10596 PL_last_lop_op = proto_perl->Ilast_lop_op;
10597 }
10598 else {
10599 PL_last_uni = SvPVX(PL_linestr);
10600 PL_last_lop = SvPVX(PL_linestr);
10601 PL_last_lop_op = 0;
10602 }
10603 PL_in_my = proto_perl->Iin_my;
10604 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
10605#ifdef FCRYPT
10606 PL_cryptseen = proto_perl->Icryptseen;
10607#endif
1d7c1841 10608
bd81e77b 10609 PL_hints = proto_perl->Ihints;
1d7c1841 10610
bd81e77b 10611 PL_amagic_generation = proto_perl->Iamagic_generation;
d2d73c3e 10612
bd81e77b
NC
10613#ifdef USE_LOCALE_COLLATE
10614 PL_collation_ix = proto_perl->Icollation_ix;
10615 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
10616 PL_collation_standard = proto_perl->Icollation_standard;
10617 PL_collxfrm_base = proto_perl->Icollxfrm_base;
10618 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
10619#endif /* USE_LOCALE_COLLATE */
1d7c1841 10620
bd81e77b
NC
10621#ifdef USE_LOCALE_NUMERIC
10622 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
10623 PL_numeric_standard = proto_perl->Inumeric_standard;
10624 PL_numeric_local = proto_perl->Inumeric_local;
10625 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
10626#endif /* !USE_LOCALE_NUMERIC */
1d7c1841 10627
bd81e77b
NC
10628 /* utf8 character classes */
10629 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
10630 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
10631 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
10632 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
10633 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
10634 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
10635 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
10636 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
10637 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
10638 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
10639 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
10640 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
10641 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
10642 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
10643 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
10644 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
10645 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
10646 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
10647 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
10648 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 10649
bd81e77b
NC
10650 /* Did the locale setup indicate UTF-8? */
10651 PL_utf8locale = proto_perl->Iutf8locale;
10652 /* Unicode features (see perlrun/-C) */
10653 PL_unicode = proto_perl->Iunicode;
1d7c1841 10654
bd81e77b
NC
10655 /* Pre-5.8 signals control */
10656 PL_signals = proto_perl->Isignals;
1d7c1841 10657
bd81e77b
NC
10658 /* times() ticks per second */
10659 PL_clocktick = proto_perl->Iclocktick;
1d7c1841 10660
bd81e77b
NC
10661 /* Recursion stopper for PerlIO_find_layer */
10662 PL_in_load_module = proto_perl->Iin_load_module;
8df990a8 10663
bd81e77b
NC
10664 /* sort() routine */
10665 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
e5dd39fc 10666
bd81e77b
NC
10667 /* Not really needed/useful since the reenrant_retint is "volatile",
10668 * but do it for consistency's sake. */
10669 PL_reentrant_retint = proto_perl->Ireentrant_retint;
1d7c1841 10670
bd81e77b
NC
10671 /* Hooks to shared SVs and locks. */
10672 PL_sharehook = proto_perl->Isharehook;
10673 PL_lockhook = proto_perl->Ilockhook;
10674 PL_unlockhook = proto_perl->Iunlockhook;
10675 PL_threadhook = proto_perl->Ithreadhook;
1d7c1841 10676
bd81e77b
NC
10677 PL_runops_std = proto_perl->Irunops_std;
10678 PL_runops_dbg = proto_perl->Irunops_dbg;
1d7c1841 10679
bd81e77b
NC
10680#ifdef THREADS_HAVE_PIDS
10681 PL_ppid = proto_perl->Ippid;
10682#endif
1d7c1841 10683
bd81e77b 10684 /* swatch cache */
5c284bb0 10685 PL_last_swash_hv = NULL; /* reinits on demand */
bd81e77b
NC
10686 PL_last_swash_klen = 0;
10687 PL_last_swash_key[0]= '\0';
10688 PL_last_swash_tmps = (U8*)NULL;
10689 PL_last_swash_slen = 0;
1d7c1841 10690
bd81e77b
NC
10691 PL_glob_index = proto_perl->Iglob_index;
10692 PL_srand_called = proto_perl->Isrand_called;
10693 PL_uudmap['M'] = 0; /* reinits on demand */
10694 PL_bitcount = Nullch; /* reinits on demand */
05ec9bb3 10695
bd81e77b
NC
10696 if (proto_perl->Ipsig_pend) {
10697 Newxz(PL_psig_pend, SIG_SIZE, int);
10698 }
10699 else {
10700 PL_psig_pend = (int*)NULL;
10701 }
05ec9bb3 10702
bd81e77b
NC
10703 if (proto_perl->Ipsig_ptr) {
10704 Newxz(PL_psig_ptr, SIG_SIZE, SV*);
10705 Newxz(PL_psig_name, SIG_SIZE, SV*);
10706 for (i = 1; i < SIG_SIZE; i++) {
10707 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
10708 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
10709 }
10710 }
10711 else {
10712 PL_psig_ptr = (SV**)NULL;
10713 PL_psig_name = (SV**)NULL;
10714 }
05ec9bb3 10715
bd81e77b 10716 /* thrdvar.h stuff */
1d7c1841 10717
bd81e77b
NC
10718 if (flags & CLONEf_COPY_STACKS) {
10719 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
10720 PL_tmps_ix = proto_perl->Ttmps_ix;
10721 PL_tmps_max = proto_perl->Ttmps_max;
10722 PL_tmps_floor = proto_perl->Ttmps_floor;
10723 Newxz(PL_tmps_stack, PL_tmps_max, SV*);
10724 i = 0;
10725 while (i <= PL_tmps_ix) {
10726 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
10727 ++i;
10728 }
d2d73c3e 10729
bd81e77b
NC
10730 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
10731 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
10732 Newxz(PL_markstack, i, I32);
10733 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
10734 - proto_perl->Tmarkstack);
10735 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
10736 - proto_perl->Tmarkstack);
10737 Copy(proto_perl->Tmarkstack, PL_markstack,
10738 PL_markstack_ptr - PL_markstack + 1, I32);
d2d73c3e 10739
bd81e77b
NC
10740 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
10741 * NOTE: unlike the others! */
10742 PL_scopestack_ix = proto_perl->Tscopestack_ix;
10743 PL_scopestack_max = proto_perl->Tscopestack_max;
10744 Newxz(PL_scopestack, PL_scopestack_max, I32);
10745 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
d419787a 10746
bd81e77b
NC
10747 /* NOTE: si_dup() looks at PL_markstack */
10748 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
d2d73c3e 10749
bd81e77b
NC
10750 /* PL_curstack = PL_curstackinfo->si_stack; */
10751 PL_curstack = av_dup(proto_perl->Tcurstack, param);
10752 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841 10753
bd81e77b
NC
10754 /* next PUSHs() etc. set *(PL_stack_sp+1) */
10755 PL_stack_base = AvARRAY(PL_curstack);
10756 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
10757 - proto_perl->Tstack_base);
10758 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
1d7c1841 10759
bd81e77b
NC
10760 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
10761 * NOTE: unlike the others! */
10762 PL_savestack_ix = proto_perl->Tsavestack_ix;
10763 PL_savestack_max = proto_perl->Tsavestack_max;
10764 /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
10765 PL_savestack = ss_dup(proto_perl, param);
10766 }
10767 else {
10768 init_stacks();
10769 ENTER; /* perl_destruct() wants to LEAVE; */
34394ecd
DM
10770
10771 /* although we're not duplicating the tmps stack, we should still
10772 * add entries for any SVs on the tmps stack that got cloned by a
10773 * non-refcount means (eg a temp in @_); otherwise they will be
10774 * orphaned
10775 */
10776 for (i = 0; i<= proto_perl->Ttmps_ix; i++) {
10777 SV *nsv = (SV*)ptr_table_fetch(PL_ptr_table,
10778 proto_perl->Ttmps_stack[i]);
10779 if (nsv && !SvREFCNT(nsv)) {
10780 EXTEND_MORTAL(1);
10781 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc(nsv);
10782 }
10783 }
bd81e77b 10784 }
1d7c1841 10785
bd81e77b
NC
10786 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
10787 PL_top_env = &PL_start_env;
1d7c1841 10788
bd81e77b 10789 PL_op = proto_perl->Top;
4a4c6fe3 10790
bd81e77b
NC
10791 PL_Sv = Nullsv;
10792 PL_Xpv = (XPV*)NULL;
10793 PL_na = proto_perl->Tna;
1fcf4c12 10794
bd81e77b
NC
10795 PL_statbuf = proto_perl->Tstatbuf;
10796 PL_statcache = proto_perl->Tstatcache;
10797 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
10798 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
10799#ifdef HAS_TIMES
10800 PL_timesbuf = proto_perl->Ttimesbuf;
10801#endif
1d7c1841 10802
bd81e77b
NC
10803 PL_tainted = proto_perl->Ttainted;
10804 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
10805 PL_rs = sv_dup_inc(proto_perl->Trs, param);
10806 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
10807 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
10808 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
10809 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
10810 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
10811 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
10812 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841 10813
bd81e77b
NC
10814 PL_restartop = proto_perl->Trestartop;
10815 PL_in_eval = proto_perl->Tin_eval;
10816 PL_delaymagic = proto_perl->Tdelaymagic;
10817 PL_dirty = proto_perl->Tdirty;
10818 PL_localizing = proto_perl->Tlocalizing;
1d7c1841 10819
bd81e77b
NC
10820 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
10821 PL_hv_fetch_ent_mh = Nullhe;
10822 PL_modcount = proto_perl->Tmodcount;
10823 PL_lastgotoprobe = Nullop;
10824 PL_dumpindent = proto_perl->Tdumpindent;
1d7c1841 10825
bd81e77b
NC
10826 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
10827 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
10828 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
10829 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
10830 PL_efloatbuf = Nullch; /* reinits on demand */
10831 PL_efloatsize = 0; /* reinits on demand */
d2d73c3e 10832
bd81e77b 10833 /* regex stuff */
1d7c1841 10834
bd81e77b
NC
10835 PL_screamfirst = NULL;
10836 PL_screamnext = NULL;
10837 PL_maxscream = -1; /* reinits on demand */
10838 PL_lastscream = Nullsv;
1d7c1841 10839
bd81e77b
NC
10840 PL_watchaddr = NULL;
10841 PL_watchok = Nullch;
1d7c1841 10842
bd81e77b
NC
10843 PL_regdummy = proto_perl->Tregdummy;
10844 PL_regprecomp = Nullch;
10845 PL_regnpar = 0;
10846 PL_regsize = 0;
10847 PL_colorset = 0; /* reinits PL_colors[] */
10848 /*PL_colors[6] = {0,0,0,0,0,0};*/
10849 PL_reginput = Nullch;
10850 PL_regbol = Nullch;
10851 PL_regeol = Nullch;
10852 PL_regstartp = (I32*)NULL;
10853 PL_regendp = (I32*)NULL;
10854 PL_reglastparen = (U32*)NULL;
10855 PL_reglastcloseparen = (U32*)NULL;
10856 PL_regtill = Nullch;
10857 PL_reg_start_tmp = (char**)NULL;
10858 PL_reg_start_tmpl = 0;
10859 PL_regdata = (struct reg_data*)NULL;
10860 PL_bostr = Nullch;
10861 PL_reg_flags = 0;
10862 PL_reg_eval_set = 0;
10863 PL_regnarrate = 0;
10864 PL_regprogram = (regnode*)NULL;
10865 PL_regindent = 0;
10866 PL_regcc = (CURCUR*)NULL;
10867 PL_reg_call_cc = (struct re_cc_state*)NULL;
10868 PL_reg_re = (regexp*)NULL;
10869 PL_reg_ganch = Nullch;
10870 PL_reg_sv = Nullsv;
10871 PL_reg_match_utf8 = FALSE;
10872 PL_reg_magic = (MAGIC*)NULL;
10873 PL_reg_oldpos = 0;
10874 PL_reg_oldcurpm = (PMOP*)NULL;
10875 PL_reg_curpm = (PMOP*)NULL;
10876 PL_reg_oldsaved = Nullch;
10877 PL_reg_oldsavedlen = 0;
10878#ifdef PERL_OLD_COPY_ON_WRITE
10879 PL_nrs = Nullsv;
10880#endif
10881 PL_reg_maxiter = 0;
10882 PL_reg_leftiter = 0;
10883 PL_reg_poscache = Nullch;
10884 PL_reg_poscache_size= 0;
1d7c1841 10885
bd81e77b
NC
10886 /* RE engine - function pointers */
10887 PL_regcompp = proto_perl->Tregcompp;
10888 PL_regexecp = proto_perl->Tregexecp;
10889 PL_regint_start = proto_perl->Tregint_start;
10890 PL_regint_string = proto_perl->Tregint_string;
10891 PL_regfree = proto_perl->Tregfree;
1d7c1841 10892
bd81e77b
NC
10893 PL_reginterp_cnt = 0;
10894 PL_reg_starttry = 0;
1d7c1841 10895
bd81e77b
NC
10896 /* Pluggable optimizer */
10897 PL_peepp = proto_perl->Tpeepp;
1d7c1841 10898
bd81e77b 10899 PL_stashcache = newHV();
1d7c1841 10900
bd81e77b
NC
10901 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
10902 ptr_table_free(PL_ptr_table);
10903 PL_ptr_table = NULL;
10904 }
1d7c1841 10905
bd81e77b
NC
10906 /* Call the ->CLONE method, if it exists, for each of the stashes
10907 identified by sv_dup() above.
10908 */
10909 while(av_len(param->stashes) != -1) {
10910 HV* const stash = (HV*) av_shift(param->stashes);
10911 GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
10912 if (cloner && GvCV(cloner)) {
10913 dSP;
10914 ENTER;
10915 SAVETMPS;
10916 PUSHMARK(SP);
10917 XPUSHs(sv_2mortal(newSVhek(HvNAME_HEK(stash))));
10918 PUTBACK;
10919 call_sv((SV*)GvCV(cloner), G_DISCARD);
10920 FREETMPS;
10921 LEAVE;
10922 }
1d7c1841 10923 }
1d7c1841 10924
bd81e77b 10925 SvREFCNT_dec(param->stashes);
1d7c1841 10926
bd81e77b
NC
10927 /* orphaned? eg threads->new inside BEGIN or use */
10928 if (PL_compcv && ! SvREFCNT(PL_compcv)) {
10929 (void)SvREFCNT_inc(PL_compcv);
10930 SAVEFREESV(PL_compcv);
10931 }
dd2155a4 10932
bd81e77b
NC
10933 return my_perl;
10934}
1d7c1841 10935
bd81e77b 10936#endif /* USE_ITHREADS */
1d7c1841 10937
bd81e77b
NC
10938/*
10939=head1 Unicode Support
1d7c1841 10940
bd81e77b 10941=for apidoc sv_recode_to_utf8
1d7c1841 10942
bd81e77b
NC
10943The encoding is assumed to be an Encode object, on entry the PV
10944of the sv is assumed to be octets in that encoding, and the sv
10945will be converted into Unicode (and UTF-8).
1d7c1841 10946
bd81e77b
NC
10947If the sv already is UTF-8 (or if it is not POK), or if the encoding
10948is not a reference, nothing is done to the sv. If the encoding is not
10949an C<Encode::XS> Encoding object, bad things will happen.
10950(See F<lib/encoding.pm> and L<Encode>).
1d7c1841 10951
bd81e77b 10952The PV of the sv is returned.
1d7c1841 10953
bd81e77b 10954=cut */
1d7c1841 10955
bd81e77b
NC
10956char *
10957Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
10958{
10959 dVAR;
10960 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
10961 SV *uni;
10962 STRLEN len;
10963 const char *s;
10964 dSP;
10965 ENTER;
10966 SAVETMPS;
10967 save_re_context();
10968 PUSHMARK(sp);
10969 EXTEND(SP, 3);
10970 XPUSHs(encoding);
10971 XPUSHs(sv);
10972/*
10973 NI-S 2002/07/09
10974 Passing sv_yes is wrong - it needs to be or'ed set of constants
10975 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
10976 remove converted chars from source.
1d7c1841 10977
bd81e77b 10978 Both will default the value - let them.
1d7c1841 10979
bd81e77b
NC
10980 XPUSHs(&PL_sv_yes);
10981*/
10982 PUTBACK;
10983 call_method("decode", G_SCALAR);
10984 SPAGAIN;
10985 uni = POPs;
10986 PUTBACK;
10987 s = SvPV_const(uni, len);
10988 if (s != SvPVX_const(sv)) {
10989 SvGROW(sv, len + 1);
10990 Move(s, SvPVX(sv), len + 1, char);
10991 SvCUR_set(sv, len);
10992 }
10993 FREETMPS;
10994 LEAVE;
10995 SvUTF8_on(sv);
10996 return SvPVX(sv);
389edf32 10997 }
bd81e77b
NC
10998 return SvPOKp(sv) ? SvPVX(sv) : NULL;
10999}
1d7c1841 11000
bd81e77b
NC
11001/*
11002=for apidoc sv_cat_decode
1d7c1841 11003
bd81e77b
NC
11004The encoding is assumed to be an Encode object, the PV of the ssv is
11005assumed to be octets in that encoding and decoding the input starts
11006from the position which (PV + *offset) pointed to. The dsv will be
11007concatenated the decoded UTF-8 string from ssv. Decoding will terminate
11008when the string tstr appears in decoding output or the input ends on
11009the PV of the ssv. The value which the offset points will be modified
11010to the last input position on the ssv.
1d7c1841 11011
bd81e77b 11012Returns TRUE if the terminator was found, else returns FALSE.
1d7c1841 11013
bd81e77b
NC
11014=cut */
11015
11016bool
11017Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
11018 SV *ssv, int *offset, char *tstr, int tlen)
11019{
11020 dVAR;
11021 bool ret = FALSE;
11022 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
11023 SV *offsv;
11024 dSP;
11025 ENTER;
11026 SAVETMPS;
11027 save_re_context();
11028 PUSHMARK(sp);
11029 EXTEND(SP, 6);
11030 XPUSHs(encoding);
11031 XPUSHs(dsv);
11032 XPUSHs(ssv);
11033 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
11034 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
11035 PUTBACK;
11036 call_method("cat_decode", G_SCALAR);
11037 SPAGAIN;
11038 ret = SvTRUE(TOPs);
11039 *offset = SvIV(offsv);
11040 PUTBACK;
11041 FREETMPS;
11042 LEAVE;
389edf32 11043 }
bd81e77b
NC
11044 else
11045 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
11046 return ret;
1d7c1841 11047
bd81e77b 11048}
1d7c1841 11049
bd81e77b
NC
11050/* ---------------------------------------------------------------------
11051 *
11052 * support functions for report_uninit()
11053 */
1d7c1841 11054
bd81e77b
NC
11055/* the maxiumum size of array or hash where we will scan looking
11056 * for the undefined element that triggered the warning */
1d7c1841 11057
bd81e77b 11058#define FUV_MAX_SEARCH_SIZE 1000
1d7c1841 11059
bd81e77b
NC
11060/* Look for an entry in the hash whose value has the same SV as val;
11061 * If so, return a mortal copy of the key. */
1d7c1841 11062
bd81e77b
NC
11063STATIC SV*
11064S_find_hash_subscript(pTHX_ HV *hv, SV* val)
11065{
11066 dVAR;
11067 register HE **array;
11068 I32 i;
6c3182a5 11069
bd81e77b
NC
11070 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
11071 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
11072 return Nullsv;
6c3182a5 11073
bd81e77b 11074 array = HvARRAY(hv);
6c3182a5 11075
bd81e77b
NC
11076 for (i=HvMAX(hv); i>0; i--) {
11077 register HE *entry;
11078 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
11079 if (HeVAL(entry) != val)
11080 continue;
11081 if ( HeVAL(entry) == &PL_sv_undef ||
11082 HeVAL(entry) == &PL_sv_placeholder)
11083 continue;
11084 if (!HeKEY(entry))
11085 return Nullsv;
11086 if (HeKLEN(entry) == HEf_SVKEY)
11087 return sv_mortalcopy(HeKEY_sv(entry));
11088 return sv_2mortal(newSVpvn(HeKEY(entry), HeKLEN(entry)));
11089 }
11090 }
11091 return Nullsv;
11092}
6c3182a5 11093
bd81e77b
NC
11094/* Look for an entry in the array whose value has the same SV as val;
11095 * If so, return the index, otherwise return -1. */
6c3182a5 11096
bd81e77b
NC
11097STATIC I32
11098S_find_array_subscript(pTHX_ AV *av, SV* val)
11099{
11100 SV** svp;
11101 I32 i;
11102 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
11103 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
11104 return -1;
57c6e6d2 11105
bd81e77b
NC
11106 svp = AvARRAY(av);
11107 for (i=AvFILLp(av); i>=0; i--) {
11108 if (svp[i] == val && svp[i] != &PL_sv_undef)
11109 return i;
11110 }
11111 return -1;
11112}
15a5279a 11113
bd81e77b
NC
11114/* S_varname(): return the name of a variable, optionally with a subscript.
11115 * If gv is non-zero, use the name of that global, along with gvtype (one
11116 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
11117 * targ. Depending on the value of the subscript_type flag, return:
11118 */
bce260cd 11119
bd81e77b
NC
11120#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
11121#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
11122#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
11123#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
bce260cd 11124
bd81e77b
NC
11125STATIC SV*
11126S_varname(pTHX_ GV *gv, const char gvtype, PADOFFSET targ,
11127 SV* keyname, I32 aindex, int subscript_type)
11128{
1d7c1841 11129
bd81e77b
NC
11130 SV * const name = sv_newmortal();
11131 if (gv) {
11132 char buffer[2];
11133 buffer[0] = gvtype;
11134 buffer[1] = 0;
1d7c1841 11135
bd81e77b 11136 /* as gv_fullname4(), but add literal '^' for $^FOO names */
66fe0623 11137
bd81e77b 11138 gv_fullname4(name, gv, buffer, 0);
1d7c1841 11139
bd81e77b
NC
11140 if ((unsigned int)SvPVX(name)[1] <= 26) {
11141 buffer[0] = '^';
11142 buffer[1] = SvPVX(name)[1] + 'A' - 1;
1d7c1841 11143
bd81e77b
NC
11144 /* Swap the 1 unprintable control character for the 2 byte pretty
11145 version - ie substr($name, 1, 1) = $buffer; */
11146 sv_insert(name, 1, 1, buffer, 2);
1d7c1841 11147 }
bd81e77b
NC
11148 }
11149 else {
11150 U32 unused;
11151 CV * const cv = find_runcv(&unused);
11152 SV *sv;
11153 AV *av;
1d7c1841 11154
bd81e77b
NC
11155 if (!cv || !CvPADLIST(cv))
11156 return Nullsv;
11157 av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
11158 sv = *av_fetch(av, targ, FALSE);
11159 /* SvLEN in a pad name is not to be trusted */
11160 sv_setpv(name, SvPV_nolen_const(sv));
11161 }
1d7c1841 11162
bd81e77b
NC
11163 if (subscript_type == FUV_SUBSCRIPT_HASH) {
11164 SV * const sv = NEWSV(0,0);
11165 *SvPVX(name) = '$';
11166 Perl_sv_catpvf(aTHX_ name, "{%s}",
11167 pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
11168 SvREFCNT_dec(sv);
11169 }
11170 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
11171 *SvPVX(name) = '$';
11172 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
11173 }
11174 else if (subscript_type == FUV_SUBSCRIPT_WITHIN)
11175 sv_insert(name, 0, 0, "within ", 7);
1d7c1841 11176
bd81e77b
NC
11177 return name;
11178}
1d7c1841 11179
1d7c1841 11180
bd81e77b
NC
11181/*
11182=for apidoc find_uninit_var
1d7c1841 11183
bd81e77b
NC
11184Find the name of the undefined variable (if any) that caused the operator o
11185to issue a "Use of uninitialized value" warning.
11186If match is true, only return a name if it's value matches uninit_sv.
11187So roughly speaking, if a unary operator (such as OP_COS) generates a
11188warning, then following the direct child of the op may yield an
11189OP_PADSV or OP_GV that gives the name of the undefined variable. On the
11190other hand, with OP_ADD there are two branches to follow, so we only print
11191the variable name if we get an exact match.
1d7c1841 11192
bd81e77b 11193The name is returned as a mortal SV.
1d7c1841 11194
bd81e77b
NC
11195Assumes that PL_op is the op that originally triggered the error, and that
11196PL_comppad/PL_curpad points to the currently executing pad.
1d7c1841 11197
bd81e77b
NC
11198=cut
11199*/
1d7c1841 11200
bd81e77b
NC
11201STATIC SV *
11202S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
11203{
11204 dVAR;
11205 SV *sv;
11206 AV *av;
11207 GV *gv;
11208 OP *o, *o2, *kid;
1d7c1841 11209
bd81e77b
NC
11210 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
11211 uninit_sv == &PL_sv_placeholder)))
11212 return Nullsv;
1d7c1841 11213
bd81e77b 11214 switch (obase->op_type) {
1d7c1841 11215
bd81e77b
NC
11216 case OP_RV2AV:
11217 case OP_RV2HV:
11218 case OP_PADAV:
11219 case OP_PADHV:
11220 {
11221 const bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
11222 const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
11223 I32 index = 0;
11224 SV *keysv = Nullsv;
11225 int subscript_type = FUV_SUBSCRIPT_WITHIN;
1d7c1841 11226
bd81e77b
NC
11227 if (pad) { /* @lex, %lex */
11228 sv = PAD_SVl(obase->op_targ);
11229 gv = Nullgv;
11230 }
11231 else {
11232 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
11233 /* @global, %global */
11234 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
11235 if (!gv)
11236 break;
11237 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
11238 }
11239 else /* @{expr}, %{expr} */
11240 return find_uninit_var(cUNOPx(obase)->op_first,
11241 uninit_sv, match);
11242 }
1d7c1841 11243
bd81e77b
NC
11244 /* attempt to find a match within the aggregate */
11245 if (hash) {
11246 keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
11247 if (keysv)
11248 subscript_type = FUV_SUBSCRIPT_HASH;
11249 }
11250 else {
11251 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
11252 if (index >= 0)
11253 subscript_type = FUV_SUBSCRIPT_ARRAY;
11254 }
1d7c1841 11255
bd81e77b
NC
11256 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
11257 break;
1d7c1841 11258
bd81e77b
NC
11259 return varname(gv, hash ? '%' : '@', obase->op_targ,
11260 keysv, index, subscript_type);
11261 }
1d7c1841 11262
bd81e77b
NC
11263 case OP_PADSV:
11264 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
11265 break;
11266 return varname(Nullgv, '$', obase->op_targ,
11267 Nullsv, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 11268
bd81e77b
NC
11269 case OP_GVSV:
11270 gv = cGVOPx_gv(obase);
11271 if (!gv || (match && GvSV(gv) != uninit_sv))
11272 break;
11273 return varname(gv, '$', 0, Nullsv, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 11274
bd81e77b
NC
11275 case OP_AELEMFAST:
11276 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
11277 if (match) {
11278 SV **svp;
11279 av = (AV*)PAD_SV(obase->op_targ);
11280 if (!av || SvRMAGICAL(av))
11281 break;
11282 svp = av_fetch(av, (I32)obase->op_private, FALSE);
11283 if (!svp || *svp != uninit_sv)
11284 break;
11285 }
11286 return varname(Nullgv, '$', obase->op_targ,
11287 Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
11288 }
11289 else {
11290 gv = cGVOPx_gv(obase);
11291 if (!gv)
11292 break;
11293 if (match) {
11294 SV **svp;
11295 av = GvAV(gv);
11296 if (!av || SvRMAGICAL(av))
11297 break;
11298 svp = av_fetch(av, (I32)obase->op_private, FALSE);
11299 if (!svp || *svp != uninit_sv)
11300 break;
11301 }
11302 return varname(gv, '$', 0,
11303 Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
11304 }
11305 break;
1d7c1841 11306
bd81e77b
NC
11307 case OP_EXISTS:
11308 o = cUNOPx(obase)->op_first;
11309 if (!o || o->op_type != OP_NULL ||
11310 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
11311 break;
11312 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
a2efc822 11313
bd81e77b
NC
11314 case OP_AELEM:
11315 case OP_HELEM:
11316 if (PL_op == obase)
11317 /* $a[uninit_expr] or $h{uninit_expr} */
11318 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
081fc587 11319
bd81e77b
NC
11320 gv = Nullgv;
11321 o = cBINOPx(obase)->op_first;
11322 kid = cBINOPx(obase)->op_last;
8cf8f3d1 11323
bd81e77b
NC
11324 /* get the av or hv, and optionally the gv */
11325 sv = Nullsv;
11326 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
11327 sv = PAD_SV(o->op_targ);
11328 }
11329 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
11330 && cUNOPo->op_first->op_type == OP_GV)
11331 {
11332 gv = cGVOPx_gv(cUNOPo->op_first);
11333 if (!gv)
11334 break;
11335 sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
11336 }
11337 if (!sv)
11338 break;
11339
11340 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
11341 /* index is constant */
11342 if (match) {
11343 if (SvMAGICAL(sv))
11344 break;
11345 if (obase->op_type == OP_HELEM) {
11346 HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
11347 if (!he || HeVAL(he) != uninit_sv)
11348 break;
11349 }
11350 else {
00b6aa41 11351 SV * const * const svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
bd81e77b
NC
11352 if (!svp || *svp != uninit_sv)
11353 break;
11354 }
11355 }
11356 if (obase->op_type == OP_HELEM)
11357 return varname(gv, '%', o->op_targ,
11358 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
11359 else
11360 return varname(gv, '@', o->op_targ, Nullsv,
11361 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11362 }
11363 else {
11364 /* index is an expression;
11365 * attempt to find a match within the aggregate */
11366 if (obase->op_type == OP_HELEM) {
11367 SV * const keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
11368 if (keysv)
11369 return varname(gv, '%', o->op_targ,
11370 keysv, 0, FUV_SUBSCRIPT_HASH);
11371 }
11372 else {
11373 const I32 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
11374 if (index >= 0)
11375 return varname(gv, '@', o->op_targ,
11376 Nullsv, index, FUV_SUBSCRIPT_ARRAY);
11377 }
11378 if (match)
11379 break;
11380 return varname(gv,
11381 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
11382 ? '@' : '%',
11383 o->op_targ, Nullsv, 0, FUV_SUBSCRIPT_WITHIN);
f284b03f 11384 }
a0739874 11385
bd81e77b 11386 break;
dc507217 11387
bd81e77b
NC
11388 case OP_AASSIGN:
11389 /* only examine RHS */
11390 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
6d26897e 11391
bd81e77b
NC
11392 case OP_OPEN:
11393 o = cUNOPx(obase)->op_first;
11394 if (o->op_type == OP_PUSHMARK)
11395 o = o->op_sibling;
1d7c1841 11396
bd81e77b
NC
11397 if (!o->op_sibling) {
11398 /* one-arg version of open is highly magical */
a0ae6670 11399
bd81e77b
NC
11400 if (o->op_type == OP_GV) { /* open FOO; */
11401 gv = cGVOPx_gv(o);
11402 if (match && GvSV(gv) != uninit_sv)
11403 break;
11404 return varname(gv, '$', 0,
11405 Nullsv, 0, FUV_SUBSCRIPT_NONE);
11406 }
11407 /* other possibilities not handled are:
11408 * open $x; or open my $x; should return '${*$x}'
11409 * open expr; should return '$'.expr ideally
11410 */
11411 break;
11412 }
11413 goto do_op;
ccfc67b7 11414
bd81e77b
NC
11415 /* ops where $_ may be an implicit arg */
11416 case OP_TRANS:
11417 case OP_SUBST:
11418 case OP_MATCH:
11419 if ( !(obase->op_flags & OPf_STACKED)) {
11420 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
11421 ? PAD_SVl(obase->op_targ)
11422 : DEFSV))
11423 {
11424 sv = sv_newmortal();
11425 sv_setpvn(sv, "$_", 2);
11426 return sv;
11427 }
11428 }
11429 goto do_op;
9f4817db 11430
bd81e77b
NC
11431 case OP_PRTF:
11432 case OP_PRINT:
11433 /* skip filehandle as it can't produce 'undef' warning */
11434 o = cUNOPx(obase)->op_first;
11435 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
11436 o = o->op_sibling->op_sibling;
11437 goto do_op2;
9f4817db 11438
9f4817db 11439
bd81e77b
NC
11440 case OP_RV2SV:
11441 case OP_CUSTOM:
11442 case OP_ENTERSUB:
11443 match = 1; /* XS or custom code could trigger random warnings */
11444 goto do_op;
9f4817db 11445
bd81e77b
NC
11446 case OP_SCHOMP:
11447 case OP_CHOMP:
11448 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
11449 return sv_2mortal(newSVpvn("${$/}", 5));
11450 /* FALL THROUGH */
5d170f3a 11451
bd81e77b
NC
11452 default:
11453 do_op:
11454 if (!(obase->op_flags & OPf_KIDS))
11455 break;
11456 o = cUNOPx(obase)->op_first;
11457
11458 do_op2:
11459 if (!o)
11460 break;
f9893866 11461
bd81e77b
NC
11462 /* if all except one arg are constant, or have no side-effects,
11463 * or are optimized away, then it's unambiguous */
11464 o2 = Nullop;
11465 for (kid=o; kid; kid = kid->op_sibling) {
11466 if (kid &&
11467 ( (kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid)))
11468 || (kid->op_type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
11469 || (kid->op_type == OP_PUSHMARK)
11470 )
11471 )
11472 continue;
11473 if (o2) { /* more than one found */
11474 o2 = Nullop;
11475 break;
11476 }
11477 o2 = kid;
11478 }
11479 if (o2)
11480 return find_uninit_var(o2, uninit_sv, match);
7a5fa8a2 11481
bd81e77b
NC
11482 /* scan all args */
11483 while (o) {
11484 sv = find_uninit_var(o, uninit_sv, 1);
11485 if (sv)
11486 return sv;
11487 o = o->op_sibling;
d0063567 11488 }
bd81e77b 11489 break;
f9893866 11490 }
bd81e77b 11491 return Nullsv;
9f4817db
JH
11492}
11493
220e2d4e 11494
bd81e77b
NC
11495/*
11496=for apidoc report_uninit
68795e93 11497
bd81e77b 11498Print appropriate "Use of uninitialized variable" warning
220e2d4e 11499
bd81e77b
NC
11500=cut
11501*/
220e2d4e 11502
bd81e77b
NC
11503void
11504Perl_report_uninit(pTHX_ SV* uninit_sv)
220e2d4e 11505{
bd81e77b
NC
11506 if (PL_op) {
11507 SV* varname = Nullsv;
11508 if (uninit_sv) {
11509 varname = find_uninit_var(PL_op, uninit_sv,0);
11510 if (varname)
11511 sv_insert(varname, 0, 0, " ", 1);
11512 }
11513 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
11514 varname ? SvPV_nolen_const(varname) : "",
11515 " in ", OP_DESC(PL_op));
220e2d4e 11516 }
a73e8557 11517 else
bd81e77b
NC
11518 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
11519 "", "", "");
220e2d4e 11520}
f9893866 11521
241d1a3b
NC
11522/*
11523 * Local variables:
11524 * c-indentation-style: bsd
11525 * c-basic-offset: 4
11526 * indent-tabs-mode: t
11527 * End:
11528 *
37442d52
RGS
11529 * ex: set ts=8 sts=4 sw=4 noet:
11530 */