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