This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[PATCH] Run ICMP ping tests on Windows as long as we have admin privs
[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
765f542d
NC
50#ifdef PERL_COPY_ON_WRITE
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
4977e971
NC
66Normally, this allocation is done using arenas, which by default are
67approximately 4K chunks of memory parcelled up into N heads or bodies. The
68first slot in each arena is reserved, and is used to hold a link to the next
69arena. In the case of heads, the unused first slot also contains some flags
70and a note of the number of slots. Snaked through each arena chain is a
5e045b90 71linked list of free items; when this becomes empty, an extra arena is
4977e971 72allocated and divided up into N items which are threaded into the free list.
645c22ef
DM
73
74The following global variables are associated with arenas:
75
76 PL_sv_arenaroot pointer to list of SV arenas
77 PL_sv_root pointer to list of free SV structures
78
79 PL_foo_arenaroot pointer to list of foo arenas,
80 PL_foo_root pointer to list of free foo bodies
81 ... for foo in xiv, xnv, xrv, xpv etc.
82
83Note that some of the larger and more rarely used body types (eg xpvio)
84are not allocated using arenas, but are instead just malloc()/free()ed as
85required. Also, if PURIFY is defined, arenas are abandoned altogether,
86with all items individually malloc()ed. In addition, a few SV heads are
87not allocated from an arena, but are instead directly created as static
4977e971
NC
88or auto variables, eg PL_sv_undef. The size of arenas can be changed from
89the default by setting PERL_ARENA_SIZE appropriately at compile time.
645c22ef
DM
90
91The SV arena serves the secondary purpose of allowing still-live SVs
92to be located and destroyed during final cleanup.
93
94At the lowest level, the macros new_SV() and del_SV() grab and free
95an SV head. (If debugging with -DD, del_SV() calls the function S_del_sv()
96to return the SV to the free list with error checking.) new_SV() calls
97more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
98SVs in the free list have their SvTYPE field set to all ones.
99
100Similarly, there are macros new_XIV()/del_XIV(), new_XNV()/del_XNV() etc
101that allocate and return individual body types. Normally these are mapped
ff276b08
RG
102to the arena-manipulating functions new_xiv()/del_xiv() etc, but may be
103instead mapped directly to malloc()/free() if PURIFY is defined. The
645c22ef
DM
104new/del functions remove from, or add to, the appropriate PL_foo_root
105list, and call more_xiv() etc to add a new arena if the list is empty.
106
ff276b08 107At the time of very final cleanup, sv_free_arenas() is called from
645c22ef
DM
108perl_destruct() to physically free all the arenas allocated since the
109start of the interpreter. Note that this also clears PL_he_arenaroot,
110which is otherwise dealt with in hv.c.
111
112Manipulation of any of the PL_*root pointers is protected by enclosing
113LOCK_SV_MUTEX; ... UNLOCK_SV_MUTEX calls which should Do the Right Thing
114if threads are enabled.
115
116The function visit() scans the SV arenas list, and calls a specified
117function for each SV it finds which is still live - ie which has an SvTYPE
118other than all 1's, and a non-zero SvREFCNT. visit() is used by the
119following functions (specified as [function that calls visit()] / [function
120called by visit() for each SV]):
121
122 sv_report_used() / do_report_used()
123 dump all remaining SVs (debugging aid)
124
125 sv_clean_objs() / do_clean_objs(),do_clean_named_objs()
126 Attempt to free all objects pointed to by RVs,
127 and, unless DISABLE_DESTRUCTOR_KLUDGE is defined,
128 try to do the same for all objects indirectly
129 referenced by typeglobs too. Called once from
130 perl_destruct(), prior to calling sv_clean_all()
131 below.
132
133 sv_clean_all() / do_clean_all()
134 SvREFCNT_dec(sv) each remaining SV, possibly
135 triggering an sv_free(). It also sets the
136 SVf_BREAK flag on the SV to indicate that the
137 refcnt has been artificially lowered, and thus
138 stopping sv_free() from giving spurious warnings
139 about SVs which unexpectedly have a refcnt
140 of zero. called repeatedly from perl_destruct()
141 until there are no SVs left.
142
143=head2 Summary
144
145Private API to rest of sv.c
146
147 new_SV(), del_SV(),
148
149 new_XIV(), del_XIV(),
150 new_XNV(), del_XNV(),
151 etc
152
153Public API:
154
8cf8f3d1 155 sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
645c22ef
DM
156
157
158=cut
159
160============================================================================ */
161
162
51371543 163
4561caa4
CS
164/*
165 * "A time to plant, and a time to uproot what was planted..."
166 */
167
cac9b346 168
fd0854ff
DM
169#ifdef DEBUG_LEAKING_SCALARS
170# ifdef NETWARE
171# define FREE_SV_DEBUG_FILE(sv) PerlMemfree((sv)->sv_debug_file)
172# else
173# define FREE_SV_DEBUG_FILE(sv) PerlMemShared_free((sv)->sv_debug_file)
174# endif
175#else
176# define FREE_SV_DEBUG_FILE(sv)
177#endif
178
053fc874
GS
179#define plant_SV(p) \
180 STMT_START { \
fd0854ff 181 FREE_SV_DEBUG_FILE(p); \
053fc874
GS
182 SvANY(p) = (void *)PL_sv_root; \
183 SvFLAGS(p) = SVTYPEMASK; \
184 PL_sv_root = (p); \
185 --PL_sv_count; \
186 } STMT_END
a0d0e21e 187
fba3b22e 188/* sv_mutex must be held while calling uproot_SV() */
053fc874
GS
189#define uproot_SV(p) \
190 STMT_START { \
191 (p) = PL_sv_root; \
192 PL_sv_root = (SV*)SvANY(p); \
193 ++PL_sv_count; \
194 } STMT_END
195
645c22ef 196
cac9b346
NC
197/* make some more SVs by adding another arena */
198
199/* sv_mutex must be held while calling more_sv() */
200STATIC SV*
201S_more_sv(pTHX)
202{
203 SV* sv;
204
205 if (PL_nice_chunk) {
206 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
207 PL_nice_chunk = Nullch;
208 PL_nice_chunk_size = 0;
209 }
210 else {
211 char *chunk; /* must use New here to match call to */
2e7ed132
NC
212 New(704,chunk,PERL_ARENA_SIZE,char); /* Safefree() in sv_free_arenas() */
213 sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
cac9b346
NC
214 }
215 uproot_SV(sv);
216 return sv;
217}
218
645c22ef
DM
219/* new_SV(): return a new, empty SV head */
220
eba0f806
DM
221#ifdef DEBUG_LEAKING_SCALARS
222/* provide a real function for a debugger to play with */
223STATIC SV*
224S_new_SV(pTHX)
225{
226 SV* sv;
227
228 LOCK_SV_MUTEX;
229 if (PL_sv_root)
230 uproot_SV(sv);
231 else
cac9b346 232 sv = S_more_sv(aTHX);
eba0f806
DM
233 UNLOCK_SV_MUTEX;
234 SvANY(sv) = 0;
235 SvREFCNT(sv) = 1;
236 SvFLAGS(sv) = 0;
fd0854ff
DM
237 sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
238 sv->sv_debug_line = (U16) ((PL_copline == NOLINE) ?
239 (PL_curcop ? CopLINE(PL_curcop) : 0) : PL_copline);
240 sv->sv_debug_inpad = 0;
241 sv->sv_debug_cloned = 0;
242# ifdef NETWARE
243 sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
244# else
245 sv->sv_debug_file = PL_curcop ? savesharedpv(CopFILE(PL_curcop)): NULL;
246# endif
247
eba0f806
DM
248 return sv;
249}
250# define new_SV(p) (p)=S_new_SV(aTHX)
251
252#else
253# define new_SV(p) \
053fc874
GS
254 STMT_START { \
255 LOCK_SV_MUTEX; \
256 if (PL_sv_root) \
257 uproot_SV(p); \
258 else \
cac9b346 259 (p) = S_more_sv(aTHX); \
053fc874
GS
260 UNLOCK_SV_MUTEX; \
261 SvANY(p) = 0; \
262 SvREFCNT(p) = 1; \
263 SvFLAGS(p) = 0; \
264 } STMT_END
eba0f806 265#endif
463ee0b2 266
645c22ef
DM
267
268/* del_SV(): return an empty SV head to the free list */
269
a0d0e21e 270#ifdef DEBUGGING
4561caa4 271
053fc874
GS
272#define del_SV(p) \
273 STMT_START { \
274 LOCK_SV_MUTEX; \
aea4f609 275 if (DEBUG_D_TEST) \
053fc874
GS
276 del_sv(p); \
277 else \
278 plant_SV(p); \
279 UNLOCK_SV_MUTEX; \
280 } STMT_END
a0d0e21e 281
76e3520e 282STATIC void
cea2e8a9 283S_del_sv(pTHX_ SV *p)
463ee0b2 284{
aea4f609 285 if (DEBUG_D_TEST) {
4633a7c4 286 SV* sva;
a3b680e6 287 bool ok = 0;
3280af22 288 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
a3b680e6
AL
289 SV *sv = sva + 1;
290 SV *svend = &sva[SvREFCNT(sva)];
c0ff570e 291 if (p >= sv && p < svend) {
a0d0e21e 292 ok = 1;
c0ff570e
NC
293 break;
294 }
a0d0e21e
LW
295 }
296 if (!ok) {
0453d815 297 if (ckWARN_d(WARN_INTERNAL))
9014280d 298 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
299 "Attempt to free non-arena SV: 0x%"UVxf
300 pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
a0d0e21e
LW
301 return;
302 }
303 }
4561caa4 304 plant_SV(p);
463ee0b2 305}
a0d0e21e 306
4561caa4
CS
307#else /* ! DEBUGGING */
308
309#define del_SV(p) plant_SV(p)
310
311#endif /* DEBUGGING */
463ee0b2 312
645c22ef
DM
313
314/*
ccfc67b7
JH
315=head1 SV Manipulation Functions
316
645c22ef
DM
317=for apidoc sv_add_arena
318
319Given a chunk of memory, link it to the head of the list of arenas,
320and split it into a list of free SVs.
321
322=cut
323*/
324
4633a7c4 325void
864dbfa3 326Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
463ee0b2 327{
4633a7c4 328 SV* sva = (SV*)ptr;
463ee0b2
LW
329 register SV* sv;
330 register SV* svend;
4633a7c4
LW
331
332 /* The first SV in an arena isn't an SV. */
3280af22 333 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
334 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
335 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
336
3280af22
NIS
337 PL_sv_arenaroot = sva;
338 PL_sv_root = sva + 1;
4633a7c4
LW
339
340 svend = &sva[SvREFCNT(sva) - 1];
341 sv = sva + 1;
463ee0b2 342 while (sv < svend) {
a0d0e21e 343 SvANY(sv) = (void *)(SV*)(sv + 1);
03e36789 344#ifdef DEBUGGING
978b032e 345 SvREFCNT(sv) = 0;
03e36789
NC
346#endif
347 /* Must always set typemask because it's awlays checked in on cleanup
348 when the arenas are walked looking for objects. */
8990e307 349 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
350 sv++;
351 }
352 SvANY(sv) = 0;
03e36789
NC
353#ifdef DEBUGGING
354 SvREFCNT(sv) = 0;
355#endif
4633a7c4
LW
356 SvFLAGS(sv) = SVTYPEMASK;
357}
358
055972dc
DM
359/* visit(): call the named function for each non-free SV in the arenas
360 * whose flags field matches the flags/mask args. */
645c22ef 361
5226ed68 362STATIC I32
055972dc 363S_visit(pTHX_ SVFUNC_t f, U32 flags, U32 mask)
8990e307 364{
4633a7c4 365 SV* sva;
5226ed68 366 I32 visited = 0;
8990e307 367
3280af22 368 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
a3b680e6
AL
369 register SV * const svend = &sva[SvREFCNT(sva)];
370 register SV* sv;
4561caa4 371 for (sv = sva + 1; sv < svend; ++sv) {
055972dc
DM
372 if (SvTYPE(sv) != SVTYPEMASK
373 && (sv->sv_flags & mask) == flags
374 && SvREFCNT(sv))
375 {
acfe0abc 376 (FCALL)(aTHX_ sv);
5226ed68
JH
377 ++visited;
378 }
8990e307
LW
379 }
380 }
5226ed68 381 return visited;
8990e307
LW
382}
383
758a08c3
JH
384#ifdef DEBUGGING
385
645c22ef
DM
386/* called by sv_report_used() for each live SV */
387
388static void
acfe0abc 389do_report_used(pTHX_ SV *sv)
645c22ef
DM
390{
391 if (SvTYPE(sv) != SVTYPEMASK) {
392 PerlIO_printf(Perl_debug_log, "****\n");
393 sv_dump(sv);
394 }
395}
758a08c3 396#endif
645c22ef
DM
397
398/*
399=for apidoc sv_report_used
400
401Dump the contents of all SVs not yet freed. (Debugging aid).
402
403=cut
404*/
405
8990e307 406void
864dbfa3 407Perl_sv_report_used(pTHX)
4561caa4 408{
ff270d3a 409#ifdef DEBUGGING
055972dc 410 visit(do_report_used, 0, 0);
ff270d3a 411#endif
4561caa4
CS
412}
413
645c22ef
DM
414/* called by sv_clean_objs() for each live SV */
415
416static void
acfe0abc 417do_clean_objs(pTHX_ SV *sv)
645c22ef
DM
418{
419 SV* rv;
420
421 if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
422 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv)));
423 if (SvWEAKREF(sv)) {
424 sv_del_backref(sv);
425 SvWEAKREF_off(sv);
b162af07 426 SvRV_set(sv, NULL);
645c22ef
DM
427 } else {
428 SvROK_off(sv);
b162af07 429 SvRV_set(sv, NULL);
645c22ef
DM
430 SvREFCNT_dec(rv);
431 }
432 }
433
434 /* XXX Might want to check arrays, etc. */
435}
436
437/* called by sv_clean_objs() for each live SV */
438
439#ifndef DISABLE_DESTRUCTOR_KLUDGE
440static void
acfe0abc 441do_clean_named_objs(pTHX_ SV *sv)
645c22ef
DM
442{
443 if (SvTYPE(sv) == SVt_PVGV && GvGP(sv)) {
444 if ( SvOBJECT(GvSV(sv)) ||
445 (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
446 (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
447 (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
448 (GvCV(sv) && SvOBJECT(GvCV(sv))) )
449 {
450 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
ec5f3c78 451 SvFLAGS(sv) |= SVf_BREAK;
645c22ef
DM
452 SvREFCNT_dec(sv);
453 }
454 }
455}
456#endif
457
458/*
459=for apidoc sv_clean_objs
460
461Attempt to destroy all objects not yet freed
462
463=cut
464*/
465
4561caa4 466void
864dbfa3 467Perl_sv_clean_objs(pTHX)
4561caa4 468{
3280af22 469 PL_in_clean_objs = TRUE;
055972dc 470 visit(do_clean_objs, SVf_ROK, SVf_ROK);
4561caa4 471#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 472 /* some barnacles may yet remain, clinging to typeglobs */
055972dc 473 visit(do_clean_named_objs, SVt_PVGV, SVTYPEMASK);
4561caa4 474#endif
3280af22 475 PL_in_clean_objs = FALSE;
4561caa4
CS
476}
477
645c22ef
DM
478/* called by sv_clean_all() for each live SV */
479
480static void
acfe0abc 481do_clean_all(pTHX_ SV *sv)
645c22ef
DM
482{
483 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
484 SvFLAGS(sv) |= SVf_BREAK;
0e705b3b
DM
485 if (PL_comppad == (AV*)sv) {
486 PL_comppad = Nullav;
487 PL_curpad = Null(SV**);
488 }
645c22ef
DM
489 SvREFCNT_dec(sv);
490}
491
492/*
493=for apidoc sv_clean_all
494
495Decrement the refcnt of each remaining SV, possibly triggering a
496cleanup. This function may have to be called multiple times to free
ff276b08 497SVs which are in complex self-referential hierarchies.
645c22ef
DM
498
499=cut
500*/
501
5226ed68 502I32
864dbfa3 503Perl_sv_clean_all(pTHX)
8990e307 504{
5226ed68 505 I32 cleaned;
3280af22 506 PL_in_clean_all = TRUE;
055972dc 507 cleaned = visit(do_clean_all, 0,0);
3280af22 508 PL_in_clean_all = FALSE;
5226ed68 509 return cleaned;
8990e307 510}
463ee0b2 511
645c22ef
DM
512/*
513=for apidoc sv_free_arenas
514
515Deallocate the memory used by all arenas. Note that all the individual SV
516heads and bodies within the arenas must already have been freed.
517
518=cut
519*/
520
4633a7c4 521void
864dbfa3 522Perl_sv_free_arenas(pTHX)
4633a7c4
LW
523{
524 SV* sva;
525 SV* svanext;
7b2c381c 526 void *arena, *arenanext;
4633a7c4
LW
527
528 /* Free arenas here, but be careful about fake ones. (We assume
529 contiguity of the fake ones with the corresponding real ones.) */
530
3280af22 531 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
532 svanext = (SV*) SvANY(sva);
533 while (svanext && SvFAKE(svanext))
534 svanext = (SV*) SvANY(svanext);
535
536 if (!SvFAKE(sva))
1df70142 537 Safefree(sva);
4633a7c4 538 }
5f05dabc 539
612f20c3 540 for (arena = PL_xnv_arenaroot; arena; arena = arenanext) {
7b2c381c 541 arenanext = *(void **)arena;
612f20c3
GS
542 Safefree(arena);
543 }
544 PL_xnv_arenaroot = 0;
bf9cdc68 545 PL_xnv_root = 0;
612f20c3 546
612f20c3 547 for (arena = PL_xpv_arenaroot; arena; arena = arenanext) {
7b2c381c 548 arenanext = *(void **)arena;
612f20c3
GS
549 Safefree(arena);
550 }
551 PL_xpv_arenaroot = 0;
bf9cdc68 552 PL_xpv_root = 0;
612f20c3 553
7b2c381c
NC
554 for (arena = PL_xpviv_arenaroot; arena; arena = arenanext) {
555 arenanext = *(void **)arena;
612f20c3
GS
556 Safefree(arena);
557 }
558 PL_xpviv_arenaroot = 0;
bf9cdc68 559 PL_xpviv_root = 0;
612f20c3 560
7b2c381c
NC
561 for (arena = PL_xpvnv_arenaroot; arena; arena = arenanext) {
562 arenanext = *(void **)arena;
612f20c3
GS
563 Safefree(arena);
564 }
565 PL_xpvnv_arenaroot = 0;
bf9cdc68 566 PL_xpvnv_root = 0;
612f20c3 567
7b2c381c
NC
568 for (arena = PL_xpvcv_arenaroot; arena; arena = arenanext) {
569 arenanext = *(void **)arena;
612f20c3
GS
570 Safefree(arena);
571 }
572 PL_xpvcv_arenaroot = 0;
bf9cdc68 573 PL_xpvcv_root = 0;
612f20c3 574
7b2c381c
NC
575 for (arena = PL_xpvav_arenaroot; arena; arena = arenanext) {
576 arenanext = *(void **)arena;
612f20c3
GS
577 Safefree(arena);
578 }
579 PL_xpvav_arenaroot = 0;
bf9cdc68 580 PL_xpvav_root = 0;
612f20c3 581
7b2c381c
NC
582 for (arena = PL_xpvhv_arenaroot; arena; arena = arenanext) {
583 arenanext = *(void **)arena;
612f20c3
GS
584 Safefree(arena);
585 }
586 PL_xpvhv_arenaroot = 0;
bf9cdc68 587 PL_xpvhv_root = 0;
612f20c3 588
7b2c381c
NC
589 for (arena = PL_xpvmg_arenaroot; arena; arena = arenanext) {
590 arenanext = *(void **)arena;
612f20c3
GS
591 Safefree(arena);
592 }
593 PL_xpvmg_arenaroot = 0;
bf9cdc68 594 PL_xpvmg_root = 0;
612f20c3 595
7b2c381c
NC
596 for (arena = PL_xpvgv_arenaroot; arena; arena = arenanext) {
597 arenanext = *(void **)arena;
727879eb
NC
598 Safefree(arena);
599 }
600 PL_xpvgv_arenaroot = 0;
601 PL_xpvgv_root = 0;
602
7b2c381c
NC
603 for (arena = PL_xpvlv_arenaroot; arena; arena = arenanext) {
604 arenanext = *(void **)arena;
612f20c3
GS
605 Safefree(arena);
606 }
607 PL_xpvlv_arenaroot = 0;
bf9cdc68 608 PL_xpvlv_root = 0;
612f20c3 609
7b2c381c
NC
610 for (arena = PL_xpvbm_arenaroot; arena; arena = arenanext) {
611 arenanext = *(void **)arena;
612f20c3
GS
612 Safefree(arena);
613 }
614 PL_xpvbm_arenaroot = 0;
bf9cdc68 615 PL_xpvbm_root = 0;
612f20c3 616
b1135e3d
NC
617 {
618 HE *he;
619 HE *he_next;
620 for (he = PL_he_arenaroot; he; he = he_next) {
621 he_next = HeNEXT(he);
622 Safefree(he);
623 }
612f20c3
GS
624 }
625 PL_he_arenaroot = 0;
bf9cdc68 626 PL_he_root = 0;
612f20c3 627
892b45be 628#if defined(USE_ITHREADS)
b1135e3d
NC
629 {
630 struct ptr_tbl_ent *pte;
631 struct ptr_tbl_ent *pte_next;
632 for (pte = PL_pte_arenaroot; pte; pte = pte_next) {
633 pte_next = pte->next;
634 Safefree(pte);
635 }
32e691d0
NC
636 }
637 PL_pte_arenaroot = 0;
638 PL_pte_root = 0;
892b45be 639#endif
32e691d0 640
3280af22
NIS
641 if (PL_nice_chunk)
642 Safefree(PL_nice_chunk);
643 PL_nice_chunk = Nullch;
644 PL_nice_chunk_size = 0;
645 PL_sv_arenaroot = 0;
646 PL_sv_root = 0;
4633a7c4
LW
647}
648
29489e7c
DM
649/* ---------------------------------------------------------------------
650 *
651 * support functions for report_uninit()
652 */
653
654/* the maxiumum size of array or hash where we will scan looking
655 * for the undefined element that triggered the warning */
656
657#define FUV_MAX_SEARCH_SIZE 1000
658
659/* Look for an entry in the hash whose value has the same SV as val;
660 * If so, return a mortal copy of the key. */
661
662STATIC SV*
663S_find_hash_subscript(pTHX_ HV *hv, SV* val)
664{
27da23d5 665 dVAR;
29489e7c 666 register HE **array;
29489e7c
DM
667 I32 i;
668
669 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
670 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
671 return Nullsv;
672
673 array = HvARRAY(hv);
674
675 for (i=HvMAX(hv); i>0; i--) {
f54cb97a 676 register HE *entry;
29489e7c
DM
677 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
678 if (HeVAL(entry) != val)
679 continue;
680 if ( HeVAL(entry) == &PL_sv_undef ||
681 HeVAL(entry) == &PL_sv_placeholder)
682 continue;
683 if (!HeKEY(entry))
684 return Nullsv;
685 if (HeKLEN(entry) == HEf_SVKEY)
686 return sv_mortalcopy(HeKEY_sv(entry));
687 return sv_2mortal(newSVpvn(HeKEY(entry), HeKLEN(entry)));
688 }
689 }
690 return Nullsv;
691}
692
693/* Look for an entry in the array whose value has the same SV as val;
694 * If so, return the index, otherwise return -1. */
695
696STATIC I32
697S_find_array_subscript(pTHX_ AV *av, SV* val)
698{
699 SV** svp;
700 I32 i;
701 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
702 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
703 return -1;
704
705 svp = AvARRAY(av);
706 for (i=AvFILLp(av); i>=0; i--) {
707 if (svp[i] == val && svp[i] != &PL_sv_undef)
708 return i;
709 }
710 return -1;
711}
712
713/* S_varname(): return the name of a variable, optionally with a subscript.
714 * If gv is non-zero, use the name of that global, along with gvtype (one
715 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
716 * targ. Depending on the value of the subscript_type flag, return:
717 */
718
719#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
720#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
721#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
722#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
723
724STATIC SV*
bfed75c6 725S_varname(pTHX_ GV *gv, const char *gvtype, PADOFFSET targ,
29489e7c
DM
726 SV* keyname, I32 aindex, int subscript_type)
727{
728 AV *av;
a3b680e6 729 SV *sv;
29489e7c 730
a3b680e6 731 SV * const name = sv_newmortal();
29489e7c
DM
732 if (gv) {
733
734 /* simulate gv_fullname4(), but add literal '^' for $^FOO names
735 * XXX get rid of all this if gv_fullnameX() ever supports this
736 * directly */
737
bfed75c6 738 const char *p;
29489e7c
DM
739 HV *hv = GvSTASH(gv);
740 sv_setpv(name, gvtype);
741 if (!hv)
742 p = "???";
bfcb3514 743 else if (!(p=HvNAME_get(hv)))
29489e7c 744 p = "__ANON__";
29489e7c
DM
745 if (strNE(p, "main")) {
746 sv_catpv(name,p);
747 sv_catpvn(name,"::", 2);
748 }
749 if (GvNAMELEN(gv)>= 1 &&
750 ((unsigned int)*GvNAME(gv)) <= 26)
751 { /* handle $^FOO */
752 Perl_sv_catpvf(aTHX_ name,"^%c", *GvNAME(gv) + 'A' - 1);
753 sv_catpvn(name,GvNAME(gv)+1,GvNAMELEN(gv)-1);
754 }
755 else
756 sv_catpvn(name,GvNAME(gv),GvNAMELEN(gv));
757 }
758 else {
759 U32 u;
760 CV *cv = find_runcv(&u);
616d8c9c
AL
761 STRLEN len;
762 const char *str;
29489e7c
DM
763 if (!cv || !CvPADLIST(cv))
764 return Nullsv;;
765 av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
766 sv = *av_fetch(av, targ, FALSE);
767 /* SvLEN in a pad name is not to be trusted */
616d8c9c
AL
768 str = SvPV(sv,len);
769 sv_setpvn(name, str, len);
29489e7c
DM
770 }
771
772 if (subscript_type == FUV_SUBSCRIPT_HASH) {
773 *SvPVX(name) = '$';
774 sv = NEWSV(0,0);
775 Perl_sv_catpvf(aTHX_ name, "{%s}",
3f7c398e 776 pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
29489e7c
DM
777 SvREFCNT_dec(sv);
778 }
779 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
780 *SvPVX(name) = '$';
265a12b8 781 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
29489e7c
DM
782 }
783 else if (subscript_type == FUV_SUBSCRIPT_WITHIN)
784 sv_insert(name, 0, 0, "within ", 7);
785
786 return name;
787}
788
789
790/*
791=for apidoc find_uninit_var
792
793Find the name of the undefined variable (if any) that caused the operator o
794to issue a "Use of uninitialized value" warning.
795If match is true, only return a name if it's value matches uninit_sv.
796So roughly speaking, if a unary operator (such as OP_COS) generates a
797warning, then following the direct child of the op may yield an
798OP_PADSV or OP_GV that gives the name of the undefined variable. On the
799other hand, with OP_ADD there are two branches to follow, so we only print
800the variable name if we get an exact match.
801
802The name is returned as a mortal SV.
803
804Assumes that PL_op is the op that originally triggered the error, and that
805PL_comppad/PL_curpad points to the currently executing pad.
806
807=cut
808*/
809
810STATIC SV *
811S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
812{
27da23d5 813 dVAR;
29489e7c
DM
814 SV *sv;
815 AV *av;
816 SV **svp;
817 GV *gv;
818 OP *o, *o2, *kid;
819
820 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
821 uninit_sv == &PL_sv_placeholder)))
822 return Nullsv;
823
824 switch (obase->op_type) {
825
826 case OP_RV2AV:
827 case OP_RV2HV:
828 case OP_PADAV:
829 case OP_PADHV:
830 {
f54cb97a
AL
831 const bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
832 const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
112dcc46
RGS
833 I32 index = 0;
834 SV *keysv = Nullsv;
29489e7c
DM
835 int subscript_type = FUV_SUBSCRIPT_WITHIN;
836
837 if (pad) { /* @lex, %lex */
838 sv = PAD_SVl(obase->op_targ);
839 gv = Nullgv;
840 }
841 else {
842 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
843 /* @global, %global */
844 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
845 if (!gv)
846 break;
847 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
848 }
849 else /* @{expr}, %{expr} */
850 return find_uninit_var(cUNOPx(obase)->op_first,
851 uninit_sv, match);
852 }
853
854 /* attempt to find a match within the aggregate */
855 if (hash) {
856 keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
857 if (keysv)
858 subscript_type = FUV_SUBSCRIPT_HASH;
859 }
860 else {
861 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
862 if (index >= 0)
863 subscript_type = FUV_SUBSCRIPT_ARRAY;
864 }
865
866 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
867 break;
868
869 return S_varname(aTHX_ gv, hash ? "%" : "@", obase->op_targ,
870 keysv, index, subscript_type);
871 }
872
873 case OP_PADSV:
874 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
875 break;
876 return S_varname(aTHX_ Nullgv, "$", obase->op_targ,
877 Nullsv, 0, FUV_SUBSCRIPT_NONE);
878
879 case OP_GVSV:
880 gv = cGVOPx_gv(obase);
881 if (!gv || (match && GvSV(gv) != uninit_sv))
882 break;
883 return S_varname(aTHX_ gv, "$", 0, Nullsv, 0, FUV_SUBSCRIPT_NONE);
884
885 case OP_AELEMFAST:
886 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
887 if (match) {
888 av = (AV*)PAD_SV(obase->op_targ);
889 if (!av || SvRMAGICAL(av))
890 break;
891 svp = av_fetch(av, (I32)obase->op_private, FALSE);
892 if (!svp || *svp != uninit_sv)
893 break;
894 }
895 return S_varname(aTHX_ Nullgv, "$", obase->op_targ,
896 Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
897 }
898 else {
899 gv = cGVOPx_gv(obase);
900 if (!gv)
901 break;
902 if (match) {
903 av = GvAV(gv);
904 if (!av || SvRMAGICAL(av))
905 break;
906 svp = av_fetch(av, (I32)obase->op_private, FALSE);
907 if (!svp || *svp != uninit_sv)
908 break;
909 }
910 return S_varname(aTHX_ gv, "$", 0,
911 Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
912 }
913 break;
914
915 case OP_EXISTS:
916 o = cUNOPx(obase)->op_first;
917 if (!o || o->op_type != OP_NULL ||
918 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
919 break;
920 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
921
922 case OP_AELEM:
923 case OP_HELEM:
924 if (PL_op == obase)
925 /* $a[uninit_expr] or $h{uninit_expr} */
926 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
927
928 gv = Nullgv;
929 o = cBINOPx(obase)->op_first;
930 kid = cBINOPx(obase)->op_last;
931
932 /* get the av or hv, and optionally the gv */
933 sv = Nullsv;
934 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
935 sv = PAD_SV(o->op_targ);
936 }
937 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
938 && cUNOPo->op_first->op_type == OP_GV)
939 {
940 gv = cGVOPx_gv(cUNOPo->op_first);
941 if (!gv)
942 break;
943 sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
944 }
945 if (!sv)
946 break;
947
948 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
949 /* index is constant */
950 if (match) {
951 if (SvMAGICAL(sv))
952 break;
953 if (obase->op_type == OP_HELEM) {
954 HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
955 if (!he || HeVAL(he) != uninit_sv)
956 break;
957 }
958 else {
959 svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
960 if (!svp || *svp != uninit_sv)
961 break;
962 }
963 }
964 if (obase->op_type == OP_HELEM)
965 return S_varname(aTHX_ gv, "%", o->op_targ,
966 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
967 else
968 return S_varname(aTHX_ gv, "@", o->op_targ, Nullsv,
969 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
970 ;
971 }
972 else {
973 /* index is an expression;
974 * attempt to find a match within the aggregate */
975 if (obase->op_type == OP_HELEM) {
976 SV *keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
977 if (keysv)
978 return S_varname(aTHX_ gv, "%", o->op_targ,
979 keysv, 0, FUV_SUBSCRIPT_HASH);
980 }
981 else {
f54cb97a 982 const I32 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
29489e7c 983 if (index >= 0)
f54cb97a 984 return S_varname(aTHX_ gv, "@", o->op_targ,
29489e7c
DM
985 Nullsv, index, FUV_SUBSCRIPT_ARRAY);
986 }
987 if (match)
988 break;
989 return S_varname(aTHX_ gv,
990 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
991 ? "@" : "%",
992 o->op_targ, Nullsv, 0, FUV_SUBSCRIPT_WITHIN);
993 }
994
995 break;
996
997 case OP_AASSIGN:
998 /* only examine RHS */
999 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
1000
1001 case OP_OPEN:
1002 o = cUNOPx(obase)->op_first;
1003 if (o->op_type == OP_PUSHMARK)
1004 o = o->op_sibling;
1005
1006 if (!o->op_sibling) {
1007 /* one-arg version of open is highly magical */
1008
1009 if (o->op_type == OP_GV) { /* open FOO; */
1010 gv = cGVOPx_gv(o);
1011 if (match && GvSV(gv) != uninit_sv)
1012 break;
7a5fa8a2 1013 return S_varname(aTHX_ gv, "$", 0,
29489e7c
DM
1014 Nullsv, 0, FUV_SUBSCRIPT_NONE);
1015 }
1016 /* other possibilities not handled are:
1017 * open $x; or open my $x; should return '${*$x}'
1018 * open expr; should return '$'.expr ideally
1019 */
1020 break;
1021 }
1022 goto do_op;
1023
1024 /* ops where $_ may be an implicit arg */
1025 case OP_TRANS:
1026 case OP_SUBST:
1027 case OP_MATCH:
1028 if ( !(obase->op_flags & OPf_STACKED)) {
1029 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
1030 ? PAD_SVl(obase->op_targ)
1031 : DEFSV))
1032 {
1033 sv = sv_newmortal();
616d8c9c 1034 sv_setpvn(sv, "$_", 2);
29489e7c
DM
1035 return sv;
1036 }
1037 }
1038 goto do_op;
1039
1040 case OP_PRTF:
1041 case OP_PRINT:
1042 /* skip filehandle as it can't produce 'undef' warning */
1043 o = cUNOPx(obase)->op_first;
1044 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
1045 o = o->op_sibling->op_sibling;
1046 goto do_op2;
1047
1048
e21bd382 1049 case OP_RV2SV:
29489e7c
DM
1050 case OP_CUSTOM:
1051 case OP_ENTERSUB:
1052 match = 1; /* XS or custom code could trigger random warnings */
1053 goto do_op;
1054
1055 case OP_SCHOMP:
1056 case OP_CHOMP:
1057 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
1058 return sv_2mortal(newSVpv("${$/}", 0));
1059 /* FALL THROUGH */
1060
1061 default:
1062 do_op:
1063 if (!(obase->op_flags & OPf_KIDS))
1064 break;
1065 o = cUNOPx(obase)->op_first;
1066
1067 do_op2:
1068 if (!o)
1069 break;
1070
1071 /* if all except one arg are constant, or have no side-effects,
1072 * or are optimized away, then it's unambiguous */
1073 o2 = Nullop;
1074 for (kid=o; kid; kid = kid->op_sibling) {
1075 if (kid &&
1076 ( (kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid)))
1077 || (kid->op_type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
1078 || (kid->op_type == OP_PUSHMARK)
1079 )
1080 )
1081 continue;
1082 if (o2) { /* more than one found */
1083 o2 = Nullop;
1084 break;
1085 }
1086 o2 = kid;
1087 }
1088 if (o2)
1089 return find_uninit_var(o2, uninit_sv, match);
1090
1091 /* scan all args */
1092 while (o) {
1093 sv = find_uninit_var(o, uninit_sv, 1);
1094 if (sv)
1095 return sv;
1096 o = o->op_sibling;
1097 }
1098 break;
1099 }
1100 return Nullsv;
1101}
1102
1103
645c22ef
DM
1104/*
1105=for apidoc report_uninit
1106
1107Print appropriate "Use of uninitialized variable" warning
1108
1109=cut
1110*/
1111
1d7c1841 1112void
29489e7c
DM
1113Perl_report_uninit(pTHX_ SV* uninit_sv)
1114{
1115 if (PL_op) {
112dcc46 1116 SV* varname = Nullsv;
29489e7c
DM
1117 if (uninit_sv) {
1118 varname = find_uninit_var(PL_op, uninit_sv,0);
1119 if (varname)
1120 sv_insert(varname, 0, 0, " ", 1);
1121 }
9014280d 1122 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
29489e7c
DM
1123 varname ? SvPV_nolen(varname) : "",
1124 " in ", OP_DESC(PL_op));
1125 }
1d7c1841 1126 else
29489e7c
DM
1127 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
1128 "", "", "");
1d7c1841
GS
1129}
1130
645c22ef
DM
1131/* allocate another arena's worth of NV bodies */
1132
cbe51380 1133STATIC void
cea2e8a9 1134S_more_xnv(pTHX)
463ee0b2 1135{
cac9b346
NC
1136 NV* xnv;
1137 NV* xnvend;
7b2c381c
NC
1138 void *ptr;
1139 New(711, ptr, PERL_ARENA_SIZE/sizeof(NV), NV);
1140 *((void **) ptr) = (void *)PL_xnv_arenaroot;
612f20c3
GS
1141 PL_xnv_arenaroot = ptr;
1142
1143 xnv = (NV*) ptr;
9c17f24a 1144 xnvend = &xnv[PERL_ARENA_SIZE / sizeof(NV) - 1];
65202027 1145 xnv += (sizeof(XPVIV) - 1) / sizeof(NV) + 1; /* fudge by sizeof XPVIV */
3280af22 1146 PL_xnv_root = xnv;
463ee0b2 1147 while (xnv < xnvend) {
65202027 1148 *(NV**)xnv = (NV*)(xnv + 1);
463ee0b2
LW
1149 xnv++;
1150 }
cac9b346
NC
1151 *(NV**)xnv = 0;
1152}
1153
1154/* allocate another arena's worth of struct xpv */
1155
1156STATIC void
1157S_more_xpv(pTHX)
1158{
59813432
NC
1159 xpv_allocated* xpv;
1160 xpv_allocated* xpvend;
1161 New(713, xpv, PERL_ARENA_SIZE/sizeof(xpv_allocated), xpv_allocated);
1162 *((xpv_allocated**)xpv) = PL_xpv_arenaroot;
cac9b346
NC
1163 PL_xpv_arenaroot = xpv;
1164
59813432 1165 xpvend = &xpv[PERL_ARENA_SIZE / sizeof(xpv_allocated) - 1];
cac9b346
NC
1166 PL_xpv_root = ++xpv;
1167 while (xpv < xpvend) {
59813432 1168 *((xpv_allocated**)xpv) = xpv + 1;
cac9b346
NC
1169 xpv++;
1170 }
59813432 1171 *((xpv_allocated**)xpv) = 0;
cac9b346
NC
1172}
1173
1174/* allocate another arena's worth of struct xpviv */
1175
1176STATIC void
1177S_more_xpviv(pTHX)
1178{
311a25d9
NC
1179 xpviv_allocated* xpviv;
1180 xpviv_allocated* xpvivend;
1181 New(713, xpviv, PERL_ARENA_SIZE/sizeof(xpviv_allocated), xpviv_allocated);
1182 *((xpviv_allocated**)xpviv) = PL_xpviv_arenaroot;
cac9b346
NC
1183 PL_xpviv_arenaroot = xpviv;
1184
311a25d9 1185 xpvivend = &xpviv[PERL_ARENA_SIZE / sizeof(xpviv_allocated) - 1];
cac9b346
NC
1186 PL_xpviv_root = ++xpviv;
1187 while (xpviv < xpvivend) {
311a25d9 1188 *((xpviv_allocated**)xpviv) = xpviv + 1;
cac9b346
NC
1189 xpviv++;
1190 }
311a25d9 1191 *((xpviv_allocated**)xpviv) = 0;
cac9b346
NC
1192}
1193
1194/* allocate another arena's worth of struct xpvnv */
1195
1196STATIC void
1197S_more_xpvnv(pTHX)
1198{
1199 XPVNV* xpvnv;
1200 XPVNV* xpvnvend;
1201 New(715, xpvnv, PERL_ARENA_SIZE/sizeof(XPVNV), XPVNV);
7b2c381c 1202 *((XPVNV**)xpvnv) = PL_xpvnv_arenaroot;
cac9b346
NC
1203 PL_xpvnv_arenaroot = xpvnv;
1204
1205 xpvnvend = &xpvnv[PERL_ARENA_SIZE / sizeof(XPVNV) - 1];
1206 PL_xpvnv_root = ++xpvnv;
1207 while (xpvnv < xpvnvend) {
7b2c381c 1208 *((XPVNV**)xpvnv) = xpvnv + 1;
cac9b346
NC
1209 xpvnv++;
1210 }
7b2c381c 1211 *((XPVNV**)xpvnv) = 0;
cac9b346
NC
1212}
1213
1214/* allocate another arena's worth of struct xpvcv */
1215
1216STATIC void
1217S_more_xpvcv(pTHX)
1218{
1219 XPVCV* xpvcv;
1220 XPVCV* xpvcvend;
1221 New(716, xpvcv, PERL_ARENA_SIZE/sizeof(XPVCV), XPVCV);
7b2c381c 1222 *((XPVCV**)xpvcv) = PL_xpvcv_arenaroot;
cac9b346
NC
1223 PL_xpvcv_arenaroot = xpvcv;
1224
1225 xpvcvend = &xpvcv[PERL_ARENA_SIZE / sizeof(XPVCV) - 1];
1226 PL_xpvcv_root = ++xpvcv;
1227 while (xpvcv < xpvcvend) {
7b2c381c 1228 *((XPVCV**)xpvcv) = xpvcv + 1;
cac9b346
NC
1229 xpvcv++;
1230 }
7b2c381c 1231 *((XPVCV**)xpvcv) = 0;
cac9b346
NC
1232}
1233
1234/* allocate another arena's worth of struct xpvav */
1235
1236STATIC void
1237S_more_xpvav(pTHX)
1238{
59813432
NC
1239 xpvav_allocated* xpvav;
1240 xpvav_allocated* xpvavend;
1241 New(717, xpvav, PERL_ARENA_SIZE/sizeof(xpvav_allocated),
1242 xpvav_allocated);
1243 *((xpvav_allocated**)xpvav) = PL_xpvav_arenaroot;
cac9b346
NC
1244 PL_xpvav_arenaroot = xpvav;
1245
59813432 1246 xpvavend = &xpvav[PERL_ARENA_SIZE / sizeof(xpvav_allocated) - 1];
cac9b346
NC
1247 PL_xpvav_root = ++xpvav;
1248 while (xpvav < xpvavend) {
59813432 1249 *((xpvav_allocated**)xpvav) = xpvav + 1;
cac9b346
NC
1250 xpvav++;
1251 }
59813432 1252 *((xpvav_allocated**)xpvav) = 0;
cac9b346
NC
1253}
1254
1255/* allocate another arena's worth of struct xpvhv */
1256
1257STATIC void
1258S_more_xpvhv(pTHX)
1259{
59813432
NC
1260 xpvhv_allocated* xpvhv;
1261 xpvhv_allocated* xpvhvend;
1262 New(718, xpvhv, PERL_ARENA_SIZE/sizeof(xpvhv_allocated),
1263 xpvhv_allocated);
1264 *((xpvhv_allocated**)xpvhv) = PL_xpvhv_arenaroot;
cac9b346
NC
1265 PL_xpvhv_arenaroot = xpvhv;
1266
59813432 1267 xpvhvend = &xpvhv[PERL_ARENA_SIZE / sizeof(xpvhv_allocated) - 1];
cac9b346
NC
1268 PL_xpvhv_root = ++xpvhv;
1269 while (xpvhv < xpvhvend) {
59813432 1270 *((xpvhv_allocated**)xpvhv) = xpvhv + 1;
cac9b346
NC
1271 xpvhv++;
1272 }
59813432 1273 *((xpvhv_allocated**)xpvhv) = 0;
cac9b346
NC
1274}
1275
1276/* allocate another arena's worth of struct xpvmg */
1277
1278STATIC void
1279S_more_xpvmg(pTHX)
1280{
1281 XPVMG* xpvmg;
1282 XPVMG* xpvmgend;
1283 New(719, xpvmg, PERL_ARENA_SIZE/sizeof(XPVMG), XPVMG);
7b2c381c 1284 *((XPVMG**)xpvmg) = PL_xpvmg_arenaroot;
cac9b346
NC
1285 PL_xpvmg_arenaroot = xpvmg;
1286
1287 xpvmgend = &xpvmg[PERL_ARENA_SIZE / sizeof(XPVMG) - 1];
1288 PL_xpvmg_root = ++xpvmg;
1289 while (xpvmg < xpvmgend) {
7b2c381c 1290 *((XPVMG**)xpvmg) = xpvmg + 1;
cac9b346
NC
1291 xpvmg++;
1292 }
7b2c381c 1293 *((XPVMG**)xpvmg) = 0;
cac9b346
NC
1294}
1295
1296/* allocate another arena's worth of struct xpvgv */
1297
1298STATIC void
1299S_more_xpvgv(pTHX)
1300{
1301 XPVGV* xpvgv;
1302 XPVGV* xpvgvend;
1303 New(720, xpvgv, PERL_ARENA_SIZE/sizeof(XPVGV), XPVGV);
7b2c381c 1304 *((XPVGV**)xpvgv) = PL_xpvgv_arenaroot;
cac9b346
NC
1305 PL_xpvgv_arenaroot = xpvgv;
1306
1307 xpvgvend = &xpvgv[PERL_ARENA_SIZE / sizeof(XPVGV) - 1];
1308 PL_xpvgv_root = ++xpvgv;
1309 while (xpvgv < xpvgvend) {
7b2c381c 1310 *((XPVGV**)xpvgv) = xpvgv + 1;
cac9b346
NC
1311 xpvgv++;
1312 }
7b2c381c 1313 *((XPVGV**)xpvgv) = 0;
cac9b346
NC
1314}
1315
1316/* allocate another arena's worth of struct xpvlv */
1317
1318STATIC void
1319S_more_xpvlv(pTHX)
1320{
1321 XPVLV* xpvlv;
1322 XPVLV* xpvlvend;
1323 New(720, xpvlv, PERL_ARENA_SIZE/sizeof(XPVLV), XPVLV);
7b2c381c 1324 *((XPVLV**)xpvlv) = PL_xpvlv_arenaroot;
cac9b346
NC
1325 PL_xpvlv_arenaroot = xpvlv;
1326
1327 xpvlvend = &xpvlv[PERL_ARENA_SIZE / sizeof(XPVLV) - 1];
1328 PL_xpvlv_root = ++xpvlv;
1329 while (xpvlv < xpvlvend) {
7b2c381c 1330 *((XPVLV**)xpvlv) = xpvlv + 1;
cac9b346
NC
1331 xpvlv++;
1332 }
7b2c381c 1333 *((XPVLV**)xpvlv) = 0;
cac9b346
NC
1334}
1335
1336/* allocate another arena's worth of struct xpvbm */
1337
1338STATIC void
1339S_more_xpvbm(pTHX)
1340{
1341 XPVBM* xpvbm;
1342 XPVBM* xpvbmend;
1343 New(721, xpvbm, PERL_ARENA_SIZE/sizeof(XPVBM), XPVBM);
7b2c381c 1344 *((XPVBM**)xpvbm) = PL_xpvbm_arenaroot;
cac9b346
NC
1345 PL_xpvbm_arenaroot = xpvbm;
1346
1347 xpvbmend = &xpvbm[PERL_ARENA_SIZE / sizeof(XPVBM) - 1];
1348 PL_xpvbm_root = ++xpvbm;
1349 while (xpvbm < xpvbmend) {
7b2c381c 1350 *((XPVBM**)xpvbm) = xpvbm + 1;
cac9b346
NC
1351 xpvbm++;
1352 }
7b2c381c 1353 *((XPVBM**)xpvbm) = 0;
cac9b346 1354}
612f20c3 1355
cac9b346
NC
1356/* grab a new NV body from the free list, allocating more if necessary */
1357
1358STATIC XPVNV*
1359S_new_xnv(pTHX)
1360{
1361 NV* xnv;
1362 LOCK_SV_MUTEX;
1363 if (!PL_xnv_root)
1364 S_more_xnv(aTHX);
1365 xnv = PL_xnv_root;
1366 PL_xnv_root = *(NV**)xnv;
1367 UNLOCK_SV_MUTEX;
1368 return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
1369}
1370
1371/* return an NV body to the free list */
1372
1373STATIC void
1374S_del_xnv(pTHX_ XPVNV *p)
1375{
1376 NV* xnv = (NV*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
1377 LOCK_SV_MUTEX;
1378 *(NV**)xnv = PL_xnv_root;
1379 PL_xnv_root = xnv;
1380 UNLOCK_SV_MUTEX;
ed6116ce
LW
1381}
1382
645c22ef
DM
1383/* grab a new struct xpv from the free list, allocating more if necessary */
1384
76e3520e 1385STATIC XPV*
cea2e8a9 1386S_new_xpv(pTHX)
463ee0b2 1387{
59813432 1388 xpv_allocated* xpv;
cbe51380
GS
1389 LOCK_SV_MUTEX;
1390 if (!PL_xpv_root)
cac9b346 1391 S_more_xpv(aTHX);
cbe51380 1392 xpv = PL_xpv_root;
59813432 1393 PL_xpv_root = *(xpv_allocated**)xpv;
cbe51380 1394 UNLOCK_SV_MUTEX;
59813432
NC
1395 /* If xpv_allocated is the same structure as XPV then the two OFFSETs
1396 sum to zero, and the pointer is unchanged. If the allocated structure
1397 is smaller (no initial IV actually allocated) then the net effect is
1398 to subtract the size of the IV from the pointer, to return a new pointer
1399 as if an initial IV were actually allocated. */
1400 return (XPV*)((char*)xpv - STRUCT_OFFSET(XPV, xpv_cur)
1401 + STRUCT_OFFSET(xpv_allocated, xpv_cur));
463ee0b2
LW
1402}
1403
645c22ef
DM
1404/* return a struct xpv to the free list */
1405
76e3520e 1406STATIC void
cea2e8a9 1407S_del_xpv(pTHX_ XPV *p)
463ee0b2 1408{
59813432
NC
1409 xpv_allocated* xpv
1410 = (xpv_allocated*)((char*)(p) + STRUCT_OFFSET(XPV, xpv_cur)
1411 - STRUCT_OFFSET(xpv_allocated, xpv_cur));
cbe51380 1412 LOCK_SV_MUTEX;
59813432
NC
1413 *(xpv_allocated**)xpv = PL_xpv_root;
1414 PL_xpv_root = xpv;
cbe51380 1415 UNLOCK_SV_MUTEX;
463ee0b2
LW
1416}
1417
645c22ef
DM
1418/* grab a new struct xpviv from the free list, allocating more if necessary */
1419
932e9ff9
VB
1420STATIC XPVIV*
1421S_new_xpviv(pTHX)
1422{
311a25d9 1423 xpviv_allocated* xpviv;
932e9ff9
VB
1424 LOCK_SV_MUTEX;
1425 if (!PL_xpviv_root)
cac9b346 1426 S_more_xpviv(aTHX);
932e9ff9 1427 xpviv = PL_xpviv_root;
311a25d9 1428 PL_xpviv_root = *(xpviv_allocated**)xpviv;
932e9ff9 1429 UNLOCK_SV_MUTEX;
311a25d9
NC
1430 /* If xpviv_allocated is the same structure as XPVIV then the two OFFSETs
1431 sum to zero, and the pointer is unchanged. If the allocated structure
1432 is smaller (no initial IV actually allocated) then the net effect is
1433 to subtract the size of the IV from the pointer, to return a new pointer
1434 as if an initial IV were actually allocated. */
1435 return (XPVIV*)((char*)xpviv - STRUCT_OFFSET(XPVIV, xpv_cur)
1436 + STRUCT_OFFSET(xpviv_allocated, xpv_cur));
932e9ff9
VB
1437}
1438
645c22ef
DM
1439/* return a struct xpviv to the free list */
1440
932e9ff9
VB
1441STATIC void
1442S_del_xpviv(pTHX_ XPVIV *p)
1443{
311a25d9
NC
1444 xpviv_allocated* xpviv
1445 = (xpviv_allocated*)((char*)(p) + STRUCT_OFFSET(XPVIV, xpv_cur)
1446 - STRUCT_OFFSET(xpviv_allocated, xpv_cur));
932e9ff9 1447 LOCK_SV_MUTEX;
311a25d9
NC
1448 *(xpviv_allocated**)xpviv = PL_xpviv_root;
1449 PL_xpviv_root = xpviv;
932e9ff9
VB
1450 UNLOCK_SV_MUTEX;
1451}
1452
645c22ef
DM
1453/* grab a new struct xpvnv from the free list, allocating more if necessary */
1454
932e9ff9
VB
1455STATIC XPVNV*
1456S_new_xpvnv(pTHX)
1457{
1458 XPVNV* xpvnv;
1459 LOCK_SV_MUTEX;
1460 if (!PL_xpvnv_root)
cac9b346 1461 S_more_xpvnv(aTHX);
932e9ff9 1462 xpvnv = PL_xpvnv_root;
7b2c381c 1463 PL_xpvnv_root = *(XPVNV**)xpvnv;
932e9ff9
VB
1464 UNLOCK_SV_MUTEX;
1465 return xpvnv;
1466}
1467
645c22ef
DM
1468/* return a struct xpvnv to the free list */
1469
932e9ff9
VB
1470STATIC void
1471S_del_xpvnv(pTHX_ XPVNV *p)
1472{
1473 LOCK_SV_MUTEX;
7b2c381c 1474 *(XPVNV**)p = PL_xpvnv_root;
932e9ff9
VB
1475 PL_xpvnv_root = p;
1476 UNLOCK_SV_MUTEX;
1477}
1478
645c22ef
DM
1479/* grab a new struct xpvcv from the free list, allocating more if necessary */
1480
932e9ff9
VB
1481STATIC XPVCV*
1482S_new_xpvcv(pTHX)
1483{
1484 XPVCV* xpvcv;
1485 LOCK_SV_MUTEX;
1486 if (!PL_xpvcv_root)
cac9b346 1487 S_more_xpvcv(aTHX);
932e9ff9 1488 xpvcv = PL_xpvcv_root;
7b2c381c 1489 PL_xpvcv_root = *(XPVCV**)xpvcv;
932e9ff9
VB
1490 UNLOCK_SV_MUTEX;
1491 return xpvcv;
1492}
1493
645c22ef
DM
1494/* return a struct xpvcv to the free list */
1495
932e9ff9
VB
1496STATIC void
1497S_del_xpvcv(pTHX_ XPVCV *p)
1498{
1499 LOCK_SV_MUTEX;
7b2c381c 1500 *(XPVCV**)p = PL_xpvcv_root;
932e9ff9
VB
1501 PL_xpvcv_root = p;
1502 UNLOCK_SV_MUTEX;
1503}
1504
645c22ef
DM
1505/* grab a new struct xpvav from the free list, allocating more if necessary */
1506
932e9ff9
VB
1507STATIC XPVAV*
1508S_new_xpvav(pTHX)
1509{
59813432 1510 xpvav_allocated* xpvav;
932e9ff9
VB
1511 LOCK_SV_MUTEX;
1512 if (!PL_xpvav_root)
cac9b346 1513 S_more_xpvav(aTHX);
932e9ff9 1514 xpvav = PL_xpvav_root;
59813432 1515 PL_xpvav_root = *(xpvav_allocated**)xpvav;
932e9ff9 1516 UNLOCK_SV_MUTEX;
59813432
NC
1517 return (XPVAV*)((char*)xpvav - STRUCT_OFFSET(XPVAV, xav_fill)
1518 + STRUCT_OFFSET(xpvav_allocated, xav_fill));
932e9ff9
VB
1519}
1520
645c22ef
DM
1521/* return a struct xpvav to the free list */
1522
932e9ff9
VB
1523STATIC void
1524S_del_xpvav(pTHX_ XPVAV *p)
1525{
59813432
NC
1526 xpvav_allocated* xpvav
1527 = (xpvav_allocated*)((char*)(p) + STRUCT_OFFSET(XPVAV, xav_fill)
1528 - STRUCT_OFFSET(xpvav_allocated, xav_fill));
932e9ff9 1529 LOCK_SV_MUTEX;
59813432
NC
1530 *(xpvav_allocated**)xpvav = PL_xpvav_root;
1531 PL_xpvav_root = xpvav;
932e9ff9
VB
1532 UNLOCK_SV_MUTEX;
1533}
1534
645c22ef
DM
1535/* grab a new struct xpvhv from the free list, allocating more if necessary */
1536
932e9ff9
VB
1537STATIC XPVHV*
1538S_new_xpvhv(pTHX)
1539{
59813432 1540 xpvhv_allocated* xpvhv;
932e9ff9
VB
1541 LOCK_SV_MUTEX;
1542 if (!PL_xpvhv_root)
cac9b346 1543 S_more_xpvhv(aTHX);
932e9ff9 1544 xpvhv = PL_xpvhv_root;
59813432 1545 PL_xpvhv_root = *(xpvhv_allocated**)xpvhv;
932e9ff9 1546 UNLOCK_SV_MUTEX;
59813432
NC
1547 return (XPVHV*)((char*)xpvhv - STRUCT_OFFSET(XPVHV, xhv_fill)
1548 + STRUCT_OFFSET(xpvhv_allocated, xhv_fill));
932e9ff9
VB
1549}
1550
645c22ef
DM
1551/* return a struct xpvhv to the free list */
1552
932e9ff9
VB
1553STATIC void
1554S_del_xpvhv(pTHX_ XPVHV *p)
1555{
59813432
NC
1556 xpvhv_allocated* xpvhv
1557 = (xpvhv_allocated*)((char*)(p) + STRUCT_OFFSET(XPVHV, xhv_fill)
1558 - STRUCT_OFFSET(xpvhv_allocated, xhv_fill));
932e9ff9 1559 LOCK_SV_MUTEX;
59813432
NC
1560 *(xpvhv_allocated**)xpvhv = PL_xpvhv_root;
1561 PL_xpvhv_root = xpvhv;
932e9ff9
VB
1562 UNLOCK_SV_MUTEX;
1563}
1564
645c22ef
DM
1565/* grab a new struct xpvmg from the free list, allocating more if necessary */
1566
932e9ff9
VB
1567STATIC XPVMG*
1568S_new_xpvmg(pTHX)
1569{
1570 XPVMG* xpvmg;
1571 LOCK_SV_MUTEX;
1572 if (!PL_xpvmg_root)
cac9b346 1573 S_more_xpvmg(aTHX);
932e9ff9 1574 xpvmg = PL_xpvmg_root;
7b2c381c 1575 PL_xpvmg_root = *(XPVMG**)xpvmg;
932e9ff9
VB
1576 UNLOCK_SV_MUTEX;
1577 return xpvmg;
1578}
1579
645c22ef
DM
1580/* return a struct xpvmg to the free list */
1581
932e9ff9
VB
1582STATIC void
1583S_del_xpvmg(pTHX_ XPVMG *p)
1584{
1585 LOCK_SV_MUTEX;
7b2c381c 1586 *(XPVMG**)p = PL_xpvmg_root;
932e9ff9
VB
1587 PL_xpvmg_root = p;
1588 UNLOCK_SV_MUTEX;
1589}
1590
727879eb
NC
1591/* grab a new struct xpvgv from the free list, allocating more if necessary */
1592
1593STATIC XPVGV*
1594S_new_xpvgv(pTHX)
1595{
1596 XPVGV* xpvgv;
1597 LOCK_SV_MUTEX;
1598 if (!PL_xpvgv_root)
cac9b346 1599 S_more_xpvgv(aTHX);
727879eb 1600 xpvgv = PL_xpvgv_root;
7b2c381c 1601 PL_xpvgv_root = *(XPVGV**)xpvgv;
727879eb
NC
1602 UNLOCK_SV_MUTEX;
1603 return xpvgv;
1604}
1605
1606/* return a struct xpvgv to the free list */
1607
1608STATIC void
1609S_del_xpvgv(pTHX_ XPVGV *p)
1610{
1611 LOCK_SV_MUTEX;
7b2c381c 1612 *(XPVGV**)p = PL_xpvgv_root;
727879eb
NC
1613 PL_xpvgv_root = p;
1614 UNLOCK_SV_MUTEX;
1615}
1616
645c22ef
DM
1617/* grab a new struct xpvlv from the free list, allocating more if necessary */
1618
932e9ff9
VB
1619STATIC XPVLV*
1620S_new_xpvlv(pTHX)
1621{
1622 XPVLV* xpvlv;
1623 LOCK_SV_MUTEX;
1624 if (!PL_xpvlv_root)
cac9b346 1625 S_more_xpvlv(aTHX);
932e9ff9 1626 xpvlv = PL_xpvlv_root;
7b2c381c 1627 PL_xpvlv_root = *(XPVLV**)xpvlv;
932e9ff9
VB
1628 UNLOCK_SV_MUTEX;
1629 return xpvlv;
1630}
1631
645c22ef
DM
1632/* return a struct xpvlv to the free list */
1633
932e9ff9
VB
1634STATIC void
1635S_del_xpvlv(pTHX_ XPVLV *p)
1636{
1637 LOCK_SV_MUTEX;
7b2c381c 1638 *(XPVLV**)p = PL_xpvlv_root;
932e9ff9
VB
1639 PL_xpvlv_root = p;
1640 UNLOCK_SV_MUTEX;
1641}
1642
645c22ef
DM
1643/* grab a new struct xpvbm from the free list, allocating more if necessary */
1644
932e9ff9
VB
1645STATIC XPVBM*
1646S_new_xpvbm(pTHX)
1647{
1648 XPVBM* xpvbm;
1649 LOCK_SV_MUTEX;
1650 if (!PL_xpvbm_root)
cac9b346 1651 S_more_xpvbm(aTHX);
932e9ff9 1652 xpvbm = PL_xpvbm_root;
7b2c381c 1653 PL_xpvbm_root = *(XPVBM**)xpvbm;
932e9ff9
VB
1654 UNLOCK_SV_MUTEX;
1655 return xpvbm;
1656}
1657
645c22ef
DM
1658/* return a struct xpvbm to the free list */
1659
932e9ff9
VB
1660STATIC void
1661S_del_xpvbm(pTHX_ XPVBM *p)
1662{
1663 LOCK_SV_MUTEX;
7b2c381c 1664 *(XPVBM**)p = PL_xpvbm_root;
932e9ff9
VB
1665 PL_xpvbm_root = p;
1666 UNLOCK_SV_MUTEX;
1667}
1668
7bab3ede
MB
1669#define my_safemalloc(s) (void*)safemalloc(s)
1670#define my_safefree(p) safefree((char*)p)
463ee0b2 1671
d33b2eba 1672#ifdef PURIFY
463ee0b2 1673
d33b2eba
GS
1674#define new_XNV() my_safemalloc(sizeof(XPVNV))
1675#define del_XNV(p) my_safefree(p)
463ee0b2 1676
d33b2eba
GS
1677#define new_XPV() my_safemalloc(sizeof(XPV))
1678#define del_XPV(p) my_safefree(p)
9b94d1dd 1679
d33b2eba
GS
1680#define new_XPVIV() my_safemalloc(sizeof(XPVIV))
1681#define del_XPVIV(p) my_safefree(p)
932e9ff9 1682
d33b2eba
GS
1683#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
1684#define del_XPVNV(p) my_safefree(p)
932e9ff9 1685
d33b2eba
GS
1686#define new_XPVCV() my_safemalloc(sizeof(XPVCV))
1687#define del_XPVCV(p) my_safefree(p)
932e9ff9 1688
d33b2eba
GS
1689#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
1690#define del_XPVAV(p) my_safefree(p)
1691
1692#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
1693#define del_XPVHV(p) my_safefree(p)
1c846c1f 1694
d33b2eba
GS
1695#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
1696#define del_XPVMG(p) my_safefree(p)
1697
727879eb
NC
1698#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
1699#define del_XPVGV(p) my_safefree(p)
1700
d33b2eba
GS
1701#define new_XPVLV() my_safemalloc(sizeof(XPVLV))
1702#define del_XPVLV(p) my_safefree(p)
1703
1704#define new_XPVBM() my_safemalloc(sizeof(XPVBM))
1705#define del_XPVBM(p) my_safefree(p)
1706
1707#else /* !PURIFY */
1708
d33b2eba
GS
1709#define new_XNV() (void*)new_xnv()
1710#define del_XNV(p) del_xnv((XPVNV*) p)
9b94d1dd 1711
d33b2eba
GS
1712#define new_XPV() (void*)new_xpv()
1713#define del_XPV(p) del_xpv((XPV *)p)
1714
1715#define new_XPVIV() (void*)new_xpviv()
1716#define del_XPVIV(p) del_xpviv((XPVIV *)p)
1717
1718#define new_XPVNV() (void*)new_xpvnv()
1719#define del_XPVNV(p) del_xpvnv((XPVNV *)p)
1720
1721#define new_XPVCV() (void*)new_xpvcv()
1722#define del_XPVCV(p) del_xpvcv((XPVCV *)p)
1723
1724#define new_XPVAV() (void*)new_xpvav()
1725#define del_XPVAV(p) del_xpvav((XPVAV *)p)
1726
1727#define new_XPVHV() (void*)new_xpvhv()
1728#define del_XPVHV(p) del_xpvhv((XPVHV *)p)
1c846c1f 1729
d33b2eba
GS
1730#define new_XPVMG() (void*)new_xpvmg()
1731#define del_XPVMG(p) del_xpvmg((XPVMG *)p)
1732
727879eb
NC
1733#define new_XPVGV() (void*)new_xpvgv()
1734#define del_XPVGV(p) del_xpvgv((XPVGV *)p)
1735
d33b2eba
GS
1736#define new_XPVLV() (void*)new_xpvlv()
1737#define del_XPVLV(p) del_xpvlv((XPVLV *)p)
1738
1739#define new_XPVBM() (void*)new_xpvbm()
1740#define del_XPVBM(p) del_xpvbm((XPVBM *)p)
1741
1742#endif /* PURIFY */
9b94d1dd 1743
d33b2eba
GS
1744#define new_XPVFM() my_safemalloc(sizeof(XPVFM))
1745#define del_XPVFM(p) my_safefree(p)
1c846c1f 1746
d33b2eba
GS
1747#define new_XPVIO() my_safemalloc(sizeof(XPVIO))
1748#define del_XPVIO(p) my_safefree(p)
8990e307 1749
954c1994
GS
1750/*
1751=for apidoc sv_upgrade
1752
ff276b08 1753Upgrade an SV to a more complex form. Generally adds a new body type to the
645c22ef 1754SV, then copies across as much information as possible from the old body.
ff276b08 1755You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
954c1994
GS
1756
1757=cut
1758*/
1759
79072805 1760bool
864dbfa3 1761Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
79072805 1762{
e763e3dc 1763
d2e56290
NC
1764 char* pv;
1765 U32 cur;
1766 U32 len;
1767 IV iv;
1768 NV nv;
1769 MAGIC* magic;
1770 HV* stash;
79072805 1771
765f542d
NC
1772 if (mt != SVt_PV && SvIsCOW(sv)) {
1773 sv_force_normal_flags(sv, 0);
f130fd45
NIS
1774 }
1775
79072805
LW
1776 if (SvTYPE(sv) == mt)
1777 return TRUE;
1778
d2e56290
NC
1779 pv = NULL;
1780 cur = 0;
1781 len = 0;
1782 iv = 0;
1783 nv = 0.0;
1784 magic = NULL;
1785 stash = Nullhv;
1786
79072805
LW
1787 switch (SvTYPE(sv)) {
1788 case SVt_NULL:
79072805 1789 break;
79072805 1790 case SVt_IV:
463ee0b2 1791 iv = SvIVX(sv);
ed6116ce 1792 if (mt == SVt_NV)
463ee0b2 1793 mt = SVt_PVNV;
ed6116ce
LW
1794 else if (mt < SVt_PVIV)
1795 mt = SVt_PVIV;
79072805
LW
1796 break;
1797 case SVt_NV:
463ee0b2 1798 nv = SvNVX(sv);
79072805 1799 del_XNV(SvANY(sv));
ed6116ce 1800 if (mt < SVt_PVNV)
79072805
LW
1801 mt = SVt_PVNV;
1802 break;
ed6116ce
LW
1803 case SVt_RV:
1804 pv = (char*)SvRV(sv);
ed6116ce 1805 break;
79072805 1806 case SVt_PV:
463ee0b2 1807 pv = SvPVX(sv);
79072805
LW
1808 cur = SvCUR(sv);
1809 len = SvLEN(sv);
79072805 1810 del_XPV(SvANY(sv));
748a9306
LW
1811 if (mt <= SVt_IV)
1812 mt = SVt_PVIV;
1813 else if (mt == SVt_NV)
1814 mt = SVt_PVNV;
79072805
LW
1815 break;
1816 case SVt_PVIV:
463ee0b2 1817 pv = SvPVX(sv);
79072805
LW
1818 cur = SvCUR(sv);
1819 len = SvLEN(sv);
463ee0b2 1820 iv = SvIVX(sv);
79072805
LW
1821 del_XPVIV(SvANY(sv));
1822 break;
1823 case SVt_PVNV:
463ee0b2 1824 pv = SvPVX(sv);
79072805
LW
1825 cur = SvCUR(sv);
1826 len = SvLEN(sv);
463ee0b2
LW
1827 iv = SvIVX(sv);
1828 nv = SvNVX(sv);
79072805
LW
1829 del_XPVNV(SvANY(sv));
1830 break;
1831 case SVt_PVMG:
0ec50a73
NC
1832 /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1833 there's no way that it can be safely upgraded, because perl.c
1834 expects to Safefree(SvANY(PL_mess_sv)) */
1835 assert(sv != PL_mess_sv);
bce8f412
NC
1836 /* This flag bit is used to mean other things in other scalar types.
1837 Given that it only has meaning inside the pad, it shouldn't be set
1838 on anything that can get upgraded. */
1839 assert((SvFLAGS(sv) & SVpad_TYPED) == 0);
463ee0b2 1840 pv = SvPVX(sv);
79072805
LW
1841 cur = SvCUR(sv);
1842 len = SvLEN(sv);
463ee0b2
LW
1843 iv = SvIVX(sv);
1844 nv = SvNVX(sv);
79072805
LW
1845 magic = SvMAGIC(sv);
1846 stash = SvSTASH(sv);
1847 del_XPVMG(SvANY(sv));
1848 break;
1849 default:
cea2e8a9 1850 Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
79072805
LW
1851 }
1852
ffb05e06
NC
1853 SvFLAGS(sv) &= ~SVTYPEMASK;
1854 SvFLAGS(sv) |= mt;
1855
79072805
LW
1856 switch (mt) {
1857 case SVt_NULL:
cea2e8a9 1858 Perl_croak(aTHX_ "Can't upgrade to undef");
79072805 1859 case SVt_IV:
339049b0 1860 SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
45977657 1861 SvIV_set(sv, iv);
79072805
LW
1862 break;
1863 case SVt_NV:
1864 SvANY(sv) = new_XNV();
9d6ce603 1865 SvNV_set(sv, nv);
79072805 1866 break;
ed6116ce 1867 case SVt_RV:
339049b0 1868 SvANY(sv) = &sv->sv_u.svu_rv;
b162af07 1869 SvRV_set(sv, (SV*)pv);
ed6116ce 1870 break;
79072805
LW
1871 case SVt_PVHV:
1872 SvANY(sv) = new_XPVHV();
463ee0b2
LW
1873 HvFILL(sv) = 0;
1874 HvMAX(sv) = 0;
8aacddc1 1875 HvTOTALKEYS(sv) = 0;
bd4b1eb5
NC
1876
1877 /* Fall through... */
1878 if (0) {
1879 case SVt_PVAV:
1880 SvANY(sv) = new_XPVAV();
1881 AvMAX(sv) = -1;
1882 AvFILLp(sv) = -1;
1883 AvALLOC(sv) = 0;
11ca45c0 1884 AvREAL_only(sv);
bd4b1eb5
NC
1885 }
1886 /* to here. */
c2bfdfaf
NC
1887 /* XXX? Only SVt_NULL is ever upgraded to AV or HV? */
1888 assert(!pv);
8bd4d4c5
NC
1889 /* FIXME. Should be able to remove all this if()... if the above
1890 assertion is genuinely always true. */
1891 if(SvOOK(sv)) {
1892 pv -= iv;
1893 SvFLAGS(sv) &= ~SVf_OOK;
1894 }
1895 Safefree(pv);
bd4b1eb5 1896 SvPV_set(sv, (char*)0);
b162af07
SP
1897 SvMAGIC_set(sv, magic);
1898 SvSTASH_set(sv, stash);
79072805 1899 break;
bd4b1eb5
NC
1900
1901 case SVt_PVIO:
1902 SvANY(sv) = new_XPVIO();
1903 Zero(SvANY(sv), 1, XPVIO);
1904 IoPAGE_LEN(sv) = 60;
1905 goto set_magic_common;
1906 case SVt_PVFM:
1907 SvANY(sv) = new_XPVFM();
1908 Zero(SvANY(sv), 1, XPVFM);
1909 goto set_magic_common;
1910 case SVt_PVBM:
1911 SvANY(sv) = new_XPVBM();
1912 BmRARE(sv) = 0;
1913 BmUSEFUL(sv) = 0;
1914 BmPREVIOUS(sv) = 0;
1915 goto set_magic_common;
1916 case SVt_PVGV:
1917 SvANY(sv) = new_XPVGV();
1918 GvGP(sv) = 0;
1919 GvNAME(sv) = 0;
1920 GvNAMELEN(sv) = 0;
1921 GvSTASH(sv) = 0;
1922 GvFLAGS(sv) = 0;
1923 goto set_magic_common;
79072805
LW
1924 case SVt_PVCV:
1925 SvANY(sv) = new_XPVCV();
748a9306 1926 Zero(SvANY(sv), 1, XPVCV);
bd4b1eb5
NC
1927 goto set_magic_common;
1928 case SVt_PVLV:
1929 SvANY(sv) = new_XPVLV();
1930 LvTARGOFF(sv) = 0;
1931 LvTARGLEN(sv) = 0;
1932 LvTARG(sv) = 0;
1933 LvTYPE(sv) = 0;
93a17b20 1934 GvGP(sv) = 0;
79072805
LW
1935 GvNAME(sv) = 0;
1936 GvNAMELEN(sv) = 0;
1937 GvSTASH(sv) = 0;
a5f75d66 1938 GvFLAGS(sv) = 0;
bd4b1eb5
NC
1939 /* Fall through. */
1940 if (0) {
1941 case SVt_PVMG:
1942 SvANY(sv) = new_XPVMG();
1943 }
1944 set_magic_common:
b162af07
SP
1945 SvMAGIC_set(sv, magic);
1946 SvSTASH_set(sv, stash);
bd4b1eb5
NC
1947 /* Fall through. */
1948 if (0) {
1949 case SVt_PVNV:
1950 SvANY(sv) = new_XPVNV();
1951 }
9d6ce603 1952 SvNV_set(sv, nv);
bd4b1eb5
NC
1953 /* Fall through. */
1954 if (0) {
1955 case SVt_PVIV:
1956 SvANY(sv) = new_XPVIV();
1957 if (SvNIOK(sv))
1958 (void)SvIOK_on(sv);
1959 SvNOK_off(sv);
1960 }
1961 SvIV_set(sv, iv);
1962 /* Fall through. */
1963 if (0) {
1964 case SVt_PV:
1965 SvANY(sv) = new_XPV();
1966 }
f880fe2f 1967 SvPV_set(sv, pv);
b162af07
SP
1968 SvCUR_set(sv, cur);
1969 SvLEN_set(sv, len);
8990e307
LW
1970 break;
1971 }
79072805
LW
1972 return TRUE;
1973}
1974
645c22ef
DM
1975/*
1976=for apidoc sv_backoff
1977
1978Remove any string offset. You should normally use the C<SvOOK_off> macro
1979wrapper instead.
1980
1981=cut
1982*/
1983
79072805 1984int
864dbfa3 1985Perl_sv_backoff(pTHX_ register SV *sv)
79072805
LW
1986{
1987 assert(SvOOK(sv));
b79f7545
NC
1988 assert(SvTYPE(sv) != SVt_PVHV);
1989 assert(SvTYPE(sv) != SVt_PVAV);
463ee0b2 1990 if (SvIVX(sv)) {
3f7c398e 1991 const char *s = SvPVX_const(sv);
b162af07 1992 SvLEN_set(sv, SvLEN(sv) + SvIVX(sv));
f880fe2f 1993 SvPV_set(sv, SvPVX(sv) - SvIVX(sv));
79072805 1994 SvIV_set(sv, 0);
463ee0b2 1995 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
79072805
LW
1996 }
1997 SvFLAGS(sv) &= ~SVf_OOK;
a0d0e21e 1998 return 0;
79072805
LW
1999}
2000
954c1994
GS
2001/*
2002=for apidoc sv_grow
2003
645c22ef
DM
2004Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
2005upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
2006Use the C<SvGROW> wrapper instead.
954c1994
GS
2007
2008=cut
2009*/
2010
79072805 2011char *
864dbfa3 2012Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
79072805
LW
2013{
2014 register char *s;
2015
55497cff 2016#ifdef HAS_64K_LIMIT
79072805 2017 if (newlen >= 0x10000) {
1d7c1841
GS
2018 PerlIO_printf(Perl_debug_log,
2019 "Allocation too large: %"UVxf"\n", (UV)newlen);
79072805
LW
2020 my_exit(1);
2021 }
55497cff 2022#endif /* HAS_64K_LIMIT */
a0d0e21e
LW
2023 if (SvROK(sv))
2024 sv_unref(sv);
79072805
LW
2025 if (SvTYPE(sv) < SVt_PV) {
2026 sv_upgrade(sv, SVt_PV);
463ee0b2 2027 s = SvPVX(sv);
79072805
LW
2028 }
2029 else if (SvOOK(sv)) { /* pv is offset? */
2030 sv_backoff(sv);
463ee0b2 2031 s = SvPVX(sv);
79072805
LW
2032 if (newlen > SvLEN(sv))
2033 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
c6f8c383
GA
2034#ifdef HAS_64K_LIMIT
2035 if (newlen >= 0x10000)
2036 newlen = 0xFFFF;
2037#endif
79072805 2038 }
bc44a8a2 2039 else
463ee0b2 2040 s = SvPVX(sv);
54f0641b 2041
79072805 2042 if (newlen > SvLEN(sv)) { /* need more room? */
7a9b70e9 2043 newlen = PERL_STRLEN_ROUNDUP(newlen);
8d6dde3e 2044 if (SvLEN(sv) && s) {
7bab3ede 2045#ifdef MYMALLOC
a3b680e6 2046 const STRLEN l = malloced_size((void*)SvPVX(sv));
8d6dde3e
IZ
2047 if (newlen <= l) {
2048 SvLEN_set(sv, l);
2049 return s;
2050 } else
c70c8a0a 2051#endif
1936d2a7 2052 s = saferealloc(s, newlen);
8d6dde3e 2053 }
bfed75c6 2054 else {
1936d2a7 2055 s = safemalloc(newlen);
3f7c398e
SP
2056 if (SvPVX_const(sv) && SvCUR(sv)) {
2057 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
40565179 2058 }
4e83176d 2059 }
79072805 2060 SvPV_set(sv, s);
e1ec3a88 2061 SvLEN_set(sv, newlen);
79072805
LW
2062 }
2063 return s;
2064}
2065
954c1994
GS
2066/*
2067=for apidoc sv_setiv
2068
645c22ef
DM
2069Copies an integer into the given SV, upgrading first if necessary.
2070Does not handle 'set' magic. See also C<sv_setiv_mg>.
954c1994
GS
2071
2072=cut
2073*/
2074
79072805 2075void
864dbfa3 2076Perl_sv_setiv(pTHX_ register SV *sv, IV i)
79072805 2077{
765f542d 2078 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2
LW
2079 switch (SvTYPE(sv)) {
2080 case SVt_NULL:
79072805 2081 sv_upgrade(sv, SVt_IV);
463ee0b2
LW
2082 break;
2083 case SVt_NV:
2084 sv_upgrade(sv, SVt_PVNV);
2085 break;
ed6116ce 2086 case SVt_RV:
463ee0b2 2087 case SVt_PV:
79072805 2088 sv_upgrade(sv, SVt_PVIV);
463ee0b2 2089 break;
a0d0e21e
LW
2090
2091 case SVt_PVGV:
a0d0e21e
LW
2092 case SVt_PVAV:
2093 case SVt_PVHV:
2094 case SVt_PVCV:
2095 case SVt_PVFM:
2096 case SVt_PVIO:
411caa50 2097 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
53e06cf0 2098 OP_DESC(PL_op));
463ee0b2 2099 }
a0d0e21e 2100 (void)SvIOK_only(sv); /* validate number */
45977657 2101 SvIV_set(sv, i);
463ee0b2 2102 SvTAINT(sv);
79072805
LW
2103}
2104
954c1994
GS
2105/*
2106=for apidoc sv_setiv_mg
2107
2108Like C<sv_setiv>, but also handles 'set' magic.
2109
2110=cut
2111*/
2112
79072805 2113void
864dbfa3 2114Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
ef50df4b
GS
2115{
2116 sv_setiv(sv,i);
2117 SvSETMAGIC(sv);
2118}
2119
954c1994
GS
2120/*
2121=for apidoc sv_setuv
2122
645c22ef
DM
2123Copies an unsigned integer into the given SV, upgrading first if necessary.
2124Does not handle 'set' magic. See also C<sv_setuv_mg>.
954c1994
GS
2125
2126=cut
2127*/
2128
ef50df4b 2129void
864dbfa3 2130Perl_sv_setuv(pTHX_ register SV *sv, UV u)
55497cff 2131{
55ada374
NC
2132 /* With these two if statements:
2133 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 2134
55ada374
NC
2135 without
2136 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 2137
55ada374
NC
2138 If you wish to remove them, please benchmark to see what the effect is
2139 */
28e5dec8
JH
2140 if (u <= (UV)IV_MAX) {
2141 sv_setiv(sv, (IV)u);
2142 return;
2143 }
25da4f38
IZ
2144 sv_setiv(sv, 0);
2145 SvIsUV_on(sv);
607fa7f2 2146 SvUV_set(sv, u);
55497cff 2147}
2148
954c1994
GS
2149/*
2150=for apidoc sv_setuv_mg
2151
2152Like C<sv_setuv>, but also handles 'set' magic.
2153
2154=cut
2155*/
2156
55497cff 2157void
864dbfa3 2158Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
ef50df4b 2159{
55ada374
NC
2160 /* With these two if statements:
2161 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 2162
55ada374
NC
2163 without
2164 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 2165
55ada374
NC
2166 If you wish to remove them, please benchmark to see what the effect is
2167 */
28e5dec8
JH
2168 if (u <= (UV)IV_MAX) {
2169 sv_setiv(sv, (IV)u);
2170 } else {
2171 sv_setiv(sv, 0);
2172 SvIsUV_on(sv);
2173 sv_setuv(sv,u);
2174 }
ef50df4b
GS
2175 SvSETMAGIC(sv);
2176}
2177
954c1994
GS
2178/*
2179=for apidoc sv_setnv
2180
645c22ef
DM
2181Copies a double into the given SV, upgrading first if necessary.
2182Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
2183
2184=cut
2185*/
2186
ef50df4b 2187void
65202027 2188Perl_sv_setnv(pTHX_ register SV *sv, NV num)
79072805 2189{
765f542d 2190 SV_CHECK_THINKFIRST_COW_DROP(sv);
a0d0e21e
LW
2191 switch (SvTYPE(sv)) {
2192 case SVt_NULL:
2193 case SVt_IV:
79072805 2194 sv_upgrade(sv, SVt_NV);
a0d0e21e 2195 break;
a0d0e21e
LW
2196 case SVt_RV:
2197 case SVt_PV:
2198 case SVt_PVIV:
79072805 2199 sv_upgrade(sv, SVt_PVNV);
a0d0e21e 2200 break;
827b7e14 2201
a0d0e21e 2202 case SVt_PVGV:
a0d0e21e
LW
2203 case SVt_PVAV:
2204 case SVt_PVHV:
2205 case SVt_PVCV:
2206 case SVt_PVFM:
2207 case SVt_PVIO:
411caa50 2208 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
53e06cf0 2209 OP_NAME(PL_op));
79072805 2210 }
9d6ce603 2211 SvNV_set(sv, num);
a0d0e21e 2212 (void)SvNOK_only(sv); /* validate number */
463ee0b2 2213 SvTAINT(sv);
79072805
LW
2214}
2215
954c1994
GS
2216/*
2217=for apidoc sv_setnv_mg
2218
2219Like C<sv_setnv>, but also handles 'set' magic.
2220
2221=cut
2222*/
2223
ef50df4b 2224void
65202027 2225Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
ef50df4b
GS
2226{
2227 sv_setnv(sv,num);
2228 SvSETMAGIC(sv);
2229}
2230
645c22ef
DM
2231/* Print an "isn't numeric" warning, using a cleaned-up,
2232 * printable version of the offending string
2233 */
2234
76e3520e 2235STATIC void
cea2e8a9 2236S_not_a_number(pTHX_ SV *sv)
a0d0e21e 2237{
94463019
JH
2238 SV *dsv;
2239 char tmpbuf[64];
2240 char *pv;
2241
2242 if (DO_UTF8(sv)) {
2243 dsv = sv_2mortal(newSVpv("", 0));
2244 pv = sv_uni_display(dsv, sv, 10, 0);
2245 } else {
2246 char *d = tmpbuf;
2247 char *limit = tmpbuf + sizeof(tmpbuf) - 8;
2248 /* each *s can expand to 4 chars + "...\0",
2249 i.e. need room for 8 chars */
ecdeb87c 2250
94463019
JH
2251 char *s, *end;
2252 for (s = SvPVX(sv), end = s + SvCUR(sv); s < end && d < limit; s++) {
2253 int ch = *s & 0xFF;
2254 if (ch & 128 && !isPRINT_LC(ch)) {
2255 *d++ = 'M';
2256 *d++ = '-';
2257 ch &= 127;
2258 }
2259 if (ch == '\n') {
2260 *d++ = '\\';
2261 *d++ = 'n';
2262 }
2263 else if (ch == '\r') {
2264 *d++ = '\\';
2265 *d++ = 'r';
2266 }
2267 else if (ch == '\f') {
2268 *d++ = '\\';
2269 *d++ = 'f';
2270 }
2271 else if (ch == '\\') {
2272 *d++ = '\\';
2273 *d++ = '\\';
2274 }
2275 else if (ch == '\0') {
2276 *d++ = '\\';
2277 *d++ = '0';
2278 }
2279 else if (isPRINT_LC(ch))
2280 *d++ = ch;
2281 else {
2282 *d++ = '^';
2283 *d++ = toCTRL(ch);
2284 }
2285 }
2286 if (s < end) {
2287 *d++ = '.';
2288 *d++ = '.';
2289 *d++ = '.';
2290 }
2291 *d = '\0';
2292 pv = tmpbuf;
a0d0e21e 2293 }
a0d0e21e 2294
533c011a 2295 if (PL_op)
9014280d 2296 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
2297 "Argument \"%s\" isn't numeric in %s", pv,
2298 OP_DESC(PL_op));
a0d0e21e 2299 else
9014280d 2300 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 2301 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
2302}
2303
c2988b20
NC
2304/*
2305=for apidoc looks_like_number
2306
645c22ef
DM
2307Test if the content of an SV looks like a number (or is a number).
2308C<Inf> and C<Infinity> are treated as numbers (so will not issue a
2309non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
2310
2311=cut
2312*/
2313
2314I32
2315Perl_looks_like_number(pTHX_ SV *sv)
2316{
a3b680e6 2317 register const char *sbegin;
c2988b20
NC
2318 STRLEN len;
2319
2320 if (SvPOK(sv)) {
3f7c398e 2321 sbegin = SvPVX_const(sv);
c2988b20
NC
2322 len = SvCUR(sv);
2323 }
2324 else if (SvPOKp(sv))
2325 sbegin = SvPV(sv, len);
2326 else
e0ab1c0e 2327 return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
c2988b20
NC
2328 return grok_number(sbegin, len, NULL);
2329}
25da4f38
IZ
2330
2331/* Actually, ISO C leaves conversion of UV to IV undefined, but
2332 until proven guilty, assume that things are not that bad... */
2333
645c22ef
DM
2334/*
2335 NV_PRESERVES_UV:
2336
2337 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
2338 an IV (an assumption perl has been based on to date) it becomes necessary
2339 to remove the assumption that the NV always carries enough precision to
2340 recreate the IV whenever needed, and that the NV is the canonical form.
2341 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 2342 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
2343 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
2344 1) to distinguish between IV/UV/NV slots that have cached a valid
2345 conversion where precision was lost and IV/UV/NV slots that have a
2346 valid conversion which has lost no precision
645c22ef 2347 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
2348 would lose precision, the precise conversion (or differently
2349 imprecise conversion) is also performed and cached, to prevent
2350 requests for different numeric formats on the same SV causing
2351 lossy conversion chains. (lossless conversion chains are perfectly
2352 acceptable (still))
2353
2354
2355 flags are used:
2356 SvIOKp is true if the IV slot contains a valid value
2357 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
2358 SvNOKp is true if the NV slot contains a valid value
2359 SvNOK is true only if the NV value is accurate
2360
2361 so
645c22ef 2362 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
2363 IV(or UV) would lose accuracy over a direct conversion from PV to
2364 IV(or UV). If it would, cache both conversions, return NV, but mark
2365 SV as IOK NOKp (ie not NOK).
2366
645c22ef 2367 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
2368 NV would lose accuracy over a direct conversion from PV to NV. If it
2369 would, cache both conversions, flag similarly.
2370
2371 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
2372 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
2373 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
2374 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 2375 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 2376
645c22ef
DM
2377 The benefit of this is that operations such as pp_add know that if
2378 SvIOK is true for both left and right operands, then integer addition
2379 can be used instead of floating point (for cases where the result won't
2380 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
2381 loss of precision compared with integer addition.
2382
2383 * making IV and NV equal status should make maths accurate on 64 bit
2384 platforms
2385 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 2386 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
2387 looking for SvIOK and checking for overflow will not outweigh the
2388 fp to integer speedup)
2389 * will slow down integer operations (callers of SvIV) on "inaccurate"
2390 values, as the change from SvIOK to SvIOKp will cause a call into
2391 sv_2iv each time rather than a macro access direct to the IV slot
2392 * should speed up number->string conversion on integers as IV is
645c22ef 2393 favoured when IV and NV are equally accurate
28e5dec8
JH
2394
2395 ####################################################################
645c22ef
DM
2396 You had better be using SvIOK_notUV if you want an IV for arithmetic:
2397 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
2398 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
2399 ####################################################################
2400
645c22ef 2401 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
2402 performance ratio.
2403*/
2404
2405#ifndef NV_PRESERVES_UV
645c22ef
DM
2406# define IS_NUMBER_UNDERFLOW_IV 1
2407# define IS_NUMBER_UNDERFLOW_UV 2
2408# define IS_NUMBER_IV_AND_UV 2
2409# define IS_NUMBER_OVERFLOW_IV 4
2410# define IS_NUMBER_OVERFLOW_UV 5
2411
2412/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
2413
2414/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
2415STATIC int
645c22ef 2416S_sv_2iuv_non_preserve(pTHX_ register SV *sv, I32 numtype)
28e5dec8 2417{
3f7c398e 2418 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
2419 if (SvNVX(sv) < (NV)IV_MIN) {
2420 (void)SvIOKp_on(sv);
2421 (void)SvNOK_on(sv);
45977657 2422 SvIV_set(sv, IV_MIN);
28e5dec8
JH
2423 return IS_NUMBER_UNDERFLOW_IV;
2424 }
2425 if (SvNVX(sv) > (NV)UV_MAX) {
2426 (void)SvIOKp_on(sv);
2427 (void)SvNOK_on(sv);
2428 SvIsUV_on(sv);
607fa7f2 2429 SvUV_set(sv, UV_MAX);
28e5dec8
JH
2430 return IS_NUMBER_OVERFLOW_UV;
2431 }
c2988b20
NC
2432 (void)SvIOKp_on(sv);
2433 (void)SvNOK_on(sv);
2434 /* Can't use strtol etc to convert this string. (See truth table in
2435 sv_2iv */
2436 if (SvNVX(sv) <= (UV)IV_MAX) {
45977657 2437 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2438 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2439 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
2440 } else {
2441 /* Integer is imprecise. NOK, IOKp */
2442 }
2443 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
2444 }
2445 SvIsUV_on(sv);
607fa7f2 2446 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
2447 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2448 if (SvUVX(sv) == UV_MAX) {
2449 /* As we know that NVs don't preserve UVs, UV_MAX cannot
2450 possibly be preserved by NV. Hence, it must be overflow.
2451 NOK, IOKp */
2452 return IS_NUMBER_OVERFLOW_UV;
2453 }
2454 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
2455 } else {
2456 /* Integer is imprecise. NOK, IOKp */
28e5dec8 2457 }
c2988b20 2458 return IS_NUMBER_OVERFLOW_IV;
28e5dec8 2459}
645c22ef
DM
2460#endif /* !NV_PRESERVES_UV*/
2461
891f9566
YST
2462/* sv_2iv() is now a macro using Perl_sv_2iv_flags();
2463 * this function provided for binary compatibility only
2464 */
2465
2466IV
2467Perl_sv_2iv(pTHX_ register SV *sv)
2468{
2469 return sv_2iv_flags(sv, SV_GMAGIC);
2470}
2471
645c22ef 2472/*
891f9566 2473=for apidoc sv_2iv_flags
645c22ef 2474
891f9566
YST
2475Return the integer value of an SV, doing any necessary string
2476conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2477Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
645c22ef
DM
2478
2479=cut
2480*/
28e5dec8 2481
a0d0e21e 2482IV
891f9566 2483Perl_sv_2iv_flags(pTHX_ register SV *sv, I32 flags)
79072805
LW
2484{
2485 if (!sv)
2486 return 0;
8990e307 2487 if (SvGMAGICAL(sv)) {
891f9566
YST
2488 if (flags & SV_GMAGIC)
2489 mg_get(sv);
463ee0b2
LW
2490 if (SvIOKp(sv))
2491 return SvIVX(sv);
748a9306 2492 if (SvNOKp(sv)) {
25da4f38 2493 return I_V(SvNVX(sv));
748a9306 2494 }
36477c24 2495 if (SvPOKp(sv) && SvLEN(sv))
2496 return asIV(sv);
3fe9a6f1 2497 if (!SvROK(sv)) {
d008e5eb 2498 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2499 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 2500 report_uninit(sv);
c6ee37c5 2501 }
36477c24 2502 return 0;
3fe9a6f1 2503 }
463ee0b2 2504 }
ed6116ce 2505 if (SvTHINKFIRST(sv)) {
a0d0e21e 2506 if (SvROK(sv)) {
a0d0e21e 2507 SV* tmpstr;
1554e226 2508 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2509 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2510 return SvIV(tmpstr);
56431972 2511 return PTR2IV(SvRV(sv));
a0d0e21e 2512 }
765f542d
NC
2513 if (SvIsCOW(sv)) {
2514 sv_force_normal_flags(sv, 0);
47deb5e7 2515 }
0336b60e 2516 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2517 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2518 report_uninit(sv);
ed6116ce
LW
2519 return 0;
2520 }
79072805 2521 }
25da4f38
IZ
2522 if (SvIOKp(sv)) {
2523 if (SvIsUV(sv)) {
2524 return (IV)(SvUVX(sv));
2525 }
2526 else {
2527 return SvIVX(sv);
2528 }
463ee0b2 2529 }
748a9306 2530 if (SvNOKp(sv)) {
28e5dec8
JH
2531 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2532 * without also getting a cached IV/UV from it at the same time
2533 * (ie PV->NV conversion should detect loss of accuracy and cache
2534 * IV or UV at same time to avoid this. NWC */
25da4f38
IZ
2535
2536 if (SvTYPE(sv) == SVt_NV)
2537 sv_upgrade(sv, SVt_PVNV);
2538
28e5dec8
JH
2539 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2540 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
2541 certainly cast into the IV range at IV_MAX, whereas the correct
2542 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
2543 cases go to UV */
2544 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2545 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
2546 if (SvNVX(sv) == (NV) SvIVX(sv)
2547#ifndef NV_PRESERVES_UV
2548 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2549 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2550 /* Don't flag it as "accurately an integer" if the number
2551 came from a (by definition imprecise) NV operation, and
2552 we're outside the range of NV integer precision */
2553#endif
2554 ) {
2555 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2556 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2557 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2558 PTR2UV(sv),
2559 SvNVX(sv),
2560 SvIVX(sv)));
2561
2562 } else {
2563 /* IV not precise. No need to convert from PV, as NV
2564 conversion would already have cached IV if it detected
2565 that PV->IV would be better than PV->NV->IV
2566 flags already correct - don't set public IOK. */
2567 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2568 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2569 PTR2UV(sv),
2570 SvNVX(sv),
2571 SvIVX(sv)));
2572 }
2573 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2574 but the cast (NV)IV_MIN rounds to a the value less (more
2575 negative) than IV_MIN which happens to be equal to SvNVX ??
2576 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2577 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2578 (NV)UVX == NVX are both true, but the values differ. :-(
2579 Hopefully for 2s complement IV_MIN is something like
2580 0x8000000000000000 which will be exact. NWC */
d460ef45 2581 }
25da4f38 2582 else {
607fa7f2 2583 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
2584 if (
2585 (SvNVX(sv) == (NV) SvUVX(sv))
2586#ifndef NV_PRESERVES_UV
2587 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2588 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2589 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2590 /* Don't flag it as "accurately an integer" if the number
2591 came from a (by definition imprecise) NV operation, and
2592 we're outside the range of NV integer precision */
2593#endif
2594 )
2595 SvIOK_on(sv);
25da4f38
IZ
2596 SvIsUV_on(sv);
2597 ret_iv_max:
1c846c1f 2598 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 2599 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 2600 PTR2UV(sv),
57def98f
JH
2601 SvUVX(sv),
2602 SvUVX(sv)));
25da4f38
IZ
2603 return (IV)SvUVX(sv);
2604 }
748a9306
LW
2605 }
2606 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2607 UV value;
504618e9 2608 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
25da4f38
IZ
2609 /* We want to avoid a possible problem when we cache an IV which
2610 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
2611 the same as the direct translation of the initial string
2612 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2613 be careful to ensure that the value with the .456 is around if the
2614 NV value is requested in the future).
1c846c1f 2615
25da4f38
IZ
2616 This means that if we cache such an IV, we need to cache the
2617 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 2618 cache the NV if we are sure it's not needed.
25da4f38 2619 */
16b7a9a4 2620
c2988b20
NC
2621 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2622 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2623 == IS_NUMBER_IN_UV) {
5e045b90 2624 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
2625 if (SvTYPE(sv) < SVt_PVIV)
2626 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 2627 (void)SvIOK_on(sv);
c2988b20
NC
2628 } else if (SvTYPE(sv) < SVt_PVNV)
2629 sv_upgrade(sv, SVt_PVNV);
28e5dec8 2630
c2988b20
NC
2631 /* If NV preserves UV then we only use the UV value if we know that
2632 we aren't going to call atof() below. If NVs don't preserve UVs
2633 then the value returned may have more precision than atof() will
2634 return, even though value isn't perfectly accurate. */
2635 if ((numtype & (IS_NUMBER_IN_UV
2636#ifdef NV_PRESERVES_UV
2637 | IS_NUMBER_NOT_INT
2638#endif
2639 )) == IS_NUMBER_IN_UV) {
2640 /* This won't turn off the public IOK flag if it was set above */
2641 (void)SvIOKp_on(sv);
2642
2643 if (!(numtype & IS_NUMBER_NEG)) {
2644 /* positive */;
2645 if (value <= (UV)IV_MAX) {
45977657 2646 SvIV_set(sv, (IV)value);
c2988b20 2647 } else {
607fa7f2 2648 SvUV_set(sv, value);
c2988b20
NC
2649 SvIsUV_on(sv);
2650 }
2651 } else {
2652 /* 2s complement assumption */
2653 if (value <= (UV)IV_MIN) {
45977657 2654 SvIV_set(sv, -(IV)value);
c2988b20
NC
2655 } else {
2656 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2657 I'm assuming it will be rare. */
c2988b20
NC
2658 if (SvTYPE(sv) < SVt_PVNV)
2659 sv_upgrade(sv, SVt_PVNV);
2660 SvNOK_on(sv);
2661 SvIOK_off(sv);
2662 SvIOKp_on(sv);
9d6ce603 2663 SvNV_set(sv, -(NV)value);
45977657 2664 SvIV_set(sv, IV_MIN);
c2988b20
NC
2665 }
2666 }
2667 }
2668 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2669 will be in the previous block to set the IV slot, and the next
2670 block to set the NV slot. So no else here. */
2671
2672 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2673 != IS_NUMBER_IN_UV) {
2674 /* It wasn't an (integer that doesn't overflow the UV). */
3f7c398e 2675 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8 2676
c2988b20
NC
2677 if (! numtype && ckWARN(WARN_NUMERIC))
2678 not_a_number(sv);
28e5dec8 2679
65202027 2680#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2681 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2682 PTR2UV(sv), SvNVX(sv)));
65202027 2683#else
1779d84d 2684 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 2685 PTR2UV(sv), SvNVX(sv)));
65202027 2686#endif
28e5dec8
JH
2687
2688
2689#ifdef NV_PRESERVES_UV
c2988b20
NC
2690 (void)SvIOKp_on(sv);
2691 (void)SvNOK_on(sv);
2692 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2693 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2694 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2695 SvIOK_on(sv);
28e5dec8 2696 } else {
c2988b20
NC
2697 /* Integer is imprecise. NOK, IOKp */
2698 }
2699 /* UV will not work better than IV */
2700 } else {
2701 if (SvNVX(sv) > (NV)UV_MAX) {
2702 SvIsUV_on(sv);
2703 /* Integer is inaccurate. NOK, IOKp, is UV */
607fa7f2 2704 SvUV_set(sv, UV_MAX);
c2988b20
NC
2705 SvIsUV_on(sv);
2706 } else {
607fa7f2 2707 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
2708 /* 0xFFFFFFFFFFFFFFFF not an issue in here */
2709 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2710 SvIOK_on(sv);
28e5dec8
JH
2711 SvIsUV_on(sv);
2712 } else {
c2988b20
NC
2713 /* Integer is imprecise. NOK, IOKp, is UV */
2714 SvIsUV_on(sv);
28e5dec8 2715 }
28e5dec8 2716 }
c2988b20
NC
2717 goto ret_iv_max;
2718 }
28e5dec8 2719#else /* NV_PRESERVES_UV */
c2988b20
NC
2720 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2721 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2722 /* The IV slot will have been set from value returned by
2723 grok_number above. The NV slot has just been set using
2724 Atof. */
560b0c46 2725 SvNOK_on(sv);
c2988b20
NC
2726 assert (SvIOKp(sv));
2727 } else {
2728 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2729 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2730 /* Small enough to preserve all bits. */
2731 (void)SvIOKp_on(sv);
2732 SvNOK_on(sv);
45977657 2733 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2734 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2735 SvIOK_on(sv);
2736 /* Assumption: first non-preserved integer is < IV_MAX,
2737 this NV is in the preserved range, therefore: */
2738 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2739 < (UV)IV_MAX)) {
32fdb065 2740 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
2741 }
2742 } else {
2743 /* IN_UV NOT_INT
2744 0 0 already failed to read UV.
2745 0 1 already failed to read UV.
2746 1 0 you won't get here in this case. IV/UV
2747 slot set, public IOK, Atof() unneeded.
2748 1 1 already read UV.
2749 so there's no point in sv_2iuv_non_preserve() attempting
2750 to use atol, strtol, strtoul etc. */
2751 if (sv_2iuv_non_preserve (sv, numtype)
2752 >= IS_NUMBER_OVERFLOW_IV)
2753 goto ret_iv_max;
2754 }
2755 }
28e5dec8 2756#endif /* NV_PRESERVES_UV */
25da4f38 2757 }
28e5dec8 2758 } else {
599cee73 2759 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 2760 report_uninit(sv);
25da4f38
IZ
2761 if (SvTYPE(sv) < SVt_IV)
2762 /* Typically the caller expects that sv_any is not NULL now. */
2763 sv_upgrade(sv, SVt_IV);
a0d0e21e 2764 return 0;
79072805 2765 }
1d7c1841
GS
2766 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2767 PTR2UV(sv),SvIVX(sv)));
25da4f38 2768 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
2769}
2770
891f9566
YST
2771/* sv_2uv() is now a macro using Perl_sv_2uv_flags();
2772 * this function provided for binary compatibility only
2773 */
2774
2775UV
2776Perl_sv_2uv(pTHX_ register SV *sv)
2777{
2778 return sv_2uv_flags(sv, SV_GMAGIC);
2779}
2780
645c22ef 2781/*
891f9566 2782=for apidoc sv_2uv_flags
645c22ef
DM
2783
2784Return the unsigned integer value of an SV, doing any necessary string
891f9566
YST
2785conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2786Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
645c22ef
DM
2787
2788=cut
2789*/
2790
ff68c719 2791UV
891f9566 2792Perl_sv_2uv_flags(pTHX_ register SV *sv, I32 flags)
ff68c719 2793{
2794 if (!sv)
2795 return 0;
2796 if (SvGMAGICAL(sv)) {
891f9566
YST
2797 if (flags & SV_GMAGIC)
2798 mg_get(sv);
ff68c719 2799 if (SvIOKp(sv))
2800 return SvUVX(sv);
2801 if (SvNOKp(sv))
2802 return U_V(SvNVX(sv));
36477c24 2803 if (SvPOKp(sv) && SvLEN(sv))
2804 return asUV(sv);
3fe9a6f1 2805 if (!SvROK(sv)) {
d008e5eb 2806 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2807 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 2808 report_uninit(sv);
c6ee37c5 2809 }
36477c24 2810 return 0;
3fe9a6f1 2811 }
ff68c719 2812 }
2813 if (SvTHINKFIRST(sv)) {
2814 if (SvROK(sv)) {
ff68c719 2815 SV* tmpstr;
1554e226 2816 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2817 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2818 return SvUV(tmpstr);
56431972 2819 return PTR2UV(SvRV(sv));
ff68c719 2820 }
765f542d
NC
2821 if (SvIsCOW(sv)) {
2822 sv_force_normal_flags(sv, 0);
8a818333 2823 }
0336b60e 2824 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2825 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2826 report_uninit(sv);
ff68c719 2827 return 0;
2828 }
2829 }
25da4f38
IZ
2830 if (SvIOKp(sv)) {
2831 if (SvIsUV(sv)) {
2832 return SvUVX(sv);
2833 }
2834 else {
2835 return (UV)SvIVX(sv);
2836 }
ff68c719 2837 }
2838 if (SvNOKp(sv)) {
28e5dec8
JH
2839 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2840 * without also getting a cached IV/UV from it at the same time
2841 * (ie PV->NV conversion should detect loss of accuracy and cache
2842 * IV or UV at same time to avoid this. */
2843 /* IV-over-UV optimisation - choose to cache IV if possible */
2844
25da4f38
IZ
2845 if (SvTYPE(sv) == SVt_NV)
2846 sv_upgrade(sv, SVt_PVNV);
28e5dec8
JH
2847
2848 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2849 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2850 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
2851 if (SvNVX(sv) == (NV) SvIVX(sv)
2852#ifndef NV_PRESERVES_UV
2853 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2854 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2855 /* Don't flag it as "accurately an integer" if the number
2856 came from a (by definition imprecise) NV operation, and
2857 we're outside the range of NV integer precision */
2858#endif
2859 ) {
2860 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2861 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2862 "0x%"UVxf" uv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2863 PTR2UV(sv),
2864 SvNVX(sv),
2865 SvIVX(sv)));
2866
2867 } else {
2868 /* IV not precise. No need to convert from PV, as NV
2869 conversion would already have cached IV if it detected
2870 that PV->IV would be better than PV->NV->IV
2871 flags already correct - don't set public IOK. */
2872 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2873 "0x%"UVxf" uv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2874 PTR2UV(sv),
2875 SvNVX(sv),
2876 SvIVX(sv)));
2877 }
2878 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2879 but the cast (NV)IV_MIN rounds to a the value less (more
2880 negative) than IV_MIN which happens to be equal to SvNVX ??
2881 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2882 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2883 (NV)UVX == NVX are both true, but the values differ. :-(
2884 Hopefully for 2s complement IV_MIN is something like
2885 0x8000000000000000 which will be exact. NWC */
d460ef45 2886 }
28e5dec8 2887 else {
607fa7f2 2888 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
2889 if (
2890 (SvNVX(sv) == (NV) SvUVX(sv))
2891#ifndef NV_PRESERVES_UV
2892 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2893 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2894 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2895 /* Don't flag it as "accurately an integer" if the number
2896 came from a (by definition imprecise) NV operation, and
2897 we're outside the range of NV integer precision */
2898#endif
2899 )
2900 SvIOK_on(sv);
2901 SvIsUV_on(sv);
1c846c1f 2902 DEBUG_c(PerlIO_printf(Perl_debug_log,
28e5dec8 2903 "0x%"UVxf" 2uv(%"UVuf" => %"IVdf") (as unsigned)\n",
57def98f 2904 PTR2UV(sv),
28e5dec8
JH
2905 SvUVX(sv),
2906 SvUVX(sv)));
25da4f38 2907 }
ff68c719 2908 }
2909 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2910 UV value;
504618e9 2911 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
25da4f38
IZ
2912
2913 /* We want to avoid a possible problem when we cache a UV which
2914 may be later translated to an NV, and the resulting NV is not
2915 the translation of the initial data.
1c846c1f 2916
25da4f38
IZ
2917 This means that if we cache such a UV, we need to cache the
2918 NV as well. Moreover, we trade speed for space, and do not
2919 cache the NV if not needed.
2920 */
16b7a9a4 2921
c2988b20
NC
2922 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2923 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2924 == IS_NUMBER_IN_UV) {
5e045b90 2925 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8 2926 if (SvTYPE(sv) < SVt_PVIV)
f7bbb42a
JH
2927 sv_upgrade(sv, SVt_PVIV);
2928 (void)SvIOK_on(sv);
c2988b20
NC
2929 } else if (SvTYPE(sv) < SVt_PVNV)
2930 sv_upgrade(sv, SVt_PVNV);
d460ef45 2931
c2988b20
NC
2932 /* If NV preserves UV then we only use the UV value if we know that
2933 we aren't going to call atof() below. If NVs don't preserve UVs
2934 then the value returned may have more precision than atof() will
2935 return, even though it isn't accurate. */
2936 if ((numtype & (IS_NUMBER_IN_UV
2937#ifdef NV_PRESERVES_UV
2938 | IS_NUMBER_NOT_INT
2939#endif
2940 )) == IS_NUMBER_IN_UV) {
2941 /* This won't turn off the public IOK flag if it was set above */
2942 (void)SvIOKp_on(sv);
2943
2944 if (!(numtype & IS_NUMBER_NEG)) {
2945 /* positive */;
2946 if (value <= (UV)IV_MAX) {
45977657 2947 SvIV_set(sv, (IV)value);
28e5dec8
JH
2948 } else {
2949 /* it didn't overflow, and it was positive. */
607fa7f2 2950 SvUV_set(sv, value);
28e5dec8
JH
2951 SvIsUV_on(sv);
2952 }
c2988b20
NC
2953 } else {
2954 /* 2s complement assumption */
2955 if (value <= (UV)IV_MIN) {
45977657 2956 SvIV_set(sv, -(IV)value);
c2988b20
NC
2957 } else {
2958 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2959 I'm assuming it will be rare. */
c2988b20
NC
2960 if (SvTYPE(sv) < SVt_PVNV)
2961 sv_upgrade(sv, SVt_PVNV);
2962 SvNOK_on(sv);
2963 SvIOK_off(sv);
2964 SvIOKp_on(sv);
9d6ce603 2965 SvNV_set(sv, -(NV)value);
45977657 2966 SvIV_set(sv, IV_MIN);
c2988b20
NC
2967 }
2968 }
2969 }
2970
2971 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2972 != IS_NUMBER_IN_UV) {
2973 /* It wasn't an integer, or it overflowed the UV. */
3f7c398e 2974 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8 2975
c2988b20 2976 if (! numtype && ckWARN(WARN_NUMERIC))
28e5dec8
JH
2977 not_a_number(sv);
2978
2979#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2980 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%" PERL_PRIgldbl ")\n",
2981 PTR2UV(sv), SvNVX(sv)));
28e5dec8 2982#else
1779d84d 2983 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"NVgf")\n",
c2988b20 2984 PTR2UV(sv), SvNVX(sv)));
28e5dec8
JH
2985#endif
2986
2987#ifdef NV_PRESERVES_UV
c2988b20
NC
2988 (void)SvIOKp_on(sv);
2989 (void)SvNOK_on(sv);
2990 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2991 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2992 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2993 SvIOK_on(sv);
2994 } else {
2995 /* Integer is imprecise. NOK, IOKp */
2996 }
2997 /* UV will not work better than IV */
2998 } else {
2999 if (SvNVX(sv) > (NV)UV_MAX) {
3000 SvIsUV_on(sv);
3001 /* Integer is inaccurate. NOK, IOKp, is UV */
607fa7f2 3002 SvUV_set(sv, UV_MAX);
c2988b20
NC
3003 SvIsUV_on(sv);
3004 } else {
607fa7f2 3005 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
3006 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
3007 NV preservse UV so can do correct comparison. */
3008 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
3009 SvIOK_on(sv);
3010 SvIsUV_on(sv);
3011 } else {
3012 /* Integer is imprecise. NOK, IOKp, is UV */
3013 SvIsUV_on(sv);
3014 }
3015 }
3016 }
28e5dec8 3017#else /* NV_PRESERVES_UV */
c2988b20
NC
3018 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3019 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
3020 /* The UV slot will have been set from value returned by
3021 grok_number above. The NV slot has just been set using
3022 Atof. */
560b0c46 3023 SvNOK_on(sv);
c2988b20
NC
3024 assert (SvIOKp(sv));
3025 } else {
3026 if (((UV)1 << NV_PRESERVES_UV_BITS) >
3027 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
3028 /* Small enough to preserve all bits. */
3029 (void)SvIOKp_on(sv);
3030 SvNOK_on(sv);
45977657 3031 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
3032 if ((NV)(SvIVX(sv)) == SvNVX(sv))
3033 SvIOK_on(sv);
3034 /* Assumption: first non-preserved integer is < IV_MAX,
3035 this NV is in the preserved range, therefore: */
3036 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
3037 < (UV)IV_MAX)) {
32fdb065 3038 Perl_croak(aTHX_ "sv_2uv 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
3039 }
3040 } else
3041 sv_2iuv_non_preserve (sv, numtype);
3042 }
28e5dec8 3043#endif /* NV_PRESERVES_UV */
f7bbb42a 3044 }
ff68c719 3045 }
3046 else {
d008e5eb 3047 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3048 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3049 report_uninit(sv);
c6ee37c5 3050 }
25da4f38
IZ
3051 if (SvTYPE(sv) < SVt_IV)
3052 /* Typically the caller expects that sv_any is not NULL now. */
3053 sv_upgrade(sv, SVt_IV);
ff68c719 3054 return 0;
3055 }
25da4f38 3056
1d7c1841
GS
3057 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
3058 PTR2UV(sv),SvUVX(sv)));
25da4f38 3059 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 3060}
3061
645c22ef
DM
3062/*
3063=for apidoc sv_2nv
3064
3065Return the num value of an SV, doing any necessary string or integer
3066conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
3067macros.
3068
3069=cut
3070*/
3071
65202027 3072NV
864dbfa3 3073Perl_sv_2nv(pTHX_ register SV *sv)
79072805
LW
3074{
3075 if (!sv)
3076 return 0.0;
8990e307 3077 if (SvGMAGICAL(sv)) {
463ee0b2
LW
3078 mg_get(sv);
3079 if (SvNOKp(sv))
3080 return SvNVX(sv);
a0d0e21e 3081 if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 3082 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) &&
504618e9 3083 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
a0d0e21e 3084 not_a_number(sv);
3f7c398e 3085 return Atof(SvPVX_const(sv));
a0d0e21e 3086 }
25da4f38 3087 if (SvIOKp(sv)) {
1c846c1f 3088 if (SvIsUV(sv))
65202027 3089 return (NV)SvUVX(sv);
25da4f38 3090 else
65202027 3091 return (NV)SvIVX(sv);
25da4f38 3092 }
16d20bd9 3093 if (!SvROK(sv)) {
d008e5eb 3094 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3095 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3096 report_uninit(sv);
c6ee37c5 3097 }
16d20bd9
AD
3098 return 0;
3099 }
463ee0b2 3100 }
ed6116ce 3101 if (SvTHINKFIRST(sv)) {
a0d0e21e 3102 if (SvROK(sv)) {
a0d0e21e 3103 SV* tmpstr;
1554e226 3104 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 3105 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 3106 return SvNV(tmpstr);
56431972 3107 return PTR2NV(SvRV(sv));
a0d0e21e 3108 }
765f542d
NC
3109 if (SvIsCOW(sv)) {
3110 sv_force_normal_flags(sv, 0);
8a818333 3111 }
0336b60e 3112 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 3113 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 3114 report_uninit(sv);
ed6116ce
LW
3115 return 0.0;
3116 }
79072805
LW
3117 }
3118 if (SvTYPE(sv) < SVt_NV) {
463ee0b2
LW
3119 if (SvTYPE(sv) == SVt_IV)
3120 sv_upgrade(sv, SVt_PVNV);
3121 else
3122 sv_upgrade(sv, SVt_NV);
906f284f 3123#ifdef USE_LONG_DOUBLE
097ee67d 3124 DEBUG_c({
f93f4e46 3125 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
3126 PerlIO_printf(Perl_debug_log,
3127 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
3128 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
3129 RESTORE_NUMERIC_LOCAL();
3130 });
65202027 3131#else
572bbb43 3132 DEBUG_c({
f93f4e46 3133 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 3134 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 3135 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
3136 RESTORE_NUMERIC_LOCAL();
3137 });
572bbb43 3138#endif
79072805
LW
3139 }
3140 else if (SvTYPE(sv) < SVt_PVNV)
3141 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
3142 if (SvNOKp(sv)) {
3143 return SvNVX(sv);
61604483 3144 }
59d8ce62 3145 if (SvIOKp(sv)) {
9d6ce603 3146 SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
28e5dec8
JH
3147#ifdef NV_PRESERVES_UV
3148 SvNOK_on(sv);
3149#else
3150 /* Only set the public NV OK flag if this NV preserves the IV */
3151 /* Check it's not 0xFFFFFFFFFFFFFFFF */
3152 if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
3153 : (SvIVX(sv) == I_V(SvNVX(sv))))
3154 SvNOK_on(sv);
3155 else
3156 SvNOKp_on(sv);
3157#endif
93a17b20 3158 }
748a9306 3159 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 3160 UV value;
3f7c398e 3161 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
c2988b20 3162 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !numtype)
a0d0e21e 3163 not_a_number(sv);
28e5dec8 3164#ifdef NV_PRESERVES_UV
c2988b20
NC
3165 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3166 == IS_NUMBER_IN_UV) {
5e045b90 3167 /* It's definitely an integer */
9d6ce603 3168 SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
c2988b20 3169 } else
3f7c398e 3170 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
3171 SvNOK_on(sv);
3172#else
3f7c398e 3173 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
3174 /* Only set the public NV OK flag if this NV preserves the value in
3175 the PV at least as well as an IV/UV would.
3176 Not sure how to do this 100% reliably. */
3177 /* if that shift count is out of range then Configure's test is
3178 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
3179 UV_BITS */
3180 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 3181 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 3182 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
3183 } else if (!(numtype & IS_NUMBER_IN_UV)) {
3184 /* Can't use strtol etc to convert this string, so don't try.
3185 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
3186 SvNOK_on(sv);
3187 } else {
3188 /* value has been set. It may not be precise. */
3189 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
3190 /* 2s complement assumption for (UV)IV_MIN */
3191 SvNOK_on(sv); /* Integer is too negative. */
3192 } else {
3193 SvNOKp_on(sv);
3194 SvIOKp_on(sv);
6fa402ec 3195
c2988b20 3196 if (numtype & IS_NUMBER_NEG) {
45977657 3197 SvIV_set(sv, -(IV)value);
c2988b20 3198 } else if (value <= (UV)IV_MAX) {
45977657 3199 SvIV_set(sv, (IV)value);
c2988b20 3200 } else {
607fa7f2 3201 SvUV_set(sv, value);
c2988b20
NC
3202 SvIsUV_on(sv);
3203 }
3204
3205 if (numtype & IS_NUMBER_NOT_INT) {
3206 /* I believe that even if the original PV had decimals,
3207 they are lost beyond the limit of the FP precision.
3208 However, neither is canonical, so both only get p
3209 flags. NWC, 2000/11/25 */
3210 /* Both already have p flags, so do nothing */
3211 } else {
3212 NV nv = SvNVX(sv);
3213 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
3214 if (SvIVX(sv) == I_V(nv)) {
3215 SvNOK_on(sv);
3216 SvIOK_on(sv);
3217 } else {
3218 SvIOK_on(sv);
3219 /* It had no "." so it must be integer. */
3220 }
3221 } else {
3222 /* between IV_MAX and NV(UV_MAX).
3223 Could be slightly > UV_MAX */
6fa402ec 3224
c2988b20
NC
3225 if (numtype & IS_NUMBER_NOT_INT) {
3226 /* UV and NV both imprecise. */
3227 } else {
3228 UV nv_as_uv = U_V(nv);
3229
3230 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
3231 SvNOK_on(sv);
3232 SvIOK_on(sv);
3233 } else {
3234 SvIOK_on(sv);
3235 }
3236 }
3237 }
3238 }
3239 }
3240 }
28e5dec8 3241#endif /* NV_PRESERVES_UV */
93a17b20 3242 }
79072805 3243 else {
599cee73 3244 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 3245 report_uninit(sv);
25da4f38
IZ
3246 if (SvTYPE(sv) < SVt_NV)
3247 /* Typically the caller expects that sv_any is not NULL now. */
28e5dec8
JH
3248 /* XXX Ilya implies that this is a bug in callers that assume this
3249 and ideally should be fixed. */
25da4f38 3250 sv_upgrade(sv, SVt_NV);
a0d0e21e 3251 return 0.0;
79072805 3252 }
572bbb43 3253#if defined(USE_LONG_DOUBLE)
097ee67d 3254 DEBUG_c({
f93f4e46 3255 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
3256 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
3257 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
3258 RESTORE_NUMERIC_LOCAL();
3259 });
65202027 3260#else
572bbb43 3261 DEBUG_c({
f93f4e46 3262 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 3263 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 3264 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
3265 RESTORE_NUMERIC_LOCAL();
3266 });
572bbb43 3267#endif
463ee0b2 3268 return SvNVX(sv);
79072805
LW
3269}
3270
645c22ef
DM
3271/* asIV(): extract an integer from the string value of an SV.
3272 * Caller must validate PVX */
3273
76e3520e 3274STATIC IV
cea2e8a9 3275S_asIV(pTHX_ SV *sv)
36477c24 3276{
c2988b20 3277 UV value;
3f7c398e 3278 int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
c2988b20
NC
3279
3280 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3281 == IS_NUMBER_IN_UV) {
645c22ef 3282 /* It's definitely an integer */
c2988b20
NC
3283 if (numtype & IS_NUMBER_NEG) {
3284 if (value < (UV)IV_MIN)
3285 return -(IV)value;
3286 } else {
3287 if (value < (UV)IV_MAX)
3288 return (IV)value;
3289 }
3290 }
d008e5eb 3291 if (!numtype) {
d008e5eb
GS
3292 if (ckWARN(WARN_NUMERIC))
3293 not_a_number(sv);
3294 }
3f7c398e 3295 return I_V(Atof(SvPVX_const(sv)));
36477c24 3296}
3297
645c22ef
DM
3298/* asUV(): extract an unsigned integer from the string value of an SV
3299 * Caller must validate PVX */
3300
76e3520e 3301STATIC UV
cea2e8a9 3302S_asUV(pTHX_ SV *sv)
36477c24 3303{
c2988b20 3304 UV value;
504618e9 3305 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
36477c24 3306
c2988b20
NC
3307 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3308 == IS_NUMBER_IN_UV) {
645c22ef 3309 /* It's definitely an integer */
6fa402ec 3310 if (!(numtype & IS_NUMBER_NEG))
c2988b20
NC
3311 return value;
3312 }
d008e5eb 3313 if (!numtype) {
d008e5eb
GS
3314 if (ckWARN(WARN_NUMERIC))
3315 not_a_number(sv);
3316 }
3f7c398e 3317 return U_V(Atof(SvPVX_const(sv)));
36477c24 3318}
3319
645c22ef
DM
3320/*
3321=for apidoc sv_2pv_nolen
3322
3323Like C<sv_2pv()>, but doesn't return the length too. You should usually
3324use the macro wrapper C<SvPV_nolen(sv)> instead.
3325=cut
3326*/
3327
79072805 3328char *
864dbfa3 3329Perl_sv_2pv_nolen(pTHX_ register SV *sv)
1fa8b10d
JD
3330{
3331 STRLEN n_a;
3332 return sv_2pv(sv, &n_a);
3333}
3334
645c22ef
DM
3335/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
3336 * UV as a string towards the end of buf, and return pointers to start and
3337 * end of it.
3338 *
3339 * We assume that buf is at least TYPE_CHARS(UV) long.
3340 */
3341
864dbfa3 3342static char *
25da4f38
IZ
3343uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
3344{
25da4f38
IZ
3345 char *ptr = buf + TYPE_CHARS(UV);
3346 char *ebuf = ptr;
3347 int sign;
25da4f38
IZ
3348
3349 if (is_uv)
3350 sign = 0;
3351 else if (iv >= 0) {
3352 uv = iv;
3353 sign = 0;
3354 } else {
3355 uv = -iv;
3356 sign = 1;
3357 }
3358 do {
eb160463 3359 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
3360 } while (uv /= 10);
3361 if (sign)
3362 *--ptr = '-';
3363 *peob = ebuf;
3364 return ptr;
3365}
3366
09540bc3
JH
3367/* sv_2pv() is now a macro using Perl_sv_2pv_flags();
3368 * this function provided for binary compatibility only
3369 */
3370
3371char *
3372Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
3373{
3374 return sv_2pv_flags(sv, lp, SV_GMAGIC);
3375}
3376
645c22ef
DM
3377/*
3378=for apidoc sv_2pv_flags
3379
ff276b08 3380Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
3381If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
3382if necessary.
3383Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
3384usually end up here too.
3385
3386=cut
3387*/
3388
8d6d96c1
HS
3389char *
3390Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
3391{
79072805
LW
3392 register char *s;
3393 int olderrno;
cb50f42d 3394 SV *tsv, *origsv;
25da4f38
IZ
3395 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
3396 char *tmpbuf = tbuf;
79072805 3397
463ee0b2
LW
3398 if (!sv) {
3399 *lp = 0;
73d840c0 3400 return (char *)"";
463ee0b2 3401 }
8990e307 3402 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
3403 if (flags & SV_GMAGIC)
3404 mg_get(sv);
463ee0b2
LW
3405 if (SvPOKp(sv)) {
3406 *lp = SvCUR(sv);
3407 return SvPVX(sv);
3408 }
cf2093f6 3409 if (SvIOKp(sv)) {
1c846c1f 3410 if (SvIsUV(sv))
57def98f 3411 (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
cf2093f6 3412 else
57def98f 3413 (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
46fc3d4c 3414 tsv = Nullsv;
a0d0e21e 3415 goto tokensave;
463ee0b2
LW
3416 }
3417 if (SvNOKp(sv)) {
2d4389e4 3418 Gconvert(SvNVX(sv), NV_DIG, 0, tmpbuf);
46fc3d4c 3419 tsv = Nullsv;
a0d0e21e 3420 goto tokensave;
463ee0b2 3421 }
16d20bd9 3422 if (!SvROK(sv)) {
d008e5eb 3423 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3424 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3425 report_uninit(sv);
c6ee37c5 3426 }
16d20bd9 3427 *lp = 0;
73d840c0 3428 return (char *)"";
16d20bd9 3429 }
463ee0b2 3430 }
ed6116ce
LW
3431 if (SvTHINKFIRST(sv)) {
3432 if (SvROK(sv)) {
a0d0e21e 3433 SV* tmpstr;
e1ec3a88 3434 register const char *typestr;
1554e226 3435 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)) &&
b4b9a328 3436 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
446eaa42
YST
3437 char *pv = SvPV(tmpstr, *lp);
3438 if (SvUTF8(tmpstr))
3439 SvUTF8_on(sv);
3440 else
3441 SvUTF8_off(sv);
3442 return pv;
3443 }
cb50f42d 3444 origsv = sv;
ed6116ce
LW
3445 sv = (SV*)SvRV(sv);
3446 if (!sv)
e1ec3a88 3447 typestr = "NULLREF";
ed6116ce 3448 else {
f9277f47
IZ
3449 MAGIC *mg;
3450
ed6116ce 3451 switch (SvTYPE(sv)) {
f9277f47
IZ
3452 case SVt_PVMG:
3453 if ( ((SvFLAGS(sv) &
1c846c1f 3454 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
faf82a0b 3455 == (SVs_OBJECT|SVs_SMG))
14befaf4 3456 && (mg = mg_find(sv, PERL_MAGIC_qr))) {
e1ec3a88 3457 const regexp *re = (regexp *)mg->mg_obj;
1bd3ad17 3458
2cd61cdb 3459 if (!mg->mg_ptr) {
e1ec3a88 3460 const char *fptr = "msix";
8782bef2
GB
3461 char reflags[6];
3462 char ch;
3463 int left = 0;
3464 int right = 4;
ff385a1b 3465 char need_newline = 0;
eb160463 3466 U16 reganch = (U16)((re->reganch & PMf_COMPILETIME) >> 12);
8782bef2 3467
155aba94 3468 while((ch = *fptr++)) {
8782bef2
GB
3469 if(reganch & 1) {
3470 reflags[left++] = ch;
3471 }
3472 else {
3473 reflags[right--] = ch;
3474 }
3475 reganch >>= 1;
3476 }
3477 if(left != 4) {
3478 reflags[left] = '-';
3479 left = 5;
3480 }
3481
3482 mg->mg_len = re->prelen + 4 + left;
ff385a1b
JF
3483 /*
3484 * If /x was used, we have to worry about a regex
3485 * ending with a comment later being embedded
3486 * within another regex. If so, we don't want this
3487 * regex's "commentization" to leak out to the
3488 * right part of the enclosing regex, we must cap
3489 * it with a newline.
3490 *
3491 * So, if /x was used, we scan backwards from the
3492 * end of the regex. If we find a '#' before we
3493 * find a newline, we need to add a newline
3494 * ourself. If we find a '\n' first (or if we
3495 * don't find '#' or '\n'), we don't need to add
3496 * anything. -jfriedl
3497 */
3498 if (PMf_EXTENDED & re->reganch)
3499 {
e1ec3a88 3500 const char *endptr = re->precomp + re->prelen;
ff385a1b
JF
3501 while (endptr >= re->precomp)
3502 {
e1ec3a88 3503 const char c = *(endptr--);
ff385a1b
JF
3504 if (c == '\n')
3505 break; /* don't need another */
3506 if (c == '#') {
3507 /* we end while in a comment, so we
3508 need a newline */
3509 mg->mg_len++; /* save space for it */
3510 need_newline = 1; /* note to add it */
ab01544f 3511 break;
ff385a1b
JF
3512 }
3513 }
3514 }
3515
8782bef2
GB
3516 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
3517 Copy("(?", mg->mg_ptr, 2, char);
3518 Copy(reflags, mg->mg_ptr+2, left, char);
3519 Copy(":", mg->mg_ptr+left+2, 1, char);
3520 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
ff385a1b
JF
3521 if (need_newline)
3522 mg->mg_ptr[mg->mg_len - 2] = '\n';
1bd3ad17
IZ
3523 mg->mg_ptr[mg->mg_len - 1] = ')';
3524 mg->mg_ptr[mg->mg_len] = 0;
3525 }
3280af22 3526 PL_reginterp_cnt += re->program[0].next_off;
cb50f42d
YST
3527
3528 if (re->reganch & ROPT_UTF8)
3529 SvUTF8_on(origsv);
3530 else
3531 SvUTF8_off(origsv);
1bd3ad17
IZ
3532 *lp = mg->mg_len;
3533 return mg->mg_ptr;
f9277f47
IZ
3534 }
3535 /* Fall through */
ed6116ce
LW
3536 case SVt_NULL:
3537 case SVt_IV:
3538 case SVt_NV:
3539 case SVt_RV:
3540 case SVt_PV:
3541 case SVt_PVIV:
3542 case SVt_PVNV:
e1ec3a88
AL
3543 case SVt_PVBM: typestr = SvROK(sv) ? "REF" : "SCALAR"; break;
3544 case SVt_PVLV: typestr = SvROK(sv) ? "REF"
be65207d
DM
3545 /* tied lvalues should appear to be
3546 * scalars for backwards compatitbility */
3547 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
3548 ? "SCALAR" : "LVALUE"; break;
e1ec3a88
AL
3549 case SVt_PVAV: typestr = "ARRAY"; break;
3550 case SVt_PVHV: typestr = "HASH"; break;
3551 case SVt_PVCV: typestr = "CODE"; break;
3552 case SVt_PVGV: typestr = "GLOB"; break;
3553 case SVt_PVFM: typestr = "FORMAT"; break;
3554 case SVt_PVIO: typestr = "IO"; break;
3555 default: typestr = "UNKNOWN"; break;
ed6116ce 3556 }
46fc3d4c 3557 tsv = NEWSV(0,0);
a5cb6b62 3558 if (SvOBJECT(sv)) {
bfcb3514 3559 const char *name = HvNAME_get(SvSTASH(sv));
a5cb6b62 3560 Perl_sv_setpvf(aTHX_ tsv, "%s=%s(0x%"UVxf")",
e1ec3a88 3561 name ? name : "__ANON__" , typestr, PTR2UV(sv));
a5cb6b62 3562 }
ed6116ce 3563 else
e1ec3a88 3564 Perl_sv_setpvf(aTHX_ tsv, "%s(0x%"UVxf")", typestr, PTR2UV(sv));
a0d0e21e 3565 goto tokensaveref;
463ee0b2 3566 }
e1ec3a88 3567 *lp = strlen(typestr);
73d840c0 3568 return (char *)typestr;
79072805 3569 }
0336b60e 3570 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 3571 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 3572 report_uninit(sv);
ed6116ce 3573 *lp = 0;
73d840c0 3574 return (char *)"";
79072805 3575 }
79072805 3576 }
28e5dec8
JH
3577 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
3578 /* I'm assuming that if both IV and NV are equally valid then
3579 converting the IV is going to be more efficient */
e1ec3a88
AL
3580 const U32 isIOK = SvIOK(sv);
3581 const U32 isUIOK = SvIsUV(sv);
28e5dec8
JH
3582 char buf[TYPE_CHARS(UV)];
3583 char *ebuf, *ptr;
3584
3585 if (SvTYPE(sv) < SVt_PVIV)
3586 sv_upgrade(sv, SVt_PVIV);
3587 if (isUIOK)
3588 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
3589 else
3590 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
eb160463 3591 SvGROW(sv, (STRLEN)(ebuf - ptr + 1)); /* inlined from sv_setpvn */
28e5dec8
JH
3592 Move(ptr,SvPVX(sv),ebuf - ptr,char);
3593 SvCUR_set(sv, ebuf - ptr);
3594 s = SvEND(sv);
3595 *s = '\0';
3596 if (isIOK)
3597 SvIOK_on(sv);
3598 else
3599 SvIOKp_on(sv);
3600 if (isUIOK)
3601 SvIsUV_on(sv);
3602 }
3603 else if (SvNOKp(sv)) {
79072805
LW
3604 if (SvTYPE(sv) < SVt_PVNV)
3605 sv_upgrade(sv, SVt_PVNV);
1c846c1f 3606 /* The +20 is pure guesswork. Configure test needed. --jhi */
59155cc0 3607 SvGROW(sv, NV_DIG + 20);
463ee0b2 3608 s = SvPVX(sv);
79072805 3609 olderrno = errno; /* some Xenix systems wipe out errno here */
79072805 3610#ifdef apollo
463ee0b2 3611 if (SvNVX(sv) == 0.0)
79072805
LW
3612 (void)strcpy(s,"0");
3613 else
3614#endif /*apollo*/
bbce6d69 3615 {
2d4389e4 3616 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 3617 }
79072805 3618 errno = olderrno;
a0d0e21e
LW
3619#ifdef FIXNEGATIVEZERO
3620 if (*s == '-' && s[1] == '0' && !s[2])
3621 strcpy(s,"0");
3622#endif
79072805
LW
3623 while (*s) s++;
3624#ifdef hcx
3625 if (s[-1] == '.')
46fc3d4c 3626 *--s = '\0';
79072805
LW
3627#endif
3628 }
79072805 3629 else {
0336b60e
IZ
3630 if (ckWARN(WARN_UNINITIALIZED)
3631 && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 3632 report_uninit(sv);
a0d0e21e 3633 *lp = 0;
25da4f38
IZ
3634 if (SvTYPE(sv) < SVt_PV)
3635 /* Typically the caller expects that sv_any is not NULL now. */
3636 sv_upgrade(sv, SVt_PV);
73d840c0 3637 return (char *)"";
79072805 3638 }
3f7c398e 3639 *lp = s - SvPVX_const(sv);
463ee0b2 3640 SvCUR_set(sv, *lp);
79072805 3641 SvPOK_on(sv);
1d7c1841 3642 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 3643 PTR2UV(sv),SvPVX_const(sv)));
463ee0b2 3644 return SvPVX(sv);
a0d0e21e
LW
3645
3646 tokensave:
3647 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
3648 /* Sneaky stuff here */
3649
3650 tokensaveref:
46fc3d4c 3651 if (!tsv)
96827780 3652 tsv = newSVpv(tmpbuf, 0);
46fc3d4c 3653 sv_2mortal(tsv);
3654 *lp = SvCUR(tsv);
3655 return SvPVX(tsv);
a0d0e21e
LW
3656 }
3657 else {
27da23d5 3658 dVAR;
a0d0e21e 3659 STRLEN len;
73d840c0 3660 const char *t;
46fc3d4c 3661
3662 if (tsv) {
3663 sv_2mortal(tsv);
3f7c398e 3664 t = SvPVX_const(tsv);
46fc3d4c 3665 len = SvCUR(tsv);
3666 }
3667 else {
96827780
MB
3668 t = tmpbuf;
3669 len = strlen(tmpbuf);
46fc3d4c 3670 }
a0d0e21e 3671#ifdef FIXNEGATIVEZERO
46fc3d4c 3672 if (len == 2 && t[0] == '-' && t[1] == '0') {
3673 t = "0";
3674 len = 1;
3675 }
a0d0e21e
LW
3676#endif
3677 (void)SvUPGRADE(sv, SVt_PV);
46fc3d4c 3678 *lp = len;
a0d0e21e
LW
3679 s = SvGROW(sv, len + 1);
3680 SvCUR_set(sv, len);
6bf554b4 3681 SvPOKp_on(sv);
e90e2364 3682 return strcpy(s, t);
a0d0e21e 3683 }
463ee0b2
LW
3684}
3685
645c22ef 3686/*
6050d10e
JP
3687=for apidoc sv_copypv
3688
3689Copies a stringified representation of the source SV into the
3690destination SV. Automatically performs any necessary mg_get and
54f0641b 3691coercion of numeric values into strings. Guaranteed to preserve
6050d10e 3692UTF-8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
3693sv_2pv[_flags] but operates directly on an SV instead of just the
3694string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
3695would lose the UTF-8'ness of the PV.
3696
3697=cut
3698*/
3699
3700void
3701Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
3702{
446eaa42
YST
3703 STRLEN len;
3704 char *s;
3705 s = SvPV(ssv,len);
cb50f42d 3706 sv_setpvn(dsv,s,len);
446eaa42 3707 if (SvUTF8(ssv))
cb50f42d 3708 SvUTF8_on(dsv);
446eaa42 3709 else
cb50f42d 3710 SvUTF8_off(dsv);
6050d10e
JP
3711}
3712
3713/*
645c22ef
DM
3714=for apidoc sv_2pvbyte_nolen
3715
3716Return a pointer to the byte-encoded representation of the SV.
1e54db1a 3717May cause the SV to be downgraded from UTF-8 as a side-effect.
645c22ef
DM
3718
3719Usually accessed via the C<SvPVbyte_nolen> macro.
3720
3721=cut
3722*/
3723
7340a771
GS
3724char *
3725Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
3726{
560a288e
GS
3727 STRLEN n_a;
3728 return sv_2pvbyte(sv, &n_a);
7340a771
GS
3729}
3730
645c22ef
DM
3731/*
3732=for apidoc sv_2pvbyte
3733
3734Return a pointer to the byte-encoded representation of the SV, and set *lp
1e54db1a 3735to its length. May cause the SV to be downgraded from UTF-8 as a
645c22ef
DM
3736side-effect.
3737
3738Usually accessed via the C<SvPVbyte> macro.
3739
3740=cut
3741*/
3742
7340a771
GS
3743char *
3744Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
3745{
0875d2fe
NIS
3746 sv_utf8_downgrade(sv,0);
3747 return SvPV(sv,*lp);
7340a771
GS
3748}
3749
645c22ef
DM
3750/*
3751=for apidoc sv_2pvutf8_nolen
3752
1e54db1a
JH
3753Return a pointer to the UTF-8-encoded representation of the SV.
3754May cause the SV to be upgraded to UTF-8 as a side-effect.
645c22ef
DM
3755
3756Usually accessed via the C<SvPVutf8_nolen> macro.
3757
3758=cut
3759*/
3760
7340a771
GS
3761char *
3762Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
3763{
560a288e
GS
3764 STRLEN n_a;
3765 return sv_2pvutf8(sv, &n_a);
7340a771
GS
3766}
3767
645c22ef
DM
3768/*
3769=for apidoc sv_2pvutf8
3770
1e54db1a
JH
3771Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3772to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
645c22ef
DM
3773
3774Usually accessed via the C<SvPVutf8> macro.
3775
3776=cut
3777*/
3778
7340a771
GS
3779char *
3780Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
3781{
560a288e 3782 sv_utf8_upgrade(sv);
7d59b7e4 3783 return SvPV(sv,*lp);
7340a771 3784}
1c846c1f 3785
645c22ef
DM
3786/*
3787=for apidoc sv_2bool
3788
3789This function is only called on magical items, and is only used by
8cf8f3d1 3790sv_true() or its macro equivalent.
645c22ef
DM
3791
3792=cut
3793*/
3794
463ee0b2 3795bool
864dbfa3 3796Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 3797{
8990e307 3798 if (SvGMAGICAL(sv))
463ee0b2
LW
3799 mg_get(sv);
3800
a0d0e21e
LW
3801 if (!SvOK(sv))
3802 return 0;
3803 if (SvROK(sv)) {
a0d0e21e 3804 SV* tmpsv;
1554e226 3805 if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
9e3013b1 3806 (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
8a31060d 3807 return (bool)SvTRUE(tmpsv);
a0d0e21e
LW
3808 return SvRV(sv) != 0;
3809 }
463ee0b2 3810 if (SvPOKp(sv)) {
11343788
MB
3811 register XPV* Xpvtmp;
3812 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
339049b0 3813 (*sv->sv_u.svu_pv > '0' ||
11343788 3814 Xpvtmp->xpv_cur > 1 ||
339049b0 3815 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
463ee0b2
LW
3816 return 1;
3817 else
3818 return 0;
3819 }
3820 else {
3821 if (SvIOKp(sv))
3822 return SvIVX(sv) != 0;
3823 else {
3824 if (SvNOKp(sv))
3825 return SvNVX(sv) != 0.0;
3826 else
3827 return FALSE;
3828 }
3829 }
79072805
LW
3830}
3831
09540bc3
JH
3832/* sv_utf8_upgrade() is now a macro using sv_utf8_upgrade_flags();
3833 * this function provided for binary compatibility only
3834 */
3835
3836
3837STRLEN
3838Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
3839{
3840 return sv_utf8_upgrade_flags(sv, SV_GMAGIC);
3841}
3842
c461cf8f
JH
3843/*
3844=for apidoc sv_utf8_upgrade
3845
78ea37eb 3846Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3847Forces the SV to string form if it is not already.
4411f3b6
NIS
3848Always sets the SvUTF8 flag to avoid future validity checks even
3849if all the bytes have hibit clear.
c461cf8f 3850
13a6c0e0
JH
3851This is not as a general purpose byte encoding to Unicode interface:
3852use the Encode extension for that.
3853
8d6d96c1
HS
3854=for apidoc sv_utf8_upgrade_flags
3855
78ea37eb 3856Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3857Forces the SV to string form if it is not already.
8d6d96c1
HS
3858Always sets the SvUTF8 flag to avoid future validity checks even
3859if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
3860will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
3861C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3862
13a6c0e0
JH
3863This is not as a general purpose byte encoding to Unicode interface:
3864use the Encode extension for that.
3865
8d6d96c1
HS
3866=cut
3867*/
3868
3869STRLEN
3870Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
3871{
808c356f
RGS
3872 if (sv == &PL_sv_undef)
3873 return 0;
e0e62c2a
NIS
3874 if (!SvPOK(sv)) {
3875 STRLEN len = 0;
d52b7888
NC
3876 if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3877 (void) sv_2pv_flags(sv,&len, flags);
3878 if (SvUTF8(sv))
3879 return len;
3880 } else {
3881 (void) SvPV_force(sv,len);
3882 }
e0e62c2a 3883 }
4411f3b6 3884
f5cee72b 3885 if (SvUTF8(sv)) {
5fec3b1d 3886 return SvCUR(sv);
f5cee72b 3887 }
5fec3b1d 3888
765f542d
NC
3889 if (SvIsCOW(sv)) {
3890 sv_force_normal_flags(sv, 0);
db42d148
NIS
3891 }
3892
88632417 3893 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
799ef3cb 3894 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 3895 else { /* Assume Latin-1/EBCDIC */
c4e7c712
NC
3896 /* This function could be much more efficient if we
3897 * had a FLAG in SVs to signal if there are any hibit
3898 * chars in the PV. Given that there isn't such a flag
3899 * make the loop as fast as possible. */
3900 U8 *s = (U8 *) SvPVX(sv);
3901 U8 *e = (U8 *) SvEND(sv);
3902 U8 *t = s;
3903 int hibit = 0;
3904
3905 while (t < e) {
3906 U8 ch = *t++;
3907 if ((hibit = !NATIVE_IS_INVARIANT(ch)))
3908 break;
3909 }
3910 if (hibit) {
3911 STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
3912 s = bytes_to_utf8((U8*)s, &len);
3913
3914 SvPV_free(sv); /* No longer using what was there before. */
3915
3916 SvPV_set(sv, (char*)s);
3917 SvCUR_set(sv, len - 1);
3918 SvLEN_set(sv, len); /* No longer know the real size. */
3919 }
3920 /* Mark as UTF-8 even if no hibit - saves scanning loop */
3921 SvUTF8_on(sv);
560a288e 3922 }
4411f3b6 3923 return SvCUR(sv);
560a288e
GS
3924}
3925
c461cf8f
JH
3926/*
3927=for apidoc sv_utf8_downgrade
3928
78ea37eb
TS
3929Attempts to convert the PV of an SV from characters to bytes.
3930If the PV contains a character beyond byte, this conversion will fail;
3931in this case, either returns false or, if C<fail_ok> is not
c461cf8f
JH
3932true, croaks.
3933
13a6c0e0
JH
3934This is not as a general purpose Unicode to byte encoding interface:
3935use the Encode extension for that.
3936
c461cf8f
JH
3937=cut
3938*/
3939
560a288e
GS
3940bool
3941Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
3942{
78ea37eb 3943 if (SvPOKp(sv) && SvUTF8(sv)) {
fa301091 3944 if (SvCUR(sv)) {
03cfe0ae 3945 U8 *s;
652088fc 3946 STRLEN len;
fa301091 3947
765f542d
NC
3948 if (SvIsCOW(sv)) {
3949 sv_force_normal_flags(sv, 0);
3950 }
03cfe0ae
NIS
3951 s = (U8 *) SvPV(sv, len);
3952 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
3953 if (fail_ok)
3954 return FALSE;
3955 else {
3956 if (PL_op)
3957 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 3958 OP_DESC(PL_op));
fa301091
JH
3959 else
3960 Perl_croak(aTHX_ "Wide character");
3961 }
4b3603a4 3962 }
b162af07 3963 SvCUR_set(sv, len);
67e989fb 3964 }
560a288e 3965 }
ffebcc3e 3966 SvUTF8_off(sv);
560a288e
GS
3967 return TRUE;
3968}
3969
c461cf8f
JH
3970/*
3971=for apidoc sv_utf8_encode
3972
78ea37eb
TS
3973Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3974flag off so that it looks like octets again.
c461cf8f
JH
3975
3976=cut
3977*/
3978
560a288e
GS
3979void
3980Perl_sv_utf8_encode(pTHX_ register SV *sv)
3981{
4411f3b6 3982 (void) sv_utf8_upgrade(sv);
4c94c214
NC
3983 if (SvIsCOW(sv)) {
3984 sv_force_normal_flags(sv, 0);
3985 }
3986 if (SvREADONLY(sv)) {
3987 Perl_croak(aTHX_ PL_no_modify);
3988 }
560a288e
GS
3989 SvUTF8_off(sv);
3990}
3991
4411f3b6
NIS
3992/*
3993=for apidoc sv_utf8_decode
3994
78ea37eb
TS
3995If the PV of the SV is an octet sequence in UTF-8
3996and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3997so that it looks like a character. If the PV contains only single-byte
3998characters, the C<SvUTF8> flag stays being off.
3999Scans PV for validity and returns false if the PV is invalid UTF-8.
4411f3b6
NIS
4000
4001=cut
4002*/
4003
560a288e
GS
4004bool
4005Perl_sv_utf8_decode(pTHX_ register SV *sv)
4006{
78ea37eb 4007 if (SvPOKp(sv)) {
63cd0674
NIS
4008 U8 *c;
4009 U8 *e;
9cbac4c7 4010
645c22ef
DM
4011 /* The octets may have got themselves encoded - get them back as
4012 * bytes
4013 */
4014 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
4015 return FALSE;
4016
4017 /* it is actually just a matter of turning the utf8 flag on, but
4018 * we want to make sure everything inside is valid utf8 first.
4019 */
63cd0674
NIS
4020 c = (U8 *) SvPVX(sv);
4021 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 4022 return FALSE;
63cd0674 4023 e = (U8 *) SvEND(sv);
511c2ff0 4024 while (c < e) {
c4d5f83a
NIS
4025 U8 ch = *c++;
4026 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
4027 SvUTF8_on(sv);
4028 break;
4029 }
560a288e 4030 }
560a288e
GS
4031 }
4032 return TRUE;
4033}
4034
09540bc3
JH
4035/* sv_setsv() is now a macro using Perl_sv_setsv_flags();
4036 * this function provided for binary compatibility only
4037 */
4038
4039void
4040Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
4041{
4042 sv_setsv_flags(dstr, sstr, SV_GMAGIC);
4043}
4044
954c1994
GS
4045/*
4046=for apidoc sv_setsv
4047
645c22ef
DM
4048Copies the contents of the source SV C<ssv> into the destination SV
4049C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
4050function if the source SV needs to be reused. Does not handle 'set' magic.
4051Loosely speaking, it performs a copy-by-value, obliterating any previous
4052content of the destination.
4053
4054You probably want to use one of the assortment of wrappers, such as
4055C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
4056C<SvSetMagicSV_nosteal>.
4057
8d6d96c1
HS
4058=for apidoc sv_setsv_flags
4059
645c22ef
DM
4060Copies the contents of the source SV C<ssv> into the destination SV
4061C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
4062function if the source SV needs to be reused. Does not handle 'set' magic.
4063Loosely speaking, it performs a copy-by-value, obliterating any previous
4064content of the destination.
4065If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
5fcdf167
NC
4066C<ssv> if appropriate, else not. If the C<flags> parameter has the
4067C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
4068and C<sv_setsv_nomg> are implemented in terms of this function.
645c22ef
DM
4069
4070You probably want to use one of the assortment of wrappers, such as
4071C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
4072C<SvSetMagicSV_nosteal>.
4073
4074This is the primary function for copying scalars, and most other
4075copy-ish functions and macros use this underneath.
8d6d96c1
HS
4076
4077=cut
4078*/
4079
4080void
4081Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
4082{
8990e307
LW
4083 register U32 sflags;
4084 register int dtype;
4085 register int stype;
463ee0b2 4086
79072805
LW
4087 if (sstr == dstr)
4088 return;
765f542d 4089 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 4090 if (!sstr)
3280af22 4091 sstr = &PL_sv_undef;
8990e307
LW
4092 stype = SvTYPE(sstr);
4093 dtype = SvTYPE(dstr);
79072805 4094
a0d0e21e 4095 SvAMAGIC_off(dstr);
7a5fa8a2 4096 if ( SvVOK(dstr) )
ece467f9
JP
4097 {
4098 /* need to nuke the magic */
4099 mg_free(dstr);
4100 SvRMAGICAL_off(dstr);
4101 }
9e7bc3e8 4102
463ee0b2 4103 /* There's a lot of redundancy below but we're going for speed here */
79072805 4104
8990e307 4105 switch (stype) {
79072805 4106 case SVt_NULL:
aece5585 4107 undef_sstr:
20408e3c
GS
4108 if (dtype != SVt_PVGV) {
4109 (void)SvOK_off(dstr);
4110 return;
4111 }
4112 break;
463ee0b2 4113 case SVt_IV:
aece5585
GA
4114 if (SvIOK(sstr)) {
4115 switch (dtype) {
4116 case SVt_NULL:
8990e307 4117 sv_upgrade(dstr, SVt_IV);
aece5585
GA
4118 break;
4119 case SVt_NV:
8990e307 4120 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
4121 break;
4122 case SVt_RV:
4123 case SVt_PV:
a0d0e21e 4124 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
4125 break;
4126 }
4127 (void)SvIOK_only(dstr);
45977657 4128 SvIV_set(dstr, SvIVX(sstr));
25da4f38
IZ
4129 if (SvIsUV(sstr))
4130 SvIsUV_on(dstr);
27c9684d
AP
4131 if (SvTAINTED(sstr))
4132 SvTAINT(dstr);
aece5585 4133 return;
8990e307 4134 }
aece5585
GA
4135 goto undef_sstr;
4136
463ee0b2 4137 case SVt_NV:
aece5585
GA
4138 if (SvNOK(sstr)) {
4139 switch (dtype) {
4140 case SVt_NULL:
4141 case SVt_IV:
8990e307 4142 sv_upgrade(dstr, SVt_NV);
aece5585
GA
4143 break;
4144 case SVt_RV:
4145 case SVt_PV:
4146 case SVt_PVIV:
a0d0e21e 4147 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
4148 break;
4149 }
9d6ce603 4150 SvNV_set(dstr, SvNVX(sstr));
aece5585 4151 (void)SvNOK_only(dstr);
27c9684d
AP
4152 if (SvTAINTED(sstr))
4153 SvTAINT(dstr);
aece5585 4154 return;
8990e307 4155 }
aece5585
GA
4156 goto undef_sstr;
4157
ed6116ce 4158 case SVt_RV:
8990e307 4159 if (dtype < SVt_RV)
ed6116ce 4160 sv_upgrade(dstr, SVt_RV);
c07a80fd 4161 else if (dtype == SVt_PVGV &&
23bb1b96 4162 SvROK(sstr) && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
c07a80fd 4163 sstr = SvRV(sstr);
a5f75d66 4164 if (sstr == dstr) {
1d7c1841
GS
4165 if (GvIMPORTED(dstr) != GVf_IMPORTED
4166 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4167 {
a5f75d66 4168 GvIMPORTED_on(dstr);
1d7c1841 4169 }
a5f75d66
AD
4170 GvMULTI_on(dstr);
4171 return;
4172 }
c07a80fd 4173 goto glob_assign;
4174 }
ed6116ce 4175 break;
fc36a67e 4176 case SVt_PVFM:
d89fc664
NC
4177#ifdef PERL_COPY_ON_WRITE
4178 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
4179 if (dtype < SVt_PVIV)
4180 sv_upgrade(dstr, SVt_PVIV);
4181 break;
4182 }
4183 /* Fall through */
4184#endif
4185 case SVt_PV:
8990e307 4186 if (dtype < SVt_PV)
463ee0b2 4187 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
4188 break;
4189 case SVt_PVIV:
8990e307 4190 if (dtype < SVt_PVIV)
463ee0b2 4191 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
4192 break;
4193 case SVt_PVNV:
8990e307 4194 if (dtype < SVt_PVNV)
463ee0b2 4195 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 4196 break;
4633a7c4
LW
4197 case SVt_PVAV:
4198 case SVt_PVHV:
4199 case SVt_PVCV:
4633a7c4 4200 case SVt_PVIO:
a3b680e6
AL
4201 {
4202 const char * const type = sv_reftype(sstr,0);
533c011a 4203 if (PL_op)
a3b680e6 4204 Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_NAME(PL_op));
4633a7c4 4205 else
a3b680e6
AL
4206 Perl_croak(aTHX_ "Bizarre copy of %s", type);
4207 }
4633a7c4
LW
4208 break;
4209
79072805 4210 case SVt_PVGV:
8990e307 4211 if (dtype <= SVt_PVGV) {
c07a80fd 4212 glob_assign:
a5f75d66 4213 if (dtype != SVt_PVGV) {
a3b680e6
AL
4214 const char * const name = GvNAME(sstr);
4215 const STRLEN len = GvNAMELEN(sstr);
b76195c2
DM
4216 /* don't upgrade SVt_PVLV: it can hold a glob */
4217 if (dtype != SVt_PVLV)
4218 sv_upgrade(dstr, SVt_PVGV);
14befaf4 4219 sv_magic(dstr, dstr, PERL_MAGIC_glob, Nullch, 0);
85aff577 4220 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
4221 GvNAME(dstr) = savepvn(name, len);
4222 GvNAMELEN(dstr) = len;
4223 SvFAKE_on(dstr); /* can coerce to non-glob */
4224 }
7bac28a0 4225 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
4226 else if (PL_curstackinfo->si_type == PERLSI_SORT
4227 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
cea2e8a9 4228 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
7bac28a0 4229 GvNAME(dstr));
5bd07a3d 4230
7fb37951
AMS
4231#ifdef GV_UNIQUE_CHECK
4232 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
4233 Perl_croak(aTHX_ PL_no_modify);
4234 }
4235#endif
4236
a0d0e21e 4237 (void)SvOK_off(dstr);
a5f75d66 4238 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 4239 gp_free((GV*)dstr);
79072805 4240 GvGP(dstr) = gp_ref(GvGP(sstr));
27c9684d
AP
4241 if (SvTAINTED(sstr))
4242 SvTAINT(dstr);
1d7c1841
GS
4243 if (GvIMPORTED(dstr) != GVf_IMPORTED
4244 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4245 {
a5f75d66 4246 GvIMPORTED_on(dstr);
1d7c1841 4247 }
a5f75d66 4248 GvMULTI_on(dstr);
79072805
LW
4249 return;
4250 }
4251 /* FALL THROUGH */
4252
4253 default:
8d6d96c1 4254 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 4255 mg_get(sstr);
eb160463 4256 if ((int)SvTYPE(sstr) != stype) {
973f89ab
CS
4257 stype = SvTYPE(sstr);
4258 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
4259 goto glob_assign;
4260 }
4261 }
ded42b9f 4262 if (stype == SVt_PVLV)
6fc92669 4263 (void)SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 4264 else
eb160463 4265 (void)SvUPGRADE(dstr, (U32)stype);
79072805
LW
4266 }
4267
8990e307
LW
4268 sflags = SvFLAGS(sstr);
4269
4270 if (sflags & SVf_ROK) {
4271 if (dtype >= SVt_PV) {
4272 if (dtype == SVt_PVGV) {
4273 SV *sref = SvREFCNT_inc(SvRV(sstr));
4274 SV *dref = 0;
a3b680e6 4275 const int intro = GvINTRO(dstr);
a0d0e21e 4276
7fb37951
AMS
4277#ifdef GV_UNIQUE_CHECK
4278 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
4279 Perl_croak(aTHX_ PL_no_modify);
4280 }
4281#endif
4282
a0d0e21e 4283 if (intro) {
a5f75d66 4284 GvINTRO_off(dstr); /* one-shot flag */
1d7c1841 4285 GvLINE(dstr) = CopLINE(PL_curcop);
1edc1566 4286 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 4287 }
a5f75d66 4288 GvMULTI_on(dstr);
8990e307
LW
4289 switch (SvTYPE(sref)) {
4290 case SVt_PVAV:
a0d0e21e 4291 if (intro)
890ed176 4292 SAVEGENERICSV(GvAV(dstr));
a0d0e21e
LW
4293 else
4294 dref = (SV*)GvAV(dstr);
8990e307 4295 GvAV(dstr) = (AV*)sref;
39bac7f7 4296 if (!GvIMPORTED_AV(dstr)
1d7c1841
GS
4297 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4298 {
a5f75d66 4299 GvIMPORTED_AV_on(dstr);
1d7c1841 4300 }
8990e307
LW
4301 break;
4302 case SVt_PVHV:
a0d0e21e 4303 if (intro)
890ed176 4304 SAVEGENERICSV(GvHV(dstr));
a0d0e21e
LW
4305 else
4306 dref = (SV*)GvHV(dstr);
8990e307 4307 GvHV(dstr) = (HV*)sref;
39bac7f7 4308 if (!GvIMPORTED_HV(dstr)
1d7c1841
GS
4309 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4310 {
a5f75d66 4311 GvIMPORTED_HV_on(dstr);
1d7c1841 4312 }
8990e307
LW
4313 break;
4314 case SVt_PVCV:
8ebc5c01 4315 if (intro) {
4316 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
4317 SvREFCNT_dec(GvCV(dstr));
4318 GvCV(dstr) = Nullcv;
68dc0745 4319 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 4320 PL_sub_generation++;
8ebc5c01 4321 }
890ed176 4322 SAVEGENERICSV(GvCV(dstr));
8ebc5c01 4323 }
68dc0745 4324 else
4325 dref = (SV*)GvCV(dstr);
4326 if (GvCV(dstr) != (CV*)sref) {
748a9306 4327 CV* cv = GvCV(dstr);
4633a7c4 4328 if (cv) {
68dc0745 4329 if (!GvCVGEN((GV*)dstr) &&
4330 (CvROOT(cv) || CvXSUB(cv)))
4331 {
7bac28a0 4332 /* ahem, death to those who redefine
4333 * active sort subs */
3280af22
NIS
4334 if (PL_curstackinfo->si_type == PERLSI_SORT &&
4335 PL_sortcop == CvSTART(cv))
1c846c1f 4336 Perl_croak(aTHX_
7bac28a0 4337 "Can't redefine active sort subroutine %s",
4338 GvENAME((GV*)dstr));
beab0874
JT
4339 /* Redefining a sub - warning is mandatory if
4340 it was a const and its value changed. */
4341 if (ckWARN(WARN_REDEFINE)
4342 || (CvCONST(cv)
4343 && (!CvCONST((CV*)sref)
4344 || sv_cmp(cv_const_sv(cv),
4345 cv_const_sv((CV*)sref)))))
4346 {
9014280d 4347 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
beab0874 4348 CvCONST(cv)
910764e6
RGS
4349 ? "Constant subroutine %s::%s redefined"
4350 : "Subroutine %s::%s redefined",
bfcb3514 4351 HvNAME_get(GvSTASH((GV*)dstr)),
beab0874
JT
4352 GvENAME((GV*)dstr));
4353 }
9607fc9c 4354 }
fb24441d
RGS
4355 if (!intro)
4356 cv_ckproto(cv, (GV*)dstr,
4357 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 4358 }
a5f75d66 4359 GvCV(dstr) = (CV*)sref;
7a4c00b4 4360 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 4361 GvASSUMECV_on(dstr);
3280af22 4362 PL_sub_generation++;
a5f75d66 4363 }
39bac7f7 4364 if (!GvIMPORTED_CV(dstr)
1d7c1841
GS
4365 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4366 {
a5f75d66 4367 GvIMPORTED_CV_on(dstr);
1d7c1841 4368 }
8990e307 4369 break;
91bba347
LW
4370 case SVt_PVIO:
4371 if (intro)
890ed176 4372 SAVEGENERICSV(GvIOp(dstr));
91bba347
LW
4373 else
4374 dref = (SV*)GvIOp(dstr);
4375 GvIOp(dstr) = (IO*)sref;
4376 break;
f4d13ee9
JH
4377 case SVt_PVFM:
4378 if (intro)
890ed176 4379 SAVEGENERICSV(GvFORM(dstr));
f4d13ee9
JH
4380 else
4381 dref = (SV*)GvFORM(dstr);
4382 GvFORM(dstr) = (CV*)sref;
4383 break;
8990e307 4384 default:
a0d0e21e 4385 if (intro)
890ed176 4386 SAVEGENERICSV(GvSV(dstr));
a0d0e21e
LW
4387 else
4388 dref = (SV*)GvSV(dstr);
8990e307 4389 GvSV(dstr) = sref;
39bac7f7 4390 if (!GvIMPORTED_SV(dstr)
1d7c1841
GS
4391 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4392 {
a5f75d66 4393 GvIMPORTED_SV_on(dstr);
1d7c1841 4394 }
8990e307
LW
4395 break;
4396 }
4397 if (dref)
4398 SvREFCNT_dec(dref);
27c9684d
AP
4399 if (SvTAINTED(sstr))
4400 SvTAINT(dstr);
8990e307
LW
4401 return;
4402 }
3f7c398e 4403 if (SvPVX_const(dstr)) {
8bd4d4c5 4404 SvPV_free(dstr);
b162af07
SP
4405 SvLEN_set(dstr, 0);
4406 SvCUR_set(dstr, 0);
a0d0e21e 4407 }
8990e307 4408 }
a0d0e21e 4409 (void)SvOK_off(dstr);
b162af07 4410 SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
ed6116ce 4411 SvROK_on(dstr);
8990e307 4412 if (sflags & SVp_NOK) {
3332b3c1
JH
4413 SvNOKp_on(dstr);
4414 /* Only set the public OK flag if the source has public OK. */
4415 if (sflags & SVf_NOK)
4416 SvFLAGS(dstr) |= SVf_NOK;
9d6ce603 4417 SvNV_set(dstr, SvNVX(sstr));
ed6116ce 4418 }
8990e307 4419 if (sflags & SVp_IOK) {
3332b3c1
JH
4420 (void)SvIOKp_on(dstr);
4421 if (sflags & SVf_IOK)
4422 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4423 if (sflags & SVf_IVisUV)
25da4f38 4424 SvIsUV_on(dstr);
45977657 4425 SvIV_set(dstr, SvIVX(sstr));
ed6116ce 4426 }
a0d0e21e
LW
4427 if (SvAMAGIC(sstr)) {
4428 SvAMAGIC_on(dstr);
4429 }
ed6116ce 4430 }
8990e307 4431 else if (sflags & SVp_POK) {
765f542d 4432 bool isSwipe = 0;
79072805
LW
4433
4434 /*
4435 * Check to see if we can just swipe the string. If so, it's a
4436 * possible small lose on short strings, but a big win on long ones.
3f7c398e
SP
4437 * It might even be a win on short strings if SvPVX_const(dstr)
4438 * has to be allocated and SvPVX_const(sstr) has to be freed.
79072805
LW
4439 */
4440
120fac95
NC
4441 /* Whichever path we take through the next code, we want this true,
4442 and doing it now facilitates the COW check. */
4443 (void)SvPOK_only(dstr);
4444
765f542d
NC
4445 if (
4446#ifdef PERL_COPY_ON_WRITE
4447 (sflags & (SVf_FAKE | SVf_READONLY)) != (SVf_FAKE | SVf_READONLY)
4448 &&
4449#endif
4450 !(isSwipe =
4451 (sflags & SVs_TEMP) && /* slated for free anyway? */
4452 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
5fcdf167
NC
4453 (!(flags & SV_NOSTEAL)) &&
4454 /* and we're allowed to steal temps */
765f542d
NC
4455 SvREFCNT(sstr) == 1 && /* and no other references to it? */
4456 SvLEN(sstr) && /* and really is a string */
645c22ef 4457 /* and won't be needed again, potentially */
765f542d
NC
4458 !(PL_op && PL_op->op_type == OP_AASSIGN))
4459#ifdef PERL_COPY_ON_WRITE
4460 && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
120fac95 4461 && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
765f542d
NC
4462 && SvTYPE(sstr) >= SVt_PVIV)
4463#endif
4464 ) {
4465 /* Failed the swipe test, and it's not a shared hash key either.
4466 Have to copy the string. */
4467 STRLEN len = SvCUR(sstr);
4468 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3f7c398e 4469 Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
765f542d
NC
4470 SvCUR_set(dstr, len);
4471 *SvEND(dstr) = '\0';
765f542d
NC
4472 } else {
4473 /* If PERL_COPY_ON_WRITE is not defined, then isSwipe will always
4474 be true in here. */
4475#ifdef PERL_COPY_ON_WRITE
4476 /* Either it's a shared hash key, or it's suitable for
4477 copy-on-write or we can swipe the string. */
46187eeb 4478 if (DEBUG_C_TEST) {
ed252734 4479 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
4480 sv_dump(sstr);
4481 sv_dump(dstr);
46187eeb 4482 }
765f542d
NC
4483 if (!isSwipe) {
4484 /* I believe I should acquire a global SV mutex if
4485 it's a COW sv (not a shared hash key) to stop
4486 it going un copy-on-write.
4487 If the source SV has gone un copy on write between up there
4488 and down here, then (assert() that) it is of the correct
4489 form to make it copy on write again */
4490 if ((sflags & (SVf_FAKE | SVf_READONLY))
4491 != (SVf_FAKE | SVf_READONLY)) {
4492 SvREADONLY_on(sstr);
4493 SvFAKE_on(sstr);
4494 /* Make the source SV into a loop of 1.
4495 (about to become 2) */
a29f6d03 4496 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
4497 }
4498 }
4499#endif
4500 /* Initial code is common. */
3f7c398e 4501 if (SvPVX_const(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
4502 if (SvOOK(dstr)) {
4503 SvFLAGS(dstr) &= ~SVf_OOK;
3f7c398e 4504 Safefree(SvPVX_const(dstr) - SvIVX(dstr));
a5f75d66 4505 }
50483b2c 4506 else if (SvLEN(dstr))
3f7c398e 4507 Safefree(SvPVX_const(dstr));
79072805 4508 }
765f542d
NC
4509
4510#ifdef PERL_COPY_ON_WRITE
4511 if (!isSwipe) {
4512 /* making another shared SV. */
4513 STRLEN cur = SvCUR(sstr);
4514 STRLEN len = SvLEN(sstr);
d89fc664 4515 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
4516 if (len) {
4517 /* SvIsCOW_normal */
4518 /* splice us in between source and next-after-source. */
a29f6d03
NC
4519 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4520 SV_COW_NEXT_SV_SET(sstr, dstr);
765f542d
NC
4521 SvPV_set(dstr, SvPVX(sstr));
4522 } else {
4523 /* SvIsCOW_shared_hash */
4524 UV hash = SvUVX(sstr);
46187eeb
NC
4525 DEBUG_C(PerlIO_printf(Perl_debug_log,
4526 "Copy on write: Sharing hash\n"));
765f542d 4527 SvPV_set(dstr,
3f7c398e 4528 sharepvn(SvPVX_const(sstr),
765f542d 4529 (sflags & SVf_UTF8?-cur:cur), hash));
607fa7f2 4530 SvUV_set(dstr, hash);
765f542d 4531 }
87a1ef3d
SP
4532 SvLEN_set(dstr, len);
4533 SvCUR_set(dstr, cur);
765f542d
NC
4534 SvREADONLY_on(dstr);
4535 SvFAKE_on(dstr);
4536 /* Relesase a global SV mutex. */
4537 }
4538 else
4539#endif
4540 { /* Passes the swipe test. */
4541 SvPV_set(dstr, SvPVX(sstr));
4542 SvLEN_set(dstr, SvLEN(sstr));
4543 SvCUR_set(dstr, SvCUR(sstr));
4544
4545 SvTEMP_off(dstr);
4546 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
4547 SvPV_set(sstr, Nullch);
4548 SvLEN_set(sstr, 0);
4549 SvCUR_set(sstr, 0);
4550 SvTEMP_off(sstr);
4551 }
4552 }
9aa983d2 4553 if (sflags & SVf_UTF8)
a7cb1f99 4554 SvUTF8_on(dstr);
79072805 4555 /*SUPPRESS 560*/
8990e307 4556 if (sflags & SVp_NOK) {
3332b3c1
JH
4557 SvNOKp_on(dstr);
4558 if (sflags & SVf_NOK)
4559 SvFLAGS(dstr) |= SVf_NOK;
9d6ce603 4560 SvNV_set(dstr, SvNVX(sstr));
79072805 4561 }
8990e307 4562 if (sflags & SVp_IOK) {
3332b3c1
JH
4563 (void)SvIOKp_on(dstr);
4564 if (sflags & SVf_IOK)
4565 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4566 if (sflags & SVf_IVisUV)
25da4f38 4567 SvIsUV_on(dstr);
45977657 4568 SvIV_set(dstr, SvIVX(sstr));
79072805 4569 }
92f0c265 4570 if (SvVOK(sstr)) {
7a5fa8a2 4571 MAGIC *smg = mg_find(sstr,PERL_MAGIC_vstring);
ece467f9
JP
4572 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4573 smg->mg_ptr, smg->mg_len);
439cb1c4 4574 SvRMAGICAL_on(dstr);
7a5fa8a2 4575 }
79072805 4576 }
8990e307 4577 else if (sflags & SVp_IOK) {
3332b3c1
JH
4578 if (sflags & SVf_IOK)
4579 (void)SvIOK_only(dstr);
4580 else {
9cbac4c7
DM
4581 (void)SvOK_off(dstr);
4582 (void)SvIOKp_on(dstr);
3332b3c1
JH
4583 }
4584 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2b1c7e3e 4585 if (sflags & SVf_IVisUV)
25da4f38 4586 SvIsUV_on(dstr);
45977657 4587 SvIV_set(dstr, SvIVX(sstr));
3332b3c1
JH
4588 if (sflags & SVp_NOK) {
4589 if (sflags & SVf_NOK)
4590 (void)SvNOK_on(dstr);
4591 else
4592 (void)SvNOKp_on(dstr);
9d6ce603 4593 SvNV_set(dstr, SvNVX(sstr));
3332b3c1
JH
4594 }
4595 }
4596 else if (sflags & SVp_NOK) {
4597 if (sflags & SVf_NOK)
4598 (void)SvNOK_only(dstr);
4599 else {
9cbac4c7 4600 (void)SvOK_off(dstr);
3332b3c1
JH
4601 SvNOKp_on(dstr);
4602 }
9d6ce603 4603 SvNV_set(dstr, SvNVX(sstr));
79072805
LW
4604 }
4605 else {
20408e3c 4606 if (dtype == SVt_PVGV) {
e476b1b5 4607 if (ckWARN(WARN_MISC))
9014280d 4608 Perl_warner(aTHX_ packWARN(WARN_MISC), "Undefined value assigned to typeglob");
20408e3c
GS
4609 }
4610 else
4611 (void)SvOK_off(dstr);
a0d0e21e 4612 }
27c9684d
AP
4613 if (SvTAINTED(sstr))
4614 SvTAINT(dstr);
79072805
LW
4615}
4616
954c1994
GS
4617/*
4618=for apidoc sv_setsv_mg
4619
4620Like C<sv_setsv>, but also handles 'set' magic.
4621
4622=cut
4623*/
4624
79072805 4625void
864dbfa3 4626Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
4627{
4628 sv_setsv(dstr,sstr);
4629 SvSETMAGIC(dstr);
4630}
4631
ed252734
NC
4632#ifdef PERL_COPY_ON_WRITE
4633SV *
4634Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4635{
4636 STRLEN cur = SvCUR(sstr);
4637 STRLEN len = SvLEN(sstr);
4638 register char *new_pv;
4639
4640 if (DEBUG_C_TEST) {
4641 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4642 sstr, dstr);
4643 sv_dump(sstr);
4644 if (dstr)
4645 sv_dump(dstr);
4646 }
4647
4648 if (dstr) {
4649 if (SvTHINKFIRST(dstr))
4650 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
3f7c398e
SP
4651 else if (SvPVX_const(dstr))
4652 Safefree(SvPVX_const(dstr));
ed252734
NC
4653 }
4654 else
4655 new_SV(dstr);
b988aa42 4656 (void)SvUPGRADE (dstr, SVt_PVIV);
ed252734
NC
4657
4658 assert (SvPOK(sstr));
4659 assert (SvPOKp(sstr));
4660 assert (!SvIOK(sstr));
4661 assert (!SvIOKp(sstr));
4662 assert (!SvNOK(sstr));
4663 assert (!SvNOKp(sstr));
4664
4665 if (SvIsCOW(sstr)) {
4666
4667 if (SvLEN(sstr) == 0) {
4668 /* source is a COW shared hash key. */
4669 UV hash = SvUVX(sstr);
4670 DEBUG_C(PerlIO_printf(Perl_debug_log,
4671 "Fast copy on write: Sharing hash\n"));
607fa7f2 4672 SvUV_set(dstr, hash);
3f7c398e 4673 new_pv = sharepvn(SvPVX_const(sstr), (SvUTF8(sstr)?-cur:cur), hash);
ed252734
NC
4674 goto common_exit;
4675 }
4676 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4677 } else {
4678 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
b988aa42 4679 (void)SvUPGRADE (sstr, SVt_PVIV);
ed252734
NC
4680 SvREADONLY_on(sstr);
4681 SvFAKE_on(sstr);
4682 DEBUG_C(PerlIO_printf(Perl_debug_log,
4683 "Fast copy on write: Converting sstr to COW\n"));
4684 SV_COW_NEXT_SV_SET(dstr, sstr);
4685 }
4686 SV_COW_NEXT_SV_SET(sstr, dstr);
4687 new_pv = SvPVX(sstr);
4688
4689 common_exit:
4690 SvPV_set(dstr, new_pv);
4691 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4692 if (SvUTF8(sstr))
4693 SvUTF8_on(dstr);
87a1ef3d
SP
4694 SvLEN_set(dstr, len);
4695 SvCUR_set(dstr, cur);
ed252734
NC
4696 if (DEBUG_C_TEST) {
4697 sv_dump(dstr);
4698 }
4699 return dstr;
4700}
4701#endif
4702
954c1994
GS
4703/*
4704=for apidoc sv_setpvn
4705
4706Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
4707bytes to be copied. If the C<ptr> argument is NULL the SV will become
4708undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
4709
4710=cut
4711*/
4712
ef50df4b 4713void
864dbfa3 4714Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 4715{
c6f8c383 4716 register char *dptr;
22c522df 4717
765f542d 4718 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4719 if (!ptr) {
a0d0e21e 4720 (void)SvOK_off(sv);
463ee0b2
LW
4721 return;
4722 }
22c522df
JH
4723 else {
4724 /* len is STRLEN which is unsigned, need to copy to signed */
a3b680e6 4725 const IV iv = len;
9c5ffd7c
JH
4726 if (iv < 0)
4727 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 4728 }
6fc92669 4729 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4730
79072805 4731 SvGROW(sv, len + 1);
c6f8c383
GA
4732 dptr = SvPVX(sv);
4733 Move(ptr,dptr,len,char);
4734 dptr[len] = '\0';
79072805 4735 SvCUR_set(sv, len);
1aa99e6b 4736 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4737 SvTAINT(sv);
79072805
LW
4738}
4739
954c1994
GS
4740/*
4741=for apidoc sv_setpvn_mg
4742
4743Like C<sv_setpvn>, but also handles 'set' magic.
4744
4745=cut
4746*/
4747
79072805 4748void
864dbfa3 4749Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4750{
4751 sv_setpvn(sv,ptr,len);
4752 SvSETMAGIC(sv);
4753}
4754
954c1994
GS
4755/*
4756=for apidoc sv_setpv
4757
4758Copies a string into an SV. The string must be null-terminated. Does not
4759handle 'set' magic. See C<sv_setpv_mg>.
4760
4761=cut
4762*/
4763
ef50df4b 4764void
864dbfa3 4765Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4766{
4767 register STRLEN len;
4768
765f542d 4769 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4770 if (!ptr) {
a0d0e21e 4771 (void)SvOK_off(sv);
463ee0b2
LW
4772 return;
4773 }
79072805 4774 len = strlen(ptr);
6fc92669 4775 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4776
79072805 4777 SvGROW(sv, len + 1);
463ee0b2 4778 Move(ptr,SvPVX(sv),len+1,char);
79072805 4779 SvCUR_set(sv, len);
1aa99e6b 4780 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
4781 SvTAINT(sv);
4782}
4783
954c1994
GS
4784/*
4785=for apidoc sv_setpv_mg
4786
4787Like C<sv_setpv>, but also handles 'set' magic.
4788
4789=cut
4790*/
4791
463ee0b2 4792void
864dbfa3 4793Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
4794{
4795 sv_setpv(sv,ptr);
4796 SvSETMAGIC(sv);
4797}
4798
954c1994
GS
4799/*
4800=for apidoc sv_usepvn
4801
4802Tells an SV to use C<ptr> to find its string value. Normally the string is
1c846c1f 4803stored inside the SV but sv_usepvn allows the SV to use an outside string.
954c1994
GS
4804The C<ptr> should point to memory that was allocated by C<malloc>. The
4805string length, C<len>, must be supplied. This function will realloc the
4806memory pointed to by C<ptr>, so that pointer should not be freed or used by
4807the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
4808See C<sv_usepvn_mg>.
4809
4810=cut
4811*/
4812
ef50df4b 4813void
864dbfa3 4814Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 4815{
1936d2a7 4816 STRLEN allocate;
765f542d 4817 SV_CHECK_THINKFIRST_COW_DROP(sv);
c6f8c383 4818 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 4819 if (!ptr) {
a0d0e21e 4820 (void)SvOK_off(sv);
463ee0b2
LW
4821 return;
4822 }
3f7c398e 4823 if (SvPVX_const(sv))
8bd4d4c5 4824 SvPV_free(sv);
1936d2a7
NC
4825
4826 allocate = PERL_STRLEN_ROUNDUP(len + 1);
7a9b70e9 4827 ptr = saferealloc (ptr, allocate);
f880fe2f 4828 SvPV_set(sv, ptr);
463ee0b2 4829 SvCUR_set(sv, len);
1936d2a7 4830 SvLEN_set(sv, allocate);
463ee0b2 4831 *SvEND(sv) = '\0';
1aa99e6b 4832 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4833 SvTAINT(sv);
79072805
LW
4834}
4835
954c1994
GS
4836/*
4837=for apidoc sv_usepvn_mg
4838
4839Like C<sv_usepvn>, but also handles 'set' magic.
4840
4841=cut
4842*/
4843
ef50df4b 4844void
864dbfa3 4845Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 4846{
51c1089b 4847 sv_usepvn(sv,ptr,len);
ef50df4b
GS
4848 SvSETMAGIC(sv);
4849}
4850
765f542d
NC
4851#ifdef PERL_COPY_ON_WRITE
4852/* Need to do this *after* making the SV normal, as we need the buffer
4853 pointer to remain valid until after we've copied it. If we let go too early,
4854 another thread could invalidate it by unsharing last of the same hash key
4855 (which it can do by means other than releasing copy-on-write Svs)
4856 or by changing the other copy-on-write SVs in the loop. */
4857STATIC void
3f7c398e 4858S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, STRLEN cur, STRLEN len,
765f542d
NC
4859 U32 hash, SV *after)
4860{
4861 if (len) { /* this SV was SvIsCOW_normal(sv) */
4862 /* we need to find the SV pointing to us. */
4863 SV *current = SV_COW_NEXT_SV(after);
7a5fa8a2 4864
765f542d
NC
4865 if (current == sv) {
4866 /* The SV we point to points back to us (there were only two of us
4867 in the loop.)
4868 Hence other SV is no longer copy on write either. */
4869 SvFAKE_off(after);
4870 SvREADONLY_off(after);
4871 } else {
4872 /* We need to follow the pointers around the loop. */
4873 SV *next;
4874 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4875 assert (next);
4876 current = next;
4877 /* don't loop forever if the structure is bust, and we have
4878 a pointer into a closed loop. */
4879 assert (current != after);
3f7c398e 4880 assert (SvPVX_const(current) == pvx);
765f542d
NC
4881 }
4882 /* Make the SV before us point to the SV after us. */
a29f6d03 4883 SV_COW_NEXT_SV_SET(current, after);
765f542d
NC
4884 }
4885 } else {
4886 unsharepvn(pvx, SvUTF8(sv) ? -(I32)cur : cur, hash);
4887 }
4888}
4889
4890int
4891Perl_sv_release_IVX(pTHX_ register SV *sv)
4892{
4893 if (SvIsCOW(sv))
4894 sv_force_normal_flags(sv, 0);
0c34ef67
MHM
4895 SvOOK_off(sv);
4896 return 0;
765f542d
NC
4897}
4898#endif
645c22ef
DM
4899/*
4900=for apidoc sv_force_normal_flags
4901
4902Undo various types of fakery on an SV: if the PV is a shared string, make
4903a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4904an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4905we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4906then a copy-on-write scalar drops its PV buffer (if any) and becomes
4907SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 4908set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
4909C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4910with flags set to 0.
645c22ef
DM
4911
4912=cut
4913*/
4914
6fc92669 4915void
840a7b70 4916Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 4917{
765f542d
NC
4918#ifdef PERL_COPY_ON_WRITE
4919 if (SvREADONLY(sv)) {
4920 /* At this point I believe I should acquire a global SV mutex. */
4921 if (SvFAKE(sv)) {
3f7c398e 4922 const char *pvx = SvPVX_const(sv);
765f542d
NC
4923 STRLEN len = SvLEN(sv);
4924 STRLEN cur = SvCUR(sv);
4925 U32 hash = SvUVX(sv);
4926 SV *next = SV_COW_NEXT_SV(sv); /* next COW sv in the loop. */
46187eeb
NC
4927 if (DEBUG_C_TEST) {
4928 PerlIO_printf(Perl_debug_log,
4929 "Copy on write: Force normal %ld\n",
4930 (long) flags);
e419cbc5 4931 sv_dump(sv);
46187eeb 4932 }
765f542d
NC
4933 SvFAKE_off(sv);
4934 SvREADONLY_off(sv);
4935 /* This SV doesn't own the buffer, so need to New() a new one: */
f880fe2f 4936 SvPV_set(sv, (char*)0);
87a1ef3d 4937 SvLEN_set(sv, 0);
765f542d
NC
4938 if (flags & SV_COW_DROP_PV) {
4939 /* OK, so we don't need to copy our buffer. */
4940 SvPOK_off(sv);
4941 } else {
4942 SvGROW(sv, cur + 1);
4943 Move(pvx,SvPVX(sv),cur,char);
87a1ef3d 4944 SvCUR_set(sv, cur);
765f542d
NC
4945 *SvEND(sv) = '\0';
4946 }
e419cbc5 4947 sv_release_COW(sv, pvx, cur, len, hash, next);
46187eeb 4948 if (DEBUG_C_TEST) {
e419cbc5 4949 sv_dump(sv);
46187eeb 4950 }
765f542d 4951 }
923e4eb5 4952 else if (IN_PERL_RUNTIME)
765f542d
NC
4953 Perl_croak(aTHX_ PL_no_modify);
4954 /* At this point I believe that I can drop the global SV mutex. */
4955 }
4956#else
2213622d 4957 if (SvREADONLY(sv)) {
1c846c1f 4958 if (SvFAKE(sv)) {
3f7c398e 4959 char *pvx = SvPVX_const(sv);
1df70142 4960 const int is_utf8 = SvUTF8(sv);
1c846c1f
NIS
4961 STRLEN len = SvCUR(sv);
4962 U32 hash = SvUVX(sv);
10bcdfd6
NC
4963 SvFAKE_off(sv);
4964 SvREADONLY_off(sv);
f880fe2f 4965 SvPV_set(sv, (char*)0);
b162af07 4966 SvLEN_set(sv, 0);
1c846c1f 4967 SvGROW(sv, len + 1);
3f7c398e 4968 Move(pvx,SvPVX_const(sv),len,char);
1c846c1f 4969 *SvEND(sv) = '\0';
5c98da1c 4970 unsharepvn(pvx, is_utf8 ? -(I32)len : len, hash);
1c846c1f 4971 }
923e4eb5 4972 else if (IN_PERL_RUNTIME)
cea2e8a9 4973 Perl_croak(aTHX_ PL_no_modify);
0f15f207 4974 }
765f542d 4975#endif
2213622d 4976 if (SvROK(sv))
840a7b70 4977 sv_unref_flags(sv, flags);
6fc92669
GS
4978 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4979 sv_unglob(sv);
0f15f207 4980}
1c846c1f 4981
645c22ef
DM
4982/*
4983=for apidoc sv_force_normal
4984
4985Undo various types of fakery on an SV: if the PV is a shared string, make
4986a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4987an xpvmg. See also C<sv_force_normal_flags>.
4988
4989=cut
4990*/
4991
840a7b70
IZ
4992void
4993Perl_sv_force_normal(pTHX_ register SV *sv)
4994{
4995 sv_force_normal_flags(sv, 0);
4996}
4997
954c1994
GS
4998/*
4999=for apidoc sv_chop
5000
1c846c1f 5001Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
5002SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
5003the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 5004string. Uses the "OOK hack".
3f7c398e 5005Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
31869a79 5006refer to the same chunk of data.
954c1994
GS
5007
5008=cut
5009*/
5010
79072805 5011void
f54cb97a 5012Perl_sv_chop(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
5013{
5014 register STRLEN delta;
a0d0e21e 5015 if (!ptr || !SvPOKp(sv))
79072805 5016 return;
3f7c398e 5017 delta = ptr - SvPVX_const(sv);
2213622d 5018 SV_CHECK_THINKFIRST(sv);
79072805
LW
5019 if (SvTYPE(sv) < SVt_PVIV)
5020 sv_upgrade(sv,SVt_PVIV);
5021
5022 if (!SvOOK(sv)) {
50483b2c 5023 if (!SvLEN(sv)) { /* make copy of shared string */
3f7c398e 5024 const char *pvx = SvPVX_const(sv);
50483b2c
JD
5025 STRLEN len = SvCUR(sv);
5026 SvGROW(sv, len + 1);
3f7c398e 5027 Move(pvx,SvPVX_const(sv),len,char);
50483b2c
JD
5028 *SvEND(sv) = '\0';
5029 }
45977657 5030 SvIV_set(sv, 0);
a4bfb290
AB
5031 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
5032 and we do that anyway inside the SvNIOK_off
5033 */
7a5fa8a2 5034 SvFLAGS(sv) |= SVf_OOK;
79072805 5035 }
a4bfb290 5036 SvNIOK_off(sv);
b162af07
SP
5037 SvLEN_set(sv, SvLEN(sv) - delta);
5038 SvCUR_set(sv, SvCUR(sv) - delta);
f880fe2f 5039 SvPV_set(sv, SvPVX(sv) + delta);
45977657 5040 SvIV_set(sv, SvIVX(sv) + delta);
79072805
LW
5041}
5042
09540bc3
JH
5043/* sv_catpvn() is now a macro using Perl_sv_catpvn_flags();
5044 * this function provided for binary compatibility only
5045 */
5046
5047void
5048Perl_sv_catpvn(pTHX_ SV *dsv, const char* sstr, STRLEN slen)
5049{
5050 sv_catpvn_flags(dsv, sstr, slen, SV_GMAGIC);
5051}
5052
954c1994
GS
5053/*
5054=for apidoc sv_catpvn
5055
5056Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
5057C<len> indicates number of bytes to copy. If the SV has the UTF-8
5058status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 5059Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 5060
8d6d96c1
HS
5061=for apidoc sv_catpvn_flags
5062
5063Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
5064C<len> indicates number of bytes to copy. If the SV has the UTF-8
5065status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
5066If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
5067appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
5068in terms of this function.
5069
5070=cut
5071*/
5072
5073void
5074Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
5075{
5076 STRLEN dlen;
f54cb97a 5077 const char *dstr = SvPV_force_flags(dsv, dlen, flags);
8d6d96c1 5078
8d6d96c1
HS
5079 SvGROW(dsv, dlen + slen + 1);
5080 if (sstr == dstr)
3f7c398e 5081 sstr = SvPVX_const(dsv);
8d6d96c1 5082 Move(sstr, SvPVX(dsv) + dlen, slen, char);
b162af07 5083 SvCUR_set(dsv, SvCUR(dsv) + slen);
8d6d96c1
HS
5084 *SvEND(dsv) = '\0';
5085 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
5086 SvTAINT(dsv);
79072805
LW
5087}
5088
954c1994
GS
5089/*
5090=for apidoc sv_catpvn_mg
5091
5092Like C<sv_catpvn>, but also handles 'set' magic.
5093
5094=cut
5095*/
5096
79072805 5097void
864dbfa3 5098Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
5099{
5100 sv_catpvn(sv,ptr,len);
5101 SvSETMAGIC(sv);
5102}
5103
09540bc3
JH
5104/* sv_catsv() is now a macro using Perl_sv_catsv_flags();
5105 * this function provided for binary compatibility only
5106 */
5107
5108void
5109Perl_sv_catsv(pTHX_ SV *dstr, register SV *sstr)
5110{
5111 sv_catsv_flags(dstr, sstr, SV_GMAGIC);
5112}
5113
954c1994
GS
5114/*
5115=for apidoc sv_catsv
5116
13e8c8e3
JH
5117Concatenates the string from SV C<ssv> onto the end of the string in
5118SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
5119not 'set' magic. See C<sv_catsv_mg>.
954c1994 5120
8d6d96c1
HS
5121=for apidoc sv_catsv_flags
5122
5123Concatenates the string from SV C<ssv> onto the end of the string in
5124SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
5125bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
5126and C<sv_catsv_nomg> are implemented in terms of this function.
5127
5128=cut */
5129
ef50df4b 5130void
8d6d96c1 5131Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 5132{
13e8c8e3
JH
5133 char *spv;
5134 STRLEN slen;
46199a12 5135 if (!ssv)
79072805 5136 return;
46199a12 5137 if ((spv = SvPV(ssv, slen))) {
4fd84b44
AD
5138 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
5139 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
8cf8f3d1
NIS
5140 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
5141 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4fd84b44
AD
5142 dsv->sv_flags doesn't have that bit set.
5143 Andy Dougherty 12 Oct 2001
5144 */
5145 I32 sutf8 = DO_UTF8(ssv);
5146 I32 dutf8;
13e8c8e3 5147
8d6d96c1
HS
5148 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
5149 mg_get(dsv);
5150 dutf8 = DO_UTF8(dsv);
5151
5152 if (dutf8 != sutf8) {
13e8c8e3 5153 if (dutf8) {
46199a12 5154 /* Not modifying source SV, so taking a temporary copy. */
8d6d96c1 5155 SV* csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 5156
46199a12 5157 sv_utf8_upgrade(csv);
8d6d96c1 5158 spv = SvPV(csv, slen);
13e8c8e3 5159 }
8d6d96c1
HS
5160 else
5161 sv_utf8_upgrade_nomg(dsv);
e84ff256 5162 }
8d6d96c1 5163 sv_catpvn_nomg(dsv, spv, slen);
560a288e 5164 }
79072805
LW
5165}
5166
954c1994
GS
5167/*
5168=for apidoc sv_catsv_mg
5169
5170Like C<sv_catsv>, but also handles 'set' magic.
5171
5172=cut
5173*/
5174
79072805 5175void
46199a12 5176Perl_sv_catsv_mg(pTHX_ SV *dsv, register SV *ssv)
ef50df4b 5177{
46199a12
JH
5178 sv_catsv(dsv,ssv);
5179 SvSETMAGIC(dsv);
ef50df4b
GS
5180}
5181
954c1994
GS
5182/*
5183=for apidoc sv_catpv
5184
5185Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
5186If the SV has the UTF-8 status set, then the bytes appended should be
5187valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 5188
d5ce4a7c 5189=cut */
954c1994 5190
ef50df4b 5191void
0c981600 5192Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
5193{
5194 register STRLEN len;
463ee0b2 5195 STRLEN tlen;
748a9306 5196 char *junk;
79072805 5197
0c981600 5198 if (!ptr)
79072805 5199 return;
748a9306 5200 junk = SvPV_force(sv, tlen);
0c981600 5201 len = strlen(ptr);
463ee0b2 5202 SvGROW(sv, tlen + len + 1);
0c981600 5203 if (ptr == junk)
3f7c398e 5204 ptr = SvPVX_const(sv);
0c981600 5205 Move(ptr,SvPVX(sv)+tlen,len+1,char);
b162af07 5206 SvCUR_set(sv, SvCUR(sv) + len);
d41ff1b8 5207 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 5208 SvTAINT(sv);
79072805
LW
5209}
5210
954c1994
GS
5211/*
5212=for apidoc sv_catpv_mg
5213
5214Like C<sv_catpv>, but also handles 'set' magic.
5215
5216=cut
5217*/
5218
ef50df4b 5219void
0c981600 5220Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 5221{
0c981600 5222 sv_catpv(sv,ptr);
ef50df4b
GS
5223 SvSETMAGIC(sv);
5224}
5225
645c22ef
DM
5226/*
5227=for apidoc newSV
5228
5229Create a new null SV, or if len > 0, create a new empty SVt_PV type SV
5230with an initial PV allocation of len+1. Normally accessed via the C<NEWSV>
5231macro.
5232
5233=cut
5234*/
5235
79072805 5236SV *
864dbfa3 5237Perl_newSV(pTHX_ STRLEN len)
79072805
LW
5238{
5239 register SV *sv;
1c846c1f 5240
4561caa4 5241 new_SV(sv);
79072805
LW
5242 if (len) {
5243 sv_upgrade(sv, SVt_PV);
5244 SvGROW(sv, len + 1);
5245 }
5246 return sv;
5247}
954c1994 5248/*
92110913 5249=for apidoc sv_magicext
954c1994 5250
68795e93 5251Adds magic to an SV, upgrading it if necessary. Applies the
2d8d5d5a 5252supplied vtable and returns a pointer to the magic added.
92110913 5253
2d8d5d5a
SH
5254Note that C<sv_magicext> will allow things that C<sv_magic> will not.
5255In particular, you can add magic to SvREADONLY SVs, and add more than
5256one instance of the same 'how'.
645c22ef 5257
2d8d5d5a
SH
5258If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
5259stored, if C<namlen> is zero then C<name> is stored as-is and - as another
5260special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
5261to contain an C<SV*> and is stored as-is with its REFCNT incremented.
92110913 5262
2d8d5d5a 5263(This is now used as a subroutine by C<sv_magic>.)
954c1994
GS
5264
5265=cut
5266*/
92110913 5267MAGIC *
e1ec3a88 5268Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, const MGVTBL *vtable,
92110913 5269 const char* name, I32 namlen)
79072805
LW
5270{
5271 MAGIC* mg;
68795e93 5272
92110913
NIS
5273 if (SvTYPE(sv) < SVt_PVMG) {
5274 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 5275 }
79072805
LW
5276 Newz(702,mg, 1, MAGIC);
5277 mg->mg_moremagic = SvMAGIC(sv);
b162af07 5278 SvMAGIC_set(sv, mg);
75f9d97a 5279
05f95b08
SB
5280 /* Sometimes a magic contains a reference loop, where the sv and
5281 object refer to each other. To prevent a reference loop that
5282 would prevent such objects being freed, we look for such loops
5283 and if we find one we avoid incrementing the object refcount.
87f0b213
JH
5284
5285 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 5286 have its REFCNT incremented to keep it in existence.
87f0b213
JH
5287
5288 */
14befaf4
DM
5289 if (!obj || obj == sv ||
5290 how == PERL_MAGIC_arylen ||
5291 how == PERL_MAGIC_qr ||
8d2f4536 5292 how == PERL_MAGIC_symtab ||
75f9d97a
JH
5293 (SvTYPE(obj) == SVt_PVGV &&
5294 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
5295 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 5296 GvFORM(obj) == (CV*)sv)))
75f9d97a 5297 {
8990e307 5298 mg->mg_obj = obj;
75f9d97a 5299 }
85e6fe83 5300 else {
8990e307 5301 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
5302 mg->mg_flags |= MGf_REFCOUNTED;
5303 }
b5ccf5f2
YST
5304
5305 /* Normal self-ties simply pass a null object, and instead of
5306 using mg_obj directly, use the SvTIED_obj macro to produce a
5307 new RV as needed. For glob "self-ties", we are tieing the PVIO
5308 with an RV obj pointing to the glob containing the PVIO. In
5309 this case, to avoid a reference loop, we need to weaken the
5310 reference.
5311 */
5312
5313 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
5314 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
5315 {
5316 sv_rvweaken(obj);
5317 }
5318
79072805 5319 mg->mg_type = how;
565764a8 5320 mg->mg_len = namlen;
9cbac4c7 5321 if (name) {
92110913 5322 if (namlen > 0)
1edc1566 5323 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 5324 else if (namlen == HEf_SVKEY)
1edc1566 5325 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
68795e93 5326 else
92110913 5327 mg->mg_ptr = (char *) name;
9cbac4c7 5328 }
92110913 5329 mg->mg_virtual = vtable;
68795e93 5330
92110913
NIS
5331 mg_magical(sv);
5332 if (SvGMAGICAL(sv))
5333 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
5334 return mg;
5335}
5336
5337/*
5338=for apidoc sv_magic
1c846c1f 5339
92110913
NIS
5340Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
5341then adds a new magic item of type C<how> to the head of the magic list.
5342
2d8d5d5a
SH
5343See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
5344handling of the C<name> and C<namlen> arguments.
5345
4509d3fb
SB
5346You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
5347to add more than one instance of the same 'how'.
5348
92110913
NIS
5349=cut
5350*/
5351
5352void
5353Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 5354{
e1ec3a88 5355 const MGVTBL *vtable = 0;
92110913 5356 MAGIC* mg;
92110913 5357
765f542d
NC
5358#ifdef PERL_COPY_ON_WRITE
5359 if (SvIsCOW(sv))
5360 sv_force_normal_flags(sv, 0);
5361#endif
92110913 5362 if (SvREADONLY(sv)) {
923e4eb5 5363 if (IN_PERL_RUNTIME
92110913
NIS
5364 && how != PERL_MAGIC_regex_global
5365 && how != PERL_MAGIC_bm
5366 && how != PERL_MAGIC_fm
5367 && how != PERL_MAGIC_sv
e6469971 5368 && how != PERL_MAGIC_backref
92110913
NIS
5369 )
5370 {
5371 Perl_croak(aTHX_ PL_no_modify);
5372 }
5373 }
5374 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
5375 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
5376 /* sv_magic() refuses to add a magic of the same 'how' as an
5377 existing one
92110913
NIS
5378 */
5379 if (how == PERL_MAGIC_taint)
5380 mg->mg_len |= 1;
5381 return;
5382 }
5383 }
68795e93 5384
79072805 5385 switch (how) {
14befaf4 5386 case PERL_MAGIC_sv:
92110913 5387 vtable = &PL_vtbl_sv;
79072805 5388 break;
14befaf4 5389 case PERL_MAGIC_overload:
92110913 5390 vtable = &PL_vtbl_amagic;
a0d0e21e 5391 break;
14befaf4 5392 case PERL_MAGIC_overload_elem:
92110913 5393 vtable = &PL_vtbl_amagicelem;
a0d0e21e 5394 break;
14befaf4 5395 case PERL_MAGIC_overload_table:
92110913 5396 vtable = &PL_vtbl_ovrld;
a0d0e21e 5397 break;
14befaf4 5398 case PERL_MAGIC_bm:
92110913 5399 vtable = &PL_vtbl_bm;
79072805 5400 break;
14befaf4 5401 case PERL_MAGIC_regdata:
92110913 5402 vtable = &PL_vtbl_regdata;
6cef1e77 5403 break;
14befaf4 5404 case PERL_MAGIC_regdatum:
92110913 5405 vtable = &PL_vtbl_regdatum;
6cef1e77 5406 break;
14befaf4 5407 case PERL_MAGIC_env:
92110913 5408 vtable = &PL_vtbl_env;
79072805 5409 break;
14befaf4 5410 case PERL_MAGIC_fm:
92110913 5411 vtable = &PL_vtbl_fm;
55497cff 5412 break;
14befaf4 5413 case PERL_MAGIC_envelem:
92110913 5414 vtable = &PL_vtbl_envelem;
79072805 5415 break;
14befaf4 5416 case PERL_MAGIC_regex_global:
92110913 5417 vtable = &PL_vtbl_mglob;
93a17b20 5418 break;
14befaf4 5419 case PERL_MAGIC_isa:
92110913 5420 vtable = &PL_vtbl_isa;
463ee0b2 5421 break;
14befaf4 5422 case PERL_MAGIC_isaelem:
92110913 5423 vtable = &PL_vtbl_isaelem;
463ee0b2 5424 break;
14befaf4 5425 case PERL_MAGIC_nkeys:
92110913 5426 vtable = &PL_vtbl_nkeys;
16660edb 5427 break;
14befaf4 5428 case PERL_MAGIC_dbfile:
92110913 5429 vtable = 0;
93a17b20 5430 break;
14befaf4 5431 case PERL_MAGIC_dbline:
92110913 5432 vtable = &PL_vtbl_dbline;
79072805 5433 break;
36477c24 5434#ifdef USE_LOCALE_COLLATE
14befaf4 5435 case PERL_MAGIC_collxfrm:
92110913 5436 vtable = &PL_vtbl_collxfrm;
bbce6d69 5437 break;
36477c24 5438#endif /* USE_LOCALE_COLLATE */
14befaf4 5439 case PERL_MAGIC_tied:
92110913 5440 vtable = &PL_vtbl_pack;
463ee0b2 5441 break;
14befaf4
DM
5442 case PERL_MAGIC_tiedelem:
5443 case PERL_MAGIC_tiedscalar:
92110913 5444 vtable = &PL_vtbl_packelem;
463ee0b2 5445 break;
14befaf4 5446 case PERL_MAGIC_qr:
92110913 5447 vtable = &PL_vtbl_regexp;
c277df42 5448 break;
14befaf4 5449 case PERL_MAGIC_sig:
92110913 5450 vtable = &PL_vtbl_sig;
79072805 5451 break;
14befaf4 5452 case PERL_MAGIC_sigelem:
92110913 5453 vtable = &PL_vtbl_sigelem;
79072805 5454 break;
14befaf4 5455 case PERL_MAGIC_taint:
92110913 5456 vtable = &PL_vtbl_taint;
463ee0b2 5457 break;
14befaf4 5458 case PERL_MAGIC_uvar:
92110913 5459 vtable = &PL_vtbl_uvar;
79072805 5460 break;
14befaf4 5461 case PERL_MAGIC_vec:
92110913 5462 vtable = &PL_vtbl_vec;
79072805 5463 break;
a3874608 5464 case PERL_MAGIC_arylen_p:
bfcb3514 5465 case PERL_MAGIC_rhash:
8d2f4536 5466 case PERL_MAGIC_symtab:
ece467f9
JP
5467 case PERL_MAGIC_vstring:
5468 vtable = 0;
5469 break;
7e8c5dac
HS
5470 case PERL_MAGIC_utf8:
5471 vtable = &PL_vtbl_utf8;
5472 break;
14befaf4 5473 case PERL_MAGIC_substr:
92110913 5474 vtable = &PL_vtbl_substr;
79072805 5475 break;
14befaf4 5476 case PERL_MAGIC_defelem:
92110913 5477 vtable = &PL_vtbl_defelem;
5f05dabc 5478 break;
14befaf4 5479 case PERL_MAGIC_glob:
92110913 5480 vtable = &PL_vtbl_glob;
79072805 5481 break;
14befaf4 5482 case PERL_MAGIC_arylen:
92110913 5483 vtable = &PL_vtbl_arylen;
79072805 5484 break;
14befaf4 5485 case PERL_MAGIC_pos:
92110913 5486 vtable = &PL_vtbl_pos;
a0d0e21e 5487 break;
14befaf4 5488 case PERL_MAGIC_backref:
92110913 5489 vtable = &PL_vtbl_backref;
810b8aa5 5490 break;
14befaf4
DM
5491 case PERL_MAGIC_ext:
5492 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
5493 /* Useful for attaching extension internal data to perl vars. */
5494 /* Note that multiple extensions may clash if magical scalars */
5495 /* etc holding private data from one are passed to another. */
a0d0e21e 5496 break;
79072805 5497 default:
14befaf4 5498 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 5499 }
68795e93 5500
92110913 5501 /* Rest of work is done else where */
27da23d5 5502 mg = sv_magicext(sv,obj,how,(MGVTBL*)vtable,name,namlen);
68795e93 5503
92110913
NIS
5504 switch (how) {
5505 case PERL_MAGIC_taint:
5506 mg->mg_len = 1;
5507 break;
5508 case PERL_MAGIC_ext:
5509 case PERL_MAGIC_dbfile:
5510 SvRMAGICAL_on(sv);
5511 break;
5512 }
463ee0b2
LW
5513}
5514
c461cf8f
JH
5515/*
5516=for apidoc sv_unmagic
5517
645c22ef 5518Removes all magic of type C<type> from an SV.
c461cf8f
JH
5519
5520=cut
5521*/
5522
463ee0b2 5523int
864dbfa3 5524Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
5525{
5526 MAGIC* mg;
5527 MAGIC** mgp;
91bba347 5528 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
5529 return 0;
5530 mgp = &SvMAGIC(sv);
5531 for (mg = *mgp; mg; mg = *mgp) {
5532 if (mg->mg_type == type) {
e1ec3a88 5533 const MGVTBL* const vtbl = mg->mg_virtual;
463ee0b2 5534 *mgp = mg->mg_moremagic;
1d7c1841 5535 if (vtbl && vtbl->svt_free)
fc0dc3b3 5536 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 5537 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 5538 if (mg->mg_len > 0)
1edc1566 5539 Safefree(mg->mg_ptr);
565764a8 5540 else if (mg->mg_len == HEf_SVKEY)
1edc1566 5541 SvREFCNT_dec((SV*)mg->mg_ptr);
7e8c5dac
HS
5542 else if (mg->mg_type == PERL_MAGIC_utf8 && mg->mg_ptr)
5543 Safefree(mg->mg_ptr);
9cbac4c7 5544 }
a0d0e21e
LW
5545 if (mg->mg_flags & MGf_REFCOUNTED)
5546 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
5547 Safefree(mg);
5548 }
5549 else
5550 mgp = &mg->mg_moremagic;
79072805 5551 }
91bba347 5552 if (!SvMAGIC(sv)) {
463ee0b2 5553 SvMAGICAL_off(sv);
06759ea0 5554 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
5555 }
5556
5557 return 0;
79072805
LW
5558}
5559
c461cf8f
JH
5560/*
5561=for apidoc sv_rvweaken
5562
645c22ef
DM
5563Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5564referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5565push a back-reference to this RV onto the array of backreferences
5566associated with that magic.
c461cf8f
JH
5567
5568=cut
5569*/
5570
810b8aa5 5571SV *
864dbfa3 5572Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
5573{
5574 SV *tsv;
5575 if (!SvOK(sv)) /* let undefs pass */
5576 return sv;
5577 if (!SvROK(sv))
cea2e8a9 5578 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 5579 else if (SvWEAKREF(sv)) {
810b8aa5 5580 if (ckWARN(WARN_MISC))
9014280d 5581 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
5582 return sv;
5583 }
5584 tsv = SvRV(sv);
5585 sv_add_backref(tsv, sv);
5586 SvWEAKREF_on(sv);
1c846c1f 5587 SvREFCNT_dec(tsv);
810b8aa5
GS
5588 return sv;
5589}
5590
645c22ef
DM
5591/* Give tsv backref magic if it hasn't already got it, then push a
5592 * back-reference to sv onto the array associated with the backref magic.
5593 */
5594
810b8aa5 5595STATIC void
cea2e8a9 5596S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
5597{
5598 AV *av;
5599 MAGIC *mg;
14befaf4 5600 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, PERL_MAGIC_backref)))
810b8aa5
GS
5601 av = (AV*)mg->mg_obj;
5602 else {
5603 av = newAV();
14befaf4 5604 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
d99b02a1
DM
5605 /* av now has a refcnt of 2, which avoids it getting freed
5606 * before us during global cleanup. The extra ref is removed
5607 * by magic_killbackrefs() when tsv is being freed */
810b8aa5 5608 }
d91d49e8 5609 if (AvFILLp(av) >= AvMAX(av)) {
fdc9a813 5610 I32 i;
d91d49e8 5611 SV **svp = AvARRAY(av);
fdc9a813
AE
5612 for (i = AvFILLp(av); i >= 0; i--)
5613 if (!svp[i]) {
d91d49e8
MM
5614 svp[i] = sv; /* reuse the slot */
5615 return;
5616 }
d91d49e8
MM
5617 av_extend(av, AvFILLp(av)+1);
5618 }
5619 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
5620}
5621
645c22ef
DM
5622/* delete a back-reference to ourselves from the backref magic associated
5623 * with the SV we point to.
5624 */
5625
1c846c1f 5626STATIC void
cea2e8a9 5627S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
5628{
5629 AV *av;
5630 SV **svp;
5631 I32 i;
5632 SV *tsv = SvRV(sv);
c04a4dfe 5633 MAGIC *mg = NULL;
14befaf4 5634 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, PERL_MAGIC_backref)))
cea2e8a9 5635 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
5636 av = (AV *)mg->mg_obj;
5637 svp = AvARRAY(av);
fdc9a813
AE
5638 for (i = AvFILLp(av); i >= 0; i--)
5639 if (svp[i] == sv) svp[i] = Nullsv;
810b8aa5
GS
5640}
5641
954c1994
GS
5642/*
5643=for apidoc sv_insert
5644
5645Inserts a string at the specified offset/length within the SV. Similar to
5646the Perl substr() function.
5647
5648=cut
5649*/
5650
79072805 5651void
e1ec3a88 5652Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, const char *little, STRLEN littlelen)
79072805
LW
5653{
5654 register char *big;
5655 register char *mid;
5656 register char *midend;
5657 register char *bigend;
5658 register I32 i;
6ff81951 5659 STRLEN curlen;
1c846c1f 5660
79072805 5661
8990e307 5662 if (!bigstr)
cea2e8a9 5663 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 5664 SvPV_force(bigstr, curlen);
60fa28ff 5665 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
5666 if (offset + len > curlen) {
5667 SvGROW(bigstr, offset+len+1);
3f7c398e 5668 Zero(SvPVX_const(bigstr)+curlen, offset+len-curlen, char);
6ff81951
GS
5669 SvCUR_set(bigstr, offset+len);
5670 }
79072805 5671
69b47968 5672 SvTAINT(bigstr);
79072805
LW
5673 i = littlelen - len;
5674 if (i > 0) { /* string might grow */
a0d0e21e 5675 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
5676 mid = big + offset + len;
5677 midend = bigend = big + SvCUR(bigstr);
5678 bigend += i;
5679 *bigend = '\0';
5680 while (midend > mid) /* shove everything down */
5681 *--bigend = *--midend;
5682 Move(little,big+offset,littlelen,char);
b162af07 5683 SvCUR_set(bigstr, SvCUR(bigstr) + i);
79072805
LW
5684 SvSETMAGIC(bigstr);
5685 return;
5686 }
5687 else if (i == 0) {
463ee0b2 5688 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
5689 SvSETMAGIC(bigstr);
5690 return;
5691 }
5692
463ee0b2 5693 big = SvPVX(bigstr);
79072805
LW
5694 mid = big + offset;
5695 midend = mid + len;
5696 bigend = big + SvCUR(bigstr);
5697
5698 if (midend > bigend)
cea2e8a9 5699 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5700
5701 if (mid - big > bigend - midend) { /* faster to shorten from end */
5702 if (littlelen) {
5703 Move(little, mid, littlelen,char);
5704 mid += littlelen;
5705 }
5706 i = bigend - midend;
5707 if (i > 0) {
5708 Move(midend, mid, i,char);
5709 mid += i;
5710 }
5711 *mid = '\0';
5712 SvCUR_set(bigstr, mid - big);
5713 }
5714 /*SUPPRESS 560*/
155aba94 5715 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5716 midend -= littlelen;
5717 mid = midend;
5718 sv_chop(bigstr,midend-i);
5719 big += i;
5720 while (i--)
5721 *--midend = *--big;
5722 if (littlelen)
5723 Move(little, mid, littlelen,char);
5724 }
5725 else if (littlelen) {
5726 midend -= littlelen;
5727 sv_chop(bigstr,midend);
5728 Move(little,midend,littlelen,char);
5729 }
5730 else {
5731 sv_chop(bigstr,midend);
5732 }
5733 SvSETMAGIC(bigstr);
5734}
5735
c461cf8f
JH
5736/*
5737=for apidoc sv_replace
5738
5739Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5740The target SV physically takes over ownership of the body of the source SV
5741and inherits its flags; however, the target keeps any magic it owns,
5742and any magic in the source is discarded.
ff276b08 5743Note that this is a rather specialist SV copying operation; most of the
645c22ef 5744time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5745
5746=cut
5747*/
79072805
LW
5748
5749void
864dbfa3 5750Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805 5751{
a3b680e6 5752 const U32 refcnt = SvREFCNT(sv);
765f542d 5753 SV_CHECK_THINKFIRST_COW_DROP(sv);
0453d815 5754 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
9014280d 5755 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
93a17b20 5756 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5757 if (SvMAGICAL(nsv))
5758 mg_free(nsv);
5759 else
5760 sv_upgrade(nsv, SVt_PVMG);
b162af07 5761 SvMAGIC_set(nsv, SvMAGIC(sv));
a0d0e21e 5762 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20 5763 SvMAGICAL_off(sv);
b162af07 5764 SvMAGIC_set(sv, NULL);
93a17b20 5765 }
79072805
LW
5766 SvREFCNT(sv) = 0;
5767 sv_clear(sv);
477f5d66 5768 assert(!SvREFCNT(sv));
fd0854ff
DM
5769#ifdef DEBUG_LEAKING_SCALARS
5770 sv->sv_flags = nsv->sv_flags;
5771 sv->sv_any = nsv->sv_any;
5772 sv->sv_refcnt = nsv->sv_refcnt;
5773#else
79072805 5774 StructCopy(nsv,sv,SV);
fd0854ff 5775#endif
7b2c381c
NC
5776 /* Currently could join these into one piece of pointer arithmetic, but
5777 it would be unclear. */
5778 if(SvTYPE(sv) == SVt_IV)
5779 SvANY(sv)
339049b0 5780 = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
7b2c381c 5781 else if (SvTYPE(sv) == SVt_RV) {
339049b0 5782 SvANY(sv) = &sv->sv_u.svu_rv;
7b2c381c
NC
5783 }
5784
fd0854ff 5785
d3d0e6f1
NC
5786#ifdef PERL_COPY_ON_WRITE
5787 if (SvIsCOW_normal(nsv)) {
5788 /* We need to follow the pointers around the loop to make the
5789 previous SV point to sv, rather than nsv. */
5790 SV *next;
5791 SV *current = nsv;
5792 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5793 assert(next);
5794 current = next;
3f7c398e 5795 assert(SvPVX_const(current) == SvPVX_const(nsv));
d3d0e6f1
NC
5796 }
5797 /* Make the SV before us point to the SV after us. */
5798 if (DEBUG_C_TEST) {
5799 PerlIO_printf(Perl_debug_log, "previous is\n");
5800 sv_dump(current);
a29f6d03
NC
5801 PerlIO_printf(Perl_debug_log,
5802 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5803 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5804 }
a29f6d03 5805 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5806 }
5807#endif
79072805 5808 SvREFCNT(sv) = refcnt;
1edc1566 5809 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 5810 SvREFCNT(nsv) = 0;
463ee0b2 5811 del_SV(nsv);
79072805
LW
5812}
5813
c461cf8f
JH
5814/*
5815=for apidoc sv_clear
5816
645c22ef
DM
5817Clear an SV: call any destructors, free up any memory used by the body,
5818and free the body itself. The SV's head is I<not> freed, although
5819its type is set to all 1's so that it won't inadvertently be assumed
5820to be live during global destruction etc.
5821This function should only be called when REFCNT is zero. Most of the time
5822you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5823instead.
c461cf8f
JH
5824
5825=cut
5826*/
5827
79072805 5828void
864dbfa3 5829Perl_sv_clear(pTHX_ register SV *sv)
79072805 5830{
27da23d5 5831 dVAR;
ec12f114 5832 HV* stash;
79072805
LW
5833 assert(sv);
5834 assert(SvREFCNT(sv) == 0);
5835
ed6116ce 5836 if (SvOBJECT(sv)) {
3280af22 5837 if (PL_defstash) { /* Still have a symbol table? */
39644a26 5838 dSP;
32251b26 5839 CV* destructor;
a0d0e21e 5840
5cc433a6 5841
8ebc5c01 5842
d460ef45 5843 do {
4e8e7886 5844 stash = SvSTASH(sv);
32251b26 5845 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 5846 if (destructor) {
5cc433a6
AB
5847 SV* tmpref = newRV(sv);
5848 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 5849 ENTER;
e788e7d3 5850 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
5851 EXTEND(SP, 2);
5852 PUSHMARK(SP);
5cc433a6 5853 PUSHs(tmpref);
4e8e7886 5854 PUTBACK;
44389ee9 5855 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
7a5fa8a2
NIS
5856
5857
d3acc0f7 5858 POPSTACK;
3095d977 5859 SPAGAIN;
4e8e7886 5860 LEAVE;
5cc433a6
AB
5861 if(SvREFCNT(tmpref) < 2) {
5862 /* tmpref is not kept alive! */
5863 SvREFCNT(sv)--;
b162af07 5864 SvRV_set(tmpref, NULL);
5cc433a6
AB
5865 SvROK_off(tmpref);
5866 }
5867 SvREFCNT_dec(tmpref);
4e8e7886
GS
5868 }
5869 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5870
6f44e0a4
JP
5871
5872 if (SvREFCNT(sv)) {
5873 if (PL_in_clean_objs)
cea2e8a9 5874 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
bfcb3514 5875 HvNAME_get(stash));
6f44e0a4
JP
5876 /* DESTROY gave object new lease on life */
5877 return;
5878 }
a0d0e21e 5879 }
4e8e7886 5880
a0d0e21e 5881 if (SvOBJECT(sv)) {
4e8e7886 5882 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
5883 SvOBJECT_off(sv); /* Curse the object. */
5884 if (SvTYPE(sv) != SVt_PVIO)
3280af22 5885 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5886 }
463ee0b2 5887 }
524189f1
JH
5888 if (SvTYPE(sv) >= SVt_PVMG) {
5889 if (SvMAGIC(sv))
5890 mg_free(sv);
bce8f412 5891 if (SvTYPE(sv) == SVt_PVMG && SvFLAGS(sv) & SVpad_TYPED)
524189f1
JH
5892 SvREFCNT_dec(SvSTASH(sv));
5893 }
ec12f114 5894 stash = NULL;
79072805 5895 switch (SvTYPE(sv)) {
8990e307 5896 case SVt_PVIO:
df0bd2f4
GS
5897 if (IoIFP(sv) &&
5898 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5899 IoIFP(sv) != PerlIO_stdout() &&
5900 IoIFP(sv) != PerlIO_stderr())
93578b34 5901 {
f2b5be74 5902 io_close((IO*)sv, FALSE);
93578b34 5903 }
1d7c1841 5904 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5905 PerlDir_close(IoDIRP(sv));
1d7c1841 5906 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5907 Safefree(IoTOP_NAME(sv));
5908 Safefree(IoFMT_NAME(sv));
5909 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 5910 /* FALL THROUGH */
79072805 5911 case SVt_PVBM:
a0d0e21e 5912 goto freescalar;
79072805 5913 case SVt_PVCV:
748a9306 5914 case SVt_PVFM:
85e6fe83 5915 cv_undef((CV*)sv);
a0d0e21e 5916 goto freescalar;
79072805 5917 case SVt_PVHV:
85e6fe83 5918 hv_undef((HV*)sv);
a0d0e21e 5919 break;
79072805 5920 case SVt_PVAV:
85e6fe83 5921 av_undef((AV*)sv);
a0d0e21e 5922 break;
02270b4e 5923 case SVt_PVLV:
dd28f7bb
DM
5924 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5925 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5926 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5927 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5928 }
5929 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
5930 SvREFCNT_dec(LvTARG(sv));
02270b4e 5931 goto freescalar;
a0d0e21e 5932 case SVt_PVGV:
1edc1566 5933 gp_free((GV*)sv);
a0d0e21e 5934 Safefree(GvNAME(sv));
ec12f114
JPC
5935 /* cannot decrease stash refcount yet, as we might recursively delete
5936 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
5937 of stash until current sv is completely gone.
5938 -- JohnPC, 27 Mar 1998 */
5939 stash = GvSTASH(sv);
a0d0e21e 5940 /* FALL THROUGH */
79072805 5941 case SVt_PVMG:
79072805
LW
5942 case SVt_PVNV:
5943 case SVt_PVIV:
a0d0e21e 5944 freescalar:
5228ca4e
NC
5945 /* Don't bother with SvOOK_off(sv); as we're only going to free it. */
5946 if (SvOOK(sv)) {
5947 SvPV_set(sv, SvPVX(sv) - SvIVX(sv));
5948 /* Don't even bother with turning off the OOK flag. */
5949 }
79072805
LW
5950 /* FALL THROUGH */
5951 case SVt_PV:
a0d0e21e 5952 case SVt_RV:
810b8aa5
GS
5953 if (SvROK(sv)) {
5954 if (SvWEAKREF(sv))
5955 sv_del_backref(sv);
5956 else
5957 SvREFCNT_dec(SvRV(sv));
5958 }
765f542d 5959#ifdef PERL_COPY_ON_WRITE
3f7c398e 5960 else if (SvPVX_const(sv)) {
765f542d
NC
5961 if (SvIsCOW(sv)) {
5962 /* I believe I need to grab the global SV mutex here and
5963 then recheck the COW status. */
46187eeb
NC
5964 if (DEBUG_C_TEST) {
5965 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5966 sv_dump(sv);
46187eeb 5967 }
3f7c398e 5968 sv_release_COW(sv, SvPVX_const(sv), SvCUR(sv), SvLEN(sv),
765f542d
NC
5969 SvUVX(sv), SV_COW_NEXT_SV(sv));
5970 /* And drop it here. */
5971 SvFAKE_off(sv);
5972 } else if (SvLEN(sv)) {
3f7c398e 5973 Safefree(SvPVX_const(sv));
765f542d
NC
5974 }
5975 }
5976#else
3f7c398e
SP
5977 else if (SvPVX_const(sv) && SvLEN(sv))
5978 Safefree(SvPVX_const(sv));
5979 else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
5980 unsharepvn(SvPVX_const(sv),
25716404
GS
5981 SvUTF8(sv) ? -(I32)SvCUR(sv) : SvCUR(sv),
5982 SvUVX(sv));
1c846c1f
NIS
5983 SvFAKE_off(sv);
5984 }
765f542d 5985#endif
79072805 5986 break;
a0d0e21e 5987/*
79072805 5988 case SVt_NV:
79072805 5989 case SVt_IV:
79072805
LW
5990 case SVt_NULL:
5991 break;
a0d0e21e 5992*/
79072805
LW
5993 }
5994
5995 switch (SvTYPE(sv)) {
5996 case SVt_NULL:
5997 break;
79072805 5998 case SVt_IV:
79072805
LW
5999 break;
6000 case SVt_NV:
6001 del_XNV(SvANY(sv));
6002 break;
ed6116ce 6003 case SVt_RV:
ed6116ce 6004 break;
79072805
LW
6005 case SVt_PV:
6006 del_XPV(SvANY(sv));
6007 break;
6008 case SVt_PVIV:
6009 del_XPVIV(SvANY(sv));
6010 break;
6011 case SVt_PVNV:
6012 del_XPVNV(SvANY(sv));
6013 break;
6014 case SVt_PVMG:
6015 del_XPVMG(SvANY(sv));
6016 break;
6017 case SVt_PVLV:
6018 del_XPVLV(SvANY(sv));
6019 break;
6020 case SVt_PVAV:
6021 del_XPVAV(SvANY(sv));
6022 break;
6023 case SVt_PVHV:
6024 del_XPVHV(SvANY(sv));
6025 break;
6026 case SVt_PVCV:
6027 del_XPVCV(SvANY(sv));
6028 break;
6029 case SVt_PVGV:
6030 del_XPVGV(SvANY(sv));
ec12f114
JPC
6031 /* code duplication for increased performance. */
6032 SvFLAGS(sv) &= SVf_BREAK;
6033 SvFLAGS(sv) |= SVTYPEMASK;
6034 /* decrease refcount of the stash that owns this GV, if any */
6035 if (stash)
6036 SvREFCNT_dec(stash);
6037 return; /* not break, SvFLAGS reset already happened */
79072805
LW
6038 case SVt_PVBM:
6039 del_XPVBM(SvANY(sv));
6040 break;
6041 case SVt_PVFM:
6042 del_XPVFM(SvANY(sv));
6043 break;
8990e307
LW
6044 case SVt_PVIO:
6045 del_XPVIO(SvANY(sv));
6046 break;
79072805 6047 }
a0d0e21e 6048 SvFLAGS(sv) &= SVf_BREAK;
8990e307 6049 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
6050}
6051
645c22ef
DM
6052/*
6053=for apidoc sv_newref
6054
6055Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
6056instead.
6057
6058=cut
6059*/
6060
79072805 6061SV *
864dbfa3 6062Perl_sv_newref(pTHX_ SV *sv)
79072805 6063{
463ee0b2 6064 if (sv)
4db098f4 6065 (SvREFCNT(sv))++;
79072805
LW
6066 return sv;
6067}
6068
c461cf8f
JH
6069/*
6070=for apidoc sv_free
6071
645c22ef
DM
6072Decrement an SV's reference count, and if it drops to zero, call
6073C<sv_clear> to invoke destructors and free up any memory used by
6074the body; finally, deallocate the SV's head itself.
6075Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
6076
6077=cut
6078*/
6079
79072805 6080void
864dbfa3 6081Perl_sv_free(pTHX_ SV *sv)
79072805 6082{
27da23d5 6083 dVAR;
79072805
LW
6084 if (!sv)
6085 return;
a0d0e21e
LW
6086 if (SvREFCNT(sv) == 0) {
6087 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
6088 /* this SV's refcnt has been artificially decremented to
6089 * trigger cleanup */
a0d0e21e 6090 return;
3280af22 6091 if (PL_in_clean_all) /* All is fair */
1edc1566 6092 return;
d689ffdd
JP
6093 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6094 /* make sure SvREFCNT(sv)==0 happens very seldom */
6095 SvREFCNT(sv) = (~(U32)0)/2;
6096 return;
6097 }
0453d815 6098 if (ckWARN_d(WARN_INTERNAL))
d5dede04 6099 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
6100 "Attempt to free unreferenced scalar: SV 0x%"UVxf
6101 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805
LW
6102 return;
6103 }
4db098f4 6104 if (--(SvREFCNT(sv)) > 0)
8990e307 6105 return;
8c4d3c90
NC
6106 Perl_sv_free2(aTHX_ sv);
6107}
6108
6109void
6110Perl_sv_free2(pTHX_ SV *sv)
6111{
27da23d5 6112 dVAR;
463ee0b2
LW
6113#ifdef DEBUGGING
6114 if (SvTEMP(sv)) {
0453d815 6115 if (ckWARN_d(WARN_DEBUGGING))
9014280d 6116 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
472d47bc
SB
6117 "Attempt to free temp prematurely: SV 0x%"UVxf
6118 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 6119 return;
79072805 6120 }
463ee0b2 6121#endif
d689ffdd
JP
6122 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6123 /* make sure SvREFCNT(sv)==0 happens very seldom */
6124 SvREFCNT(sv) = (~(U32)0)/2;
6125 return;
6126 }
79072805 6127 sv_clear(sv);
477f5d66
CS
6128 if (! SvREFCNT(sv))
6129 del_SV(sv);
79072805
LW
6130}
6131
954c1994
GS
6132/*
6133=for apidoc sv_len
6134
645c22ef
DM
6135Returns the length of the string in the SV. Handles magic and type
6136coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
6137
6138=cut
6139*/
6140
79072805 6141STRLEN
864dbfa3 6142Perl_sv_len(pTHX_ register SV *sv)
79072805 6143{
463ee0b2 6144 STRLEN len;
79072805
LW
6145
6146 if (!sv)
6147 return 0;
6148
8990e307 6149 if (SvGMAGICAL(sv))
565764a8 6150 len = mg_length(sv);
8990e307 6151 else
497b47a8 6152 (void)SvPV(sv, len);
463ee0b2 6153 return len;
79072805
LW
6154}
6155
c461cf8f
JH
6156/*
6157=for apidoc sv_len_utf8
6158
6159Returns the number of characters in the string in an SV, counting wide
1e54db1a 6160UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
6161
6162=cut
6163*/
6164
7e8c5dac
HS
6165/*
6166 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
6167 * mg_ptr is used, by sv_pos_u2b(), see the comments of S_utf8_mg_pos_init().
6168 * (Note that the mg_len is not the length of the mg_ptr field.)
7a5fa8a2 6169 *
7e8c5dac
HS
6170 */
6171
a0ed51b3 6172STRLEN
864dbfa3 6173Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 6174{
a0ed51b3
LW
6175 if (!sv)
6176 return 0;
6177
a0ed51b3 6178 if (SvGMAGICAL(sv))
b76347f2 6179 return mg_length(sv);
a0ed51b3 6180 else
b76347f2 6181 {
7e8c5dac 6182 STRLEN len, ulen;
a3b680e6 6183 const U8 *s = (U8*)SvPV(sv, len);
7e8c5dac
HS
6184 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
6185
e23c8137 6186 if (mg && mg->mg_len != -1 && (mg->mg_len > 0 || len == 0)) {
7e8c5dac 6187 ulen = mg->mg_len;
e23c8137
JH
6188#ifdef PERL_UTF8_CACHE_ASSERT
6189 assert(ulen == Perl_utf8_length(aTHX_ s, s + len));
6190#endif
6191 }
7e8c5dac
HS
6192 else {
6193 ulen = Perl_utf8_length(aTHX_ s, s + len);
6194 if (!mg && !SvREADONLY(sv)) {
6195 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
6196 mg = mg_find(sv, PERL_MAGIC_utf8);
6197 assert(mg);
6198 }
6199 if (mg)
6200 mg->mg_len = ulen;
6201 }
6202 return ulen;
6203 }
6204}
6205
6206/* S_utf8_mg_pos_init() is used to initialize the mg_ptr field of
6207 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
6208 * between UTF-8 and byte offsets. There are two (substr offset and substr
6209 * length, the i offset, PERL_MAGIC_UTF8_CACHESIZE) times two (UTF-8 offset
6210 * and byte offset) cache positions.
6211 *
6212 * The mg_len field is used by sv_len_utf8(), see its comments.
6213 * Note that the mg_len is not the length of the mg_ptr field.
6214 *
6215 */
6216STATIC bool
a3b680e6 6217S_utf8_mg_pos_init(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 offsetp, U8 *s, U8 *start)
7e8c5dac 6218{
7a5fa8a2 6219 bool found = FALSE;
7e8c5dac
HS
6220
6221 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
8f78557a 6222 if (!*mgp)
27da23d5 6223 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0, 0);
7e8c5dac 6224 assert(*mgp);
b76347f2 6225
7e8c5dac
HS
6226 if ((*mgp)->mg_ptr)
6227 *cachep = (STRLEN *) (*mgp)->mg_ptr;
6228 else {
6229 Newz(0, *cachep, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
6230 (*mgp)->mg_ptr = (char *) *cachep;
6231 }
6232 assert(*cachep);
6233
a3b680e6 6234 (*cachep)[i] = offsetp;
7e8c5dac
HS
6235 (*cachep)[i+1] = s - start;
6236 found = TRUE;
a0ed51b3 6237 }
7e8c5dac
HS
6238
6239 return found;
a0ed51b3
LW
6240}
6241
645c22ef 6242/*
7e8c5dac
HS
6243 * S_utf8_mg_pos() is used to query and update mg_ptr field of
6244 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
6245 * between UTF-8 and byte offsets. See also the comments of
6246 * S_utf8_mg_pos_init().
6247 *
6248 */
6249STATIC bool
6e551876 6250S_utf8_mg_pos(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, I32 uoff, U8 **sp, U8 *start, U8 *send)
7e8c5dac
HS
6251{
6252 bool found = FALSE;
6253
6254 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
6255 if (!*mgp)
6256 *mgp = mg_find(sv, PERL_MAGIC_utf8);
6257 if (*mgp && (*mgp)->mg_ptr) {
6258 *cachep = (STRLEN *) (*mgp)->mg_ptr;
e23c8137 6259 ASSERT_UTF8_CACHE(*cachep);
667208dd 6260 if ((*cachep)[i] == (STRLEN)uoff) /* An exact match. */
7a5fa8a2 6261 found = TRUE;
7e8c5dac
HS
6262 else { /* We will skip to the right spot. */
6263 STRLEN forw = 0;
6264 STRLEN backw = 0;
a3b680e6 6265 const U8* p = NULL;
7e8c5dac
HS
6266
6267 /* The assumption is that going backward is half
6268 * the speed of going forward (that's where the
6269 * 2 * backw in the below comes from). (The real
6270 * figure of course depends on the UTF-8 data.) */
6271
667208dd 6272 if ((*cachep)[i] > (STRLEN)uoff) {
7e8c5dac 6273 forw = uoff;
667208dd 6274 backw = (*cachep)[i] - (STRLEN)uoff;
7e8c5dac
HS
6275
6276 if (forw < 2 * backw)
6277 p = start;
6278 else
6279 p = start + (*cachep)[i+1];
6280 }
6281 /* Try this only for the substr offset (i == 0),
6282 * not for the substr length (i == 2). */
6283 else if (i == 0) { /* (*cachep)[i] < uoff */
a3b680e6 6284 const STRLEN ulen = sv_len_utf8(sv);
7e8c5dac 6285
667208dd
JH
6286 if ((STRLEN)uoff < ulen) {
6287 forw = (STRLEN)uoff - (*cachep)[i];
6288 backw = ulen - (STRLEN)uoff;
7e8c5dac
HS
6289
6290 if (forw < 2 * backw)
6291 p = start + (*cachep)[i+1];
6292 else
6293 p = send;
6294 }
6295
6296 /* If the string is not long enough for uoff,
6297 * we could extend it, but not at this low a level. */
6298 }
6299
6300 if (p) {
6301 if (forw < 2 * backw) {
6302 while (forw--)
6303 p += UTF8SKIP(p);
6304 }
6305 else {
6306 while (backw--) {
6307 p--;
6308 while (UTF8_IS_CONTINUATION(*p))
6309 p--;
6310 }
6311 }
6312
6313 /* Update the cache. */
667208dd 6314 (*cachep)[i] = (STRLEN)uoff;
7e8c5dac 6315 (*cachep)[i+1] = p - start;
8f78557a
AE
6316
6317 /* Drop the stale "length" cache */
6318 if (i == 0) {
6319 (*cachep)[2] = 0;
6320 (*cachep)[3] = 0;
6321 }
7a5fa8a2 6322
7e8c5dac
HS
6323 found = TRUE;
6324 }
6325 }
6326 if (found) { /* Setup the return values. */
6327 *offsetp = (*cachep)[i+1];
6328 *sp = start + *offsetp;
6329 if (*sp >= send) {
6330 *sp = send;
6331 *offsetp = send - start;
6332 }
6333 else if (*sp < start) {
6334 *sp = start;
6335 *offsetp = 0;
6336 }
6337 }
6338 }
e23c8137
JH
6339#ifdef PERL_UTF8_CACHE_ASSERT
6340 if (found) {
6341 U8 *s = start;
6342 I32 n = uoff;
6343
6344 while (n-- && s < send)
6345 s += UTF8SKIP(s);
6346
6347 if (i == 0) {
6348 assert(*offsetp == s - start);
6349 assert((*cachep)[0] == (STRLEN)uoff);
6350 assert((*cachep)[1] == *offsetp);
6351 }
6352 ASSERT_UTF8_CACHE(*cachep);
6353 }
6354#endif
7e8c5dac 6355 }
e23c8137 6356
7e8c5dac
HS
6357 return found;
6358}
7a5fa8a2 6359
7e8c5dac 6360/*
645c22ef
DM
6361=for apidoc sv_pos_u2b
6362
1e54db1a 6363Converts the value pointed to by offsetp from a count of UTF-8 chars from
645c22ef
DM
6364the start of the string, to a count of the equivalent number of bytes; if
6365lenp is non-zero, it does the same to lenp, but this time starting from
6366the offset, rather than from the start of the string. Handles magic and
6367type coercion.
6368
6369=cut
6370*/
6371
7e8c5dac
HS
6372/*
6373 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
6374 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
6375 * byte offsets. See also the comments of S_utf8_mg_pos().
6376 *
6377 */
6378
a0ed51b3 6379void
864dbfa3 6380Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 6381{
dfe13c55
GS
6382 U8 *start;
6383 U8 *s;
a0ed51b3 6384 STRLEN len;
7e8c5dac
HS
6385 STRLEN *cache = 0;
6386 STRLEN boffset = 0;
a0ed51b3
LW
6387
6388 if (!sv)
6389 return;
6390
dfe13c55 6391 start = s = (U8*)SvPV(sv, len);
7e8c5dac
HS
6392 if (len) {
6393 I32 uoffset = *offsetp;
6394 U8 *send = s + len;
6395 MAGIC *mg = 0;
6396 bool found = FALSE;
6397
bdf77a2a 6398 if (utf8_mg_pos(sv, &mg, &cache, 0, offsetp, *offsetp, &s, start, send))
7e8c5dac
HS
6399 found = TRUE;
6400 if (!found && uoffset > 0) {
6401 while (s < send && uoffset--)
6402 s += UTF8SKIP(s);
6403 if (s >= send)
6404 s = send;
a3b680e6 6405 if (utf8_mg_pos_init(sv, &mg, &cache, 0, *offsetp, s, start))
7e8c5dac
HS
6406 boffset = cache[1];
6407 *offsetp = s - start;
6408 }
6409 if (lenp) {
6410 found = FALSE;
6411 start = s;
ec062429 6412 if (utf8_mg_pos(sv, &mg, &cache, 2, lenp, *lenp, &s, start, send)) {
7e8c5dac
HS
6413 *lenp -= boffset;
6414 found = TRUE;
6415 }
6416 if (!found && *lenp > 0) {
6417 I32 ulen = *lenp;
6418 if (ulen > 0)
6419 while (s < send && ulen--)
6420 s += UTF8SKIP(s);
6421 if (s >= send)
6422 s = send;
a3b680e6 6423 utf8_mg_pos_init(sv, &mg, &cache, 2, *lenp, s, start);
7e8c5dac
HS
6424 }
6425 *lenp = s - start;
6426 }
e23c8137 6427 ASSERT_UTF8_CACHE(cache);
7e8c5dac
HS
6428 }
6429 else {
6430 *offsetp = 0;
6431 if (lenp)
6432 *lenp = 0;
a0ed51b3 6433 }
e23c8137 6434
a0ed51b3
LW
6435 return;
6436}
6437
645c22ef
DM
6438/*
6439=for apidoc sv_pos_b2u
6440
6441Converts the value pointed to by offsetp from a count of bytes from the
1e54db1a 6442start of the string, to a count of the equivalent number of UTF-8 chars.
645c22ef
DM
6443Handles magic and type coercion.
6444
6445=cut
6446*/
6447
7e8c5dac
HS
6448/*
6449 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
6450 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
6451 * byte offsets. See also the comments of S_utf8_mg_pos().
6452 *
6453 */
6454
a0ed51b3 6455void
7e8c5dac 6456Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 6457{
7e8c5dac 6458 U8* s;
a0ed51b3
LW
6459 STRLEN len;
6460
6461 if (!sv)
6462 return;
6463
dfe13c55 6464 s = (U8*)SvPV(sv, len);
eb160463 6465 if ((I32)len < *offsetp)
a0dbb045 6466 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac
HS
6467 else {
6468 U8* send = s + *offsetp;
6469 MAGIC* mg = NULL;
6470 STRLEN *cache = NULL;
6471
6472 len = 0;
6473
6474 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
6475 mg = mg_find(sv, PERL_MAGIC_utf8);
6476 if (mg && mg->mg_ptr) {
6477 cache = (STRLEN *) mg->mg_ptr;
c5661c80 6478 if (cache[1] == (STRLEN)*offsetp) {
7e8c5dac
HS
6479 /* An exact match. */
6480 *offsetp = cache[0];
6481
6482 return;
6483 }
c5661c80 6484 else if (cache[1] < (STRLEN)*offsetp) {
7e8c5dac
HS
6485 /* We already know part of the way. */
6486 len = cache[0];
6487 s += cache[1];
7a5fa8a2 6488 /* Let the below loop do the rest. */
7e8c5dac
HS
6489 }
6490 else { /* cache[1] > *offsetp */
6491 /* We already know all of the way, now we may
6492 * be able to walk back. The same assumption
6493 * is made as in S_utf8_mg_pos(), namely that
6494 * walking backward is twice slower than
6495 * walking forward. */
6496 STRLEN forw = *offsetp;
6497 STRLEN backw = cache[1] - *offsetp;
6498
6499 if (!(forw < 2 * backw)) {
6500 U8 *p = s + cache[1];
6501 STRLEN ubackw = 0;
7a5fa8a2 6502
a5b510f2
AE
6503 cache[1] -= backw;
6504
7e8c5dac
HS
6505 while (backw--) {
6506 p--;
0aeb64d0 6507 while (UTF8_IS_CONTINUATION(*p)) {
7e8c5dac 6508 p--;
0aeb64d0
JH
6509 backw--;
6510 }
7e8c5dac
HS
6511 ubackw++;
6512 }
6513
6514 cache[0] -= ubackw;
0aeb64d0 6515 *offsetp = cache[0];
a67d7df9
TS
6516
6517 /* Drop the stale "length" cache */
6518 cache[2] = 0;
6519 cache[3] = 0;
6520
0aeb64d0 6521 return;
7e8c5dac
HS
6522 }
6523 }
6524 }
e23c8137 6525 ASSERT_UTF8_CACHE(cache);
a0dbb045 6526 }
7e8c5dac
HS
6527
6528 while (s < send) {
6529 STRLEN n = 1;
6530
6531 /* Call utf8n_to_uvchr() to validate the sequence
6532 * (unless a simple non-UTF character) */
6533 if (!UTF8_IS_INVARIANT(*s))
6534 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
6535 if (n > 0) {
6536 s += n;
6537 len++;
6538 }
6539 else
6540 break;
6541 }
6542
6543 if (!SvREADONLY(sv)) {
6544 if (!mg) {
6545 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
6546 mg = mg_find(sv, PERL_MAGIC_utf8);
6547 }
6548 assert(mg);
6549
6550 if (!mg->mg_ptr) {
979acdb5 6551 Newz(0, cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7e8c5dac
HS
6552 mg->mg_ptr = (char *) cache;
6553 }
6554 assert(cache);
6555
6556 cache[0] = len;
6557 cache[1] = *offsetp;
a67d7df9
TS
6558 /* Drop the stale "length" cache */
6559 cache[2] = 0;
6560 cache[3] = 0;
7e8c5dac
HS
6561 }
6562
6563 *offsetp = len;
a0ed51b3 6564 }
a0ed51b3
LW
6565 return;
6566}
6567
954c1994
GS
6568/*
6569=for apidoc sv_eq
6570
6571Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
6572identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6573coerce its args to strings if necessary.
954c1994
GS
6574
6575=cut
6576*/
6577
79072805 6578I32
e01b9e88 6579Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805 6580{
e1ec3a88 6581 const char *pv1;
463ee0b2 6582 STRLEN cur1;
e1ec3a88 6583 const char *pv2;
463ee0b2 6584 STRLEN cur2;
e01b9e88 6585 I32 eq = 0;
553e1bcc
AT
6586 char *tpv = Nullch;
6587 SV* svrecode = Nullsv;
79072805 6588
e01b9e88 6589 if (!sv1) {
79072805
LW
6590 pv1 = "";
6591 cur1 = 0;
6592 }
463ee0b2 6593 else
e01b9e88 6594 pv1 = SvPV(sv1, cur1);
79072805 6595
e01b9e88
SC
6596 if (!sv2){
6597 pv2 = "";
6598 cur2 = 0;
92d29cee 6599 }
e01b9e88
SC
6600 else
6601 pv2 = SvPV(sv2, cur2);
79072805 6602
cf48d248 6603 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6604 /* Differing utf8ness.
6605 * Do not UTF8size the comparands as a side-effect. */
6606 if (PL_encoding) {
6607 if (SvUTF8(sv1)) {
553e1bcc
AT
6608 svrecode = newSVpvn(pv2, cur2);
6609 sv_recode_to_utf8(svrecode, PL_encoding);
6610 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6611 }
6612 else {
553e1bcc
AT
6613 svrecode = newSVpvn(pv1, cur1);
6614 sv_recode_to_utf8(svrecode, PL_encoding);
6615 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6616 }
6617 /* Now both are in UTF-8. */
0a1bd7ac
DM
6618 if (cur1 != cur2) {
6619 SvREFCNT_dec(svrecode);
799ef3cb 6620 return FALSE;
0a1bd7ac 6621 }
799ef3cb
JH
6622 }
6623 else {
6624 bool is_utf8 = TRUE;
6625
6626 if (SvUTF8(sv1)) {
6627 /* sv1 is the UTF-8 one,
6628 * if is equal it must be downgrade-able */
e1ec3a88 6629 char *pv = (char*)bytes_from_utf8((const U8*)pv1,
799ef3cb
JH
6630 &cur1, &is_utf8);
6631 if (pv != pv1)
553e1bcc 6632 pv1 = tpv = pv;
799ef3cb
JH
6633 }
6634 else {
6635 /* sv2 is the UTF-8 one,
6636 * if is equal it must be downgrade-able */
e1ec3a88 6637 char *pv = (char *)bytes_from_utf8((const U8*)pv2,
799ef3cb
JH
6638 &cur2, &is_utf8);
6639 if (pv != pv2)
553e1bcc 6640 pv2 = tpv = pv;
799ef3cb
JH
6641 }
6642 if (is_utf8) {
6643 /* Downgrade not possible - cannot be eq */
bf694877 6644 assert (tpv == 0);
799ef3cb
JH
6645 return FALSE;
6646 }
6647 }
cf48d248
JH
6648 }
6649
6650 if (cur1 == cur2)
765f542d 6651 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 6652
553e1bcc
AT
6653 if (svrecode)
6654 SvREFCNT_dec(svrecode);
799ef3cb 6655
553e1bcc
AT
6656 if (tpv)
6657 Safefree(tpv);
cf48d248 6658
e01b9e88 6659 return eq;
79072805
LW
6660}
6661
954c1994
GS
6662/*
6663=for apidoc sv_cmp
6664
6665Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
6666string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
6667C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6668coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
6669
6670=cut
6671*/
6672
79072805 6673I32
e01b9e88 6674Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 6675{
560a288e 6676 STRLEN cur1, cur2;
e1ec3a88
AL
6677 const char *pv1, *pv2;
6678 char *tpv = Nullch;
cf48d248 6679 I32 cmp;
553e1bcc 6680 SV *svrecode = Nullsv;
560a288e 6681
e01b9e88
SC
6682 if (!sv1) {
6683 pv1 = "";
560a288e
GS
6684 cur1 = 0;
6685 }
e01b9e88
SC
6686 else
6687 pv1 = SvPV(sv1, cur1);
560a288e 6688
553e1bcc 6689 if (!sv2) {
e01b9e88 6690 pv2 = "";
560a288e
GS
6691 cur2 = 0;
6692 }
e01b9e88
SC
6693 else
6694 pv2 = SvPV(sv2, cur2);
79072805 6695
cf48d248 6696 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6697 /* Differing utf8ness.
6698 * Do not UTF8size the comparands as a side-effect. */
cf48d248 6699 if (SvUTF8(sv1)) {
799ef3cb 6700 if (PL_encoding) {
553e1bcc
AT
6701 svrecode = newSVpvn(pv2, cur2);
6702 sv_recode_to_utf8(svrecode, PL_encoding);
6703 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6704 }
6705 else {
e1ec3a88 6706 pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
799ef3cb 6707 }
cf48d248
JH
6708 }
6709 else {
799ef3cb 6710 if (PL_encoding) {
553e1bcc
AT
6711 svrecode = newSVpvn(pv1, cur1);
6712 sv_recode_to_utf8(svrecode, PL_encoding);
6713 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6714 }
6715 else {
e1ec3a88 6716 pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
799ef3cb 6717 }
cf48d248
JH
6718 }
6719 }
6720
e01b9e88 6721 if (!cur1) {
cf48d248 6722 cmp = cur2 ? -1 : 0;
e01b9e88 6723 } else if (!cur2) {
cf48d248
JH
6724 cmp = 1;
6725 } else {
e1ec3a88 6726 const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
6727
6728 if (retval) {
cf48d248 6729 cmp = retval < 0 ? -1 : 1;
e01b9e88 6730 } else if (cur1 == cur2) {
cf48d248
JH
6731 cmp = 0;
6732 } else {
6733 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 6734 }
cf48d248 6735 }
16660edb 6736
553e1bcc
AT
6737 if (svrecode)
6738 SvREFCNT_dec(svrecode);
799ef3cb 6739
553e1bcc
AT
6740 if (tpv)
6741 Safefree(tpv);
cf48d248
JH
6742
6743 return cmp;
bbce6d69 6744}
16660edb 6745
c461cf8f
JH
6746/*
6747=for apidoc sv_cmp_locale
6748
645c22ef
DM
6749Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6750'use bytes' aware, handles get magic, and will coerce its args to strings
6751if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
6752
6753=cut
6754*/
6755
bbce6d69 6756I32
864dbfa3 6757Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 6758{
36477c24 6759#ifdef USE_LOCALE_COLLATE
16660edb 6760
bbce6d69 6761 char *pv1, *pv2;
6762 STRLEN len1, len2;
6763 I32 retval;
16660edb 6764
3280af22 6765 if (PL_collation_standard)
bbce6d69 6766 goto raw_compare;
16660edb 6767
bbce6d69 6768 len1 = 0;
8ac85365 6769 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 6770 len2 = 0;
8ac85365 6771 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 6772
bbce6d69 6773 if (!pv1 || !len1) {
6774 if (pv2 && len2)
6775 return -1;
6776 else
6777 goto raw_compare;
6778 }
6779 else {
6780 if (!pv2 || !len2)
6781 return 1;
6782 }
16660edb 6783
bbce6d69 6784 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 6785
bbce6d69 6786 if (retval)
16660edb 6787 return retval < 0 ? -1 : 1;
6788
bbce6d69 6789 /*
6790 * When the result of collation is equality, that doesn't mean
6791 * that there are no differences -- some locales exclude some
6792 * characters from consideration. So to avoid false equalities,
6793 * we use the raw string as a tiebreaker.
6794 */
16660edb 6795
bbce6d69 6796 raw_compare:
6797 /* FALL THROUGH */
16660edb 6798
36477c24 6799#endif /* USE_LOCALE_COLLATE */
16660edb 6800
bbce6d69 6801 return sv_cmp(sv1, sv2);
6802}
79072805 6803
645c22ef 6804
36477c24 6805#ifdef USE_LOCALE_COLLATE
645c22ef 6806
7a4c00b4 6807/*
645c22ef
DM
6808=for apidoc sv_collxfrm
6809
6810Add Collate Transform magic to an SV if it doesn't already have it.
6811
6812Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6813scalar data of the variable, but transformed to such a format that a normal
6814memory comparison can be used to compare the data according to the locale
6815settings.
6816
6817=cut
6818*/
6819
bbce6d69 6820char *
864dbfa3 6821Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 6822{
7a4c00b4 6823 MAGIC *mg;
16660edb 6824
14befaf4 6825 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 6826 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 6827 char *s, *xf;
6828 STRLEN len, xlen;
6829
7a4c00b4 6830 if (mg)
6831 Safefree(mg->mg_ptr);
bbce6d69 6832 s = SvPV(sv, len);
6833 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 6834 if (SvREADONLY(sv)) {
6835 SAVEFREEPV(xf);
6836 *nxp = xlen;
3280af22 6837 return xf + sizeof(PL_collation_ix);
ff0cee69 6838 }
7a4c00b4 6839 if (! mg) {
14befaf4
DM
6840 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
6841 mg = mg_find(sv, PERL_MAGIC_collxfrm);
7a4c00b4 6842 assert(mg);
bbce6d69 6843 }
7a4c00b4 6844 mg->mg_ptr = xf;
565764a8 6845 mg->mg_len = xlen;
7a4c00b4 6846 }
6847 else {
ff0cee69 6848 if (mg) {
6849 mg->mg_ptr = NULL;
565764a8 6850 mg->mg_len = -1;
ff0cee69 6851 }
bbce6d69 6852 }
6853 }
7a4c00b4 6854 if (mg && mg->mg_ptr) {
565764a8 6855 *nxp = mg->mg_len;
3280af22 6856 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 6857 }
6858 else {
6859 *nxp = 0;
6860 return NULL;
16660edb 6861 }
79072805
LW
6862}
6863
36477c24 6864#endif /* USE_LOCALE_COLLATE */
bbce6d69 6865
c461cf8f
JH
6866/*
6867=for apidoc sv_gets
6868
6869Get a line from the filehandle and store it into the SV, optionally
6870appending to the currently-stored string.
6871
6872=cut
6873*/
6874
79072805 6875char *
864dbfa3 6876Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 6877{
e1ec3a88 6878 const char *rsptr;
c07a80fd 6879 STRLEN rslen;
6880 register STDCHAR rslast;
6881 register STDCHAR *bp;
6882 register I32 cnt;
9c5ffd7c 6883 I32 i = 0;
8bfdd7d9 6884 I32 rspara = 0;
e311fd51 6885 I32 recsize;
c07a80fd 6886
bc44a8a2
NC
6887 if (SvTHINKFIRST(sv))
6888 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
6889 /* XXX. If you make this PVIV, then copy on write can copy scalars read
6890 from <>.
6891 However, perlbench says it's slower, because the existing swipe code
6892 is faster than copy on write.
6893 Swings and roundabouts. */
6fc92669 6894 (void)SvUPGRADE(sv, SVt_PV);
99491443 6895
ff68c719 6896 SvSCREAM_off(sv);
efd8b2ba
AE
6897
6898 if (append) {
6899 if (PerlIO_isutf8(fp)) {
6900 if (!SvUTF8(sv)) {
6901 sv_utf8_upgrade_nomg(sv);
6902 sv_pos_u2b(sv,&append,0);
6903 }
6904 } else if (SvUTF8(sv)) {
6905 SV *tsv = NEWSV(0,0);
6906 sv_gets(tsv, fp, 0);
6907 sv_utf8_upgrade_nomg(tsv);
6908 SvCUR_set(sv,append);
6909 sv_catsv(sv,tsv);
6910 sv_free(tsv);
6911 goto return_string_or_null;
6912 }
6913 }
6914
6915 SvPOK_only(sv);
6916 if (PerlIO_isutf8(fp))
6917 SvUTF8_on(sv);
c07a80fd 6918
923e4eb5 6919 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
6920 /* we always read code in line mode */
6921 rsptr = "\n";
6922 rslen = 1;
6923 }
6924 else if (RsSNARF(PL_rs)) {
7a5fa8a2
NIS
6925 /* If it is a regular disk file use size from stat() as estimate
6926 of amount we are going to read - may result in malloc-ing
6927 more memory than we realy need if layers bellow reduce
e468d35b
NIS
6928 size we read (e.g. CRLF or a gzip layer)
6929 */
e311fd51 6930 Stat_t st;
e468d35b 6931 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
f54cb97a 6932 const Off_t offset = PerlIO_tell(fp);
58f1856e 6933 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
6934 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6935 }
6936 }
c07a80fd 6937 rsptr = NULL;
6938 rslen = 0;
6939 }
3280af22 6940 else if (RsRECORD(PL_rs)) {
e311fd51 6941 I32 bytesread;
5b2b9c68
HM
6942 char *buffer;
6943
6944 /* Grab the size of the record we're getting */
3280af22 6945 recsize = SvIV(SvRV(PL_rs));
e311fd51 6946 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
6947 /* Go yank in */
6948#ifdef VMS
6949 /* VMS wants read instead of fread, because fread doesn't respect */
6950 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
6951 /* doing, but we've got no other real choice - except avoid stdio
6952 as implementation - perhaps write a :vms layer ?
6953 */
5b2b9c68
HM
6954 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
6955#else
6956 bytesread = PerlIO_read(fp, buffer, recsize);
6957#endif
27e6ca2d
AE
6958 if (bytesread < 0)
6959 bytesread = 0;
e311fd51 6960 SvCUR_set(sv, bytesread += append);
e670df4e 6961 buffer[bytesread] = '\0';
efd8b2ba 6962 goto return_string_or_null;
5b2b9c68 6963 }
3280af22 6964 else if (RsPARA(PL_rs)) {
c07a80fd 6965 rsptr = "\n\n";
6966 rslen = 2;
8bfdd7d9 6967 rspara = 1;
c07a80fd 6968 }
7d59b7e4
NIS
6969 else {
6970 /* Get $/ i.e. PL_rs into same encoding as stream wants */
6971 if (PerlIO_isutf8(fp)) {
6972 rsptr = SvPVutf8(PL_rs, rslen);
6973 }
6974 else {
6975 if (SvUTF8(PL_rs)) {
6976 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
6977 Perl_croak(aTHX_ "Wide character in $/");
6978 }
6979 }
6980 rsptr = SvPV(PL_rs, rslen);
6981 }
6982 }
6983
c07a80fd 6984 rslast = rslen ? rsptr[rslen - 1] : '\0';
6985
8bfdd7d9 6986 if (rspara) { /* have to do this both before and after */
79072805 6987 do { /* to make sure file boundaries work right */
760ac839 6988 if (PerlIO_eof(fp))
a0d0e21e 6989 return 0;
760ac839 6990 i = PerlIO_getc(fp);
79072805 6991 if (i != '\n') {
a0d0e21e
LW
6992 if (i == -1)
6993 return 0;
760ac839 6994 PerlIO_ungetc(fp,i);
79072805
LW
6995 break;
6996 }
6997 } while (i != EOF);
6998 }
c07a80fd 6999
760ac839
LW
7000 /* See if we know enough about I/O mechanism to cheat it ! */
7001
7002 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 7003 of abstracting out stdio interface. One call should be cheap
760ac839
LW
7004 enough here - and may even be a macro allowing compile
7005 time optimization.
7006 */
7007
7008 if (PerlIO_fast_gets(fp)) {
7009
7010 /*
7011 * We're going to steal some values from the stdio struct
7012 * and put EVERYTHING in the innermost loop into registers.
7013 */
7014 register STDCHAR *ptr;
7015 STRLEN bpx;
7016 I32 shortbuffered;
7017
16660edb 7018#if defined(VMS) && defined(PERLIO_IS_STDIO)
7019 /* An ungetc()d char is handled separately from the regular
7020 * buffer, so we getc() it back out and stuff it in the buffer.
7021 */
7022 i = PerlIO_getc(fp);
7023 if (i == EOF) return 0;
7024 *(--((*fp)->_ptr)) = (unsigned char) i;
7025 (*fp)->_cnt++;
7026#endif
c07a80fd 7027
c2960299 7028 /* Here is some breathtakingly efficient cheating */
c07a80fd 7029
a20bf0c3 7030 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b 7031 /* make sure we have the room */
7a5fa8a2 7032 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
e468d35b 7033 /* Not room for all of it
7a5fa8a2 7034 if we are looking for a separator and room for some
e468d35b
NIS
7035 */
7036 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7a5fa8a2 7037 /* just process what we have room for */
79072805
LW
7038 shortbuffered = cnt - SvLEN(sv) + append + 1;
7039 cnt -= shortbuffered;
7040 }
7041 else {
7042 shortbuffered = 0;
bbce6d69 7043 /* remember that cnt can be negative */
eb160463 7044 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
7045 }
7046 }
7a5fa8a2 7047 else
79072805 7048 shortbuffered = 0;
3f7c398e 7049 bp = (STDCHAR*)SvPVX_const(sv) + append; /* move these two too to registers */
a20bf0c3 7050 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 7051 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7052 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 7053 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 7054 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7055 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7056 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
7057 for (;;) {
7058 screamer:
93a17b20 7059 if (cnt > 0) {
c07a80fd 7060 if (rslen) {
760ac839
LW
7061 while (cnt > 0) { /* this | eat */
7062 cnt--;
c07a80fd 7063 if ((*bp++ = *ptr++) == rslast) /* really | dust */
7064 goto thats_all_folks; /* screams | sed :-) */
7065 }
7066 }
7067 else {
1c846c1f
NIS
7068 Copy(ptr, bp, cnt, char); /* this | eat */
7069 bp += cnt; /* screams | dust */
c07a80fd 7070 ptr += cnt; /* louder | sed :-) */
a5f75d66 7071 cnt = 0;
93a17b20 7072 }
79072805
LW
7073 }
7074
748a9306 7075 if (shortbuffered) { /* oh well, must extend */
79072805
LW
7076 cnt = shortbuffered;
7077 shortbuffered = 0;
3f7c398e 7078 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
7079 SvCUR_set(sv, bpx);
7080 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3f7c398e 7081 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
79072805
LW
7082 continue;
7083 }
7084
16660edb 7085 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
7086 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
7087 PTR2UV(ptr),(long)cnt));
cc00df79 7088 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 7089#if 0
16660edb 7090 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7091 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7092 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7093 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 7094#endif
1c846c1f 7095 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 7096 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
7097 another abstraction. */
760ac839 7098 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 7099#if 0
16660edb 7100 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7101 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7102 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7103 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 7104#endif
a20bf0c3
JH
7105 cnt = PerlIO_get_cnt(fp);
7106 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 7107 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7108 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 7109
748a9306
LW
7110 if (i == EOF) /* all done for ever? */
7111 goto thats_really_all_folks;
7112
3f7c398e 7113 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
7114 SvCUR_set(sv, bpx);
7115 SvGROW(sv, bpx + cnt + 2);
3f7c398e 7116 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
c07a80fd 7117
eb160463 7118 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 7119
c07a80fd 7120 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 7121 goto thats_all_folks;
79072805
LW
7122 }
7123
7124thats_all_folks:
3f7c398e 7125 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
36477c24 7126 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 7127 goto screamer; /* go back to the fray */
79072805
LW
7128thats_really_all_folks:
7129 if (shortbuffered)
7130 cnt += shortbuffered;
16660edb 7131 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7132 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 7133 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 7134 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7135 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7136 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7137 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 7138 *bp = '\0';
3f7c398e 7139 SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv)); /* set length */
16660edb 7140 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 7141 "Screamer: done, len=%ld, string=|%.*s|\n",
3f7c398e 7142 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
760ac839
LW
7143 }
7144 else
79072805 7145 {
6edd2cd5 7146 /*The big, slow, and stupid way. */
27da23d5 7147#ifdef USE_HEAP_INSTEAD_OF_STACK /* Even slower way. */
6edd2cd5
JH
7148 STDCHAR *buf = 0;
7149 New(0, buf, 8192, STDCHAR);
7150 assert(buf);
4d2c4e07 7151#else
6edd2cd5 7152 STDCHAR buf[8192];
4d2c4e07 7153#endif
79072805 7154
760ac839 7155screamer2:
c07a80fd 7156 if (rslen) {
6867be6d 7157 const register STDCHAR *bpe = buf + sizeof(buf);
760ac839 7158 bp = buf;
eb160463 7159 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
7160 ; /* keep reading */
7161 cnt = bp - buf;
c07a80fd 7162 }
7163 else {
760ac839 7164 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 7165 /* Accomodate broken VAXC compiler, which applies U8 cast to
7166 * both args of ?: operator, causing EOF to change into 255
7167 */
37be0adf 7168 if (cnt > 0)
cbe9e203
JH
7169 i = (U8)buf[cnt - 1];
7170 else
37be0adf 7171 i = EOF;
c07a80fd 7172 }
79072805 7173
cbe9e203
JH
7174 if (cnt < 0)
7175 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
7176 if (append)
7177 sv_catpvn(sv, (char *) buf, cnt);
7178 else
7179 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 7180
7181 if (i != EOF && /* joy */
7182 (!rslen ||
7183 SvCUR(sv) < rslen ||
3f7c398e 7184 memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
7185 {
7186 append = -1;
63e4d877
CS
7187 /*
7188 * If we're reading from a TTY and we get a short read,
7189 * indicating that the user hit his EOF character, we need
7190 * to notice it now, because if we try to read from the TTY
7191 * again, the EOF condition will disappear.
7192 *
7193 * The comparison of cnt to sizeof(buf) is an optimization
7194 * that prevents unnecessary calls to feof().
7195 *
7196 * - jik 9/25/96
7197 */
7198 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
7199 goto screamer2;
79072805 7200 }
6edd2cd5 7201
27da23d5 7202#ifdef USE_HEAP_INSTEAD_OF_STACK
6edd2cd5
JH
7203 Safefree(buf);
7204#endif
79072805
LW
7205 }
7206
8bfdd7d9 7207 if (rspara) { /* have to do this both before and after */
c07a80fd 7208 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 7209 i = PerlIO_getc(fp);
79072805 7210 if (i != '\n') {
760ac839 7211 PerlIO_ungetc(fp,i);
79072805
LW
7212 break;
7213 }
7214 }
7215 }
c07a80fd 7216
efd8b2ba 7217return_string_or_null:
c07a80fd 7218 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
7219}
7220
954c1994
GS
7221/*
7222=for apidoc sv_inc
7223
645c22ef
DM
7224Auto-increment of the value in the SV, doing string to numeric conversion
7225if necessary. Handles 'get' magic.
954c1994
GS
7226
7227=cut
7228*/
7229
79072805 7230void
864dbfa3 7231Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
7232{
7233 register char *d;
463ee0b2 7234 int flags;
79072805
LW
7235
7236 if (!sv)
7237 return;
b23a5f78
GB
7238 if (SvGMAGICAL(sv))
7239 mg_get(sv);
ed6116ce 7240 if (SvTHINKFIRST(sv)) {
765f542d
NC
7241 if (SvIsCOW(sv))
7242 sv_force_normal_flags(sv, 0);
0f15f207 7243 if (SvREADONLY(sv)) {
923e4eb5 7244 if (IN_PERL_RUNTIME)
cea2e8a9 7245 Perl_croak(aTHX_ PL_no_modify);
0f15f207 7246 }
a0d0e21e 7247 if (SvROK(sv)) {
b5be31e9 7248 IV i;
9e7bc3e8
JD
7249 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
7250 return;
56431972 7251 i = PTR2IV(SvRV(sv));
b5be31e9
SM
7252 sv_unref(sv);
7253 sv_setiv(sv, i);
a0d0e21e 7254 }
ed6116ce 7255 }
8990e307 7256 flags = SvFLAGS(sv);
28e5dec8
JH
7257 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
7258 /* It's (privately or publicly) a float, but not tested as an
7259 integer, so test it to see. */
d460ef45 7260 (void) SvIV(sv);
28e5dec8
JH
7261 flags = SvFLAGS(sv);
7262 }
7263 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7264 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 7265#ifdef PERL_PRESERVE_IVUV
28e5dec8 7266 oops_its_int:
59d8ce62 7267#endif
25da4f38
IZ
7268 if (SvIsUV(sv)) {
7269 if (SvUVX(sv) == UV_MAX)
a1e868e7 7270 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
7271 else
7272 (void)SvIOK_only_UV(sv);
607fa7f2 7273 SvUV_set(sv, SvUVX(sv) + 1);
25da4f38
IZ
7274 } else {
7275 if (SvIVX(sv) == IV_MAX)
28e5dec8 7276 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
7277 else {
7278 (void)SvIOK_only(sv);
45977657 7279 SvIV_set(sv, SvIVX(sv) + 1);
1c846c1f 7280 }
55497cff 7281 }
79072805
LW
7282 return;
7283 }
28e5dec8
JH
7284 if (flags & SVp_NOK) {
7285 (void)SvNOK_only(sv);
9d6ce603 7286 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
7287 return;
7288 }
7289
3f7c398e 7290 if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
28e5dec8
JH
7291 if ((flags & SVTYPEMASK) < SVt_PVIV)
7292 sv_upgrade(sv, SVt_IV);
7293 (void)SvIOK_only(sv);
45977657 7294 SvIV_set(sv, 1);
79072805
LW
7295 return;
7296 }
463ee0b2 7297 d = SvPVX(sv);
79072805
LW
7298 while (isALPHA(*d)) d++;
7299 while (isDIGIT(*d)) d++;
7300 if (*d) {
28e5dec8 7301#ifdef PERL_PRESERVE_IVUV
d1be9408 7302 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
7303 warnings. Probably ought to make the sv_iv_please() that does
7304 the conversion if possible, and silently. */
504618e9 7305 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
7306 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7307 /* Need to try really hard to see if it's an integer.
7308 9.22337203685478e+18 is an integer.
7309 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7310 so $a="9.22337203685478e+18"; $a+0; $a++
7311 needs to be the same as $a="9.22337203685478e+18"; $a++
7312 or we go insane. */
d460ef45 7313
28e5dec8
JH
7314 (void) sv_2iv(sv);
7315 if (SvIOK(sv))
7316 goto oops_its_int;
7317
7318 /* sv_2iv *should* have made this an NV */
7319 if (flags & SVp_NOK) {
7320 (void)SvNOK_only(sv);
9d6ce603 7321 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
7322 return;
7323 }
7324 /* I don't think we can get here. Maybe I should assert this
7325 And if we do get here I suspect that sv_setnv will croak. NWC
7326 Fall through. */
7327#if defined(USE_LONG_DOUBLE)
7328 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 7329 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 7330#else
1779d84d 7331 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 7332 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
7333#endif
7334 }
7335#endif /* PERL_PRESERVE_IVUV */
3f7c398e 7336 sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
79072805
LW
7337 return;
7338 }
7339 d--;
3f7c398e 7340 while (d >= SvPVX_const(sv)) {
79072805
LW
7341 if (isDIGIT(*d)) {
7342 if (++*d <= '9')
7343 return;
7344 *(d--) = '0';
7345 }
7346 else {
9d116dd7
JH
7347#ifdef EBCDIC
7348 /* MKS: The original code here died if letters weren't consecutive.
7349 * at least it didn't have to worry about non-C locales. The
7350 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 7351 * arranged in order (although not consecutively) and that only
9d116dd7
JH
7352 * [A-Za-z] are accepted by isALPHA in the C locale.
7353 */
7354 if (*d != 'z' && *d != 'Z') {
7355 do { ++*d; } while (!isALPHA(*d));
7356 return;
7357 }
7358 *(d--) -= 'z' - 'a';
7359#else
79072805
LW
7360 ++*d;
7361 if (isALPHA(*d))
7362 return;
7363 *(d--) -= 'z' - 'a' + 1;
9d116dd7 7364#endif
79072805
LW
7365 }
7366 }
7367 /* oh,oh, the number grew */
7368 SvGROW(sv, SvCUR(sv) + 2);
b162af07 7369 SvCUR_set(sv, SvCUR(sv) + 1);
3f7c398e 7370 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
79072805
LW
7371 *d = d[-1];
7372 if (isDIGIT(d[1]))
7373 *d = '1';
7374 else
7375 *d = d[1];
7376}
7377
954c1994
GS
7378/*
7379=for apidoc sv_dec
7380
645c22ef
DM
7381Auto-decrement of the value in the SV, doing string to numeric conversion
7382if necessary. Handles 'get' magic.
954c1994
GS
7383
7384=cut
7385*/
7386
79072805 7387void
864dbfa3 7388Perl_sv_dec(pTHX_ register SV *sv)
79072805 7389{
463ee0b2
LW
7390 int flags;
7391
79072805
LW
7392 if (!sv)
7393 return;
b23a5f78
GB
7394 if (SvGMAGICAL(sv))
7395 mg_get(sv);
ed6116ce 7396 if (SvTHINKFIRST(sv)) {
765f542d
NC
7397 if (SvIsCOW(sv))
7398 sv_force_normal_flags(sv, 0);
0f15f207 7399 if (SvREADONLY(sv)) {
923e4eb5 7400 if (IN_PERL_RUNTIME)
cea2e8a9 7401 Perl_croak(aTHX_ PL_no_modify);
0f15f207 7402 }
a0d0e21e 7403 if (SvROK(sv)) {
b5be31e9 7404 IV i;
9e7bc3e8
JD
7405 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
7406 return;
56431972 7407 i = PTR2IV(SvRV(sv));
b5be31e9
SM
7408 sv_unref(sv);
7409 sv_setiv(sv, i);
a0d0e21e 7410 }
ed6116ce 7411 }
28e5dec8
JH
7412 /* Unlike sv_inc we don't have to worry about string-never-numbers
7413 and keeping them magic. But we mustn't warn on punting */
8990e307 7414 flags = SvFLAGS(sv);
28e5dec8
JH
7415 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7416 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 7417#ifdef PERL_PRESERVE_IVUV
28e5dec8 7418 oops_its_int:
59d8ce62 7419#endif
25da4f38
IZ
7420 if (SvIsUV(sv)) {
7421 if (SvUVX(sv) == 0) {
7422 (void)SvIOK_only(sv);
45977657 7423 SvIV_set(sv, -1);
25da4f38
IZ
7424 }
7425 else {
7426 (void)SvIOK_only_UV(sv);
607fa7f2 7427 SvUV_set(sv, SvUVX(sv) + 1);
1c846c1f 7428 }
25da4f38
IZ
7429 } else {
7430 if (SvIVX(sv) == IV_MIN)
65202027 7431 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
7432 else {
7433 (void)SvIOK_only(sv);
45977657 7434 SvIV_set(sv, SvIVX(sv) - 1);
1c846c1f 7435 }
55497cff 7436 }
7437 return;
7438 }
28e5dec8 7439 if (flags & SVp_NOK) {
9d6ce603 7440 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
7441 (void)SvNOK_only(sv);
7442 return;
7443 }
8990e307 7444 if (!(flags & SVp_POK)) {
4633a7c4
LW
7445 if ((flags & SVTYPEMASK) < SVt_PVNV)
7446 sv_upgrade(sv, SVt_NV);
f599b64b 7447 SvNV_set(sv, 1.0);
a0d0e21e 7448 (void)SvNOK_only(sv);
79072805
LW
7449 return;
7450 }
28e5dec8
JH
7451#ifdef PERL_PRESERVE_IVUV
7452 {
504618e9 7453 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
7454 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7455 /* Need to try really hard to see if it's an integer.
7456 9.22337203685478e+18 is an integer.
7457 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7458 so $a="9.22337203685478e+18"; $a+0; $a--
7459 needs to be the same as $a="9.22337203685478e+18"; $a--
7460 or we go insane. */
d460ef45 7461
28e5dec8
JH
7462 (void) sv_2iv(sv);
7463 if (SvIOK(sv))
7464 goto oops_its_int;
7465
7466 /* sv_2iv *should* have made this an NV */
7467 if (flags & SVp_NOK) {
7468 (void)SvNOK_only(sv);
9d6ce603 7469 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
7470 return;
7471 }
7472 /* I don't think we can get here. Maybe I should assert this
7473 And if we do get here I suspect that sv_setnv will croak. NWC
7474 Fall through. */
7475#if defined(USE_LONG_DOUBLE)
7476 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 7477 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 7478#else
1779d84d 7479 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 7480 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
7481#endif
7482 }
7483 }
7484#endif /* PERL_PRESERVE_IVUV */
3f7c398e 7485 sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0); /* punt */
79072805
LW
7486}
7487
954c1994
GS
7488/*
7489=for apidoc sv_mortalcopy
7490
645c22ef 7491Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
7492The new SV is marked as mortal. It will be destroyed "soon", either by an
7493explicit call to FREETMPS, or by an implicit call at places such as
7494statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
7495
7496=cut
7497*/
7498
79072805
LW
7499/* Make a string that will exist for the duration of the expression
7500 * evaluation. Actually, it may have to last longer than that, but
7501 * hopefully we won't free it until it has been assigned to a
7502 * permanent location. */
7503
7504SV *
864dbfa3 7505Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 7506{
463ee0b2 7507 register SV *sv;
b881518d 7508
4561caa4 7509 new_SV(sv);
79072805 7510 sv_setsv(sv,oldstr);
677b06e3
GS
7511 EXTEND_MORTAL(1);
7512 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
7513 SvTEMP_on(sv);
7514 return sv;
7515}
7516
954c1994
GS
7517/*
7518=for apidoc sv_newmortal
7519
645c22ef 7520Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
7521set to 1. It will be destroyed "soon", either by an explicit call to
7522FREETMPS, or by an implicit call at places such as statement boundaries.
7523See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
7524
7525=cut
7526*/
7527
8990e307 7528SV *
864dbfa3 7529Perl_sv_newmortal(pTHX)
8990e307
LW
7530{
7531 register SV *sv;
7532
4561caa4 7533 new_SV(sv);
8990e307 7534 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
7535 EXTEND_MORTAL(1);
7536 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
7537 return sv;
7538}
7539
954c1994
GS
7540/*
7541=for apidoc sv_2mortal
7542
d4236ebc
DM
7543Marks an existing SV as mortal. The SV will be destroyed "soon", either
7544by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
7545statement boundaries. SvTEMP() is turned on which means that the SV's
7546string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
7547and C<sv_mortalcopy>.
954c1994
GS
7548
7549=cut
7550*/
7551
79072805 7552SV *
864dbfa3 7553Perl_sv_2mortal(pTHX_ register SV *sv)
79072805 7554{
27da23d5 7555 dVAR;
79072805
LW
7556 if (!sv)
7557 return sv;
d689ffdd 7558 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 7559 return sv;
677b06e3
GS
7560 EXTEND_MORTAL(1);
7561 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 7562 SvTEMP_on(sv);
79072805
LW
7563 return sv;
7564}
7565
954c1994
GS
7566/*
7567=for apidoc newSVpv
7568
7569Creates a new SV and copies a string into it. The reference count for the
7570SV is set to 1. If C<len> is zero, Perl will compute the length using
7571strlen(). For efficiency, consider using C<newSVpvn> instead.
7572
7573=cut
7574*/
7575
79072805 7576SV *
864dbfa3 7577Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 7578{
463ee0b2 7579 register SV *sv;
79072805 7580
4561caa4 7581 new_SV(sv);
616d8c9c 7582 sv_setpvn(sv,s,len ? len : strlen(s));
79072805
LW
7583 return sv;
7584}
7585
954c1994
GS
7586/*
7587=for apidoc newSVpvn
7588
7589Creates a new SV and copies a string into it. The reference count for the
1c846c1f 7590SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 7591string. You are responsible for ensuring that the source string is at least
9e09f5f2 7592C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
7593
7594=cut
7595*/
7596
9da1e3b5 7597SV *
864dbfa3 7598Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
7599{
7600 register SV *sv;
7601
7602 new_SV(sv);
9da1e3b5
MUN
7603 sv_setpvn(sv,s,len);
7604 return sv;
7605}
7606
1c846c1f
NIS
7607/*
7608=for apidoc newSVpvn_share
7609
3f7c398e 7610Creates a new SV with its SvPVX_const pointing to a shared string in the string
645c22ef
DM
7611table. If the string does not already exist in the table, it is created
7612first. Turns on READONLY and FAKE. The string's hash is stored in the UV
7613slot of the SV; if the C<hash> parameter is non-zero, that value is used;
7614otherwise the hash is computed. The idea here is that as the string table
3f7c398e 7615is used for shared hash keys these strings will have SvPVX_const == HeKEY and
645c22ef 7616hash lookup will avoid string compare.
1c846c1f
NIS
7617
7618=cut
7619*/
7620
7621SV *
c3654f1a 7622Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
7623{
7624 register SV *sv;
c3654f1a
IH
7625 bool is_utf8 = FALSE;
7626 if (len < 0) {
77caf834 7627 STRLEN tmplen = -len;
c3654f1a 7628 is_utf8 = TRUE;
75a54232 7629 /* See the note in hv.c:hv_fetch() --jhi */
e1ec3a88 7630 src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
75a54232
JH
7631 len = tmplen;
7632 }
1c846c1f 7633 if (!hash)
5afd6d42 7634 PERL_HASH(hash, src, len);
1c846c1f
NIS
7635 new_SV(sv);
7636 sv_upgrade(sv, SVt_PVIV);
f880fe2f 7637 SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
b162af07 7638 SvCUR_set(sv, len);
607fa7f2 7639 SvUV_set(sv, hash);
b162af07 7640 SvLEN_set(sv, 0);
1c846c1f
NIS
7641 SvREADONLY_on(sv);
7642 SvFAKE_on(sv);
7643 SvPOK_on(sv);
c3654f1a
IH
7644 if (is_utf8)
7645 SvUTF8_on(sv);
1c846c1f
NIS
7646 return sv;
7647}
7648
645c22ef 7649
cea2e8a9 7650#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7651
7652/* pTHX_ magic can't cope with varargs, so this is a no-context
7653 * version of the main function, (which may itself be aliased to us).
7654 * Don't access this version directly.
7655 */
7656
46fc3d4c 7657SV *
cea2e8a9 7658Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 7659{
cea2e8a9 7660 dTHX;
46fc3d4c 7661 register SV *sv;
7662 va_list args;
46fc3d4c 7663 va_start(args, pat);
c5be433b 7664 sv = vnewSVpvf(pat, &args);
46fc3d4c 7665 va_end(args);
7666 return sv;
7667}
cea2e8a9 7668#endif
46fc3d4c 7669
954c1994
GS
7670/*
7671=for apidoc newSVpvf
7672
645c22ef 7673Creates a new SV and initializes it with the string formatted like
954c1994
GS
7674C<sprintf>.
7675
7676=cut
7677*/
7678
cea2e8a9
GS
7679SV *
7680Perl_newSVpvf(pTHX_ const char* pat, ...)
7681{
7682 register SV *sv;
7683 va_list args;
cea2e8a9 7684 va_start(args, pat);
c5be433b 7685 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
7686 va_end(args);
7687 return sv;
7688}
46fc3d4c 7689
645c22ef
DM
7690/* backend for newSVpvf() and newSVpvf_nocontext() */
7691
79072805 7692SV *
c5be433b
GS
7693Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
7694{
7695 register SV *sv;
7696 new_SV(sv);
7697 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7698 return sv;
7699}
7700
954c1994
GS
7701/*
7702=for apidoc newSVnv
7703
7704Creates a new SV and copies a floating point value into it.
7705The reference count for the SV is set to 1.
7706
7707=cut
7708*/
7709
c5be433b 7710SV *
65202027 7711Perl_newSVnv(pTHX_ NV n)
79072805 7712{
463ee0b2 7713 register SV *sv;
79072805 7714
4561caa4 7715 new_SV(sv);
79072805
LW
7716 sv_setnv(sv,n);
7717 return sv;
7718}
7719
954c1994
GS
7720/*
7721=for apidoc newSViv
7722
7723Creates a new SV and copies an integer into it. The reference count for the
7724SV is set to 1.
7725
7726=cut
7727*/
7728
79072805 7729SV *
864dbfa3 7730Perl_newSViv(pTHX_ IV i)
79072805 7731{
463ee0b2 7732 register SV *sv;
79072805 7733
4561caa4 7734 new_SV(sv);
79072805
LW
7735 sv_setiv(sv,i);
7736 return sv;
7737}
7738
954c1994 7739/*
1a3327fb
JH
7740=for apidoc newSVuv
7741
7742Creates a new SV and copies an unsigned integer into it.
7743The reference count for the SV is set to 1.
7744
7745=cut
7746*/
7747
7748SV *
7749Perl_newSVuv(pTHX_ UV u)
7750{
7751 register SV *sv;
7752
7753 new_SV(sv);
7754 sv_setuv(sv,u);
7755 return sv;
7756}
7757
7758/*
954c1994
GS
7759=for apidoc newRV_noinc
7760
7761Creates an RV wrapper for an SV. The reference count for the original
7762SV is B<not> incremented.
7763
7764=cut
7765*/
7766
2304df62 7767SV *
864dbfa3 7768Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
7769{
7770 register SV *sv;
7771
4561caa4 7772 new_SV(sv);
2304df62 7773 sv_upgrade(sv, SVt_RV);
76e3520e 7774 SvTEMP_off(tmpRef);
b162af07 7775 SvRV_set(sv, tmpRef);
2304df62 7776 SvROK_on(sv);
2304df62
AD
7777 return sv;
7778}
7779
ff276b08 7780/* newRV_inc is the official function name to use now.
645c22ef
DM
7781 * newRV_inc is in fact #defined to newRV in sv.h
7782 */
7783
5f05dabc 7784SV *
864dbfa3 7785Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 7786{
5f6447b6 7787 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 7788}
5f05dabc 7789
954c1994
GS
7790/*
7791=for apidoc newSVsv
7792
7793Creates a new SV which is an exact duplicate of the original SV.
645c22ef 7794(Uses C<sv_setsv>).
954c1994
GS
7795
7796=cut
7797*/
7798
79072805 7799SV *
864dbfa3 7800Perl_newSVsv(pTHX_ register SV *old)
79072805 7801{
463ee0b2 7802 register SV *sv;
79072805
LW
7803
7804 if (!old)
7805 return Nullsv;
8990e307 7806 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 7807 if (ckWARN_d(WARN_INTERNAL))
9014280d 7808 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
79072805
LW
7809 return Nullsv;
7810 }
4561caa4 7811 new_SV(sv);
e90aabeb
NC
7812 /* SV_GMAGIC is the default for sv_setv()
7813 SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
7814 with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
7815 sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
463ee0b2 7816 return sv;
79072805
LW
7817}
7818
645c22ef
DM
7819/*
7820=for apidoc sv_reset
7821
7822Underlying implementation for the C<reset> Perl function.
7823Note that the perl-level function is vaguely deprecated.
7824
7825=cut
7826*/
7827
79072805 7828void
e1ec3a88 7829Perl_sv_reset(pTHX_ register const char *s, HV *stash)
79072805 7830{
27da23d5 7831 dVAR;
79072805
LW
7832 register HE *entry;
7833 register GV *gv;
7834 register SV *sv;
7835 register I32 i;
79072805 7836 register I32 max;
4802d5d7 7837 char todo[PERL_UCHAR_MAX+1];
79072805 7838
49d8d3a1
MB
7839 if (!stash)
7840 return;
7841
79072805 7842 if (!*s) { /* reset ?? searches */
8d2f4536
NC
7843 MAGIC *mg = mg_find((SV *)stash, PERL_MAGIC_symtab);
7844 if (mg) {
7845 PMOP *pm = (PMOP *) mg->mg_obj;
7846 while (pm) {
7847 pm->op_pmdynflags &= ~PMdf_USED;
7848 pm = pm->op_pmnext;
7849 }
79072805
LW
7850 }
7851 return;
7852 }
7853
7854 /* reset variables */
7855
7856 if (!HvARRAY(stash))
7857 return;
463ee0b2
LW
7858
7859 Zero(todo, 256, char);
79072805 7860 while (*s) {
4802d5d7 7861 i = (unsigned char)*s;
79072805
LW
7862 if (s[1] == '-') {
7863 s += 2;
7864 }
4802d5d7 7865 max = (unsigned char)*s++;
79072805 7866 for ( ; i <= max; i++) {
463ee0b2
LW
7867 todo[i] = 1;
7868 }
a0d0e21e 7869 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 7870 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7871 entry;
7872 entry = HeNEXT(entry))
7873 {
1edc1566 7874 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7875 continue;
1edc1566 7876 gv = (GV*)HeVAL(entry);
79072805 7877 sv = GvSV(gv);
9e35f4b3
GS
7878 if (SvTHINKFIRST(sv)) {
7879 if (!SvREADONLY(sv) && SvROK(sv))
7880 sv_unref(sv);
7881 continue;
7882 }
0c34ef67 7883 SvOK_off(sv);
79072805
LW
7884 if (SvTYPE(sv) >= SVt_PV) {
7885 SvCUR_set(sv, 0);
3f7c398e 7886 if (SvPVX_const(sv) != Nullch)
463ee0b2 7887 *SvPVX(sv) = '\0';
44a8e56a 7888 SvTAINT(sv);
79072805
LW
7889 }
7890 if (GvAV(gv)) {
7891 av_clear(GvAV(gv));
7892 }
bfcb3514 7893 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
463ee0b2 7894 hv_clear(GvHV(gv));
2f42fcb0 7895#ifndef PERL_MICRO
fa6a1c44 7896#ifdef USE_ENVIRON_ARRAY
4efc5df6
GS
7897 if (gv == PL_envgv
7898# ifdef USE_ITHREADS
7899 && PL_curinterp == aTHX
7900# endif
7901 )
7902 {
79072805 7903 environ[0] = Nullch;
4efc5df6 7904 }
a0d0e21e 7905#endif
2f42fcb0 7906#endif /* !PERL_MICRO */
79072805
LW
7907 }
7908 }
7909 }
7910 }
7911}
7912
645c22ef
DM
7913/*
7914=for apidoc sv_2io
7915
7916Using various gambits, try to get an IO from an SV: the IO slot if its a
7917GV; or the recursive result if we're an RV; or the IO slot of the symbol
7918named after the PV if we're a string.
7919
7920=cut
7921*/
7922
46fc3d4c 7923IO*
864dbfa3 7924Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 7925{
7926 IO* io;
7927 GV* gv;
7928
7929 switch (SvTYPE(sv)) {
7930 case SVt_PVIO:
7931 io = (IO*)sv;
7932 break;
7933 case SVt_PVGV:
7934 gv = (GV*)sv;
7935 io = GvIO(gv);
7936 if (!io)
cea2e8a9 7937 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 7938 break;
7939 default:
7940 if (!SvOK(sv))
cea2e8a9 7941 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 7942 if (SvROK(sv))
7943 return sv_2io(SvRV(sv));
7a5fd60d 7944 gv = gv_fetchsv(sv, FALSE, SVt_PVIO);
46fc3d4c 7945 if (gv)
7946 io = GvIO(gv);
7947 else
7948 io = 0;
7949 if (!io)
35c1215d 7950 Perl_croak(aTHX_ "Bad filehandle: %"SVf, sv);
46fc3d4c 7951 break;
7952 }
7953 return io;
7954}
7955
645c22ef
DM
7956/*
7957=for apidoc sv_2cv
7958
7959Using various gambits, try to get a CV from an SV; in addition, try if
7960possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
7961
7962=cut
7963*/
7964
79072805 7965CV *
864dbfa3 7966Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 7967{
27da23d5 7968 dVAR;
c04a4dfe
JH
7969 GV *gv = Nullgv;
7970 CV *cv = Nullcv;
79072805
LW
7971
7972 if (!sv)
93a17b20 7973 return *gvp = Nullgv, Nullcv;
79072805 7974 switch (SvTYPE(sv)) {
79072805
LW
7975 case SVt_PVCV:
7976 *st = CvSTASH(sv);
7977 *gvp = Nullgv;
7978 return (CV*)sv;
7979 case SVt_PVHV:
7980 case SVt_PVAV:
7981 *gvp = Nullgv;
7982 return Nullcv;
8990e307
LW
7983 case SVt_PVGV:
7984 gv = (GV*)sv;
a0d0e21e 7985 *gvp = gv;
8990e307
LW
7986 *st = GvESTASH(gv);
7987 goto fix_gv;
7988
79072805 7989 default:
a0d0e21e
LW
7990 if (SvGMAGICAL(sv))
7991 mg_get(sv);
7992 if (SvROK(sv)) {
f5284f61
IZ
7993 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
7994 tryAMAGICunDEREF(to_cv);
7995
62f274bf
GS
7996 sv = SvRV(sv);
7997 if (SvTYPE(sv) == SVt_PVCV) {
7998 cv = (CV*)sv;
7999 *gvp = Nullgv;
8000 *st = CvSTASH(cv);
8001 return cv;
8002 }
8003 else if(isGV(sv))
8004 gv = (GV*)sv;
8005 else
cea2e8a9 8006 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 8007 }
62f274bf 8008 else if (isGV(sv))
79072805
LW
8009 gv = (GV*)sv;
8010 else
7a5fd60d 8011 gv = gv_fetchsv(sv, lref, SVt_PVCV);
79072805
LW
8012 *gvp = gv;
8013 if (!gv)
8014 return Nullcv;
8015 *st = GvESTASH(gv);
8990e307 8016 fix_gv:
8ebc5c01 8017 if (lref && !GvCVu(gv)) {
4633a7c4 8018 SV *tmpsv;
748a9306 8019 ENTER;
4633a7c4 8020 tmpsv = NEWSV(704,0);
16660edb 8021 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
8022 /* XXX this is probably not what they think they're getting.
8023 * It has the same effect as "sub name;", i.e. just a forward
8024 * declaration! */
774d564b 8025 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
8026 newSVOP(OP_CONST, 0, tmpsv),
8027 Nullop,
8990e307 8028 Nullop);
748a9306 8029 LEAVE;
8ebc5c01 8030 if (!GvCVu(gv))
35c1215d
NC
8031 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
8032 sv);
8990e307 8033 }
8ebc5c01 8034 return GvCVu(gv);
79072805
LW
8035 }
8036}
8037
c461cf8f
JH
8038/*
8039=for apidoc sv_true
8040
8041Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
8042Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
8043instead use an in-line version.
c461cf8f
JH
8044
8045=cut
8046*/
8047
79072805 8048I32
864dbfa3 8049Perl_sv_true(pTHX_ register SV *sv)
79072805 8050{
8990e307
LW
8051 if (!sv)
8052 return 0;
79072805 8053 if (SvPOK(sv)) {
e1ec3a88 8054 const register XPV* tXpv;
4e35701f 8055 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 8056 (tXpv->xpv_cur > 1 ||
339049b0 8057 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
79072805
LW
8058 return 1;
8059 else
8060 return 0;
8061 }
8062 else {
8063 if (SvIOK(sv))
463ee0b2 8064 return SvIVX(sv) != 0;
79072805
LW
8065 else {
8066 if (SvNOK(sv))
463ee0b2 8067 return SvNVX(sv) != 0.0;
79072805 8068 else
463ee0b2 8069 return sv_2bool(sv);
79072805
LW
8070 }
8071 }
8072}
79072805 8073
645c22ef
DM
8074/*
8075=for apidoc sv_iv
8076
8077A private implementation of the C<SvIVx> macro for compilers which can't
8078cope with complex macro expressions. Always use the macro instead.
8079
8080=cut
8081*/
8082
ff68c719 8083IV
864dbfa3 8084Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 8085{
25da4f38
IZ
8086 if (SvIOK(sv)) {
8087 if (SvIsUV(sv))
8088 return (IV)SvUVX(sv);
ff68c719 8089 return SvIVX(sv);
25da4f38 8090 }
ff68c719 8091 return sv_2iv(sv);
85e6fe83 8092}
85e6fe83 8093
645c22ef
DM
8094/*
8095=for apidoc sv_uv
8096
8097A private implementation of the C<SvUVx> macro for compilers which can't
8098cope with complex macro expressions. Always use the macro instead.
8099
8100=cut
8101*/
8102
ff68c719 8103UV
864dbfa3 8104Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 8105{
25da4f38
IZ
8106 if (SvIOK(sv)) {
8107 if (SvIsUV(sv))
8108 return SvUVX(sv);
8109 return (UV)SvIVX(sv);
8110 }
ff68c719 8111 return sv_2uv(sv);
8112}
85e6fe83 8113
645c22ef
DM
8114/*
8115=for apidoc sv_nv
8116
8117A private implementation of the C<SvNVx> macro for compilers which can't
8118cope with complex macro expressions. Always use the macro instead.
8119
8120=cut
8121*/
8122
65202027 8123NV
864dbfa3 8124Perl_sv_nv(pTHX_ register SV *sv)
79072805 8125{
ff68c719 8126 if (SvNOK(sv))
8127 return SvNVX(sv);
8128 return sv_2nv(sv);
79072805 8129}
79072805 8130
09540bc3
JH
8131/* sv_pv() is now a macro using SvPV_nolen();
8132 * this function provided for binary compatibility only
8133 */
8134
8135char *
8136Perl_sv_pv(pTHX_ SV *sv)
8137{
8138 STRLEN n_a;
8139
8140 if (SvPOK(sv))
8141 return SvPVX(sv);
8142
8143 return sv_2pv(sv, &n_a);
8144}
8145
645c22ef
DM
8146/*
8147=for apidoc sv_pv
8148
baca2b92 8149Use the C<SvPV_nolen> macro instead
645c22ef 8150
645c22ef
DM
8151=for apidoc sv_pvn
8152
8153A private implementation of the C<SvPV> macro for compilers which can't
8154cope with complex macro expressions. Always use the macro instead.
8155
8156=cut
8157*/
8158
1fa8b10d 8159char *
864dbfa3 8160Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 8161{
85e6fe83
LW
8162 if (SvPOK(sv)) {
8163 *lp = SvCUR(sv);
a0d0e21e 8164 return SvPVX(sv);
85e6fe83 8165 }
463ee0b2 8166 return sv_2pv(sv, lp);
79072805 8167}
79072805 8168
6e9d1081
NC
8169
8170char *
8171Perl_sv_pvn_nomg(pTHX_ register SV *sv, STRLEN *lp)
8172{
8173 if (SvPOK(sv)) {
8174 *lp = SvCUR(sv);
8175 return SvPVX(sv);
8176 }
8177 return sv_2pv_flags(sv, lp, 0);
8178}
8179
09540bc3
JH
8180/* sv_pvn_force() is now a macro using Perl_sv_pvn_force_flags();
8181 * this function provided for binary compatibility only
8182 */
8183
8184char *
8185Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
8186{
8187 return sv_pvn_force_flags(sv, lp, SV_GMAGIC);
8188}
8189
c461cf8f
JH
8190/*
8191=for apidoc sv_pvn_force
8192
8193Get a sensible string out of the SV somehow.
645c22ef
DM
8194A private implementation of the C<SvPV_force> macro for compilers which
8195can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 8196
8d6d96c1
HS
8197=for apidoc sv_pvn_force_flags
8198
8199Get a sensible string out of the SV somehow.
8200If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
8201appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
8202implemented in terms of this function.
645c22ef
DM
8203You normally want to use the various wrapper macros instead: see
8204C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
8205
8206=cut
8207*/
8208
8209char *
8210Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
8211{
a0d0e21e 8212
6fc92669 8213 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 8214 sv_force_normal_flags(sv, 0);
1c846c1f 8215
a0d0e21e
LW
8216 if (SvPOK(sv)) {
8217 *lp = SvCUR(sv);
8218 }
8219 else {
a3b680e6 8220 char *s;
748a9306 8221 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 8222 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 8223 OP_NAME(PL_op));
a0d0e21e 8224 }
4633a7c4 8225 else
8d6d96c1 8226 s = sv_2pv_flags(sv, lp, flags);
3f7c398e 8227 if (s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */
a3b680e6 8228 const STRLEN len = *lp;
1c846c1f 8229
a0d0e21e
LW
8230 if (SvROK(sv))
8231 sv_unref(sv);
8232 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
8233 SvGROW(sv, len + 1);
3f7c398e 8234 Move(s,SvPVX_const(sv),len,char);
a0d0e21e
LW
8235 SvCUR_set(sv, len);
8236 *SvEND(sv) = '\0';
8237 }
8238 if (!SvPOK(sv)) {
8239 SvPOK_on(sv); /* validate pointer */
8240 SvTAINT(sv);
1d7c1841 8241 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 8242 PTR2UV(sv),SvPVX_const(sv)));
a0d0e21e
LW
8243 }
8244 }
8245 return SvPVX(sv);
8246}
8247
09540bc3
JH
8248/* sv_pvbyte () is now a macro using Perl_sv_2pv_flags();
8249 * this function provided for binary compatibility only
8250 */
8251
8252char *
8253Perl_sv_pvbyte(pTHX_ SV *sv)
8254{
8255 sv_utf8_downgrade(sv,0);
8256 return sv_pv(sv);
8257}
8258
645c22ef
DM
8259/*
8260=for apidoc sv_pvbyte
8261
baca2b92 8262Use C<SvPVbyte_nolen> instead.
645c22ef 8263
645c22ef
DM
8264=for apidoc sv_pvbyten
8265
8266A private implementation of the C<SvPVbyte> macro for compilers
8267which can't cope with complex macro expressions. Always use the macro
8268instead.
8269
8270=cut
8271*/
8272
7340a771
GS
8273char *
8274Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
8275{
ffebcc3e 8276 sv_utf8_downgrade(sv,0);
7340a771
GS
8277 return sv_pvn(sv,lp);
8278}
8279
645c22ef
DM
8280/*
8281=for apidoc sv_pvbyten_force
8282
8283A private implementation of the C<SvPVbytex_force> macro for compilers
8284which can't cope with complex macro expressions. Always use the macro
8285instead.
8286
8287=cut
8288*/
8289
7340a771
GS
8290char *
8291Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
8292{
46ec2f14 8293 sv_pvn_force(sv,lp);
ffebcc3e 8294 sv_utf8_downgrade(sv,0);
46ec2f14
TS
8295 *lp = SvCUR(sv);
8296 return SvPVX(sv);
7340a771
GS
8297}
8298
09540bc3
JH
8299/* sv_pvutf8 () is now a macro using Perl_sv_2pv_flags();
8300 * this function provided for binary compatibility only
8301 */
8302
8303char *
8304Perl_sv_pvutf8(pTHX_ SV *sv)
8305{
8306 sv_utf8_upgrade(sv);
8307 return sv_pv(sv);
8308}
8309
645c22ef
DM
8310/*
8311=for apidoc sv_pvutf8
8312
baca2b92 8313Use the C<SvPVutf8_nolen> macro instead
645c22ef 8314
645c22ef
DM
8315=for apidoc sv_pvutf8n
8316
8317A private implementation of the C<SvPVutf8> macro for compilers
8318which can't cope with complex macro expressions. Always use the macro
8319instead.
8320
8321=cut
8322*/
8323
7340a771
GS
8324char *
8325Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
8326{
560a288e 8327 sv_utf8_upgrade(sv);
7340a771
GS
8328 return sv_pvn(sv,lp);
8329}
8330
c461cf8f
JH
8331/*
8332=for apidoc sv_pvutf8n_force
8333
645c22ef
DM
8334A private implementation of the C<SvPVutf8_force> macro for compilers
8335which can't cope with complex macro expressions. Always use the macro
8336instead.
c461cf8f
JH
8337
8338=cut
8339*/
8340
7340a771
GS
8341char *
8342Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
8343{
46ec2f14 8344 sv_pvn_force(sv,lp);
560a288e 8345 sv_utf8_upgrade(sv);
46ec2f14
TS
8346 *lp = SvCUR(sv);
8347 return SvPVX(sv);
7340a771
GS
8348}
8349
c461cf8f
JH
8350/*
8351=for apidoc sv_reftype
8352
8353Returns a string describing what the SV is a reference to.
8354
8355=cut
8356*/
8357
1cb0ed9b 8358char *
bfed75c6 8359Perl_sv_reftype(pTHX_ const SV *sv, int ob)
a0d0e21e 8360{
07409e01
NC
8361 /* The fact that I don't need to downcast to char * everywhere, only in ?:
8362 inside return suggests a const propagation bug in g++. */
c86bf373 8363 if (ob && SvOBJECT(sv)) {
bfcb3514 8364 char *name = HvNAME_get(SvSTASH(sv));
07409e01 8365 return name ? name : (char *) "__ANON__";
c86bf373 8366 }
a0d0e21e
LW
8367 else {
8368 switch (SvTYPE(sv)) {
8369 case SVt_NULL:
8370 case SVt_IV:
8371 case SVt_NV:
8372 case SVt_RV:
8373 case SVt_PV:
8374 case SVt_PVIV:
8375 case SVt_PVNV:
8376 case SVt_PVMG:
8377 case SVt_PVBM:
1cb0ed9b 8378 if (SvVOK(sv))
439cb1c4 8379 return "VSTRING";
a0d0e21e
LW
8380 if (SvROK(sv))
8381 return "REF";
8382 else
8383 return "SCALAR";
1cb0ed9b 8384
07409e01 8385 case SVt_PVLV: return (char *) (SvROK(sv) ? "REF"
be65207d
DM
8386 /* tied lvalues should appear to be
8387 * scalars for backwards compatitbility */
8388 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
07409e01 8389 ? "SCALAR" : "LVALUE");
a0d0e21e
LW
8390 case SVt_PVAV: return "ARRAY";
8391 case SVt_PVHV: return "HASH";
8392 case SVt_PVCV: return "CODE";
8393 case SVt_PVGV: return "GLOB";
1d2dff63 8394 case SVt_PVFM: return "FORMAT";
27f9d8f3 8395 case SVt_PVIO: return "IO";
a0d0e21e
LW
8396 default: return "UNKNOWN";
8397 }
8398 }
8399}
8400
954c1994
GS
8401/*
8402=for apidoc sv_isobject
8403
8404Returns a boolean indicating whether the SV is an RV pointing to a blessed
8405object. If the SV is not an RV, or if the object is not blessed, then this
8406will return false.
8407
8408=cut
8409*/
8410
463ee0b2 8411int
864dbfa3 8412Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 8413{
68dc0745 8414 if (!sv)
8415 return 0;
8416 if (SvGMAGICAL(sv))
8417 mg_get(sv);
85e6fe83
LW
8418 if (!SvROK(sv))
8419 return 0;
8420 sv = (SV*)SvRV(sv);
8421 if (!SvOBJECT(sv))
8422 return 0;
8423 return 1;
8424}
8425
954c1994
GS
8426/*
8427=for apidoc sv_isa
8428
8429Returns a boolean indicating whether the SV is blessed into the specified
8430class. This does not check for subtypes; use C<sv_derived_from> to verify
8431an inheritance relationship.
8432
8433=cut
8434*/
8435
85e6fe83 8436int
864dbfa3 8437Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 8438{
bfcb3514 8439 const char *hvname;
68dc0745 8440 if (!sv)
8441 return 0;
8442 if (SvGMAGICAL(sv))
8443 mg_get(sv);
ed6116ce 8444 if (!SvROK(sv))
463ee0b2 8445 return 0;
ed6116ce
LW
8446 sv = (SV*)SvRV(sv);
8447 if (!SvOBJECT(sv))
463ee0b2 8448 return 0;
bfcb3514
NC
8449 hvname = HvNAME_get(SvSTASH(sv));
8450 if (!hvname)
e27ad1f2 8451 return 0;
463ee0b2 8452
bfcb3514 8453 return strEQ(hvname, name);
463ee0b2
LW
8454}
8455
954c1994
GS
8456/*
8457=for apidoc newSVrv
8458
8459Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
8460it will be upgraded to one. If C<classname> is non-null then the new SV will
8461be blessed in the specified package. The new SV is returned and its
8462reference count is 1.
8463
8464=cut
8465*/
8466
463ee0b2 8467SV*
864dbfa3 8468Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 8469{
463ee0b2
LW
8470 SV *sv;
8471
4561caa4 8472 new_SV(sv);
51cf62d8 8473
765f542d 8474 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 8475 SvAMAGIC_off(rv);
51cf62d8 8476
0199fce9 8477 if (SvTYPE(rv) >= SVt_PVMG) {
a3b680e6 8478 const U32 refcnt = SvREFCNT(rv);
0199fce9
JD
8479 SvREFCNT(rv) = 0;
8480 sv_clear(rv);
8481 SvFLAGS(rv) = 0;
8482 SvREFCNT(rv) = refcnt;
8483 }
8484
51cf62d8 8485 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
8486 sv_upgrade(rv, SVt_RV);
8487 else if (SvTYPE(rv) > SVt_RV) {
8bd4d4c5 8488 SvPV_free(rv);
0199fce9
JD
8489 SvCUR_set(rv, 0);
8490 SvLEN_set(rv, 0);
8491 }
51cf62d8 8492
0c34ef67 8493 SvOK_off(rv);
b162af07 8494 SvRV_set(rv, sv);
ed6116ce 8495 SvROK_on(rv);
463ee0b2 8496
a0d0e21e
LW
8497 if (classname) {
8498 HV* stash = gv_stashpv(classname, TRUE);
8499 (void)sv_bless(rv, stash);
8500 }
8501 return sv;
8502}
8503
954c1994
GS
8504/*
8505=for apidoc sv_setref_pv
8506
8507Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
8508argument will be upgraded to an RV. That RV will be modified to point to
8509the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
8510into the SV. The C<classname> argument indicates the package for the
8511blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8512will have a reference count of 1, and the RV will be returned.
954c1994
GS
8513
8514Do not use with other Perl types such as HV, AV, SV, CV, because those
8515objects will become corrupted by the pointer copy process.
8516
8517Note that C<sv_setref_pvn> copies the string while this copies the pointer.
8518
8519=cut
8520*/
8521
a0d0e21e 8522SV*
864dbfa3 8523Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 8524{
189b2af5 8525 if (!pv) {
3280af22 8526 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
8527 SvSETMAGIC(rv);
8528 }
a0d0e21e 8529 else
56431972 8530 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
8531 return rv;
8532}
8533
954c1994
GS
8534/*
8535=for apidoc sv_setref_iv
8536
8537Copies an integer into a new SV, optionally blessing the SV. The C<rv>
8538argument will be upgraded to an RV. That RV will be modified to point to
8539the new SV. The C<classname> argument indicates the package for the
8540blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8541will have a reference count of 1, and the RV will be returned.
954c1994
GS
8542
8543=cut
8544*/
8545
a0d0e21e 8546SV*
864dbfa3 8547Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
8548{
8549 sv_setiv(newSVrv(rv,classname), iv);
8550 return rv;
8551}
8552
954c1994 8553/*
e1c57cef
JH
8554=for apidoc sv_setref_uv
8555
8556Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
8557argument will be upgraded to an RV. That RV will be modified to point to
8558the new SV. The C<classname> argument indicates the package for the
8559blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8560will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
8561
8562=cut
8563*/
8564
8565SV*
8566Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
8567{
8568 sv_setuv(newSVrv(rv,classname), uv);
8569 return rv;
8570}
8571
8572/*
954c1994
GS
8573=for apidoc sv_setref_nv
8574
8575Copies a double into a new SV, optionally blessing the SV. The C<rv>
8576argument will be upgraded to an RV. That RV will be modified to point to
8577the new SV. The C<classname> argument indicates the package for the
8578blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8579will have a reference count of 1, and the RV will be returned.
954c1994
GS
8580
8581=cut
8582*/
8583
a0d0e21e 8584SV*
65202027 8585Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
8586{
8587 sv_setnv(newSVrv(rv,classname), nv);
8588 return rv;
8589}
463ee0b2 8590
954c1994
GS
8591/*
8592=for apidoc sv_setref_pvn
8593
8594Copies a string into a new SV, optionally blessing the SV. The length of the
8595string must be specified with C<n>. The C<rv> argument will be upgraded to
8596an RV. That RV will be modified to point to the new SV. The C<classname>
8597argument indicates the package for the blessing. Set C<classname> to
7a5fa8a2 8598C<Nullch> to avoid the blessing. The new SV will have a reference count
d34c2299 8599of 1, and the RV will be returned.
954c1994
GS
8600
8601Note that C<sv_setref_pv> copies the pointer while this copies the string.
8602
8603=cut
8604*/
8605
a0d0e21e 8606SV*
864dbfa3 8607Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
8608{
8609 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
8610 return rv;
8611}
8612
954c1994
GS
8613/*
8614=for apidoc sv_bless
8615
8616Blesses an SV into a specified package. The SV must be an RV. The package
8617must be designated by its stash (see C<gv_stashpv()>). The reference count
8618of the SV is unaffected.
8619
8620=cut
8621*/
8622
a0d0e21e 8623SV*
864dbfa3 8624Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 8625{
76e3520e 8626 SV *tmpRef;
a0d0e21e 8627 if (!SvROK(sv))
cea2e8a9 8628 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
8629 tmpRef = SvRV(sv);
8630 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
8631 if (SvREADONLY(tmpRef))
cea2e8a9 8632 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
8633 if (SvOBJECT(tmpRef)) {
8634 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8635 --PL_sv_objcount;
76e3520e 8636 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 8637 }
a0d0e21e 8638 }
76e3520e
GS
8639 SvOBJECT_on(tmpRef);
8640 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8641 ++PL_sv_objcount;
76e3520e 8642 (void)SvUPGRADE(tmpRef, SVt_PVMG);
b162af07 8643 SvSTASH_set(tmpRef, (HV*)SvREFCNT_inc(stash));
a0d0e21e 8644
2e3febc6
CS
8645 if (Gv_AMG(stash))
8646 SvAMAGIC_on(sv);
8647 else
8648 SvAMAGIC_off(sv);
a0d0e21e 8649
1edbfb88
AB
8650 if(SvSMAGICAL(tmpRef))
8651 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8652 mg_set(tmpRef);
8653
8654
ecdeb87c 8655
a0d0e21e
LW
8656 return sv;
8657}
8658
645c22ef 8659/* Downgrades a PVGV to a PVMG.
645c22ef
DM
8660 */
8661
76e3520e 8662STATIC void
cea2e8a9 8663S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 8664{
850fabdf
GS
8665 void *xpvmg;
8666
a0d0e21e
LW
8667 assert(SvTYPE(sv) == SVt_PVGV);
8668 SvFAKE_off(sv);
8669 if (GvGP(sv))
1edc1566 8670 gp_free((GV*)sv);
e826b3c7
GS
8671 if (GvSTASH(sv)) {
8672 SvREFCNT_dec(GvSTASH(sv));
8673 GvSTASH(sv) = Nullhv;
8674 }
14befaf4 8675 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 8676 Safefree(GvNAME(sv));
a5f75d66 8677 GvMULTI_off(sv);
850fabdf
GS
8678
8679 /* need to keep SvANY(sv) in the right arena */
8680 xpvmg = new_XPVMG();
8681 StructCopy(SvANY(sv), xpvmg, XPVMG);
8682 del_XPVGV(SvANY(sv));
8683 SvANY(sv) = xpvmg;
8684
a0d0e21e
LW
8685 SvFLAGS(sv) &= ~SVTYPEMASK;
8686 SvFLAGS(sv) |= SVt_PVMG;
8687}
8688
954c1994 8689/*
840a7b70 8690=for apidoc sv_unref_flags
954c1994
GS
8691
8692Unsets the RV status of the SV, and decrements the reference count of
8693whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
8694as a reversal of C<newSVrv>. The C<cflags> argument can contain
8695C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8696(otherwise the decrementing is conditional on the reference count being
8697different from one or the reference being a readonly SV).
7889fe52 8698See C<SvROK_off>.
954c1994
GS
8699
8700=cut
8701*/
8702
ed6116ce 8703void
840a7b70 8704Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 8705{
a0d0e21e 8706 SV* rv = SvRV(sv);
810b8aa5
GS
8707
8708 if (SvWEAKREF(sv)) {
8709 sv_del_backref(sv);
8710 SvWEAKREF_off(sv);
b162af07 8711 SvRV_set(sv, NULL);
810b8aa5
GS
8712 return;
8713 }
b162af07 8714 SvRV_set(sv, NULL);
ed6116ce 8715 SvROK_off(sv);
04ca4930
NC
8716 /* You can't have a || SvREADONLY(rv) here, as $a = $$a, where $a was
8717 assigned to as BEGIN {$a = \"Foo"} will fail. */
8718 if (SvREFCNT(rv) != 1 || (flags & SV_IMMEDIATE_UNREF))
4633a7c4 8719 SvREFCNT_dec(rv);
840a7b70 8720 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 8721 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 8722}
8990e307 8723
840a7b70
IZ
8724/*
8725=for apidoc sv_unref
8726
8727Unsets the RV status of the SV, and decrements the reference count of
8728whatever was being referenced by the RV. This can almost be thought of
8729as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 8730being zero. See C<SvROK_off>.
840a7b70
IZ
8731
8732=cut
8733*/
8734
8735void
8736Perl_sv_unref(pTHX_ SV *sv)
8737{
8738 sv_unref_flags(sv, 0);
8739}
8740
645c22ef
DM
8741/*
8742=for apidoc sv_taint
8743
8744Taint an SV. Use C<SvTAINTED_on> instead.
8745=cut
8746*/
8747
bbce6d69 8748void
864dbfa3 8749Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 8750{
14befaf4 8751 sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
bbce6d69 8752}
8753
645c22ef
DM
8754/*
8755=for apidoc sv_untaint
8756
8757Untaint an SV. Use C<SvTAINTED_off> instead.
8758=cut
8759*/
8760
bbce6d69 8761void
864dbfa3 8762Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 8763{
13f57bf8 8764 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8765 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 8766 if (mg)
565764a8 8767 mg->mg_len &= ~1;
36477c24 8768 }
bbce6d69 8769}
8770
645c22ef
DM
8771/*
8772=for apidoc sv_tainted
8773
8774Test an SV for taintedness. Use C<SvTAINTED> instead.
8775=cut
8776*/
8777
bbce6d69 8778bool
864dbfa3 8779Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 8780{
13f57bf8 8781 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8782 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
155aba94 8783 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 8784 return TRUE;
8785 }
8786 return FALSE;
bbce6d69 8787}
8788
09540bc3
JH
8789/*
8790=for apidoc sv_setpviv
8791
8792Copies an integer into the given SV, also updating its string value.
8793Does not handle 'set' magic. See C<sv_setpviv_mg>.
8794
8795=cut
8796*/
8797
8798void
8799Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
8800{
8801 char buf[TYPE_CHARS(UV)];
8802 char *ebuf;
8803 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8804
8805 sv_setpvn(sv, ptr, ebuf - ptr);
8806}
8807
8808/*
8809=for apidoc sv_setpviv_mg
8810
8811Like C<sv_setpviv>, but also handles 'set' magic.
8812
8813=cut
8814*/
8815
8816void
8817Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
8818{
8819 char buf[TYPE_CHARS(UV)];
8820 char *ebuf;
8821 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8822
8823 sv_setpvn(sv, ptr, ebuf - ptr);
8824 SvSETMAGIC(sv);
8825}
8826
cea2e8a9 8827#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8828
8829/* pTHX_ magic can't cope with varargs, so this is a no-context
8830 * version of the main function, (which may itself be aliased to us).
8831 * Don't access this version directly.
8832 */
8833
cea2e8a9
GS
8834void
8835Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
8836{
8837 dTHX;
8838 va_list args;
8839 va_start(args, pat);
c5be433b 8840 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
8841 va_end(args);
8842}
8843
645c22ef
DM
8844/* pTHX_ magic can't cope with varargs, so this is a no-context
8845 * version of the main function, (which may itself be aliased to us).
8846 * Don't access this version directly.
8847 */
cea2e8a9
GS
8848
8849void
8850Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
8851{
8852 dTHX;
8853 va_list args;
8854 va_start(args, pat);
c5be433b 8855 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 8856 va_end(args);
cea2e8a9
GS
8857}
8858#endif
8859
954c1994
GS
8860/*
8861=for apidoc sv_setpvf
8862
bffc3d17
SH
8863Works like C<sv_catpvf> but copies the text into the SV instead of
8864appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
8865
8866=cut
8867*/
8868
46fc3d4c 8869void
864dbfa3 8870Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8871{
8872 va_list args;
46fc3d4c 8873 va_start(args, pat);
c5be433b 8874 sv_vsetpvf(sv, pat, &args);
46fc3d4c 8875 va_end(args);
8876}
8877
bffc3d17
SH
8878/*
8879=for apidoc sv_vsetpvf
8880
8881Works like C<sv_vcatpvf> but copies the text into the SV instead of
8882appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
8883
8884Usually used via its frontend C<sv_setpvf>.
8885
8886=cut
8887*/
645c22ef 8888
c5be433b
GS
8889void
8890Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8891{
8892 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8893}
ef50df4b 8894
954c1994
GS
8895/*
8896=for apidoc sv_setpvf_mg
8897
8898Like C<sv_setpvf>, but also handles 'set' magic.
8899
8900=cut
8901*/
8902
ef50df4b 8903void
864dbfa3 8904Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8905{
8906 va_list args;
ef50df4b 8907 va_start(args, pat);
c5be433b 8908 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 8909 va_end(args);
c5be433b
GS
8910}
8911
bffc3d17
SH
8912/*
8913=for apidoc sv_vsetpvf_mg
8914
8915Like C<sv_vsetpvf>, but also handles 'set' magic.
8916
8917Usually used via its frontend C<sv_setpvf_mg>.
8918
8919=cut
8920*/
645c22ef 8921
c5be433b
GS
8922void
8923Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8924{
8925 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
8926 SvSETMAGIC(sv);
8927}
8928
cea2e8a9 8929#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8930
8931/* pTHX_ magic can't cope with varargs, so this is a no-context
8932 * version of the main function, (which may itself be aliased to us).
8933 * Don't access this version directly.
8934 */
8935
cea2e8a9
GS
8936void
8937Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
8938{
8939 dTHX;
8940 va_list args;
8941 va_start(args, pat);
c5be433b 8942 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
8943 va_end(args);
8944}
8945
645c22ef
DM
8946/* pTHX_ magic can't cope with varargs, so this is a no-context
8947 * version of the main function, (which may itself be aliased to us).
8948 * Don't access this version directly.
8949 */
8950
cea2e8a9
GS
8951void
8952Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
8953{
8954 dTHX;
8955 va_list args;
8956 va_start(args, pat);
c5be433b 8957 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 8958 va_end(args);
cea2e8a9
GS
8959}
8960#endif
8961
954c1994
GS
8962/*
8963=for apidoc sv_catpvf
8964
d5ce4a7c
GA
8965Processes its arguments like C<sprintf> and appends the formatted
8966output to an SV. If the appended data contains "wide" characters
8967(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
8968and characters >255 formatted with %c), the original SV might get
bffc3d17 8969upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
8970C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
8971valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 8972
d5ce4a7c 8973=cut */
954c1994 8974
46fc3d4c 8975void
864dbfa3 8976Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8977{
8978 va_list args;
46fc3d4c 8979 va_start(args, pat);
c5be433b 8980 sv_vcatpvf(sv, pat, &args);
46fc3d4c 8981 va_end(args);
8982}
8983
bffc3d17
SH
8984/*
8985=for apidoc sv_vcatpvf
8986
8987Processes its arguments like C<vsprintf> and appends the formatted output
8988to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
8989
8990Usually used via its frontend C<sv_catpvf>.
8991
8992=cut
8993*/
645c22ef 8994
ef50df4b 8995void
c5be433b
GS
8996Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8997{
8998 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8999}
9000
954c1994
GS
9001/*
9002=for apidoc sv_catpvf_mg
9003
9004Like C<sv_catpvf>, but also handles 'set' magic.
9005
9006=cut
9007*/
9008
c5be433b 9009void
864dbfa3 9010Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
9011{
9012 va_list args;
ef50df4b 9013 va_start(args, pat);
c5be433b 9014 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 9015 va_end(args);
c5be433b
GS
9016}
9017
bffc3d17
SH
9018/*
9019=for apidoc sv_vcatpvf_mg
9020
9021Like C<sv_vcatpvf>, but also handles 'set' magic.
9022
9023Usually used via its frontend C<sv_catpvf_mg>.
9024
9025=cut
9026*/
645c22ef 9027
c5be433b
GS
9028void
9029Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
9030{
9031 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
9032 SvSETMAGIC(sv);
9033}
9034
954c1994
GS
9035/*
9036=for apidoc sv_vsetpvfn
9037
bffc3d17 9038Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
9039appending it.
9040
bffc3d17 9041Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 9042
954c1994
GS
9043=cut
9044*/
9045
46fc3d4c 9046void
7d5ea4e7 9047Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 9048{
9049 sv_setpvn(sv, "", 0);
7d5ea4e7 9050 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 9051}
9052
645c22ef
DM
9053/* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
9054
2d00ba3b 9055STATIC I32
9dd79c3f 9056S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
9057{
9058 I32 var = 0;
9059 switch (**pattern) {
9060 case '1': case '2': case '3':
9061 case '4': case '5': case '6':
9062 case '7': case '8': case '9':
9063 while (isDIGIT(**pattern))
9064 var = var * 10 + (*(*pattern)++ - '0');
9065 }
9066 return var;
9067}
9dd79c3f 9068#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 9069
4151a5fe
IZ
9070static char *
9071F0convert(NV nv, char *endbuf, STRLEN *len)
9072{
a3b680e6 9073 const int neg = nv < 0;
4151a5fe
IZ
9074 UV uv;
9075 char *p = endbuf;
9076
9077 if (neg)
9078 nv = -nv;
9079 if (nv < UV_MAX) {
9080 nv += 0.5;
028f8eaa 9081 uv = (UV)nv;
4151a5fe
IZ
9082 if (uv & 1 && uv == nv)
9083 uv--; /* Round to even */
9084 do {
a3b680e6 9085 const unsigned dig = uv % 10;
4151a5fe
IZ
9086 *--p = '0' + dig;
9087 } while (uv /= 10);
9088 if (neg)
9089 *--p = '-';
9090 *len = endbuf - p;
9091 return p;
9092 }
9093 return Nullch;
9094}
9095
9096
954c1994
GS
9097/*
9098=for apidoc sv_vcatpvfn
9099
9100Processes its arguments like C<vsprintf> and appends the formatted output
9101to an SV. Uses an array of SVs if the C style variable argument list is
9102missing (NULL). When running with taint checks enabled, indicates via
9103C<maybe_tainted> if results are untrustworthy (often due to the use of
9104locales).
9105
bffc3d17 9106Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 9107
954c1994
GS
9108=cut
9109*/
9110
1ef29b0e
RGS
9111/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
9112
46fc3d4c 9113void
7d5ea4e7 9114Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 9115{
9116 char *p;
9117 char *q;
a3b680e6 9118 const char *patend;
fc36a67e 9119 STRLEN origlen;
46fc3d4c 9120 I32 svix = 0;
27da23d5 9121 static const char nullstr[] = "(null)";
9c5ffd7c 9122 SV *argsv = Nullsv;
db79b45b
JH
9123 bool has_utf8; /* has the result utf8? */
9124 bool pat_utf8; /* the pattern is in utf8? */
9125 SV *nsv = Nullsv;
4151a5fe
IZ
9126 /* Times 4: a decimal digit takes more than 3 binary digits.
9127 * NV_DIG: mantissa takes than many decimal digits.
9128 * Plus 32: Playing safe. */
9129 char ebuf[IV_DIG * 4 + NV_DIG + 32];
9130 /* large enough for "%#.#f" --chip */
9131 /* what about long double NVs? --jhi */
db79b45b
JH
9132
9133 has_utf8 = pat_utf8 = DO_UTF8(sv);
46fc3d4c 9134
9135 /* no matter what, this is a string now */
fc36a67e 9136 (void)SvPV_force(sv, origlen);
46fc3d4c 9137
0dbb1585 9138 /* special-case "", "%s", and "%-p" (SVf) */
46fc3d4c 9139 if (patlen == 0)
9140 return;
0dbb1585 9141 if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
c635e13b 9142 if (args) {
73d840c0 9143 const char *s = va_arg(*args, char*);
c635e13b 9144 sv_catpv(sv, s ? s : nullstr);
9145 }
7e2040f0 9146 else if (svix < svmax) {
fc36a67e 9147 sv_catsv(sv, *svargs);
7e2040f0
GS
9148 if (DO_UTF8(*svargs))
9149 SvUTF8_on(sv);
9150 }
fc36a67e 9151 return;
0dbb1585
AL
9152 }
9153 if (patlen == 3 && pat[0] == '%' &&
9154 pat[1] == '-' && pat[2] == 'p') {
fc36a67e 9155 if (args) {
7e2040f0
GS
9156 argsv = va_arg(*args, SV*);
9157 sv_catsv(sv, argsv);
9158 if (DO_UTF8(argsv))
9159 SvUTF8_on(sv);
fc36a67e 9160 return;
9161 }
46fc3d4c 9162 }
9163
1d917b39 9164#ifndef USE_LONG_DOUBLE
4151a5fe
IZ
9165 /* special-case "%.<number>[gf]" */
9166 if ( patlen <= 5 && pat[0] == '%' && pat[1] == '.'
9167 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
9168 unsigned digits = 0;
9169 const char *pp;
9170
9171 pp = pat + 2;
9172 while (*pp >= '0' && *pp <= '9')
9173 digits = 10 * digits + (*pp++ - '0');
028f8eaa 9174 if (pp - pat == (int)patlen - 1) {
4151a5fe
IZ
9175 NV nv;
9176
9177 if (args)
9178 nv = (NV)va_arg(*args, double);
9179 else if (svix < svmax)
9180 nv = SvNV(*svargs);
9181 else
9182 return;
9183 if (*pp == 'g') {
2873255c
NC
9184 /* Add check for digits != 0 because it seems that some
9185 gconverts are buggy in this case, and we don't yet have
9186 a Configure test for this. */
9187 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
9188 /* 0, point, slack */
2e59c212 9189 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
9190 sv_catpv(sv, ebuf);
9191 if (*ebuf) /* May return an empty string for digits==0 */
9192 return;
9193 }
9194 } else if (!digits) {
9195 STRLEN l;
9196
9197 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
9198 sv_catpvn(sv, p, l);
9199 return;
9200 }
9201 }
9202 }
9203 }
1d917b39 9204#endif /* !USE_LONG_DOUBLE */
4151a5fe 9205
2cf2cfc6 9206 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 9207 has_utf8 = TRUE;
2cf2cfc6 9208
46fc3d4c 9209 patend = (char*)pat + patlen;
9210 for (p = (char*)pat; p < patend; p = q) {
9211 bool alt = FALSE;
9212 bool left = FALSE;
b22c7a20 9213 bool vectorize = FALSE;
211dfcf1 9214 bool vectorarg = FALSE;
2cf2cfc6 9215 bool vec_utf8 = FALSE;
46fc3d4c 9216 char fill = ' ';
9217 char plus = 0;
9218 char intsize = 0;
9219 STRLEN width = 0;
fc36a67e 9220 STRLEN zeros = 0;
46fc3d4c 9221 bool has_precis = FALSE;
9222 STRLEN precis = 0;
58e33a90 9223 I32 osvix = svix;
2cf2cfc6 9224 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
9225#ifdef HAS_LDBL_SPRINTF_BUG
9226 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 9227 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
9228 bool fix_ldbl_sprintf_bug = FALSE;
9229#endif
205f51d8 9230
46fc3d4c 9231 char esignbuf[4];
89ebb4a3 9232 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 9233 STRLEN esignlen = 0;
9234
9235 char *eptr = Nullch;
fc36a67e 9236 STRLEN elen = 0;
81f715da 9237 SV *vecsv = Nullsv;
a05b299f 9238 U8 *vecstr = Null(U8*);
b22c7a20 9239 STRLEN veclen = 0;
934abaf1 9240 char c = 0;
46fc3d4c 9241 int i;
9c5ffd7c 9242 unsigned base = 0;
8c8eb53c
RB
9243 IV iv = 0;
9244 UV uv = 0;
9e5b023a
JH
9245 /* we need a long double target in case HAS_LONG_DOUBLE but
9246 not USE_LONG_DOUBLE
9247 */
35fff930 9248#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
9249 long double nv;
9250#else
65202027 9251 NV nv;
9e5b023a 9252#endif
46fc3d4c 9253 STRLEN have;
9254 STRLEN need;
9255 STRLEN gap;
e1ec3a88 9256 const char *dotstr = ".";
b22c7a20 9257 STRLEN dotstrlen = 1;
211dfcf1 9258 I32 efix = 0; /* explicit format parameter index */
eb3fce90 9259 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
9260 I32 epix = 0; /* explicit precision index */
9261 I32 evix = 0; /* explicit vector index */
eb3fce90 9262 bool asterisk = FALSE;
46fc3d4c 9263
211dfcf1 9264 /* echo everything up to the next format specification */
46fc3d4c 9265 for (q = p; q < patend && *q != '%'; ++q) ;
9266 if (q > p) {
db79b45b
JH
9267 if (has_utf8 && !pat_utf8)
9268 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
9269 else
9270 sv_catpvn(sv, p, q - p);
46fc3d4c 9271 p = q;
9272 }
9273 if (q++ >= patend)
9274 break;
9275
211dfcf1
HS
9276/*
9277 We allow format specification elements in this order:
9278 \d+\$ explicit format parameter index
9279 [-+ 0#]+ flags
a472f209 9280 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 9281 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
9282 \d+|\*(\d+\$)? width using optional (optionally specified) arg
9283 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
9284 [hlqLV] size
9285 [%bcdefginopsux_DFOUX] format (mandatory)
9286*/
9287 if (EXPECT_NUMBER(q, width)) {
9288 if (*q == '$') {
9289 ++q;
9290 efix = width;
9291 } else {
9292 goto gotwidth;
9293 }
9294 }
9295
fc36a67e 9296 /* FLAGS */
9297
46fc3d4c 9298 while (*q) {
9299 switch (*q) {
9300 case ' ':
9301 case '+':
9302 plus = *q++;
9303 continue;
9304
9305 case '-':
9306 left = TRUE;
9307 q++;
9308 continue;
9309
9310 case '0':
9311 fill = *q++;
9312 continue;
9313
9314 case '#':
9315 alt = TRUE;
9316 q++;
9317 continue;
9318
fc36a67e 9319 default:
9320 break;
9321 }
9322 break;
9323 }
46fc3d4c 9324
211dfcf1 9325 tryasterisk:
eb3fce90 9326 if (*q == '*') {
211dfcf1
HS
9327 q++;
9328 if (EXPECT_NUMBER(q, ewix))
9329 if (*q++ != '$')
9330 goto unknown;
eb3fce90 9331 asterisk = TRUE;
211dfcf1
HS
9332 }
9333 if (*q == 'v') {
eb3fce90 9334 q++;
211dfcf1
HS
9335 if (vectorize)
9336 goto unknown;
9cbac4c7 9337 if ((vectorarg = asterisk)) {
211dfcf1
HS
9338 evix = ewix;
9339 ewix = 0;
9340 asterisk = FALSE;
9341 }
9342 vectorize = TRUE;
9343 goto tryasterisk;
eb3fce90
JH
9344 }
9345
211dfcf1 9346 if (!asterisk)
7a5fa8a2 9347 if( *q == '0' )
f3583277 9348 fill = *q++;
211dfcf1
HS
9349 EXPECT_NUMBER(q, width);
9350
9351 if (vectorize) {
9352 if (vectorarg) {
9353 if (args)
9354 vecsv = va_arg(*args, SV*);
9355 else
9356 vecsv = (evix ? evix <= svmax : svix < svmax) ?
3a7a539e 9357 svargs[evix ? evix-1 : svix++] : &PL_sv_undef;
4459522c 9358 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1 9359 if (DO_UTF8(vecsv))
2cf2cfc6 9360 is_utf8 = TRUE;
211dfcf1
HS
9361 }
9362 if (args) {
9363 vecsv = va_arg(*args, SV*);
9364 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 9365 vec_utf8 = DO_UTF8(vecsv);
eb3fce90 9366 }
211dfcf1
HS
9367 else if (efix ? efix <= svmax : svix < svmax) {
9368 vecsv = svargs[efix ? efix-1 : svix++];
9369 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 9370 vec_utf8 = DO_UTF8(vecsv);
d7aa5382 9371 /* if this is a version object, we need to return the
3f7c398e 9372 * stringified representation (which the SvPVX_const has
d7aa5382
JP
9373 * already done for us), but not vectorize the args
9374 */
9375 if ( *q == 'd' && sv_derived_from(vecsv,"version") )
9376 {
9377 q++; /* skip past the rest of the %vd format */
da6068d9 9378 eptr = (char *) vecstr;
d7aa5382
JP
9379 elen = strlen(eptr);
9380 vectorize=FALSE;
9381 goto string;
9382 }
211dfcf1
HS
9383 }
9384 else {
9385 vecstr = (U8*)"";
9386 veclen = 0;
9387 }
eb3fce90 9388 }
fc36a67e 9389
eb3fce90 9390 if (asterisk) {
fc36a67e 9391 if (args)
9392 i = va_arg(*args, int);
9393 else
eb3fce90
JH
9394 i = (ewix ? ewix <= svmax : svix < svmax) ?
9395 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 9396 left |= (i < 0);
9397 width = (i < 0) ? -i : i;
fc36a67e 9398 }
211dfcf1 9399 gotwidth:
fc36a67e 9400
9401 /* PRECISION */
46fc3d4c 9402
fc36a67e 9403 if (*q == '.') {
9404 q++;
9405 if (*q == '*') {
211dfcf1 9406 q++;
7b8dd722
HS
9407 if (EXPECT_NUMBER(q, epix) && *q++ != '$')
9408 goto unknown;
9409 /* XXX: todo, support specified precision parameter */
9410 if (epix)
211dfcf1 9411 goto unknown;
46fc3d4c 9412 if (args)
9413 i = va_arg(*args, int);
9414 else
eb3fce90
JH
9415 i = (ewix ? ewix <= svmax : svix < svmax)
9416 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 9417 precis = (i < 0) ? 0 : i;
fc36a67e 9418 }
9419 else {
9420 precis = 0;
9421 while (isDIGIT(*q))
9422 precis = precis * 10 + (*q++ - '0');
9423 }
9424 has_precis = TRUE;
9425 }
46fc3d4c 9426
fc36a67e 9427 /* SIZE */
46fc3d4c 9428
fc36a67e 9429 switch (*q) {
c623ac67
GS
9430#ifdef WIN32
9431 case 'I': /* Ix, I32x, and I64x */
9432# ifdef WIN64
9433 if (q[1] == '6' && q[2] == '4') {
9434 q += 3;
9435 intsize = 'q';
9436 break;
9437 }
9438# endif
9439 if (q[1] == '3' && q[2] == '2') {
9440 q += 3;
9441 break;
9442 }
9443# ifdef WIN64
9444 intsize = 'q';
9445# endif
9446 q++;
9447 break;
9448#endif
9e5b023a 9449#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 9450 case 'L': /* Ld */
e5c81feb 9451 /* FALL THROUGH */
e5c81feb 9452#ifdef HAS_QUAD
6f9bb7fd 9453 case 'q': /* qd */
9e5b023a 9454#endif
6f9bb7fd
GS
9455 intsize = 'q';
9456 q++;
9457 break;
9458#endif
fc36a67e 9459 case 'l':
9e5b023a 9460#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 9461 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 9462 intsize = 'q';
9463 q += 2;
46fc3d4c 9464 break;
cf2093f6 9465 }
fc36a67e 9466#endif
6f9bb7fd 9467 /* FALL THROUGH */
fc36a67e 9468 case 'h':
cf2093f6 9469 /* FALL THROUGH */
fc36a67e 9470 case 'V':
9471 intsize = *q++;
46fc3d4c 9472 break;
9473 }
9474
fc36a67e 9475 /* CONVERSION */
9476
211dfcf1
HS
9477 if (*q == '%') {
9478 eptr = q++;
9479 elen = 1;
9480 goto string;
9481 }
9482
be75b157
HS
9483 if (vectorize)
9484 argsv = vecsv;
9485 else if (!args)
211dfcf1
HS
9486 argsv = (efix ? efix <= svmax : svix < svmax) ?
9487 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
9488
46fc3d4c 9489 switch (c = *q++) {
9490
9491 /* STRINGS */
9492
46fc3d4c 9493 case 'c':
be75b157 9494 uv = (args && !vectorize) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
9495 if ((uv > 255 ||
9496 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 9497 && !IN_BYTES) {
dfe13c55 9498 eptr = (char*)utf8buf;
9041c2e3 9499 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 9500 is_utf8 = TRUE;
7e2040f0
GS
9501 }
9502 else {
9503 c = (char)uv;
9504 eptr = &c;
9505 elen = 1;
a0ed51b3 9506 }
46fc3d4c 9507 goto string;
9508
46fc3d4c 9509 case 's':
be75b157 9510 if (args && !vectorize) {
fc36a67e 9511 eptr = va_arg(*args, char*);
c635e13b 9512 if (eptr)
1d7c1841
GS
9513#ifdef MACOS_TRADITIONAL
9514 /* On MacOS, %#s format is used for Pascal strings */
9515 if (alt)
9516 elen = *eptr++;
9517 else
9518#endif
c635e13b 9519 elen = strlen(eptr);
9520 else {
27da23d5 9521 eptr = (char *)nullstr;
c635e13b 9522 elen = sizeof nullstr - 1;
9523 }
46fc3d4c 9524 }
211dfcf1 9525 else {
7e2040f0
GS
9526 eptr = SvPVx(argsv, elen);
9527 if (DO_UTF8(argsv)) {
a0ed51b3
LW
9528 if (has_precis && precis < elen) {
9529 I32 p = precis;
7e2040f0 9530 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
9531 precis = p;
9532 }
9533 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 9534 width += elen - sv_len_utf8(argsv);
a0ed51b3 9535 }
2cf2cfc6 9536 is_utf8 = TRUE;
a0ed51b3
LW
9537 }
9538 }
fc36a67e 9539
46fc3d4c 9540 string:
b22c7a20 9541 vectorize = FALSE;
46fc3d4c 9542 if (has_precis && elen > precis)
9543 elen = precis;
9544 break;
9545
9546 /* INTEGERS */
9547
fc36a67e 9548 case 'p':
0dbb1585 9549 if (left && args) { /* SVf */
5df617be 9550 left = FALSE;
0dbb1585
AL
9551 if (width) {
9552 precis = width;
9553 has_precis = TRUE;
9554 width = 0;
9555 }
9556 if (vectorize)
9557 goto unknown;
9558 argsv = va_arg(*args, SV*);
9559 eptr = SvPVx(argsv, elen);
9560 if (DO_UTF8(argsv))
9561 is_utf8 = TRUE;
9562 goto string;
5df617be 9563 }
be75b157 9564 if (alt || vectorize)
c2e66d9e 9565 goto unknown;
211dfcf1 9566 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 9567 base = 16;
9568 goto integer;
9569
46fc3d4c 9570 case 'D':
29fe7a80 9571#ifdef IV_IS_QUAD
22f3ae8c 9572 intsize = 'q';
29fe7a80 9573#else
46fc3d4c 9574 intsize = 'l';
29fe7a80 9575#endif
46fc3d4c 9576 /* FALL THROUGH */
9577 case 'd':
9578 case 'i':
b22c7a20 9579 if (vectorize) {
ba210ebe 9580 STRLEN ulen;
211dfcf1
HS
9581 if (!veclen)
9582 continue;
2cf2cfc6
A
9583 if (vec_utf8)
9584 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9585 UTF8_ALLOW_ANYUV);
b22c7a20 9586 else {
e83d50c9 9587 uv = *vecstr;
b22c7a20
GS
9588 ulen = 1;
9589 }
9590 vecstr += ulen;
9591 veclen -= ulen;
e83d50c9
JP
9592 if (plus)
9593 esignbuf[esignlen++] = plus;
b22c7a20
GS
9594 }
9595 else if (args) {
46fc3d4c 9596 switch (intsize) {
9597 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 9598 case 'l': iv = va_arg(*args, long); break;
fc36a67e 9599 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 9600 default: iv = va_arg(*args, int); break;
cf2093f6
JH
9601#ifdef HAS_QUAD
9602 case 'q': iv = va_arg(*args, Quad_t); break;
9603#endif
46fc3d4c 9604 }
9605 }
9606 else {
b10c0dba 9607 IV tiv = SvIVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 9608 switch (intsize) {
b10c0dba
MHM
9609 case 'h': iv = (short)tiv; break;
9610 case 'l': iv = (long)tiv; break;
9611 case 'V':
9612 default: iv = tiv; break;
cf2093f6 9613#ifdef HAS_QUAD
b10c0dba 9614 case 'q': iv = (Quad_t)tiv; break;
cf2093f6 9615#endif
46fc3d4c 9616 }
9617 }
e83d50c9
JP
9618 if ( !vectorize ) /* we already set uv above */
9619 {
9620 if (iv >= 0) {
9621 uv = iv;
9622 if (plus)
9623 esignbuf[esignlen++] = plus;
9624 }
9625 else {
9626 uv = -iv;
9627 esignbuf[esignlen++] = '-';
9628 }
46fc3d4c 9629 }
9630 base = 10;
9631 goto integer;
9632
fc36a67e 9633 case 'U':
29fe7a80 9634#ifdef IV_IS_QUAD
22f3ae8c 9635 intsize = 'q';
29fe7a80 9636#else
fc36a67e 9637 intsize = 'l';
29fe7a80 9638#endif
fc36a67e 9639 /* FALL THROUGH */
9640 case 'u':
9641 base = 10;
9642 goto uns_integer;
9643
4f19785b
WSI
9644 case 'b':
9645 base = 2;
9646 goto uns_integer;
9647
46fc3d4c 9648 case 'O':
29fe7a80 9649#ifdef IV_IS_QUAD
22f3ae8c 9650 intsize = 'q';
29fe7a80 9651#else
46fc3d4c 9652 intsize = 'l';
29fe7a80 9653#endif
46fc3d4c 9654 /* FALL THROUGH */
9655 case 'o':
9656 base = 8;
9657 goto uns_integer;
9658
9659 case 'X':
46fc3d4c 9660 case 'x':
9661 base = 16;
46fc3d4c 9662
9663 uns_integer:
b22c7a20 9664 if (vectorize) {
ba210ebe 9665 STRLEN ulen;
b22c7a20 9666 vector:
211dfcf1
HS
9667 if (!veclen)
9668 continue;
2cf2cfc6
A
9669 if (vec_utf8)
9670 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9671 UTF8_ALLOW_ANYUV);
b22c7a20 9672 else {
a05b299f 9673 uv = *vecstr;
b22c7a20
GS
9674 ulen = 1;
9675 }
9676 vecstr += ulen;
9677 veclen -= ulen;
9678 }
9679 else if (args) {
46fc3d4c 9680 switch (intsize) {
9681 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 9682 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 9683 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 9684 default: uv = va_arg(*args, unsigned); break;
cf2093f6 9685#ifdef HAS_QUAD
9e3321a5 9686 case 'q': uv = va_arg(*args, Uquad_t); break;
cf2093f6 9687#endif
46fc3d4c 9688 }
9689 }
9690 else {
b10c0dba 9691 UV tuv = SvUVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 9692 switch (intsize) {
b10c0dba
MHM
9693 case 'h': uv = (unsigned short)tuv; break;
9694 case 'l': uv = (unsigned long)tuv; break;
9695 case 'V':
9696 default: uv = tuv; break;
cf2093f6 9697#ifdef HAS_QUAD
b10c0dba 9698 case 'q': uv = (Uquad_t)tuv; break;
cf2093f6 9699#endif
46fc3d4c 9700 }
9701 }
9702
9703 integer:
46fc3d4c 9704 eptr = ebuf + sizeof ebuf;
fc36a67e 9705 switch (base) {
9706 unsigned dig;
9707 case 16:
c10ed8b9
HS
9708 if (!uv)
9709 alt = FALSE;
1d7c1841
GS
9710 p = (char*)((c == 'X')
9711 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 9712 do {
9713 dig = uv & 15;
9714 *--eptr = p[dig];
9715 } while (uv >>= 4);
9716 if (alt) {
46fc3d4c 9717 esignbuf[esignlen++] = '0';
fc36a67e 9718 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 9719 }
fc36a67e 9720 break;
9721 case 8:
9722 do {
9723 dig = uv & 7;
9724 *--eptr = '0' + dig;
9725 } while (uv >>= 3);
9726 if (alt && *eptr != '0')
9727 *--eptr = '0';
9728 break;
4f19785b
WSI
9729 case 2:
9730 do {
9731 dig = uv & 1;
9732 *--eptr = '0' + dig;
9733 } while (uv >>= 1);
eda88b6d
JH
9734 if (alt) {
9735 esignbuf[esignlen++] = '0';
7481bb52 9736 esignbuf[esignlen++] = 'b';
eda88b6d 9737 }
4f19785b 9738 break;
fc36a67e 9739 default: /* it had better be ten or less */
9740 do {
9741 dig = uv % base;
9742 *--eptr = '0' + dig;
9743 } while (uv /= base);
9744 break;
46fc3d4c 9745 }
9746 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
9747 if (has_precis) {
9748 if (precis > elen)
9749 zeros = precis - elen;
9750 else if (precis == 0 && elen == 1 && *eptr == '0')
9751 elen = 0;
9752 }
46fc3d4c 9753 break;
9754
9755 /* FLOATING POINT */
9756
fc36a67e 9757 case 'F':
9758 c = 'f'; /* maybe %F isn't supported here */
9759 /* FALL THROUGH */
46fc3d4c 9760 case 'e': case 'E':
fc36a67e 9761 case 'f':
46fc3d4c 9762 case 'g': case 'G':
9763
9764 /* This is evil, but floating point is even more evil */
9765
9e5b023a
JH
9766 /* for SV-style calling, we can only get NV
9767 for C-style calling, we assume %f is double;
9768 for simplicity we allow any of %Lf, %llf, %qf for long double
9769 */
9770 switch (intsize) {
9771 case 'V':
9772#if defined(USE_LONG_DOUBLE)
9773 intsize = 'q';
9774#endif
9775 break;
8a2e3f14 9776/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364
HS
9777 case 'l':
9778 /* FALL THROUGH */
9e5b023a
JH
9779 default:
9780#if defined(USE_LONG_DOUBLE)
9781 intsize = args ? 0 : 'q';
9782#endif
9783 break;
9784 case 'q':
9785#if defined(HAS_LONG_DOUBLE)
9786 break;
9787#else
9788 /* FALL THROUGH */
9789#endif
9790 case 'h':
9e5b023a
JH
9791 goto unknown;
9792 }
9793
9794 /* now we need (long double) if intsize == 'q', else (double) */
be75b157 9795 nv = (args && !vectorize) ?
35fff930
JH
9796#if LONG_DOUBLESIZE > DOUBLESIZE
9797 intsize == 'q' ?
205f51d8
AS
9798 va_arg(*args, long double) :
9799 va_arg(*args, double)
35fff930 9800#else
205f51d8 9801 va_arg(*args, double)
35fff930 9802#endif
9e5b023a 9803 : SvNVx(argsv);
fc36a67e 9804
9805 need = 0;
be75b157 9806 vectorize = FALSE;
fc36a67e 9807 if (c != 'e' && c != 'E') {
9808 i = PERL_INT_MIN;
9e5b023a
JH
9809 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9810 will cast our (long double) to (double) */
73b309ea 9811 (void)Perl_frexp(nv, &i);
fc36a67e 9812 if (i == PERL_INT_MIN)
cea2e8a9 9813 Perl_die(aTHX_ "panic: frexp");
c635e13b 9814 if (i > 0)
fc36a67e 9815 need = BIT_DIGITS(i);
9816 }
9817 need += has_precis ? precis : 6; /* known default */
20f6aaab 9818
fc36a67e 9819 if (need < width)
9820 need = width;
9821
20f6aaab
AS
9822#ifdef HAS_LDBL_SPRINTF_BUG
9823 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9824 with sfio - Allen <allens@cpan.org> */
9825
9826# ifdef DBL_MAX
9827# define MY_DBL_MAX DBL_MAX
9828# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9829# if DOUBLESIZE >= 8
9830# define MY_DBL_MAX 1.7976931348623157E+308L
9831# else
9832# define MY_DBL_MAX 3.40282347E+38L
9833# endif
9834# endif
9835
9836# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9837# define MY_DBL_MAX_BUG 1L
20f6aaab 9838# else
205f51d8 9839# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9840# endif
20f6aaab 9841
205f51d8
AS
9842# ifdef DBL_MIN
9843# define MY_DBL_MIN DBL_MIN
9844# else /* XXX guessing! -Allen */
9845# if DOUBLESIZE >= 8
9846# define MY_DBL_MIN 2.2250738585072014E-308L
9847# else
9848# define MY_DBL_MIN 1.17549435E-38L
9849# endif
9850# endif
20f6aaab 9851
205f51d8
AS
9852 if ((intsize == 'q') && (c == 'f') &&
9853 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9854 (need < DBL_DIG)) {
9855 /* it's going to be short enough that
9856 * long double precision is not needed */
9857
9858 if ((nv <= 0L) && (nv >= -0L))
9859 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9860 else {
9861 /* would use Perl_fp_class as a double-check but not
9862 * functional on IRIX - see perl.h comments */
9863
9864 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9865 /* It's within the range that a double can represent */
9866#if defined(DBL_MAX) && !defined(DBL_MIN)
9867 if ((nv >= ((long double)1/DBL_MAX)) ||
9868 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9869#endif
205f51d8 9870 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9871 }
205f51d8
AS
9872 }
9873 if (fix_ldbl_sprintf_bug == TRUE) {
9874 double temp;
9875
9876 intsize = 0;
9877 temp = (double)nv;
9878 nv = (NV)temp;
9879 }
20f6aaab 9880 }
205f51d8
AS
9881
9882# undef MY_DBL_MAX
9883# undef MY_DBL_MAX_BUG
9884# undef MY_DBL_MIN
9885
20f6aaab
AS
9886#endif /* HAS_LDBL_SPRINTF_BUG */
9887
46fc3d4c 9888 need += 20; /* fudge factor */
80252599
GS
9889 if (PL_efloatsize < need) {
9890 Safefree(PL_efloatbuf);
9891 PL_efloatsize = need + 20; /* more fudge */
9892 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9893 PL_efloatbuf[0] = '\0';
46fc3d4c 9894 }
9895
4151a5fe
IZ
9896 if ( !(width || left || plus || alt) && fill != '0'
9897 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
9898 /* See earlier comment about buggy Gconvert when digits,
9899 aka precis is 0 */
9900 if ( c == 'g' && precis) {
2e59c212 9901 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4151a5fe
IZ
9902 if (*PL_efloatbuf) /* May return an empty string for digits==0 */
9903 goto float_converted;
9904 } else if ( c == 'f' && !precis) {
9905 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9906 break;
9907 }
9908 }
46fc3d4c 9909 eptr = ebuf + sizeof ebuf;
9910 *--eptr = '\0';
9911 *--eptr = c;
9e5b023a
JH
9912 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9913#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
9914 if (intsize == 'q') {
e5c81feb
JH
9915 /* Copy the one or more characters in a long double
9916 * format before the 'base' ([efgEFG]) character to
9917 * the format string. */
9918 static char const prifldbl[] = PERL_PRIfldbl;
9919 char const *p = prifldbl + sizeof(prifldbl) - 3;
9920 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 9921 }
65202027 9922#endif
46fc3d4c 9923 if (has_precis) {
9924 base = precis;
9925 do { *--eptr = '0' + (base % 10); } while (base /= 10);
9926 *--eptr = '.';
9927 }
9928 if (width) {
9929 base = width;
9930 do { *--eptr = '0' + (base % 10); } while (base /= 10);
9931 }
9932 if (fill == '0')
9933 *--eptr = fill;
84902520
TB
9934 if (left)
9935 *--eptr = '-';
46fc3d4c 9936 if (plus)
9937 *--eptr = plus;
9938 if (alt)
9939 *--eptr = '#';
9940 *--eptr = '%';
9941
ff9121f8
JH
9942 /* No taint. Otherwise we are in the strange situation
9943 * where printf() taints but print($float) doesn't.
bda0f7a5 9944 * --jhi */
9e5b023a
JH
9945#if defined(HAS_LONG_DOUBLE)
9946 if (intsize == 'q')
9947 (void)sprintf(PL_efloatbuf, eptr, nv);
9948 else
9949 (void)sprintf(PL_efloatbuf, eptr, (double)nv);
9950#else
dd8482fc 9951 (void)sprintf(PL_efloatbuf, eptr, nv);
9e5b023a 9952#endif
4151a5fe 9953 float_converted:
80252599
GS
9954 eptr = PL_efloatbuf;
9955 elen = strlen(PL_efloatbuf);
46fc3d4c 9956 break;
9957
fc36a67e 9958 /* SPECIAL */
9959
9960 case 'n':
9961 i = SvCUR(sv) - origlen;
be75b157 9962 if (args && !vectorize) {
c635e13b 9963 switch (intsize) {
9964 case 'h': *(va_arg(*args, short*)) = i; break;
9965 default: *(va_arg(*args, int*)) = i; break;
9966 case 'l': *(va_arg(*args, long*)) = i; break;
9967 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
9968#ifdef HAS_QUAD
9969 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
9970#endif
c635e13b 9971 }
fc36a67e 9972 }
9dd79c3f 9973 else
211dfcf1 9974 sv_setuv_mg(argsv, (UV)i);
be75b157 9975 vectorize = FALSE;
fc36a67e 9976 continue; /* not "break" */
9977
9978 /* UNKNOWN */
9979
46fc3d4c 9980 default:
fc36a67e 9981 unknown:
599cee73 9982 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 9983 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 9984 SV *msg = sv_newmortal();
35c1215d
NC
9985 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9986 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 9987 if (c) {
0f4b6630 9988 if (isPRINT(c))
1c846c1f 9989 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
9990 "\"%%%c\"", c & 0xFF);
9991 else
9992 Perl_sv_catpvf(aTHX_ msg,
57def98f 9993 "\"%%\\%03"UVof"\"",
0f4b6630 9994 (UV)c & 0xFF);
0f4b6630 9995 } else
c635e13b 9996 sv_catpv(msg, "end of string");
9014280d 9997 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 9998 }
fb73857a 9999
10000 /* output mangled stuff ... */
10001 if (c == '\0')
10002 --q;
46fc3d4c 10003 eptr = p;
10004 elen = q - p;
fb73857a 10005
10006 /* ... right here, because formatting flags should not apply */
10007 SvGROW(sv, SvCUR(sv) + elen + 1);
10008 p = SvEND(sv);
4459522c 10009 Copy(eptr, p, elen, char);
fb73857a 10010 p += elen;
10011 *p = '\0';
3f7c398e 10012 SvCUR_set(sv, p - SvPVX_const(sv));
58e33a90 10013 svix = osvix;
fb73857a 10014 continue; /* not "break" */
46fc3d4c 10015 }
10016
6c94ec8b
HS
10017 /* calculate width before utf8_upgrade changes it */
10018 have = esignlen + zeros + elen;
10019
d2876be5
JH
10020 if (is_utf8 != has_utf8) {
10021 if (is_utf8) {
10022 if (SvCUR(sv))
10023 sv_utf8_upgrade(sv);
10024 }
10025 else {
10026 SV *nsv = sv_2mortal(newSVpvn(eptr, elen));
10027 sv_utf8_upgrade(nsv);
10028 eptr = SvPVX(nsv);
10029 elen = SvCUR(nsv);
10030 }
10031 SvGROW(sv, SvCUR(sv) + elen + 1);
10032 p = SvEND(sv);
10033 *p = '\0';
10034 }
6af65485 10035
46fc3d4c 10036 need = (have > width ? have : width);
10037 gap = need - have;
10038
b22c7a20 10039 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 10040 p = SvEND(sv);
10041 if (esignlen && fill == '0') {
eb160463 10042 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10043 *p++ = esignbuf[i];
10044 }
10045 if (gap && !left) {
10046 memset(p, fill, gap);
10047 p += gap;
10048 }
10049 if (esignlen && fill != '0') {
eb160463 10050 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10051 *p++ = esignbuf[i];
10052 }
fc36a67e 10053 if (zeros) {
10054 for (i = zeros; i; i--)
10055 *p++ = '0';
10056 }
46fc3d4c 10057 if (elen) {
4459522c 10058 Copy(eptr, p, elen, char);
46fc3d4c 10059 p += elen;
10060 }
10061 if (gap && left) {
10062 memset(p, ' ', gap);
10063 p += gap;
10064 }
b22c7a20
GS
10065 if (vectorize) {
10066 if (veclen) {
4459522c 10067 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
10068 p += dotstrlen;
10069 }
10070 else
10071 vectorize = FALSE; /* done iterating over vecstr */
10072 }
2cf2cfc6
A
10073 if (is_utf8)
10074 has_utf8 = TRUE;
10075 if (has_utf8)
7e2040f0 10076 SvUTF8_on(sv);
46fc3d4c 10077 *p = '\0';
3f7c398e 10078 SvCUR_set(sv, p - SvPVX_const(sv));
b22c7a20
GS
10079 if (vectorize) {
10080 esignlen = 0;
10081 goto vector;
10082 }
46fc3d4c 10083 }
10084}
51371543 10085
645c22ef
DM
10086/* =========================================================================
10087
10088=head1 Cloning an interpreter
10089
10090All the macros and functions in this section are for the private use of
10091the main function, perl_clone().
10092
10093The foo_dup() functions make an exact copy of an existing foo thinngy.
10094During the course of a cloning, a hash table is used to map old addresses
10095to new addresses. The table is created and manipulated with the
10096ptr_table_* functions.
10097
10098=cut
10099
10100============================================================================*/
10101
10102
1d7c1841
GS
10103#if defined(USE_ITHREADS)
10104
1d7c1841
GS
10105#ifndef GpREFCNT_inc
10106# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
10107#endif
10108
10109
d2d73c3e
AB
10110#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
10111#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
10112#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10113#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
10114#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10115#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
10116#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10117#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
10118#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
10119#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
10120#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
10121#define SAVEPV(p) (p ? savepv(p) : Nullch)
10122#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 10123
d2d73c3e 10124
d2f185dc
AMS
10125/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
10126 regcomp.c. AMS 20010712 */
645c22ef 10127
1d7c1841 10128REGEXP *
a8fc9800 10129Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
1d7c1841 10130{
27da23d5 10131 dVAR;
d2f185dc
AMS
10132 REGEXP *ret;
10133 int i, len, npar;
10134 struct reg_substr_datum *s;
10135
10136 if (!r)
10137 return (REGEXP *)NULL;
10138
10139 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
10140 return ret;
10141
10142 len = r->offsets[0];
10143 npar = r->nparens+1;
10144
10145 Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
10146 Copy(r->program, ret->program, len+1, regnode);
10147
10148 New(0, ret->startp, npar, I32);
10149 Copy(r->startp, ret->startp, npar, I32);
10150 New(0, ret->endp, npar, I32);
10151 Copy(r->startp, ret->startp, npar, I32);
10152
d2f185dc
AMS
10153 New(0, ret->substrs, 1, struct reg_substr_data);
10154 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
10155 s->min_offset = r->substrs->data[i].min_offset;
10156 s->max_offset = r->substrs->data[i].max_offset;
10157 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 10158 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
10159 }
10160
70612e96 10161 ret->regstclass = NULL;
d2f185dc
AMS
10162 if (r->data) {
10163 struct reg_data *d;
e1ec3a88 10164 const int count = r->data->count;
d2f185dc
AMS
10165
10166 Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
10167 char, struct reg_data);
10168 New(0, d->what, count, U8);
10169
10170 d->count = count;
10171 for (i = 0; i < count; i++) {
10172 d->what[i] = r->data->what[i];
10173 switch (d->what[i]) {
a3621e74
YO
10174 /* legal options are one of: sfpont
10175 see also regcomp.h and pregfree() */
d2f185dc
AMS
10176 case 's':
10177 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
10178 break;
10179 case 'p':
10180 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
10181 break;
10182 case 'f':
10183 /* This is cheating. */
10184 New(0, d->data[i], 1, struct regnode_charclass_class);
10185 StructCopy(r->data->data[i], d->data[i],
10186 struct regnode_charclass_class);
70612e96 10187 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
10188 break;
10189 case 'o':
33773810
AMS
10190 /* Compiled op trees are readonly, and can thus be
10191 shared without duplication. */
b34c0dd4 10192 OP_REFCNT_LOCK;
9b978d73 10193 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
b34c0dd4 10194 OP_REFCNT_UNLOCK;
9b978d73 10195 break;
d2f185dc
AMS
10196 case 'n':
10197 d->data[i] = r->data->data[i];
10198 break;
a3621e74
YO
10199 case 't':
10200 d->data[i] = r->data->data[i];
10201 OP_REFCNT_LOCK;
10202 ((reg_trie_data*)d->data[i])->refcount++;
10203 OP_REFCNT_UNLOCK;
10204 break;
10205 default:
10206 Perl_croak(aTHX_ "panic: re_dup unknown data code '%c'", r->data->what[i]);
d2f185dc
AMS
10207 }
10208 }
10209
10210 ret->data = d;
10211 }
10212 else
10213 ret->data = NULL;
10214
10215 New(0, ret->offsets, 2*len+1, U32);
10216 Copy(r->offsets, ret->offsets, 2*len+1, U32);
10217
e01c5899 10218 ret->precomp = SAVEPVN(r->precomp, r->prelen);
d2f185dc
AMS
10219 ret->refcnt = r->refcnt;
10220 ret->minlen = r->minlen;
10221 ret->prelen = r->prelen;
10222 ret->nparens = r->nparens;
10223 ret->lastparen = r->lastparen;
10224 ret->lastcloseparen = r->lastcloseparen;
10225 ret->reganch = r->reganch;
10226
70612e96
RG
10227 ret->sublen = r->sublen;
10228
10229 if (RX_MATCH_COPIED(ret))
e01c5899 10230 ret->subbeg = SAVEPVN(r->subbeg, r->sublen);
70612e96
RG
10231 else
10232 ret->subbeg = Nullch;
9a26048b
NC
10233#ifdef PERL_COPY_ON_WRITE
10234 ret->saved_copy = Nullsv;
10235#endif
70612e96 10236
d2f185dc
AMS
10237 ptr_table_store(PL_ptr_table, r, ret);
10238 return ret;
1d7c1841
GS
10239}
10240
d2d73c3e 10241/* duplicate a file handle */
645c22ef 10242
1d7c1841 10243PerlIO *
a8fc9800 10244Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
10245{
10246 PerlIO *ret;
73d840c0
AL
10247 (void)type;
10248
1d7c1841
GS
10249 if (!fp)
10250 return (PerlIO*)NULL;
10251
10252 /* look for it in the table first */
10253 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
10254 if (ret)
10255 return ret;
10256
10257 /* create anew and remember what it is */
ecdeb87c 10258 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
10259 ptr_table_store(PL_ptr_table, fp, ret);
10260 return ret;
10261}
10262
645c22ef
DM
10263/* duplicate a directory handle */
10264
1d7c1841
GS
10265DIR *
10266Perl_dirp_dup(pTHX_ DIR *dp)
10267{
10268 if (!dp)
10269 return (DIR*)NULL;
10270 /* XXX TODO */
10271 return dp;
10272}
10273
ff276b08 10274/* duplicate a typeglob */
645c22ef 10275
1d7c1841 10276GP *
a8fc9800 10277Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
10278{
10279 GP *ret;
10280 if (!gp)
10281 return (GP*)NULL;
10282 /* look for it in the table first */
10283 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
10284 if (ret)
10285 return ret;
10286
10287 /* create anew and remember what it is */
10288 Newz(0, ret, 1, GP);
10289 ptr_table_store(PL_ptr_table, gp, ret);
10290
10291 /* clone */
10292 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
10293 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
10294 ret->gp_io = io_dup_inc(gp->gp_io, param);
10295 ret->gp_form = cv_dup_inc(gp->gp_form, param);
10296 ret->gp_av = av_dup_inc(gp->gp_av, param);
10297 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
10298 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
10299 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
10300 ret->gp_cvgen = gp->gp_cvgen;
10301 ret->gp_flags = gp->gp_flags;
10302 ret->gp_line = gp->gp_line;
10303 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
10304 return ret;
10305}
10306
645c22ef
DM
10307/* duplicate a chain of magic */
10308
1d7c1841 10309MAGIC *
a8fc9800 10310Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 10311{
cb359b41
JH
10312 MAGIC *mgprev = (MAGIC*)NULL;
10313 MAGIC *mgret;
1d7c1841
GS
10314 if (!mg)
10315 return (MAGIC*)NULL;
10316 /* look for it in the table first */
10317 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
10318 if (mgret)
10319 return mgret;
10320
10321 for (; mg; mg = mg->mg_moremagic) {
10322 MAGIC *nmg;
10323 Newz(0, nmg, 1, MAGIC);
cb359b41 10324 if (mgprev)
1d7c1841 10325 mgprev->mg_moremagic = nmg;
cb359b41
JH
10326 else
10327 mgret = nmg;
1d7c1841
GS
10328 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
10329 nmg->mg_private = mg->mg_private;
10330 nmg->mg_type = mg->mg_type;
10331 nmg->mg_flags = mg->mg_flags;
14befaf4 10332 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 10333 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 10334 }
05bd4103 10335 else if(mg->mg_type == PERL_MAGIC_backref) {
7fc63493 10336 const AV * const av = (AV*) mg->mg_obj;
fdc9a813
AE
10337 SV **svp;
10338 I32 i;
7fc63493 10339 (void)SvREFCNT_inc(nmg->mg_obj = (SV*)newAV());
fdc9a813
AE
10340 svp = AvARRAY(av);
10341 for (i = AvFILLp(av); i >= 0; i--) {
3a81978b 10342 if (!svp[i]) continue;
fdc9a813
AE
10343 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
10344 }
05bd4103 10345 }
8d2f4536
NC
10346 else if (mg->mg_type == PERL_MAGIC_symtab) {
10347 nmg->mg_obj = mg->mg_obj;
10348 }
1d7c1841
GS
10349 else {
10350 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
10351 ? sv_dup_inc(mg->mg_obj, param)
10352 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
10353 }
10354 nmg->mg_len = mg->mg_len;
10355 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 10356 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 10357 if (mg->mg_len > 0) {
1d7c1841 10358 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
10359 if (mg->mg_type == PERL_MAGIC_overload_table &&
10360 AMT_AMAGIC((AMT*)mg->mg_ptr))
10361 {
1d7c1841
GS
10362 AMT *amtp = (AMT*)mg->mg_ptr;
10363 AMT *namtp = (AMT*)nmg->mg_ptr;
10364 I32 i;
10365 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 10366 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
10367 }
10368 }
10369 }
10370 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 10371 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 10372 }
68795e93
NIS
10373 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
10374 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
10375 }
1d7c1841
GS
10376 mgprev = nmg;
10377 }
10378 return mgret;
10379}
10380
645c22ef
DM
10381/* create a new pointer-mapping table */
10382
1d7c1841
GS
10383PTR_TBL_t *
10384Perl_ptr_table_new(pTHX)
10385{
10386 PTR_TBL_t *tbl;
10387 Newz(0, tbl, 1, PTR_TBL_t);
10388 tbl->tbl_max = 511;
10389 tbl->tbl_items = 0;
10390 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
10391 return tbl;
10392}
10393
134ca3d6
DM
10394#if (PTRSIZE == 8)
10395# define PTR_TABLE_HASH(ptr) (PTR2UV(ptr) >> 3)
10396#else
10397# define PTR_TABLE_HASH(ptr) (PTR2UV(ptr) >> 2)
10398#endif
10399
32e691d0
NC
10400
10401
10402STATIC void
10403S_more_pte(pTHX)
10404{
cac9b346
NC
10405 struct ptr_tbl_ent* pte;
10406 struct ptr_tbl_ent* pteend;
c3929b72
NC
10407 New(0, pte, PERL_ARENA_SIZE/sizeof(struct ptr_tbl_ent), struct ptr_tbl_ent);
10408 pte->next = PL_pte_arenaroot;
10409 PL_pte_arenaroot = pte;
32e691d0 10410
9c17f24a 10411 pteend = &pte[PERL_ARENA_SIZE / sizeof(struct ptr_tbl_ent) - 1];
32e691d0
NC
10412 PL_pte_root = ++pte;
10413 while (pte < pteend) {
10414 pte->next = pte + 1;
10415 pte++;
10416 }
10417 pte->next = 0;
10418}
10419
10420STATIC struct ptr_tbl_ent*
10421S_new_pte(pTHX)
10422{
10423 struct ptr_tbl_ent* pte;
10424 if (!PL_pte_root)
10425 S_more_pte(aTHX);
10426 pte = PL_pte_root;
10427 PL_pte_root = pte->next;
10428 return pte;
10429}
10430
10431STATIC void
10432S_del_pte(pTHX_ struct ptr_tbl_ent*p)
10433{
10434 p->next = PL_pte_root;
10435 PL_pte_root = p;
10436}
10437
645c22ef
DM
10438/* map an existing pointer using a table */
10439
1d7c1841
GS
10440void *
10441Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
10442{
10443 PTR_TBL_ENT_t *tblent;
4373e329 10444 const UV hash = PTR_TABLE_HASH(sv);
1d7c1841
GS
10445 assert(tbl);
10446 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
10447 for (; tblent; tblent = tblent->next) {
10448 if (tblent->oldval == sv)
10449 return tblent->newval;
10450 }
10451 return (void*)NULL;
10452}
10453
645c22ef
DM
10454/* add a new entry to a pointer-mapping table */
10455
1d7c1841
GS
10456void
10457Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
10458{
10459 PTR_TBL_ENT_t *tblent, **otblent;
10460 /* XXX this may be pessimal on platforms where pointers aren't good
10461 * hash values e.g. if they grow faster in the most significant
10462 * bits */
4373e329 10463 const UV hash = PTR_TABLE_HASH(oldv);
14cade97 10464 bool empty = 1;
1d7c1841
GS
10465
10466 assert(tbl);
10467 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
14cade97 10468 for (tblent = *otblent; tblent; empty=0, tblent = tblent->next) {
1d7c1841
GS
10469 if (tblent->oldval == oldv) {
10470 tblent->newval = newv;
1d7c1841
GS
10471 return;
10472 }
10473 }
32e691d0 10474 tblent = S_new_pte(aTHX);
1d7c1841
GS
10475 tblent->oldval = oldv;
10476 tblent->newval = newv;
10477 tblent->next = *otblent;
10478 *otblent = tblent;
10479 tbl->tbl_items++;
14cade97 10480 if (!empty && tbl->tbl_items > tbl->tbl_max)
1d7c1841
GS
10481 ptr_table_split(tbl);
10482}
10483
645c22ef
DM
10484/* double the hash bucket size of an existing ptr table */
10485
1d7c1841
GS
10486void
10487Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
10488{
10489 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
4373e329 10490 const UV oldsize = tbl->tbl_max + 1;
1d7c1841
GS
10491 UV newsize = oldsize * 2;
10492 UV i;
10493
10494 Renew(ary, newsize, PTR_TBL_ENT_t*);
10495 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
10496 tbl->tbl_max = --newsize;
10497 tbl->tbl_ary = ary;
10498 for (i=0; i < oldsize; i++, ary++) {
10499 PTR_TBL_ENT_t **curentp, **entp, *ent;
10500 if (!*ary)
10501 continue;
10502 curentp = ary + oldsize;
10503 for (entp = ary, ent = *ary; ent; ent = *entp) {
134ca3d6 10504 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
10505 *entp = ent->next;
10506 ent->next = *curentp;
10507 *curentp = ent;
10508 continue;
10509 }
10510 else
10511 entp = &ent->next;
10512 }
10513 }
10514}
10515
645c22ef
DM
10516/* remove all the entries from a ptr table */
10517
a0739874
DM
10518void
10519Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
10520{
10521 register PTR_TBL_ENT_t **array;
10522 register PTR_TBL_ENT_t *entry;
a0739874
DM
10523 UV riter = 0;
10524 UV max;
10525
10526 if (!tbl || !tbl->tbl_items) {
10527 return;
10528 }
10529
10530 array = tbl->tbl_ary;
10531 entry = array[0];
10532 max = tbl->tbl_max;
10533
10534 for (;;) {
10535 if (entry) {
4373e329 10536 PTR_TBL_ENT_t *oentry = entry;
a0739874 10537 entry = entry->next;
32e691d0 10538 S_del_pte(aTHX_ oentry);
a0739874
DM
10539 }
10540 if (!entry) {
10541 if (++riter > max) {
10542 break;
10543 }
10544 entry = array[riter];
10545 }
10546 }
10547
10548 tbl->tbl_items = 0;
10549}
10550
645c22ef
DM
10551/* clear and free a ptr table */
10552
a0739874
DM
10553void
10554Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
10555{
10556 if (!tbl) {
10557 return;
10558 }
10559 ptr_table_clear(tbl);
10560 Safefree(tbl->tbl_ary);
10561 Safefree(tbl);
10562}
10563
645c22ef
DM
10564/* attempt to make everything in the typeglob readonly */
10565
5bd07a3d 10566STATIC SV *
59b40662 10567S_gv_share(pTHX_ SV *sstr, CLONE_PARAMS *param)
5bd07a3d
DM
10568{
10569 GV *gv = (GV*)sstr;
59b40662 10570 SV *sv = &param->proto_perl->Isv_no; /* just need SvREADONLY-ness */
5bd07a3d
DM
10571
10572 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 10573 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
10574 }
10575 else if (!GvCV(gv)) {
10576 GvCV(gv) = (CV*)sv;
10577 }
10578 else {
10579 /* CvPADLISTs cannot be shared */
37e20706 10580 if (!SvREADONLY(GvCV(gv)) && !CvXSUB(GvCV(gv))) {
7fb37951 10581 GvUNIQUE_off(gv);
5bd07a3d
DM
10582 }
10583 }
10584
7fb37951 10585 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
10586#if 0
10587 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
bfcb3514 10588 HvNAME_get(GvSTASH(gv)), GvNAME(gv));
5bd07a3d
DM
10589#endif
10590 return Nullsv;
10591 }
10592
4411f3b6 10593 /*
5bd07a3d
DM
10594 * write attempts will die with
10595 * "Modification of a read-only value attempted"
10596 */
10597 if (!GvSV(gv)) {
10598 GvSV(gv) = sv;
10599 }
10600 else {
10601 SvREADONLY_on(GvSV(gv));
10602 }
10603
10604 if (!GvAV(gv)) {
10605 GvAV(gv) = (AV*)sv;
10606 }
10607 else {
10608 SvREADONLY_on(GvAV(gv));
10609 }
10610
10611 if (!GvHV(gv)) {
10612 GvHV(gv) = (HV*)sv;
10613 }
10614 else {
53c33732 10615 SvREADONLY_on(GvHV(gv));
5bd07a3d
DM
10616 }
10617
10618 return sstr; /* he_dup() will SvREFCNT_inc() */
10619}
10620
645c22ef
DM
10621/* duplicate an SV of any type (including AV, HV etc) */
10622
83841fad
NIS
10623void
10624Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
10625{
10626 if (SvROK(sstr)) {
b162af07
SP
10627 SvRV_set(dstr, SvWEAKREF(sstr)
10628 ? sv_dup(SvRV(sstr), param)
10629 : sv_dup_inc(SvRV(sstr), param));
f880fe2f 10630
83841fad 10631 }
3f7c398e 10632 else if (SvPVX_const(sstr)) {
83841fad
NIS
10633 /* Has something there */
10634 if (SvLEN(sstr)) {
68795e93 10635 /* Normal PV - clone whole allocated space */
3f7c398e 10636 SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
d3d0e6f1
NC
10637 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10638 /* Not that normal - actually sstr is copy on write.
10639 But we are a true, independant SV, so: */
10640 SvREADONLY_off(dstr);
10641 SvFAKE_off(dstr);
10642 }
68795e93 10643 }
83841fad
NIS
10644 else {
10645 /* Special case - not normally malloced for some reason */
10646 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10647 /* A "shared" PV - clone it as unshared string */
281b2760 10648 if(SvPADTMP(sstr)) {
5e6160dc
AB
10649 /* However, some of them live in the pad
10650 and they should not have these flags
10651 turned off */
281b2760 10652
3f7c398e 10653 SvPV_set(dstr, sharepvn(SvPVX_const(sstr), SvCUR(sstr),
f880fe2f 10654 SvUVX(sstr)));
607fa7f2 10655 SvUV_set(dstr, SvUVX(sstr));
281b2760
AB
10656 } else {
10657
3f7c398e 10658 SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvCUR(sstr)));
281b2760
AB
10659 SvFAKE_off(dstr);
10660 SvREADONLY_off(dstr);
5e6160dc 10661 }
83841fad
NIS
10662 }
10663 else {
10664 /* Some other special case - random pointer */
f880fe2f 10665 SvPV_set(dstr, SvPVX(sstr));
d3d0e6f1 10666 }
83841fad
NIS
10667 }
10668 }
10669 else {
10670 /* Copy the Null */
f880fe2f 10671 if (SvTYPE(dstr) == SVt_RV)
b162af07 10672 SvRV_set(dstr, NULL);
f880fe2f
SP
10673 else
10674 SvPV_set(dstr, 0);
83841fad
NIS
10675 }
10676}
10677
1d7c1841 10678SV *
a8fc9800 10679Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
1d7c1841 10680{
27da23d5 10681 dVAR;
1d7c1841
GS
10682 SV *dstr;
10683
10684 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
10685 return Nullsv;
10686 /* look for it in the table first */
10687 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
10688 if (dstr)
10689 return dstr;
10690
0405e91e
AB
10691 if(param->flags & CLONEf_JOIN_IN) {
10692 /** We are joining here so we don't want do clone
10693 something that is bad **/
bfcb3514 10694 const char *hvname;
0405e91e
AB
10695
10696 if(SvTYPE(sstr) == SVt_PVHV &&
bfcb3514 10697 (hvname = HvNAME_get(sstr))) {
0405e91e 10698 /** don't clone stashes if they already exist **/
bfcb3514 10699 HV* old_stash = gv_stashpv(hvname,0);
0405e91e
AB
10700 return (SV*) old_stash;
10701 }
10702 }
10703
1d7c1841
GS
10704 /* create anew and remember what it is */
10705 new_SV(dstr);
fd0854ff
DM
10706
10707#ifdef DEBUG_LEAKING_SCALARS
10708 dstr->sv_debug_optype = sstr->sv_debug_optype;
10709 dstr->sv_debug_line = sstr->sv_debug_line;
10710 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
10711 dstr->sv_debug_cloned = 1;
10712# ifdef NETWARE
10713 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
10714# else
10715 dstr->sv_debug_file = savesharedpv(sstr->sv_debug_file);
10716# endif
10717#endif
10718
1d7c1841
GS
10719 ptr_table_store(PL_ptr_table, sstr, dstr);
10720
10721 /* clone */
10722 SvFLAGS(dstr) = SvFLAGS(sstr);
10723 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
10724 SvREFCNT(dstr) = 0; /* must be before any other dups! */
10725
10726#ifdef DEBUGGING
3f7c398e 10727 if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
1d7c1841 10728 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
3f7c398e 10729 PL_watch_pvx, SvPVX_const(sstr));
1d7c1841
GS
10730#endif
10731
9660f481
DM
10732 /* don't clone objects whose class has asked us not to */
10733 if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
10734 SvFLAGS(dstr) &= ~SVTYPEMASK;
10735 SvOBJECT_off(dstr);
10736 return dstr;
10737 }
10738
1d7c1841
GS
10739 switch (SvTYPE(sstr)) {
10740 case SVt_NULL:
10741 SvANY(dstr) = NULL;
10742 break;
10743 case SVt_IV:
339049b0 10744 SvANY(dstr) = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
45977657 10745 SvIV_set(dstr, SvIVX(sstr));
1d7c1841
GS
10746 break;
10747 case SVt_NV:
10748 SvANY(dstr) = new_XNV();
9d6ce603 10749 SvNV_set(dstr, SvNVX(sstr));
1d7c1841
GS
10750 break;
10751 case SVt_RV:
339049b0 10752 SvANY(dstr) = &(dstr->sv_u.svu_rv);
83841fad 10753 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10754 break;
10755 case SVt_PV:
10756 SvANY(dstr) = new_XPV();
b162af07
SP
10757 SvCUR_set(dstr, SvCUR(sstr));
10758 SvLEN_set(dstr, SvLEN(sstr));
83841fad 10759 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10760 break;
10761 case SVt_PVIV:
10762 SvANY(dstr) = new_XPVIV();
b162af07
SP
10763 SvCUR_set(dstr, SvCUR(sstr));
10764 SvLEN_set(dstr, SvLEN(sstr));
45977657 10765 SvIV_set(dstr, SvIVX(sstr));
83841fad 10766 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10767 break;
10768 case SVt_PVNV:
10769 SvANY(dstr) = new_XPVNV();
b162af07
SP
10770 SvCUR_set(dstr, SvCUR(sstr));
10771 SvLEN_set(dstr, SvLEN(sstr));
45977657 10772 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10773 SvNV_set(dstr, SvNVX(sstr));
83841fad 10774 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10775 break;
10776 case SVt_PVMG:
10777 SvANY(dstr) = new_XPVMG();
b162af07
SP
10778 SvCUR_set(dstr, SvCUR(sstr));
10779 SvLEN_set(dstr, SvLEN(sstr));
45977657 10780 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10781 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10782 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10783 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10784 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10785 break;
10786 case SVt_PVBM:
10787 SvANY(dstr) = new_XPVBM();
b162af07
SP
10788 SvCUR_set(dstr, SvCUR(sstr));
10789 SvLEN_set(dstr, SvLEN(sstr));
45977657 10790 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10791 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10792 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10793 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10794 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10795 BmRARE(dstr) = BmRARE(sstr);
10796 BmUSEFUL(dstr) = BmUSEFUL(sstr);
10797 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
10798 break;
10799 case SVt_PVLV:
10800 SvANY(dstr) = new_XPVLV();
b162af07
SP
10801 SvCUR_set(dstr, SvCUR(sstr));
10802 SvLEN_set(dstr, SvLEN(sstr));
45977657 10803 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10804 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10805 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10806 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10807 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10808 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
10809 LvTARGLEN(dstr) = LvTARGLEN(sstr);
dd28f7bb
DM
10810 if (LvTYPE(sstr) == 't') /* for tie: unrefcnted fake (SV**) */
10811 LvTARG(dstr) = dstr;
10812 else if (LvTYPE(sstr) == 'T') /* for tie: fake HE */
10813 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(sstr), 0, param);
10814 else
10815 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr), param);
1d7c1841
GS
10816 LvTYPE(dstr) = LvTYPE(sstr);
10817 break;
10818 case SVt_PVGV:
7fb37951 10819 if (GvUNIQUE((GV*)sstr)) {
5bd07a3d 10820 SV *share;
59b40662 10821 if ((share = gv_share(sstr, param))) {
5bd07a3d
DM
10822 del_SV(dstr);
10823 dstr = share;
37e20706 10824 ptr_table_store(PL_ptr_table, sstr, dstr);
5bd07a3d
DM
10825#if 0
10826 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
bfcb3514 10827 HvNAME_get(GvSTASH(share)), GvNAME(share));
5bd07a3d
DM
10828#endif
10829 break;
10830 }
10831 }
1d7c1841 10832 SvANY(dstr) = new_XPVGV();
b162af07
SP
10833 SvCUR_set(dstr, SvCUR(sstr));
10834 SvLEN_set(dstr, SvLEN(sstr));
45977657 10835 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10836 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10837 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10838 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10839 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10840 GvNAMELEN(dstr) = GvNAMELEN(sstr);
10841 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
d2d73c3e 10842 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr), param);
1d7c1841 10843 GvFLAGS(dstr) = GvFLAGS(sstr);
d2d73c3e 10844 GvGP(dstr) = gp_dup(GvGP(sstr), param);
1d7c1841
GS
10845 (void)GpREFCNT_inc(GvGP(dstr));
10846 break;
10847 case SVt_PVIO:
10848 SvANY(dstr) = new_XPVIO();
b162af07
SP
10849 SvCUR_set(dstr, SvCUR(sstr));
10850 SvLEN_set(dstr, SvLEN(sstr));
45977657 10851 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10852 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10853 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10854 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10855 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
a8fc9800 10856 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10857 if (IoOFP(sstr) == IoIFP(sstr))
10858 IoOFP(dstr) = IoIFP(dstr);
10859 else
a8fc9800 10860 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10861 /* PL_rsfp_filters entries have fake IoDIRP() */
10862 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
10863 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
10864 else
10865 IoDIRP(dstr) = IoDIRP(sstr);
10866 IoLINES(dstr) = IoLINES(sstr);
10867 IoPAGE(dstr) = IoPAGE(sstr);
10868 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
10869 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
7a5fa8a2 10870 if(IoFLAGS(sstr) & IOf_FAKE_DIRP) {
5a37521b
AB
10871 /* I have no idea why fake dirp (rsfps)
10872 should be treaded differently but otherwise
10873 we end up with leaks -- sky*/
10874 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(sstr), param);
10875 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(sstr), param);
10876 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(sstr), param);
10877 } else {
10878 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr), param);
10879 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr), param);
10880 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr), param);
10881 }
1d7c1841 10882 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
1d7c1841 10883 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
1d7c1841 10884 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
1d7c1841
GS
10885 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
10886 IoTYPE(dstr) = IoTYPE(sstr);
10887 IoFLAGS(dstr) = IoFLAGS(sstr);
10888 break;
10889 case SVt_PVAV:
10890 SvANY(dstr) = new_XPVAV();
b162af07
SP
10891 SvCUR_set(dstr, SvCUR(sstr));
10892 SvLEN_set(dstr, SvLEN(sstr));
b162af07
SP
10893 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10894 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
1d7c1841
GS
10895 if (AvARRAY((AV*)sstr)) {
10896 SV **dst_ary, **src_ary;
10897 SSize_t items = AvFILLp((AV*)sstr) + 1;
10898
10899 src_ary = AvARRAY((AV*)sstr);
10900 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
10901 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
f880fe2f 10902 SvPV_set(dstr, (char*)dst_ary);
1d7c1841
GS
10903 AvALLOC((AV*)dstr) = dst_ary;
10904 if (AvREAL((AV*)sstr)) {
10905 while (items-- > 0)
d2d73c3e 10906 *dst_ary++ = sv_dup_inc(*src_ary++, param);
1d7c1841
GS
10907 }
10908 else {
10909 while (items-- > 0)
d2d73c3e 10910 *dst_ary++ = sv_dup(*src_ary++, param);
1d7c1841
GS
10911 }
10912 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10913 while (items-- > 0) {
10914 *dst_ary++ = &PL_sv_undef;
10915 }
10916 }
10917 else {
f880fe2f 10918 SvPV_set(dstr, Nullch);
1d7c1841
GS
10919 AvALLOC((AV*)dstr) = (SV**)NULL;
10920 }
10921 break;
10922 case SVt_PVHV:
10923 SvANY(dstr) = new_XPVHV();
b162af07
SP
10924 SvCUR_set(dstr, SvCUR(sstr));
10925 SvLEN_set(dstr, SvLEN(sstr));
94a66813 10926 HvTOTALKEYS(dstr) = HvTOTALKEYS(sstr);
b162af07
SP
10927 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10928 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
bfcb3514 10929 {
7423f6db 10930 HEK *hvname = 0;
bfcb3514 10931
bfcb3514
NC
10932 if (HvARRAY((HV*)sstr)) {
10933 STRLEN i = 0;
616d8c9c
AL
10934 const bool sharekeys = !!HvSHAREKEYS(sstr);
10935 XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
10936 XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
7b2c381c 10937 char *darray;
a1cfa1c6 10938 New(0, darray,
b79f7545
NC
10939 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
10940 + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0), char);
7b2c381c 10941 HvARRAY(dstr) = (HE**)darray;
bfcb3514 10942 while (i <= sxhv->xhv_max) {
a1cfa1c6 10943 HE *source = HvARRAY(sstr)[i];
7b2c381c 10944 HvARRAY(dstr)[i]
a1cfa1c6 10945 = source ? he_dup(source, sharekeys, param) : 0;
bfcb3514
NC
10946 ++i;
10947 }
b79f7545
NC
10948 if (SvOOK(sstr)) {
10949 struct xpvhv_aux *saux = HvAUX(sstr);
10950 struct xpvhv_aux *daux = HvAUX(dstr);
10951 /* This flag isn't copied. */
10952 /* SvOOK_on(hv) attacks the IV flags. */
10953 SvFLAGS(dstr) |= SVf_OOK;
10954
10955 hvname = saux->xhv_name;
10956 daux->xhv_name = hvname ? hek_dup(hvname, param) : hvname;
10957
10958 daux->xhv_riter = saux->xhv_riter;
10959 daux->xhv_eiter = saux->xhv_eiter
10960 ? he_dup(saux->xhv_eiter, (bool)!!HvSHAREKEYS(sstr),
10961 param) : 0;
10962 }
bfcb3514
NC
10963 }
10964 else {
10965 SvPV_set(dstr, Nullch);
bfcb3514
NC
10966 }
10967 /* Record stashes for possible cloning in Perl_clone(). */
10968 if(hvname)
10969 av_push(param->stashes, dstr);
1d7c1841 10970 }
1d7c1841
GS
10971 break;
10972 case SVt_PVFM:
10973 SvANY(dstr) = new_XPVFM();
10974 FmLINES(dstr) = FmLINES(sstr);
10975 goto dup_pvcv;
10976 /* NOTREACHED */
10977 case SVt_PVCV:
10978 SvANY(dstr) = new_XPVCV();
d2d73c3e 10979 dup_pvcv:
b162af07
SP
10980 SvCUR_set(dstr, SvCUR(sstr));
10981 SvLEN_set(dstr, SvLEN(sstr));
45977657 10982 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10983 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10984 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10985 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10986 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
d2d73c3e 10987 CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
1d7c1841 10988 CvSTART(dstr) = CvSTART(sstr);
b34c0dd4 10989 OP_REFCNT_LOCK;
1d7c1841 10990 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
b34c0dd4 10991 OP_REFCNT_UNLOCK;
1d7c1841
GS
10992 CvXSUB(dstr) = CvXSUB(sstr);
10993 CvXSUBANY(dstr) = CvXSUBANY(sstr);
01485f8b
DM
10994 if (CvCONST(sstr)) {
10995 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
10996 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
8f77bfdb 10997 sv_dup_inc((SV *)CvXSUBANY(sstr).any_ptr, param);
01485f8b 10998 }
b23f1a86
DM
10999 /* don't dup if copying back - CvGV isn't refcounted, so the
11000 * duped GV may never be freed. A bit of a hack! DAPM */
11001 CvGV(dstr) = (param->flags & CLONEf_JOIN_IN) ?
11002 Nullgv : gv_dup(CvGV(sstr), param) ;
d2d73c3e
AB
11003 if (param->flags & CLONEf_COPY_STACKS) {
11004 CvDEPTH(dstr) = CvDEPTH(sstr);
11005 } else {
11006 CvDEPTH(dstr) = 0;
11007 }
dd2155a4 11008 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
7dafbf52
DM
11009 CvOUTSIDE_SEQ(dstr) = CvOUTSIDE_SEQ(sstr);
11010 CvOUTSIDE(dstr) =
11011 CvWEAKOUTSIDE(sstr)
11012 ? cv_dup( CvOUTSIDE(sstr), param)
11013 : cv_dup_inc(CvOUTSIDE(sstr), param);
1d7c1841 11014 CvFLAGS(dstr) = CvFLAGS(sstr);
54356c7d 11015 CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
1d7c1841
GS
11016 break;
11017 default:
c803eecc 11018 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
1d7c1841
GS
11019 break;
11020 }
11021
11022 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
11023 ++PL_sv_objcount;
11024
11025 return dstr;
d2d73c3e 11026 }
1d7c1841 11027
645c22ef
DM
11028/* duplicate a context */
11029
1d7c1841 11030PERL_CONTEXT *
a8fc9800 11031Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
11032{
11033 PERL_CONTEXT *ncxs;
11034
11035 if (!cxs)
11036 return (PERL_CONTEXT*)NULL;
11037
11038 /* look for it in the table first */
11039 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
11040 if (ncxs)
11041 return ncxs;
11042
11043 /* create anew and remember what it is */
11044 Newz(56, ncxs, max + 1, PERL_CONTEXT);
11045 ptr_table_store(PL_ptr_table, cxs, ncxs);
11046
11047 while (ix >= 0) {
11048 PERL_CONTEXT *cx = &cxs[ix];
11049 PERL_CONTEXT *ncx = &ncxs[ix];
11050 ncx->cx_type = cx->cx_type;
11051 if (CxTYPE(cx) == CXt_SUBST) {
11052 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
11053 }
11054 else {
11055 ncx->blk_oldsp = cx->blk_oldsp;
11056 ncx->blk_oldcop = cx->blk_oldcop;
1d7c1841
GS
11057 ncx->blk_oldmarksp = cx->blk_oldmarksp;
11058 ncx->blk_oldscopesp = cx->blk_oldscopesp;
11059 ncx->blk_oldpm = cx->blk_oldpm;
11060 ncx->blk_gimme = cx->blk_gimme;
11061 switch (CxTYPE(cx)) {
11062 case CXt_SUB:
11063 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
11064 ? cv_dup_inc(cx->blk_sub.cv, param)
11065 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 11066 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 11067 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 11068 : Nullav);
d2d73c3e 11069 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
11070 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
11071 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
11072 ncx->blk_sub.lval = cx->blk_sub.lval;
f39bc417 11073 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
11074 break;
11075 case CXt_EVAL:
11076 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
11077 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 11078 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 11079 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 11080 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
f39bc417 11081 ncx->blk_eval.retop = cx->blk_eval.retop;
1d7c1841
GS
11082 break;
11083 case CXt_LOOP:
11084 ncx->blk_loop.label = cx->blk_loop.label;
11085 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
11086 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
11087 ncx->blk_loop.next_op = cx->blk_loop.next_op;
11088 ncx->blk_loop.last_op = cx->blk_loop.last_op;
11089 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
11090 ? cx->blk_loop.iterdata
d2d73c3e 11091 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
11092 ncx->blk_loop.oldcomppad
11093 = (PAD*)ptr_table_fetch(PL_ptr_table,
11094 cx->blk_loop.oldcomppad);
d2d73c3e
AB
11095 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
11096 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
11097 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
11098 ncx->blk_loop.iterix = cx->blk_loop.iterix;
11099 ncx->blk_loop.itermax = cx->blk_loop.itermax;
11100 break;
11101 case CXt_FORMAT:
d2d73c3e
AB
11102 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
11103 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
11104 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841 11105 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
f39bc417 11106 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
11107 break;
11108 case CXt_BLOCK:
11109 case CXt_NULL:
11110 break;
11111 }
11112 }
11113 --ix;
11114 }
11115 return ncxs;
11116}
11117
645c22ef
DM
11118/* duplicate a stack info structure */
11119
1d7c1841 11120PERL_SI *
a8fc9800 11121Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
11122{
11123 PERL_SI *nsi;
11124
11125 if (!si)
11126 return (PERL_SI*)NULL;
11127
11128 /* look for it in the table first */
11129 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
11130 if (nsi)
11131 return nsi;
11132
11133 /* create anew and remember what it is */
11134 Newz(56, nsi, 1, PERL_SI);
11135 ptr_table_store(PL_ptr_table, si, nsi);
11136
d2d73c3e 11137 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
11138 nsi->si_cxix = si->si_cxix;
11139 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 11140 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 11141 nsi->si_type = si->si_type;
d2d73c3e
AB
11142 nsi->si_prev = si_dup(si->si_prev, param);
11143 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
11144 nsi->si_markoff = si->si_markoff;
11145
11146 return nsi;
11147}
11148
11149#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
11150#define TOPINT(ss,ix) ((ss)[ix].any_i32)
11151#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
11152#define TOPLONG(ss,ix) ((ss)[ix].any_long)
11153#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
11154#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
11155#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
11156#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
11157#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
11158#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
11159#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
11160#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
11161#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
11162#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
11163
11164/* XXXXX todo */
11165#define pv_dup_inc(p) SAVEPV(p)
11166#define pv_dup(p) SAVEPV(p)
11167#define svp_dup_inc(p,pp) any_dup(p,pp)
11168
645c22ef
DM
11169/* map any object to the new equivent - either something in the
11170 * ptr table, or something in the interpreter structure
11171 */
11172
1d7c1841
GS
11173void *
11174Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
11175{
11176 void *ret;
11177
11178 if (!v)
11179 return (void*)NULL;
11180
11181 /* look for it in the table first */
11182 ret = ptr_table_fetch(PL_ptr_table, v);
11183 if (ret)
11184 return ret;
11185
11186 /* see if it is part of the interpreter structure */
11187 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 11188 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 11189 else {
1d7c1841 11190 ret = v;
05ec9bb3 11191 }
1d7c1841
GS
11192
11193 return ret;
11194}
11195
645c22ef
DM
11196/* duplicate the save stack */
11197
1d7c1841 11198ANY *
a8fc9800 11199Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841
GS
11200{
11201 ANY *ss = proto_perl->Tsavestack;
11202 I32 ix = proto_perl->Tsavestack_ix;
11203 I32 max = proto_perl->Tsavestack_max;
11204 ANY *nss;
11205 SV *sv;
11206 GV *gv;
11207 AV *av;
11208 HV *hv;
11209 void* ptr;
11210 int intval;
11211 long longval;
11212 GP *gp;
11213 IV iv;
11214 I32 i;
c4e33207 11215 char *c = NULL;
1d7c1841 11216 void (*dptr) (void*);
acfe0abc 11217 void (*dxptr) (pTHX_ void*);
e977893f 11218 OP *o;
3c0f78ca
JH
11219 /* Unions for circumventing strict ANSI C89 casting rules. */
11220 union { void *vptr; void (*dptr)(void*); } u1, u2;
11221 union { void *vptr; void (*dxptr)(pTHX_ void*); } u3, u4;
1d7c1841
GS
11222
11223 Newz(54, nss, max, ANY);
11224
11225 while (ix > 0) {
11226 i = POPINT(ss,ix);
11227 TOPINT(nss,ix) = i;
11228 switch (i) {
11229 case SAVEt_ITEM: /* normal string */
11230 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11231 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11232 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11233 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11234 break;
11235 case SAVEt_SV: /* scalar reference */
11236 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11237 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11238 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11239 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 11240 break;
f4dd75d9
GS
11241 case SAVEt_GENERIC_PVREF: /* generic char* */
11242 c = (char*)POPPTR(ss,ix);
11243 TOPPTR(nss,ix) = pv_dup(c);
11244 ptr = POPPTR(ss,ix);
11245 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11246 break;
05ec9bb3
NIS
11247 case SAVEt_SHARED_PVREF: /* char* in shared space */
11248 c = (char*)POPPTR(ss,ix);
11249 TOPPTR(nss,ix) = savesharedpv(c);
11250 ptr = POPPTR(ss,ix);
11251 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11252 break;
1d7c1841
GS
11253 case SAVEt_GENERIC_SVREF: /* generic sv */
11254 case SAVEt_SVREF: /* scalar reference */
11255 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11256 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11257 ptr = POPPTR(ss,ix);
11258 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
11259 break;
11260 case SAVEt_AV: /* array reference */
11261 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11262 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 11263 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11264 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11265 break;
11266 case SAVEt_HV: /* hash reference */
11267 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11268 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 11269 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11270 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11271 break;
11272 case SAVEt_INT: /* int reference */
11273 ptr = POPPTR(ss,ix);
11274 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11275 intval = (int)POPINT(ss,ix);
11276 TOPINT(nss,ix) = intval;
11277 break;
11278 case SAVEt_LONG: /* long reference */
11279 ptr = POPPTR(ss,ix);
11280 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11281 longval = (long)POPLONG(ss,ix);
11282 TOPLONG(nss,ix) = longval;
11283 break;
11284 case SAVEt_I32: /* I32 reference */
11285 case SAVEt_I16: /* I16 reference */
11286 case SAVEt_I8: /* I8 reference */
11287 ptr = POPPTR(ss,ix);
11288 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11289 i = POPINT(ss,ix);
11290 TOPINT(nss,ix) = i;
11291 break;
11292 case SAVEt_IV: /* IV reference */
11293 ptr = POPPTR(ss,ix);
11294 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11295 iv = POPIV(ss,ix);
11296 TOPIV(nss,ix) = iv;
11297 break;
11298 case SAVEt_SPTR: /* SV* reference */
11299 ptr = POPPTR(ss,ix);
11300 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11301 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11302 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
11303 break;
11304 case SAVEt_VPTR: /* random* reference */
11305 ptr = POPPTR(ss,ix);
11306 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11307 ptr = POPPTR(ss,ix);
11308 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11309 break;
11310 case SAVEt_PPTR: /* char* reference */
11311 ptr = POPPTR(ss,ix);
11312 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11313 c = (char*)POPPTR(ss,ix);
11314 TOPPTR(nss,ix) = pv_dup(c);
11315 break;
11316 case SAVEt_HPTR: /* HV* reference */
11317 ptr = POPPTR(ss,ix);
11318 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11319 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11320 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
11321 break;
11322 case SAVEt_APTR: /* AV* reference */
11323 ptr = POPPTR(ss,ix);
11324 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11325 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11326 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
11327 break;
11328 case SAVEt_NSTAB:
11329 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11330 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11331 break;
11332 case SAVEt_GP: /* scalar reference */
11333 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 11334 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
11335 (void)GpREFCNT_inc(gp);
11336 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 11337 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
11338 c = (char*)POPPTR(ss,ix);
11339 TOPPTR(nss,ix) = pv_dup(c);
11340 iv = POPIV(ss,ix);
11341 TOPIV(nss,ix) = iv;
11342 iv = POPIV(ss,ix);
11343 TOPIV(nss,ix) = iv;
11344 break;
11345 case SAVEt_FREESV:
26d9b02f 11346 case SAVEt_MORTALIZESV:
1d7c1841 11347 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11348 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11349 break;
11350 case SAVEt_FREEOP:
11351 ptr = POPPTR(ss,ix);
11352 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
11353 /* these are assumed to be refcounted properly */
11354 switch (((OP*)ptr)->op_type) {
11355 case OP_LEAVESUB:
11356 case OP_LEAVESUBLV:
11357 case OP_LEAVEEVAL:
11358 case OP_LEAVE:
11359 case OP_SCOPE:
11360 case OP_LEAVEWRITE:
e977893f
GS
11361 TOPPTR(nss,ix) = ptr;
11362 o = (OP*)ptr;
11363 OpREFCNT_inc(o);
1d7c1841
GS
11364 break;
11365 default:
11366 TOPPTR(nss,ix) = Nullop;
11367 break;
11368 }
11369 }
11370 else
11371 TOPPTR(nss,ix) = Nullop;
11372 break;
11373 case SAVEt_FREEPV:
11374 c = (char*)POPPTR(ss,ix);
11375 TOPPTR(nss,ix) = pv_dup_inc(c);
11376 break;
11377 case SAVEt_CLEARSV:
11378 longval = POPLONG(ss,ix);
11379 TOPLONG(nss,ix) = longval;
11380 break;
11381 case SAVEt_DELETE:
11382 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11383 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
11384 c = (char*)POPPTR(ss,ix);
11385 TOPPTR(nss,ix) = pv_dup_inc(c);
11386 i = POPINT(ss,ix);
11387 TOPINT(nss,ix) = i;
11388 break;
11389 case SAVEt_DESTRUCTOR:
11390 ptr = POPPTR(ss,ix);
11391 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11392 dptr = POPDPTR(ss,ix);
3c0f78ca
JH
11393 u1.dptr = dptr;
11394 u2.vptr = any_dup(u1.vptr, proto_perl);
11395 TOPDPTR(nss,ix) = u2.dptr;
1d7c1841
GS
11396 break;
11397 case SAVEt_DESTRUCTOR_X:
11398 ptr = POPPTR(ss,ix);
11399 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11400 dxptr = POPDXPTR(ss,ix);
3c0f78ca
JH
11401 u3.dxptr = dxptr;
11402 u4.vptr = any_dup(u3.vptr, proto_perl);;
11403 TOPDXPTR(nss,ix) = u4.dxptr;
1d7c1841
GS
11404 break;
11405 case SAVEt_REGCONTEXT:
11406 case SAVEt_ALLOC:
11407 i = POPINT(ss,ix);
11408 TOPINT(nss,ix) = i;
11409 ix -= i;
11410 break;
11411 case SAVEt_STACK_POS: /* Position on Perl stack */
11412 i = POPINT(ss,ix);
11413 TOPINT(nss,ix) = i;
11414 break;
11415 case SAVEt_AELEM: /* array element */
11416 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11417 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11418 i = POPINT(ss,ix);
11419 TOPINT(nss,ix) = i;
11420 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11421 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
11422 break;
11423 case SAVEt_HELEM: /* hash element */
11424 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11425 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11426 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11427 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11428 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11429 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
11430 break;
11431 case SAVEt_OP:
11432 ptr = POPPTR(ss,ix);
11433 TOPPTR(nss,ix) = ptr;
11434 break;
11435 case SAVEt_HINTS:
11436 i = POPINT(ss,ix);
11437 TOPINT(nss,ix) = i;
11438 break;
c4410b1b
GS
11439 case SAVEt_COMPPAD:
11440 av = (AV*)POPPTR(ss,ix);
58ed4fbe 11441 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 11442 break;
c3564e5c
GS
11443 case SAVEt_PADSV:
11444 longval = (long)POPLONG(ss,ix);
11445 TOPLONG(nss,ix) = longval;
11446 ptr = POPPTR(ss,ix);
11447 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11448 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11449 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 11450 break;
a1bb4754 11451 case SAVEt_BOOL:
38d8b13e 11452 ptr = POPPTR(ss,ix);
b9609c01 11453 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 11454 longval = (long)POPBOOL(ss,ix);
b9609c01 11455 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 11456 break;
8bd2680e
MHM
11457 case SAVEt_SET_SVFLAGS:
11458 i = POPINT(ss,ix);
11459 TOPINT(nss,ix) = i;
11460 i = POPINT(ss,ix);
11461 TOPINT(nss,ix) = i;
11462 sv = (SV*)POPPTR(ss,ix);
11463 TOPPTR(nss,ix) = sv_dup(sv, param);
11464 break;
1d7c1841
GS
11465 default:
11466 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
11467 }
11468 }
11469
11470 return nss;
11471}
11472
9660f481
DM
11473
11474/* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
11475 * flag to the result. This is done for each stash before cloning starts,
11476 * so we know which stashes want their objects cloned */
11477
11478static void
11479do_mark_cloneable_stash(pTHX_ SV *sv)
11480{
bfcb3514
NC
11481 const char *hvname = HvNAME_get((HV*)sv);
11482 if (hvname) {
9660f481 11483 GV* cloner = gv_fetchmethod_autoload((HV*)sv, "CLONE_SKIP", 0);
7423f6db 11484 STRLEN len = HvNAMELEN_get((HV*)sv);
9660f481
DM
11485 SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
11486 if (cloner && GvCV(cloner)) {
11487 dSP;
11488 UV status;
11489
11490 ENTER;
11491 SAVETMPS;
11492 PUSHMARK(SP);
7423f6db 11493 XPUSHs(sv_2mortal(newSVpvn(hvname, len)));
9660f481
DM
11494 PUTBACK;
11495 call_sv((SV*)GvCV(cloner), G_SCALAR);
11496 SPAGAIN;
11497 status = POPu;
11498 PUTBACK;
11499 FREETMPS;
11500 LEAVE;
11501 if (status)
11502 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
11503 }
11504 }
11505}
11506
11507
11508
645c22ef
DM
11509/*
11510=for apidoc perl_clone
11511
11512Create and return a new interpreter by cloning the current one.
11513
4be49ee6 11514perl_clone takes these flags as parameters:
6a78b4db 11515
7a5fa8a2
NIS
11516CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
11517without it we only clone the data and zero the stacks,
11518with it we copy the stacks and the new perl interpreter is
11519ready to run at the exact same point as the previous one.
11520The pseudo-fork code uses COPY_STACKS while the
6a78b4db
AB
11521threads->new doesn't.
11522
11523CLONEf_KEEP_PTR_TABLE
7a5fa8a2
NIS
11524perl_clone keeps a ptr_table with the pointer of the old
11525variable as a key and the new variable as a value,
11526this allows it to check if something has been cloned and not
11527clone it again but rather just use the value and increase the
11528refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
11529the ptr_table using the function
11530C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
11531reason to keep it around is if you want to dup some of your own
11532variable who are outside the graph perl scans, example of this
6a78b4db
AB
11533code is in threads.xs create
11534
11535CLONEf_CLONE_HOST
7a5fa8a2
NIS
11536This is a win32 thing, it is ignored on unix, it tells perls
11537win32host code (which is c++) to clone itself, this is needed on
11538win32 if you want to run two threads at the same time,
11539if you just want to do some stuff in a separate perl interpreter
11540and then throw it away and return to the original one,
6a78b4db
AB
11541you don't need to do anything.
11542
645c22ef
DM
11543=cut
11544*/
11545
11546/* XXX the above needs expanding by someone who actually understands it ! */
3fc56081
NK
11547EXTERN_C PerlInterpreter *
11548perl_clone_host(PerlInterpreter* proto_perl, UV flags);
645c22ef 11549
1d7c1841
GS
11550PerlInterpreter *
11551perl_clone(PerlInterpreter *proto_perl, UV flags)
11552{
27da23d5 11553 dVAR;
1d7c1841 11554#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
11555
11556 /* perlhost.h so we need to call into it
11557 to clone the host, CPerlHost should have a c interface, sky */
11558
11559 if (flags & CLONEf_CLONE_HOST) {
11560 return perl_clone_host(proto_perl,flags);
11561 }
11562 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
11563 proto_perl->IMem,
11564 proto_perl->IMemShared,
11565 proto_perl->IMemParse,
11566 proto_perl->IEnv,
11567 proto_perl->IStdIO,
11568 proto_perl->ILIO,
11569 proto_perl->IDir,
11570 proto_perl->ISock,
11571 proto_perl->IProc);
11572}
11573
11574PerlInterpreter *
11575perl_clone_using(PerlInterpreter *proto_perl, UV flags,
11576 struct IPerlMem* ipM, struct IPerlMem* ipMS,
11577 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
11578 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
11579 struct IPerlDir* ipD, struct IPerlSock* ipS,
11580 struct IPerlProc* ipP)
11581{
11582 /* XXX many of the string copies here can be optimized if they're
11583 * constants; they need to be allocated as common memory and just
11584 * their pointers copied. */
11585
11586 IV i;
64aa0685
GS
11587 CLONE_PARAMS clone_params;
11588 CLONE_PARAMS* param = &clone_params;
d2d73c3e 11589
1d7c1841 11590 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
9660f481
DM
11591 /* for each stash, determine whether its objects should be cloned */
11592 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
ba869deb 11593 PERL_SET_THX(my_perl);
1d7c1841 11594
acfe0abc 11595# ifdef DEBUGGING
a4530404 11596 Poison(my_perl, 1, PerlInterpreter);
fd0854ff 11597 PL_op = Nullop;
c008732b 11598 PL_curcop = (COP *)Nullop;
1d7c1841
GS
11599 PL_markstack = 0;
11600 PL_scopestack = 0;
11601 PL_savestack = 0;
22f7c9c9
JH
11602 PL_savestack_ix = 0;
11603 PL_savestack_max = -1;
66fe0623 11604 PL_sig_pending = 0;
25596c82 11605 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
acfe0abc 11606# else /* !DEBUGGING */
1d7c1841 11607 Zero(my_perl, 1, PerlInterpreter);
acfe0abc 11608# endif /* DEBUGGING */
1d7c1841
GS
11609
11610 /* host pointers */
11611 PL_Mem = ipM;
11612 PL_MemShared = ipMS;
11613 PL_MemParse = ipMP;
11614 PL_Env = ipE;
11615 PL_StdIO = ipStd;
11616 PL_LIO = ipLIO;
11617 PL_Dir = ipD;
11618 PL_Sock = ipS;
11619 PL_Proc = ipP;
1d7c1841
GS
11620#else /* !PERL_IMPLICIT_SYS */
11621 IV i;
64aa0685
GS
11622 CLONE_PARAMS clone_params;
11623 CLONE_PARAMS* param = &clone_params;
1d7c1841 11624 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
9660f481
DM
11625 /* for each stash, determine whether its objects should be cloned */
11626 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
ba869deb 11627 PERL_SET_THX(my_perl);
1d7c1841
GS
11628
11629# ifdef DEBUGGING
a4530404 11630 Poison(my_perl, 1, PerlInterpreter);
fd0854ff 11631 PL_op = Nullop;
c008732b 11632 PL_curcop = (COP *)Nullop;
1d7c1841
GS
11633 PL_markstack = 0;
11634 PL_scopestack = 0;
11635 PL_savestack = 0;
22f7c9c9
JH
11636 PL_savestack_ix = 0;
11637 PL_savestack_max = -1;
66fe0623 11638 PL_sig_pending = 0;
25596c82 11639 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
1d7c1841
GS
11640# else /* !DEBUGGING */
11641 Zero(my_perl, 1, PerlInterpreter);
11642# endif /* DEBUGGING */
11643#endif /* PERL_IMPLICIT_SYS */
83236556 11644 param->flags = flags;
59b40662 11645 param->proto_perl = proto_perl;
1d7c1841
GS
11646
11647 /* arena roots */
612f20c3 11648 PL_xnv_arenaroot = NULL;
1d7c1841 11649 PL_xnv_root = NULL;
612f20c3 11650 PL_xpv_arenaroot = NULL;
1d7c1841 11651 PL_xpv_root = NULL;
612f20c3 11652 PL_xpviv_arenaroot = NULL;
1d7c1841 11653 PL_xpviv_root = NULL;
612f20c3 11654 PL_xpvnv_arenaroot = NULL;
1d7c1841 11655 PL_xpvnv_root = NULL;
612f20c3 11656 PL_xpvcv_arenaroot = NULL;
1d7c1841 11657 PL_xpvcv_root = NULL;
612f20c3 11658 PL_xpvav_arenaroot = NULL;
1d7c1841 11659 PL_xpvav_root = NULL;
612f20c3 11660 PL_xpvhv_arenaroot = NULL;
1d7c1841 11661 PL_xpvhv_root = NULL;
612f20c3 11662 PL_xpvmg_arenaroot = NULL;
1d7c1841 11663 PL_xpvmg_root = NULL;
7552b40b
DM
11664 PL_xpvgv_arenaroot = NULL;
11665 PL_xpvgv_root = NULL;
612f20c3 11666 PL_xpvlv_arenaroot = NULL;
1d7c1841 11667 PL_xpvlv_root = NULL;
612f20c3 11668 PL_xpvbm_arenaroot = NULL;
1d7c1841 11669 PL_xpvbm_root = NULL;
612f20c3 11670 PL_he_arenaroot = NULL;
1d7c1841 11671 PL_he_root = NULL;
892b45be 11672#if defined(USE_ITHREADS)
32e691d0
NC
11673 PL_pte_arenaroot = NULL;
11674 PL_pte_root = NULL;
892b45be 11675#endif
1d7c1841
GS
11676 PL_nice_chunk = NULL;
11677 PL_nice_chunk_size = 0;
11678 PL_sv_count = 0;
11679 PL_sv_objcount = 0;
11680 PL_sv_root = Nullsv;
11681 PL_sv_arenaroot = Nullsv;
11682
11683 PL_debug = proto_perl->Idebug;
11684
8df990a8
NC
11685 PL_hash_seed = proto_perl->Ihash_seed;
11686 PL_rehash_seed = proto_perl->Irehash_seed;
11687
e5dd39fc 11688#ifdef USE_REENTRANT_API
68853529
SB
11689 /* XXX: things like -Dm will segfault here in perlio, but doing
11690 * PERL_SET_CONTEXT(proto_perl);
11691 * breaks too many other things
11692 */
59bd0823 11693 Perl_reentrant_init(aTHX);
e5dd39fc
AB
11694#endif
11695
1d7c1841
GS
11696 /* create SV map for pointer relocation */
11697 PL_ptr_table = ptr_table_new();
c21d1a0f
NC
11698 /* and one for finding shared hash keys quickly */
11699 PL_shared_hek_table = ptr_table_new();
1d7c1841
GS
11700
11701 /* initialize these special pointers as early as possible */
11702 SvANY(&PL_sv_undef) = NULL;
11703 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
11704 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
11705 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
11706
1d7c1841 11707 SvANY(&PL_sv_no) = new_XPVNV();
1d7c1841 11708 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
0309f36e
NC
11709 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11710 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
f880fe2f 11711 SvPV_set(&PL_sv_no, SAVEPVN(PL_No, 0));
b162af07
SP
11712 SvCUR_set(&PL_sv_no, 0);
11713 SvLEN_set(&PL_sv_no, 1);
45977657 11714 SvIV_set(&PL_sv_no, 0);
9d6ce603 11715 SvNV_set(&PL_sv_no, 0);
1d7c1841
GS
11716 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
11717
1d7c1841 11718 SvANY(&PL_sv_yes) = new_XPVNV();
1d7c1841 11719 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
0309f36e
NC
11720 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11721 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
f880fe2f 11722 SvPV_set(&PL_sv_yes, SAVEPVN(PL_Yes, 1));
b162af07
SP
11723 SvCUR_set(&PL_sv_yes, 1);
11724 SvLEN_set(&PL_sv_yes, 2);
45977657 11725 SvIV_set(&PL_sv_yes, 1);
9d6ce603 11726 SvNV_set(&PL_sv_yes, 1);
1d7c1841
GS
11727 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
11728
05ec9bb3 11729 /* create (a non-shared!) shared string table */
1d7c1841
GS
11730 PL_strtab = newHV();
11731 HvSHAREKEYS_off(PL_strtab);
c4a9c09d 11732 hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
1d7c1841
GS
11733 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
11734
05ec9bb3
NIS
11735 PL_compiling = proto_perl->Icompiling;
11736
11737 /* These two PVs will be free'd special way so must set them same way op.c does */
11738 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
11739 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
11740
11741 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
11742 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
11743
1d7c1841
GS
11744 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
11745 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 11746 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 11747 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 11748 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
11749 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
11750
11751 /* pseudo environmental stuff */
11752 PL_origargc = proto_perl->Iorigargc;
e2975953 11753 PL_origargv = proto_perl->Iorigargv;
d2d73c3e 11754
d2d73c3e
AB
11755 param->stashes = newAV(); /* Setup array of objects to call clone on */
11756
a1ea730d 11757#ifdef PERLIO_LAYERS
3a1ee7e8
NIS
11758 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11759 PerlIO_clone(aTHX_ proto_perl, param);
a1ea730d 11760#endif
d2d73c3e
AB
11761
11762 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
11763 PL_incgv = gv_dup(proto_perl->Iincgv, param);
11764 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 11765 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
11766 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
11767 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
11768
11769 /* switches */
11770 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 11771 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
11772 PL_localpatches = proto_perl->Ilocalpatches;
11773 PL_splitstr = proto_perl->Isplitstr;
11774 PL_preprocess = proto_perl->Ipreprocess;
11775 PL_minus_n = proto_perl->Iminus_n;
11776 PL_minus_p = proto_perl->Iminus_p;
11777 PL_minus_l = proto_perl->Iminus_l;
11778 PL_minus_a = proto_perl->Iminus_a;
11779 PL_minus_F = proto_perl->Iminus_F;
11780 PL_doswitches = proto_perl->Idoswitches;
11781 PL_dowarn = proto_perl->Idowarn;
11782 PL_doextract = proto_perl->Idoextract;
11783 PL_sawampersand = proto_perl->Isawampersand;
11784 PL_unsafe = proto_perl->Iunsafe;
11785 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 11786 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
11787 PL_perldb = proto_perl->Iperldb;
11788 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
1cbb0781 11789 PL_exit_flags = proto_perl->Iexit_flags;
1d7c1841
GS
11790
11791 /* magical thingies */
11792 /* XXX time(&PL_basetime) when asked for? */
11793 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 11794 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
11795
11796 PL_maxsysfd = proto_perl->Imaxsysfd;
11797 PL_multiline = proto_perl->Imultiline;
11798 PL_statusvalue = proto_perl->Istatusvalue;
11799#ifdef VMS
11800 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
11801#endif
0a378802 11802 PL_encoding = sv_dup(proto_perl->Iencoding, param);
1d7c1841 11803
4a4c6fe3 11804 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
1f483ca1
JH
11805 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
11806 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
4a4c6fe3 11807
d2f185dc
AMS
11808 /* Clone the regex array */
11809 PL_regex_padav = newAV();
11810 {
a3b680e6 11811 const I32 len = av_len((AV*)proto_perl->Iregex_padav);
d2f185dc 11812 SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
0f95fc41
AB
11813 av_push(PL_regex_padav,
11814 sv_dup_inc(regexen[0],param));
11815 for(i = 1; i <= len; i++) {
11816 if(SvREPADTMP(regexen[i])) {
11817 av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
8cf8f3d1 11818 } else {
0f95fc41
AB
11819 av_push(PL_regex_padav,
11820 SvREFCNT_inc(
8cf8f3d1 11821 newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
cbfa9890 11822 SvIVX(regexen[i])), param)))
0f95fc41
AB
11823 ));
11824 }
d2f185dc
AMS
11825 }
11826 }
11827 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 11828
1d7c1841 11829 /* shortcuts to various I/O objects */
d2d73c3e
AB
11830 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
11831 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
11832 PL_defgv = gv_dup(proto_perl->Idefgv, param);
11833 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
11834 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
11835 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
11836
11837 /* shortcuts to regexp stuff */
d2d73c3e 11838 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
11839
11840 /* shortcuts to misc objects */
d2d73c3e 11841 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
11842
11843 /* shortcuts to debugging objects */
d2d73c3e
AB
11844 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
11845 PL_DBline = gv_dup(proto_perl->IDBline, param);
11846 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
11847 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
11848 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
11849 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
06492da6 11850 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
d2d73c3e
AB
11851 PL_lineary = av_dup(proto_perl->Ilineary, param);
11852 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
11853
11854 /* symbol tables */
d2d73c3e
AB
11855 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
11856 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
d2d73c3e
AB
11857 PL_debstash = hv_dup(proto_perl->Idebstash, param);
11858 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
11859 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
11860
11861 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
ee1c5a4e 11862 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
ece599bd 11863 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
d2d73c3e
AB
11864 PL_endav = av_dup_inc(proto_perl->Iendav, param);
11865 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
11866 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
11867
11868 PL_sub_generation = proto_perl->Isub_generation;
11869
11870 /* funky return mechanisms */
11871 PL_forkprocess = proto_perl->Iforkprocess;
11872
11873 /* subprocess state */
d2d73c3e 11874 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
11875
11876 /* internal state */
11877 PL_tainting = proto_perl->Itainting;
7135f00b 11878 PL_taint_warn = proto_perl->Itaint_warn;
1d7c1841
GS
11879 PL_maxo = proto_perl->Imaxo;
11880 if (proto_perl->Iop_mask)
11881 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11882 else
11883 PL_op_mask = Nullch;
06492da6 11884 /* PL_asserting = proto_perl->Iasserting; */
1d7c1841
GS
11885
11886 /* current interpreter roots */
d2d73c3e 11887 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
11888 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
11889 PL_main_start = proto_perl->Imain_start;
e977893f 11890 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
11891 PL_eval_start = proto_perl->Ieval_start;
11892
11893 /* runtime control stuff */
11894 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
11895 PL_copline = proto_perl->Icopline;
11896
11897 PL_filemode = proto_perl->Ifilemode;
11898 PL_lastfd = proto_perl->Ilastfd;
11899 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
11900 PL_Argv = NULL;
11901 PL_Cmd = Nullch;
11902 PL_gensym = proto_perl->Igensym;
11903 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 11904 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
11905 PL_laststatval = proto_perl->Ilaststatval;
11906 PL_laststype = proto_perl->Ilaststype;
11907 PL_mess_sv = Nullsv;
11908
d2d73c3e 11909 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
11910 PL_ofmt = SAVEPV(proto_perl->Iofmt);
11911
11912 /* interpreter atexit processing */
11913 PL_exitlistlen = proto_perl->Iexitlistlen;
11914 if (PL_exitlistlen) {
11915 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11916 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11917 }
11918 else
11919 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 11920 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
19e8ce8e
AB
11921 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
11922 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1d7c1841
GS
11923
11924 PL_profiledata = NULL;
a8fc9800 11925 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
1d7c1841 11926 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 11927 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 11928
d2d73c3e 11929 PL_compcv = cv_dup(proto_perl->Icompcv, param);
dd2155a4
DM
11930
11931 PAD_CLONE_VARS(proto_perl, param);
1d7c1841
GS
11932
11933#ifdef HAVE_INTERP_INTERN
11934 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11935#endif
11936
11937 /* more statics moved here */
11938 PL_generation = proto_perl->Igeneration;
d2d73c3e 11939 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
11940
11941 PL_in_clean_objs = proto_perl->Iin_clean_objs;
11942 PL_in_clean_all = proto_perl->Iin_clean_all;
11943
11944 PL_uid = proto_perl->Iuid;
11945 PL_euid = proto_perl->Ieuid;
11946 PL_gid = proto_perl->Igid;
11947 PL_egid = proto_perl->Iegid;
11948 PL_nomemok = proto_perl->Inomemok;
11949 PL_an = proto_perl->Ian;
1d7c1841
GS
11950 PL_evalseq = proto_perl->Ievalseq;
11951 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
11952 PL_origalen = proto_perl->Iorigalen;
11953 PL_pidstatus = newHV(); /* XXX flag for cloning? */
11954 PL_osname = SAVEPV(proto_perl->Iosname);
5c728af0 11955 PL_sh_path_compat = proto_perl->Ish_path_compat; /* XXX never deallocated */
1d7c1841
GS
11956 PL_sighandlerp = proto_perl->Isighandlerp;
11957
11958
11959 PL_runops = proto_perl->Irunops;
11960
11961 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
11962
11963#ifdef CSH
11964 PL_cshlen = proto_perl->Icshlen;
74f1b2b8 11965 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
1d7c1841
GS
11966#endif
11967
11968 PL_lex_state = proto_perl->Ilex_state;
11969 PL_lex_defer = proto_perl->Ilex_defer;
11970 PL_lex_expect = proto_perl->Ilex_expect;
11971 PL_lex_formbrack = proto_perl->Ilex_formbrack;
11972 PL_lex_dojoin = proto_perl->Ilex_dojoin;
11973 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
11974 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
11975 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
11976 PL_lex_op = proto_perl->Ilex_op;
11977 PL_lex_inpat = proto_perl->Ilex_inpat;
11978 PL_lex_inwhat = proto_perl->Ilex_inwhat;
11979 PL_lex_brackets = proto_perl->Ilex_brackets;
11980 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
11981 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
11982 PL_lex_casemods = proto_perl->Ilex_casemods;
11983 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
11984 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
11985
11986 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
11987 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
11988 PL_nexttoke = proto_perl->Inexttoke;
11989
1d773130
TB
11990 /* XXX This is probably masking the deeper issue of why
11991 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
11992 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
11993 * (A little debugging with a watchpoint on it may help.)
11994 */
389edf32
TB
11995 if (SvANY(proto_perl->Ilinestr)) {
11996 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
3f7c398e 11997 i = proto_perl->Ibufptr - SvPVX_const(proto_perl->Ilinestr);
389edf32 11998 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
3f7c398e 11999 i = proto_perl->Ioldbufptr - SvPVX_const(proto_perl->Ilinestr);
389edf32 12000 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
3f7c398e 12001 i = proto_perl->Ioldoldbufptr - SvPVX_const(proto_perl->Ilinestr);
389edf32 12002 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
3f7c398e 12003 i = proto_perl->Ilinestart - SvPVX_const(proto_perl->Ilinestr);
389edf32
TB
12004 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
12005 }
12006 else {
12007 PL_linestr = NEWSV(65,79);
12008 sv_upgrade(PL_linestr,SVt_PVIV);
12009 sv_setpvn(PL_linestr,"",0);
12010 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
12011 }
1d7c1841 12012 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1d7c1841
GS
12013 PL_pending_ident = proto_perl->Ipending_ident;
12014 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
12015
12016 PL_expect = proto_perl->Iexpect;
12017
12018 PL_multi_start = proto_perl->Imulti_start;
12019 PL_multi_end = proto_perl->Imulti_end;
12020 PL_multi_open = proto_perl->Imulti_open;
12021 PL_multi_close = proto_perl->Imulti_close;
12022
12023 PL_error_count = proto_perl->Ierror_count;
12024 PL_subline = proto_perl->Isubline;
d2d73c3e 12025 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841 12026
1d773130 12027 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
389edf32 12028 if (SvANY(proto_perl->Ilinestr)) {
3f7c398e 12029 i = proto_perl->Ilast_uni - SvPVX_const(proto_perl->Ilinestr);
389edf32 12030 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
3f7c398e 12031 i = proto_perl->Ilast_lop - SvPVX_const(proto_perl->Ilinestr);
389edf32
TB
12032 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
12033 PL_last_lop_op = proto_perl->Ilast_lop_op;
12034 }
12035 else {
12036 PL_last_uni = SvPVX(PL_linestr);
12037 PL_last_lop = SvPVX(PL_linestr);
12038 PL_last_lop_op = 0;
12039 }
1d7c1841 12040 PL_in_my = proto_perl->Iin_my;
d2d73c3e 12041 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
12042#ifdef FCRYPT
12043 PL_cryptseen = proto_perl->Icryptseen;
12044#endif
12045
12046 PL_hints = proto_perl->Ihints;
12047
12048 PL_amagic_generation = proto_perl->Iamagic_generation;
12049
12050#ifdef USE_LOCALE_COLLATE
12051 PL_collation_ix = proto_perl->Icollation_ix;
12052 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
12053 PL_collation_standard = proto_perl->Icollation_standard;
12054 PL_collxfrm_base = proto_perl->Icollxfrm_base;
12055 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
12056#endif /* USE_LOCALE_COLLATE */
12057
12058#ifdef USE_LOCALE_NUMERIC
12059 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
12060 PL_numeric_standard = proto_perl->Inumeric_standard;
12061 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 12062 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
12063#endif /* !USE_LOCALE_NUMERIC */
12064
12065 /* utf8 character classes */
d2d73c3e
AB
12066 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
12067 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
12068 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
12069 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
12070 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
12071 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
12072 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
12073 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
12074 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
12075 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
12076 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
12077 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
12078 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
12079 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
12080 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
12081 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
12082 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
b4e400f9 12083 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
82686b01
JH
12084 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
12085 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 12086
6c3182a5 12087 /* Did the locale setup indicate UTF-8? */
9769094f 12088 PL_utf8locale = proto_perl->Iutf8locale;
6c3182a5
JH
12089 /* Unicode features (see perlrun/-C) */
12090 PL_unicode = proto_perl->Iunicode;
12091
12092 /* Pre-5.8 signals control */
12093 PL_signals = proto_perl->Isignals;
12094
12095 /* times() ticks per second */
12096 PL_clocktick = proto_perl->Iclocktick;
12097
12098 /* Recursion stopper for PerlIO_find_layer */
12099 PL_in_load_module = proto_perl->Iin_load_module;
12100
12101 /* sort() routine */
12102 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
12103
57c6e6d2
JH
12104 /* Not really needed/useful since the reenrant_retint is "volatile",
12105 * but do it for consistency's sake. */
12106 PL_reentrant_retint = proto_perl->Ireentrant_retint;
12107
15a5279a
JH
12108 /* Hooks to shared SVs and locks. */
12109 PL_sharehook = proto_perl->Isharehook;
12110 PL_lockhook = proto_perl->Ilockhook;
12111 PL_unlockhook = proto_perl->Iunlockhook;
12112 PL_threadhook = proto_perl->Ithreadhook;
12113
bce260cd
JH
12114 PL_runops_std = proto_perl->Irunops_std;
12115 PL_runops_dbg = proto_perl->Irunops_dbg;
12116
12117#ifdef THREADS_HAVE_PIDS
12118 PL_ppid = proto_perl->Ippid;
12119#endif
12120
1d7c1841
GS
12121 /* swatch cache */
12122 PL_last_swash_hv = Nullhv; /* reinits on demand */
12123 PL_last_swash_klen = 0;
12124 PL_last_swash_key[0]= '\0';
12125 PL_last_swash_tmps = (U8*)NULL;
12126 PL_last_swash_slen = 0;
12127
1d7c1841
GS
12128 PL_glob_index = proto_perl->Iglob_index;
12129 PL_srand_called = proto_perl->Isrand_called;
12130 PL_uudmap['M'] = 0; /* reinits on demand */
12131 PL_bitcount = Nullch; /* reinits on demand */
12132
66fe0623
NIS
12133 if (proto_perl->Ipsig_pend) {
12134 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 12135 }
66fe0623
NIS
12136 else {
12137 PL_psig_pend = (int*)NULL;
12138 }
12139
1d7c1841 12140 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
12141 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
12142 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 12143 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
12144 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
12145 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
12146 }
12147 }
12148 else {
12149 PL_psig_ptr = (SV**)NULL;
12150 PL_psig_name = (SV**)NULL;
12151 }
12152
12153 /* thrdvar.h stuff */
12154
a0739874 12155 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
12156 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
12157 PL_tmps_ix = proto_perl->Ttmps_ix;
12158 PL_tmps_max = proto_perl->Ttmps_max;
12159 PL_tmps_floor = proto_perl->Ttmps_floor;
12160 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
12161 i = 0;
12162 while (i <= PL_tmps_ix) {
d2d73c3e 12163 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
12164 ++i;
12165 }
12166
12167 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
12168 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
12169 Newz(54, PL_markstack, i, I32);
12170 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
12171 - proto_perl->Tmarkstack);
12172 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
12173 - proto_perl->Tmarkstack);
12174 Copy(proto_perl->Tmarkstack, PL_markstack,
12175 PL_markstack_ptr - PL_markstack + 1, I32);
12176
12177 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
12178 * NOTE: unlike the others! */
12179 PL_scopestack_ix = proto_perl->Tscopestack_ix;
12180 PL_scopestack_max = proto_perl->Tscopestack_max;
12181 Newz(54, PL_scopestack, PL_scopestack_max, I32);
12182 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
12183
1d7c1841 12184 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 12185 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
12186
12187 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
12188 PL_curstack = av_dup(proto_perl->Tcurstack, param);
12189 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
12190
12191 /* next PUSHs() etc. set *(PL_stack_sp+1) */
12192 PL_stack_base = AvARRAY(PL_curstack);
12193 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
12194 - proto_perl->Tstack_base);
12195 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
12196
12197 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
12198 * NOTE: unlike the others! */
12199 PL_savestack_ix = proto_perl->Tsavestack_ix;
12200 PL_savestack_max = proto_perl->Tsavestack_max;
12201 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 12202 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
12203 }
12204 else {
12205 init_stacks();
985e7056 12206 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
12207 }
12208
12209 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
12210 PL_top_env = &PL_start_env;
12211
12212 PL_op = proto_perl->Top;
12213
12214 PL_Sv = Nullsv;
12215 PL_Xpv = (XPV*)NULL;
12216 PL_na = proto_perl->Tna;
12217
12218 PL_statbuf = proto_perl->Tstatbuf;
12219 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
12220 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
12221 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
12222#ifdef HAS_TIMES
12223 PL_timesbuf = proto_perl->Ttimesbuf;
12224#endif
12225
12226 PL_tainted = proto_perl->Ttainted;
12227 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
12228 PL_rs = sv_dup_inc(proto_perl->Trs, param);
12229 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
12230 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
12231 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 12232 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
12233 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
12234 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
12235 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
12236
12237 PL_restartop = proto_perl->Trestartop;
12238 PL_in_eval = proto_perl->Tin_eval;
12239 PL_delaymagic = proto_perl->Tdelaymagic;
12240 PL_dirty = proto_perl->Tdirty;
12241 PL_localizing = proto_perl->Tlocalizing;
12242
d2d73c3e 12243 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
dd28f7bb 12244 PL_hv_fetch_ent_mh = Nullhe;
1d7c1841
GS
12245 PL_modcount = proto_perl->Tmodcount;
12246 PL_lastgotoprobe = Nullop;
12247 PL_dumpindent = proto_perl->Tdumpindent;
12248
12249 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
12250 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
12251 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
12252 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
12253 PL_sortcxix = proto_perl->Tsortcxix;
12254 PL_efloatbuf = Nullch; /* reinits on demand */
12255 PL_efloatsize = 0; /* reinits on demand */
12256
12257 /* regex stuff */
12258
12259 PL_screamfirst = NULL;
12260 PL_screamnext = NULL;
12261 PL_maxscream = -1; /* reinits on demand */
12262 PL_lastscream = Nullsv;
12263
12264 PL_watchaddr = NULL;
12265 PL_watchok = Nullch;
12266
12267 PL_regdummy = proto_perl->Tregdummy;
1d7c1841
GS
12268 PL_regprecomp = Nullch;
12269 PL_regnpar = 0;
12270 PL_regsize = 0;
1d7c1841
GS
12271 PL_colorset = 0; /* reinits PL_colors[] */
12272 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841
GS
12273 PL_reginput = Nullch;
12274 PL_regbol = Nullch;
12275 PL_regeol = Nullch;
12276 PL_regstartp = (I32*)NULL;
12277 PL_regendp = (I32*)NULL;
12278 PL_reglastparen = (U32*)NULL;
2d862feb 12279 PL_reglastcloseparen = (U32*)NULL;
1d7c1841 12280 PL_regtill = Nullch;
1d7c1841
GS
12281 PL_reg_start_tmp = (char**)NULL;
12282 PL_reg_start_tmpl = 0;
12283 PL_regdata = (struct reg_data*)NULL;
12284 PL_bostr = Nullch;
12285 PL_reg_flags = 0;
12286 PL_reg_eval_set = 0;
12287 PL_regnarrate = 0;
12288 PL_regprogram = (regnode*)NULL;
12289 PL_regindent = 0;
12290 PL_regcc = (CURCUR*)NULL;
12291 PL_reg_call_cc = (struct re_cc_state*)NULL;
12292 PL_reg_re = (regexp*)NULL;
12293 PL_reg_ganch = Nullch;
12294 PL_reg_sv = Nullsv;
53c4c00c 12295 PL_reg_match_utf8 = FALSE;
1d7c1841
GS
12296 PL_reg_magic = (MAGIC*)NULL;
12297 PL_reg_oldpos = 0;
12298 PL_reg_oldcurpm = (PMOP*)NULL;
12299 PL_reg_curpm = (PMOP*)NULL;
12300 PL_reg_oldsaved = Nullch;
12301 PL_reg_oldsavedlen = 0;
ed252734 12302#ifdef PERL_COPY_ON_WRITE
504cff3b 12303 PL_nrs = Nullsv;
ed252734 12304#endif
1d7c1841
GS
12305 PL_reg_maxiter = 0;
12306 PL_reg_leftiter = 0;
12307 PL_reg_poscache = Nullch;
12308 PL_reg_poscache_size= 0;
12309
12310 /* RE engine - function pointers */
12311 PL_regcompp = proto_perl->Tregcompp;
12312 PL_regexecp = proto_perl->Tregexecp;
12313 PL_regint_start = proto_perl->Tregint_start;
12314 PL_regint_string = proto_perl->Tregint_string;
12315 PL_regfree = proto_perl->Tregfree;
12316
12317 PL_reginterp_cnt = 0;
12318 PL_reg_starttry = 0;
12319
a2efc822
SC
12320 /* Pluggable optimizer */
12321 PL_peepp = proto_perl->Tpeepp;
12322
081fc587
AB
12323 PL_stashcache = newHV();
12324
a0739874
DM
12325 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
12326 ptr_table_free(PL_ptr_table);
12327 PL_ptr_table = NULL;
c21d1a0f
NC
12328 ptr_table_free(PL_shared_hek_table);
12329 PL_shared_hek_table = NULL;
a0739874 12330 }
8cf8f3d1 12331
f284b03f
AMS
12332 /* Call the ->CLONE method, if it exists, for each of the stashes
12333 identified by sv_dup() above.
12334 */
d2d73c3e
AB
12335 while(av_len(param->stashes) != -1) {
12336 HV* stash = (HV*) av_shift(param->stashes);
f284b03f
AMS
12337 GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
12338 if (cloner && GvCV(cloner)) {
12339 dSP;
12340 ENTER;
12341 SAVETMPS;
12342 PUSHMARK(SP);
7423f6db 12343 XPUSHs(sv_2mortal(newSVpvn(HvNAME_get(stash), HvNAMELEN_get(stash))));
f284b03f
AMS
12344 PUTBACK;
12345 call_sv((SV*)GvCV(cloner), G_DISCARD);
12346 FREETMPS;
12347 LEAVE;
12348 }
4a09accc 12349 }
a0739874 12350
dc507217 12351 SvREFCNT_dec(param->stashes);
dc507217 12352
6d26897e
DM
12353 /* orphaned? eg threads->new inside BEGIN or use */
12354 if (PL_compcv && ! SvREFCNT(PL_compcv)) {
a3b680e6 12355 (void)SvREFCNT_inc(PL_compcv);
6d26897e
DM
12356 SAVEFREESV(PL_compcv);
12357 }
12358
1d7c1841 12359 return my_perl;
1d7c1841
GS
12360}
12361
1d7c1841 12362#endif /* USE_ITHREADS */
a0ae6670 12363
9f4817db 12364/*
ccfc67b7
JH
12365=head1 Unicode Support
12366
9f4817db
JH
12367=for apidoc sv_recode_to_utf8
12368
5d170f3a
JH
12369The encoding is assumed to be an Encode object, on entry the PV
12370of the sv is assumed to be octets in that encoding, and the sv
12371will be converted into Unicode (and UTF-8).
9f4817db 12372
5d170f3a
JH
12373If the sv already is UTF-8 (or if it is not POK), or if the encoding
12374is not a reference, nothing is done to the sv. If the encoding is not
1768d7eb
JH
12375an C<Encode::XS> Encoding object, bad things will happen.
12376(See F<lib/encoding.pm> and L<Encode>).
9f4817db 12377
5d170f3a 12378The PV of the sv is returned.
9f4817db 12379
5d170f3a
JH
12380=cut */
12381
12382char *
12383Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
12384{
27da23d5 12385 dVAR;
220e2d4e 12386 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
d0063567
DK
12387 SV *uni;
12388 STRLEN len;
12389 char *s;
12390 dSP;
12391 ENTER;
12392 SAVETMPS;
220e2d4e 12393 save_re_context();
d0063567
DK
12394 PUSHMARK(sp);
12395 EXTEND(SP, 3);
12396 XPUSHs(encoding);
12397 XPUSHs(sv);
7a5fa8a2 12398/*
f9893866
NIS
12399 NI-S 2002/07/09
12400 Passing sv_yes is wrong - it needs to be or'ed set of constants
7a5fa8a2 12401 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
f9893866
NIS
12402 remove converted chars from source.
12403
12404 Both will default the value - let them.
7a5fa8a2 12405
d0063567 12406 XPUSHs(&PL_sv_yes);
f9893866 12407*/
d0063567
DK
12408 PUTBACK;
12409 call_method("decode", G_SCALAR);
12410 SPAGAIN;
12411 uni = POPs;
12412 PUTBACK;
12413 s = SvPV(uni, len);
3f7c398e 12414 if (s != SvPVX_const(sv)) {
d0063567 12415 SvGROW(sv, len + 1);
3f7c398e 12416 Move(s, SvPVX_const(sv), len, char);
d0063567
DK
12417 SvCUR_set(sv, len);
12418 SvPVX(sv)[len] = 0;
12419 }
12420 FREETMPS;
12421 LEAVE;
d0063567 12422 SvUTF8_on(sv);
95899a2a 12423 return SvPVX(sv);
f9893866 12424 }
95899a2a 12425 return SvPOKp(sv) ? SvPVX(sv) : NULL;
9f4817db
JH
12426}
12427
220e2d4e
IH
12428/*
12429=for apidoc sv_cat_decode
12430
12431The encoding is assumed to be an Encode object, the PV of the ssv is
12432assumed to be octets in that encoding and decoding the input starts
12433from the position which (PV + *offset) pointed to. The dsv will be
12434concatenated the decoded UTF-8 string from ssv. Decoding will terminate
12435when the string tstr appears in decoding output or the input ends on
12436the PV of the ssv. The value which the offset points will be modified
12437to the last input position on the ssv.
68795e93 12438
220e2d4e
IH
12439Returns TRUE if the terminator was found, else returns FALSE.
12440
12441=cut */
12442
12443bool
12444Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
12445 SV *ssv, int *offset, char *tstr, int tlen)
12446{
27da23d5 12447 dVAR;
a73e8557 12448 bool ret = FALSE;
220e2d4e 12449 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
220e2d4e
IH
12450 SV *offsv;
12451 dSP;
12452 ENTER;
12453 SAVETMPS;
12454 save_re_context();
12455 PUSHMARK(sp);
12456 EXTEND(SP, 6);
12457 XPUSHs(encoding);
12458 XPUSHs(dsv);
12459 XPUSHs(ssv);
12460 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
12461 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
12462 PUTBACK;
12463 call_method("cat_decode", G_SCALAR);
12464 SPAGAIN;
12465 ret = SvTRUE(TOPs);
12466 *offset = SvIV(offsv);
12467 PUTBACK;
12468 FREETMPS;
12469 LEAVE;
220e2d4e 12470 }
a73e8557
JH
12471 else
12472 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
12473 return ret;
220e2d4e 12474}
f9893866 12475
241d1a3b
NC
12476/*
12477 * Local variables:
12478 * c-indentation-style: bsd
12479 * c-basic-offset: 4
12480 * indent-tabs-mode: t
12481 * End:
12482 *
37442d52
RGS
12483 * ex: set ts=8 sts=4 sw=4 noet:
12484 */