This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update XS code to declare PERL_UNUSED_DECL conditionally
[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;
612f20c3 526 XPV *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))
1edc1566 537 Safefree((void *)sva);
4633a7c4 538 }
5f05dabc 539
612f20c3
GS
540 for (arena = PL_xiv_arenaroot; arena; arena = arenanext) {
541 arenanext = (XPV*)arena->xpv_pv;
542 Safefree(arena);
543 }
544 PL_xiv_arenaroot = 0;
bf9cdc68 545 PL_xiv_root = 0;
612f20c3
GS
546
547 for (arena = PL_xnv_arenaroot; arena; arena = arenanext) {
548 arenanext = (XPV*)arena->xpv_pv;
549 Safefree(arena);
550 }
551 PL_xnv_arenaroot = 0;
bf9cdc68 552 PL_xnv_root = 0;
612f20c3
GS
553
554 for (arena = PL_xrv_arenaroot; arena; arena = arenanext) {
555 arenanext = (XPV*)arena->xpv_pv;
556 Safefree(arena);
557 }
558 PL_xrv_arenaroot = 0;
bf9cdc68 559 PL_xrv_root = 0;
612f20c3
GS
560
561 for (arena = PL_xpv_arenaroot; arena; arena = arenanext) {
562 arenanext = (XPV*)arena->xpv_pv;
563 Safefree(arena);
564 }
565 PL_xpv_arenaroot = 0;
bf9cdc68 566 PL_xpv_root = 0;
612f20c3
GS
567
568 for (arena = (XPV*)PL_xpviv_arenaroot; arena; arena = arenanext) {
569 arenanext = (XPV*)arena->xpv_pv;
570 Safefree(arena);
571 }
572 PL_xpviv_arenaroot = 0;
bf9cdc68 573 PL_xpviv_root = 0;
612f20c3
GS
574
575 for (arena = (XPV*)PL_xpvnv_arenaroot; arena; arena = arenanext) {
576 arenanext = (XPV*)arena->xpv_pv;
577 Safefree(arena);
578 }
579 PL_xpvnv_arenaroot = 0;
bf9cdc68 580 PL_xpvnv_root = 0;
612f20c3
GS
581
582 for (arena = (XPV*)PL_xpvcv_arenaroot; arena; arena = arenanext) {
583 arenanext = (XPV*)arena->xpv_pv;
584 Safefree(arena);
585 }
586 PL_xpvcv_arenaroot = 0;
bf9cdc68 587 PL_xpvcv_root = 0;
612f20c3
GS
588
589 for (arena = (XPV*)PL_xpvav_arenaroot; arena; arena = arenanext) {
590 arenanext = (XPV*)arena->xpv_pv;
591 Safefree(arena);
592 }
593 PL_xpvav_arenaroot = 0;
bf9cdc68 594 PL_xpvav_root = 0;
612f20c3
GS
595
596 for (arena = (XPV*)PL_xpvhv_arenaroot; arena; arena = arenanext) {
597 arenanext = (XPV*)arena->xpv_pv;
598 Safefree(arena);
599 }
600 PL_xpvhv_arenaroot = 0;
bf9cdc68 601 PL_xpvhv_root = 0;
612f20c3
GS
602
603 for (arena = (XPV*)PL_xpvmg_arenaroot; arena; arena = arenanext) {
604 arenanext = (XPV*)arena->xpv_pv;
605 Safefree(arena);
606 }
607 PL_xpvmg_arenaroot = 0;
bf9cdc68 608 PL_xpvmg_root = 0;
612f20c3 609
727879eb
NC
610 for (arena = (XPV*)PL_xpvgv_arenaroot; arena; arena = arenanext) {
611 arenanext = (XPV*)arena->xpv_pv;
612 Safefree(arena);
613 }
614 PL_xpvgv_arenaroot = 0;
615 PL_xpvgv_root = 0;
616
612f20c3
GS
617 for (arena = (XPV*)PL_xpvlv_arenaroot; arena; arena = arenanext) {
618 arenanext = (XPV*)arena->xpv_pv;
619 Safefree(arena);
620 }
621 PL_xpvlv_arenaroot = 0;
bf9cdc68 622 PL_xpvlv_root = 0;
612f20c3
GS
623
624 for (arena = (XPV*)PL_xpvbm_arenaroot; arena; arena = arenanext) {
625 arenanext = (XPV*)arena->xpv_pv;
626 Safefree(arena);
627 }
628 PL_xpvbm_arenaroot = 0;
bf9cdc68 629 PL_xpvbm_root = 0;
612f20c3 630
b1135e3d
NC
631 {
632 HE *he;
633 HE *he_next;
634 for (he = PL_he_arenaroot; he; he = he_next) {
635 he_next = HeNEXT(he);
636 Safefree(he);
637 }
612f20c3
GS
638 }
639 PL_he_arenaroot = 0;
bf9cdc68 640 PL_he_root = 0;
612f20c3 641
892b45be 642#if defined(USE_ITHREADS)
b1135e3d
NC
643 {
644 struct ptr_tbl_ent *pte;
645 struct ptr_tbl_ent *pte_next;
646 for (pte = PL_pte_arenaroot; pte; pte = pte_next) {
647 pte_next = pte->next;
648 Safefree(pte);
649 }
32e691d0
NC
650 }
651 PL_pte_arenaroot = 0;
652 PL_pte_root = 0;
892b45be 653#endif
32e691d0 654
3280af22
NIS
655 if (PL_nice_chunk)
656 Safefree(PL_nice_chunk);
657 PL_nice_chunk = Nullch;
658 PL_nice_chunk_size = 0;
659 PL_sv_arenaroot = 0;
660 PL_sv_root = 0;
4633a7c4
LW
661}
662
29489e7c
DM
663/* ---------------------------------------------------------------------
664 *
665 * support functions for report_uninit()
666 */
667
668/* the maxiumum size of array or hash where we will scan looking
669 * for the undefined element that triggered the warning */
670
671#define FUV_MAX_SEARCH_SIZE 1000
672
673/* Look for an entry in the hash whose value has the same SV as val;
674 * If so, return a mortal copy of the key. */
675
676STATIC SV*
677S_find_hash_subscript(pTHX_ HV *hv, SV* val)
678{
27da23d5 679 dVAR;
29489e7c 680 register HE **array;
29489e7c
DM
681 I32 i;
682
683 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
684 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
685 return Nullsv;
686
687 array = HvARRAY(hv);
688
689 for (i=HvMAX(hv); i>0; i--) {
f54cb97a 690 register HE *entry;
29489e7c
DM
691 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
692 if (HeVAL(entry) != val)
693 continue;
694 if ( HeVAL(entry) == &PL_sv_undef ||
695 HeVAL(entry) == &PL_sv_placeholder)
696 continue;
697 if (!HeKEY(entry))
698 return Nullsv;
699 if (HeKLEN(entry) == HEf_SVKEY)
700 return sv_mortalcopy(HeKEY_sv(entry));
701 return sv_2mortal(newSVpvn(HeKEY(entry), HeKLEN(entry)));
702 }
703 }
704 return Nullsv;
705}
706
707/* Look for an entry in the array whose value has the same SV as val;
708 * If so, return the index, otherwise return -1. */
709
710STATIC I32
711S_find_array_subscript(pTHX_ AV *av, SV* val)
712{
713 SV** svp;
714 I32 i;
715 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
716 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
717 return -1;
718
719 svp = AvARRAY(av);
720 for (i=AvFILLp(av); i>=0; i--) {
721 if (svp[i] == val && svp[i] != &PL_sv_undef)
722 return i;
723 }
724 return -1;
725}
726
727/* S_varname(): return the name of a variable, optionally with a subscript.
728 * If gv is non-zero, use the name of that global, along with gvtype (one
729 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
730 * targ. Depending on the value of the subscript_type flag, return:
731 */
732
733#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
734#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
735#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
736#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
737
738STATIC SV*
bfed75c6 739S_varname(pTHX_ GV *gv, const char *gvtype, PADOFFSET targ,
29489e7c
DM
740 SV* keyname, I32 aindex, int subscript_type)
741{
742 AV *av;
a3b680e6 743 SV *sv;
29489e7c 744
a3b680e6 745 SV * const name = sv_newmortal();
29489e7c
DM
746 if (gv) {
747
748 /* simulate gv_fullname4(), but add literal '^' for $^FOO names
749 * XXX get rid of all this if gv_fullnameX() ever supports this
750 * directly */
751
bfed75c6 752 const char *p;
29489e7c
DM
753 HV *hv = GvSTASH(gv);
754 sv_setpv(name, gvtype);
755 if (!hv)
756 p = "???";
bfed75c6 757 else if (!(p=HvNAME(hv)))
29489e7c 758 p = "__ANON__";
29489e7c
DM
759 if (strNE(p, "main")) {
760 sv_catpv(name,p);
761 sv_catpvn(name,"::", 2);
762 }
763 if (GvNAMELEN(gv)>= 1 &&
764 ((unsigned int)*GvNAME(gv)) <= 26)
765 { /* handle $^FOO */
766 Perl_sv_catpvf(aTHX_ name,"^%c", *GvNAME(gv) + 'A' - 1);
767 sv_catpvn(name,GvNAME(gv)+1,GvNAMELEN(gv)-1);
768 }
769 else
770 sv_catpvn(name,GvNAME(gv),GvNAMELEN(gv));
771 }
772 else {
773 U32 u;
774 CV *cv = find_runcv(&u);
775 if (!cv || !CvPADLIST(cv))
776 return Nullsv;;
777 av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
778 sv = *av_fetch(av, targ, FALSE);
779 /* SvLEN in a pad name is not to be trusted */
780 sv_setpv(name, SvPV_nolen(sv));
781 }
782
783 if (subscript_type == FUV_SUBSCRIPT_HASH) {
784 *SvPVX(name) = '$';
785 sv = NEWSV(0,0);
786 Perl_sv_catpvf(aTHX_ name, "{%s}",
787 pv_display(sv,SvPVX(keyname), SvCUR(keyname), 0, 32));
788 SvREFCNT_dec(sv);
789 }
790 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
791 *SvPVX(name) = '$';
265a12b8 792 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
29489e7c
DM
793 }
794 else if (subscript_type == FUV_SUBSCRIPT_WITHIN)
795 sv_insert(name, 0, 0, "within ", 7);
796
797 return name;
798}
799
800
801/*
802=for apidoc find_uninit_var
803
804Find the name of the undefined variable (if any) that caused the operator o
805to issue a "Use of uninitialized value" warning.
806If match is true, only return a name if it's value matches uninit_sv.
807So roughly speaking, if a unary operator (such as OP_COS) generates a
808warning, then following the direct child of the op may yield an
809OP_PADSV or OP_GV that gives the name of the undefined variable. On the
810other hand, with OP_ADD there are two branches to follow, so we only print
811the variable name if we get an exact match.
812
813The name is returned as a mortal SV.
814
815Assumes that PL_op is the op that originally triggered the error, and that
816PL_comppad/PL_curpad points to the currently executing pad.
817
818=cut
819*/
820
821STATIC SV *
822S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
823{
27da23d5 824 dVAR;
29489e7c
DM
825 SV *sv;
826 AV *av;
827 SV **svp;
828 GV *gv;
829 OP *o, *o2, *kid;
830
831 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
832 uninit_sv == &PL_sv_placeholder)))
833 return Nullsv;
834
835 switch (obase->op_type) {
836
837 case OP_RV2AV:
838 case OP_RV2HV:
839 case OP_PADAV:
840 case OP_PADHV:
841 {
f54cb97a
AL
842 const bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
843 const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
112dcc46
RGS
844 I32 index = 0;
845 SV *keysv = Nullsv;
29489e7c
DM
846 int subscript_type = FUV_SUBSCRIPT_WITHIN;
847
848 if (pad) { /* @lex, %lex */
849 sv = PAD_SVl(obase->op_targ);
850 gv = Nullgv;
851 }
852 else {
853 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
854 /* @global, %global */
855 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
856 if (!gv)
857 break;
858 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
859 }
860 else /* @{expr}, %{expr} */
861 return find_uninit_var(cUNOPx(obase)->op_first,
862 uninit_sv, match);
863 }
864
865 /* attempt to find a match within the aggregate */
866 if (hash) {
867 keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
868 if (keysv)
869 subscript_type = FUV_SUBSCRIPT_HASH;
870 }
871 else {
872 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
873 if (index >= 0)
874 subscript_type = FUV_SUBSCRIPT_ARRAY;
875 }
876
877 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
878 break;
879
880 return S_varname(aTHX_ gv, hash ? "%" : "@", obase->op_targ,
881 keysv, index, subscript_type);
882 }
883
884 case OP_PADSV:
885 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
886 break;
887 return S_varname(aTHX_ Nullgv, "$", obase->op_targ,
888 Nullsv, 0, FUV_SUBSCRIPT_NONE);
889
890 case OP_GVSV:
891 gv = cGVOPx_gv(obase);
892 if (!gv || (match && GvSV(gv) != uninit_sv))
893 break;
894 return S_varname(aTHX_ gv, "$", 0, Nullsv, 0, FUV_SUBSCRIPT_NONE);
895
896 case OP_AELEMFAST:
897 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
898 if (match) {
899 av = (AV*)PAD_SV(obase->op_targ);
900 if (!av || SvRMAGICAL(av))
901 break;
902 svp = av_fetch(av, (I32)obase->op_private, FALSE);
903 if (!svp || *svp != uninit_sv)
904 break;
905 }
906 return S_varname(aTHX_ Nullgv, "$", obase->op_targ,
907 Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
908 }
909 else {
910 gv = cGVOPx_gv(obase);
911 if (!gv)
912 break;
913 if (match) {
914 av = GvAV(gv);
915 if (!av || SvRMAGICAL(av))
916 break;
917 svp = av_fetch(av, (I32)obase->op_private, FALSE);
918 if (!svp || *svp != uninit_sv)
919 break;
920 }
921 return S_varname(aTHX_ gv, "$", 0,
922 Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
923 }
924 break;
925
926 case OP_EXISTS:
927 o = cUNOPx(obase)->op_first;
928 if (!o || o->op_type != OP_NULL ||
929 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
930 break;
931 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
932
933 case OP_AELEM:
934 case OP_HELEM:
935 if (PL_op == obase)
936 /* $a[uninit_expr] or $h{uninit_expr} */
937 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
938
939 gv = Nullgv;
940 o = cBINOPx(obase)->op_first;
941 kid = cBINOPx(obase)->op_last;
942
943 /* get the av or hv, and optionally the gv */
944 sv = Nullsv;
945 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
946 sv = PAD_SV(o->op_targ);
947 }
948 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
949 && cUNOPo->op_first->op_type == OP_GV)
950 {
951 gv = cGVOPx_gv(cUNOPo->op_first);
952 if (!gv)
953 break;
954 sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
955 }
956 if (!sv)
957 break;
958
959 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
960 /* index is constant */
961 if (match) {
962 if (SvMAGICAL(sv))
963 break;
964 if (obase->op_type == OP_HELEM) {
965 HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
966 if (!he || HeVAL(he) != uninit_sv)
967 break;
968 }
969 else {
970 svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
971 if (!svp || *svp != uninit_sv)
972 break;
973 }
974 }
975 if (obase->op_type == OP_HELEM)
976 return S_varname(aTHX_ gv, "%", o->op_targ,
977 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
978 else
979 return S_varname(aTHX_ gv, "@", o->op_targ, Nullsv,
980 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
981 ;
982 }
983 else {
984 /* index is an expression;
985 * attempt to find a match within the aggregate */
986 if (obase->op_type == OP_HELEM) {
987 SV *keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
988 if (keysv)
989 return S_varname(aTHX_ gv, "%", o->op_targ,
990 keysv, 0, FUV_SUBSCRIPT_HASH);
991 }
992 else {
f54cb97a 993 const I32 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
29489e7c 994 if (index >= 0)
f54cb97a 995 return S_varname(aTHX_ gv, "@", o->op_targ,
29489e7c
DM
996 Nullsv, index, FUV_SUBSCRIPT_ARRAY);
997 }
998 if (match)
999 break;
1000 return S_varname(aTHX_ gv,
1001 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
1002 ? "@" : "%",
1003 o->op_targ, Nullsv, 0, FUV_SUBSCRIPT_WITHIN);
1004 }
1005
1006 break;
1007
1008 case OP_AASSIGN:
1009 /* only examine RHS */
1010 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
1011
1012 case OP_OPEN:
1013 o = cUNOPx(obase)->op_first;
1014 if (o->op_type == OP_PUSHMARK)
1015 o = o->op_sibling;
1016
1017 if (!o->op_sibling) {
1018 /* one-arg version of open is highly magical */
1019
1020 if (o->op_type == OP_GV) { /* open FOO; */
1021 gv = cGVOPx_gv(o);
1022 if (match && GvSV(gv) != uninit_sv)
1023 break;
7a5fa8a2 1024 return S_varname(aTHX_ gv, "$", 0,
29489e7c
DM
1025 Nullsv, 0, FUV_SUBSCRIPT_NONE);
1026 }
1027 /* other possibilities not handled are:
1028 * open $x; or open my $x; should return '${*$x}'
1029 * open expr; should return '$'.expr ideally
1030 */
1031 break;
1032 }
1033 goto do_op;
1034
1035 /* ops where $_ may be an implicit arg */
1036 case OP_TRANS:
1037 case OP_SUBST:
1038 case OP_MATCH:
1039 if ( !(obase->op_flags & OPf_STACKED)) {
1040 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
1041 ? PAD_SVl(obase->op_targ)
1042 : DEFSV))
1043 {
1044 sv = sv_newmortal();
1045 sv_setpv(sv, "$_");
1046 return sv;
1047 }
1048 }
1049 goto do_op;
1050
1051 case OP_PRTF:
1052 case OP_PRINT:
1053 /* skip filehandle as it can't produce 'undef' warning */
1054 o = cUNOPx(obase)->op_first;
1055 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
1056 o = o->op_sibling->op_sibling;
1057 goto do_op2;
1058
1059
e21bd382 1060 case OP_RV2SV:
29489e7c
DM
1061 case OP_CUSTOM:
1062 case OP_ENTERSUB:
1063 match = 1; /* XS or custom code could trigger random warnings */
1064 goto do_op;
1065
1066 case OP_SCHOMP:
1067 case OP_CHOMP:
1068 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
1069 return sv_2mortal(newSVpv("${$/}", 0));
1070 /* FALL THROUGH */
1071
1072 default:
1073 do_op:
1074 if (!(obase->op_flags & OPf_KIDS))
1075 break;
1076 o = cUNOPx(obase)->op_first;
1077
1078 do_op2:
1079 if (!o)
1080 break;
1081
1082 /* if all except one arg are constant, or have no side-effects,
1083 * or are optimized away, then it's unambiguous */
1084 o2 = Nullop;
1085 for (kid=o; kid; kid = kid->op_sibling) {
1086 if (kid &&
1087 ( (kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid)))
1088 || (kid->op_type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
1089 || (kid->op_type == OP_PUSHMARK)
1090 )
1091 )
1092 continue;
1093 if (o2) { /* more than one found */
1094 o2 = Nullop;
1095 break;
1096 }
1097 o2 = kid;
1098 }
1099 if (o2)
1100 return find_uninit_var(o2, uninit_sv, match);
1101
1102 /* scan all args */
1103 while (o) {
1104 sv = find_uninit_var(o, uninit_sv, 1);
1105 if (sv)
1106 return sv;
1107 o = o->op_sibling;
1108 }
1109 break;
1110 }
1111 return Nullsv;
1112}
1113
1114
645c22ef
DM
1115/*
1116=for apidoc report_uninit
1117
1118Print appropriate "Use of uninitialized variable" warning
1119
1120=cut
1121*/
1122
1d7c1841 1123void
29489e7c
DM
1124Perl_report_uninit(pTHX_ SV* uninit_sv)
1125{
1126 if (PL_op) {
112dcc46 1127 SV* varname = Nullsv;
29489e7c
DM
1128 if (uninit_sv) {
1129 varname = find_uninit_var(PL_op, uninit_sv,0);
1130 if (varname)
1131 sv_insert(varname, 0, 0, " ", 1);
1132 }
9014280d 1133 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
29489e7c
DM
1134 varname ? SvPV_nolen(varname) : "",
1135 " in ", OP_DESC(PL_op));
1136 }
1d7c1841 1137 else
29489e7c
DM
1138 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
1139 "", "", "");
1d7c1841
GS
1140}
1141
645c22ef 1142
cac9b346 1143/* allocate another arena's worth of struct xrv */
645c22ef 1144
76e3520e 1145STATIC void
cac9b346 1146S_more_xrv(pTHX)
463ee0b2 1147{
cac9b346
NC
1148 XRV* xrv;
1149 XRV* xrvend;
1150 XPV *ptr;
1151 New(712, ptr, PERL_ARENA_SIZE/sizeof(XPV), XPV);
1152 ptr->xpv_pv = (char*)PL_xrv_arenaroot;
1153 PL_xrv_arenaroot = ptr;
1154
1155 xrv = (XRV*) ptr;
1156 xrvend = &xrv[PERL_ARENA_SIZE / sizeof(XRV) - 1];
1157 xrv += (sizeof(XPV) - 1) / sizeof(XRV) + 1;
1158 PL_xrv_root = xrv;
1159 while (xrv < xrvend) {
1160 xrv->xrv_rv = (SV*)(xrv + 1);
1161 xrv++;
1162 }
1163 xrv->xrv_rv = 0;
463ee0b2
LW
1164}
1165
645c22ef
DM
1166/* allocate another arena's worth of IV bodies */
1167
cbe51380 1168STATIC void
cea2e8a9 1169S_more_xiv(pTHX)
463ee0b2 1170{
cac9b346
NC
1171 IV* xiv;
1172 IV* xivend;
8c52afec 1173 XPV* ptr;
9c17f24a 1174 New(705, ptr, PERL_ARENA_SIZE/sizeof(XPV), XPV);
645c22ef 1175 ptr->xpv_pv = (char*)PL_xiv_arenaroot; /* linked list of xiv arenas */
3280af22 1176 PL_xiv_arenaroot = ptr; /* to keep Purify happy */
a0d0e21e 1177
ea7c11a3 1178 xiv = (IV*) ptr;
9c17f24a 1179 xivend = &xiv[PERL_ARENA_SIZE / sizeof(IV) - 1];
645c22ef 1180 xiv += (sizeof(XPV) - 1) / sizeof(IV) + 1; /* fudge by size of XPV */
3280af22 1181 PL_xiv_root = xiv;
463ee0b2 1182 while (xiv < xivend) {
ea7c11a3 1183 *(IV**)xiv = (IV *)(xiv + 1);
463ee0b2
LW
1184 xiv++;
1185 }
ea7c11a3 1186 *(IV**)xiv = 0;
463ee0b2
LW
1187}
1188
645c22ef
DM
1189/* allocate another arena's worth of NV bodies */
1190
cbe51380 1191STATIC void
cea2e8a9 1192S_more_xnv(pTHX)
463ee0b2 1193{
cac9b346
NC
1194 NV* xnv;
1195 NV* xnvend;
612f20c3 1196 XPV *ptr;
9c17f24a 1197 New(711, ptr, PERL_ARENA_SIZE/sizeof(XPV), XPV);
612f20c3
GS
1198 ptr->xpv_pv = (char*)PL_xnv_arenaroot;
1199 PL_xnv_arenaroot = ptr;
1200
1201 xnv = (NV*) ptr;
9c17f24a 1202 xnvend = &xnv[PERL_ARENA_SIZE / sizeof(NV) - 1];
65202027 1203 xnv += (sizeof(XPVIV) - 1) / sizeof(NV) + 1; /* fudge by sizeof XPVIV */
3280af22 1204 PL_xnv_root = xnv;
463ee0b2 1205 while (xnv < xnvend) {
65202027 1206 *(NV**)xnv = (NV*)(xnv + 1);
463ee0b2
LW
1207 xnv++;
1208 }
cac9b346
NC
1209 *(NV**)xnv = 0;
1210}
1211
1212/* allocate another arena's worth of struct xpv */
1213
1214STATIC void
1215S_more_xpv(pTHX)
1216{
1217 XPV* xpv;
1218 XPV* xpvend;
1219 New(713, xpv, PERL_ARENA_SIZE/sizeof(XPV), XPV);
1220 xpv->xpv_pv = (char*)PL_xpv_arenaroot;
1221 PL_xpv_arenaroot = xpv;
1222
1223 xpvend = &xpv[PERL_ARENA_SIZE / sizeof(XPV) - 1];
1224 PL_xpv_root = ++xpv;
1225 while (xpv < xpvend) {
1226 xpv->xpv_pv = (char*)(xpv + 1);
1227 xpv++;
1228 }
1229 xpv->xpv_pv = 0;
1230}
1231
1232/* allocate another arena's worth of struct xpviv */
1233
1234STATIC void
1235S_more_xpviv(pTHX)
1236{
1237 XPVIV* xpviv;
1238 XPVIV* xpvivend;
1239 New(714, xpviv, PERL_ARENA_SIZE/sizeof(XPVIV), XPVIV);
1240 xpviv->xpv_pv = (char*)PL_xpviv_arenaroot;
1241 PL_xpviv_arenaroot = xpviv;
1242
1243 xpvivend = &xpviv[PERL_ARENA_SIZE / sizeof(XPVIV) - 1];
1244 PL_xpviv_root = ++xpviv;
1245 while (xpviv < xpvivend) {
1246 xpviv->xpv_pv = (char*)(xpviv + 1);
1247 xpviv++;
1248 }
1249 xpviv->xpv_pv = 0;
1250}
1251
1252/* allocate another arena's worth of struct xpvnv */
1253
1254STATIC void
1255S_more_xpvnv(pTHX)
1256{
1257 XPVNV* xpvnv;
1258 XPVNV* xpvnvend;
1259 New(715, xpvnv, PERL_ARENA_SIZE/sizeof(XPVNV), XPVNV);
1260 xpvnv->xpv_pv = (char*)PL_xpvnv_arenaroot;
1261 PL_xpvnv_arenaroot = xpvnv;
1262
1263 xpvnvend = &xpvnv[PERL_ARENA_SIZE / sizeof(XPVNV) - 1];
1264 PL_xpvnv_root = ++xpvnv;
1265 while (xpvnv < xpvnvend) {
1266 xpvnv->xpv_pv = (char*)(xpvnv + 1);
1267 xpvnv++;
1268 }
1269 xpvnv->xpv_pv = 0;
1270}
1271
1272/* allocate another arena's worth of struct xpvcv */
1273
1274STATIC void
1275S_more_xpvcv(pTHX)
1276{
1277 XPVCV* xpvcv;
1278 XPVCV* xpvcvend;
1279 New(716, xpvcv, PERL_ARENA_SIZE/sizeof(XPVCV), XPVCV);
1280 xpvcv->xpv_pv = (char*)PL_xpvcv_arenaroot;
1281 PL_xpvcv_arenaroot = xpvcv;
1282
1283 xpvcvend = &xpvcv[PERL_ARENA_SIZE / sizeof(XPVCV) - 1];
1284 PL_xpvcv_root = ++xpvcv;
1285 while (xpvcv < xpvcvend) {
1286 xpvcv->xpv_pv = (char*)(xpvcv + 1);
1287 xpvcv++;
1288 }
1289 xpvcv->xpv_pv = 0;
1290}
1291
1292/* allocate another arena's worth of struct xpvav */
1293
1294STATIC void
1295S_more_xpvav(pTHX)
1296{
1297 XPVAV* xpvav;
1298 XPVAV* xpvavend;
1299 New(717, xpvav, PERL_ARENA_SIZE/sizeof(XPVAV), XPVAV);
1300 xpvav->xav_array = (char*)PL_xpvav_arenaroot;
1301 PL_xpvav_arenaroot = xpvav;
1302
1303 xpvavend = &xpvav[PERL_ARENA_SIZE / sizeof(XPVAV) - 1];
1304 PL_xpvav_root = ++xpvav;
1305 while (xpvav < xpvavend) {
1306 xpvav->xav_array = (char*)(xpvav + 1);
1307 xpvav++;
1308 }
1309 xpvav->xav_array = 0;
1310}
1311
1312/* allocate another arena's worth of struct xpvhv */
1313
1314STATIC void
1315S_more_xpvhv(pTHX)
1316{
1317 XPVHV* xpvhv;
1318 XPVHV* xpvhvend;
1319 New(718, xpvhv, PERL_ARENA_SIZE/sizeof(XPVHV), XPVHV);
1320 xpvhv->xhv_array = (char*)PL_xpvhv_arenaroot;
1321 PL_xpvhv_arenaroot = xpvhv;
1322
1323 xpvhvend = &xpvhv[PERL_ARENA_SIZE / sizeof(XPVHV) - 1];
1324 PL_xpvhv_root = ++xpvhv;
1325 while (xpvhv < xpvhvend) {
1326 xpvhv->xhv_array = (char*)(xpvhv + 1);
1327 xpvhv++;
1328 }
1329 xpvhv->xhv_array = 0;
1330}
1331
1332/* allocate another arena's worth of struct xpvmg */
1333
1334STATIC void
1335S_more_xpvmg(pTHX)
1336{
1337 XPVMG* xpvmg;
1338 XPVMG* xpvmgend;
1339 New(719, xpvmg, PERL_ARENA_SIZE/sizeof(XPVMG), XPVMG);
1340 xpvmg->xpv_pv = (char*)PL_xpvmg_arenaroot;
1341 PL_xpvmg_arenaroot = xpvmg;
1342
1343 xpvmgend = &xpvmg[PERL_ARENA_SIZE / sizeof(XPVMG) - 1];
1344 PL_xpvmg_root = ++xpvmg;
1345 while (xpvmg < xpvmgend) {
1346 xpvmg->xpv_pv = (char*)(xpvmg + 1);
1347 xpvmg++;
1348 }
1349 xpvmg->xpv_pv = 0;
1350}
1351
1352/* allocate another arena's worth of struct xpvgv */
1353
1354STATIC void
1355S_more_xpvgv(pTHX)
1356{
1357 XPVGV* xpvgv;
1358 XPVGV* xpvgvend;
1359 New(720, xpvgv, PERL_ARENA_SIZE/sizeof(XPVGV), XPVGV);
1360 xpvgv->xpv_pv = (char*)PL_xpvgv_arenaroot;
1361 PL_xpvgv_arenaroot = xpvgv;
1362
1363 xpvgvend = &xpvgv[PERL_ARENA_SIZE / sizeof(XPVGV) - 1];
1364 PL_xpvgv_root = ++xpvgv;
1365 while (xpvgv < xpvgvend) {
1366 xpvgv->xpv_pv = (char*)(xpvgv + 1);
1367 xpvgv++;
1368 }
1369 xpvgv->xpv_pv = 0;
1370}
1371
1372/* allocate another arena's worth of struct xpvlv */
1373
1374STATIC void
1375S_more_xpvlv(pTHX)
1376{
1377 XPVLV* xpvlv;
1378 XPVLV* xpvlvend;
1379 New(720, xpvlv, PERL_ARENA_SIZE/sizeof(XPVLV), XPVLV);
1380 xpvlv->xpv_pv = (char*)PL_xpvlv_arenaroot;
1381 PL_xpvlv_arenaroot = xpvlv;
1382
1383 xpvlvend = &xpvlv[PERL_ARENA_SIZE / sizeof(XPVLV) - 1];
1384 PL_xpvlv_root = ++xpvlv;
1385 while (xpvlv < xpvlvend) {
1386 xpvlv->xpv_pv = (char*)(xpvlv + 1);
1387 xpvlv++;
1388 }
1389 xpvlv->xpv_pv = 0;
1390}
1391
1392/* allocate another arena's worth of struct xpvbm */
1393
1394STATIC void
1395S_more_xpvbm(pTHX)
1396{
1397 XPVBM* xpvbm;
1398 XPVBM* xpvbmend;
1399 New(721, xpvbm, PERL_ARENA_SIZE/sizeof(XPVBM), XPVBM);
1400 xpvbm->xpv_pv = (char*)PL_xpvbm_arenaroot;
1401 PL_xpvbm_arenaroot = xpvbm;
1402
1403 xpvbmend = &xpvbm[PERL_ARENA_SIZE / sizeof(XPVBM) - 1];
1404 PL_xpvbm_root = ++xpvbm;
1405 while (xpvbm < xpvbmend) {
1406 xpvbm->xpv_pv = (char*)(xpvbm + 1);
1407 xpvbm++;
1408 }
1409 xpvbm->xpv_pv = 0;
463ee0b2
LW
1410}
1411
645c22ef
DM
1412/* grab a new struct xrv from the free list, allocating more if necessary */
1413
76e3520e 1414STATIC XRV*
cea2e8a9 1415S_new_xrv(pTHX)
ed6116ce
LW
1416{
1417 XRV* xrv;
cbe51380
GS
1418 LOCK_SV_MUTEX;
1419 if (!PL_xrv_root)
cac9b346 1420 S_more_xrv(aTHX);
cbe51380
GS
1421 xrv = PL_xrv_root;
1422 PL_xrv_root = (XRV*)xrv->xrv_rv;
1423 UNLOCK_SV_MUTEX;
1424 return xrv;
ed6116ce
LW
1425}
1426
645c22ef
DM
1427/* return a struct xrv to the free list */
1428
76e3520e 1429STATIC void
cea2e8a9 1430S_del_xrv(pTHX_ XRV *p)
ed6116ce 1431{
cbe51380 1432 LOCK_SV_MUTEX;
3280af22
NIS
1433 p->xrv_rv = (SV*)PL_xrv_root;
1434 PL_xrv_root = p;
cbe51380 1435 UNLOCK_SV_MUTEX;
ed6116ce
LW
1436}
1437
cac9b346
NC
1438/* grab a new IV body from the free list, allocating more if necessary */
1439
1440STATIC XPVIV*
1441S_new_xiv(pTHX)
1442{
1443 IV* xiv;
1444 LOCK_SV_MUTEX;
1445 if (!PL_xiv_root)
1446 S_more_xiv(aTHX);
1447 xiv = PL_xiv_root;
1448 /*
1449 * See comment in more_xiv() -- RAM.
1450 */
1451 PL_xiv_root = *(IV**)xiv;
1452 UNLOCK_SV_MUTEX;
1453 return (XPVIV*)((char*)xiv - STRUCT_OFFSET(XPVIV, xiv_iv));
1454}
1455
1456/* return an IV body to the free list */
645c22ef 1457
cbe51380 1458STATIC void
cac9b346 1459S_del_xiv(pTHX_ XPVIV *p)
ed6116ce 1460{
cac9b346
NC
1461 IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
1462 LOCK_SV_MUTEX;
1463 *(IV**)xiv = PL_xiv_root;
1464 PL_xiv_root = xiv;
1465 UNLOCK_SV_MUTEX;
1466}
612f20c3 1467
cac9b346
NC
1468/* grab a new NV body from the free list, allocating more if necessary */
1469
1470STATIC XPVNV*
1471S_new_xnv(pTHX)
1472{
1473 NV* xnv;
1474 LOCK_SV_MUTEX;
1475 if (!PL_xnv_root)
1476 S_more_xnv(aTHX);
1477 xnv = PL_xnv_root;
1478 PL_xnv_root = *(NV**)xnv;
1479 UNLOCK_SV_MUTEX;
1480 return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
1481}
1482
1483/* return an NV body to the free list */
1484
1485STATIC void
1486S_del_xnv(pTHX_ XPVNV *p)
1487{
1488 NV* xnv = (NV*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
1489 LOCK_SV_MUTEX;
1490 *(NV**)xnv = PL_xnv_root;
1491 PL_xnv_root = xnv;
1492 UNLOCK_SV_MUTEX;
ed6116ce
LW
1493}
1494
645c22ef
DM
1495/* grab a new struct xpv from the free list, allocating more if necessary */
1496
76e3520e 1497STATIC XPV*
cea2e8a9 1498S_new_xpv(pTHX)
463ee0b2
LW
1499{
1500 XPV* xpv;
cbe51380
GS
1501 LOCK_SV_MUTEX;
1502 if (!PL_xpv_root)
cac9b346 1503 S_more_xpv(aTHX);
cbe51380
GS
1504 xpv = PL_xpv_root;
1505 PL_xpv_root = (XPV*)xpv->xpv_pv;
1506 UNLOCK_SV_MUTEX;
1507 return xpv;
463ee0b2
LW
1508}
1509
645c22ef
DM
1510/* return a struct xpv to the free list */
1511
76e3520e 1512STATIC void
cea2e8a9 1513S_del_xpv(pTHX_ XPV *p)
463ee0b2 1514{
cbe51380 1515 LOCK_SV_MUTEX;
3280af22
NIS
1516 p->xpv_pv = (char*)PL_xpv_root;
1517 PL_xpv_root = p;
cbe51380 1518 UNLOCK_SV_MUTEX;
463ee0b2
LW
1519}
1520
645c22ef
DM
1521/* grab a new struct xpviv from the free list, allocating more if necessary */
1522
932e9ff9
VB
1523STATIC XPVIV*
1524S_new_xpviv(pTHX)
1525{
1526 XPVIV* xpviv;
1527 LOCK_SV_MUTEX;
1528 if (!PL_xpviv_root)
cac9b346 1529 S_more_xpviv(aTHX);
932e9ff9
VB
1530 xpviv = PL_xpviv_root;
1531 PL_xpviv_root = (XPVIV*)xpviv->xpv_pv;
1532 UNLOCK_SV_MUTEX;
1533 return xpviv;
1534}
1535
645c22ef
DM
1536/* return a struct xpviv to the free list */
1537
932e9ff9
VB
1538STATIC void
1539S_del_xpviv(pTHX_ XPVIV *p)
1540{
1541 LOCK_SV_MUTEX;
1542 p->xpv_pv = (char*)PL_xpviv_root;
1543 PL_xpviv_root = p;
1544 UNLOCK_SV_MUTEX;
1545}
1546
645c22ef
DM
1547/* grab a new struct xpvnv from the free list, allocating more if necessary */
1548
932e9ff9
VB
1549STATIC XPVNV*
1550S_new_xpvnv(pTHX)
1551{
1552 XPVNV* xpvnv;
1553 LOCK_SV_MUTEX;
1554 if (!PL_xpvnv_root)
cac9b346 1555 S_more_xpvnv(aTHX);
932e9ff9
VB
1556 xpvnv = PL_xpvnv_root;
1557 PL_xpvnv_root = (XPVNV*)xpvnv->xpv_pv;
1558 UNLOCK_SV_MUTEX;
1559 return xpvnv;
1560}
1561
645c22ef
DM
1562/* return a struct xpvnv to the free list */
1563
932e9ff9
VB
1564STATIC void
1565S_del_xpvnv(pTHX_ XPVNV *p)
1566{
1567 LOCK_SV_MUTEX;
1568 p->xpv_pv = (char*)PL_xpvnv_root;
1569 PL_xpvnv_root = p;
1570 UNLOCK_SV_MUTEX;
1571}
1572
645c22ef
DM
1573/* grab a new struct xpvcv from the free list, allocating more if necessary */
1574
932e9ff9
VB
1575STATIC XPVCV*
1576S_new_xpvcv(pTHX)
1577{
1578 XPVCV* xpvcv;
1579 LOCK_SV_MUTEX;
1580 if (!PL_xpvcv_root)
cac9b346 1581 S_more_xpvcv(aTHX);
932e9ff9
VB
1582 xpvcv = PL_xpvcv_root;
1583 PL_xpvcv_root = (XPVCV*)xpvcv->xpv_pv;
1584 UNLOCK_SV_MUTEX;
1585 return xpvcv;
1586}
1587
645c22ef
DM
1588/* return a struct xpvcv to the free list */
1589
932e9ff9
VB
1590STATIC void
1591S_del_xpvcv(pTHX_ XPVCV *p)
1592{
1593 LOCK_SV_MUTEX;
1594 p->xpv_pv = (char*)PL_xpvcv_root;
1595 PL_xpvcv_root = p;
1596 UNLOCK_SV_MUTEX;
1597}
1598
645c22ef
DM
1599/* grab a new struct xpvav from the free list, allocating more if necessary */
1600
932e9ff9
VB
1601STATIC XPVAV*
1602S_new_xpvav(pTHX)
1603{
1604 XPVAV* xpvav;
1605 LOCK_SV_MUTEX;
1606 if (!PL_xpvav_root)
cac9b346 1607 S_more_xpvav(aTHX);
932e9ff9
VB
1608 xpvav = PL_xpvav_root;
1609 PL_xpvav_root = (XPVAV*)xpvav->xav_array;
1610 UNLOCK_SV_MUTEX;
1611 return xpvav;
1612}
1613
645c22ef
DM
1614/* return a struct xpvav to the free list */
1615
932e9ff9
VB
1616STATIC void
1617S_del_xpvav(pTHX_ XPVAV *p)
1618{
1619 LOCK_SV_MUTEX;
1620 p->xav_array = (char*)PL_xpvav_root;
1621 PL_xpvav_root = p;
1622 UNLOCK_SV_MUTEX;
1623}
1624
645c22ef
DM
1625/* grab a new struct xpvhv from the free list, allocating more if necessary */
1626
932e9ff9
VB
1627STATIC XPVHV*
1628S_new_xpvhv(pTHX)
1629{
1630 XPVHV* xpvhv;
1631 LOCK_SV_MUTEX;
1632 if (!PL_xpvhv_root)
cac9b346 1633 S_more_xpvhv(aTHX);
932e9ff9
VB
1634 xpvhv = PL_xpvhv_root;
1635 PL_xpvhv_root = (XPVHV*)xpvhv->xhv_array;
1636 UNLOCK_SV_MUTEX;
1637 return xpvhv;
1638}
1639
645c22ef
DM
1640/* return a struct xpvhv to the free list */
1641
932e9ff9
VB
1642STATIC void
1643S_del_xpvhv(pTHX_ XPVHV *p)
1644{
1645 LOCK_SV_MUTEX;
1646 p->xhv_array = (char*)PL_xpvhv_root;
1647 PL_xpvhv_root = p;
1648 UNLOCK_SV_MUTEX;
1649}
1650
645c22ef
DM
1651/* grab a new struct xpvmg from the free list, allocating more if necessary */
1652
932e9ff9
VB
1653STATIC XPVMG*
1654S_new_xpvmg(pTHX)
1655{
1656 XPVMG* xpvmg;
1657 LOCK_SV_MUTEX;
1658 if (!PL_xpvmg_root)
cac9b346 1659 S_more_xpvmg(aTHX);
932e9ff9
VB
1660 xpvmg = PL_xpvmg_root;
1661 PL_xpvmg_root = (XPVMG*)xpvmg->xpv_pv;
1662 UNLOCK_SV_MUTEX;
1663 return xpvmg;
1664}
1665
645c22ef
DM
1666/* return a struct xpvmg to the free list */
1667
932e9ff9
VB
1668STATIC void
1669S_del_xpvmg(pTHX_ XPVMG *p)
1670{
1671 LOCK_SV_MUTEX;
1672 p->xpv_pv = (char*)PL_xpvmg_root;
1673 PL_xpvmg_root = p;
1674 UNLOCK_SV_MUTEX;
1675}
1676
727879eb
NC
1677/* grab a new struct xpvgv from the free list, allocating more if necessary */
1678
1679STATIC XPVGV*
1680S_new_xpvgv(pTHX)
1681{
1682 XPVGV* xpvgv;
1683 LOCK_SV_MUTEX;
1684 if (!PL_xpvgv_root)
cac9b346 1685 S_more_xpvgv(aTHX);
727879eb
NC
1686 xpvgv = PL_xpvgv_root;
1687 PL_xpvgv_root = (XPVGV*)xpvgv->xpv_pv;
1688 UNLOCK_SV_MUTEX;
1689 return xpvgv;
1690}
1691
1692/* return a struct xpvgv to the free list */
1693
1694STATIC void
1695S_del_xpvgv(pTHX_ XPVGV *p)
1696{
1697 LOCK_SV_MUTEX;
1698 p->xpv_pv = (char*)PL_xpvgv_root;
1699 PL_xpvgv_root = p;
1700 UNLOCK_SV_MUTEX;
1701}
1702
645c22ef
DM
1703/* grab a new struct xpvlv from the free list, allocating more if necessary */
1704
932e9ff9
VB
1705STATIC XPVLV*
1706S_new_xpvlv(pTHX)
1707{
1708 XPVLV* xpvlv;
1709 LOCK_SV_MUTEX;
1710 if (!PL_xpvlv_root)
cac9b346 1711 S_more_xpvlv(aTHX);
932e9ff9
VB
1712 xpvlv = PL_xpvlv_root;
1713 PL_xpvlv_root = (XPVLV*)xpvlv->xpv_pv;
1714 UNLOCK_SV_MUTEX;
1715 return xpvlv;
1716}
1717
645c22ef
DM
1718/* return a struct xpvlv to the free list */
1719
932e9ff9
VB
1720STATIC void
1721S_del_xpvlv(pTHX_ XPVLV *p)
1722{
1723 LOCK_SV_MUTEX;
1724 p->xpv_pv = (char*)PL_xpvlv_root;
1725 PL_xpvlv_root = p;
1726 UNLOCK_SV_MUTEX;
1727}
1728
645c22ef
DM
1729/* grab a new struct xpvbm from the free list, allocating more if necessary */
1730
932e9ff9
VB
1731STATIC XPVBM*
1732S_new_xpvbm(pTHX)
1733{
1734 XPVBM* xpvbm;
1735 LOCK_SV_MUTEX;
1736 if (!PL_xpvbm_root)
cac9b346 1737 S_more_xpvbm(aTHX);
932e9ff9
VB
1738 xpvbm = PL_xpvbm_root;
1739 PL_xpvbm_root = (XPVBM*)xpvbm->xpv_pv;
1740 UNLOCK_SV_MUTEX;
1741 return xpvbm;
1742}
1743
645c22ef
DM
1744/* return a struct xpvbm to the free list */
1745
932e9ff9
VB
1746STATIC void
1747S_del_xpvbm(pTHX_ XPVBM *p)
1748{
1749 LOCK_SV_MUTEX;
1750 p->xpv_pv = (char*)PL_xpvbm_root;
1751 PL_xpvbm_root = p;
1752 UNLOCK_SV_MUTEX;
1753}
1754
7bab3ede
MB
1755#define my_safemalloc(s) (void*)safemalloc(s)
1756#define my_safefree(p) safefree((char*)p)
463ee0b2 1757
d33b2eba 1758#ifdef PURIFY
463ee0b2 1759
d33b2eba
GS
1760#define new_XIV() my_safemalloc(sizeof(XPVIV))
1761#define del_XIV(p) my_safefree(p)
ed6116ce 1762
d33b2eba
GS
1763#define new_XNV() my_safemalloc(sizeof(XPVNV))
1764#define del_XNV(p) my_safefree(p)
463ee0b2 1765
d33b2eba
GS
1766#define new_XRV() my_safemalloc(sizeof(XRV))
1767#define del_XRV(p) my_safefree(p)
8c52afec 1768
d33b2eba
GS
1769#define new_XPV() my_safemalloc(sizeof(XPV))
1770#define del_XPV(p) my_safefree(p)
9b94d1dd 1771
d33b2eba
GS
1772#define new_XPVIV() my_safemalloc(sizeof(XPVIV))
1773#define del_XPVIV(p) my_safefree(p)
932e9ff9 1774
d33b2eba
GS
1775#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
1776#define del_XPVNV(p) my_safefree(p)
932e9ff9 1777
d33b2eba
GS
1778#define new_XPVCV() my_safemalloc(sizeof(XPVCV))
1779#define del_XPVCV(p) my_safefree(p)
932e9ff9 1780
d33b2eba
GS
1781#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
1782#define del_XPVAV(p) my_safefree(p)
1783
1784#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
1785#define del_XPVHV(p) my_safefree(p)
1c846c1f 1786
d33b2eba
GS
1787#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
1788#define del_XPVMG(p) my_safefree(p)
1789
727879eb
NC
1790#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
1791#define del_XPVGV(p) my_safefree(p)
1792
d33b2eba
GS
1793#define new_XPVLV() my_safemalloc(sizeof(XPVLV))
1794#define del_XPVLV(p) my_safefree(p)
1795
1796#define new_XPVBM() my_safemalloc(sizeof(XPVBM))
1797#define del_XPVBM(p) my_safefree(p)
1798
1799#else /* !PURIFY */
1800
1801#define new_XIV() (void*)new_xiv()
1802#define del_XIV(p) del_xiv((XPVIV*) p)
1803
1804#define new_XNV() (void*)new_xnv()
1805#define del_XNV(p) del_xnv((XPVNV*) p)
9b94d1dd 1806
d33b2eba
GS
1807#define new_XRV() (void*)new_xrv()
1808#define del_XRV(p) del_xrv((XRV*) p)
9b94d1dd 1809
d33b2eba
GS
1810#define new_XPV() (void*)new_xpv()
1811#define del_XPV(p) del_xpv((XPV *)p)
1812
1813#define new_XPVIV() (void*)new_xpviv()
1814#define del_XPVIV(p) del_xpviv((XPVIV *)p)
1815
1816#define new_XPVNV() (void*)new_xpvnv()
1817#define del_XPVNV(p) del_xpvnv((XPVNV *)p)
1818
1819#define new_XPVCV() (void*)new_xpvcv()
1820#define del_XPVCV(p) del_xpvcv((XPVCV *)p)
1821
1822#define new_XPVAV() (void*)new_xpvav()
1823#define del_XPVAV(p) del_xpvav((XPVAV *)p)
1824
1825#define new_XPVHV() (void*)new_xpvhv()
1826#define del_XPVHV(p) del_xpvhv((XPVHV *)p)
1c846c1f 1827
d33b2eba
GS
1828#define new_XPVMG() (void*)new_xpvmg()
1829#define del_XPVMG(p) del_xpvmg((XPVMG *)p)
1830
727879eb
NC
1831#define new_XPVGV() (void*)new_xpvgv()
1832#define del_XPVGV(p) del_xpvgv((XPVGV *)p)
1833
d33b2eba
GS
1834#define new_XPVLV() (void*)new_xpvlv()
1835#define del_XPVLV(p) del_xpvlv((XPVLV *)p)
1836
1837#define new_XPVBM() (void*)new_xpvbm()
1838#define del_XPVBM(p) del_xpvbm((XPVBM *)p)
1839
1840#endif /* PURIFY */
9b94d1dd 1841
d33b2eba
GS
1842#define new_XPVFM() my_safemalloc(sizeof(XPVFM))
1843#define del_XPVFM(p) my_safefree(p)
1c846c1f 1844
d33b2eba
GS
1845#define new_XPVIO() my_safemalloc(sizeof(XPVIO))
1846#define del_XPVIO(p) my_safefree(p)
8990e307 1847
954c1994
GS
1848/*
1849=for apidoc sv_upgrade
1850
ff276b08 1851Upgrade an SV to a more complex form. Generally adds a new body type to the
645c22ef 1852SV, then copies across as much information as possible from the old body.
ff276b08 1853You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
954c1994
GS
1854
1855=cut
1856*/
1857
79072805 1858bool
864dbfa3 1859Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
79072805 1860{
e763e3dc 1861
d2e56290
NC
1862 char* pv;
1863 U32 cur;
1864 U32 len;
1865 IV iv;
1866 NV nv;
1867 MAGIC* magic;
1868 HV* stash;
79072805 1869
765f542d
NC
1870 if (mt != SVt_PV && SvIsCOW(sv)) {
1871 sv_force_normal_flags(sv, 0);
f130fd45
NIS
1872 }
1873
79072805
LW
1874 if (SvTYPE(sv) == mt)
1875 return TRUE;
1876
d2e56290
NC
1877 pv = NULL;
1878 cur = 0;
1879 len = 0;
1880 iv = 0;
1881 nv = 0.0;
1882 magic = NULL;
1883 stash = Nullhv;
1884
79072805
LW
1885 switch (SvTYPE(sv)) {
1886 case SVt_NULL:
79072805 1887 break;
79072805 1888 case SVt_IV:
463ee0b2 1889 iv = SvIVX(sv);
79072805 1890 del_XIV(SvANY(sv));
ed6116ce 1891 if (mt == SVt_NV)
463ee0b2 1892 mt = SVt_PVNV;
ed6116ce
LW
1893 else if (mt < SVt_PVIV)
1894 mt = SVt_PVIV;
79072805
LW
1895 break;
1896 case SVt_NV:
463ee0b2 1897 nv = SvNVX(sv);
79072805 1898 del_XNV(SvANY(sv));
ed6116ce 1899 if (mt < SVt_PVNV)
79072805
LW
1900 mt = SVt_PVNV;
1901 break;
ed6116ce
LW
1902 case SVt_RV:
1903 pv = (char*)SvRV(sv);
ed6116ce 1904 del_XRV(SvANY(sv));
ed6116ce 1905 break;
79072805 1906 case SVt_PV:
463ee0b2 1907 pv = SvPVX(sv);
79072805
LW
1908 cur = SvCUR(sv);
1909 len = SvLEN(sv);
79072805 1910 del_XPV(SvANY(sv));
748a9306
LW
1911 if (mt <= SVt_IV)
1912 mt = SVt_PVIV;
1913 else if (mt == SVt_NV)
1914 mt = SVt_PVNV;
79072805
LW
1915 break;
1916 case SVt_PVIV:
463ee0b2 1917 pv = SvPVX(sv);
79072805
LW
1918 cur = SvCUR(sv);
1919 len = SvLEN(sv);
463ee0b2 1920 iv = SvIVX(sv);
79072805
LW
1921 del_XPVIV(SvANY(sv));
1922 break;
1923 case SVt_PVNV:
463ee0b2 1924 pv = SvPVX(sv);
79072805
LW
1925 cur = SvCUR(sv);
1926 len = SvLEN(sv);
463ee0b2
LW
1927 iv = SvIVX(sv);
1928 nv = SvNVX(sv);
79072805
LW
1929 del_XPVNV(SvANY(sv));
1930 break;
1931 case SVt_PVMG:
0ec50a73
NC
1932 /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1933 there's no way that it can be safely upgraded, because perl.c
1934 expects to Safefree(SvANY(PL_mess_sv)) */
1935 assert(sv != PL_mess_sv);
bce8f412
NC
1936 /* This flag bit is used to mean other things in other scalar types.
1937 Given that it only has meaning inside the pad, it shouldn't be set
1938 on anything that can get upgraded. */
1939 assert((SvFLAGS(sv) & SVpad_TYPED) == 0);
463ee0b2 1940 pv = SvPVX(sv);
79072805
LW
1941 cur = SvCUR(sv);
1942 len = SvLEN(sv);
463ee0b2
LW
1943 iv = SvIVX(sv);
1944 nv = SvNVX(sv);
79072805
LW
1945 magic = SvMAGIC(sv);
1946 stash = SvSTASH(sv);
1947 del_XPVMG(SvANY(sv));
1948 break;
1949 default:
cea2e8a9 1950 Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
79072805
LW
1951 }
1952
ffb05e06
NC
1953 SvFLAGS(sv) &= ~SVTYPEMASK;
1954 SvFLAGS(sv) |= mt;
1955
79072805
LW
1956 switch (mt) {
1957 case SVt_NULL:
cea2e8a9 1958 Perl_croak(aTHX_ "Can't upgrade to undef");
79072805
LW
1959 case SVt_IV:
1960 SvANY(sv) = new_XIV();
45977657 1961 SvIV_set(sv, iv);
79072805
LW
1962 break;
1963 case SVt_NV:
1964 SvANY(sv) = new_XNV();
9d6ce603 1965 SvNV_set(sv, nv);
79072805 1966 break;
ed6116ce
LW
1967 case SVt_RV:
1968 SvANY(sv) = new_XRV();
b162af07 1969 SvRV_set(sv, (SV*)pv);
ed6116ce 1970 break;
79072805
LW
1971 case SVt_PVHV:
1972 SvANY(sv) = new_XPVHV();
bd4b1eb5
NC
1973 HvRITER(sv) = 0;
1974 HvEITER(sv) = 0;
1975 HvPMROOT(sv) = 0;
1976 HvNAME(sv) = 0;
463ee0b2
LW
1977 HvFILL(sv) = 0;
1978 HvMAX(sv) = 0;
8aacddc1
NIS
1979 HvTOTALKEYS(sv) = 0;
1980 HvPLACEHOLDERS(sv) = 0;
bd4b1eb5
NC
1981
1982 /* Fall through... */
1983 if (0) {
1984 case SVt_PVAV:
1985 SvANY(sv) = new_XPVAV();
1986 AvMAX(sv) = -1;
1987 AvFILLp(sv) = -1;
1988 AvALLOC(sv) = 0;
1989 AvARYLEN(sv)= 0;
11ca45c0 1990 AvREAL_only(sv);
bd4b1eb5
NC
1991 SvIV_set(sv, 0);
1992 SvNV_set(sv, 0.0);
1993 }
1994 /* to here. */
c2bfdfaf
NC
1995 /* XXX? Only SVt_NULL is ever upgraded to AV or HV? */
1996 assert(!pv);
8bd4d4c5
NC
1997 /* FIXME. Should be able to remove all this if()... if the above
1998 assertion is genuinely always true. */
1999 if(SvOOK(sv)) {
2000 pv -= iv;
2001 SvFLAGS(sv) &= ~SVf_OOK;
2002 }
2003 Safefree(pv);
bd4b1eb5 2004 SvPV_set(sv, (char*)0);
b162af07
SP
2005 SvMAGIC_set(sv, magic);
2006 SvSTASH_set(sv, stash);
79072805 2007 break;
bd4b1eb5
NC
2008
2009 case SVt_PVIO:
2010 SvANY(sv) = new_XPVIO();
2011 Zero(SvANY(sv), 1, XPVIO);
2012 IoPAGE_LEN(sv) = 60;
2013 goto set_magic_common;
2014 case SVt_PVFM:
2015 SvANY(sv) = new_XPVFM();
2016 Zero(SvANY(sv), 1, XPVFM);
2017 goto set_magic_common;
2018 case SVt_PVBM:
2019 SvANY(sv) = new_XPVBM();
2020 BmRARE(sv) = 0;
2021 BmUSEFUL(sv) = 0;
2022 BmPREVIOUS(sv) = 0;
2023 goto set_magic_common;
2024 case SVt_PVGV:
2025 SvANY(sv) = new_XPVGV();
2026 GvGP(sv) = 0;
2027 GvNAME(sv) = 0;
2028 GvNAMELEN(sv) = 0;
2029 GvSTASH(sv) = 0;
2030 GvFLAGS(sv) = 0;
2031 goto set_magic_common;
79072805
LW
2032 case SVt_PVCV:
2033 SvANY(sv) = new_XPVCV();
748a9306 2034 Zero(SvANY(sv), 1, XPVCV);
bd4b1eb5
NC
2035 goto set_magic_common;
2036 case SVt_PVLV:
2037 SvANY(sv) = new_XPVLV();
2038 LvTARGOFF(sv) = 0;
2039 LvTARGLEN(sv) = 0;
2040 LvTARG(sv) = 0;
2041 LvTYPE(sv) = 0;
93a17b20 2042 GvGP(sv) = 0;
79072805
LW
2043 GvNAME(sv) = 0;
2044 GvNAMELEN(sv) = 0;
2045 GvSTASH(sv) = 0;
a5f75d66 2046 GvFLAGS(sv) = 0;
bd4b1eb5
NC
2047 /* Fall through. */
2048 if (0) {
2049 case SVt_PVMG:
2050 SvANY(sv) = new_XPVMG();
2051 }
2052 set_magic_common:
b162af07
SP
2053 SvMAGIC_set(sv, magic);
2054 SvSTASH_set(sv, stash);
bd4b1eb5
NC
2055 /* Fall through. */
2056 if (0) {
2057 case SVt_PVNV:
2058 SvANY(sv) = new_XPVNV();
2059 }
9d6ce603 2060 SvNV_set(sv, nv);
bd4b1eb5
NC
2061 /* Fall through. */
2062 if (0) {
2063 case SVt_PVIV:
2064 SvANY(sv) = new_XPVIV();
2065 if (SvNIOK(sv))
2066 (void)SvIOK_on(sv);
2067 SvNOK_off(sv);
2068 }
2069 SvIV_set(sv, iv);
2070 /* Fall through. */
2071 if (0) {
2072 case SVt_PV:
2073 SvANY(sv) = new_XPV();
2074 }
f880fe2f 2075 SvPV_set(sv, pv);
b162af07
SP
2076 SvCUR_set(sv, cur);
2077 SvLEN_set(sv, len);
8990e307
LW
2078 break;
2079 }
79072805
LW
2080 return TRUE;
2081}
2082
645c22ef
DM
2083/*
2084=for apidoc sv_backoff
2085
2086Remove any string offset. You should normally use the C<SvOOK_off> macro
2087wrapper instead.
2088
2089=cut
2090*/
2091
79072805 2092int
864dbfa3 2093Perl_sv_backoff(pTHX_ register SV *sv)
79072805
LW
2094{
2095 assert(SvOOK(sv));
463ee0b2
LW
2096 if (SvIVX(sv)) {
2097 char *s = SvPVX(sv);
b162af07 2098 SvLEN_set(sv, SvLEN(sv) + SvIVX(sv));
f880fe2f 2099 SvPV_set(sv, SvPVX(sv) - SvIVX(sv));
79072805 2100 SvIV_set(sv, 0);
463ee0b2 2101 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
79072805
LW
2102 }
2103 SvFLAGS(sv) &= ~SVf_OOK;
a0d0e21e 2104 return 0;
79072805
LW
2105}
2106
954c1994
GS
2107/*
2108=for apidoc sv_grow
2109
645c22ef
DM
2110Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
2111upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
2112Use the C<SvGROW> wrapper instead.
954c1994
GS
2113
2114=cut
2115*/
2116
79072805 2117char *
864dbfa3 2118Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
79072805
LW
2119{
2120 register char *s;
2121
55497cff 2122#ifdef HAS_64K_LIMIT
79072805 2123 if (newlen >= 0x10000) {
1d7c1841
GS
2124 PerlIO_printf(Perl_debug_log,
2125 "Allocation too large: %"UVxf"\n", (UV)newlen);
79072805
LW
2126 my_exit(1);
2127 }
55497cff 2128#endif /* HAS_64K_LIMIT */
a0d0e21e
LW
2129 if (SvROK(sv))
2130 sv_unref(sv);
79072805
LW
2131 if (SvTYPE(sv) < SVt_PV) {
2132 sv_upgrade(sv, SVt_PV);
463ee0b2 2133 s = SvPVX(sv);
79072805
LW
2134 }
2135 else if (SvOOK(sv)) { /* pv is offset? */
2136 sv_backoff(sv);
463ee0b2 2137 s = SvPVX(sv);
79072805
LW
2138 if (newlen > SvLEN(sv))
2139 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
c6f8c383
GA
2140#ifdef HAS_64K_LIMIT
2141 if (newlen >= 0x10000)
2142 newlen = 0xFFFF;
2143#endif
79072805 2144 }
bc44a8a2 2145 else
463ee0b2 2146 s = SvPVX(sv);
54f0641b 2147
79072805 2148 if (newlen > SvLEN(sv)) { /* need more room? */
8d6dde3e 2149 if (SvLEN(sv) && s) {
7bab3ede 2150#ifdef MYMALLOC
a3b680e6 2151 const STRLEN l = malloced_size((void*)SvPVX(sv));
8d6dde3e
IZ
2152 if (newlen <= l) {
2153 SvLEN_set(sv, l);
2154 return s;
2155 } else
c70c8a0a 2156#endif
79072805 2157 Renew(s,newlen,char);
8d6dde3e 2158 }
bfed75c6 2159 else {
4e83176d 2160 New(703, s, newlen, char);
40565179 2161 if (SvPVX(sv) && SvCUR(sv)) {
54f0641b 2162 Move(SvPVX(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
40565179 2163 }
4e83176d 2164 }
79072805 2165 SvPV_set(sv, s);
e1ec3a88 2166 SvLEN_set(sv, newlen);
79072805
LW
2167 }
2168 return s;
2169}
2170
954c1994
GS
2171/*
2172=for apidoc sv_setiv
2173
645c22ef
DM
2174Copies an integer into the given SV, upgrading first if necessary.
2175Does not handle 'set' magic. See also C<sv_setiv_mg>.
954c1994
GS
2176
2177=cut
2178*/
2179
79072805 2180void
864dbfa3 2181Perl_sv_setiv(pTHX_ register SV *sv, IV i)
79072805 2182{
765f542d 2183 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2
LW
2184 switch (SvTYPE(sv)) {
2185 case SVt_NULL:
79072805 2186 sv_upgrade(sv, SVt_IV);
463ee0b2
LW
2187 break;
2188 case SVt_NV:
2189 sv_upgrade(sv, SVt_PVNV);
2190 break;
ed6116ce 2191 case SVt_RV:
463ee0b2 2192 case SVt_PV:
79072805 2193 sv_upgrade(sv, SVt_PVIV);
463ee0b2 2194 break;
a0d0e21e
LW
2195
2196 case SVt_PVGV:
a0d0e21e
LW
2197 case SVt_PVAV:
2198 case SVt_PVHV:
2199 case SVt_PVCV:
2200 case SVt_PVFM:
2201 case SVt_PVIO:
411caa50 2202 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
53e06cf0 2203 OP_DESC(PL_op));
463ee0b2 2204 }
a0d0e21e 2205 (void)SvIOK_only(sv); /* validate number */
45977657 2206 SvIV_set(sv, i);
463ee0b2 2207 SvTAINT(sv);
79072805
LW
2208}
2209
954c1994
GS
2210/*
2211=for apidoc sv_setiv_mg
2212
2213Like C<sv_setiv>, but also handles 'set' magic.
2214
2215=cut
2216*/
2217
79072805 2218void
864dbfa3 2219Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
ef50df4b
GS
2220{
2221 sv_setiv(sv,i);
2222 SvSETMAGIC(sv);
2223}
2224
954c1994
GS
2225/*
2226=for apidoc sv_setuv
2227
645c22ef
DM
2228Copies an unsigned integer into the given SV, upgrading first if necessary.
2229Does not handle 'set' magic. See also C<sv_setuv_mg>.
954c1994
GS
2230
2231=cut
2232*/
2233
ef50df4b 2234void
864dbfa3 2235Perl_sv_setuv(pTHX_ register SV *sv, UV u)
55497cff 2236{
55ada374
NC
2237 /* With these two if statements:
2238 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 2239
55ada374
NC
2240 without
2241 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 2242
55ada374
NC
2243 If you wish to remove them, please benchmark to see what the effect is
2244 */
28e5dec8
JH
2245 if (u <= (UV)IV_MAX) {
2246 sv_setiv(sv, (IV)u);
2247 return;
2248 }
25da4f38
IZ
2249 sv_setiv(sv, 0);
2250 SvIsUV_on(sv);
607fa7f2 2251 SvUV_set(sv, u);
55497cff 2252}
2253
954c1994
GS
2254/*
2255=for apidoc sv_setuv_mg
2256
2257Like C<sv_setuv>, but also handles 'set' magic.
2258
2259=cut
2260*/
2261
55497cff 2262void
864dbfa3 2263Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
ef50df4b 2264{
55ada374
NC
2265 /* With these two if statements:
2266 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 2267
55ada374
NC
2268 without
2269 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 2270
55ada374
NC
2271 If you wish to remove them, please benchmark to see what the effect is
2272 */
28e5dec8
JH
2273 if (u <= (UV)IV_MAX) {
2274 sv_setiv(sv, (IV)u);
2275 } else {
2276 sv_setiv(sv, 0);
2277 SvIsUV_on(sv);
2278 sv_setuv(sv,u);
2279 }
ef50df4b
GS
2280 SvSETMAGIC(sv);
2281}
2282
954c1994
GS
2283/*
2284=for apidoc sv_setnv
2285
645c22ef
DM
2286Copies a double into the given SV, upgrading first if necessary.
2287Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
2288
2289=cut
2290*/
2291
ef50df4b 2292void
65202027 2293Perl_sv_setnv(pTHX_ register SV *sv, NV num)
79072805 2294{
765f542d 2295 SV_CHECK_THINKFIRST_COW_DROP(sv);
a0d0e21e
LW
2296 switch (SvTYPE(sv)) {
2297 case SVt_NULL:
2298 case SVt_IV:
79072805 2299 sv_upgrade(sv, SVt_NV);
a0d0e21e 2300 break;
a0d0e21e
LW
2301 case SVt_RV:
2302 case SVt_PV:
2303 case SVt_PVIV:
79072805 2304 sv_upgrade(sv, SVt_PVNV);
a0d0e21e 2305 break;
827b7e14 2306
a0d0e21e 2307 case SVt_PVGV:
a0d0e21e
LW
2308 case SVt_PVAV:
2309 case SVt_PVHV:
2310 case SVt_PVCV:
2311 case SVt_PVFM:
2312 case SVt_PVIO:
411caa50 2313 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
53e06cf0 2314 OP_NAME(PL_op));
79072805 2315 }
9d6ce603 2316 SvNV_set(sv, num);
a0d0e21e 2317 (void)SvNOK_only(sv); /* validate number */
463ee0b2 2318 SvTAINT(sv);
79072805
LW
2319}
2320
954c1994
GS
2321/*
2322=for apidoc sv_setnv_mg
2323
2324Like C<sv_setnv>, but also handles 'set' magic.
2325
2326=cut
2327*/
2328
ef50df4b 2329void
65202027 2330Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
ef50df4b
GS
2331{
2332 sv_setnv(sv,num);
2333 SvSETMAGIC(sv);
2334}
2335
645c22ef
DM
2336/* Print an "isn't numeric" warning, using a cleaned-up,
2337 * printable version of the offending string
2338 */
2339
76e3520e 2340STATIC void
cea2e8a9 2341S_not_a_number(pTHX_ SV *sv)
a0d0e21e 2342{
94463019
JH
2343 SV *dsv;
2344 char tmpbuf[64];
2345 char *pv;
2346
2347 if (DO_UTF8(sv)) {
2348 dsv = sv_2mortal(newSVpv("", 0));
2349 pv = sv_uni_display(dsv, sv, 10, 0);
2350 } else {
2351 char *d = tmpbuf;
2352 char *limit = tmpbuf + sizeof(tmpbuf) - 8;
2353 /* each *s can expand to 4 chars + "...\0",
2354 i.e. need room for 8 chars */
ecdeb87c 2355
94463019
JH
2356 char *s, *end;
2357 for (s = SvPVX(sv), end = s + SvCUR(sv); s < end && d < limit; s++) {
2358 int ch = *s & 0xFF;
2359 if (ch & 128 && !isPRINT_LC(ch)) {
2360 *d++ = 'M';
2361 *d++ = '-';
2362 ch &= 127;
2363 }
2364 if (ch == '\n') {
2365 *d++ = '\\';
2366 *d++ = 'n';
2367 }
2368 else if (ch == '\r') {
2369 *d++ = '\\';
2370 *d++ = 'r';
2371 }
2372 else if (ch == '\f') {
2373 *d++ = '\\';
2374 *d++ = 'f';
2375 }
2376 else if (ch == '\\') {
2377 *d++ = '\\';
2378 *d++ = '\\';
2379 }
2380 else if (ch == '\0') {
2381 *d++ = '\\';
2382 *d++ = '0';
2383 }
2384 else if (isPRINT_LC(ch))
2385 *d++ = ch;
2386 else {
2387 *d++ = '^';
2388 *d++ = toCTRL(ch);
2389 }
2390 }
2391 if (s < end) {
2392 *d++ = '.';
2393 *d++ = '.';
2394 *d++ = '.';
2395 }
2396 *d = '\0';
2397 pv = tmpbuf;
a0d0e21e 2398 }
a0d0e21e 2399
533c011a 2400 if (PL_op)
9014280d 2401 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
2402 "Argument \"%s\" isn't numeric in %s", pv,
2403 OP_DESC(PL_op));
a0d0e21e 2404 else
9014280d 2405 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 2406 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
2407}
2408
c2988b20
NC
2409/*
2410=for apidoc looks_like_number
2411
645c22ef
DM
2412Test if the content of an SV looks like a number (or is a number).
2413C<Inf> and C<Infinity> are treated as numbers (so will not issue a
2414non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
2415
2416=cut
2417*/
2418
2419I32
2420Perl_looks_like_number(pTHX_ SV *sv)
2421{
a3b680e6 2422 register const char *sbegin;
c2988b20
NC
2423 STRLEN len;
2424
2425 if (SvPOK(sv)) {
2426 sbegin = SvPVX(sv);
2427 len = SvCUR(sv);
2428 }
2429 else if (SvPOKp(sv))
2430 sbegin = SvPV(sv, len);
2431 else
e0ab1c0e 2432 return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
c2988b20
NC
2433 return grok_number(sbegin, len, NULL);
2434}
25da4f38
IZ
2435
2436/* Actually, ISO C leaves conversion of UV to IV undefined, but
2437 until proven guilty, assume that things are not that bad... */
2438
645c22ef
DM
2439/*
2440 NV_PRESERVES_UV:
2441
2442 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
2443 an IV (an assumption perl has been based on to date) it becomes necessary
2444 to remove the assumption that the NV always carries enough precision to
2445 recreate the IV whenever needed, and that the NV is the canonical form.
2446 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 2447 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
2448 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
2449 1) to distinguish between IV/UV/NV slots that have cached a valid
2450 conversion where precision was lost and IV/UV/NV slots that have a
2451 valid conversion which has lost no precision
645c22ef 2452 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
2453 would lose precision, the precise conversion (or differently
2454 imprecise conversion) is also performed and cached, to prevent
2455 requests for different numeric formats on the same SV causing
2456 lossy conversion chains. (lossless conversion chains are perfectly
2457 acceptable (still))
2458
2459
2460 flags are used:
2461 SvIOKp is true if the IV slot contains a valid value
2462 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
2463 SvNOKp is true if the NV slot contains a valid value
2464 SvNOK is true only if the NV value is accurate
2465
2466 so
645c22ef 2467 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
2468 IV(or UV) would lose accuracy over a direct conversion from PV to
2469 IV(or UV). If it would, cache both conversions, return NV, but mark
2470 SV as IOK NOKp (ie not NOK).
2471
645c22ef 2472 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
2473 NV would lose accuracy over a direct conversion from PV to NV. If it
2474 would, cache both conversions, flag similarly.
2475
2476 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
2477 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
2478 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
2479 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 2480 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 2481
645c22ef
DM
2482 The benefit of this is that operations such as pp_add know that if
2483 SvIOK is true for both left and right operands, then integer addition
2484 can be used instead of floating point (for cases where the result won't
2485 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
2486 loss of precision compared with integer addition.
2487
2488 * making IV and NV equal status should make maths accurate on 64 bit
2489 platforms
2490 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 2491 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
2492 looking for SvIOK and checking for overflow will not outweigh the
2493 fp to integer speedup)
2494 * will slow down integer operations (callers of SvIV) on "inaccurate"
2495 values, as the change from SvIOK to SvIOKp will cause a call into
2496 sv_2iv each time rather than a macro access direct to the IV slot
2497 * should speed up number->string conversion on integers as IV is
645c22ef 2498 favoured when IV and NV are equally accurate
28e5dec8
JH
2499
2500 ####################################################################
645c22ef
DM
2501 You had better be using SvIOK_notUV if you want an IV for arithmetic:
2502 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
2503 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
2504 ####################################################################
2505
645c22ef 2506 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
2507 performance ratio.
2508*/
2509
2510#ifndef NV_PRESERVES_UV
645c22ef
DM
2511# define IS_NUMBER_UNDERFLOW_IV 1
2512# define IS_NUMBER_UNDERFLOW_UV 2
2513# define IS_NUMBER_IV_AND_UV 2
2514# define IS_NUMBER_OVERFLOW_IV 4
2515# define IS_NUMBER_OVERFLOW_UV 5
2516
2517/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
2518
2519/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
2520STATIC int
645c22ef 2521S_sv_2iuv_non_preserve(pTHX_ register SV *sv, I32 numtype)
28e5dec8 2522{
1779d84d 2523 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_2iuv_non '%s', IV=0x%"UVxf" NV=%"NVgf" inttype=%"UVXf"\n", SvPVX(sv), SvIVX(sv), SvNVX(sv), (UV)numtype));
28e5dec8
JH
2524 if (SvNVX(sv) < (NV)IV_MIN) {
2525 (void)SvIOKp_on(sv);
2526 (void)SvNOK_on(sv);
45977657 2527 SvIV_set(sv, IV_MIN);
28e5dec8
JH
2528 return IS_NUMBER_UNDERFLOW_IV;
2529 }
2530 if (SvNVX(sv) > (NV)UV_MAX) {
2531 (void)SvIOKp_on(sv);
2532 (void)SvNOK_on(sv);
2533 SvIsUV_on(sv);
607fa7f2 2534 SvUV_set(sv, UV_MAX);
28e5dec8
JH
2535 return IS_NUMBER_OVERFLOW_UV;
2536 }
c2988b20
NC
2537 (void)SvIOKp_on(sv);
2538 (void)SvNOK_on(sv);
2539 /* Can't use strtol etc to convert this string. (See truth table in
2540 sv_2iv */
2541 if (SvNVX(sv) <= (UV)IV_MAX) {
45977657 2542 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2543 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2544 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
2545 } else {
2546 /* Integer is imprecise. NOK, IOKp */
2547 }
2548 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
2549 }
2550 SvIsUV_on(sv);
607fa7f2 2551 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
2552 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2553 if (SvUVX(sv) == UV_MAX) {
2554 /* As we know that NVs don't preserve UVs, UV_MAX cannot
2555 possibly be preserved by NV. Hence, it must be overflow.
2556 NOK, IOKp */
2557 return IS_NUMBER_OVERFLOW_UV;
2558 }
2559 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
2560 } else {
2561 /* Integer is imprecise. NOK, IOKp */
28e5dec8 2562 }
c2988b20 2563 return IS_NUMBER_OVERFLOW_IV;
28e5dec8 2564}
645c22ef
DM
2565#endif /* !NV_PRESERVES_UV*/
2566
891f9566
YST
2567/* sv_2iv() is now a macro using Perl_sv_2iv_flags();
2568 * this function provided for binary compatibility only
2569 */
2570
2571IV
2572Perl_sv_2iv(pTHX_ register SV *sv)
2573{
2574 return sv_2iv_flags(sv, SV_GMAGIC);
2575}
2576
645c22ef 2577/*
891f9566 2578=for apidoc sv_2iv_flags
645c22ef 2579
891f9566
YST
2580Return the integer value of an SV, doing any necessary string
2581conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2582Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
645c22ef
DM
2583
2584=cut
2585*/
28e5dec8 2586
a0d0e21e 2587IV
891f9566 2588Perl_sv_2iv_flags(pTHX_ register SV *sv, I32 flags)
79072805
LW
2589{
2590 if (!sv)
2591 return 0;
8990e307 2592 if (SvGMAGICAL(sv)) {
891f9566
YST
2593 if (flags & SV_GMAGIC)
2594 mg_get(sv);
463ee0b2
LW
2595 if (SvIOKp(sv))
2596 return SvIVX(sv);
748a9306 2597 if (SvNOKp(sv)) {
25da4f38 2598 return I_V(SvNVX(sv));
748a9306 2599 }
36477c24 2600 if (SvPOKp(sv) && SvLEN(sv))
2601 return asIV(sv);
3fe9a6f1 2602 if (!SvROK(sv)) {
d008e5eb 2603 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2604 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 2605 report_uninit(sv);
c6ee37c5 2606 }
36477c24 2607 return 0;
3fe9a6f1 2608 }
463ee0b2 2609 }
ed6116ce 2610 if (SvTHINKFIRST(sv)) {
a0d0e21e 2611 if (SvROK(sv)) {
a0d0e21e 2612 SV* tmpstr;
1554e226 2613 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2614 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2615 return SvIV(tmpstr);
56431972 2616 return PTR2IV(SvRV(sv));
a0d0e21e 2617 }
765f542d
NC
2618 if (SvIsCOW(sv)) {
2619 sv_force_normal_flags(sv, 0);
47deb5e7 2620 }
0336b60e 2621 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2622 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2623 report_uninit(sv);
ed6116ce
LW
2624 return 0;
2625 }
79072805 2626 }
25da4f38
IZ
2627 if (SvIOKp(sv)) {
2628 if (SvIsUV(sv)) {
2629 return (IV)(SvUVX(sv));
2630 }
2631 else {
2632 return SvIVX(sv);
2633 }
463ee0b2 2634 }
748a9306 2635 if (SvNOKp(sv)) {
28e5dec8
JH
2636 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2637 * without also getting a cached IV/UV from it at the same time
2638 * (ie PV->NV conversion should detect loss of accuracy and cache
2639 * IV or UV at same time to avoid this. NWC */
25da4f38
IZ
2640
2641 if (SvTYPE(sv) == SVt_NV)
2642 sv_upgrade(sv, SVt_PVNV);
2643
28e5dec8
JH
2644 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2645 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
2646 certainly cast into the IV range at IV_MAX, whereas the correct
2647 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
2648 cases go to UV */
2649 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2650 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
2651 if (SvNVX(sv) == (NV) SvIVX(sv)
2652#ifndef NV_PRESERVES_UV
2653 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2654 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2655 /* Don't flag it as "accurately an integer" if the number
2656 came from a (by definition imprecise) NV operation, and
2657 we're outside the range of NV integer precision */
2658#endif
2659 ) {
2660 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2661 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2662 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2663 PTR2UV(sv),
2664 SvNVX(sv),
2665 SvIVX(sv)));
2666
2667 } else {
2668 /* IV not precise. No need to convert from PV, as NV
2669 conversion would already have cached IV if it detected
2670 that PV->IV would be better than PV->NV->IV
2671 flags already correct - don't set public IOK. */
2672 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2673 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2674 PTR2UV(sv),
2675 SvNVX(sv),
2676 SvIVX(sv)));
2677 }
2678 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2679 but the cast (NV)IV_MIN rounds to a the value less (more
2680 negative) than IV_MIN which happens to be equal to SvNVX ??
2681 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2682 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2683 (NV)UVX == NVX are both true, but the values differ. :-(
2684 Hopefully for 2s complement IV_MIN is something like
2685 0x8000000000000000 which will be exact. NWC */
d460ef45 2686 }
25da4f38 2687 else {
607fa7f2 2688 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
2689 if (
2690 (SvNVX(sv) == (NV) SvUVX(sv))
2691#ifndef NV_PRESERVES_UV
2692 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2693 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2694 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2695 /* Don't flag it as "accurately an integer" if the number
2696 came from a (by definition imprecise) NV operation, and
2697 we're outside the range of NV integer precision */
2698#endif
2699 )
2700 SvIOK_on(sv);
25da4f38
IZ
2701 SvIsUV_on(sv);
2702 ret_iv_max:
1c846c1f 2703 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 2704 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 2705 PTR2UV(sv),
57def98f
JH
2706 SvUVX(sv),
2707 SvUVX(sv)));
25da4f38
IZ
2708 return (IV)SvUVX(sv);
2709 }
748a9306
LW
2710 }
2711 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2712 UV value;
f54cb97a 2713 const int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
25da4f38
IZ
2714 /* We want to avoid a possible problem when we cache an IV which
2715 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
2716 the same as the direct translation of the initial string
2717 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2718 be careful to ensure that the value with the .456 is around if the
2719 NV value is requested in the future).
1c846c1f 2720
25da4f38
IZ
2721 This means that if we cache such an IV, we need to cache the
2722 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 2723 cache the NV if we are sure it's not needed.
25da4f38 2724 */
16b7a9a4 2725
c2988b20
NC
2726 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2727 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2728 == IS_NUMBER_IN_UV) {
5e045b90 2729 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
2730 if (SvTYPE(sv) < SVt_PVIV)
2731 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 2732 (void)SvIOK_on(sv);
c2988b20
NC
2733 } else if (SvTYPE(sv) < SVt_PVNV)
2734 sv_upgrade(sv, SVt_PVNV);
28e5dec8 2735
c2988b20
NC
2736 /* If NV preserves UV then we only use the UV value if we know that
2737 we aren't going to call atof() below. If NVs don't preserve UVs
2738 then the value returned may have more precision than atof() will
2739 return, even though value isn't perfectly accurate. */
2740 if ((numtype & (IS_NUMBER_IN_UV
2741#ifdef NV_PRESERVES_UV
2742 | IS_NUMBER_NOT_INT
2743#endif
2744 )) == IS_NUMBER_IN_UV) {
2745 /* This won't turn off the public IOK flag if it was set above */
2746 (void)SvIOKp_on(sv);
2747
2748 if (!(numtype & IS_NUMBER_NEG)) {
2749 /* positive */;
2750 if (value <= (UV)IV_MAX) {
45977657 2751 SvIV_set(sv, (IV)value);
c2988b20 2752 } else {
607fa7f2 2753 SvUV_set(sv, value);
c2988b20
NC
2754 SvIsUV_on(sv);
2755 }
2756 } else {
2757 /* 2s complement assumption */
2758 if (value <= (UV)IV_MIN) {
45977657 2759 SvIV_set(sv, -(IV)value);
c2988b20
NC
2760 } else {
2761 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2762 I'm assuming it will be rare. */
c2988b20
NC
2763 if (SvTYPE(sv) < SVt_PVNV)
2764 sv_upgrade(sv, SVt_PVNV);
2765 SvNOK_on(sv);
2766 SvIOK_off(sv);
2767 SvIOKp_on(sv);
9d6ce603 2768 SvNV_set(sv, -(NV)value);
45977657 2769 SvIV_set(sv, IV_MIN);
c2988b20
NC
2770 }
2771 }
2772 }
2773 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2774 will be in the previous block to set the IV slot, and the next
2775 block to set the NV slot. So no else here. */
2776
2777 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2778 != IS_NUMBER_IN_UV) {
2779 /* It wasn't an (integer that doesn't overflow the UV). */
9d6ce603 2780 SvNV_set(sv, Atof(SvPVX(sv)));
28e5dec8 2781
c2988b20
NC
2782 if (! numtype && ckWARN(WARN_NUMERIC))
2783 not_a_number(sv);
28e5dec8 2784
65202027 2785#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2786 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2787 PTR2UV(sv), SvNVX(sv)));
65202027 2788#else
1779d84d 2789 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 2790 PTR2UV(sv), SvNVX(sv)));
65202027 2791#endif
28e5dec8
JH
2792
2793
2794#ifdef NV_PRESERVES_UV
c2988b20
NC
2795 (void)SvIOKp_on(sv);
2796 (void)SvNOK_on(sv);
2797 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2798 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2799 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2800 SvIOK_on(sv);
28e5dec8 2801 } else {
c2988b20
NC
2802 /* Integer is imprecise. NOK, IOKp */
2803 }
2804 /* UV will not work better than IV */
2805 } else {
2806 if (SvNVX(sv) > (NV)UV_MAX) {
2807 SvIsUV_on(sv);
2808 /* Integer is inaccurate. NOK, IOKp, is UV */
607fa7f2 2809 SvUV_set(sv, UV_MAX);
c2988b20
NC
2810 SvIsUV_on(sv);
2811 } else {
607fa7f2 2812 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
2813 /* 0xFFFFFFFFFFFFFFFF not an issue in here */
2814 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2815 SvIOK_on(sv);
28e5dec8
JH
2816 SvIsUV_on(sv);
2817 } else {
c2988b20
NC
2818 /* Integer is imprecise. NOK, IOKp, is UV */
2819 SvIsUV_on(sv);
28e5dec8 2820 }
28e5dec8 2821 }
c2988b20
NC
2822 goto ret_iv_max;
2823 }
28e5dec8 2824#else /* NV_PRESERVES_UV */
c2988b20
NC
2825 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2826 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2827 /* The IV slot will have been set from value returned by
2828 grok_number above. The NV slot has just been set using
2829 Atof. */
560b0c46 2830 SvNOK_on(sv);
c2988b20
NC
2831 assert (SvIOKp(sv));
2832 } else {
2833 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2834 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2835 /* Small enough to preserve all bits. */
2836 (void)SvIOKp_on(sv);
2837 SvNOK_on(sv);
45977657 2838 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2839 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2840 SvIOK_on(sv);
2841 /* Assumption: first non-preserved integer is < IV_MAX,
2842 this NV is in the preserved range, therefore: */
2843 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2844 < (UV)IV_MAX)) {
32fdb065 2845 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
2846 }
2847 } else {
2848 /* IN_UV NOT_INT
2849 0 0 already failed to read UV.
2850 0 1 already failed to read UV.
2851 1 0 you won't get here in this case. IV/UV
2852 slot set, public IOK, Atof() unneeded.
2853 1 1 already read UV.
2854 so there's no point in sv_2iuv_non_preserve() attempting
2855 to use atol, strtol, strtoul etc. */
2856 if (sv_2iuv_non_preserve (sv, numtype)
2857 >= IS_NUMBER_OVERFLOW_IV)
2858 goto ret_iv_max;
2859 }
2860 }
28e5dec8 2861#endif /* NV_PRESERVES_UV */
25da4f38 2862 }
28e5dec8 2863 } else {
599cee73 2864 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 2865 report_uninit(sv);
25da4f38
IZ
2866 if (SvTYPE(sv) < SVt_IV)
2867 /* Typically the caller expects that sv_any is not NULL now. */
2868 sv_upgrade(sv, SVt_IV);
a0d0e21e 2869 return 0;
79072805 2870 }
1d7c1841
GS
2871 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2872 PTR2UV(sv),SvIVX(sv)));
25da4f38 2873 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
2874}
2875
891f9566
YST
2876/* sv_2uv() is now a macro using Perl_sv_2uv_flags();
2877 * this function provided for binary compatibility only
2878 */
2879
2880UV
2881Perl_sv_2uv(pTHX_ register SV *sv)
2882{
2883 return sv_2uv_flags(sv, SV_GMAGIC);
2884}
2885
645c22ef 2886/*
891f9566 2887=for apidoc sv_2uv_flags
645c22ef
DM
2888
2889Return the unsigned integer value of an SV, doing any necessary string
891f9566
YST
2890conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2891Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
645c22ef
DM
2892
2893=cut
2894*/
2895
ff68c719 2896UV
891f9566 2897Perl_sv_2uv_flags(pTHX_ register SV *sv, I32 flags)
ff68c719 2898{
2899 if (!sv)
2900 return 0;
2901 if (SvGMAGICAL(sv)) {
891f9566
YST
2902 if (flags & SV_GMAGIC)
2903 mg_get(sv);
ff68c719 2904 if (SvIOKp(sv))
2905 return SvUVX(sv);
2906 if (SvNOKp(sv))
2907 return U_V(SvNVX(sv));
36477c24 2908 if (SvPOKp(sv) && SvLEN(sv))
2909 return asUV(sv);
3fe9a6f1 2910 if (!SvROK(sv)) {
d008e5eb 2911 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2912 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 2913 report_uninit(sv);
c6ee37c5 2914 }
36477c24 2915 return 0;
3fe9a6f1 2916 }
ff68c719 2917 }
2918 if (SvTHINKFIRST(sv)) {
2919 if (SvROK(sv)) {
ff68c719 2920 SV* tmpstr;
1554e226 2921 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2922 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2923 return SvUV(tmpstr);
56431972 2924 return PTR2UV(SvRV(sv));
ff68c719 2925 }
765f542d
NC
2926 if (SvIsCOW(sv)) {
2927 sv_force_normal_flags(sv, 0);
8a818333 2928 }
0336b60e 2929 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2930 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2931 report_uninit(sv);
ff68c719 2932 return 0;
2933 }
2934 }
25da4f38
IZ
2935 if (SvIOKp(sv)) {
2936 if (SvIsUV(sv)) {
2937 return SvUVX(sv);
2938 }
2939 else {
2940 return (UV)SvIVX(sv);
2941 }
ff68c719 2942 }
2943 if (SvNOKp(sv)) {
28e5dec8
JH
2944 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2945 * without also getting a cached IV/UV from it at the same time
2946 * (ie PV->NV conversion should detect loss of accuracy and cache
2947 * IV or UV at same time to avoid this. */
2948 /* IV-over-UV optimisation - choose to cache IV if possible */
2949
25da4f38
IZ
2950 if (SvTYPE(sv) == SVt_NV)
2951 sv_upgrade(sv, SVt_PVNV);
28e5dec8
JH
2952
2953 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2954 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2955 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
2956 if (SvNVX(sv) == (NV) SvIVX(sv)
2957#ifndef NV_PRESERVES_UV
2958 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2959 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2960 /* Don't flag it as "accurately an integer" if the number
2961 came from a (by definition imprecise) NV operation, and
2962 we're outside the range of NV integer precision */
2963#endif
2964 ) {
2965 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2966 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2967 "0x%"UVxf" uv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2968 PTR2UV(sv),
2969 SvNVX(sv),
2970 SvIVX(sv)));
2971
2972 } else {
2973 /* IV not precise. No need to convert from PV, as NV
2974 conversion would already have cached IV if it detected
2975 that PV->IV would be better than PV->NV->IV
2976 flags already correct - don't set public IOK. */
2977 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2978 "0x%"UVxf" uv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2979 PTR2UV(sv),
2980 SvNVX(sv),
2981 SvIVX(sv)));
2982 }
2983 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2984 but the cast (NV)IV_MIN rounds to a the value less (more
2985 negative) than IV_MIN which happens to be equal to SvNVX ??
2986 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2987 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2988 (NV)UVX == NVX are both true, but the values differ. :-(
2989 Hopefully for 2s complement IV_MIN is something like
2990 0x8000000000000000 which will be exact. NWC */
d460ef45 2991 }
28e5dec8 2992 else {
607fa7f2 2993 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
2994 if (
2995 (SvNVX(sv) == (NV) SvUVX(sv))
2996#ifndef NV_PRESERVES_UV
2997 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2998 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2999 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
3000 /* Don't flag it as "accurately an integer" if the number
3001 came from a (by definition imprecise) NV operation, and
3002 we're outside the range of NV integer precision */
3003#endif
3004 )
3005 SvIOK_on(sv);
3006 SvIsUV_on(sv);
1c846c1f 3007 DEBUG_c(PerlIO_printf(Perl_debug_log,
28e5dec8 3008 "0x%"UVxf" 2uv(%"UVuf" => %"IVdf") (as unsigned)\n",
57def98f 3009 PTR2UV(sv),
28e5dec8
JH
3010 SvUVX(sv),
3011 SvUVX(sv)));
25da4f38 3012 }
ff68c719 3013 }
3014 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 3015 UV value;
f54cb97a 3016 const int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
25da4f38
IZ
3017
3018 /* We want to avoid a possible problem when we cache a UV which
3019 may be later translated to an NV, and the resulting NV is not
3020 the translation of the initial data.
1c846c1f 3021
25da4f38
IZ
3022 This means that if we cache such a UV, we need to cache the
3023 NV as well. Moreover, we trade speed for space, and do not
3024 cache the NV if not needed.
3025 */
16b7a9a4 3026
c2988b20
NC
3027 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
3028 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3029 == IS_NUMBER_IN_UV) {
5e045b90 3030 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8 3031 if (SvTYPE(sv) < SVt_PVIV)
f7bbb42a
JH
3032 sv_upgrade(sv, SVt_PVIV);
3033 (void)SvIOK_on(sv);
c2988b20
NC
3034 } else if (SvTYPE(sv) < SVt_PVNV)
3035 sv_upgrade(sv, SVt_PVNV);
d460ef45 3036
c2988b20
NC
3037 /* If NV preserves UV then we only use the UV value if we know that
3038 we aren't going to call atof() below. If NVs don't preserve UVs
3039 then the value returned may have more precision than atof() will
3040 return, even though it isn't accurate. */
3041 if ((numtype & (IS_NUMBER_IN_UV
3042#ifdef NV_PRESERVES_UV
3043 | IS_NUMBER_NOT_INT
3044#endif
3045 )) == IS_NUMBER_IN_UV) {
3046 /* This won't turn off the public IOK flag if it was set above */
3047 (void)SvIOKp_on(sv);
3048
3049 if (!(numtype & IS_NUMBER_NEG)) {
3050 /* positive */;
3051 if (value <= (UV)IV_MAX) {
45977657 3052 SvIV_set(sv, (IV)value);
28e5dec8
JH
3053 } else {
3054 /* it didn't overflow, and it was positive. */
607fa7f2 3055 SvUV_set(sv, value);
28e5dec8
JH
3056 SvIsUV_on(sv);
3057 }
c2988b20
NC
3058 } else {
3059 /* 2s complement assumption */
3060 if (value <= (UV)IV_MIN) {
45977657 3061 SvIV_set(sv, -(IV)value);
c2988b20
NC
3062 } else {
3063 /* Too negative for an IV. This is a double upgrade, but
d1be9408 3064 I'm assuming it will be rare. */
c2988b20
NC
3065 if (SvTYPE(sv) < SVt_PVNV)
3066 sv_upgrade(sv, SVt_PVNV);
3067 SvNOK_on(sv);
3068 SvIOK_off(sv);
3069 SvIOKp_on(sv);
9d6ce603 3070 SvNV_set(sv, -(NV)value);
45977657 3071 SvIV_set(sv, IV_MIN);
c2988b20
NC
3072 }
3073 }
3074 }
3075
3076 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3077 != IS_NUMBER_IN_UV) {
3078 /* It wasn't an integer, or it overflowed the UV. */
9d6ce603 3079 SvNV_set(sv, Atof(SvPVX(sv)));
28e5dec8 3080
c2988b20 3081 if (! numtype && ckWARN(WARN_NUMERIC))
28e5dec8
JH
3082 not_a_number(sv);
3083
3084#if defined(USE_LONG_DOUBLE)
c2988b20
NC
3085 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%" PERL_PRIgldbl ")\n",
3086 PTR2UV(sv), SvNVX(sv)));
28e5dec8 3087#else
1779d84d 3088 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"NVgf")\n",
c2988b20 3089 PTR2UV(sv), SvNVX(sv)));
28e5dec8
JH
3090#endif
3091
3092#ifdef NV_PRESERVES_UV
c2988b20
NC
3093 (void)SvIOKp_on(sv);
3094 (void)SvNOK_on(sv);
3095 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 3096 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
3097 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
3098 SvIOK_on(sv);
3099 } else {
3100 /* Integer is imprecise. NOK, IOKp */
3101 }
3102 /* UV will not work better than IV */
3103 } else {
3104 if (SvNVX(sv) > (NV)UV_MAX) {
3105 SvIsUV_on(sv);
3106 /* Integer is inaccurate. NOK, IOKp, is UV */
607fa7f2 3107 SvUV_set(sv, UV_MAX);
c2988b20
NC
3108 SvIsUV_on(sv);
3109 } else {
607fa7f2 3110 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
3111 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
3112 NV preservse UV so can do correct comparison. */
3113 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
3114 SvIOK_on(sv);
3115 SvIsUV_on(sv);
3116 } else {
3117 /* Integer is imprecise. NOK, IOKp, is UV */
3118 SvIsUV_on(sv);
3119 }
3120 }
3121 }
28e5dec8 3122#else /* NV_PRESERVES_UV */
c2988b20
NC
3123 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3124 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
3125 /* The UV slot will have been set from value returned by
3126 grok_number above. The NV slot has just been set using
3127 Atof. */
560b0c46 3128 SvNOK_on(sv);
c2988b20
NC
3129 assert (SvIOKp(sv));
3130 } else {
3131 if (((UV)1 << NV_PRESERVES_UV_BITS) >
3132 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
3133 /* Small enough to preserve all bits. */
3134 (void)SvIOKp_on(sv);
3135 SvNOK_on(sv);
45977657 3136 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
3137 if ((NV)(SvIVX(sv)) == SvNVX(sv))
3138 SvIOK_on(sv);
3139 /* Assumption: first non-preserved integer is < IV_MAX,
3140 this NV is in the preserved range, therefore: */
3141 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
3142 < (UV)IV_MAX)) {
32fdb065 3143 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
3144 }
3145 } else
3146 sv_2iuv_non_preserve (sv, numtype);
3147 }
28e5dec8 3148#endif /* NV_PRESERVES_UV */
f7bbb42a 3149 }
ff68c719 3150 }
3151 else {
d008e5eb 3152 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3153 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3154 report_uninit(sv);
c6ee37c5 3155 }
25da4f38
IZ
3156 if (SvTYPE(sv) < SVt_IV)
3157 /* Typically the caller expects that sv_any is not NULL now. */
3158 sv_upgrade(sv, SVt_IV);
ff68c719 3159 return 0;
3160 }
25da4f38 3161
1d7c1841
GS
3162 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
3163 PTR2UV(sv),SvUVX(sv)));
25da4f38 3164 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 3165}
3166
645c22ef
DM
3167/*
3168=for apidoc sv_2nv
3169
3170Return the num value of an SV, doing any necessary string or integer
3171conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
3172macros.
3173
3174=cut
3175*/
3176
65202027 3177NV
864dbfa3 3178Perl_sv_2nv(pTHX_ register SV *sv)
79072805
LW
3179{
3180 if (!sv)
3181 return 0.0;
8990e307 3182 if (SvGMAGICAL(sv)) {
463ee0b2
LW
3183 mg_get(sv);
3184 if (SvNOKp(sv))
3185 return SvNVX(sv);
a0d0e21e 3186 if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20
NC
3187 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) &&
3188 !grok_number(SvPVX(sv), SvCUR(sv), NULL))
a0d0e21e 3189 not_a_number(sv);
097ee67d 3190 return Atof(SvPVX(sv));
a0d0e21e 3191 }
25da4f38 3192 if (SvIOKp(sv)) {
1c846c1f 3193 if (SvIsUV(sv))
65202027 3194 return (NV)SvUVX(sv);
25da4f38 3195 else
65202027 3196 return (NV)SvIVX(sv);
25da4f38 3197 }
16d20bd9 3198 if (!SvROK(sv)) {
d008e5eb 3199 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3200 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3201 report_uninit(sv);
c6ee37c5 3202 }
16d20bd9
AD
3203 return 0;
3204 }
463ee0b2 3205 }
ed6116ce 3206 if (SvTHINKFIRST(sv)) {
a0d0e21e 3207 if (SvROK(sv)) {
a0d0e21e 3208 SV* tmpstr;
1554e226 3209 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 3210 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 3211 return SvNV(tmpstr);
56431972 3212 return PTR2NV(SvRV(sv));
a0d0e21e 3213 }
765f542d
NC
3214 if (SvIsCOW(sv)) {
3215 sv_force_normal_flags(sv, 0);
8a818333 3216 }
0336b60e 3217 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 3218 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 3219 report_uninit(sv);
ed6116ce
LW
3220 return 0.0;
3221 }
79072805
LW
3222 }
3223 if (SvTYPE(sv) < SVt_NV) {
463ee0b2
LW
3224 if (SvTYPE(sv) == SVt_IV)
3225 sv_upgrade(sv, SVt_PVNV);
3226 else
3227 sv_upgrade(sv, SVt_NV);
906f284f 3228#ifdef USE_LONG_DOUBLE
097ee67d 3229 DEBUG_c({
f93f4e46 3230 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
3231 PerlIO_printf(Perl_debug_log,
3232 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
3233 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
3234 RESTORE_NUMERIC_LOCAL();
3235 });
65202027 3236#else
572bbb43 3237 DEBUG_c({
f93f4e46 3238 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 3239 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 3240 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
3241 RESTORE_NUMERIC_LOCAL();
3242 });
572bbb43 3243#endif
79072805
LW
3244 }
3245 else if (SvTYPE(sv) < SVt_PVNV)
3246 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
3247 if (SvNOKp(sv)) {
3248 return SvNVX(sv);
61604483 3249 }
59d8ce62 3250 if (SvIOKp(sv)) {
9d6ce603 3251 SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
28e5dec8
JH
3252#ifdef NV_PRESERVES_UV
3253 SvNOK_on(sv);
3254#else
3255 /* Only set the public NV OK flag if this NV preserves the IV */
3256 /* Check it's not 0xFFFFFFFFFFFFFFFF */
3257 if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
3258 : (SvIVX(sv) == I_V(SvNVX(sv))))
3259 SvNOK_on(sv);
3260 else
3261 SvNOKp_on(sv);
3262#endif
93a17b20 3263 }
748a9306 3264 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 3265 UV value;
f54cb97a 3266 const int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
c2988b20 3267 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !numtype)
a0d0e21e 3268 not_a_number(sv);
28e5dec8 3269#ifdef NV_PRESERVES_UV
c2988b20
NC
3270 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3271 == IS_NUMBER_IN_UV) {
5e045b90 3272 /* It's definitely an integer */
9d6ce603 3273 SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
c2988b20 3274 } else
9d6ce603 3275 SvNV_set(sv, Atof(SvPVX(sv)));
28e5dec8
JH
3276 SvNOK_on(sv);
3277#else
9d6ce603 3278 SvNV_set(sv, Atof(SvPVX(sv)));
28e5dec8
JH
3279 /* Only set the public NV OK flag if this NV preserves the value in
3280 the PV at least as well as an IV/UV would.
3281 Not sure how to do this 100% reliably. */
3282 /* if that shift count is out of range then Configure's test is
3283 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
3284 UV_BITS */
3285 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 3286 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 3287 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
3288 } else if (!(numtype & IS_NUMBER_IN_UV)) {
3289 /* Can't use strtol etc to convert this string, so don't try.
3290 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
3291 SvNOK_on(sv);
3292 } else {
3293 /* value has been set. It may not be precise. */
3294 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
3295 /* 2s complement assumption for (UV)IV_MIN */
3296 SvNOK_on(sv); /* Integer is too negative. */
3297 } else {
3298 SvNOKp_on(sv);
3299 SvIOKp_on(sv);
6fa402ec 3300
c2988b20 3301 if (numtype & IS_NUMBER_NEG) {
45977657 3302 SvIV_set(sv, -(IV)value);
c2988b20 3303 } else if (value <= (UV)IV_MAX) {
45977657 3304 SvIV_set(sv, (IV)value);
c2988b20 3305 } else {
607fa7f2 3306 SvUV_set(sv, value);
c2988b20
NC
3307 SvIsUV_on(sv);
3308 }
3309
3310 if (numtype & IS_NUMBER_NOT_INT) {
3311 /* I believe that even if the original PV had decimals,
3312 they are lost beyond the limit of the FP precision.
3313 However, neither is canonical, so both only get p
3314 flags. NWC, 2000/11/25 */
3315 /* Both already have p flags, so do nothing */
3316 } else {
3317 NV nv = SvNVX(sv);
3318 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
3319 if (SvIVX(sv) == I_V(nv)) {
3320 SvNOK_on(sv);
3321 SvIOK_on(sv);
3322 } else {
3323 SvIOK_on(sv);
3324 /* It had no "." so it must be integer. */
3325 }
3326 } else {
3327 /* between IV_MAX and NV(UV_MAX).
3328 Could be slightly > UV_MAX */
6fa402ec 3329
c2988b20
NC
3330 if (numtype & IS_NUMBER_NOT_INT) {
3331 /* UV and NV both imprecise. */
3332 } else {
3333 UV nv_as_uv = U_V(nv);
3334
3335 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
3336 SvNOK_on(sv);
3337 SvIOK_on(sv);
3338 } else {
3339 SvIOK_on(sv);
3340 }
3341 }
3342 }
3343 }
3344 }
3345 }
28e5dec8 3346#endif /* NV_PRESERVES_UV */
93a17b20 3347 }
79072805 3348 else {
599cee73 3349 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 3350 report_uninit(sv);
25da4f38
IZ
3351 if (SvTYPE(sv) < SVt_NV)
3352 /* Typically the caller expects that sv_any is not NULL now. */
28e5dec8
JH
3353 /* XXX Ilya implies that this is a bug in callers that assume this
3354 and ideally should be fixed. */
25da4f38 3355 sv_upgrade(sv, SVt_NV);
a0d0e21e 3356 return 0.0;
79072805 3357 }
572bbb43 3358#if defined(USE_LONG_DOUBLE)
097ee67d 3359 DEBUG_c({
f93f4e46 3360 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
3361 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
3362 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
3363 RESTORE_NUMERIC_LOCAL();
3364 });
65202027 3365#else
572bbb43 3366 DEBUG_c({
f93f4e46 3367 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 3368 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 3369 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
3370 RESTORE_NUMERIC_LOCAL();
3371 });
572bbb43 3372#endif
463ee0b2 3373 return SvNVX(sv);
79072805
LW
3374}
3375
645c22ef
DM
3376/* asIV(): extract an integer from the string value of an SV.
3377 * Caller must validate PVX */
3378
76e3520e 3379STATIC IV
cea2e8a9 3380S_asIV(pTHX_ SV *sv)
36477c24 3381{
c2988b20
NC
3382 UV value;
3383 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
3384
3385 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3386 == IS_NUMBER_IN_UV) {
645c22ef 3387 /* It's definitely an integer */
c2988b20
NC
3388 if (numtype & IS_NUMBER_NEG) {
3389 if (value < (UV)IV_MIN)
3390 return -(IV)value;
3391 } else {
3392 if (value < (UV)IV_MAX)
3393 return (IV)value;
3394 }
3395 }
d008e5eb 3396 if (!numtype) {
d008e5eb
GS
3397 if (ckWARN(WARN_NUMERIC))
3398 not_a_number(sv);
3399 }
c2988b20 3400 return I_V(Atof(SvPVX(sv)));
36477c24 3401}
3402
645c22ef
DM
3403/* asUV(): extract an unsigned integer from the string value of an SV
3404 * Caller must validate PVX */
3405
76e3520e 3406STATIC UV
cea2e8a9 3407S_asUV(pTHX_ SV *sv)
36477c24 3408{
c2988b20
NC
3409 UV value;
3410 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
36477c24 3411
c2988b20
NC
3412 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3413 == IS_NUMBER_IN_UV) {
645c22ef 3414 /* It's definitely an integer */
6fa402ec 3415 if (!(numtype & IS_NUMBER_NEG))
c2988b20
NC
3416 return value;
3417 }
d008e5eb 3418 if (!numtype) {
d008e5eb
GS
3419 if (ckWARN(WARN_NUMERIC))
3420 not_a_number(sv);
3421 }
097ee67d 3422 return U_V(Atof(SvPVX(sv)));
36477c24 3423}
3424
645c22ef
DM
3425/*
3426=for apidoc sv_2pv_nolen
3427
3428Like C<sv_2pv()>, but doesn't return the length too. You should usually
3429use the macro wrapper C<SvPV_nolen(sv)> instead.
3430=cut
3431*/
3432
79072805 3433char *
864dbfa3 3434Perl_sv_2pv_nolen(pTHX_ register SV *sv)
1fa8b10d
JD
3435{
3436 STRLEN n_a;
3437 return sv_2pv(sv, &n_a);
3438}
3439
645c22ef
DM
3440/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
3441 * UV as a string towards the end of buf, and return pointers to start and
3442 * end of it.
3443 *
3444 * We assume that buf is at least TYPE_CHARS(UV) long.
3445 */
3446
864dbfa3 3447static char *
25da4f38
IZ
3448uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
3449{
25da4f38
IZ
3450 char *ptr = buf + TYPE_CHARS(UV);
3451 char *ebuf = ptr;
3452 int sign;
25da4f38
IZ
3453
3454 if (is_uv)
3455 sign = 0;
3456 else if (iv >= 0) {
3457 uv = iv;
3458 sign = 0;
3459 } else {
3460 uv = -iv;
3461 sign = 1;
3462 }
3463 do {
eb160463 3464 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
3465 } while (uv /= 10);
3466 if (sign)
3467 *--ptr = '-';
3468 *peob = ebuf;
3469 return ptr;
3470}
3471
09540bc3
JH
3472/* sv_2pv() is now a macro using Perl_sv_2pv_flags();
3473 * this function provided for binary compatibility only
3474 */
3475
3476char *
3477Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
3478{
3479 return sv_2pv_flags(sv, lp, SV_GMAGIC);
3480}
3481
645c22ef
DM
3482/*
3483=for apidoc sv_2pv_flags
3484
ff276b08 3485Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
3486If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
3487if necessary.
3488Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
3489usually end up here too.
3490
3491=cut
3492*/
3493
8d6d96c1
HS
3494char *
3495Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
3496{
79072805
LW
3497 register char *s;
3498 int olderrno;
cb50f42d 3499 SV *tsv, *origsv;
25da4f38
IZ
3500 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
3501 char *tmpbuf = tbuf;
79072805 3502
463ee0b2
LW
3503 if (!sv) {
3504 *lp = 0;
73d840c0 3505 return (char *)"";
463ee0b2 3506 }
8990e307 3507 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
3508 if (flags & SV_GMAGIC)
3509 mg_get(sv);
463ee0b2
LW
3510 if (SvPOKp(sv)) {
3511 *lp = SvCUR(sv);
3512 return SvPVX(sv);
3513 }
cf2093f6 3514 if (SvIOKp(sv)) {
1c846c1f 3515 if (SvIsUV(sv))
57def98f 3516 (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
cf2093f6 3517 else
57def98f 3518 (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
46fc3d4c 3519 tsv = Nullsv;
a0d0e21e 3520 goto tokensave;
463ee0b2
LW
3521 }
3522 if (SvNOKp(sv)) {
2d4389e4 3523 Gconvert(SvNVX(sv), NV_DIG, 0, tmpbuf);
46fc3d4c 3524 tsv = Nullsv;
a0d0e21e 3525 goto tokensave;
463ee0b2 3526 }
16d20bd9 3527 if (!SvROK(sv)) {
d008e5eb 3528 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3529 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3530 report_uninit(sv);
c6ee37c5 3531 }
16d20bd9 3532 *lp = 0;
73d840c0 3533 return (char *)"";
16d20bd9 3534 }
463ee0b2 3535 }
ed6116ce
LW
3536 if (SvTHINKFIRST(sv)) {
3537 if (SvROK(sv)) {
a0d0e21e 3538 SV* tmpstr;
e1ec3a88 3539 register const char *typestr;
1554e226 3540 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)) &&
b4b9a328 3541 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
446eaa42
YST
3542 char *pv = SvPV(tmpstr, *lp);
3543 if (SvUTF8(tmpstr))
3544 SvUTF8_on(sv);
3545 else
3546 SvUTF8_off(sv);
3547 return pv;
3548 }
cb50f42d 3549 origsv = sv;
ed6116ce
LW
3550 sv = (SV*)SvRV(sv);
3551 if (!sv)
e1ec3a88 3552 typestr = "NULLREF";
ed6116ce 3553 else {
f9277f47
IZ
3554 MAGIC *mg;
3555
ed6116ce 3556 switch (SvTYPE(sv)) {
f9277f47
IZ
3557 case SVt_PVMG:
3558 if ( ((SvFLAGS(sv) &
1c846c1f 3559 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
faf82a0b 3560 == (SVs_OBJECT|SVs_SMG))
14befaf4 3561 && (mg = mg_find(sv, PERL_MAGIC_qr))) {
e1ec3a88 3562 const regexp *re = (regexp *)mg->mg_obj;
1bd3ad17 3563
2cd61cdb 3564 if (!mg->mg_ptr) {
e1ec3a88 3565 const char *fptr = "msix";
8782bef2
GB
3566 char reflags[6];
3567 char ch;
3568 int left = 0;
3569 int right = 4;
ff385a1b 3570 char need_newline = 0;
eb160463 3571 U16 reganch = (U16)((re->reganch & PMf_COMPILETIME) >> 12);
8782bef2 3572
155aba94 3573 while((ch = *fptr++)) {
8782bef2
GB
3574 if(reganch & 1) {
3575 reflags[left++] = ch;
3576 }
3577 else {
3578 reflags[right--] = ch;
3579 }
3580 reganch >>= 1;
3581 }
3582 if(left != 4) {
3583 reflags[left] = '-';
3584 left = 5;
3585 }
3586
3587 mg->mg_len = re->prelen + 4 + left;
ff385a1b
JF
3588 /*
3589 * If /x was used, we have to worry about a regex
3590 * ending with a comment later being embedded
3591 * within another regex. If so, we don't want this
3592 * regex's "commentization" to leak out to the
3593 * right part of the enclosing regex, we must cap
3594 * it with a newline.
3595 *
3596 * So, if /x was used, we scan backwards from the
3597 * end of the regex. If we find a '#' before we
3598 * find a newline, we need to add a newline
3599 * ourself. If we find a '\n' first (or if we
3600 * don't find '#' or '\n'), we don't need to add
3601 * anything. -jfriedl
3602 */
3603 if (PMf_EXTENDED & re->reganch)
3604 {
e1ec3a88 3605 const char *endptr = re->precomp + re->prelen;
ff385a1b
JF
3606 while (endptr >= re->precomp)
3607 {
e1ec3a88 3608 const char c = *(endptr--);
ff385a1b
JF
3609 if (c == '\n')
3610 break; /* don't need another */
3611 if (c == '#') {
3612 /* we end while in a comment, so we
3613 need a newline */
3614 mg->mg_len++; /* save space for it */
3615 need_newline = 1; /* note to add it */
ab01544f 3616 break;
ff385a1b
JF
3617 }
3618 }
3619 }
3620
8782bef2
GB
3621 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
3622 Copy("(?", mg->mg_ptr, 2, char);
3623 Copy(reflags, mg->mg_ptr+2, left, char);
3624 Copy(":", mg->mg_ptr+left+2, 1, char);
3625 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
ff385a1b
JF
3626 if (need_newline)
3627 mg->mg_ptr[mg->mg_len - 2] = '\n';
1bd3ad17
IZ
3628 mg->mg_ptr[mg->mg_len - 1] = ')';
3629 mg->mg_ptr[mg->mg_len] = 0;
3630 }
3280af22 3631 PL_reginterp_cnt += re->program[0].next_off;
cb50f42d
YST
3632
3633 if (re->reganch & ROPT_UTF8)
3634 SvUTF8_on(origsv);
3635 else
3636 SvUTF8_off(origsv);
1bd3ad17
IZ
3637 *lp = mg->mg_len;
3638 return mg->mg_ptr;
f9277f47
IZ
3639 }
3640 /* Fall through */
ed6116ce
LW
3641 case SVt_NULL:
3642 case SVt_IV:
3643 case SVt_NV:
3644 case SVt_RV:
3645 case SVt_PV:
3646 case SVt_PVIV:
3647 case SVt_PVNV:
e1ec3a88
AL
3648 case SVt_PVBM: typestr = SvROK(sv) ? "REF" : "SCALAR"; break;
3649 case SVt_PVLV: typestr = SvROK(sv) ? "REF"
be65207d
DM
3650 /* tied lvalues should appear to be
3651 * scalars for backwards compatitbility */
3652 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
3653 ? "SCALAR" : "LVALUE"; break;
e1ec3a88
AL
3654 case SVt_PVAV: typestr = "ARRAY"; break;
3655 case SVt_PVHV: typestr = "HASH"; break;
3656 case SVt_PVCV: typestr = "CODE"; break;
3657 case SVt_PVGV: typestr = "GLOB"; break;
3658 case SVt_PVFM: typestr = "FORMAT"; break;
3659 case SVt_PVIO: typestr = "IO"; break;
3660 default: typestr = "UNKNOWN"; break;
ed6116ce 3661 }
46fc3d4c 3662 tsv = NEWSV(0,0);
a5cb6b62
NC
3663 if (SvOBJECT(sv)) {
3664 const char *name = HvNAME(SvSTASH(sv));
3665 Perl_sv_setpvf(aTHX_ tsv, "%s=%s(0x%"UVxf")",
e1ec3a88 3666 name ? name : "__ANON__" , typestr, PTR2UV(sv));
a5cb6b62 3667 }
ed6116ce 3668 else
e1ec3a88 3669 Perl_sv_setpvf(aTHX_ tsv, "%s(0x%"UVxf")", typestr, PTR2UV(sv));
a0d0e21e 3670 goto tokensaveref;
463ee0b2 3671 }
e1ec3a88 3672 *lp = strlen(typestr);
73d840c0 3673 return (char *)typestr;
79072805 3674 }
0336b60e 3675 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 3676 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 3677 report_uninit(sv);
ed6116ce 3678 *lp = 0;
73d840c0 3679 return (char *)"";
79072805 3680 }
79072805 3681 }
28e5dec8
JH
3682 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
3683 /* I'm assuming that if both IV and NV are equally valid then
3684 converting the IV is going to be more efficient */
e1ec3a88
AL
3685 const U32 isIOK = SvIOK(sv);
3686 const U32 isUIOK = SvIsUV(sv);
28e5dec8
JH
3687 char buf[TYPE_CHARS(UV)];
3688 char *ebuf, *ptr;
3689
3690 if (SvTYPE(sv) < SVt_PVIV)
3691 sv_upgrade(sv, SVt_PVIV);
3692 if (isUIOK)
3693 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
3694 else
3695 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
eb160463 3696 SvGROW(sv, (STRLEN)(ebuf - ptr + 1)); /* inlined from sv_setpvn */
28e5dec8
JH
3697 Move(ptr,SvPVX(sv),ebuf - ptr,char);
3698 SvCUR_set(sv, ebuf - ptr);
3699 s = SvEND(sv);
3700 *s = '\0';
3701 if (isIOK)
3702 SvIOK_on(sv);
3703 else
3704 SvIOKp_on(sv);
3705 if (isUIOK)
3706 SvIsUV_on(sv);
3707 }
3708 else if (SvNOKp(sv)) {
79072805
LW
3709 if (SvTYPE(sv) < SVt_PVNV)
3710 sv_upgrade(sv, SVt_PVNV);
1c846c1f 3711 /* The +20 is pure guesswork. Configure test needed. --jhi */
59155cc0 3712 SvGROW(sv, NV_DIG + 20);
463ee0b2 3713 s = SvPVX(sv);
79072805 3714 olderrno = errno; /* some Xenix systems wipe out errno here */
79072805 3715#ifdef apollo
463ee0b2 3716 if (SvNVX(sv) == 0.0)
79072805
LW
3717 (void)strcpy(s,"0");
3718 else
3719#endif /*apollo*/
bbce6d69 3720 {
2d4389e4 3721 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 3722 }
79072805 3723 errno = olderrno;
a0d0e21e
LW
3724#ifdef FIXNEGATIVEZERO
3725 if (*s == '-' && s[1] == '0' && !s[2])
3726 strcpy(s,"0");
3727#endif
79072805
LW
3728 while (*s) s++;
3729#ifdef hcx
3730 if (s[-1] == '.')
46fc3d4c 3731 *--s = '\0';
79072805
LW
3732#endif
3733 }
79072805 3734 else {
0336b60e
IZ
3735 if (ckWARN(WARN_UNINITIALIZED)
3736 && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 3737 report_uninit(sv);
a0d0e21e 3738 *lp = 0;
25da4f38
IZ
3739 if (SvTYPE(sv) < SVt_PV)
3740 /* Typically the caller expects that sv_any is not NULL now. */
3741 sv_upgrade(sv, SVt_PV);
73d840c0 3742 return (char *)"";
79072805 3743 }
463ee0b2
LW
3744 *lp = s - SvPVX(sv);
3745 SvCUR_set(sv, *lp);
79072805 3746 SvPOK_on(sv);
1d7c1841
GS
3747 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3748 PTR2UV(sv),SvPVX(sv)));
463ee0b2 3749 return SvPVX(sv);
a0d0e21e
LW
3750
3751 tokensave:
3752 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
3753 /* Sneaky stuff here */
3754
3755 tokensaveref:
46fc3d4c 3756 if (!tsv)
96827780 3757 tsv = newSVpv(tmpbuf, 0);
46fc3d4c 3758 sv_2mortal(tsv);
3759 *lp = SvCUR(tsv);
3760 return SvPVX(tsv);
a0d0e21e
LW
3761 }
3762 else {
27da23d5 3763 dVAR;
a0d0e21e 3764 STRLEN len;
73d840c0 3765 const char *t;
46fc3d4c 3766
3767 if (tsv) {
3768 sv_2mortal(tsv);
3769 t = SvPVX(tsv);
3770 len = SvCUR(tsv);
3771 }
3772 else {
96827780
MB
3773 t = tmpbuf;
3774 len = strlen(tmpbuf);
46fc3d4c 3775 }
a0d0e21e 3776#ifdef FIXNEGATIVEZERO
46fc3d4c 3777 if (len == 2 && t[0] == '-' && t[1] == '0') {
3778 t = "0";
3779 len = 1;
3780 }
a0d0e21e
LW
3781#endif
3782 (void)SvUPGRADE(sv, SVt_PV);
46fc3d4c 3783 *lp = len;
a0d0e21e
LW
3784 s = SvGROW(sv, len + 1);
3785 SvCUR_set(sv, len);
6bf554b4 3786 SvPOKp_on(sv);
e90e2364 3787 return strcpy(s, t);
a0d0e21e 3788 }
463ee0b2
LW
3789}
3790
645c22ef 3791/*
6050d10e
JP
3792=for apidoc sv_copypv
3793
3794Copies a stringified representation of the source SV into the
3795destination SV. Automatically performs any necessary mg_get and
54f0641b 3796coercion of numeric values into strings. Guaranteed to preserve
6050d10e 3797UTF-8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
3798sv_2pv[_flags] but operates directly on an SV instead of just the
3799string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
3800would lose the UTF-8'ness of the PV.
3801
3802=cut
3803*/
3804
3805void
3806Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
3807{
446eaa42
YST
3808 STRLEN len;
3809 char *s;
3810 s = SvPV(ssv,len);
cb50f42d 3811 sv_setpvn(dsv,s,len);
446eaa42 3812 if (SvUTF8(ssv))
cb50f42d 3813 SvUTF8_on(dsv);
446eaa42 3814 else
cb50f42d 3815 SvUTF8_off(dsv);
6050d10e
JP
3816}
3817
3818/*
645c22ef
DM
3819=for apidoc sv_2pvbyte_nolen
3820
3821Return a pointer to the byte-encoded representation of the SV.
1e54db1a 3822May cause the SV to be downgraded from UTF-8 as a side-effect.
645c22ef
DM
3823
3824Usually accessed via the C<SvPVbyte_nolen> macro.
3825
3826=cut
3827*/
3828
7340a771
GS
3829char *
3830Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
3831{
560a288e
GS
3832 STRLEN n_a;
3833 return sv_2pvbyte(sv, &n_a);
7340a771
GS
3834}
3835
645c22ef
DM
3836/*
3837=for apidoc sv_2pvbyte
3838
3839Return a pointer to the byte-encoded representation of the SV, and set *lp
1e54db1a 3840to its length. May cause the SV to be downgraded from UTF-8 as a
645c22ef
DM
3841side-effect.
3842
3843Usually accessed via the C<SvPVbyte> macro.
3844
3845=cut
3846*/
3847
7340a771
GS
3848char *
3849Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
3850{
0875d2fe
NIS
3851 sv_utf8_downgrade(sv,0);
3852 return SvPV(sv,*lp);
7340a771
GS
3853}
3854
645c22ef
DM
3855/*
3856=for apidoc sv_2pvutf8_nolen
3857
1e54db1a
JH
3858Return a pointer to the UTF-8-encoded representation of the SV.
3859May cause the SV to be upgraded to UTF-8 as a side-effect.
645c22ef
DM
3860
3861Usually accessed via the C<SvPVutf8_nolen> macro.
3862
3863=cut
3864*/
3865
7340a771
GS
3866char *
3867Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
3868{
560a288e
GS
3869 STRLEN n_a;
3870 return sv_2pvutf8(sv, &n_a);
7340a771
GS
3871}
3872
645c22ef
DM
3873/*
3874=for apidoc sv_2pvutf8
3875
1e54db1a
JH
3876Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3877to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
645c22ef
DM
3878
3879Usually accessed via the C<SvPVutf8> macro.
3880
3881=cut
3882*/
3883
7340a771
GS
3884char *
3885Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
3886{
560a288e 3887 sv_utf8_upgrade(sv);
7d59b7e4 3888 return SvPV(sv,*lp);
7340a771 3889}
1c846c1f 3890
645c22ef
DM
3891/*
3892=for apidoc sv_2bool
3893
3894This function is only called on magical items, and is only used by
8cf8f3d1 3895sv_true() or its macro equivalent.
645c22ef
DM
3896
3897=cut
3898*/
3899
463ee0b2 3900bool
864dbfa3 3901Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 3902{
8990e307 3903 if (SvGMAGICAL(sv))
463ee0b2
LW
3904 mg_get(sv);
3905
a0d0e21e
LW
3906 if (!SvOK(sv))
3907 return 0;
3908 if (SvROK(sv)) {
a0d0e21e 3909 SV* tmpsv;
1554e226 3910 if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
9e3013b1 3911 (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
8a31060d 3912 return (bool)SvTRUE(tmpsv);
a0d0e21e
LW
3913 return SvRV(sv) != 0;
3914 }
463ee0b2 3915 if (SvPOKp(sv)) {
11343788
MB
3916 register XPV* Xpvtmp;
3917 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
3918 (*Xpvtmp->xpv_pv > '0' ||
3919 Xpvtmp->xpv_cur > 1 ||
3920 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
463ee0b2
LW
3921 return 1;
3922 else
3923 return 0;
3924 }
3925 else {
3926 if (SvIOKp(sv))
3927 return SvIVX(sv) != 0;
3928 else {
3929 if (SvNOKp(sv))
3930 return SvNVX(sv) != 0.0;
3931 else
3932 return FALSE;
3933 }
3934 }
79072805
LW
3935}
3936
09540bc3
JH
3937/* sv_utf8_upgrade() is now a macro using sv_utf8_upgrade_flags();
3938 * this function provided for binary compatibility only
3939 */
3940
3941
3942STRLEN
3943Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
3944{
3945 return sv_utf8_upgrade_flags(sv, SV_GMAGIC);
3946}
3947
c461cf8f
JH
3948/*
3949=for apidoc sv_utf8_upgrade
3950
78ea37eb 3951Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3952Forces the SV to string form if it is not already.
4411f3b6
NIS
3953Always sets the SvUTF8 flag to avoid future validity checks even
3954if all the bytes have hibit clear.
c461cf8f 3955
13a6c0e0
JH
3956This is not as a general purpose byte encoding to Unicode interface:
3957use the Encode extension for that.
3958
8d6d96c1
HS
3959=for apidoc sv_utf8_upgrade_flags
3960
78ea37eb 3961Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3962Forces the SV to string form if it is not already.
8d6d96c1
HS
3963Always sets the SvUTF8 flag to avoid future validity checks even
3964if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
3965will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
3966C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3967
13a6c0e0
JH
3968This is not as a general purpose byte encoding to Unicode interface:
3969use the Encode extension for that.
3970
8d6d96c1
HS
3971=cut
3972*/
3973
3974STRLEN
3975Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
3976{
808c356f
RGS
3977 if (sv == &PL_sv_undef)
3978 return 0;
e0e62c2a
NIS
3979 if (!SvPOK(sv)) {
3980 STRLEN len = 0;
d52b7888
NC
3981 if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3982 (void) sv_2pv_flags(sv,&len, flags);
3983 if (SvUTF8(sv))
3984 return len;
3985 } else {
3986 (void) SvPV_force(sv,len);
3987 }
e0e62c2a 3988 }
4411f3b6 3989
f5cee72b 3990 if (SvUTF8(sv)) {
5fec3b1d 3991 return SvCUR(sv);
f5cee72b 3992 }
5fec3b1d 3993
765f542d
NC
3994 if (SvIsCOW(sv)) {
3995 sv_force_normal_flags(sv, 0);
db42d148
NIS
3996 }
3997
88632417 3998 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
799ef3cb 3999 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 4000 else { /* Assume Latin-1/EBCDIC */
c4e7c712
NC
4001 /* This function could be much more efficient if we
4002 * had a FLAG in SVs to signal if there are any hibit
4003 * chars in the PV. Given that there isn't such a flag
4004 * make the loop as fast as possible. */
4005 U8 *s = (U8 *) SvPVX(sv);
4006 U8 *e = (U8 *) SvEND(sv);
4007 U8 *t = s;
4008 int hibit = 0;
4009
4010 while (t < e) {
4011 U8 ch = *t++;
4012 if ((hibit = !NATIVE_IS_INVARIANT(ch)))
4013 break;
4014 }
4015 if (hibit) {
4016 STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
4017 s = bytes_to_utf8((U8*)s, &len);
4018
4019 SvPV_free(sv); /* No longer using what was there before. */
4020
4021 SvPV_set(sv, (char*)s);
4022 SvCUR_set(sv, len - 1);
4023 SvLEN_set(sv, len); /* No longer know the real size. */
4024 }
4025 /* Mark as UTF-8 even if no hibit - saves scanning loop */
4026 SvUTF8_on(sv);
560a288e 4027 }
4411f3b6 4028 return SvCUR(sv);
560a288e
GS
4029}
4030
c461cf8f
JH
4031/*
4032=for apidoc sv_utf8_downgrade
4033
78ea37eb
TS
4034Attempts to convert the PV of an SV from characters to bytes.
4035If the PV contains a character beyond byte, this conversion will fail;
4036in this case, either returns false or, if C<fail_ok> is not
c461cf8f
JH
4037true, croaks.
4038
13a6c0e0
JH
4039This is not as a general purpose Unicode to byte encoding interface:
4040use the Encode extension for that.
4041
c461cf8f
JH
4042=cut
4043*/
4044
560a288e
GS
4045bool
4046Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
4047{
78ea37eb 4048 if (SvPOKp(sv) && SvUTF8(sv)) {
fa301091 4049 if (SvCUR(sv)) {
03cfe0ae 4050 U8 *s;
652088fc 4051 STRLEN len;
fa301091 4052
765f542d
NC
4053 if (SvIsCOW(sv)) {
4054 sv_force_normal_flags(sv, 0);
4055 }
03cfe0ae
NIS
4056 s = (U8 *) SvPV(sv, len);
4057 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
4058 if (fail_ok)
4059 return FALSE;
4060 else {
4061 if (PL_op)
4062 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 4063 OP_DESC(PL_op));
fa301091
JH
4064 else
4065 Perl_croak(aTHX_ "Wide character");
4066 }
4b3603a4 4067 }
b162af07 4068 SvCUR_set(sv, len);
67e989fb 4069 }
560a288e 4070 }
ffebcc3e 4071 SvUTF8_off(sv);
560a288e
GS
4072 return TRUE;
4073}
4074
c461cf8f
JH
4075/*
4076=for apidoc sv_utf8_encode
4077
78ea37eb
TS
4078Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
4079flag off so that it looks like octets again.
c461cf8f
JH
4080
4081=cut
4082*/
4083
560a288e
GS
4084void
4085Perl_sv_utf8_encode(pTHX_ register SV *sv)
4086{
4411f3b6 4087 (void) sv_utf8_upgrade(sv);
4c94c214
NC
4088 if (SvIsCOW(sv)) {
4089 sv_force_normal_flags(sv, 0);
4090 }
4091 if (SvREADONLY(sv)) {
4092 Perl_croak(aTHX_ PL_no_modify);
4093 }
560a288e
GS
4094 SvUTF8_off(sv);
4095}
4096
4411f3b6
NIS
4097/*
4098=for apidoc sv_utf8_decode
4099
78ea37eb
TS
4100If the PV of the SV is an octet sequence in UTF-8
4101and contains a multiple-byte character, the C<SvUTF8> flag is turned on
4102so that it looks like a character. If the PV contains only single-byte
4103characters, the C<SvUTF8> flag stays being off.
4104Scans PV for validity and returns false if the PV is invalid UTF-8.
4411f3b6
NIS
4105
4106=cut
4107*/
4108
560a288e
GS
4109bool
4110Perl_sv_utf8_decode(pTHX_ register SV *sv)
4111{
78ea37eb 4112 if (SvPOKp(sv)) {
63cd0674
NIS
4113 U8 *c;
4114 U8 *e;
9cbac4c7 4115
645c22ef
DM
4116 /* The octets may have got themselves encoded - get them back as
4117 * bytes
4118 */
4119 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
4120 return FALSE;
4121
4122 /* it is actually just a matter of turning the utf8 flag on, but
4123 * we want to make sure everything inside is valid utf8 first.
4124 */
63cd0674
NIS
4125 c = (U8 *) SvPVX(sv);
4126 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 4127 return FALSE;
63cd0674 4128 e = (U8 *) SvEND(sv);
511c2ff0 4129 while (c < e) {
c4d5f83a
NIS
4130 U8 ch = *c++;
4131 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
4132 SvUTF8_on(sv);
4133 break;
4134 }
560a288e 4135 }
560a288e
GS
4136 }
4137 return TRUE;
4138}
4139
09540bc3
JH
4140/* sv_setsv() is now a macro using Perl_sv_setsv_flags();
4141 * this function provided for binary compatibility only
4142 */
4143
4144void
4145Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
4146{
4147 sv_setsv_flags(dstr, sstr, SV_GMAGIC);
4148}
4149
954c1994
GS
4150/*
4151=for apidoc sv_setsv
4152
645c22ef
DM
4153Copies the contents of the source SV C<ssv> into the destination SV
4154C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
4155function if the source SV needs to be reused. Does not handle 'set' magic.
4156Loosely speaking, it performs a copy-by-value, obliterating any previous
4157content of the destination.
4158
4159You probably want to use one of the assortment of wrappers, such as
4160C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
4161C<SvSetMagicSV_nosteal>.
4162
8d6d96c1
HS
4163=for apidoc sv_setsv_flags
4164
645c22ef
DM
4165Copies the contents of the source SV C<ssv> into the destination SV
4166C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
4167function if the source SV needs to be reused. Does not handle 'set' magic.
4168Loosely speaking, it performs a copy-by-value, obliterating any previous
4169content of the destination.
4170If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
5fcdf167
NC
4171C<ssv> if appropriate, else not. If the C<flags> parameter has the
4172C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
4173and C<sv_setsv_nomg> are implemented in terms of this function.
645c22ef
DM
4174
4175You probably want to use one of the assortment of wrappers, such as
4176C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
4177C<SvSetMagicSV_nosteal>.
4178
4179This is the primary function for copying scalars, and most other
4180copy-ish functions and macros use this underneath.
8d6d96c1
HS
4181
4182=cut
4183*/
4184
4185void
4186Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
4187{
8990e307
LW
4188 register U32 sflags;
4189 register int dtype;
4190 register int stype;
463ee0b2 4191
79072805
LW
4192 if (sstr == dstr)
4193 return;
765f542d 4194 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 4195 if (!sstr)
3280af22 4196 sstr = &PL_sv_undef;
8990e307
LW
4197 stype = SvTYPE(sstr);
4198 dtype = SvTYPE(dstr);
79072805 4199
a0d0e21e 4200 SvAMAGIC_off(dstr);
7a5fa8a2 4201 if ( SvVOK(dstr) )
ece467f9
JP
4202 {
4203 /* need to nuke the magic */
4204 mg_free(dstr);
4205 SvRMAGICAL_off(dstr);
4206 }
9e7bc3e8 4207
463ee0b2 4208 /* There's a lot of redundancy below but we're going for speed here */
79072805 4209
8990e307 4210 switch (stype) {
79072805 4211 case SVt_NULL:
aece5585 4212 undef_sstr:
20408e3c
GS
4213 if (dtype != SVt_PVGV) {
4214 (void)SvOK_off(dstr);
4215 return;
4216 }
4217 break;
463ee0b2 4218 case SVt_IV:
aece5585
GA
4219 if (SvIOK(sstr)) {
4220 switch (dtype) {
4221 case SVt_NULL:
8990e307 4222 sv_upgrade(dstr, SVt_IV);
aece5585
GA
4223 break;
4224 case SVt_NV:
8990e307 4225 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
4226 break;
4227 case SVt_RV:
4228 case SVt_PV:
a0d0e21e 4229 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
4230 break;
4231 }
4232 (void)SvIOK_only(dstr);
45977657 4233 SvIV_set(dstr, SvIVX(sstr));
25da4f38
IZ
4234 if (SvIsUV(sstr))
4235 SvIsUV_on(dstr);
27c9684d
AP
4236 if (SvTAINTED(sstr))
4237 SvTAINT(dstr);
aece5585 4238 return;
8990e307 4239 }
aece5585
GA
4240 goto undef_sstr;
4241
463ee0b2 4242 case SVt_NV:
aece5585
GA
4243 if (SvNOK(sstr)) {
4244 switch (dtype) {
4245 case SVt_NULL:
4246 case SVt_IV:
8990e307 4247 sv_upgrade(dstr, SVt_NV);
aece5585
GA
4248 break;
4249 case SVt_RV:
4250 case SVt_PV:
4251 case SVt_PVIV:
a0d0e21e 4252 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
4253 break;
4254 }
9d6ce603 4255 SvNV_set(dstr, SvNVX(sstr));
aece5585 4256 (void)SvNOK_only(dstr);
27c9684d
AP
4257 if (SvTAINTED(sstr))
4258 SvTAINT(dstr);
aece5585 4259 return;
8990e307 4260 }
aece5585
GA
4261 goto undef_sstr;
4262
ed6116ce 4263 case SVt_RV:
8990e307 4264 if (dtype < SVt_RV)
ed6116ce 4265 sv_upgrade(dstr, SVt_RV);
c07a80fd 4266 else if (dtype == SVt_PVGV &&
23bb1b96 4267 SvROK(sstr) && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
c07a80fd 4268 sstr = SvRV(sstr);
a5f75d66 4269 if (sstr == dstr) {
1d7c1841
GS
4270 if (GvIMPORTED(dstr) != GVf_IMPORTED
4271 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4272 {
a5f75d66 4273 GvIMPORTED_on(dstr);
1d7c1841 4274 }
a5f75d66
AD
4275 GvMULTI_on(dstr);
4276 return;
4277 }
c07a80fd 4278 goto glob_assign;
4279 }
ed6116ce 4280 break;
fc36a67e 4281 case SVt_PVFM:
d89fc664
NC
4282#ifdef PERL_COPY_ON_WRITE
4283 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
4284 if (dtype < SVt_PVIV)
4285 sv_upgrade(dstr, SVt_PVIV);
4286 break;
4287 }
4288 /* Fall through */
4289#endif
4290 case SVt_PV:
8990e307 4291 if (dtype < SVt_PV)
463ee0b2 4292 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
4293 break;
4294 case SVt_PVIV:
8990e307 4295 if (dtype < SVt_PVIV)
463ee0b2 4296 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
4297 break;
4298 case SVt_PVNV:
8990e307 4299 if (dtype < SVt_PVNV)
463ee0b2 4300 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 4301 break;
4633a7c4
LW
4302 case SVt_PVAV:
4303 case SVt_PVHV:
4304 case SVt_PVCV:
4633a7c4 4305 case SVt_PVIO:
a3b680e6
AL
4306 {
4307 const char * const type = sv_reftype(sstr,0);
533c011a 4308 if (PL_op)
a3b680e6 4309 Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_NAME(PL_op));
4633a7c4 4310 else
a3b680e6
AL
4311 Perl_croak(aTHX_ "Bizarre copy of %s", type);
4312 }
4633a7c4
LW
4313 break;
4314
79072805 4315 case SVt_PVGV:
8990e307 4316 if (dtype <= SVt_PVGV) {
c07a80fd 4317 glob_assign:
a5f75d66 4318 if (dtype != SVt_PVGV) {
a3b680e6
AL
4319 const char * const name = GvNAME(sstr);
4320 const STRLEN len = GvNAMELEN(sstr);
b76195c2
DM
4321 /* don't upgrade SVt_PVLV: it can hold a glob */
4322 if (dtype != SVt_PVLV)
4323 sv_upgrade(dstr, SVt_PVGV);
14befaf4 4324 sv_magic(dstr, dstr, PERL_MAGIC_glob, Nullch, 0);
85aff577 4325 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
4326 GvNAME(dstr) = savepvn(name, len);
4327 GvNAMELEN(dstr) = len;
4328 SvFAKE_on(dstr); /* can coerce to non-glob */
4329 }
7bac28a0 4330 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
4331 else if (PL_curstackinfo->si_type == PERLSI_SORT
4332 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
cea2e8a9 4333 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
7bac28a0 4334 GvNAME(dstr));
5bd07a3d 4335
7fb37951
AMS
4336#ifdef GV_UNIQUE_CHECK
4337 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
4338 Perl_croak(aTHX_ PL_no_modify);
4339 }
4340#endif
4341
a0d0e21e 4342 (void)SvOK_off(dstr);
a5f75d66 4343 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 4344 gp_free((GV*)dstr);
79072805 4345 GvGP(dstr) = gp_ref(GvGP(sstr));
27c9684d
AP
4346 if (SvTAINTED(sstr))
4347 SvTAINT(dstr);
1d7c1841
GS
4348 if (GvIMPORTED(dstr) != GVf_IMPORTED
4349 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4350 {
a5f75d66 4351 GvIMPORTED_on(dstr);
1d7c1841 4352 }
a5f75d66 4353 GvMULTI_on(dstr);
79072805
LW
4354 return;
4355 }
4356 /* FALL THROUGH */
4357
4358 default:
8d6d96c1 4359 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 4360 mg_get(sstr);
eb160463 4361 if ((int)SvTYPE(sstr) != stype) {
973f89ab
CS
4362 stype = SvTYPE(sstr);
4363 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
4364 goto glob_assign;
4365 }
4366 }
ded42b9f 4367 if (stype == SVt_PVLV)
6fc92669 4368 (void)SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 4369 else
eb160463 4370 (void)SvUPGRADE(dstr, (U32)stype);
79072805
LW
4371 }
4372
8990e307
LW
4373 sflags = SvFLAGS(sstr);
4374
4375 if (sflags & SVf_ROK) {
4376 if (dtype >= SVt_PV) {
4377 if (dtype == SVt_PVGV) {
4378 SV *sref = SvREFCNT_inc(SvRV(sstr));
4379 SV *dref = 0;
a3b680e6 4380 const int intro = GvINTRO(dstr);
a0d0e21e 4381
7fb37951
AMS
4382#ifdef GV_UNIQUE_CHECK
4383 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
4384 Perl_croak(aTHX_ PL_no_modify);
4385 }
4386#endif
4387
a0d0e21e 4388 if (intro) {
a5f75d66 4389 GvINTRO_off(dstr); /* one-shot flag */
1d7c1841 4390 GvLINE(dstr) = CopLINE(PL_curcop);
1edc1566 4391 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 4392 }
a5f75d66 4393 GvMULTI_on(dstr);
8990e307
LW
4394 switch (SvTYPE(sref)) {
4395 case SVt_PVAV:
a0d0e21e 4396 if (intro)
890ed176 4397 SAVEGENERICSV(GvAV(dstr));
a0d0e21e
LW
4398 else
4399 dref = (SV*)GvAV(dstr);
8990e307 4400 GvAV(dstr) = (AV*)sref;
39bac7f7 4401 if (!GvIMPORTED_AV(dstr)
1d7c1841
GS
4402 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4403 {
a5f75d66 4404 GvIMPORTED_AV_on(dstr);
1d7c1841 4405 }
8990e307
LW
4406 break;
4407 case SVt_PVHV:
a0d0e21e 4408 if (intro)
890ed176 4409 SAVEGENERICSV(GvHV(dstr));
a0d0e21e
LW
4410 else
4411 dref = (SV*)GvHV(dstr);
8990e307 4412 GvHV(dstr) = (HV*)sref;
39bac7f7 4413 if (!GvIMPORTED_HV(dstr)
1d7c1841
GS
4414 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4415 {
a5f75d66 4416 GvIMPORTED_HV_on(dstr);
1d7c1841 4417 }
8990e307
LW
4418 break;
4419 case SVt_PVCV:
8ebc5c01 4420 if (intro) {
4421 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
4422 SvREFCNT_dec(GvCV(dstr));
4423 GvCV(dstr) = Nullcv;
68dc0745 4424 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 4425 PL_sub_generation++;
8ebc5c01 4426 }
890ed176 4427 SAVEGENERICSV(GvCV(dstr));
8ebc5c01 4428 }
68dc0745 4429 else
4430 dref = (SV*)GvCV(dstr);
4431 if (GvCV(dstr) != (CV*)sref) {
748a9306 4432 CV* cv = GvCV(dstr);
4633a7c4 4433 if (cv) {
68dc0745 4434 if (!GvCVGEN((GV*)dstr) &&
4435 (CvROOT(cv) || CvXSUB(cv)))
4436 {
7bac28a0 4437 /* ahem, death to those who redefine
4438 * active sort subs */
3280af22
NIS
4439 if (PL_curstackinfo->si_type == PERLSI_SORT &&
4440 PL_sortcop == CvSTART(cv))
1c846c1f 4441 Perl_croak(aTHX_
7bac28a0 4442 "Can't redefine active sort subroutine %s",
4443 GvENAME((GV*)dstr));
beab0874
JT
4444 /* Redefining a sub - warning is mandatory if
4445 it was a const and its value changed. */
4446 if (ckWARN(WARN_REDEFINE)
4447 || (CvCONST(cv)
4448 && (!CvCONST((CV*)sref)
4449 || sv_cmp(cv_const_sv(cv),
4450 cv_const_sv((CV*)sref)))))
4451 {
9014280d 4452 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
beab0874 4453 CvCONST(cv)
910764e6
RGS
4454 ? "Constant subroutine %s::%s redefined"
4455 : "Subroutine %s::%s redefined",
4456 HvNAME(GvSTASH((GV*)dstr)),
beab0874
JT
4457 GvENAME((GV*)dstr));
4458 }
9607fc9c 4459 }
fb24441d
RGS
4460 if (!intro)
4461 cv_ckproto(cv, (GV*)dstr,
4462 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 4463 }
a5f75d66 4464 GvCV(dstr) = (CV*)sref;
7a4c00b4 4465 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 4466 GvASSUMECV_on(dstr);
3280af22 4467 PL_sub_generation++;
a5f75d66 4468 }
39bac7f7 4469 if (!GvIMPORTED_CV(dstr)
1d7c1841
GS
4470 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4471 {
a5f75d66 4472 GvIMPORTED_CV_on(dstr);
1d7c1841 4473 }
8990e307 4474 break;
91bba347
LW
4475 case SVt_PVIO:
4476 if (intro)
890ed176 4477 SAVEGENERICSV(GvIOp(dstr));
91bba347
LW
4478 else
4479 dref = (SV*)GvIOp(dstr);
4480 GvIOp(dstr) = (IO*)sref;
4481 break;
f4d13ee9
JH
4482 case SVt_PVFM:
4483 if (intro)
890ed176 4484 SAVEGENERICSV(GvFORM(dstr));
f4d13ee9
JH
4485 else
4486 dref = (SV*)GvFORM(dstr);
4487 GvFORM(dstr) = (CV*)sref;
4488 break;
8990e307 4489 default:
a0d0e21e 4490 if (intro)
890ed176 4491 SAVEGENERICSV(GvSV(dstr));
a0d0e21e
LW
4492 else
4493 dref = (SV*)GvSV(dstr);
8990e307 4494 GvSV(dstr) = sref;
39bac7f7 4495 if (!GvIMPORTED_SV(dstr)
1d7c1841
GS
4496 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4497 {
a5f75d66 4498 GvIMPORTED_SV_on(dstr);
1d7c1841 4499 }
8990e307
LW
4500 break;
4501 }
4502 if (dref)
4503 SvREFCNT_dec(dref);
27c9684d
AP
4504 if (SvTAINTED(sstr))
4505 SvTAINT(dstr);
8990e307
LW
4506 return;
4507 }
a0d0e21e 4508 if (SvPVX(dstr)) {
8bd4d4c5 4509 SvPV_free(dstr);
b162af07
SP
4510 SvLEN_set(dstr, 0);
4511 SvCUR_set(dstr, 0);
a0d0e21e 4512 }
8990e307 4513 }
a0d0e21e 4514 (void)SvOK_off(dstr);
b162af07 4515 SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
ed6116ce 4516 SvROK_on(dstr);
8990e307 4517 if (sflags & SVp_NOK) {
3332b3c1
JH
4518 SvNOKp_on(dstr);
4519 /* Only set the public OK flag if the source has public OK. */
4520 if (sflags & SVf_NOK)
4521 SvFLAGS(dstr) |= SVf_NOK;
9d6ce603 4522 SvNV_set(dstr, SvNVX(sstr));
ed6116ce 4523 }
8990e307 4524 if (sflags & SVp_IOK) {
3332b3c1
JH
4525 (void)SvIOKp_on(dstr);
4526 if (sflags & SVf_IOK)
4527 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4528 if (sflags & SVf_IVisUV)
25da4f38 4529 SvIsUV_on(dstr);
45977657 4530 SvIV_set(dstr, SvIVX(sstr));
ed6116ce 4531 }
a0d0e21e
LW
4532 if (SvAMAGIC(sstr)) {
4533 SvAMAGIC_on(dstr);
4534 }
ed6116ce 4535 }
8990e307 4536 else if (sflags & SVp_POK) {
765f542d 4537 bool isSwipe = 0;
79072805
LW
4538
4539 /*
4540 * Check to see if we can just swipe the string. If so, it's a
4541 * possible small lose on short strings, but a big win on long ones.
463ee0b2
LW
4542 * It might even be a win on short strings if SvPVX(dstr)
4543 * has to be allocated and SvPVX(sstr) has to be freed.
79072805
LW
4544 */
4545
120fac95
NC
4546 /* Whichever path we take through the next code, we want this true,
4547 and doing it now facilitates the COW check. */
4548 (void)SvPOK_only(dstr);
4549
765f542d
NC
4550 if (
4551#ifdef PERL_COPY_ON_WRITE
4552 (sflags & (SVf_FAKE | SVf_READONLY)) != (SVf_FAKE | SVf_READONLY)
4553 &&
4554#endif
4555 !(isSwipe =
4556 (sflags & SVs_TEMP) && /* slated for free anyway? */
4557 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
5fcdf167
NC
4558 (!(flags & SV_NOSTEAL)) &&
4559 /* and we're allowed to steal temps */
765f542d
NC
4560 SvREFCNT(sstr) == 1 && /* and no other references to it? */
4561 SvLEN(sstr) && /* and really is a string */
645c22ef 4562 /* and won't be needed again, potentially */
765f542d
NC
4563 !(PL_op && PL_op->op_type == OP_AASSIGN))
4564#ifdef PERL_COPY_ON_WRITE
4565 && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
120fac95 4566 && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
765f542d
NC
4567 && SvTYPE(sstr) >= SVt_PVIV)
4568#endif
4569 ) {
4570 /* Failed the swipe test, and it's not a shared hash key either.
4571 Have to copy the string. */
4572 STRLEN len = SvCUR(sstr);
4573 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
4574 Move(SvPVX(sstr),SvPVX(dstr),len,char);
4575 SvCUR_set(dstr, len);
4576 *SvEND(dstr) = '\0';
765f542d
NC
4577 } else {
4578 /* If PERL_COPY_ON_WRITE is not defined, then isSwipe will always
4579 be true in here. */
4580#ifdef PERL_COPY_ON_WRITE
4581 /* Either it's a shared hash key, or it's suitable for
4582 copy-on-write or we can swipe the string. */
46187eeb 4583 if (DEBUG_C_TEST) {
ed252734 4584 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
4585 sv_dump(sstr);
4586 sv_dump(dstr);
46187eeb 4587 }
765f542d
NC
4588 if (!isSwipe) {
4589 /* I believe I should acquire a global SV mutex if
4590 it's a COW sv (not a shared hash key) to stop
4591 it going un copy-on-write.
4592 If the source SV has gone un copy on write between up there
4593 and down here, then (assert() that) it is of the correct
4594 form to make it copy on write again */
4595 if ((sflags & (SVf_FAKE | SVf_READONLY))
4596 != (SVf_FAKE | SVf_READONLY)) {
4597 SvREADONLY_on(sstr);
4598 SvFAKE_on(sstr);
4599 /* Make the source SV into a loop of 1.
4600 (about to become 2) */
a29f6d03 4601 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
4602 }
4603 }
4604#endif
4605 /* Initial code is common. */
adbc6bb1 4606 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
4607 if (SvOOK(dstr)) {
4608 SvFLAGS(dstr) &= ~SVf_OOK;
4609 Safefree(SvPVX(dstr) - SvIVX(dstr));
4610 }
50483b2c 4611 else if (SvLEN(dstr))
a5f75d66 4612 Safefree(SvPVX(dstr));
79072805 4613 }
765f542d
NC
4614
4615#ifdef PERL_COPY_ON_WRITE
4616 if (!isSwipe) {
4617 /* making another shared SV. */
4618 STRLEN cur = SvCUR(sstr);
4619 STRLEN len = SvLEN(sstr);
d89fc664 4620 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
4621 if (len) {
4622 /* SvIsCOW_normal */
4623 /* splice us in between source and next-after-source. */
a29f6d03
NC
4624 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4625 SV_COW_NEXT_SV_SET(sstr, dstr);
765f542d
NC
4626 SvPV_set(dstr, SvPVX(sstr));
4627 } else {
4628 /* SvIsCOW_shared_hash */
4629 UV hash = SvUVX(sstr);
46187eeb
NC
4630 DEBUG_C(PerlIO_printf(Perl_debug_log,
4631 "Copy on write: Sharing hash\n"));
765f542d
NC
4632 SvPV_set(dstr,
4633 sharepvn(SvPVX(sstr),
4634 (sflags & SVf_UTF8?-cur:cur), hash));
607fa7f2 4635 SvUV_set(dstr, hash);
765f542d 4636 }
87a1ef3d
SP
4637 SvLEN_set(dstr, len);
4638 SvCUR_set(dstr, cur);
765f542d
NC
4639 SvREADONLY_on(dstr);
4640 SvFAKE_on(dstr);
4641 /* Relesase a global SV mutex. */
4642 }
4643 else
4644#endif
4645 { /* Passes the swipe test. */
4646 SvPV_set(dstr, SvPVX(sstr));
4647 SvLEN_set(dstr, SvLEN(sstr));
4648 SvCUR_set(dstr, SvCUR(sstr));
4649
4650 SvTEMP_off(dstr);
4651 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
4652 SvPV_set(sstr, Nullch);
4653 SvLEN_set(sstr, 0);
4654 SvCUR_set(sstr, 0);
4655 SvTEMP_off(sstr);
4656 }
4657 }
9aa983d2 4658 if (sflags & SVf_UTF8)
a7cb1f99 4659 SvUTF8_on(dstr);
79072805 4660 /*SUPPRESS 560*/
8990e307 4661 if (sflags & SVp_NOK) {
3332b3c1
JH
4662 SvNOKp_on(dstr);
4663 if (sflags & SVf_NOK)
4664 SvFLAGS(dstr) |= SVf_NOK;
9d6ce603 4665 SvNV_set(dstr, SvNVX(sstr));
79072805 4666 }
8990e307 4667 if (sflags & SVp_IOK) {
3332b3c1
JH
4668 (void)SvIOKp_on(dstr);
4669 if (sflags & SVf_IOK)
4670 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4671 if (sflags & SVf_IVisUV)
25da4f38 4672 SvIsUV_on(dstr);
45977657 4673 SvIV_set(dstr, SvIVX(sstr));
79072805 4674 }
92f0c265 4675 if (SvVOK(sstr)) {
7a5fa8a2 4676 MAGIC *smg = mg_find(sstr,PERL_MAGIC_vstring);
ece467f9
JP
4677 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4678 smg->mg_ptr, smg->mg_len);
439cb1c4 4679 SvRMAGICAL_on(dstr);
7a5fa8a2 4680 }
79072805 4681 }
8990e307 4682 else if (sflags & SVp_IOK) {
3332b3c1
JH
4683 if (sflags & SVf_IOK)
4684 (void)SvIOK_only(dstr);
4685 else {
9cbac4c7
DM
4686 (void)SvOK_off(dstr);
4687 (void)SvIOKp_on(dstr);
3332b3c1
JH
4688 }
4689 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2b1c7e3e 4690 if (sflags & SVf_IVisUV)
25da4f38 4691 SvIsUV_on(dstr);
45977657 4692 SvIV_set(dstr, SvIVX(sstr));
3332b3c1
JH
4693 if (sflags & SVp_NOK) {
4694 if (sflags & SVf_NOK)
4695 (void)SvNOK_on(dstr);
4696 else
4697 (void)SvNOKp_on(dstr);
9d6ce603 4698 SvNV_set(dstr, SvNVX(sstr));
3332b3c1
JH
4699 }
4700 }
4701 else if (sflags & SVp_NOK) {
4702 if (sflags & SVf_NOK)
4703 (void)SvNOK_only(dstr);
4704 else {
9cbac4c7 4705 (void)SvOK_off(dstr);
3332b3c1
JH
4706 SvNOKp_on(dstr);
4707 }
9d6ce603 4708 SvNV_set(dstr, SvNVX(sstr));
79072805
LW
4709 }
4710 else {
20408e3c 4711 if (dtype == SVt_PVGV) {
e476b1b5 4712 if (ckWARN(WARN_MISC))
9014280d 4713 Perl_warner(aTHX_ packWARN(WARN_MISC), "Undefined value assigned to typeglob");
20408e3c
GS
4714 }
4715 else
4716 (void)SvOK_off(dstr);
a0d0e21e 4717 }
27c9684d
AP
4718 if (SvTAINTED(sstr))
4719 SvTAINT(dstr);
79072805
LW
4720}
4721
954c1994
GS
4722/*
4723=for apidoc sv_setsv_mg
4724
4725Like C<sv_setsv>, but also handles 'set' magic.
4726
4727=cut
4728*/
4729
79072805 4730void
864dbfa3 4731Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
4732{
4733 sv_setsv(dstr,sstr);
4734 SvSETMAGIC(dstr);
4735}
4736
ed252734
NC
4737#ifdef PERL_COPY_ON_WRITE
4738SV *
4739Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4740{
4741 STRLEN cur = SvCUR(sstr);
4742 STRLEN len = SvLEN(sstr);
4743 register char *new_pv;
4744
4745 if (DEBUG_C_TEST) {
4746 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4747 sstr, dstr);
4748 sv_dump(sstr);
4749 if (dstr)
4750 sv_dump(dstr);
4751 }
4752
4753 if (dstr) {
4754 if (SvTHINKFIRST(dstr))
4755 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
4756 else if (SvPVX(dstr))
4757 Safefree(SvPVX(dstr));
4758 }
4759 else
4760 new_SV(dstr);
b988aa42 4761 (void)SvUPGRADE (dstr, SVt_PVIV);
ed252734
NC
4762
4763 assert (SvPOK(sstr));
4764 assert (SvPOKp(sstr));
4765 assert (!SvIOK(sstr));
4766 assert (!SvIOKp(sstr));
4767 assert (!SvNOK(sstr));
4768 assert (!SvNOKp(sstr));
4769
4770 if (SvIsCOW(sstr)) {
4771
4772 if (SvLEN(sstr) == 0) {
4773 /* source is a COW shared hash key. */
4774 UV hash = SvUVX(sstr);
4775 DEBUG_C(PerlIO_printf(Perl_debug_log,
4776 "Fast copy on write: Sharing hash\n"));
607fa7f2 4777 SvUV_set(dstr, hash);
ed252734
NC
4778 new_pv = sharepvn(SvPVX(sstr), (SvUTF8(sstr)?-cur:cur), hash);
4779 goto common_exit;
4780 }
4781 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4782 } else {
4783 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
b988aa42 4784 (void)SvUPGRADE (sstr, SVt_PVIV);
ed252734
NC
4785 SvREADONLY_on(sstr);
4786 SvFAKE_on(sstr);
4787 DEBUG_C(PerlIO_printf(Perl_debug_log,
4788 "Fast copy on write: Converting sstr to COW\n"));
4789 SV_COW_NEXT_SV_SET(dstr, sstr);
4790 }
4791 SV_COW_NEXT_SV_SET(sstr, dstr);
4792 new_pv = SvPVX(sstr);
4793
4794 common_exit:
4795 SvPV_set(dstr, new_pv);
4796 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4797 if (SvUTF8(sstr))
4798 SvUTF8_on(dstr);
87a1ef3d
SP
4799 SvLEN_set(dstr, len);
4800 SvCUR_set(dstr, cur);
ed252734
NC
4801 if (DEBUG_C_TEST) {
4802 sv_dump(dstr);
4803 }
4804 return dstr;
4805}
4806#endif
4807
954c1994
GS
4808/*
4809=for apidoc sv_setpvn
4810
4811Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
4812bytes to be copied. If the C<ptr> argument is NULL the SV will become
4813undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
4814
4815=cut
4816*/
4817
ef50df4b 4818void
864dbfa3 4819Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 4820{
c6f8c383 4821 register char *dptr;
22c522df 4822
765f542d 4823 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4824 if (!ptr) {
a0d0e21e 4825 (void)SvOK_off(sv);
463ee0b2
LW
4826 return;
4827 }
22c522df
JH
4828 else {
4829 /* len is STRLEN which is unsigned, need to copy to signed */
a3b680e6 4830 const IV iv = len;
9c5ffd7c
JH
4831 if (iv < 0)
4832 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 4833 }
6fc92669 4834 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4835
79072805 4836 SvGROW(sv, len + 1);
c6f8c383
GA
4837 dptr = SvPVX(sv);
4838 Move(ptr,dptr,len,char);
4839 dptr[len] = '\0';
79072805 4840 SvCUR_set(sv, len);
1aa99e6b 4841 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4842 SvTAINT(sv);
79072805
LW
4843}
4844
954c1994
GS
4845/*
4846=for apidoc sv_setpvn_mg
4847
4848Like C<sv_setpvn>, but also handles 'set' magic.
4849
4850=cut
4851*/
4852
79072805 4853void
864dbfa3 4854Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4855{
4856 sv_setpvn(sv,ptr,len);
4857 SvSETMAGIC(sv);
4858}
4859
954c1994
GS
4860/*
4861=for apidoc sv_setpv
4862
4863Copies a string into an SV. The string must be null-terminated. Does not
4864handle 'set' magic. See C<sv_setpv_mg>.
4865
4866=cut
4867*/
4868
ef50df4b 4869void
864dbfa3 4870Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4871{
4872 register STRLEN len;
4873
765f542d 4874 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4875 if (!ptr) {
a0d0e21e 4876 (void)SvOK_off(sv);
463ee0b2
LW
4877 return;
4878 }
79072805 4879 len = strlen(ptr);
6fc92669 4880 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4881
79072805 4882 SvGROW(sv, len + 1);
463ee0b2 4883 Move(ptr,SvPVX(sv),len+1,char);
79072805 4884 SvCUR_set(sv, len);
1aa99e6b 4885 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
4886 SvTAINT(sv);
4887}
4888
954c1994
GS
4889/*
4890=for apidoc sv_setpv_mg
4891
4892Like C<sv_setpv>, but also handles 'set' magic.
4893
4894=cut
4895*/
4896
463ee0b2 4897void
864dbfa3 4898Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
4899{
4900 sv_setpv(sv,ptr);
4901 SvSETMAGIC(sv);
4902}
4903
954c1994
GS
4904/*
4905=for apidoc sv_usepvn
4906
4907Tells an SV to use C<ptr> to find its string value. Normally the string is
1c846c1f 4908stored inside the SV but sv_usepvn allows the SV to use an outside string.
954c1994
GS
4909The C<ptr> should point to memory that was allocated by C<malloc>. The
4910string length, C<len>, must be supplied. This function will realloc the
4911memory pointed to by C<ptr>, so that pointer should not be freed or used by
4912the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
4913See C<sv_usepvn_mg>.
4914
4915=cut
4916*/
4917
ef50df4b 4918void
864dbfa3 4919Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 4920{
765f542d 4921 SV_CHECK_THINKFIRST_COW_DROP(sv);
c6f8c383 4922 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 4923 if (!ptr) {
a0d0e21e 4924 (void)SvOK_off(sv);
463ee0b2
LW
4925 return;
4926 }
8bd4d4c5
NC
4927 if (SvPVX(sv))
4928 SvPV_free(sv);
463ee0b2 4929 Renew(ptr, len+1, char);
f880fe2f 4930 SvPV_set(sv, ptr);
463ee0b2
LW
4931 SvCUR_set(sv, len);
4932 SvLEN_set(sv, len+1);
4933 *SvEND(sv) = '\0';
1aa99e6b 4934 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4935 SvTAINT(sv);
79072805
LW
4936}
4937
954c1994
GS
4938/*
4939=for apidoc sv_usepvn_mg
4940
4941Like C<sv_usepvn>, but also handles 'set' magic.
4942
4943=cut
4944*/
4945
ef50df4b 4946void
864dbfa3 4947Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 4948{
51c1089b 4949 sv_usepvn(sv,ptr,len);
ef50df4b
GS
4950 SvSETMAGIC(sv);
4951}
4952
765f542d
NC
4953#ifdef PERL_COPY_ON_WRITE
4954/* Need to do this *after* making the SV normal, as we need the buffer
4955 pointer to remain valid until after we've copied it. If we let go too early,
4956 another thread could invalidate it by unsharing last of the same hash key
4957 (which it can do by means other than releasing copy-on-write Svs)
4958 or by changing the other copy-on-write SVs in the loop. */
4959STATIC void
4960S_sv_release_COW(pTHX_ register SV *sv, char *pvx, STRLEN cur, STRLEN len,
4961 U32 hash, SV *after)
4962{
4963 if (len) { /* this SV was SvIsCOW_normal(sv) */
4964 /* we need to find the SV pointing to us. */
4965 SV *current = SV_COW_NEXT_SV(after);
7a5fa8a2 4966
765f542d
NC
4967 if (current == sv) {
4968 /* The SV we point to points back to us (there were only two of us
4969 in the loop.)
4970 Hence other SV is no longer copy on write either. */
4971 SvFAKE_off(after);
4972 SvREADONLY_off(after);
4973 } else {
4974 /* We need to follow the pointers around the loop. */
4975 SV *next;
4976 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4977 assert (next);
4978 current = next;
4979 /* don't loop forever if the structure is bust, and we have
4980 a pointer into a closed loop. */
4981 assert (current != after);
e419cbc5 4982 assert (SvPVX(current) == pvx);
765f542d
NC
4983 }
4984 /* Make the SV before us point to the SV after us. */
a29f6d03 4985 SV_COW_NEXT_SV_SET(current, after);
765f542d
NC
4986 }
4987 } else {
4988 unsharepvn(pvx, SvUTF8(sv) ? -(I32)cur : cur, hash);
4989 }
4990}
4991
4992int
4993Perl_sv_release_IVX(pTHX_ register SV *sv)
4994{
4995 if (SvIsCOW(sv))
4996 sv_force_normal_flags(sv, 0);
0c34ef67
MHM
4997 SvOOK_off(sv);
4998 return 0;
765f542d
NC
4999}
5000#endif
645c22ef
DM
5001/*
5002=for apidoc sv_force_normal_flags
5003
5004Undo various types of fakery on an SV: if the PV is a shared string, make
5005a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
5006an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
5007we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
5008then a copy-on-write scalar drops its PV buffer (if any) and becomes
5009SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 5010set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
5011C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
5012with flags set to 0.
645c22ef
DM
5013
5014=cut
5015*/
5016
6fc92669 5017void
840a7b70 5018Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 5019{
765f542d
NC
5020#ifdef PERL_COPY_ON_WRITE
5021 if (SvREADONLY(sv)) {
5022 /* At this point I believe I should acquire a global SV mutex. */
5023 if (SvFAKE(sv)) {
5024 char *pvx = SvPVX(sv);
5025 STRLEN len = SvLEN(sv);
5026 STRLEN cur = SvCUR(sv);
5027 U32 hash = SvUVX(sv);
5028 SV *next = SV_COW_NEXT_SV(sv); /* next COW sv in the loop. */
46187eeb
NC
5029 if (DEBUG_C_TEST) {
5030 PerlIO_printf(Perl_debug_log,
5031 "Copy on write: Force normal %ld\n",
5032 (long) flags);
e419cbc5 5033 sv_dump(sv);
46187eeb 5034 }
765f542d
NC
5035 SvFAKE_off(sv);
5036 SvREADONLY_off(sv);
5037 /* This SV doesn't own the buffer, so need to New() a new one: */
f880fe2f 5038 SvPV_set(sv, (char*)0);
87a1ef3d 5039 SvLEN_set(sv, 0);
765f542d
NC
5040 if (flags & SV_COW_DROP_PV) {
5041 /* OK, so we don't need to copy our buffer. */
5042 SvPOK_off(sv);
5043 } else {
5044 SvGROW(sv, cur + 1);
5045 Move(pvx,SvPVX(sv),cur,char);
87a1ef3d 5046 SvCUR_set(sv, cur);
765f542d
NC
5047 *SvEND(sv) = '\0';
5048 }
e419cbc5 5049 sv_release_COW(sv, pvx, cur, len, hash, next);
46187eeb 5050 if (DEBUG_C_TEST) {
e419cbc5 5051 sv_dump(sv);
46187eeb 5052 }
765f542d 5053 }
923e4eb5 5054 else if (IN_PERL_RUNTIME)
765f542d
NC
5055 Perl_croak(aTHX_ PL_no_modify);
5056 /* At this point I believe that I can drop the global SV mutex. */
5057 }
5058#else
2213622d 5059 if (SvREADONLY(sv)) {
1c846c1f
NIS
5060 if (SvFAKE(sv)) {
5061 char *pvx = SvPVX(sv);
5c98da1c 5062 int is_utf8 = SvUTF8(sv);
1c846c1f
NIS
5063 STRLEN len = SvCUR(sv);
5064 U32 hash = SvUVX(sv);
10bcdfd6
NC
5065 SvFAKE_off(sv);
5066 SvREADONLY_off(sv);
f880fe2f 5067 SvPV_set(sv, (char*)0);
b162af07 5068 SvLEN_set(sv, 0);
1c846c1f
NIS
5069 SvGROW(sv, len + 1);
5070 Move(pvx,SvPVX(sv),len,char);
5071 *SvEND(sv) = '\0';
5c98da1c 5072 unsharepvn(pvx, is_utf8 ? -(I32)len : len, hash);
1c846c1f 5073 }
923e4eb5 5074 else if (IN_PERL_RUNTIME)
cea2e8a9 5075 Perl_croak(aTHX_ PL_no_modify);
0f15f207 5076 }
765f542d 5077#endif
2213622d 5078 if (SvROK(sv))
840a7b70 5079 sv_unref_flags(sv, flags);
6fc92669
GS
5080 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
5081 sv_unglob(sv);
0f15f207 5082}
1c846c1f 5083
645c22ef
DM
5084/*
5085=for apidoc sv_force_normal
5086
5087Undo various types of fakery on an SV: if the PV is a shared string, make
5088a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
5089an xpvmg. See also C<sv_force_normal_flags>.
5090
5091=cut
5092*/
5093
840a7b70
IZ
5094void
5095Perl_sv_force_normal(pTHX_ register SV *sv)
5096{
5097 sv_force_normal_flags(sv, 0);
5098}
5099
954c1994
GS
5100/*
5101=for apidoc sv_chop
5102
1c846c1f 5103Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
5104SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
5105the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 5106string. Uses the "OOK hack".
31869a79
AE
5107Beware: after this function returns, C<ptr> and SvPVX(sv) may no longer
5108refer to the same chunk of data.
954c1994
GS
5109
5110=cut
5111*/
5112
79072805 5113void
f54cb97a 5114Perl_sv_chop(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
5115{
5116 register STRLEN delta;
a0d0e21e 5117 if (!ptr || !SvPOKp(sv))
79072805 5118 return;
31869a79 5119 delta = ptr - SvPVX(sv);
2213622d 5120 SV_CHECK_THINKFIRST(sv);
79072805
LW
5121 if (SvTYPE(sv) < SVt_PVIV)
5122 sv_upgrade(sv,SVt_PVIV);
5123
5124 if (!SvOOK(sv)) {
50483b2c 5125 if (!SvLEN(sv)) { /* make copy of shared string */
f54cb97a 5126 const char *pvx = SvPVX(sv);
50483b2c
JD
5127 STRLEN len = SvCUR(sv);
5128 SvGROW(sv, len + 1);
5129 Move(pvx,SvPVX(sv),len,char);
5130 *SvEND(sv) = '\0';
5131 }
45977657 5132 SvIV_set(sv, 0);
a4bfb290
AB
5133 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
5134 and we do that anyway inside the SvNIOK_off
5135 */
7a5fa8a2 5136 SvFLAGS(sv) |= SVf_OOK;
79072805 5137 }
a4bfb290 5138 SvNIOK_off(sv);
b162af07
SP
5139 SvLEN_set(sv, SvLEN(sv) - delta);
5140 SvCUR_set(sv, SvCUR(sv) - delta);
f880fe2f 5141 SvPV_set(sv, SvPVX(sv) + delta);
45977657 5142 SvIV_set(sv, SvIVX(sv) + delta);
79072805
LW
5143}
5144
09540bc3
JH
5145/* sv_catpvn() is now a macro using Perl_sv_catpvn_flags();
5146 * this function provided for binary compatibility only
5147 */
5148
5149void
5150Perl_sv_catpvn(pTHX_ SV *dsv, const char* sstr, STRLEN slen)
5151{
5152 sv_catpvn_flags(dsv, sstr, slen, SV_GMAGIC);
5153}
5154
954c1994
GS
5155/*
5156=for apidoc sv_catpvn
5157
5158Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
5159C<len> indicates number of bytes to copy. If the SV has the UTF-8
5160status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 5161Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 5162
8d6d96c1
HS
5163=for apidoc sv_catpvn_flags
5164
5165Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
5166C<len> indicates number of bytes to copy. If the SV has the UTF-8
5167status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
5168If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
5169appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
5170in terms of this function.
5171
5172=cut
5173*/
5174
5175void
5176Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
5177{
5178 STRLEN dlen;
f54cb97a 5179 const char *dstr = SvPV_force_flags(dsv, dlen, flags);
8d6d96c1 5180
8d6d96c1
HS
5181 SvGROW(dsv, dlen + slen + 1);
5182 if (sstr == dstr)
5183 sstr = SvPVX(dsv);
5184 Move(sstr, SvPVX(dsv) + dlen, slen, char);
b162af07 5185 SvCUR_set(dsv, SvCUR(dsv) + slen);
8d6d96c1
HS
5186 *SvEND(dsv) = '\0';
5187 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
5188 SvTAINT(dsv);
79072805
LW
5189}
5190
954c1994
GS
5191/*
5192=for apidoc sv_catpvn_mg
5193
5194Like C<sv_catpvn>, but also handles 'set' magic.
5195
5196=cut
5197*/
5198
79072805 5199void
864dbfa3 5200Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
5201{
5202 sv_catpvn(sv,ptr,len);
5203 SvSETMAGIC(sv);
5204}
5205
09540bc3
JH
5206/* sv_catsv() is now a macro using Perl_sv_catsv_flags();
5207 * this function provided for binary compatibility only
5208 */
5209
5210void
5211Perl_sv_catsv(pTHX_ SV *dstr, register SV *sstr)
5212{
5213 sv_catsv_flags(dstr, sstr, SV_GMAGIC);
5214}
5215
954c1994
GS
5216/*
5217=for apidoc sv_catsv
5218
13e8c8e3
JH
5219Concatenates the string from SV C<ssv> onto the end of the string in
5220SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
5221not 'set' magic. See C<sv_catsv_mg>.
954c1994 5222
8d6d96c1
HS
5223=for apidoc sv_catsv_flags
5224
5225Concatenates the string from SV C<ssv> onto the end of the string in
5226SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
5227bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
5228and C<sv_catsv_nomg> are implemented in terms of this function.
5229
5230=cut */
5231
ef50df4b 5232void
8d6d96c1 5233Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 5234{
13e8c8e3
JH
5235 char *spv;
5236 STRLEN slen;
46199a12 5237 if (!ssv)
79072805 5238 return;
46199a12 5239 if ((spv = SvPV(ssv, slen))) {
4fd84b44
AD
5240 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
5241 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
8cf8f3d1
NIS
5242 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
5243 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4fd84b44
AD
5244 dsv->sv_flags doesn't have that bit set.
5245 Andy Dougherty 12 Oct 2001
5246 */
5247 I32 sutf8 = DO_UTF8(ssv);
5248 I32 dutf8;
13e8c8e3 5249
8d6d96c1
HS
5250 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
5251 mg_get(dsv);
5252 dutf8 = DO_UTF8(dsv);
5253
5254 if (dutf8 != sutf8) {
13e8c8e3 5255 if (dutf8) {
46199a12 5256 /* Not modifying source SV, so taking a temporary copy. */
8d6d96c1 5257 SV* csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 5258
46199a12 5259 sv_utf8_upgrade(csv);
8d6d96c1 5260 spv = SvPV(csv, slen);
13e8c8e3 5261 }
8d6d96c1
HS
5262 else
5263 sv_utf8_upgrade_nomg(dsv);
e84ff256 5264 }
8d6d96c1 5265 sv_catpvn_nomg(dsv, spv, slen);
560a288e 5266 }
79072805
LW
5267}
5268
954c1994
GS
5269/*
5270=for apidoc sv_catsv_mg
5271
5272Like C<sv_catsv>, but also handles 'set' magic.
5273
5274=cut
5275*/
5276
79072805 5277void
46199a12 5278Perl_sv_catsv_mg(pTHX_ SV *dsv, register SV *ssv)
ef50df4b 5279{
46199a12
JH
5280 sv_catsv(dsv,ssv);
5281 SvSETMAGIC(dsv);
ef50df4b
GS
5282}
5283
954c1994
GS
5284/*
5285=for apidoc sv_catpv
5286
5287Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
5288If the SV has the UTF-8 status set, then the bytes appended should be
5289valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 5290
d5ce4a7c 5291=cut */
954c1994 5292
ef50df4b 5293void
0c981600 5294Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
5295{
5296 register STRLEN len;
463ee0b2 5297 STRLEN tlen;
748a9306 5298 char *junk;
79072805 5299
0c981600 5300 if (!ptr)
79072805 5301 return;
748a9306 5302 junk = SvPV_force(sv, tlen);
0c981600 5303 len = strlen(ptr);
463ee0b2 5304 SvGROW(sv, tlen + len + 1);
0c981600
JH
5305 if (ptr == junk)
5306 ptr = SvPVX(sv);
5307 Move(ptr,SvPVX(sv)+tlen,len+1,char);
b162af07 5308 SvCUR_set(sv, SvCUR(sv) + len);
d41ff1b8 5309 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 5310 SvTAINT(sv);
79072805
LW
5311}
5312
954c1994
GS
5313/*
5314=for apidoc sv_catpv_mg
5315
5316Like C<sv_catpv>, but also handles 'set' magic.
5317
5318=cut
5319*/
5320
ef50df4b 5321void
0c981600 5322Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 5323{
0c981600 5324 sv_catpv(sv,ptr);
ef50df4b
GS
5325 SvSETMAGIC(sv);
5326}
5327
645c22ef
DM
5328/*
5329=for apidoc newSV
5330
5331Create a new null SV, or if len > 0, create a new empty SVt_PV type SV
5332with an initial PV allocation of len+1. Normally accessed via the C<NEWSV>
5333macro.
5334
5335=cut
5336*/
5337
79072805 5338SV *
864dbfa3 5339Perl_newSV(pTHX_ STRLEN len)
79072805
LW
5340{
5341 register SV *sv;
1c846c1f 5342
4561caa4 5343 new_SV(sv);
79072805
LW
5344 if (len) {
5345 sv_upgrade(sv, SVt_PV);
5346 SvGROW(sv, len + 1);
5347 }
5348 return sv;
5349}
954c1994 5350/*
92110913 5351=for apidoc sv_magicext
954c1994 5352
68795e93 5353Adds magic to an SV, upgrading it if necessary. Applies the
2d8d5d5a 5354supplied vtable and returns a pointer to the magic added.
92110913 5355
2d8d5d5a
SH
5356Note that C<sv_magicext> will allow things that C<sv_magic> will not.
5357In particular, you can add magic to SvREADONLY SVs, and add more than
5358one instance of the same 'how'.
645c22ef 5359
2d8d5d5a
SH
5360If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
5361stored, if C<namlen> is zero then C<name> is stored as-is and - as another
5362special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
5363to contain an C<SV*> and is stored as-is with its REFCNT incremented.
92110913 5364
2d8d5d5a 5365(This is now used as a subroutine by C<sv_magic>.)
954c1994
GS
5366
5367=cut
5368*/
92110913 5369MAGIC *
e1ec3a88 5370Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, const MGVTBL *vtable,
92110913 5371 const char* name, I32 namlen)
79072805
LW
5372{
5373 MAGIC* mg;
68795e93 5374
92110913
NIS
5375 if (SvTYPE(sv) < SVt_PVMG) {
5376 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 5377 }
79072805
LW
5378 Newz(702,mg, 1, MAGIC);
5379 mg->mg_moremagic = SvMAGIC(sv);
b162af07 5380 SvMAGIC_set(sv, mg);
75f9d97a 5381
05f95b08
SB
5382 /* Sometimes a magic contains a reference loop, where the sv and
5383 object refer to each other. To prevent a reference loop that
5384 would prevent such objects being freed, we look for such loops
5385 and if we find one we avoid incrementing the object refcount.
87f0b213
JH
5386
5387 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 5388 have its REFCNT incremented to keep it in existence.
87f0b213
JH
5389
5390 */
14befaf4
DM
5391 if (!obj || obj == sv ||
5392 how == PERL_MAGIC_arylen ||
5393 how == PERL_MAGIC_qr ||
75f9d97a
JH
5394 (SvTYPE(obj) == SVt_PVGV &&
5395 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
5396 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 5397 GvFORM(obj) == (CV*)sv)))
75f9d97a 5398 {
8990e307 5399 mg->mg_obj = obj;
75f9d97a 5400 }
85e6fe83 5401 else {
8990e307 5402 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
5403 mg->mg_flags |= MGf_REFCOUNTED;
5404 }
b5ccf5f2
YST
5405
5406 /* Normal self-ties simply pass a null object, and instead of
5407 using mg_obj directly, use the SvTIED_obj macro to produce a
5408 new RV as needed. For glob "self-ties", we are tieing the PVIO
5409 with an RV obj pointing to the glob containing the PVIO. In
5410 this case, to avoid a reference loop, we need to weaken the
5411 reference.
5412 */
5413
5414 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
5415 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
5416 {
5417 sv_rvweaken(obj);
5418 }
5419
79072805 5420 mg->mg_type = how;
565764a8 5421 mg->mg_len = namlen;
9cbac4c7 5422 if (name) {
92110913 5423 if (namlen > 0)
1edc1566 5424 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 5425 else if (namlen == HEf_SVKEY)
1edc1566 5426 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
68795e93 5427 else
92110913 5428 mg->mg_ptr = (char *) name;
9cbac4c7 5429 }
92110913 5430 mg->mg_virtual = vtable;
68795e93 5431
92110913
NIS
5432 mg_magical(sv);
5433 if (SvGMAGICAL(sv))
5434 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
5435 return mg;
5436}
5437
5438/*
5439=for apidoc sv_magic
1c846c1f 5440
92110913
NIS
5441Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
5442then adds a new magic item of type C<how> to the head of the magic list.
5443
2d8d5d5a
SH
5444See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
5445handling of the C<name> and C<namlen> arguments.
5446
4509d3fb
SB
5447You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
5448to add more than one instance of the same 'how'.
5449
92110913
NIS
5450=cut
5451*/
5452
5453void
5454Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 5455{
e1ec3a88 5456 const MGVTBL *vtable = 0;
92110913 5457 MAGIC* mg;
92110913 5458
765f542d
NC
5459#ifdef PERL_COPY_ON_WRITE
5460 if (SvIsCOW(sv))
5461 sv_force_normal_flags(sv, 0);
5462#endif
92110913 5463 if (SvREADONLY(sv)) {
923e4eb5 5464 if (IN_PERL_RUNTIME
92110913
NIS
5465 && how != PERL_MAGIC_regex_global
5466 && how != PERL_MAGIC_bm
5467 && how != PERL_MAGIC_fm
5468 && how != PERL_MAGIC_sv
e6469971 5469 && how != PERL_MAGIC_backref
92110913
NIS
5470 )
5471 {
5472 Perl_croak(aTHX_ PL_no_modify);
5473 }
5474 }
5475 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
5476 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
5477 /* sv_magic() refuses to add a magic of the same 'how' as an
5478 existing one
92110913
NIS
5479 */
5480 if (how == PERL_MAGIC_taint)
5481 mg->mg_len |= 1;
5482 return;
5483 }
5484 }
68795e93 5485
79072805 5486 switch (how) {
14befaf4 5487 case PERL_MAGIC_sv:
92110913 5488 vtable = &PL_vtbl_sv;
79072805 5489 break;
14befaf4 5490 case PERL_MAGIC_overload:
92110913 5491 vtable = &PL_vtbl_amagic;
a0d0e21e 5492 break;
14befaf4 5493 case PERL_MAGIC_overload_elem:
92110913 5494 vtable = &PL_vtbl_amagicelem;
a0d0e21e 5495 break;
14befaf4 5496 case PERL_MAGIC_overload_table:
92110913 5497 vtable = &PL_vtbl_ovrld;
a0d0e21e 5498 break;
14befaf4 5499 case PERL_MAGIC_bm:
92110913 5500 vtable = &PL_vtbl_bm;
79072805 5501 break;
14befaf4 5502 case PERL_MAGIC_regdata:
92110913 5503 vtable = &PL_vtbl_regdata;
6cef1e77 5504 break;
14befaf4 5505 case PERL_MAGIC_regdatum:
92110913 5506 vtable = &PL_vtbl_regdatum;
6cef1e77 5507 break;
14befaf4 5508 case PERL_MAGIC_env:
92110913 5509 vtable = &PL_vtbl_env;
79072805 5510 break;
14befaf4 5511 case PERL_MAGIC_fm:
92110913 5512 vtable = &PL_vtbl_fm;
55497cff 5513 break;
14befaf4 5514 case PERL_MAGIC_envelem:
92110913 5515 vtable = &PL_vtbl_envelem;
79072805 5516 break;
14befaf4 5517 case PERL_MAGIC_regex_global:
92110913 5518 vtable = &PL_vtbl_mglob;
93a17b20 5519 break;
14befaf4 5520 case PERL_MAGIC_isa:
92110913 5521 vtable = &PL_vtbl_isa;
463ee0b2 5522 break;
14befaf4 5523 case PERL_MAGIC_isaelem:
92110913 5524 vtable = &PL_vtbl_isaelem;
463ee0b2 5525 break;
14befaf4 5526 case PERL_MAGIC_nkeys:
92110913 5527 vtable = &PL_vtbl_nkeys;
16660edb 5528 break;
14befaf4 5529 case PERL_MAGIC_dbfile:
92110913 5530 vtable = 0;
93a17b20 5531 break;
14befaf4 5532 case PERL_MAGIC_dbline:
92110913 5533 vtable = &PL_vtbl_dbline;
79072805 5534 break;
36477c24 5535#ifdef USE_LOCALE_COLLATE
14befaf4 5536 case PERL_MAGIC_collxfrm:
92110913 5537 vtable = &PL_vtbl_collxfrm;
bbce6d69 5538 break;
36477c24 5539#endif /* USE_LOCALE_COLLATE */
14befaf4 5540 case PERL_MAGIC_tied:
92110913 5541 vtable = &PL_vtbl_pack;
463ee0b2 5542 break;
14befaf4
DM
5543 case PERL_MAGIC_tiedelem:
5544 case PERL_MAGIC_tiedscalar:
92110913 5545 vtable = &PL_vtbl_packelem;
463ee0b2 5546 break;
14befaf4 5547 case PERL_MAGIC_qr:
92110913 5548 vtable = &PL_vtbl_regexp;
c277df42 5549 break;
14befaf4 5550 case PERL_MAGIC_sig:
92110913 5551 vtable = &PL_vtbl_sig;
79072805 5552 break;
14befaf4 5553 case PERL_MAGIC_sigelem:
92110913 5554 vtable = &PL_vtbl_sigelem;
79072805 5555 break;
14befaf4 5556 case PERL_MAGIC_taint:
92110913 5557 vtable = &PL_vtbl_taint;
463ee0b2 5558 break;
14befaf4 5559 case PERL_MAGIC_uvar:
92110913 5560 vtable = &PL_vtbl_uvar;
79072805 5561 break;
14befaf4 5562 case PERL_MAGIC_vec:
92110913 5563 vtable = &PL_vtbl_vec;
79072805 5564 break;
ece467f9
JP
5565 case PERL_MAGIC_vstring:
5566 vtable = 0;
5567 break;
7e8c5dac
HS
5568 case PERL_MAGIC_utf8:
5569 vtable = &PL_vtbl_utf8;
5570 break;
14befaf4 5571 case PERL_MAGIC_substr:
92110913 5572 vtable = &PL_vtbl_substr;
79072805 5573 break;
14befaf4 5574 case PERL_MAGIC_defelem:
92110913 5575 vtable = &PL_vtbl_defelem;
5f05dabc 5576 break;
14befaf4 5577 case PERL_MAGIC_glob:
92110913 5578 vtable = &PL_vtbl_glob;
79072805 5579 break;
14befaf4 5580 case PERL_MAGIC_arylen:
92110913 5581 vtable = &PL_vtbl_arylen;
79072805 5582 break;
14befaf4 5583 case PERL_MAGIC_pos:
92110913 5584 vtable = &PL_vtbl_pos;
a0d0e21e 5585 break;
14befaf4 5586 case PERL_MAGIC_backref:
92110913 5587 vtable = &PL_vtbl_backref;
810b8aa5 5588 break;
14befaf4
DM
5589 case PERL_MAGIC_ext:
5590 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
5591 /* Useful for attaching extension internal data to perl vars. */
5592 /* Note that multiple extensions may clash if magical scalars */
5593 /* etc holding private data from one are passed to another. */
a0d0e21e 5594 break;
79072805 5595 default:
14befaf4 5596 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 5597 }
68795e93 5598
92110913 5599 /* Rest of work is done else where */
27da23d5 5600 mg = sv_magicext(sv,obj,how,(MGVTBL*)vtable,name,namlen);
68795e93 5601
92110913
NIS
5602 switch (how) {
5603 case PERL_MAGIC_taint:
5604 mg->mg_len = 1;
5605 break;
5606 case PERL_MAGIC_ext:
5607 case PERL_MAGIC_dbfile:
5608 SvRMAGICAL_on(sv);
5609 break;
5610 }
463ee0b2
LW
5611}
5612
c461cf8f
JH
5613/*
5614=for apidoc sv_unmagic
5615
645c22ef 5616Removes all magic of type C<type> from an SV.
c461cf8f
JH
5617
5618=cut
5619*/
5620
463ee0b2 5621int
864dbfa3 5622Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
5623{
5624 MAGIC* mg;
5625 MAGIC** mgp;
91bba347 5626 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
5627 return 0;
5628 mgp = &SvMAGIC(sv);
5629 for (mg = *mgp; mg; mg = *mgp) {
5630 if (mg->mg_type == type) {
e1ec3a88 5631 const MGVTBL* const vtbl = mg->mg_virtual;
463ee0b2 5632 *mgp = mg->mg_moremagic;
1d7c1841 5633 if (vtbl && vtbl->svt_free)
fc0dc3b3 5634 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 5635 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 5636 if (mg->mg_len > 0)
1edc1566 5637 Safefree(mg->mg_ptr);
565764a8 5638 else if (mg->mg_len == HEf_SVKEY)
1edc1566 5639 SvREFCNT_dec((SV*)mg->mg_ptr);
7e8c5dac
HS
5640 else if (mg->mg_type == PERL_MAGIC_utf8 && mg->mg_ptr)
5641 Safefree(mg->mg_ptr);
9cbac4c7 5642 }
a0d0e21e
LW
5643 if (mg->mg_flags & MGf_REFCOUNTED)
5644 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
5645 Safefree(mg);
5646 }
5647 else
5648 mgp = &mg->mg_moremagic;
79072805 5649 }
91bba347 5650 if (!SvMAGIC(sv)) {
463ee0b2 5651 SvMAGICAL_off(sv);
06759ea0 5652 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
5653 }
5654
5655 return 0;
79072805
LW
5656}
5657
c461cf8f
JH
5658/*
5659=for apidoc sv_rvweaken
5660
645c22ef
DM
5661Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5662referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5663push a back-reference to this RV onto the array of backreferences
5664associated with that magic.
c461cf8f
JH
5665
5666=cut
5667*/
5668
810b8aa5 5669SV *
864dbfa3 5670Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
5671{
5672 SV *tsv;
5673 if (!SvOK(sv)) /* let undefs pass */
5674 return sv;
5675 if (!SvROK(sv))
cea2e8a9 5676 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 5677 else if (SvWEAKREF(sv)) {
810b8aa5 5678 if (ckWARN(WARN_MISC))
9014280d 5679 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
5680 return sv;
5681 }
5682 tsv = SvRV(sv);
5683 sv_add_backref(tsv, sv);
5684 SvWEAKREF_on(sv);
1c846c1f 5685 SvREFCNT_dec(tsv);
810b8aa5
GS
5686 return sv;
5687}
5688
645c22ef
DM
5689/* Give tsv backref magic if it hasn't already got it, then push a
5690 * back-reference to sv onto the array associated with the backref magic.
5691 */
5692
810b8aa5 5693STATIC void
cea2e8a9 5694S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
5695{
5696 AV *av;
5697 MAGIC *mg;
14befaf4 5698 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, PERL_MAGIC_backref)))
810b8aa5
GS
5699 av = (AV*)mg->mg_obj;
5700 else {
5701 av = newAV();
14befaf4 5702 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
d99b02a1
DM
5703 /* av now has a refcnt of 2, which avoids it getting freed
5704 * before us during global cleanup. The extra ref is removed
5705 * by magic_killbackrefs() when tsv is being freed */
810b8aa5 5706 }
d91d49e8 5707 if (AvFILLp(av) >= AvMAX(av)) {
fdc9a813 5708 I32 i;
d91d49e8 5709 SV **svp = AvARRAY(av);
fdc9a813
AE
5710 for (i = AvFILLp(av); i >= 0; i--)
5711 if (!svp[i]) {
d91d49e8
MM
5712 svp[i] = sv; /* reuse the slot */
5713 return;
5714 }
d91d49e8
MM
5715 av_extend(av, AvFILLp(av)+1);
5716 }
5717 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
5718}
5719
645c22ef
DM
5720/* delete a back-reference to ourselves from the backref magic associated
5721 * with the SV we point to.
5722 */
5723
1c846c1f 5724STATIC void
cea2e8a9 5725S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
5726{
5727 AV *av;
5728 SV **svp;
5729 I32 i;
5730 SV *tsv = SvRV(sv);
c04a4dfe 5731 MAGIC *mg = NULL;
14befaf4 5732 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, PERL_MAGIC_backref)))
cea2e8a9 5733 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
5734 av = (AV *)mg->mg_obj;
5735 svp = AvARRAY(av);
fdc9a813
AE
5736 for (i = AvFILLp(av); i >= 0; i--)
5737 if (svp[i] == sv) svp[i] = Nullsv;
810b8aa5
GS
5738}
5739
954c1994
GS
5740/*
5741=for apidoc sv_insert
5742
5743Inserts a string at the specified offset/length within the SV. Similar to
5744the Perl substr() function.
5745
5746=cut
5747*/
5748
79072805 5749void
e1ec3a88 5750Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, const char *little, STRLEN littlelen)
79072805
LW
5751{
5752 register char *big;
5753 register char *mid;
5754 register char *midend;
5755 register char *bigend;
5756 register I32 i;
6ff81951 5757 STRLEN curlen;
1c846c1f 5758
79072805 5759
8990e307 5760 if (!bigstr)
cea2e8a9 5761 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 5762 SvPV_force(bigstr, curlen);
60fa28ff 5763 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
5764 if (offset + len > curlen) {
5765 SvGROW(bigstr, offset+len+1);
5766 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
5767 SvCUR_set(bigstr, offset+len);
5768 }
79072805 5769
69b47968 5770 SvTAINT(bigstr);
79072805
LW
5771 i = littlelen - len;
5772 if (i > 0) { /* string might grow */
a0d0e21e 5773 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
5774 mid = big + offset + len;
5775 midend = bigend = big + SvCUR(bigstr);
5776 bigend += i;
5777 *bigend = '\0';
5778 while (midend > mid) /* shove everything down */
5779 *--bigend = *--midend;
5780 Move(little,big+offset,littlelen,char);
b162af07 5781 SvCUR_set(bigstr, SvCUR(bigstr) + i);
79072805
LW
5782 SvSETMAGIC(bigstr);
5783 return;
5784 }
5785 else if (i == 0) {
463ee0b2 5786 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
5787 SvSETMAGIC(bigstr);
5788 return;
5789 }
5790
463ee0b2 5791 big = SvPVX(bigstr);
79072805
LW
5792 mid = big + offset;
5793 midend = mid + len;
5794 bigend = big + SvCUR(bigstr);
5795
5796 if (midend > bigend)
cea2e8a9 5797 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5798
5799 if (mid - big > bigend - midend) { /* faster to shorten from end */
5800 if (littlelen) {
5801 Move(little, mid, littlelen,char);
5802 mid += littlelen;
5803 }
5804 i = bigend - midend;
5805 if (i > 0) {
5806 Move(midend, mid, i,char);
5807 mid += i;
5808 }
5809 *mid = '\0';
5810 SvCUR_set(bigstr, mid - big);
5811 }
5812 /*SUPPRESS 560*/
155aba94 5813 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5814 midend -= littlelen;
5815 mid = midend;
5816 sv_chop(bigstr,midend-i);
5817 big += i;
5818 while (i--)
5819 *--midend = *--big;
5820 if (littlelen)
5821 Move(little, mid, littlelen,char);
5822 }
5823 else if (littlelen) {
5824 midend -= littlelen;
5825 sv_chop(bigstr,midend);
5826 Move(little,midend,littlelen,char);
5827 }
5828 else {
5829 sv_chop(bigstr,midend);
5830 }
5831 SvSETMAGIC(bigstr);
5832}
5833
c461cf8f
JH
5834/*
5835=for apidoc sv_replace
5836
5837Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5838The target SV physically takes over ownership of the body of the source SV
5839and inherits its flags; however, the target keeps any magic it owns,
5840and any magic in the source is discarded.
ff276b08 5841Note that this is a rather specialist SV copying operation; most of the
645c22ef 5842time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5843
5844=cut
5845*/
79072805
LW
5846
5847void
864dbfa3 5848Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805 5849{
a3b680e6 5850 const U32 refcnt = SvREFCNT(sv);
765f542d 5851 SV_CHECK_THINKFIRST_COW_DROP(sv);
0453d815 5852 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
9014280d 5853 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
93a17b20 5854 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5855 if (SvMAGICAL(nsv))
5856 mg_free(nsv);
5857 else
5858 sv_upgrade(nsv, SVt_PVMG);
b162af07 5859 SvMAGIC_set(nsv, SvMAGIC(sv));
a0d0e21e 5860 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20 5861 SvMAGICAL_off(sv);
b162af07 5862 SvMAGIC_set(sv, NULL);
93a17b20 5863 }
79072805
LW
5864 SvREFCNT(sv) = 0;
5865 sv_clear(sv);
477f5d66 5866 assert(!SvREFCNT(sv));
fd0854ff
DM
5867#ifdef DEBUG_LEAKING_SCALARS
5868 sv->sv_flags = nsv->sv_flags;
5869 sv->sv_any = nsv->sv_any;
5870 sv->sv_refcnt = nsv->sv_refcnt;
5871#else
79072805 5872 StructCopy(nsv,sv,SV);
fd0854ff
DM
5873#endif
5874
d3d0e6f1
NC
5875#ifdef PERL_COPY_ON_WRITE
5876 if (SvIsCOW_normal(nsv)) {
5877 /* We need to follow the pointers around the loop to make the
5878 previous SV point to sv, rather than nsv. */
5879 SV *next;
5880 SV *current = nsv;
5881 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5882 assert(next);
5883 current = next;
5884 assert(SvPVX(current) == SvPVX(nsv));
5885 }
5886 /* Make the SV before us point to the SV after us. */
5887 if (DEBUG_C_TEST) {
5888 PerlIO_printf(Perl_debug_log, "previous is\n");
5889 sv_dump(current);
a29f6d03
NC
5890 PerlIO_printf(Perl_debug_log,
5891 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5892 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5893 }
a29f6d03 5894 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5895 }
5896#endif
79072805 5897 SvREFCNT(sv) = refcnt;
1edc1566 5898 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 5899 SvREFCNT(nsv) = 0;
463ee0b2 5900 del_SV(nsv);
79072805
LW
5901}
5902
c461cf8f
JH
5903/*
5904=for apidoc sv_clear
5905
645c22ef
DM
5906Clear an SV: call any destructors, free up any memory used by the body,
5907and free the body itself. The SV's head is I<not> freed, although
5908its type is set to all 1's so that it won't inadvertently be assumed
5909to be live during global destruction etc.
5910This function should only be called when REFCNT is zero. Most of the time
5911you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5912instead.
c461cf8f
JH
5913
5914=cut
5915*/
5916
79072805 5917void
864dbfa3 5918Perl_sv_clear(pTHX_ register SV *sv)
79072805 5919{
27da23d5 5920 dVAR;
ec12f114 5921 HV* stash;
79072805
LW
5922 assert(sv);
5923 assert(SvREFCNT(sv) == 0);
5924
ed6116ce 5925 if (SvOBJECT(sv)) {
3280af22 5926 if (PL_defstash) { /* Still have a symbol table? */
39644a26 5927 dSP;
32251b26 5928 CV* destructor;
a0d0e21e 5929
5cc433a6 5930
8ebc5c01 5931
d460ef45 5932 do {
4e8e7886 5933 stash = SvSTASH(sv);
32251b26 5934 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 5935 if (destructor) {
5cc433a6
AB
5936 SV* tmpref = newRV(sv);
5937 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 5938 ENTER;
e788e7d3 5939 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
5940 EXTEND(SP, 2);
5941 PUSHMARK(SP);
5cc433a6 5942 PUSHs(tmpref);
4e8e7886 5943 PUTBACK;
44389ee9 5944 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
7a5fa8a2
NIS
5945
5946
d3acc0f7 5947 POPSTACK;
3095d977 5948 SPAGAIN;
4e8e7886 5949 LEAVE;
5cc433a6
AB
5950 if(SvREFCNT(tmpref) < 2) {
5951 /* tmpref is not kept alive! */
5952 SvREFCNT(sv)--;
b162af07 5953 SvRV_set(tmpref, NULL);
5cc433a6
AB
5954 SvROK_off(tmpref);
5955 }
5956 SvREFCNT_dec(tmpref);
4e8e7886
GS
5957 }
5958 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5959
6f44e0a4
JP
5960
5961 if (SvREFCNT(sv)) {
5962 if (PL_in_clean_objs)
cea2e8a9 5963 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
6f44e0a4
JP
5964 HvNAME(stash));
5965 /* DESTROY gave object new lease on life */
5966 return;
5967 }
a0d0e21e 5968 }
4e8e7886 5969
a0d0e21e 5970 if (SvOBJECT(sv)) {
4e8e7886 5971 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
5972 SvOBJECT_off(sv); /* Curse the object. */
5973 if (SvTYPE(sv) != SVt_PVIO)
3280af22 5974 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5975 }
463ee0b2 5976 }
524189f1
JH
5977 if (SvTYPE(sv) >= SVt_PVMG) {
5978 if (SvMAGIC(sv))
5979 mg_free(sv);
bce8f412 5980 if (SvTYPE(sv) == SVt_PVMG && SvFLAGS(sv) & SVpad_TYPED)
524189f1
JH
5981 SvREFCNT_dec(SvSTASH(sv));
5982 }
ec12f114 5983 stash = NULL;
79072805 5984 switch (SvTYPE(sv)) {
8990e307 5985 case SVt_PVIO:
df0bd2f4
GS
5986 if (IoIFP(sv) &&
5987 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5988 IoIFP(sv) != PerlIO_stdout() &&
5989 IoIFP(sv) != PerlIO_stderr())
93578b34 5990 {
f2b5be74 5991 io_close((IO*)sv, FALSE);
93578b34 5992 }
1d7c1841 5993 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5994 PerlDir_close(IoDIRP(sv));
1d7c1841 5995 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5996 Safefree(IoTOP_NAME(sv));
5997 Safefree(IoFMT_NAME(sv));
5998 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 5999 /* FALL THROUGH */
79072805 6000 case SVt_PVBM:
a0d0e21e 6001 goto freescalar;
79072805 6002 case SVt_PVCV:
748a9306 6003 case SVt_PVFM:
85e6fe83 6004 cv_undef((CV*)sv);
a0d0e21e 6005 goto freescalar;
79072805 6006 case SVt_PVHV:
85e6fe83 6007 hv_undef((HV*)sv);
a0d0e21e 6008 break;
79072805 6009 case SVt_PVAV:
85e6fe83 6010 av_undef((AV*)sv);
a0d0e21e 6011 break;
02270b4e 6012 case SVt_PVLV:
dd28f7bb
DM
6013 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
6014 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
6015 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
6016 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
6017 }
6018 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
6019 SvREFCNT_dec(LvTARG(sv));
02270b4e 6020 goto freescalar;
a0d0e21e 6021 case SVt_PVGV:
1edc1566 6022 gp_free((GV*)sv);
a0d0e21e 6023 Safefree(GvNAME(sv));
ec12f114
JPC
6024 /* cannot decrease stash refcount yet, as we might recursively delete
6025 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
6026 of stash until current sv is completely gone.
6027 -- JohnPC, 27 Mar 1998 */
6028 stash = GvSTASH(sv);
a0d0e21e 6029 /* FALL THROUGH */
79072805 6030 case SVt_PVMG:
79072805
LW
6031 case SVt_PVNV:
6032 case SVt_PVIV:
a0d0e21e 6033 freescalar:
5228ca4e
NC
6034 /* Don't bother with SvOOK_off(sv); as we're only going to free it. */
6035 if (SvOOK(sv)) {
6036 SvPV_set(sv, SvPVX(sv) - SvIVX(sv));
6037 /* Don't even bother with turning off the OOK flag. */
6038 }
79072805
LW
6039 /* FALL THROUGH */
6040 case SVt_PV:
a0d0e21e 6041 case SVt_RV:
810b8aa5
GS
6042 if (SvROK(sv)) {
6043 if (SvWEAKREF(sv))
6044 sv_del_backref(sv);
6045 else
6046 SvREFCNT_dec(SvRV(sv));
6047 }
765f542d
NC
6048#ifdef PERL_COPY_ON_WRITE
6049 else if (SvPVX(sv)) {
6050 if (SvIsCOW(sv)) {
6051 /* I believe I need to grab the global SV mutex here and
6052 then recheck the COW status. */
46187eeb
NC
6053 if (DEBUG_C_TEST) {
6054 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 6055 sv_dump(sv);
46187eeb 6056 }
e419cbc5 6057 sv_release_COW(sv, SvPVX(sv), SvCUR(sv), SvLEN(sv),
765f542d
NC
6058 SvUVX(sv), SV_COW_NEXT_SV(sv));
6059 /* And drop it here. */
6060 SvFAKE_off(sv);
6061 } else if (SvLEN(sv)) {
6062 Safefree(SvPVX(sv));
6063 }
6064 }
6065#else
1edc1566 6066 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 6067 Safefree(SvPVX(sv));
1c846c1f 6068 else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
25716404
GS
6069 unsharepvn(SvPVX(sv),
6070 SvUTF8(sv) ? -(I32)SvCUR(sv) : SvCUR(sv),
6071 SvUVX(sv));
1c846c1f
NIS
6072 SvFAKE_off(sv);
6073 }
765f542d 6074#endif
79072805 6075 break;
a0d0e21e 6076/*
79072805 6077 case SVt_NV:
79072805 6078 case SVt_IV:
79072805
LW
6079 case SVt_NULL:
6080 break;
a0d0e21e 6081*/
79072805
LW
6082 }
6083
6084 switch (SvTYPE(sv)) {
6085 case SVt_NULL:
6086 break;
79072805
LW
6087 case SVt_IV:
6088 del_XIV(SvANY(sv));
6089 break;
6090 case SVt_NV:
6091 del_XNV(SvANY(sv));
6092 break;
ed6116ce
LW
6093 case SVt_RV:
6094 del_XRV(SvANY(sv));
6095 break;
79072805
LW
6096 case SVt_PV:
6097 del_XPV(SvANY(sv));
6098 break;
6099 case SVt_PVIV:
6100 del_XPVIV(SvANY(sv));
6101 break;
6102 case SVt_PVNV:
6103 del_XPVNV(SvANY(sv));
6104 break;
6105 case SVt_PVMG:
6106 del_XPVMG(SvANY(sv));
6107 break;
6108 case SVt_PVLV:
6109 del_XPVLV(SvANY(sv));
6110 break;
6111 case SVt_PVAV:
6112 del_XPVAV(SvANY(sv));
6113 break;
6114 case SVt_PVHV:
6115 del_XPVHV(SvANY(sv));
6116 break;
6117 case SVt_PVCV:
6118 del_XPVCV(SvANY(sv));
6119 break;
6120 case SVt_PVGV:
6121 del_XPVGV(SvANY(sv));
ec12f114
JPC
6122 /* code duplication for increased performance. */
6123 SvFLAGS(sv) &= SVf_BREAK;
6124 SvFLAGS(sv) |= SVTYPEMASK;
6125 /* decrease refcount of the stash that owns this GV, if any */
6126 if (stash)
6127 SvREFCNT_dec(stash);
6128 return; /* not break, SvFLAGS reset already happened */
79072805
LW
6129 case SVt_PVBM:
6130 del_XPVBM(SvANY(sv));
6131 break;
6132 case SVt_PVFM:
6133 del_XPVFM(SvANY(sv));
6134 break;
8990e307
LW
6135 case SVt_PVIO:
6136 del_XPVIO(SvANY(sv));
6137 break;
79072805 6138 }
a0d0e21e 6139 SvFLAGS(sv) &= SVf_BREAK;
8990e307 6140 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
6141}
6142
645c22ef
DM
6143/*
6144=for apidoc sv_newref
6145
6146Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
6147instead.
6148
6149=cut
6150*/
6151
79072805 6152SV *
864dbfa3 6153Perl_sv_newref(pTHX_ SV *sv)
79072805 6154{
463ee0b2 6155 if (sv)
4db098f4 6156 (SvREFCNT(sv))++;
79072805
LW
6157 return sv;
6158}
6159
c461cf8f
JH
6160/*
6161=for apidoc sv_free
6162
645c22ef
DM
6163Decrement an SV's reference count, and if it drops to zero, call
6164C<sv_clear> to invoke destructors and free up any memory used by
6165the body; finally, deallocate the SV's head itself.
6166Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
6167
6168=cut
6169*/
6170
79072805 6171void
864dbfa3 6172Perl_sv_free(pTHX_ SV *sv)
79072805 6173{
27da23d5 6174 dVAR;
79072805
LW
6175 if (!sv)
6176 return;
a0d0e21e
LW
6177 if (SvREFCNT(sv) == 0) {
6178 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
6179 /* this SV's refcnt has been artificially decremented to
6180 * trigger cleanup */
a0d0e21e 6181 return;
3280af22 6182 if (PL_in_clean_all) /* All is fair */
1edc1566 6183 return;
d689ffdd
JP
6184 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6185 /* make sure SvREFCNT(sv)==0 happens very seldom */
6186 SvREFCNT(sv) = (~(U32)0)/2;
6187 return;
6188 }
0453d815 6189 if (ckWARN_d(WARN_INTERNAL))
d5dede04 6190 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
6191 "Attempt to free unreferenced scalar: SV 0x%"UVxf
6192 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805
LW
6193 return;
6194 }
4db098f4 6195 if (--(SvREFCNT(sv)) > 0)
8990e307 6196 return;
8c4d3c90
NC
6197 Perl_sv_free2(aTHX_ sv);
6198}
6199
6200void
6201Perl_sv_free2(pTHX_ SV *sv)
6202{
27da23d5 6203 dVAR;
463ee0b2
LW
6204#ifdef DEBUGGING
6205 if (SvTEMP(sv)) {
0453d815 6206 if (ckWARN_d(WARN_DEBUGGING))
9014280d 6207 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
472d47bc
SB
6208 "Attempt to free temp prematurely: SV 0x%"UVxf
6209 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 6210 return;
79072805 6211 }
463ee0b2 6212#endif
d689ffdd
JP
6213 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6214 /* make sure SvREFCNT(sv)==0 happens very seldom */
6215 SvREFCNT(sv) = (~(U32)0)/2;
6216 return;
6217 }
79072805 6218 sv_clear(sv);
477f5d66
CS
6219 if (! SvREFCNT(sv))
6220 del_SV(sv);
79072805
LW
6221}
6222
954c1994
GS
6223/*
6224=for apidoc sv_len
6225
645c22ef
DM
6226Returns the length of the string in the SV. Handles magic and type
6227coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
6228
6229=cut
6230*/
6231
79072805 6232STRLEN
864dbfa3 6233Perl_sv_len(pTHX_ register SV *sv)
79072805 6234{
463ee0b2 6235 STRLEN len;
79072805
LW
6236
6237 if (!sv)
6238 return 0;
6239
8990e307 6240 if (SvGMAGICAL(sv))
565764a8 6241 len = mg_length(sv);
8990e307 6242 else
497b47a8 6243 (void)SvPV(sv, len);
463ee0b2 6244 return len;
79072805
LW
6245}
6246
c461cf8f
JH
6247/*
6248=for apidoc sv_len_utf8
6249
6250Returns the number of characters in the string in an SV, counting wide
1e54db1a 6251UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
6252
6253=cut
6254*/
6255
7e8c5dac
HS
6256/*
6257 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
6258 * mg_ptr is used, by sv_pos_u2b(), see the comments of S_utf8_mg_pos_init().
6259 * (Note that the mg_len is not the length of the mg_ptr field.)
7a5fa8a2 6260 *
7e8c5dac
HS
6261 */
6262
a0ed51b3 6263STRLEN
864dbfa3 6264Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 6265{
a0ed51b3
LW
6266 if (!sv)
6267 return 0;
6268
a0ed51b3 6269 if (SvGMAGICAL(sv))
b76347f2 6270 return mg_length(sv);
a0ed51b3 6271 else
b76347f2 6272 {
7e8c5dac 6273 STRLEN len, ulen;
a3b680e6 6274 const U8 *s = (U8*)SvPV(sv, len);
7e8c5dac
HS
6275 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
6276
e23c8137 6277 if (mg && mg->mg_len != -1 && (mg->mg_len > 0 || len == 0)) {
7e8c5dac 6278 ulen = mg->mg_len;
e23c8137
JH
6279#ifdef PERL_UTF8_CACHE_ASSERT
6280 assert(ulen == Perl_utf8_length(aTHX_ s, s + len));
6281#endif
6282 }
7e8c5dac
HS
6283 else {
6284 ulen = Perl_utf8_length(aTHX_ s, s + len);
6285 if (!mg && !SvREADONLY(sv)) {
6286 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
6287 mg = mg_find(sv, PERL_MAGIC_utf8);
6288 assert(mg);
6289 }
6290 if (mg)
6291 mg->mg_len = ulen;
6292 }
6293 return ulen;
6294 }
6295}
6296
6297/* S_utf8_mg_pos_init() is used to initialize the mg_ptr field of
6298 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
6299 * between UTF-8 and byte offsets. There are two (substr offset and substr
6300 * length, the i offset, PERL_MAGIC_UTF8_CACHESIZE) times two (UTF-8 offset
6301 * and byte offset) cache positions.
6302 *
6303 * The mg_len field is used by sv_len_utf8(), see its comments.
6304 * Note that the mg_len is not the length of the mg_ptr field.
6305 *
6306 */
6307STATIC bool
a3b680e6 6308S_utf8_mg_pos_init(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 offsetp, U8 *s, U8 *start)
7e8c5dac 6309{
7a5fa8a2 6310 bool found = FALSE;
7e8c5dac
HS
6311
6312 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
8f78557a 6313 if (!*mgp)
27da23d5 6314 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0, 0);
7e8c5dac 6315 assert(*mgp);
b76347f2 6316
7e8c5dac
HS
6317 if ((*mgp)->mg_ptr)
6318 *cachep = (STRLEN *) (*mgp)->mg_ptr;
6319 else {
6320 Newz(0, *cachep, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
6321 (*mgp)->mg_ptr = (char *) *cachep;
6322 }
6323 assert(*cachep);
6324
a3b680e6 6325 (*cachep)[i] = offsetp;
7e8c5dac
HS
6326 (*cachep)[i+1] = s - start;
6327 found = TRUE;
a0ed51b3 6328 }
7e8c5dac
HS
6329
6330 return found;
a0ed51b3
LW
6331}
6332
645c22ef 6333/*
7e8c5dac
HS
6334 * S_utf8_mg_pos() is used to query and update mg_ptr field of
6335 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
6336 * between UTF-8 and byte offsets. See also the comments of
6337 * S_utf8_mg_pos_init().
6338 *
6339 */
6340STATIC bool
6e551876 6341S_utf8_mg_pos(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, I32 uoff, U8 **sp, U8 *start, U8 *send)
7e8c5dac
HS
6342{
6343 bool found = FALSE;
6344
6345 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
6346 if (!*mgp)
6347 *mgp = mg_find(sv, PERL_MAGIC_utf8);
6348 if (*mgp && (*mgp)->mg_ptr) {
6349 *cachep = (STRLEN *) (*mgp)->mg_ptr;
e23c8137 6350 ASSERT_UTF8_CACHE(*cachep);
667208dd 6351 if ((*cachep)[i] == (STRLEN)uoff) /* An exact match. */
7a5fa8a2 6352 found = TRUE;
7e8c5dac
HS
6353 else { /* We will skip to the right spot. */
6354 STRLEN forw = 0;
6355 STRLEN backw = 0;
a3b680e6 6356 const U8* p = NULL;
7e8c5dac
HS
6357
6358 /* The assumption is that going backward is half
6359 * the speed of going forward (that's where the
6360 * 2 * backw in the below comes from). (The real
6361 * figure of course depends on the UTF-8 data.) */
6362
667208dd 6363 if ((*cachep)[i] > (STRLEN)uoff) {
7e8c5dac 6364 forw = uoff;
667208dd 6365 backw = (*cachep)[i] - (STRLEN)uoff;
7e8c5dac
HS
6366
6367 if (forw < 2 * backw)
6368 p = start;
6369 else
6370 p = start + (*cachep)[i+1];
6371 }
6372 /* Try this only for the substr offset (i == 0),
6373 * not for the substr length (i == 2). */
6374 else if (i == 0) { /* (*cachep)[i] < uoff */
a3b680e6 6375 const STRLEN ulen = sv_len_utf8(sv);
7e8c5dac 6376
667208dd
JH
6377 if ((STRLEN)uoff < ulen) {
6378 forw = (STRLEN)uoff - (*cachep)[i];
6379 backw = ulen - (STRLEN)uoff;
7e8c5dac
HS
6380
6381 if (forw < 2 * backw)
6382 p = start + (*cachep)[i+1];
6383 else
6384 p = send;
6385 }
6386
6387 /* If the string is not long enough for uoff,
6388 * we could extend it, but not at this low a level. */
6389 }
6390
6391 if (p) {
6392 if (forw < 2 * backw) {
6393 while (forw--)
6394 p += UTF8SKIP(p);
6395 }
6396 else {
6397 while (backw--) {
6398 p--;
6399 while (UTF8_IS_CONTINUATION(*p))
6400 p--;
6401 }
6402 }
6403
6404 /* Update the cache. */
667208dd 6405 (*cachep)[i] = (STRLEN)uoff;
7e8c5dac 6406 (*cachep)[i+1] = p - start;
8f78557a
AE
6407
6408 /* Drop the stale "length" cache */
6409 if (i == 0) {
6410 (*cachep)[2] = 0;
6411 (*cachep)[3] = 0;
6412 }
7a5fa8a2 6413
7e8c5dac
HS
6414 found = TRUE;
6415 }
6416 }
6417 if (found) { /* Setup the return values. */
6418 *offsetp = (*cachep)[i+1];
6419 *sp = start + *offsetp;
6420 if (*sp >= send) {
6421 *sp = send;
6422 *offsetp = send - start;
6423 }
6424 else if (*sp < start) {
6425 *sp = start;
6426 *offsetp = 0;
6427 }
6428 }
6429 }
e23c8137
JH
6430#ifdef PERL_UTF8_CACHE_ASSERT
6431 if (found) {
6432 U8 *s = start;
6433 I32 n = uoff;
6434
6435 while (n-- && s < send)
6436 s += UTF8SKIP(s);
6437
6438 if (i == 0) {
6439 assert(*offsetp == s - start);
6440 assert((*cachep)[0] == (STRLEN)uoff);
6441 assert((*cachep)[1] == *offsetp);
6442 }
6443 ASSERT_UTF8_CACHE(*cachep);
6444 }
6445#endif
7e8c5dac 6446 }
e23c8137 6447
7e8c5dac
HS
6448 return found;
6449}
7a5fa8a2 6450
7e8c5dac 6451/*
645c22ef
DM
6452=for apidoc sv_pos_u2b
6453
1e54db1a 6454Converts the value pointed to by offsetp from a count of UTF-8 chars from
645c22ef
DM
6455the start of the string, to a count of the equivalent number of bytes; if
6456lenp is non-zero, it does the same to lenp, but this time starting from
6457the offset, rather than from the start of the string. Handles magic and
6458type coercion.
6459
6460=cut
6461*/
6462
7e8c5dac
HS
6463/*
6464 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
6465 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
6466 * byte offsets. See also the comments of S_utf8_mg_pos().
6467 *
6468 */
6469
a0ed51b3 6470void
864dbfa3 6471Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 6472{
dfe13c55
GS
6473 U8 *start;
6474 U8 *s;
a0ed51b3 6475 STRLEN len;
7e8c5dac
HS
6476 STRLEN *cache = 0;
6477 STRLEN boffset = 0;
a0ed51b3
LW
6478
6479 if (!sv)
6480 return;
6481
dfe13c55 6482 start = s = (U8*)SvPV(sv, len);
7e8c5dac
HS
6483 if (len) {
6484 I32 uoffset = *offsetp;
6485 U8 *send = s + len;
6486 MAGIC *mg = 0;
6487 bool found = FALSE;
6488
bdf77a2a 6489 if (utf8_mg_pos(sv, &mg, &cache, 0, offsetp, *offsetp, &s, start, send))
7e8c5dac
HS
6490 found = TRUE;
6491 if (!found && uoffset > 0) {
6492 while (s < send && uoffset--)
6493 s += UTF8SKIP(s);
6494 if (s >= send)
6495 s = send;
a3b680e6 6496 if (utf8_mg_pos_init(sv, &mg, &cache, 0, *offsetp, s, start))
7e8c5dac
HS
6497 boffset = cache[1];
6498 *offsetp = s - start;
6499 }
6500 if (lenp) {
6501 found = FALSE;
6502 start = s;
ec062429 6503 if (utf8_mg_pos(sv, &mg, &cache, 2, lenp, *lenp, &s, start, send)) {
7e8c5dac
HS
6504 *lenp -= boffset;
6505 found = TRUE;
6506 }
6507 if (!found && *lenp > 0) {
6508 I32 ulen = *lenp;
6509 if (ulen > 0)
6510 while (s < send && ulen--)
6511 s += UTF8SKIP(s);
6512 if (s >= send)
6513 s = send;
a3b680e6 6514 utf8_mg_pos_init(sv, &mg, &cache, 2, *lenp, s, start);
7e8c5dac
HS
6515 }
6516 *lenp = s - start;
6517 }
e23c8137 6518 ASSERT_UTF8_CACHE(cache);
7e8c5dac
HS
6519 }
6520 else {
6521 *offsetp = 0;
6522 if (lenp)
6523 *lenp = 0;
a0ed51b3 6524 }
e23c8137 6525
a0ed51b3
LW
6526 return;
6527}
6528
645c22ef
DM
6529/*
6530=for apidoc sv_pos_b2u
6531
6532Converts the value pointed to by offsetp from a count of bytes from the
1e54db1a 6533start of the string, to a count of the equivalent number of UTF-8 chars.
645c22ef
DM
6534Handles magic and type coercion.
6535
6536=cut
6537*/
6538
7e8c5dac
HS
6539/*
6540 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
6541 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
6542 * byte offsets. See also the comments of S_utf8_mg_pos().
6543 *
6544 */
6545
a0ed51b3 6546void
7e8c5dac 6547Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 6548{
7e8c5dac 6549 U8* s;
a0ed51b3
LW
6550 STRLEN len;
6551
6552 if (!sv)
6553 return;
6554
dfe13c55 6555 s = (U8*)SvPV(sv, len);
eb160463 6556 if ((I32)len < *offsetp)
a0dbb045 6557 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac
HS
6558 else {
6559 U8* send = s + *offsetp;
6560 MAGIC* mg = NULL;
6561 STRLEN *cache = NULL;
6562
6563 len = 0;
6564
6565 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
6566 mg = mg_find(sv, PERL_MAGIC_utf8);
6567 if (mg && mg->mg_ptr) {
6568 cache = (STRLEN *) mg->mg_ptr;
c5661c80 6569 if (cache[1] == (STRLEN)*offsetp) {
7e8c5dac
HS
6570 /* An exact match. */
6571 *offsetp = cache[0];
6572
6573 return;
6574 }
c5661c80 6575 else if (cache[1] < (STRLEN)*offsetp) {
7e8c5dac
HS
6576 /* We already know part of the way. */
6577 len = cache[0];
6578 s += cache[1];
7a5fa8a2 6579 /* Let the below loop do the rest. */
7e8c5dac
HS
6580 }
6581 else { /* cache[1] > *offsetp */
6582 /* We already know all of the way, now we may
6583 * be able to walk back. The same assumption
6584 * is made as in S_utf8_mg_pos(), namely that
6585 * walking backward is twice slower than
6586 * walking forward. */
6587 STRLEN forw = *offsetp;
6588 STRLEN backw = cache[1] - *offsetp;
6589
6590 if (!(forw < 2 * backw)) {
6591 U8 *p = s + cache[1];
6592 STRLEN ubackw = 0;
7a5fa8a2 6593
a5b510f2
AE
6594 cache[1] -= backw;
6595
7e8c5dac
HS
6596 while (backw--) {
6597 p--;
0aeb64d0 6598 while (UTF8_IS_CONTINUATION(*p)) {
7e8c5dac 6599 p--;
0aeb64d0
JH
6600 backw--;
6601 }
7e8c5dac
HS
6602 ubackw++;
6603 }
6604
6605 cache[0] -= ubackw;
0aeb64d0 6606 *offsetp = cache[0];
a67d7df9
TS
6607
6608 /* Drop the stale "length" cache */
6609 cache[2] = 0;
6610 cache[3] = 0;
6611
0aeb64d0 6612 return;
7e8c5dac
HS
6613 }
6614 }
6615 }
e23c8137 6616 ASSERT_UTF8_CACHE(cache);
a0dbb045 6617 }
7e8c5dac
HS
6618
6619 while (s < send) {
6620 STRLEN n = 1;
6621
6622 /* Call utf8n_to_uvchr() to validate the sequence
6623 * (unless a simple non-UTF character) */
6624 if (!UTF8_IS_INVARIANT(*s))
6625 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
6626 if (n > 0) {
6627 s += n;
6628 len++;
6629 }
6630 else
6631 break;
6632 }
6633
6634 if (!SvREADONLY(sv)) {
6635 if (!mg) {
6636 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
6637 mg = mg_find(sv, PERL_MAGIC_utf8);
6638 }
6639 assert(mg);
6640
6641 if (!mg->mg_ptr) {
979acdb5 6642 Newz(0, cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7e8c5dac
HS
6643 mg->mg_ptr = (char *) cache;
6644 }
6645 assert(cache);
6646
6647 cache[0] = len;
6648 cache[1] = *offsetp;
a67d7df9
TS
6649 /* Drop the stale "length" cache */
6650 cache[2] = 0;
6651 cache[3] = 0;
7e8c5dac
HS
6652 }
6653
6654 *offsetp = len;
a0ed51b3 6655 }
a0ed51b3
LW
6656 return;
6657}
6658
954c1994
GS
6659/*
6660=for apidoc sv_eq
6661
6662Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
6663identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6664coerce its args to strings if necessary.
954c1994
GS
6665
6666=cut
6667*/
6668
79072805 6669I32
e01b9e88 6670Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805 6671{
e1ec3a88 6672 const char *pv1;
463ee0b2 6673 STRLEN cur1;
e1ec3a88 6674 const char *pv2;
463ee0b2 6675 STRLEN cur2;
e01b9e88 6676 I32 eq = 0;
553e1bcc
AT
6677 char *tpv = Nullch;
6678 SV* svrecode = Nullsv;
79072805 6679
e01b9e88 6680 if (!sv1) {
79072805
LW
6681 pv1 = "";
6682 cur1 = 0;
6683 }
463ee0b2 6684 else
e01b9e88 6685 pv1 = SvPV(sv1, cur1);
79072805 6686
e01b9e88
SC
6687 if (!sv2){
6688 pv2 = "";
6689 cur2 = 0;
92d29cee 6690 }
e01b9e88
SC
6691 else
6692 pv2 = SvPV(sv2, cur2);
79072805 6693
cf48d248 6694 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6695 /* Differing utf8ness.
6696 * Do not UTF8size the comparands as a side-effect. */
6697 if (PL_encoding) {
6698 if (SvUTF8(sv1)) {
553e1bcc
AT
6699 svrecode = newSVpvn(pv2, cur2);
6700 sv_recode_to_utf8(svrecode, PL_encoding);
6701 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6702 }
6703 else {
553e1bcc
AT
6704 svrecode = newSVpvn(pv1, cur1);
6705 sv_recode_to_utf8(svrecode, PL_encoding);
6706 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6707 }
6708 /* Now both are in UTF-8. */
0a1bd7ac
DM
6709 if (cur1 != cur2) {
6710 SvREFCNT_dec(svrecode);
799ef3cb 6711 return FALSE;
0a1bd7ac 6712 }
799ef3cb
JH
6713 }
6714 else {
6715 bool is_utf8 = TRUE;
6716
6717 if (SvUTF8(sv1)) {
6718 /* sv1 is the UTF-8 one,
6719 * if is equal it must be downgrade-able */
e1ec3a88 6720 char *pv = (char*)bytes_from_utf8((const U8*)pv1,
799ef3cb
JH
6721 &cur1, &is_utf8);
6722 if (pv != pv1)
553e1bcc 6723 pv1 = tpv = pv;
799ef3cb
JH
6724 }
6725 else {
6726 /* sv2 is the UTF-8 one,
6727 * if is equal it must be downgrade-able */
e1ec3a88 6728 char *pv = (char *)bytes_from_utf8((const U8*)pv2,
799ef3cb
JH
6729 &cur2, &is_utf8);
6730 if (pv != pv2)
553e1bcc 6731 pv2 = tpv = pv;
799ef3cb
JH
6732 }
6733 if (is_utf8) {
6734 /* Downgrade not possible - cannot be eq */
bf694877 6735 assert (tpv == 0);
799ef3cb
JH
6736 return FALSE;
6737 }
6738 }
cf48d248
JH
6739 }
6740
6741 if (cur1 == cur2)
765f542d 6742 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 6743
553e1bcc
AT
6744 if (svrecode)
6745 SvREFCNT_dec(svrecode);
799ef3cb 6746
553e1bcc
AT
6747 if (tpv)
6748 Safefree(tpv);
cf48d248 6749
e01b9e88 6750 return eq;
79072805
LW
6751}
6752
954c1994
GS
6753/*
6754=for apidoc sv_cmp
6755
6756Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
6757string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
6758C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6759coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
6760
6761=cut
6762*/
6763
79072805 6764I32
e01b9e88 6765Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 6766{
560a288e 6767 STRLEN cur1, cur2;
e1ec3a88
AL
6768 const char *pv1, *pv2;
6769 char *tpv = Nullch;
cf48d248 6770 I32 cmp;
553e1bcc 6771 SV *svrecode = Nullsv;
560a288e 6772
e01b9e88
SC
6773 if (!sv1) {
6774 pv1 = "";
560a288e
GS
6775 cur1 = 0;
6776 }
e01b9e88
SC
6777 else
6778 pv1 = SvPV(sv1, cur1);
560a288e 6779
553e1bcc 6780 if (!sv2) {
e01b9e88 6781 pv2 = "";
560a288e
GS
6782 cur2 = 0;
6783 }
e01b9e88
SC
6784 else
6785 pv2 = SvPV(sv2, cur2);
79072805 6786
cf48d248 6787 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6788 /* Differing utf8ness.
6789 * Do not UTF8size the comparands as a side-effect. */
cf48d248 6790 if (SvUTF8(sv1)) {
799ef3cb 6791 if (PL_encoding) {
553e1bcc
AT
6792 svrecode = newSVpvn(pv2, cur2);
6793 sv_recode_to_utf8(svrecode, PL_encoding);
6794 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6795 }
6796 else {
e1ec3a88 6797 pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
799ef3cb 6798 }
cf48d248
JH
6799 }
6800 else {
799ef3cb 6801 if (PL_encoding) {
553e1bcc
AT
6802 svrecode = newSVpvn(pv1, cur1);
6803 sv_recode_to_utf8(svrecode, PL_encoding);
6804 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6805 }
6806 else {
e1ec3a88 6807 pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
799ef3cb 6808 }
cf48d248
JH
6809 }
6810 }
6811
e01b9e88 6812 if (!cur1) {
cf48d248 6813 cmp = cur2 ? -1 : 0;
e01b9e88 6814 } else if (!cur2) {
cf48d248
JH
6815 cmp = 1;
6816 } else {
e1ec3a88 6817 const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
6818
6819 if (retval) {
cf48d248 6820 cmp = retval < 0 ? -1 : 1;
e01b9e88 6821 } else if (cur1 == cur2) {
cf48d248
JH
6822 cmp = 0;
6823 } else {
6824 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 6825 }
cf48d248 6826 }
16660edb 6827
553e1bcc
AT
6828 if (svrecode)
6829 SvREFCNT_dec(svrecode);
799ef3cb 6830
553e1bcc
AT
6831 if (tpv)
6832 Safefree(tpv);
cf48d248
JH
6833
6834 return cmp;
bbce6d69 6835}
16660edb 6836
c461cf8f
JH
6837/*
6838=for apidoc sv_cmp_locale
6839
645c22ef
DM
6840Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6841'use bytes' aware, handles get magic, and will coerce its args to strings
6842if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
6843
6844=cut
6845*/
6846
bbce6d69 6847I32
864dbfa3 6848Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 6849{
36477c24 6850#ifdef USE_LOCALE_COLLATE
16660edb 6851
bbce6d69 6852 char *pv1, *pv2;
6853 STRLEN len1, len2;
6854 I32 retval;
16660edb 6855
3280af22 6856 if (PL_collation_standard)
bbce6d69 6857 goto raw_compare;
16660edb 6858
bbce6d69 6859 len1 = 0;
8ac85365 6860 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 6861 len2 = 0;
8ac85365 6862 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 6863
bbce6d69 6864 if (!pv1 || !len1) {
6865 if (pv2 && len2)
6866 return -1;
6867 else
6868 goto raw_compare;
6869 }
6870 else {
6871 if (!pv2 || !len2)
6872 return 1;
6873 }
16660edb 6874
bbce6d69 6875 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 6876
bbce6d69 6877 if (retval)
16660edb 6878 return retval < 0 ? -1 : 1;
6879
bbce6d69 6880 /*
6881 * When the result of collation is equality, that doesn't mean
6882 * that there are no differences -- some locales exclude some
6883 * characters from consideration. So to avoid false equalities,
6884 * we use the raw string as a tiebreaker.
6885 */
16660edb 6886
bbce6d69 6887 raw_compare:
6888 /* FALL THROUGH */
16660edb 6889
36477c24 6890#endif /* USE_LOCALE_COLLATE */
16660edb 6891
bbce6d69 6892 return sv_cmp(sv1, sv2);
6893}
79072805 6894
645c22ef 6895
36477c24 6896#ifdef USE_LOCALE_COLLATE
645c22ef 6897
7a4c00b4 6898/*
645c22ef
DM
6899=for apidoc sv_collxfrm
6900
6901Add Collate Transform magic to an SV if it doesn't already have it.
6902
6903Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6904scalar data of the variable, but transformed to such a format that a normal
6905memory comparison can be used to compare the data according to the locale
6906settings.
6907
6908=cut
6909*/
6910
bbce6d69 6911char *
864dbfa3 6912Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 6913{
7a4c00b4 6914 MAGIC *mg;
16660edb 6915
14befaf4 6916 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 6917 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 6918 char *s, *xf;
6919 STRLEN len, xlen;
6920
7a4c00b4 6921 if (mg)
6922 Safefree(mg->mg_ptr);
bbce6d69 6923 s = SvPV(sv, len);
6924 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 6925 if (SvREADONLY(sv)) {
6926 SAVEFREEPV(xf);
6927 *nxp = xlen;
3280af22 6928 return xf + sizeof(PL_collation_ix);
ff0cee69 6929 }
7a4c00b4 6930 if (! mg) {
14befaf4
DM
6931 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
6932 mg = mg_find(sv, PERL_MAGIC_collxfrm);
7a4c00b4 6933 assert(mg);
bbce6d69 6934 }
7a4c00b4 6935 mg->mg_ptr = xf;
565764a8 6936 mg->mg_len = xlen;
7a4c00b4 6937 }
6938 else {
ff0cee69 6939 if (mg) {
6940 mg->mg_ptr = NULL;
565764a8 6941 mg->mg_len = -1;
ff0cee69 6942 }
bbce6d69 6943 }
6944 }
7a4c00b4 6945 if (mg && mg->mg_ptr) {
565764a8 6946 *nxp = mg->mg_len;
3280af22 6947 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 6948 }
6949 else {
6950 *nxp = 0;
6951 return NULL;
16660edb 6952 }
79072805
LW
6953}
6954
36477c24 6955#endif /* USE_LOCALE_COLLATE */
bbce6d69 6956
c461cf8f
JH
6957/*
6958=for apidoc sv_gets
6959
6960Get a line from the filehandle and store it into the SV, optionally
6961appending to the currently-stored string.
6962
6963=cut
6964*/
6965
79072805 6966char *
864dbfa3 6967Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 6968{
e1ec3a88 6969 const char *rsptr;
c07a80fd 6970 STRLEN rslen;
6971 register STDCHAR rslast;
6972 register STDCHAR *bp;
6973 register I32 cnt;
9c5ffd7c 6974 I32 i = 0;
8bfdd7d9 6975 I32 rspara = 0;
e311fd51 6976 I32 recsize;
c07a80fd 6977
bc44a8a2
NC
6978 if (SvTHINKFIRST(sv))
6979 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
6980 /* XXX. If you make this PVIV, then copy on write can copy scalars read
6981 from <>.
6982 However, perlbench says it's slower, because the existing swipe code
6983 is faster than copy on write.
6984 Swings and roundabouts. */
6fc92669 6985 (void)SvUPGRADE(sv, SVt_PV);
99491443 6986
ff68c719 6987 SvSCREAM_off(sv);
efd8b2ba
AE
6988
6989 if (append) {
6990 if (PerlIO_isutf8(fp)) {
6991 if (!SvUTF8(sv)) {
6992 sv_utf8_upgrade_nomg(sv);
6993 sv_pos_u2b(sv,&append,0);
6994 }
6995 } else if (SvUTF8(sv)) {
6996 SV *tsv = NEWSV(0,0);
6997 sv_gets(tsv, fp, 0);
6998 sv_utf8_upgrade_nomg(tsv);
6999 SvCUR_set(sv,append);
7000 sv_catsv(sv,tsv);
7001 sv_free(tsv);
7002 goto return_string_or_null;
7003 }
7004 }
7005
7006 SvPOK_only(sv);
7007 if (PerlIO_isutf8(fp))
7008 SvUTF8_on(sv);
c07a80fd 7009
923e4eb5 7010 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
7011 /* we always read code in line mode */
7012 rsptr = "\n";
7013 rslen = 1;
7014 }
7015 else if (RsSNARF(PL_rs)) {
7a5fa8a2
NIS
7016 /* If it is a regular disk file use size from stat() as estimate
7017 of amount we are going to read - may result in malloc-ing
7018 more memory than we realy need if layers bellow reduce
e468d35b
NIS
7019 size we read (e.g. CRLF or a gzip layer)
7020 */
e311fd51 7021 Stat_t st;
e468d35b 7022 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
f54cb97a 7023 const Off_t offset = PerlIO_tell(fp);
58f1856e 7024 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
7025 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
7026 }
7027 }
c07a80fd 7028 rsptr = NULL;
7029 rslen = 0;
7030 }
3280af22 7031 else if (RsRECORD(PL_rs)) {
e311fd51 7032 I32 bytesread;
5b2b9c68
HM
7033 char *buffer;
7034
7035 /* Grab the size of the record we're getting */
3280af22 7036 recsize = SvIV(SvRV(PL_rs));
e311fd51 7037 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
7038 /* Go yank in */
7039#ifdef VMS
7040 /* VMS wants read instead of fread, because fread doesn't respect */
7041 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
7042 /* doing, but we've got no other real choice - except avoid stdio
7043 as implementation - perhaps write a :vms layer ?
7044 */
5b2b9c68
HM
7045 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
7046#else
7047 bytesread = PerlIO_read(fp, buffer, recsize);
7048#endif
27e6ca2d
AE
7049 if (bytesread < 0)
7050 bytesread = 0;
e311fd51 7051 SvCUR_set(sv, bytesread += append);
e670df4e 7052 buffer[bytesread] = '\0';
efd8b2ba 7053 goto return_string_or_null;
5b2b9c68 7054 }
3280af22 7055 else if (RsPARA(PL_rs)) {
c07a80fd 7056 rsptr = "\n\n";
7057 rslen = 2;
8bfdd7d9 7058 rspara = 1;
c07a80fd 7059 }
7d59b7e4
NIS
7060 else {
7061 /* Get $/ i.e. PL_rs into same encoding as stream wants */
7062 if (PerlIO_isutf8(fp)) {
7063 rsptr = SvPVutf8(PL_rs, rslen);
7064 }
7065 else {
7066 if (SvUTF8(PL_rs)) {
7067 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
7068 Perl_croak(aTHX_ "Wide character in $/");
7069 }
7070 }
7071 rsptr = SvPV(PL_rs, rslen);
7072 }
7073 }
7074
c07a80fd 7075 rslast = rslen ? rsptr[rslen - 1] : '\0';
7076
8bfdd7d9 7077 if (rspara) { /* have to do this both before and after */
79072805 7078 do { /* to make sure file boundaries work right */
760ac839 7079 if (PerlIO_eof(fp))
a0d0e21e 7080 return 0;
760ac839 7081 i = PerlIO_getc(fp);
79072805 7082 if (i != '\n') {
a0d0e21e
LW
7083 if (i == -1)
7084 return 0;
760ac839 7085 PerlIO_ungetc(fp,i);
79072805
LW
7086 break;
7087 }
7088 } while (i != EOF);
7089 }
c07a80fd 7090
760ac839
LW
7091 /* See if we know enough about I/O mechanism to cheat it ! */
7092
7093 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 7094 of abstracting out stdio interface. One call should be cheap
760ac839
LW
7095 enough here - and may even be a macro allowing compile
7096 time optimization.
7097 */
7098
7099 if (PerlIO_fast_gets(fp)) {
7100
7101 /*
7102 * We're going to steal some values from the stdio struct
7103 * and put EVERYTHING in the innermost loop into registers.
7104 */
7105 register STDCHAR *ptr;
7106 STRLEN bpx;
7107 I32 shortbuffered;
7108
16660edb 7109#if defined(VMS) && defined(PERLIO_IS_STDIO)
7110 /* An ungetc()d char is handled separately from the regular
7111 * buffer, so we getc() it back out and stuff it in the buffer.
7112 */
7113 i = PerlIO_getc(fp);
7114 if (i == EOF) return 0;
7115 *(--((*fp)->_ptr)) = (unsigned char) i;
7116 (*fp)->_cnt++;
7117#endif
c07a80fd 7118
c2960299 7119 /* Here is some breathtakingly efficient cheating */
c07a80fd 7120
a20bf0c3 7121 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b 7122 /* make sure we have the room */
7a5fa8a2 7123 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
e468d35b 7124 /* Not room for all of it
7a5fa8a2 7125 if we are looking for a separator and room for some
e468d35b
NIS
7126 */
7127 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7a5fa8a2 7128 /* just process what we have room for */
79072805
LW
7129 shortbuffered = cnt - SvLEN(sv) + append + 1;
7130 cnt -= shortbuffered;
7131 }
7132 else {
7133 shortbuffered = 0;
bbce6d69 7134 /* remember that cnt can be negative */
eb160463 7135 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
7136 }
7137 }
7a5fa8a2 7138 else
79072805 7139 shortbuffered = 0;
c07a80fd 7140 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
a20bf0c3 7141 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 7142 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7143 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 7144 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 7145 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7146 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7147 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
7148 for (;;) {
7149 screamer:
93a17b20 7150 if (cnt > 0) {
c07a80fd 7151 if (rslen) {
760ac839
LW
7152 while (cnt > 0) { /* this | eat */
7153 cnt--;
c07a80fd 7154 if ((*bp++ = *ptr++) == rslast) /* really | dust */
7155 goto thats_all_folks; /* screams | sed :-) */
7156 }
7157 }
7158 else {
1c846c1f
NIS
7159 Copy(ptr, bp, cnt, char); /* this | eat */
7160 bp += cnt; /* screams | dust */
c07a80fd 7161 ptr += cnt; /* louder | sed :-) */
a5f75d66 7162 cnt = 0;
93a17b20 7163 }
79072805
LW
7164 }
7165
748a9306 7166 if (shortbuffered) { /* oh well, must extend */
79072805
LW
7167 cnt = shortbuffered;
7168 shortbuffered = 0;
c07a80fd 7169 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
7170 SvCUR_set(sv, bpx);
7171 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 7172 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
7173 continue;
7174 }
7175
16660edb 7176 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
7177 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
7178 PTR2UV(ptr),(long)cnt));
cc00df79 7179 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 7180#if 0
16660edb 7181 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7182 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7183 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7184 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 7185#endif
1c846c1f 7186 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 7187 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
7188 another abstraction. */
760ac839 7189 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 7190#if 0
16660edb 7191 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7192 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7193 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7194 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 7195#endif
a20bf0c3
JH
7196 cnt = PerlIO_get_cnt(fp);
7197 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 7198 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7199 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 7200
748a9306
LW
7201 if (i == EOF) /* all done for ever? */
7202 goto thats_really_all_folks;
7203
c07a80fd 7204 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
7205 SvCUR_set(sv, bpx);
7206 SvGROW(sv, bpx + cnt + 2);
c07a80fd 7207 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
7208
eb160463 7209 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 7210
c07a80fd 7211 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 7212 goto thats_all_folks;
79072805
LW
7213 }
7214
7215thats_all_folks:
eb160463 7216 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX(sv)) < rslen) ||
36477c24 7217 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 7218 goto screamer; /* go back to the fray */
79072805
LW
7219thats_really_all_folks:
7220 if (shortbuffered)
7221 cnt += shortbuffered;
16660edb 7222 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7223 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 7224 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 7225 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7226 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7227 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7228 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 7229 *bp = '\0';
760ac839 7230 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 7231 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 7232 "Screamer: done, len=%ld, string=|%.*s|\n",
7233 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
7234 }
7235 else
79072805 7236 {
6edd2cd5 7237 /*The big, slow, and stupid way. */
27da23d5 7238#ifdef USE_HEAP_INSTEAD_OF_STACK /* Even slower way. */
6edd2cd5
JH
7239 STDCHAR *buf = 0;
7240 New(0, buf, 8192, STDCHAR);
7241 assert(buf);
4d2c4e07 7242#else
6edd2cd5 7243 STDCHAR buf[8192];
4d2c4e07 7244#endif
79072805 7245
760ac839 7246screamer2:
c07a80fd 7247 if (rslen) {
6867be6d 7248 const register STDCHAR *bpe = buf + sizeof(buf);
760ac839 7249 bp = buf;
eb160463 7250 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
7251 ; /* keep reading */
7252 cnt = bp - buf;
c07a80fd 7253 }
7254 else {
760ac839 7255 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 7256 /* Accomodate broken VAXC compiler, which applies U8 cast to
7257 * both args of ?: operator, causing EOF to change into 255
7258 */
37be0adf 7259 if (cnt > 0)
cbe9e203
JH
7260 i = (U8)buf[cnt - 1];
7261 else
37be0adf 7262 i = EOF;
c07a80fd 7263 }
79072805 7264
cbe9e203
JH
7265 if (cnt < 0)
7266 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
7267 if (append)
7268 sv_catpvn(sv, (char *) buf, cnt);
7269 else
7270 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 7271
7272 if (i != EOF && /* joy */
7273 (!rslen ||
7274 SvCUR(sv) < rslen ||
36477c24 7275 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
7276 {
7277 append = -1;
63e4d877
CS
7278 /*
7279 * If we're reading from a TTY and we get a short read,
7280 * indicating that the user hit his EOF character, we need
7281 * to notice it now, because if we try to read from the TTY
7282 * again, the EOF condition will disappear.
7283 *
7284 * The comparison of cnt to sizeof(buf) is an optimization
7285 * that prevents unnecessary calls to feof().
7286 *
7287 * - jik 9/25/96
7288 */
7289 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
7290 goto screamer2;
79072805 7291 }
6edd2cd5 7292
27da23d5 7293#ifdef USE_HEAP_INSTEAD_OF_STACK
6edd2cd5
JH
7294 Safefree(buf);
7295#endif
79072805
LW
7296 }
7297
8bfdd7d9 7298 if (rspara) { /* have to do this both before and after */
c07a80fd 7299 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 7300 i = PerlIO_getc(fp);
79072805 7301 if (i != '\n') {
760ac839 7302 PerlIO_ungetc(fp,i);
79072805
LW
7303 break;
7304 }
7305 }
7306 }
c07a80fd 7307
efd8b2ba 7308return_string_or_null:
c07a80fd 7309 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
7310}
7311
954c1994
GS
7312/*
7313=for apidoc sv_inc
7314
645c22ef
DM
7315Auto-increment of the value in the SV, doing string to numeric conversion
7316if necessary. Handles 'get' magic.
954c1994
GS
7317
7318=cut
7319*/
7320
79072805 7321void
864dbfa3 7322Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
7323{
7324 register char *d;
463ee0b2 7325 int flags;
79072805
LW
7326
7327 if (!sv)
7328 return;
b23a5f78
GB
7329 if (SvGMAGICAL(sv))
7330 mg_get(sv);
ed6116ce 7331 if (SvTHINKFIRST(sv)) {
765f542d
NC
7332 if (SvIsCOW(sv))
7333 sv_force_normal_flags(sv, 0);
0f15f207 7334 if (SvREADONLY(sv)) {
923e4eb5 7335 if (IN_PERL_RUNTIME)
cea2e8a9 7336 Perl_croak(aTHX_ PL_no_modify);
0f15f207 7337 }
a0d0e21e 7338 if (SvROK(sv)) {
b5be31e9 7339 IV i;
9e7bc3e8
JD
7340 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
7341 return;
56431972 7342 i = PTR2IV(SvRV(sv));
b5be31e9
SM
7343 sv_unref(sv);
7344 sv_setiv(sv, i);
a0d0e21e 7345 }
ed6116ce 7346 }
8990e307 7347 flags = SvFLAGS(sv);
28e5dec8
JH
7348 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
7349 /* It's (privately or publicly) a float, but not tested as an
7350 integer, so test it to see. */
d460ef45 7351 (void) SvIV(sv);
28e5dec8
JH
7352 flags = SvFLAGS(sv);
7353 }
7354 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7355 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 7356#ifdef PERL_PRESERVE_IVUV
28e5dec8 7357 oops_its_int:
59d8ce62 7358#endif
25da4f38
IZ
7359 if (SvIsUV(sv)) {
7360 if (SvUVX(sv) == UV_MAX)
a1e868e7 7361 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
7362 else
7363 (void)SvIOK_only_UV(sv);
607fa7f2 7364 SvUV_set(sv, SvUVX(sv) + 1);
25da4f38
IZ
7365 } else {
7366 if (SvIVX(sv) == IV_MAX)
28e5dec8 7367 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
7368 else {
7369 (void)SvIOK_only(sv);
45977657 7370 SvIV_set(sv, SvIVX(sv) + 1);
1c846c1f 7371 }
55497cff 7372 }
79072805
LW
7373 return;
7374 }
28e5dec8
JH
7375 if (flags & SVp_NOK) {
7376 (void)SvNOK_only(sv);
9d6ce603 7377 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
7378 return;
7379 }
7380
8990e307 7381 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
28e5dec8
JH
7382 if ((flags & SVTYPEMASK) < SVt_PVIV)
7383 sv_upgrade(sv, SVt_IV);
7384 (void)SvIOK_only(sv);
45977657 7385 SvIV_set(sv, 1);
79072805
LW
7386 return;
7387 }
463ee0b2 7388 d = SvPVX(sv);
79072805
LW
7389 while (isALPHA(*d)) d++;
7390 while (isDIGIT(*d)) d++;
7391 if (*d) {
28e5dec8 7392#ifdef PERL_PRESERVE_IVUV
d1be9408 7393 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
7394 warnings. Probably ought to make the sv_iv_please() that does
7395 the conversion if possible, and silently. */
c2988b20 7396 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
7397 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7398 /* Need to try really hard to see if it's an integer.
7399 9.22337203685478e+18 is an integer.
7400 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7401 so $a="9.22337203685478e+18"; $a+0; $a++
7402 needs to be the same as $a="9.22337203685478e+18"; $a++
7403 or we go insane. */
d460ef45 7404
28e5dec8
JH
7405 (void) sv_2iv(sv);
7406 if (SvIOK(sv))
7407 goto oops_its_int;
7408
7409 /* sv_2iv *should* have made this an NV */
7410 if (flags & SVp_NOK) {
7411 (void)SvNOK_only(sv);
9d6ce603 7412 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
7413 return;
7414 }
7415 /* I don't think we can get here. Maybe I should assert this
7416 And if we do get here I suspect that sv_setnv will croak. NWC
7417 Fall through. */
7418#if defined(USE_LONG_DOUBLE)
7419 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",
7420 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7421#else
1779d84d 7422 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
28e5dec8
JH
7423 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7424#endif
7425 }
7426#endif /* PERL_PRESERVE_IVUV */
7427 sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
79072805
LW
7428 return;
7429 }
7430 d--;
463ee0b2 7431 while (d >= SvPVX(sv)) {
79072805
LW
7432 if (isDIGIT(*d)) {
7433 if (++*d <= '9')
7434 return;
7435 *(d--) = '0';
7436 }
7437 else {
9d116dd7
JH
7438#ifdef EBCDIC
7439 /* MKS: The original code here died if letters weren't consecutive.
7440 * at least it didn't have to worry about non-C locales. The
7441 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 7442 * arranged in order (although not consecutively) and that only
9d116dd7
JH
7443 * [A-Za-z] are accepted by isALPHA in the C locale.
7444 */
7445 if (*d != 'z' && *d != 'Z') {
7446 do { ++*d; } while (!isALPHA(*d));
7447 return;
7448 }
7449 *(d--) -= 'z' - 'a';
7450#else
79072805
LW
7451 ++*d;
7452 if (isALPHA(*d))
7453 return;
7454 *(d--) -= 'z' - 'a' + 1;
9d116dd7 7455#endif
79072805
LW
7456 }
7457 }
7458 /* oh,oh, the number grew */
7459 SvGROW(sv, SvCUR(sv) + 2);
b162af07 7460 SvCUR_set(sv, SvCUR(sv) + 1);
463ee0b2 7461 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
7462 *d = d[-1];
7463 if (isDIGIT(d[1]))
7464 *d = '1';
7465 else
7466 *d = d[1];
7467}
7468
954c1994
GS
7469/*
7470=for apidoc sv_dec
7471
645c22ef
DM
7472Auto-decrement of the value in the SV, doing string to numeric conversion
7473if necessary. Handles 'get' magic.
954c1994
GS
7474
7475=cut
7476*/
7477
79072805 7478void
864dbfa3 7479Perl_sv_dec(pTHX_ register SV *sv)
79072805 7480{
463ee0b2
LW
7481 int flags;
7482
79072805
LW
7483 if (!sv)
7484 return;
b23a5f78
GB
7485 if (SvGMAGICAL(sv))
7486 mg_get(sv);
ed6116ce 7487 if (SvTHINKFIRST(sv)) {
765f542d
NC
7488 if (SvIsCOW(sv))
7489 sv_force_normal_flags(sv, 0);
0f15f207 7490 if (SvREADONLY(sv)) {
923e4eb5 7491 if (IN_PERL_RUNTIME)
cea2e8a9 7492 Perl_croak(aTHX_ PL_no_modify);
0f15f207 7493 }
a0d0e21e 7494 if (SvROK(sv)) {
b5be31e9 7495 IV i;
9e7bc3e8
JD
7496 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
7497 return;
56431972 7498 i = PTR2IV(SvRV(sv));
b5be31e9
SM
7499 sv_unref(sv);
7500 sv_setiv(sv, i);
a0d0e21e 7501 }
ed6116ce 7502 }
28e5dec8
JH
7503 /* Unlike sv_inc we don't have to worry about string-never-numbers
7504 and keeping them magic. But we mustn't warn on punting */
8990e307 7505 flags = SvFLAGS(sv);
28e5dec8
JH
7506 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7507 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 7508#ifdef PERL_PRESERVE_IVUV
28e5dec8 7509 oops_its_int:
59d8ce62 7510#endif
25da4f38
IZ
7511 if (SvIsUV(sv)) {
7512 if (SvUVX(sv) == 0) {
7513 (void)SvIOK_only(sv);
45977657 7514 SvIV_set(sv, -1);
25da4f38
IZ
7515 }
7516 else {
7517 (void)SvIOK_only_UV(sv);
607fa7f2 7518 SvUV_set(sv, SvUVX(sv) + 1);
1c846c1f 7519 }
25da4f38
IZ
7520 } else {
7521 if (SvIVX(sv) == IV_MIN)
65202027 7522 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
7523 else {
7524 (void)SvIOK_only(sv);
45977657 7525 SvIV_set(sv, SvIVX(sv) - 1);
1c846c1f 7526 }
55497cff 7527 }
7528 return;
7529 }
28e5dec8 7530 if (flags & SVp_NOK) {
9d6ce603 7531 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
7532 (void)SvNOK_only(sv);
7533 return;
7534 }
8990e307 7535 if (!(flags & SVp_POK)) {
4633a7c4
LW
7536 if ((flags & SVTYPEMASK) < SVt_PVNV)
7537 sv_upgrade(sv, SVt_NV);
f599b64b 7538 SvNV_set(sv, 1.0);
a0d0e21e 7539 (void)SvNOK_only(sv);
79072805
LW
7540 return;
7541 }
28e5dec8
JH
7542#ifdef PERL_PRESERVE_IVUV
7543 {
c2988b20 7544 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
7545 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7546 /* Need to try really hard to see if it's an integer.
7547 9.22337203685478e+18 is an integer.
7548 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7549 so $a="9.22337203685478e+18"; $a+0; $a--
7550 needs to be the same as $a="9.22337203685478e+18"; $a--
7551 or we go insane. */
d460ef45 7552
28e5dec8
JH
7553 (void) sv_2iv(sv);
7554 if (SvIOK(sv))
7555 goto oops_its_int;
7556
7557 /* sv_2iv *should* have made this an NV */
7558 if (flags & SVp_NOK) {
7559 (void)SvNOK_only(sv);
9d6ce603 7560 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
7561 return;
7562 }
7563 /* I don't think we can get here. Maybe I should assert this
7564 And if we do get here I suspect that sv_setnv will croak. NWC
7565 Fall through. */
7566#if defined(USE_LONG_DOUBLE)
7567 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",
7568 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7569#else
1779d84d 7570 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
28e5dec8
JH
7571 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7572#endif
7573 }
7574 }
7575#endif /* PERL_PRESERVE_IVUV */
097ee67d 7576 sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
7577}
7578
954c1994
GS
7579/*
7580=for apidoc sv_mortalcopy
7581
645c22ef 7582Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
7583The new SV is marked as mortal. It will be destroyed "soon", either by an
7584explicit call to FREETMPS, or by an implicit call at places such as
7585statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
7586
7587=cut
7588*/
7589
79072805
LW
7590/* Make a string that will exist for the duration of the expression
7591 * evaluation. Actually, it may have to last longer than that, but
7592 * hopefully we won't free it until it has been assigned to a
7593 * permanent location. */
7594
7595SV *
864dbfa3 7596Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 7597{
463ee0b2 7598 register SV *sv;
b881518d 7599
4561caa4 7600 new_SV(sv);
79072805 7601 sv_setsv(sv,oldstr);
677b06e3
GS
7602 EXTEND_MORTAL(1);
7603 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
7604 SvTEMP_on(sv);
7605 return sv;
7606}
7607
954c1994
GS
7608/*
7609=for apidoc sv_newmortal
7610
645c22ef 7611Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
7612set to 1. It will be destroyed "soon", either by an explicit call to
7613FREETMPS, or by an implicit call at places such as statement boundaries.
7614See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
7615
7616=cut
7617*/
7618
8990e307 7619SV *
864dbfa3 7620Perl_sv_newmortal(pTHX)
8990e307
LW
7621{
7622 register SV *sv;
7623
4561caa4 7624 new_SV(sv);
8990e307 7625 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
7626 EXTEND_MORTAL(1);
7627 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
7628 return sv;
7629}
7630
954c1994
GS
7631/*
7632=for apidoc sv_2mortal
7633
d4236ebc
DM
7634Marks an existing SV as mortal. The SV will be destroyed "soon", either
7635by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
7636statement boundaries. SvTEMP() is turned on which means that the SV's
7637string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
7638and C<sv_mortalcopy>.
954c1994
GS
7639
7640=cut
7641*/
7642
79072805 7643SV *
864dbfa3 7644Perl_sv_2mortal(pTHX_ register SV *sv)
79072805 7645{
27da23d5 7646 dVAR;
79072805
LW
7647 if (!sv)
7648 return sv;
d689ffdd 7649 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 7650 return sv;
677b06e3
GS
7651 EXTEND_MORTAL(1);
7652 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 7653 SvTEMP_on(sv);
79072805
LW
7654 return sv;
7655}
7656
954c1994
GS
7657/*
7658=for apidoc newSVpv
7659
7660Creates a new SV and copies a string into it. The reference count for the
7661SV is set to 1. If C<len> is zero, Perl will compute the length using
7662strlen(). For efficiency, consider using C<newSVpvn> instead.
7663
7664=cut
7665*/
7666
79072805 7667SV *
864dbfa3 7668Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 7669{
463ee0b2 7670 register SV *sv;
79072805 7671
4561caa4 7672 new_SV(sv);
79072805
LW
7673 if (!len)
7674 len = strlen(s);
7675 sv_setpvn(sv,s,len);
7676 return sv;
7677}
7678
954c1994
GS
7679/*
7680=for apidoc newSVpvn
7681
7682Creates a new SV and copies a string into it. The reference count for the
1c846c1f 7683SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 7684string. You are responsible for ensuring that the source string is at least
9e09f5f2 7685C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
7686
7687=cut
7688*/
7689
9da1e3b5 7690SV *
864dbfa3 7691Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
7692{
7693 register SV *sv;
7694
7695 new_SV(sv);
9da1e3b5
MUN
7696 sv_setpvn(sv,s,len);
7697 return sv;
7698}
7699
1c846c1f
NIS
7700/*
7701=for apidoc newSVpvn_share
7702
645c22ef
DM
7703Creates a new SV with its SvPVX pointing to a shared string in the string
7704table. If the string does not already exist in the table, it is created
7705first. Turns on READONLY and FAKE. The string's hash is stored in the UV
7706slot of the SV; if the C<hash> parameter is non-zero, that value is used;
7707otherwise the hash is computed. The idea here is that as the string table
7708is used for shared hash keys these strings will have SvPVX == HeKEY and
7709hash lookup will avoid string compare.
1c846c1f
NIS
7710
7711=cut
7712*/
7713
7714SV *
c3654f1a 7715Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
7716{
7717 register SV *sv;
c3654f1a
IH
7718 bool is_utf8 = FALSE;
7719 if (len < 0) {
77caf834 7720 STRLEN tmplen = -len;
c3654f1a 7721 is_utf8 = TRUE;
75a54232 7722 /* See the note in hv.c:hv_fetch() --jhi */
e1ec3a88 7723 src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
75a54232
JH
7724 len = tmplen;
7725 }
1c846c1f 7726 if (!hash)
5afd6d42 7727 PERL_HASH(hash, src, len);
1c846c1f
NIS
7728 new_SV(sv);
7729 sv_upgrade(sv, SVt_PVIV);
f880fe2f 7730 SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
b162af07 7731 SvCUR_set(sv, len);
607fa7f2 7732 SvUV_set(sv, hash);
b162af07 7733 SvLEN_set(sv, 0);
1c846c1f
NIS
7734 SvREADONLY_on(sv);
7735 SvFAKE_on(sv);
7736 SvPOK_on(sv);
c3654f1a
IH
7737 if (is_utf8)
7738 SvUTF8_on(sv);
1c846c1f
NIS
7739 return sv;
7740}
7741
645c22ef 7742
cea2e8a9 7743#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7744
7745/* pTHX_ magic can't cope with varargs, so this is a no-context
7746 * version of the main function, (which may itself be aliased to us).
7747 * Don't access this version directly.
7748 */
7749
46fc3d4c 7750SV *
cea2e8a9 7751Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 7752{
cea2e8a9 7753 dTHX;
46fc3d4c 7754 register SV *sv;
7755 va_list args;
46fc3d4c 7756 va_start(args, pat);
c5be433b 7757 sv = vnewSVpvf(pat, &args);
46fc3d4c 7758 va_end(args);
7759 return sv;
7760}
cea2e8a9 7761#endif
46fc3d4c 7762
954c1994
GS
7763/*
7764=for apidoc newSVpvf
7765
645c22ef 7766Creates a new SV and initializes it with the string formatted like
954c1994
GS
7767C<sprintf>.
7768
7769=cut
7770*/
7771
cea2e8a9
GS
7772SV *
7773Perl_newSVpvf(pTHX_ const char* pat, ...)
7774{
7775 register SV *sv;
7776 va_list args;
cea2e8a9 7777 va_start(args, pat);
c5be433b 7778 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
7779 va_end(args);
7780 return sv;
7781}
46fc3d4c 7782
645c22ef
DM
7783/* backend for newSVpvf() and newSVpvf_nocontext() */
7784
79072805 7785SV *
c5be433b
GS
7786Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
7787{
7788 register SV *sv;
7789 new_SV(sv);
7790 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7791 return sv;
7792}
7793
954c1994
GS
7794/*
7795=for apidoc newSVnv
7796
7797Creates a new SV and copies a floating point value into it.
7798The reference count for the SV is set to 1.
7799
7800=cut
7801*/
7802
c5be433b 7803SV *
65202027 7804Perl_newSVnv(pTHX_ NV n)
79072805 7805{
463ee0b2 7806 register SV *sv;
79072805 7807
4561caa4 7808 new_SV(sv);
79072805
LW
7809 sv_setnv(sv,n);
7810 return sv;
7811}
7812
954c1994
GS
7813/*
7814=for apidoc newSViv
7815
7816Creates a new SV and copies an integer into it. The reference count for the
7817SV is set to 1.
7818
7819=cut
7820*/
7821
79072805 7822SV *
864dbfa3 7823Perl_newSViv(pTHX_ IV i)
79072805 7824{
463ee0b2 7825 register SV *sv;
79072805 7826
4561caa4 7827 new_SV(sv);
79072805
LW
7828 sv_setiv(sv,i);
7829 return sv;
7830}
7831
954c1994 7832/*
1a3327fb
JH
7833=for apidoc newSVuv
7834
7835Creates a new SV and copies an unsigned integer into it.
7836The reference count for the SV is set to 1.
7837
7838=cut
7839*/
7840
7841SV *
7842Perl_newSVuv(pTHX_ UV u)
7843{
7844 register SV *sv;
7845
7846 new_SV(sv);
7847 sv_setuv(sv,u);
7848 return sv;
7849}
7850
7851/*
954c1994
GS
7852=for apidoc newRV_noinc
7853
7854Creates an RV wrapper for an SV. The reference count for the original
7855SV is B<not> incremented.
7856
7857=cut
7858*/
7859
2304df62 7860SV *
864dbfa3 7861Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
7862{
7863 register SV *sv;
7864
4561caa4 7865 new_SV(sv);
2304df62 7866 sv_upgrade(sv, SVt_RV);
76e3520e 7867 SvTEMP_off(tmpRef);
b162af07 7868 SvRV_set(sv, tmpRef);
2304df62 7869 SvROK_on(sv);
2304df62
AD
7870 return sv;
7871}
7872
ff276b08 7873/* newRV_inc is the official function name to use now.
645c22ef
DM
7874 * newRV_inc is in fact #defined to newRV in sv.h
7875 */
7876
5f05dabc 7877SV *
864dbfa3 7878Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 7879{
5f6447b6 7880 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 7881}
5f05dabc 7882
954c1994
GS
7883/*
7884=for apidoc newSVsv
7885
7886Creates a new SV which is an exact duplicate of the original SV.
645c22ef 7887(Uses C<sv_setsv>).
954c1994
GS
7888
7889=cut
7890*/
7891
79072805 7892SV *
864dbfa3 7893Perl_newSVsv(pTHX_ register SV *old)
79072805 7894{
463ee0b2 7895 register SV *sv;
79072805
LW
7896
7897 if (!old)
7898 return Nullsv;
8990e307 7899 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 7900 if (ckWARN_d(WARN_INTERNAL))
9014280d 7901 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
79072805
LW
7902 return Nullsv;
7903 }
4561caa4 7904 new_SV(sv);
e90aabeb
NC
7905 /* SV_GMAGIC is the default for sv_setv()
7906 SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
7907 with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
7908 sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
463ee0b2 7909 return sv;
79072805
LW
7910}
7911
645c22ef
DM
7912/*
7913=for apidoc sv_reset
7914
7915Underlying implementation for the C<reset> Perl function.
7916Note that the perl-level function is vaguely deprecated.
7917
7918=cut
7919*/
7920
79072805 7921void
e1ec3a88 7922Perl_sv_reset(pTHX_ register const char *s, HV *stash)
79072805 7923{
27da23d5 7924 dVAR;
79072805
LW
7925 register HE *entry;
7926 register GV *gv;
7927 register SV *sv;
7928 register I32 i;
7929 register PMOP *pm;
7930 register I32 max;
4802d5d7 7931 char todo[PERL_UCHAR_MAX+1];
79072805 7932
49d8d3a1
MB
7933 if (!stash)
7934 return;
7935
79072805
LW
7936 if (!*s) { /* reset ?? searches */
7937 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
48c036b1 7938 pm->op_pmdynflags &= ~PMdf_USED;
79072805
LW
7939 }
7940 return;
7941 }
7942
7943 /* reset variables */
7944
7945 if (!HvARRAY(stash))
7946 return;
463ee0b2
LW
7947
7948 Zero(todo, 256, char);
79072805 7949 while (*s) {
4802d5d7 7950 i = (unsigned char)*s;
79072805
LW
7951 if (s[1] == '-') {
7952 s += 2;
7953 }
4802d5d7 7954 max = (unsigned char)*s++;
79072805 7955 for ( ; i <= max; i++) {
463ee0b2
LW
7956 todo[i] = 1;
7957 }
a0d0e21e 7958 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 7959 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7960 entry;
7961 entry = HeNEXT(entry))
7962 {
1edc1566 7963 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7964 continue;
1edc1566 7965 gv = (GV*)HeVAL(entry);
79072805 7966 sv = GvSV(gv);
9e35f4b3
GS
7967 if (SvTHINKFIRST(sv)) {
7968 if (!SvREADONLY(sv) && SvROK(sv))
7969 sv_unref(sv);
7970 continue;
7971 }
0c34ef67 7972 SvOK_off(sv);
79072805
LW
7973 if (SvTYPE(sv) >= SVt_PV) {
7974 SvCUR_set(sv, 0);
463ee0b2
LW
7975 if (SvPVX(sv) != Nullch)
7976 *SvPVX(sv) = '\0';
44a8e56a 7977 SvTAINT(sv);
79072805
LW
7978 }
7979 if (GvAV(gv)) {
7980 av_clear(GvAV(gv));
7981 }
44a8e56a 7982 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
463ee0b2 7983 hv_clear(GvHV(gv));
2f42fcb0 7984#ifndef PERL_MICRO
fa6a1c44 7985#ifdef USE_ENVIRON_ARRAY
4efc5df6
GS
7986 if (gv == PL_envgv
7987# ifdef USE_ITHREADS
7988 && PL_curinterp == aTHX
7989# endif
7990 )
7991 {
79072805 7992 environ[0] = Nullch;
4efc5df6 7993 }
a0d0e21e 7994#endif
2f42fcb0 7995#endif /* !PERL_MICRO */
79072805
LW
7996 }
7997 }
7998 }
7999 }
8000}
8001
645c22ef
DM
8002/*
8003=for apidoc sv_2io
8004
8005Using various gambits, try to get an IO from an SV: the IO slot if its a
8006GV; or the recursive result if we're an RV; or the IO slot of the symbol
8007named after the PV if we're a string.
8008
8009=cut
8010*/
8011
46fc3d4c 8012IO*
864dbfa3 8013Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 8014{
8015 IO* io;
8016 GV* gv;
8017
8018 switch (SvTYPE(sv)) {
8019 case SVt_PVIO:
8020 io = (IO*)sv;
8021 break;
8022 case SVt_PVGV:
8023 gv = (GV*)sv;
8024 io = GvIO(gv);
8025 if (!io)
cea2e8a9 8026 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 8027 break;
8028 default:
8029 if (!SvOK(sv))
cea2e8a9 8030 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 8031 if (SvROK(sv))
8032 return sv_2io(SvRV(sv));
7a5fd60d 8033 gv = gv_fetchsv(sv, FALSE, SVt_PVIO);
46fc3d4c 8034 if (gv)
8035 io = GvIO(gv);
8036 else
8037 io = 0;
8038 if (!io)
35c1215d 8039 Perl_croak(aTHX_ "Bad filehandle: %"SVf, sv);
46fc3d4c 8040 break;
8041 }
8042 return io;
8043}
8044
645c22ef
DM
8045/*
8046=for apidoc sv_2cv
8047
8048Using various gambits, try to get a CV from an SV; in addition, try if
8049possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
8050
8051=cut
8052*/
8053
79072805 8054CV *
864dbfa3 8055Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 8056{
27da23d5 8057 dVAR;
c04a4dfe
JH
8058 GV *gv = Nullgv;
8059 CV *cv = Nullcv;
79072805
LW
8060
8061 if (!sv)
93a17b20 8062 return *gvp = Nullgv, Nullcv;
79072805 8063 switch (SvTYPE(sv)) {
79072805
LW
8064 case SVt_PVCV:
8065 *st = CvSTASH(sv);
8066 *gvp = Nullgv;
8067 return (CV*)sv;
8068 case SVt_PVHV:
8069 case SVt_PVAV:
8070 *gvp = Nullgv;
8071 return Nullcv;
8990e307
LW
8072 case SVt_PVGV:
8073 gv = (GV*)sv;
a0d0e21e 8074 *gvp = gv;
8990e307
LW
8075 *st = GvESTASH(gv);
8076 goto fix_gv;
8077
79072805 8078 default:
a0d0e21e
LW
8079 if (SvGMAGICAL(sv))
8080 mg_get(sv);
8081 if (SvROK(sv)) {
f5284f61
IZ
8082 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
8083 tryAMAGICunDEREF(to_cv);
8084
62f274bf
GS
8085 sv = SvRV(sv);
8086 if (SvTYPE(sv) == SVt_PVCV) {
8087 cv = (CV*)sv;
8088 *gvp = Nullgv;
8089 *st = CvSTASH(cv);
8090 return cv;
8091 }
8092 else if(isGV(sv))
8093 gv = (GV*)sv;
8094 else
cea2e8a9 8095 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 8096 }
62f274bf 8097 else if (isGV(sv))
79072805
LW
8098 gv = (GV*)sv;
8099 else
7a5fd60d 8100 gv = gv_fetchsv(sv, lref, SVt_PVCV);
79072805
LW
8101 *gvp = gv;
8102 if (!gv)
8103 return Nullcv;
8104 *st = GvESTASH(gv);
8990e307 8105 fix_gv:
8ebc5c01 8106 if (lref && !GvCVu(gv)) {
4633a7c4 8107 SV *tmpsv;
748a9306 8108 ENTER;
4633a7c4 8109 tmpsv = NEWSV(704,0);
16660edb 8110 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
8111 /* XXX this is probably not what they think they're getting.
8112 * It has the same effect as "sub name;", i.e. just a forward
8113 * declaration! */
774d564b 8114 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
8115 newSVOP(OP_CONST, 0, tmpsv),
8116 Nullop,
8990e307 8117 Nullop);
748a9306 8118 LEAVE;
8ebc5c01 8119 if (!GvCVu(gv))
35c1215d
NC
8120 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
8121 sv);
8990e307 8122 }
8ebc5c01 8123 return GvCVu(gv);
79072805
LW
8124 }
8125}
8126
c461cf8f
JH
8127/*
8128=for apidoc sv_true
8129
8130Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
8131Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
8132instead use an in-line version.
c461cf8f
JH
8133
8134=cut
8135*/
8136
79072805 8137I32
864dbfa3 8138Perl_sv_true(pTHX_ register SV *sv)
79072805 8139{
8990e307
LW
8140 if (!sv)
8141 return 0;
79072805 8142 if (SvPOK(sv)) {
e1ec3a88 8143 const register XPV* tXpv;
4e35701f 8144 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 8145 (tXpv->xpv_cur > 1 ||
4e35701f 8146 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
79072805
LW
8147 return 1;
8148 else
8149 return 0;
8150 }
8151 else {
8152 if (SvIOK(sv))
463ee0b2 8153 return SvIVX(sv) != 0;
79072805
LW
8154 else {
8155 if (SvNOK(sv))
463ee0b2 8156 return SvNVX(sv) != 0.0;
79072805 8157 else
463ee0b2 8158 return sv_2bool(sv);
79072805
LW
8159 }
8160 }
8161}
79072805 8162
645c22ef
DM
8163/*
8164=for apidoc sv_iv
8165
8166A private implementation of the C<SvIVx> macro for compilers which can't
8167cope with complex macro expressions. Always use the macro instead.
8168
8169=cut
8170*/
8171
ff68c719 8172IV
864dbfa3 8173Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 8174{
25da4f38
IZ
8175 if (SvIOK(sv)) {
8176 if (SvIsUV(sv))
8177 return (IV)SvUVX(sv);
ff68c719 8178 return SvIVX(sv);
25da4f38 8179 }
ff68c719 8180 return sv_2iv(sv);
85e6fe83 8181}
85e6fe83 8182
645c22ef
DM
8183/*
8184=for apidoc sv_uv
8185
8186A private implementation of the C<SvUVx> macro for compilers which can't
8187cope with complex macro expressions. Always use the macro instead.
8188
8189=cut
8190*/
8191
ff68c719 8192UV
864dbfa3 8193Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 8194{
25da4f38
IZ
8195 if (SvIOK(sv)) {
8196 if (SvIsUV(sv))
8197 return SvUVX(sv);
8198 return (UV)SvIVX(sv);
8199 }
ff68c719 8200 return sv_2uv(sv);
8201}
85e6fe83 8202
645c22ef
DM
8203/*
8204=for apidoc sv_nv
8205
8206A private implementation of the C<SvNVx> macro for compilers which can't
8207cope with complex macro expressions. Always use the macro instead.
8208
8209=cut
8210*/
8211
65202027 8212NV
864dbfa3 8213Perl_sv_nv(pTHX_ register SV *sv)
79072805 8214{
ff68c719 8215 if (SvNOK(sv))
8216 return SvNVX(sv);
8217 return sv_2nv(sv);
79072805 8218}
79072805 8219
09540bc3
JH
8220/* sv_pv() is now a macro using SvPV_nolen();
8221 * this function provided for binary compatibility only
8222 */
8223
8224char *
8225Perl_sv_pv(pTHX_ SV *sv)
8226{
8227 STRLEN n_a;
8228
8229 if (SvPOK(sv))
8230 return SvPVX(sv);
8231
8232 return sv_2pv(sv, &n_a);
8233}
8234
645c22ef
DM
8235/*
8236=for apidoc sv_pv
8237
baca2b92 8238Use the C<SvPV_nolen> macro instead
645c22ef 8239
645c22ef
DM
8240=for apidoc sv_pvn
8241
8242A private implementation of the C<SvPV> macro for compilers which can't
8243cope with complex macro expressions. Always use the macro instead.
8244
8245=cut
8246*/
8247
1fa8b10d 8248char *
864dbfa3 8249Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 8250{
85e6fe83
LW
8251 if (SvPOK(sv)) {
8252 *lp = SvCUR(sv);
a0d0e21e 8253 return SvPVX(sv);
85e6fe83 8254 }
463ee0b2 8255 return sv_2pv(sv, lp);
79072805 8256}
79072805 8257
6e9d1081
NC
8258
8259char *
8260Perl_sv_pvn_nomg(pTHX_ register SV *sv, STRLEN *lp)
8261{
8262 if (SvPOK(sv)) {
8263 *lp = SvCUR(sv);
8264 return SvPVX(sv);
8265 }
8266 return sv_2pv_flags(sv, lp, 0);
8267}
8268
09540bc3
JH
8269/* sv_pvn_force() is now a macro using Perl_sv_pvn_force_flags();
8270 * this function provided for binary compatibility only
8271 */
8272
8273char *
8274Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
8275{
8276 return sv_pvn_force_flags(sv, lp, SV_GMAGIC);
8277}
8278
c461cf8f
JH
8279/*
8280=for apidoc sv_pvn_force
8281
8282Get a sensible string out of the SV somehow.
645c22ef
DM
8283A private implementation of the C<SvPV_force> macro for compilers which
8284can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 8285
8d6d96c1
HS
8286=for apidoc sv_pvn_force_flags
8287
8288Get a sensible string out of the SV somehow.
8289If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
8290appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
8291implemented in terms of this function.
645c22ef
DM
8292You normally want to use the various wrapper macros instead: see
8293C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
8294
8295=cut
8296*/
8297
8298char *
8299Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
8300{
a0d0e21e 8301
6fc92669 8302 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 8303 sv_force_normal_flags(sv, 0);
1c846c1f 8304
a0d0e21e
LW
8305 if (SvPOK(sv)) {
8306 *lp = SvCUR(sv);
8307 }
8308 else {
a3b680e6 8309 char *s;
748a9306 8310 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 8311 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 8312 OP_NAME(PL_op));
a0d0e21e 8313 }
4633a7c4 8314 else
8d6d96c1 8315 s = sv_2pv_flags(sv, lp, flags);
a0d0e21e 8316 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
a3b680e6 8317 const STRLEN len = *lp;
1c846c1f 8318
a0d0e21e
LW
8319 if (SvROK(sv))
8320 sv_unref(sv);
8321 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
8322 SvGROW(sv, len + 1);
8323 Move(s,SvPVX(sv),len,char);
8324 SvCUR_set(sv, len);
8325 *SvEND(sv) = '\0';
8326 }
8327 if (!SvPOK(sv)) {
8328 SvPOK_on(sv); /* validate pointer */
8329 SvTAINT(sv);
1d7c1841
GS
8330 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
8331 PTR2UV(sv),SvPVX(sv)));
a0d0e21e
LW
8332 }
8333 }
8334 return SvPVX(sv);
8335}
8336
09540bc3
JH
8337/* sv_pvbyte () is now a macro using Perl_sv_2pv_flags();
8338 * this function provided for binary compatibility only
8339 */
8340
8341char *
8342Perl_sv_pvbyte(pTHX_ SV *sv)
8343{
8344 sv_utf8_downgrade(sv,0);
8345 return sv_pv(sv);
8346}
8347
645c22ef
DM
8348/*
8349=for apidoc sv_pvbyte
8350
baca2b92 8351Use C<SvPVbyte_nolen> instead.
645c22ef 8352
645c22ef
DM
8353=for apidoc sv_pvbyten
8354
8355A private implementation of the C<SvPVbyte> macro for compilers
8356which can't cope with complex macro expressions. Always use the macro
8357instead.
8358
8359=cut
8360*/
8361
7340a771
GS
8362char *
8363Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
8364{
ffebcc3e 8365 sv_utf8_downgrade(sv,0);
7340a771
GS
8366 return sv_pvn(sv,lp);
8367}
8368
645c22ef
DM
8369/*
8370=for apidoc sv_pvbyten_force
8371
8372A private implementation of the C<SvPVbytex_force> macro for compilers
8373which can't cope with complex macro expressions. Always use the macro
8374instead.
8375
8376=cut
8377*/
8378
7340a771
GS
8379char *
8380Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
8381{
46ec2f14 8382 sv_pvn_force(sv,lp);
ffebcc3e 8383 sv_utf8_downgrade(sv,0);
46ec2f14
TS
8384 *lp = SvCUR(sv);
8385 return SvPVX(sv);
7340a771
GS
8386}
8387
09540bc3
JH
8388/* sv_pvutf8 () is now a macro using Perl_sv_2pv_flags();
8389 * this function provided for binary compatibility only
8390 */
8391
8392char *
8393Perl_sv_pvutf8(pTHX_ SV *sv)
8394{
8395 sv_utf8_upgrade(sv);
8396 return sv_pv(sv);
8397}
8398
645c22ef
DM
8399/*
8400=for apidoc sv_pvutf8
8401
baca2b92 8402Use the C<SvPVutf8_nolen> macro instead
645c22ef 8403
645c22ef
DM
8404=for apidoc sv_pvutf8n
8405
8406A private implementation of the C<SvPVutf8> macro for compilers
8407which can't cope with complex macro expressions. Always use the macro
8408instead.
8409
8410=cut
8411*/
8412
7340a771
GS
8413char *
8414Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
8415{
560a288e 8416 sv_utf8_upgrade(sv);
7340a771
GS
8417 return sv_pvn(sv,lp);
8418}
8419
c461cf8f
JH
8420/*
8421=for apidoc sv_pvutf8n_force
8422
645c22ef
DM
8423A private implementation of the C<SvPVutf8_force> macro for compilers
8424which can't cope with complex macro expressions. Always use the macro
8425instead.
c461cf8f
JH
8426
8427=cut
8428*/
8429
7340a771
GS
8430char *
8431Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
8432{
46ec2f14 8433 sv_pvn_force(sv,lp);
560a288e 8434 sv_utf8_upgrade(sv);
46ec2f14
TS
8435 *lp = SvCUR(sv);
8436 return SvPVX(sv);
7340a771
GS
8437}
8438
c461cf8f
JH
8439/*
8440=for apidoc sv_reftype
8441
8442Returns a string describing what the SV is a reference to.
8443
8444=cut
8445*/
8446
1cb0ed9b 8447char *
bfed75c6 8448Perl_sv_reftype(pTHX_ const SV *sv, int ob)
a0d0e21e 8449{
07409e01
NC
8450 /* The fact that I don't need to downcast to char * everywhere, only in ?:
8451 inside return suggests a const propagation bug in g++. */
c86bf373 8452 if (ob && SvOBJECT(sv)) {
1cb0ed9b 8453 char *name = HvNAME(SvSTASH(sv));
07409e01 8454 return name ? name : (char *) "__ANON__";
c86bf373 8455 }
a0d0e21e
LW
8456 else {
8457 switch (SvTYPE(sv)) {
8458 case SVt_NULL:
8459 case SVt_IV:
8460 case SVt_NV:
8461 case SVt_RV:
8462 case SVt_PV:
8463 case SVt_PVIV:
8464 case SVt_PVNV:
8465 case SVt_PVMG:
8466 case SVt_PVBM:
1cb0ed9b 8467 if (SvVOK(sv))
439cb1c4 8468 return "VSTRING";
a0d0e21e
LW
8469 if (SvROK(sv))
8470 return "REF";
8471 else
8472 return "SCALAR";
1cb0ed9b 8473
07409e01 8474 case SVt_PVLV: return (char *) (SvROK(sv) ? "REF"
be65207d
DM
8475 /* tied lvalues should appear to be
8476 * scalars for backwards compatitbility */
8477 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
07409e01 8478 ? "SCALAR" : "LVALUE");
a0d0e21e
LW
8479 case SVt_PVAV: return "ARRAY";
8480 case SVt_PVHV: return "HASH";
8481 case SVt_PVCV: return "CODE";
8482 case SVt_PVGV: return "GLOB";
1d2dff63 8483 case SVt_PVFM: return "FORMAT";
27f9d8f3 8484 case SVt_PVIO: return "IO";
a0d0e21e
LW
8485 default: return "UNKNOWN";
8486 }
8487 }
8488}
8489
954c1994
GS
8490/*
8491=for apidoc sv_isobject
8492
8493Returns a boolean indicating whether the SV is an RV pointing to a blessed
8494object. If the SV is not an RV, or if the object is not blessed, then this
8495will return false.
8496
8497=cut
8498*/
8499
463ee0b2 8500int
864dbfa3 8501Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 8502{
68dc0745 8503 if (!sv)
8504 return 0;
8505 if (SvGMAGICAL(sv))
8506 mg_get(sv);
85e6fe83
LW
8507 if (!SvROK(sv))
8508 return 0;
8509 sv = (SV*)SvRV(sv);
8510 if (!SvOBJECT(sv))
8511 return 0;
8512 return 1;
8513}
8514
954c1994
GS
8515/*
8516=for apidoc sv_isa
8517
8518Returns a boolean indicating whether the SV is blessed into the specified
8519class. This does not check for subtypes; use C<sv_derived_from> to verify
8520an inheritance relationship.
8521
8522=cut
8523*/
8524
85e6fe83 8525int
864dbfa3 8526Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 8527{
68dc0745 8528 if (!sv)
8529 return 0;
8530 if (SvGMAGICAL(sv))
8531 mg_get(sv);
ed6116ce 8532 if (!SvROK(sv))
463ee0b2 8533 return 0;
ed6116ce
LW
8534 sv = (SV*)SvRV(sv);
8535 if (!SvOBJECT(sv))
463ee0b2 8536 return 0;
e27ad1f2
AV
8537 if (!HvNAME(SvSTASH(sv)))
8538 return 0;
463ee0b2
LW
8539
8540 return strEQ(HvNAME(SvSTASH(sv)), name);
8541}
8542
954c1994
GS
8543/*
8544=for apidoc newSVrv
8545
8546Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
8547it will be upgraded to one. If C<classname> is non-null then the new SV will
8548be blessed in the specified package. The new SV is returned and its
8549reference count is 1.
8550
8551=cut
8552*/
8553
463ee0b2 8554SV*
864dbfa3 8555Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 8556{
463ee0b2
LW
8557 SV *sv;
8558
4561caa4 8559 new_SV(sv);
51cf62d8 8560
765f542d 8561 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 8562 SvAMAGIC_off(rv);
51cf62d8 8563
0199fce9 8564 if (SvTYPE(rv) >= SVt_PVMG) {
a3b680e6 8565 const U32 refcnt = SvREFCNT(rv);
0199fce9
JD
8566 SvREFCNT(rv) = 0;
8567 sv_clear(rv);
8568 SvFLAGS(rv) = 0;
8569 SvREFCNT(rv) = refcnt;
8570 }
8571
51cf62d8 8572 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
8573 sv_upgrade(rv, SVt_RV);
8574 else if (SvTYPE(rv) > SVt_RV) {
8bd4d4c5 8575 SvPV_free(rv);
0199fce9
JD
8576 SvCUR_set(rv, 0);
8577 SvLEN_set(rv, 0);
8578 }
51cf62d8 8579
0c34ef67 8580 SvOK_off(rv);
b162af07 8581 SvRV_set(rv, sv);
ed6116ce 8582 SvROK_on(rv);
463ee0b2 8583
a0d0e21e
LW
8584 if (classname) {
8585 HV* stash = gv_stashpv(classname, TRUE);
8586 (void)sv_bless(rv, stash);
8587 }
8588 return sv;
8589}
8590
954c1994
GS
8591/*
8592=for apidoc sv_setref_pv
8593
8594Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
8595argument will be upgraded to an RV. That RV will be modified to point to
8596the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
8597into the SV. The C<classname> argument indicates the package for the
8598blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8599will have a reference count of 1, and the RV will be returned.
954c1994
GS
8600
8601Do not use with other Perl types such as HV, AV, SV, CV, because those
8602objects will become corrupted by the pointer copy process.
8603
8604Note that C<sv_setref_pvn> copies the string while this copies the pointer.
8605
8606=cut
8607*/
8608
a0d0e21e 8609SV*
864dbfa3 8610Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 8611{
189b2af5 8612 if (!pv) {
3280af22 8613 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
8614 SvSETMAGIC(rv);
8615 }
a0d0e21e 8616 else
56431972 8617 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
8618 return rv;
8619}
8620
954c1994
GS
8621/*
8622=for apidoc sv_setref_iv
8623
8624Copies an integer into a new SV, optionally blessing the SV. The C<rv>
8625argument will be upgraded to an RV. That RV will be modified to point to
8626the new SV. The C<classname> argument indicates the package for the
8627blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8628will have a reference count of 1, and the RV will be returned.
954c1994
GS
8629
8630=cut
8631*/
8632
a0d0e21e 8633SV*
864dbfa3 8634Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
8635{
8636 sv_setiv(newSVrv(rv,classname), iv);
8637 return rv;
8638}
8639
954c1994 8640/*
e1c57cef
JH
8641=for apidoc sv_setref_uv
8642
8643Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
8644argument will be upgraded to an RV. That RV will be modified to point to
8645the new SV. The C<classname> argument indicates the package for the
8646blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8647will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
8648
8649=cut
8650*/
8651
8652SV*
8653Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
8654{
8655 sv_setuv(newSVrv(rv,classname), uv);
8656 return rv;
8657}
8658
8659/*
954c1994
GS
8660=for apidoc sv_setref_nv
8661
8662Copies a double into a new SV, optionally blessing the SV. The C<rv>
8663argument will be upgraded to an RV. That RV will be modified to point to
8664the new SV. The C<classname> argument indicates the package for the
8665blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8666will have a reference count of 1, and the RV will be returned.
954c1994
GS
8667
8668=cut
8669*/
8670
a0d0e21e 8671SV*
65202027 8672Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
8673{
8674 sv_setnv(newSVrv(rv,classname), nv);
8675 return rv;
8676}
463ee0b2 8677
954c1994
GS
8678/*
8679=for apidoc sv_setref_pvn
8680
8681Copies a string into a new SV, optionally blessing the SV. The length of the
8682string must be specified with C<n>. The C<rv> argument will be upgraded to
8683an RV. That RV will be modified to point to the new SV. The C<classname>
8684argument indicates the package for the blessing. Set C<classname> to
7a5fa8a2 8685C<Nullch> to avoid the blessing. The new SV will have a reference count
d34c2299 8686of 1, and the RV will be returned.
954c1994
GS
8687
8688Note that C<sv_setref_pv> copies the pointer while this copies the string.
8689
8690=cut
8691*/
8692
a0d0e21e 8693SV*
864dbfa3 8694Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
8695{
8696 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
8697 return rv;
8698}
8699
954c1994
GS
8700/*
8701=for apidoc sv_bless
8702
8703Blesses an SV into a specified package. The SV must be an RV. The package
8704must be designated by its stash (see C<gv_stashpv()>). The reference count
8705of the SV is unaffected.
8706
8707=cut
8708*/
8709
a0d0e21e 8710SV*
864dbfa3 8711Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 8712{
76e3520e 8713 SV *tmpRef;
a0d0e21e 8714 if (!SvROK(sv))
cea2e8a9 8715 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
8716 tmpRef = SvRV(sv);
8717 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
8718 if (SvREADONLY(tmpRef))
cea2e8a9 8719 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
8720 if (SvOBJECT(tmpRef)) {
8721 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8722 --PL_sv_objcount;
76e3520e 8723 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 8724 }
a0d0e21e 8725 }
76e3520e
GS
8726 SvOBJECT_on(tmpRef);
8727 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8728 ++PL_sv_objcount;
76e3520e 8729 (void)SvUPGRADE(tmpRef, SVt_PVMG);
b162af07 8730 SvSTASH_set(tmpRef, (HV*)SvREFCNT_inc(stash));
a0d0e21e 8731
2e3febc6
CS
8732 if (Gv_AMG(stash))
8733 SvAMAGIC_on(sv);
8734 else
8735 SvAMAGIC_off(sv);
a0d0e21e 8736
1edbfb88
AB
8737 if(SvSMAGICAL(tmpRef))
8738 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8739 mg_set(tmpRef);
8740
8741
ecdeb87c 8742
a0d0e21e
LW
8743 return sv;
8744}
8745
645c22ef 8746/* Downgrades a PVGV to a PVMG.
645c22ef
DM
8747 */
8748
76e3520e 8749STATIC void
cea2e8a9 8750S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 8751{
850fabdf
GS
8752 void *xpvmg;
8753
a0d0e21e
LW
8754 assert(SvTYPE(sv) == SVt_PVGV);
8755 SvFAKE_off(sv);
8756 if (GvGP(sv))
1edc1566 8757 gp_free((GV*)sv);
e826b3c7
GS
8758 if (GvSTASH(sv)) {
8759 SvREFCNT_dec(GvSTASH(sv));
8760 GvSTASH(sv) = Nullhv;
8761 }
14befaf4 8762 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 8763 Safefree(GvNAME(sv));
a5f75d66 8764 GvMULTI_off(sv);
850fabdf
GS
8765
8766 /* need to keep SvANY(sv) in the right arena */
8767 xpvmg = new_XPVMG();
8768 StructCopy(SvANY(sv), xpvmg, XPVMG);
8769 del_XPVGV(SvANY(sv));
8770 SvANY(sv) = xpvmg;
8771
a0d0e21e
LW
8772 SvFLAGS(sv) &= ~SVTYPEMASK;
8773 SvFLAGS(sv) |= SVt_PVMG;
8774}
8775
954c1994 8776/*
840a7b70 8777=for apidoc sv_unref_flags
954c1994
GS
8778
8779Unsets the RV status of the SV, and decrements the reference count of
8780whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
8781as a reversal of C<newSVrv>. The C<cflags> argument can contain
8782C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8783(otherwise the decrementing is conditional on the reference count being
8784different from one or the reference being a readonly SV).
7889fe52 8785See C<SvROK_off>.
954c1994
GS
8786
8787=cut
8788*/
8789
ed6116ce 8790void
840a7b70 8791Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 8792{
a0d0e21e 8793 SV* rv = SvRV(sv);
810b8aa5
GS
8794
8795 if (SvWEAKREF(sv)) {
8796 sv_del_backref(sv);
8797 SvWEAKREF_off(sv);
b162af07 8798 SvRV_set(sv, NULL);
810b8aa5
GS
8799 return;
8800 }
b162af07 8801 SvRV_set(sv, NULL);
ed6116ce 8802 SvROK_off(sv);
04ca4930
NC
8803 /* You can't have a || SvREADONLY(rv) here, as $a = $$a, where $a was
8804 assigned to as BEGIN {$a = \"Foo"} will fail. */
8805 if (SvREFCNT(rv) != 1 || (flags & SV_IMMEDIATE_UNREF))
4633a7c4 8806 SvREFCNT_dec(rv);
840a7b70 8807 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 8808 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 8809}
8990e307 8810
840a7b70
IZ
8811/*
8812=for apidoc sv_unref
8813
8814Unsets the RV status of the SV, and decrements the reference count of
8815whatever was being referenced by the RV. This can almost be thought of
8816as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 8817being zero. See C<SvROK_off>.
840a7b70
IZ
8818
8819=cut
8820*/
8821
8822void
8823Perl_sv_unref(pTHX_ SV *sv)
8824{
8825 sv_unref_flags(sv, 0);
8826}
8827
645c22ef
DM
8828/*
8829=for apidoc sv_taint
8830
8831Taint an SV. Use C<SvTAINTED_on> instead.
8832=cut
8833*/
8834
bbce6d69 8835void
864dbfa3 8836Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 8837{
14befaf4 8838 sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
bbce6d69 8839}
8840
645c22ef
DM
8841/*
8842=for apidoc sv_untaint
8843
8844Untaint an SV. Use C<SvTAINTED_off> instead.
8845=cut
8846*/
8847
bbce6d69 8848void
864dbfa3 8849Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 8850{
13f57bf8 8851 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8852 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 8853 if (mg)
565764a8 8854 mg->mg_len &= ~1;
36477c24 8855 }
bbce6d69 8856}
8857
645c22ef
DM
8858/*
8859=for apidoc sv_tainted
8860
8861Test an SV for taintedness. Use C<SvTAINTED> instead.
8862=cut
8863*/
8864
bbce6d69 8865bool
864dbfa3 8866Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 8867{
13f57bf8 8868 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8869 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
155aba94 8870 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 8871 return TRUE;
8872 }
8873 return FALSE;
bbce6d69 8874}
8875
09540bc3
JH
8876/*
8877=for apidoc sv_setpviv
8878
8879Copies an integer into the given SV, also updating its string value.
8880Does not handle 'set' magic. See C<sv_setpviv_mg>.
8881
8882=cut
8883*/
8884
8885void
8886Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
8887{
8888 char buf[TYPE_CHARS(UV)];
8889 char *ebuf;
8890 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8891
8892 sv_setpvn(sv, ptr, ebuf - ptr);
8893}
8894
8895/*
8896=for apidoc sv_setpviv_mg
8897
8898Like C<sv_setpviv>, but also handles 'set' magic.
8899
8900=cut
8901*/
8902
8903void
8904Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
8905{
8906 char buf[TYPE_CHARS(UV)];
8907 char *ebuf;
8908 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8909
8910 sv_setpvn(sv, ptr, ebuf - ptr);
8911 SvSETMAGIC(sv);
8912}
8913
cea2e8a9 8914#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8915
8916/* pTHX_ magic can't cope with varargs, so this is a no-context
8917 * version of the main function, (which may itself be aliased to us).
8918 * Don't access this version directly.
8919 */
8920
cea2e8a9
GS
8921void
8922Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
8923{
8924 dTHX;
8925 va_list args;
8926 va_start(args, pat);
c5be433b 8927 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
8928 va_end(args);
8929}
8930
645c22ef
DM
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 */
cea2e8a9
GS
8935
8936void
8937Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
8938{
8939 dTHX;
8940 va_list args;
8941 va_start(args, pat);
c5be433b 8942 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 8943 va_end(args);
cea2e8a9
GS
8944}
8945#endif
8946
954c1994
GS
8947/*
8948=for apidoc sv_setpvf
8949
bffc3d17
SH
8950Works like C<sv_catpvf> but copies the text into the SV instead of
8951appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
8952
8953=cut
8954*/
8955
46fc3d4c 8956void
864dbfa3 8957Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8958{
8959 va_list args;
46fc3d4c 8960 va_start(args, pat);
c5be433b 8961 sv_vsetpvf(sv, pat, &args);
46fc3d4c 8962 va_end(args);
8963}
8964
bffc3d17
SH
8965/*
8966=for apidoc sv_vsetpvf
8967
8968Works like C<sv_vcatpvf> but copies the text into the SV instead of
8969appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
8970
8971Usually used via its frontend C<sv_setpvf>.
8972
8973=cut
8974*/
645c22ef 8975
c5be433b
GS
8976void
8977Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8978{
8979 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8980}
ef50df4b 8981
954c1994
GS
8982/*
8983=for apidoc sv_setpvf_mg
8984
8985Like C<sv_setpvf>, but also handles 'set' magic.
8986
8987=cut
8988*/
8989
ef50df4b 8990void
864dbfa3 8991Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8992{
8993 va_list args;
ef50df4b 8994 va_start(args, pat);
c5be433b 8995 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 8996 va_end(args);
c5be433b
GS
8997}
8998
bffc3d17
SH
8999/*
9000=for apidoc sv_vsetpvf_mg
9001
9002Like C<sv_vsetpvf>, but also handles 'set' magic.
9003
9004Usually used via its frontend C<sv_setpvf_mg>.
9005
9006=cut
9007*/
645c22ef 9008
c5be433b
GS
9009void
9010Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
9011{
9012 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
9013 SvSETMAGIC(sv);
9014}
9015
cea2e8a9 9016#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
9017
9018/* pTHX_ magic can't cope with varargs, so this is a no-context
9019 * version of the main function, (which may itself be aliased to us).
9020 * Don't access this version directly.
9021 */
9022
cea2e8a9
GS
9023void
9024Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
9025{
9026 dTHX;
9027 va_list args;
9028 va_start(args, pat);
c5be433b 9029 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
9030 va_end(args);
9031}
9032
645c22ef
DM
9033/* pTHX_ magic can't cope with varargs, so this is a no-context
9034 * version of the main function, (which may itself be aliased to us).
9035 * Don't access this version directly.
9036 */
9037
cea2e8a9
GS
9038void
9039Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
9040{
9041 dTHX;
9042 va_list args;
9043 va_start(args, pat);
c5be433b 9044 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 9045 va_end(args);
cea2e8a9
GS
9046}
9047#endif
9048
954c1994
GS
9049/*
9050=for apidoc sv_catpvf
9051
d5ce4a7c
GA
9052Processes its arguments like C<sprintf> and appends the formatted
9053output to an SV. If the appended data contains "wide" characters
9054(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
9055and characters >255 formatted with %c), the original SV might get
bffc3d17 9056upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
9057C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
9058valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 9059
d5ce4a7c 9060=cut */
954c1994 9061
46fc3d4c 9062void
864dbfa3 9063Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 9064{
9065 va_list args;
46fc3d4c 9066 va_start(args, pat);
c5be433b 9067 sv_vcatpvf(sv, pat, &args);
46fc3d4c 9068 va_end(args);
9069}
9070
bffc3d17
SH
9071/*
9072=for apidoc sv_vcatpvf
9073
9074Processes its arguments like C<vsprintf> and appends the formatted output
9075to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
9076
9077Usually used via its frontend C<sv_catpvf>.
9078
9079=cut
9080*/
645c22ef 9081
ef50df4b 9082void
c5be433b
GS
9083Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
9084{
9085 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
9086}
9087
954c1994
GS
9088/*
9089=for apidoc sv_catpvf_mg
9090
9091Like C<sv_catpvf>, but also handles 'set' magic.
9092
9093=cut
9094*/
9095
c5be433b 9096void
864dbfa3 9097Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
9098{
9099 va_list args;
ef50df4b 9100 va_start(args, pat);
c5be433b 9101 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 9102 va_end(args);
c5be433b
GS
9103}
9104
bffc3d17
SH
9105/*
9106=for apidoc sv_vcatpvf_mg
9107
9108Like C<sv_vcatpvf>, but also handles 'set' magic.
9109
9110Usually used via its frontend C<sv_catpvf_mg>.
9111
9112=cut
9113*/
645c22ef 9114
c5be433b
GS
9115void
9116Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
9117{
9118 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
9119 SvSETMAGIC(sv);
9120}
9121
954c1994
GS
9122/*
9123=for apidoc sv_vsetpvfn
9124
bffc3d17 9125Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
9126appending it.
9127
bffc3d17 9128Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 9129
954c1994
GS
9130=cut
9131*/
9132
46fc3d4c 9133void
7d5ea4e7 9134Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 9135{
9136 sv_setpvn(sv, "", 0);
7d5ea4e7 9137 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 9138}
9139
645c22ef
DM
9140/* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
9141
2d00ba3b 9142STATIC I32
9dd79c3f 9143S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
9144{
9145 I32 var = 0;
9146 switch (**pattern) {
9147 case '1': case '2': case '3':
9148 case '4': case '5': case '6':
9149 case '7': case '8': case '9':
9150 while (isDIGIT(**pattern))
9151 var = var * 10 + (*(*pattern)++ - '0');
9152 }
9153 return var;
9154}
9dd79c3f 9155#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 9156
4151a5fe
IZ
9157static char *
9158F0convert(NV nv, char *endbuf, STRLEN *len)
9159{
a3b680e6 9160 const int neg = nv < 0;
4151a5fe
IZ
9161 UV uv;
9162 char *p = endbuf;
9163
9164 if (neg)
9165 nv = -nv;
9166 if (nv < UV_MAX) {
9167 nv += 0.5;
028f8eaa 9168 uv = (UV)nv;
4151a5fe
IZ
9169 if (uv & 1 && uv == nv)
9170 uv--; /* Round to even */
9171 do {
a3b680e6 9172 const unsigned dig = uv % 10;
4151a5fe
IZ
9173 *--p = '0' + dig;
9174 } while (uv /= 10);
9175 if (neg)
9176 *--p = '-';
9177 *len = endbuf - p;
9178 return p;
9179 }
9180 return Nullch;
9181}
9182
9183
954c1994
GS
9184/*
9185=for apidoc sv_vcatpvfn
9186
9187Processes its arguments like C<vsprintf> and appends the formatted output
9188to an SV. Uses an array of SVs if the C style variable argument list is
9189missing (NULL). When running with taint checks enabled, indicates via
9190C<maybe_tainted> if results are untrustworthy (often due to the use of
9191locales).
9192
bffc3d17 9193Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 9194
954c1994
GS
9195=cut
9196*/
9197
1ef29b0e
RGS
9198/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
9199
46fc3d4c 9200void
7d5ea4e7 9201Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 9202{
9203 char *p;
9204 char *q;
a3b680e6 9205 const char *patend;
fc36a67e 9206 STRLEN origlen;
46fc3d4c 9207 I32 svix = 0;
27da23d5 9208 static const char nullstr[] = "(null)";
9c5ffd7c 9209 SV *argsv = Nullsv;
db79b45b
JH
9210 bool has_utf8; /* has the result utf8? */
9211 bool pat_utf8; /* the pattern is in utf8? */
9212 SV *nsv = Nullsv;
4151a5fe
IZ
9213 /* Times 4: a decimal digit takes more than 3 binary digits.
9214 * NV_DIG: mantissa takes than many decimal digits.
9215 * Plus 32: Playing safe. */
9216 char ebuf[IV_DIG * 4 + NV_DIG + 32];
9217 /* large enough for "%#.#f" --chip */
9218 /* what about long double NVs? --jhi */
db79b45b
JH
9219
9220 has_utf8 = pat_utf8 = DO_UTF8(sv);
46fc3d4c 9221
9222 /* no matter what, this is a string now */
fc36a67e 9223 (void)SvPV_force(sv, origlen);
46fc3d4c 9224
0dbb1585 9225 /* special-case "", "%s", and "%-p" (SVf) */
46fc3d4c 9226 if (patlen == 0)
9227 return;
0dbb1585 9228 if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
c635e13b 9229 if (args) {
73d840c0 9230 const char *s = va_arg(*args, char*);
c635e13b 9231 sv_catpv(sv, s ? s : nullstr);
9232 }
7e2040f0 9233 else if (svix < svmax) {
fc36a67e 9234 sv_catsv(sv, *svargs);
7e2040f0
GS
9235 if (DO_UTF8(*svargs))
9236 SvUTF8_on(sv);
9237 }
fc36a67e 9238 return;
0dbb1585
AL
9239 }
9240 if (patlen == 3 && pat[0] == '%' &&
9241 pat[1] == '-' && pat[2] == 'p') {
fc36a67e 9242 if (args) {
7e2040f0
GS
9243 argsv = va_arg(*args, SV*);
9244 sv_catsv(sv, argsv);
9245 if (DO_UTF8(argsv))
9246 SvUTF8_on(sv);
fc36a67e 9247 return;
9248 }
46fc3d4c 9249 }
9250
1d917b39 9251#ifndef USE_LONG_DOUBLE
4151a5fe
IZ
9252 /* special-case "%.<number>[gf]" */
9253 if ( patlen <= 5 && pat[0] == '%' && pat[1] == '.'
9254 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
9255 unsigned digits = 0;
9256 const char *pp;
9257
9258 pp = pat + 2;
9259 while (*pp >= '0' && *pp <= '9')
9260 digits = 10 * digits + (*pp++ - '0');
028f8eaa 9261 if (pp - pat == (int)patlen - 1) {
4151a5fe
IZ
9262 NV nv;
9263
9264 if (args)
9265 nv = (NV)va_arg(*args, double);
9266 else if (svix < svmax)
9267 nv = SvNV(*svargs);
9268 else
9269 return;
9270 if (*pp == 'g') {
2873255c
NC
9271 /* Add check for digits != 0 because it seems that some
9272 gconverts are buggy in this case, and we don't yet have
9273 a Configure test for this. */
9274 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
9275 /* 0, point, slack */
2e59c212 9276 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
9277 sv_catpv(sv, ebuf);
9278 if (*ebuf) /* May return an empty string for digits==0 */
9279 return;
9280 }
9281 } else if (!digits) {
9282 STRLEN l;
9283
9284 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
9285 sv_catpvn(sv, p, l);
9286 return;
9287 }
9288 }
9289 }
9290 }
1d917b39 9291#endif /* !USE_LONG_DOUBLE */
4151a5fe 9292
2cf2cfc6 9293 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 9294 has_utf8 = TRUE;
2cf2cfc6 9295
46fc3d4c 9296 patend = (char*)pat + patlen;
9297 for (p = (char*)pat; p < patend; p = q) {
9298 bool alt = FALSE;
9299 bool left = FALSE;
b22c7a20 9300 bool vectorize = FALSE;
211dfcf1 9301 bool vectorarg = FALSE;
2cf2cfc6 9302 bool vec_utf8 = FALSE;
46fc3d4c 9303 char fill = ' ';
9304 char plus = 0;
9305 char intsize = 0;
9306 STRLEN width = 0;
fc36a67e 9307 STRLEN zeros = 0;
46fc3d4c 9308 bool has_precis = FALSE;
9309 STRLEN precis = 0;
58e33a90 9310 I32 osvix = svix;
2cf2cfc6 9311 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
9312#ifdef HAS_LDBL_SPRINTF_BUG
9313 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 9314 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
9315 bool fix_ldbl_sprintf_bug = FALSE;
9316#endif
205f51d8 9317
46fc3d4c 9318 char esignbuf[4];
89ebb4a3 9319 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 9320 STRLEN esignlen = 0;
9321
9322 char *eptr = Nullch;
fc36a67e 9323 STRLEN elen = 0;
81f715da 9324 SV *vecsv = Nullsv;
a05b299f 9325 U8 *vecstr = Null(U8*);
b22c7a20 9326 STRLEN veclen = 0;
934abaf1 9327 char c = 0;
46fc3d4c 9328 int i;
9c5ffd7c 9329 unsigned base = 0;
8c8eb53c
RB
9330 IV iv = 0;
9331 UV uv = 0;
9e5b023a
JH
9332 /* we need a long double target in case HAS_LONG_DOUBLE but
9333 not USE_LONG_DOUBLE
9334 */
35fff930 9335#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
9336 long double nv;
9337#else
65202027 9338 NV nv;
9e5b023a 9339#endif
46fc3d4c 9340 STRLEN have;
9341 STRLEN need;
9342 STRLEN gap;
e1ec3a88 9343 const char *dotstr = ".";
b22c7a20 9344 STRLEN dotstrlen = 1;
211dfcf1 9345 I32 efix = 0; /* explicit format parameter index */
eb3fce90 9346 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
9347 I32 epix = 0; /* explicit precision index */
9348 I32 evix = 0; /* explicit vector index */
eb3fce90 9349 bool asterisk = FALSE;
46fc3d4c 9350
211dfcf1 9351 /* echo everything up to the next format specification */
46fc3d4c 9352 for (q = p; q < patend && *q != '%'; ++q) ;
9353 if (q > p) {
db79b45b
JH
9354 if (has_utf8 && !pat_utf8)
9355 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
9356 else
9357 sv_catpvn(sv, p, q - p);
46fc3d4c 9358 p = q;
9359 }
9360 if (q++ >= patend)
9361 break;
9362
211dfcf1
HS
9363/*
9364 We allow format specification elements in this order:
9365 \d+\$ explicit format parameter index
9366 [-+ 0#]+ flags
a472f209 9367 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 9368 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
9369 \d+|\*(\d+\$)? width using optional (optionally specified) arg
9370 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
9371 [hlqLV] size
9372 [%bcdefginopsux_DFOUX] format (mandatory)
9373*/
9374 if (EXPECT_NUMBER(q, width)) {
9375 if (*q == '$') {
9376 ++q;
9377 efix = width;
9378 } else {
9379 goto gotwidth;
9380 }
9381 }
9382
fc36a67e 9383 /* FLAGS */
9384
46fc3d4c 9385 while (*q) {
9386 switch (*q) {
9387 case ' ':
9388 case '+':
9389 plus = *q++;
9390 continue;
9391
9392 case '-':
9393 left = TRUE;
9394 q++;
9395 continue;
9396
9397 case '0':
9398 fill = *q++;
9399 continue;
9400
9401 case '#':
9402 alt = TRUE;
9403 q++;
9404 continue;
9405
fc36a67e 9406 default:
9407 break;
9408 }
9409 break;
9410 }
46fc3d4c 9411
211dfcf1 9412 tryasterisk:
eb3fce90 9413 if (*q == '*') {
211dfcf1
HS
9414 q++;
9415 if (EXPECT_NUMBER(q, ewix))
9416 if (*q++ != '$')
9417 goto unknown;
eb3fce90 9418 asterisk = TRUE;
211dfcf1
HS
9419 }
9420 if (*q == 'v') {
eb3fce90 9421 q++;
211dfcf1
HS
9422 if (vectorize)
9423 goto unknown;
9cbac4c7 9424 if ((vectorarg = asterisk)) {
211dfcf1
HS
9425 evix = ewix;
9426 ewix = 0;
9427 asterisk = FALSE;
9428 }
9429 vectorize = TRUE;
9430 goto tryasterisk;
eb3fce90
JH
9431 }
9432
211dfcf1 9433 if (!asterisk)
7a5fa8a2 9434 if( *q == '0' )
f3583277 9435 fill = *q++;
211dfcf1
HS
9436 EXPECT_NUMBER(q, width);
9437
9438 if (vectorize) {
9439 if (vectorarg) {
9440 if (args)
9441 vecsv = va_arg(*args, SV*);
9442 else
9443 vecsv = (evix ? evix <= svmax : svix < svmax) ?
3a7a539e 9444 svargs[evix ? evix-1 : svix++] : &PL_sv_undef;
4459522c 9445 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1 9446 if (DO_UTF8(vecsv))
2cf2cfc6 9447 is_utf8 = TRUE;
211dfcf1
HS
9448 }
9449 if (args) {
9450 vecsv = va_arg(*args, SV*);
9451 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 9452 vec_utf8 = DO_UTF8(vecsv);
eb3fce90 9453 }
211dfcf1
HS
9454 else if (efix ? efix <= svmax : svix < svmax) {
9455 vecsv = svargs[efix ? efix-1 : svix++];
9456 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 9457 vec_utf8 = DO_UTF8(vecsv);
d7aa5382
JP
9458 /* if this is a version object, we need to return the
9459 * stringified representation (which the SvPVX has
9460 * already done for us), but not vectorize the args
9461 */
9462 if ( *q == 'd' && sv_derived_from(vecsv,"version") )
9463 {
9464 q++; /* skip past the rest of the %vd format */
da6068d9 9465 eptr = (char *) vecstr;
d7aa5382
JP
9466 elen = strlen(eptr);
9467 vectorize=FALSE;
9468 goto string;
9469 }
211dfcf1
HS
9470 }
9471 else {
9472 vecstr = (U8*)"";
9473 veclen = 0;
9474 }
eb3fce90 9475 }
fc36a67e 9476
eb3fce90 9477 if (asterisk) {
fc36a67e 9478 if (args)
9479 i = va_arg(*args, int);
9480 else
eb3fce90
JH
9481 i = (ewix ? ewix <= svmax : svix < svmax) ?
9482 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 9483 left |= (i < 0);
9484 width = (i < 0) ? -i : i;
fc36a67e 9485 }
211dfcf1 9486 gotwidth:
fc36a67e 9487
9488 /* PRECISION */
46fc3d4c 9489
fc36a67e 9490 if (*q == '.') {
9491 q++;
9492 if (*q == '*') {
211dfcf1 9493 q++;
7b8dd722
HS
9494 if (EXPECT_NUMBER(q, epix) && *q++ != '$')
9495 goto unknown;
9496 /* XXX: todo, support specified precision parameter */
9497 if (epix)
211dfcf1 9498 goto unknown;
46fc3d4c 9499 if (args)
9500 i = va_arg(*args, int);
9501 else
eb3fce90
JH
9502 i = (ewix ? ewix <= svmax : svix < svmax)
9503 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 9504 precis = (i < 0) ? 0 : i;
fc36a67e 9505 }
9506 else {
9507 precis = 0;
9508 while (isDIGIT(*q))
9509 precis = precis * 10 + (*q++ - '0');
9510 }
9511 has_precis = TRUE;
9512 }
46fc3d4c 9513
fc36a67e 9514 /* SIZE */
46fc3d4c 9515
fc36a67e 9516 switch (*q) {
c623ac67
GS
9517#ifdef WIN32
9518 case 'I': /* Ix, I32x, and I64x */
9519# ifdef WIN64
9520 if (q[1] == '6' && q[2] == '4') {
9521 q += 3;
9522 intsize = 'q';
9523 break;
9524 }
9525# endif
9526 if (q[1] == '3' && q[2] == '2') {
9527 q += 3;
9528 break;
9529 }
9530# ifdef WIN64
9531 intsize = 'q';
9532# endif
9533 q++;
9534 break;
9535#endif
9e5b023a 9536#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 9537 case 'L': /* Ld */
e5c81feb 9538 /* FALL THROUGH */
e5c81feb 9539#ifdef HAS_QUAD
6f9bb7fd 9540 case 'q': /* qd */
9e5b023a 9541#endif
6f9bb7fd
GS
9542 intsize = 'q';
9543 q++;
9544 break;
9545#endif
fc36a67e 9546 case 'l':
9e5b023a 9547#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 9548 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 9549 intsize = 'q';
9550 q += 2;
46fc3d4c 9551 break;
cf2093f6 9552 }
fc36a67e 9553#endif
6f9bb7fd 9554 /* FALL THROUGH */
fc36a67e 9555 case 'h':
cf2093f6 9556 /* FALL THROUGH */
fc36a67e 9557 case 'V':
9558 intsize = *q++;
46fc3d4c 9559 break;
9560 }
9561
fc36a67e 9562 /* CONVERSION */
9563
211dfcf1
HS
9564 if (*q == '%') {
9565 eptr = q++;
9566 elen = 1;
9567 goto string;
9568 }
9569
be75b157
HS
9570 if (vectorize)
9571 argsv = vecsv;
9572 else if (!args)
211dfcf1
HS
9573 argsv = (efix ? efix <= svmax : svix < svmax) ?
9574 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
9575
46fc3d4c 9576 switch (c = *q++) {
9577
9578 /* STRINGS */
9579
46fc3d4c 9580 case 'c':
be75b157 9581 uv = (args && !vectorize) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
9582 if ((uv > 255 ||
9583 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 9584 && !IN_BYTES) {
dfe13c55 9585 eptr = (char*)utf8buf;
9041c2e3 9586 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 9587 is_utf8 = TRUE;
7e2040f0
GS
9588 }
9589 else {
9590 c = (char)uv;
9591 eptr = &c;
9592 elen = 1;
a0ed51b3 9593 }
46fc3d4c 9594 goto string;
9595
46fc3d4c 9596 case 's':
be75b157 9597 if (args && !vectorize) {
fc36a67e 9598 eptr = va_arg(*args, char*);
c635e13b 9599 if (eptr)
1d7c1841
GS
9600#ifdef MACOS_TRADITIONAL
9601 /* On MacOS, %#s format is used for Pascal strings */
9602 if (alt)
9603 elen = *eptr++;
9604 else
9605#endif
c635e13b 9606 elen = strlen(eptr);
9607 else {
27da23d5 9608 eptr = (char *)nullstr;
c635e13b 9609 elen = sizeof nullstr - 1;
9610 }
46fc3d4c 9611 }
211dfcf1 9612 else {
7e2040f0
GS
9613 eptr = SvPVx(argsv, elen);
9614 if (DO_UTF8(argsv)) {
a0ed51b3
LW
9615 if (has_precis && precis < elen) {
9616 I32 p = precis;
7e2040f0 9617 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
9618 precis = p;
9619 }
9620 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 9621 width += elen - sv_len_utf8(argsv);
a0ed51b3 9622 }
2cf2cfc6 9623 is_utf8 = TRUE;
a0ed51b3
LW
9624 }
9625 }
fc36a67e 9626
46fc3d4c 9627 string:
b22c7a20 9628 vectorize = FALSE;
46fc3d4c 9629 if (has_precis && elen > precis)
9630 elen = precis;
9631 break;
9632
9633 /* INTEGERS */
9634
fc36a67e 9635 case 'p':
0dbb1585 9636 if (left && args) { /* SVf */
5df617be 9637 left = FALSE;
0dbb1585
AL
9638 if (width) {
9639 precis = width;
9640 has_precis = TRUE;
9641 width = 0;
9642 }
9643 if (vectorize)
9644 goto unknown;
9645 argsv = va_arg(*args, SV*);
9646 eptr = SvPVx(argsv, elen);
9647 if (DO_UTF8(argsv))
9648 is_utf8 = TRUE;
9649 goto string;
5df617be 9650 }
be75b157 9651 if (alt || vectorize)
c2e66d9e 9652 goto unknown;
211dfcf1 9653 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 9654 base = 16;
9655 goto integer;
9656
46fc3d4c 9657 case 'D':
29fe7a80 9658#ifdef IV_IS_QUAD
22f3ae8c 9659 intsize = 'q';
29fe7a80 9660#else
46fc3d4c 9661 intsize = 'l';
29fe7a80 9662#endif
46fc3d4c 9663 /* FALL THROUGH */
9664 case 'd':
9665 case 'i':
b22c7a20 9666 if (vectorize) {
ba210ebe 9667 STRLEN ulen;
211dfcf1
HS
9668 if (!veclen)
9669 continue;
2cf2cfc6
A
9670 if (vec_utf8)
9671 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9672 UTF8_ALLOW_ANYUV);
b22c7a20 9673 else {
e83d50c9 9674 uv = *vecstr;
b22c7a20
GS
9675 ulen = 1;
9676 }
9677 vecstr += ulen;
9678 veclen -= ulen;
e83d50c9
JP
9679 if (plus)
9680 esignbuf[esignlen++] = plus;
b22c7a20
GS
9681 }
9682 else if (args) {
46fc3d4c 9683 switch (intsize) {
9684 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 9685 case 'l': iv = va_arg(*args, long); break;
fc36a67e 9686 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 9687 default: iv = va_arg(*args, int); break;
cf2093f6
JH
9688#ifdef HAS_QUAD
9689 case 'q': iv = va_arg(*args, Quad_t); break;
9690#endif
46fc3d4c 9691 }
9692 }
9693 else {
b10c0dba 9694 IV tiv = SvIVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 9695 switch (intsize) {
b10c0dba
MHM
9696 case 'h': iv = (short)tiv; break;
9697 case 'l': iv = (long)tiv; break;
9698 case 'V':
9699 default: iv = tiv; break;
cf2093f6 9700#ifdef HAS_QUAD
b10c0dba 9701 case 'q': iv = (Quad_t)tiv; break;
cf2093f6 9702#endif
46fc3d4c 9703 }
9704 }
e83d50c9
JP
9705 if ( !vectorize ) /* we already set uv above */
9706 {
9707 if (iv >= 0) {
9708 uv = iv;
9709 if (plus)
9710 esignbuf[esignlen++] = plus;
9711 }
9712 else {
9713 uv = -iv;
9714 esignbuf[esignlen++] = '-';
9715 }
46fc3d4c 9716 }
9717 base = 10;
9718 goto integer;
9719
fc36a67e 9720 case 'U':
29fe7a80 9721#ifdef IV_IS_QUAD
22f3ae8c 9722 intsize = 'q';
29fe7a80 9723#else
fc36a67e 9724 intsize = 'l';
29fe7a80 9725#endif
fc36a67e 9726 /* FALL THROUGH */
9727 case 'u':
9728 base = 10;
9729 goto uns_integer;
9730
4f19785b
WSI
9731 case 'b':
9732 base = 2;
9733 goto uns_integer;
9734
46fc3d4c 9735 case 'O':
29fe7a80 9736#ifdef IV_IS_QUAD
22f3ae8c 9737 intsize = 'q';
29fe7a80 9738#else
46fc3d4c 9739 intsize = 'l';
29fe7a80 9740#endif
46fc3d4c 9741 /* FALL THROUGH */
9742 case 'o':
9743 base = 8;
9744 goto uns_integer;
9745
9746 case 'X':
46fc3d4c 9747 case 'x':
9748 base = 16;
46fc3d4c 9749
9750 uns_integer:
b22c7a20 9751 if (vectorize) {
ba210ebe 9752 STRLEN ulen;
b22c7a20 9753 vector:
211dfcf1
HS
9754 if (!veclen)
9755 continue;
2cf2cfc6
A
9756 if (vec_utf8)
9757 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9758 UTF8_ALLOW_ANYUV);
b22c7a20 9759 else {
a05b299f 9760 uv = *vecstr;
b22c7a20
GS
9761 ulen = 1;
9762 }
9763 vecstr += ulen;
9764 veclen -= ulen;
9765 }
9766 else if (args) {
46fc3d4c 9767 switch (intsize) {
9768 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 9769 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 9770 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 9771 default: uv = va_arg(*args, unsigned); break;
cf2093f6 9772#ifdef HAS_QUAD
9e3321a5 9773 case 'q': uv = va_arg(*args, Uquad_t); break;
cf2093f6 9774#endif
46fc3d4c 9775 }
9776 }
9777 else {
b10c0dba 9778 UV tuv = SvUVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 9779 switch (intsize) {
b10c0dba
MHM
9780 case 'h': uv = (unsigned short)tuv; break;
9781 case 'l': uv = (unsigned long)tuv; break;
9782 case 'V':
9783 default: uv = tuv; break;
cf2093f6 9784#ifdef HAS_QUAD
b10c0dba 9785 case 'q': uv = (Uquad_t)tuv; break;
cf2093f6 9786#endif
46fc3d4c 9787 }
9788 }
9789
9790 integer:
46fc3d4c 9791 eptr = ebuf + sizeof ebuf;
fc36a67e 9792 switch (base) {
9793 unsigned dig;
9794 case 16:
c10ed8b9
HS
9795 if (!uv)
9796 alt = FALSE;
1d7c1841
GS
9797 p = (char*)((c == 'X')
9798 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 9799 do {
9800 dig = uv & 15;
9801 *--eptr = p[dig];
9802 } while (uv >>= 4);
9803 if (alt) {
46fc3d4c 9804 esignbuf[esignlen++] = '0';
fc36a67e 9805 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 9806 }
fc36a67e 9807 break;
9808 case 8:
9809 do {
9810 dig = uv & 7;
9811 *--eptr = '0' + dig;
9812 } while (uv >>= 3);
9813 if (alt && *eptr != '0')
9814 *--eptr = '0';
9815 break;
4f19785b
WSI
9816 case 2:
9817 do {
9818 dig = uv & 1;
9819 *--eptr = '0' + dig;
9820 } while (uv >>= 1);
eda88b6d
JH
9821 if (alt) {
9822 esignbuf[esignlen++] = '0';
7481bb52 9823 esignbuf[esignlen++] = 'b';
eda88b6d 9824 }
4f19785b 9825 break;
fc36a67e 9826 default: /* it had better be ten or less */
9827 do {
9828 dig = uv % base;
9829 *--eptr = '0' + dig;
9830 } while (uv /= base);
9831 break;
46fc3d4c 9832 }
9833 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
9834 if (has_precis) {
9835 if (precis > elen)
9836 zeros = precis - elen;
9837 else if (precis == 0 && elen == 1 && *eptr == '0')
9838 elen = 0;
9839 }
46fc3d4c 9840 break;
9841
9842 /* FLOATING POINT */
9843
fc36a67e 9844 case 'F':
9845 c = 'f'; /* maybe %F isn't supported here */
9846 /* FALL THROUGH */
46fc3d4c 9847 case 'e': case 'E':
fc36a67e 9848 case 'f':
46fc3d4c 9849 case 'g': case 'G':
9850
9851 /* This is evil, but floating point is even more evil */
9852
9e5b023a
JH
9853 /* for SV-style calling, we can only get NV
9854 for C-style calling, we assume %f is double;
9855 for simplicity we allow any of %Lf, %llf, %qf for long double
9856 */
9857 switch (intsize) {
9858 case 'V':
9859#if defined(USE_LONG_DOUBLE)
9860 intsize = 'q';
9861#endif
9862 break;
8a2e3f14 9863/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364
HS
9864 case 'l':
9865 /* FALL THROUGH */
9e5b023a
JH
9866 default:
9867#if defined(USE_LONG_DOUBLE)
9868 intsize = args ? 0 : 'q';
9869#endif
9870 break;
9871 case 'q':
9872#if defined(HAS_LONG_DOUBLE)
9873 break;
9874#else
9875 /* FALL THROUGH */
9876#endif
9877 case 'h':
9e5b023a
JH
9878 goto unknown;
9879 }
9880
9881 /* now we need (long double) if intsize == 'q', else (double) */
be75b157 9882 nv = (args && !vectorize) ?
35fff930
JH
9883#if LONG_DOUBLESIZE > DOUBLESIZE
9884 intsize == 'q' ?
205f51d8
AS
9885 va_arg(*args, long double) :
9886 va_arg(*args, double)
35fff930 9887#else
205f51d8 9888 va_arg(*args, double)
35fff930 9889#endif
9e5b023a 9890 : SvNVx(argsv);
fc36a67e 9891
9892 need = 0;
be75b157 9893 vectorize = FALSE;
fc36a67e 9894 if (c != 'e' && c != 'E') {
9895 i = PERL_INT_MIN;
9e5b023a
JH
9896 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9897 will cast our (long double) to (double) */
73b309ea 9898 (void)Perl_frexp(nv, &i);
fc36a67e 9899 if (i == PERL_INT_MIN)
cea2e8a9 9900 Perl_die(aTHX_ "panic: frexp");
c635e13b 9901 if (i > 0)
fc36a67e 9902 need = BIT_DIGITS(i);
9903 }
9904 need += has_precis ? precis : 6; /* known default */
20f6aaab 9905
fc36a67e 9906 if (need < width)
9907 need = width;
9908
20f6aaab
AS
9909#ifdef HAS_LDBL_SPRINTF_BUG
9910 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9911 with sfio - Allen <allens@cpan.org> */
9912
9913# ifdef DBL_MAX
9914# define MY_DBL_MAX DBL_MAX
9915# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9916# if DOUBLESIZE >= 8
9917# define MY_DBL_MAX 1.7976931348623157E+308L
9918# else
9919# define MY_DBL_MAX 3.40282347E+38L
9920# endif
9921# endif
9922
9923# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9924# define MY_DBL_MAX_BUG 1L
20f6aaab 9925# else
205f51d8 9926# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9927# endif
20f6aaab 9928
205f51d8
AS
9929# ifdef DBL_MIN
9930# define MY_DBL_MIN DBL_MIN
9931# else /* XXX guessing! -Allen */
9932# if DOUBLESIZE >= 8
9933# define MY_DBL_MIN 2.2250738585072014E-308L
9934# else
9935# define MY_DBL_MIN 1.17549435E-38L
9936# endif
9937# endif
20f6aaab 9938
205f51d8
AS
9939 if ((intsize == 'q') && (c == 'f') &&
9940 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9941 (need < DBL_DIG)) {
9942 /* it's going to be short enough that
9943 * long double precision is not needed */
9944
9945 if ((nv <= 0L) && (nv >= -0L))
9946 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9947 else {
9948 /* would use Perl_fp_class as a double-check but not
9949 * functional on IRIX - see perl.h comments */
9950
9951 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9952 /* It's within the range that a double can represent */
9953#if defined(DBL_MAX) && !defined(DBL_MIN)
9954 if ((nv >= ((long double)1/DBL_MAX)) ||
9955 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9956#endif
205f51d8 9957 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9958 }
205f51d8
AS
9959 }
9960 if (fix_ldbl_sprintf_bug == TRUE) {
9961 double temp;
9962
9963 intsize = 0;
9964 temp = (double)nv;
9965 nv = (NV)temp;
9966 }
20f6aaab 9967 }
205f51d8
AS
9968
9969# undef MY_DBL_MAX
9970# undef MY_DBL_MAX_BUG
9971# undef MY_DBL_MIN
9972
20f6aaab
AS
9973#endif /* HAS_LDBL_SPRINTF_BUG */
9974
46fc3d4c 9975 need += 20; /* fudge factor */
80252599
GS
9976 if (PL_efloatsize < need) {
9977 Safefree(PL_efloatbuf);
9978 PL_efloatsize = need + 20; /* more fudge */
9979 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9980 PL_efloatbuf[0] = '\0';
46fc3d4c 9981 }
9982
4151a5fe
IZ
9983 if ( !(width || left || plus || alt) && fill != '0'
9984 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
9985 /* See earlier comment about buggy Gconvert when digits,
9986 aka precis is 0 */
9987 if ( c == 'g' && precis) {
2e59c212 9988 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4151a5fe
IZ
9989 if (*PL_efloatbuf) /* May return an empty string for digits==0 */
9990 goto float_converted;
9991 } else if ( c == 'f' && !precis) {
9992 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9993 break;
9994 }
9995 }
46fc3d4c 9996 eptr = ebuf + sizeof ebuf;
9997 *--eptr = '\0';
9998 *--eptr = c;
9e5b023a
JH
9999 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
10000#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
10001 if (intsize == 'q') {
e5c81feb
JH
10002 /* Copy the one or more characters in a long double
10003 * format before the 'base' ([efgEFG]) character to
10004 * the format string. */
10005 static char const prifldbl[] = PERL_PRIfldbl;
10006 char const *p = prifldbl + sizeof(prifldbl) - 3;
10007 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 10008 }
65202027 10009#endif
46fc3d4c 10010 if (has_precis) {
10011 base = precis;
10012 do { *--eptr = '0' + (base % 10); } while (base /= 10);
10013 *--eptr = '.';
10014 }
10015 if (width) {
10016 base = width;
10017 do { *--eptr = '0' + (base % 10); } while (base /= 10);
10018 }
10019 if (fill == '0')
10020 *--eptr = fill;
84902520
TB
10021 if (left)
10022 *--eptr = '-';
46fc3d4c 10023 if (plus)
10024 *--eptr = plus;
10025 if (alt)
10026 *--eptr = '#';
10027 *--eptr = '%';
10028
ff9121f8
JH
10029 /* No taint. Otherwise we are in the strange situation
10030 * where printf() taints but print($float) doesn't.
bda0f7a5 10031 * --jhi */
9e5b023a
JH
10032#if defined(HAS_LONG_DOUBLE)
10033 if (intsize == 'q')
10034 (void)sprintf(PL_efloatbuf, eptr, nv);
10035 else
10036 (void)sprintf(PL_efloatbuf, eptr, (double)nv);
10037#else
dd8482fc 10038 (void)sprintf(PL_efloatbuf, eptr, nv);
9e5b023a 10039#endif
4151a5fe 10040 float_converted:
80252599
GS
10041 eptr = PL_efloatbuf;
10042 elen = strlen(PL_efloatbuf);
46fc3d4c 10043 break;
10044
fc36a67e 10045 /* SPECIAL */
10046
10047 case 'n':
10048 i = SvCUR(sv) - origlen;
be75b157 10049 if (args && !vectorize) {
c635e13b 10050 switch (intsize) {
10051 case 'h': *(va_arg(*args, short*)) = i; break;
10052 default: *(va_arg(*args, int*)) = i; break;
10053 case 'l': *(va_arg(*args, long*)) = i; break;
10054 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
10055#ifdef HAS_QUAD
10056 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
10057#endif
c635e13b 10058 }
fc36a67e 10059 }
9dd79c3f 10060 else
211dfcf1 10061 sv_setuv_mg(argsv, (UV)i);
be75b157 10062 vectorize = FALSE;
fc36a67e 10063 continue; /* not "break" */
10064
10065 /* UNKNOWN */
10066
46fc3d4c 10067 default:
fc36a67e 10068 unknown:
599cee73 10069 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 10070 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 10071 SV *msg = sv_newmortal();
35c1215d
NC
10072 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
10073 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 10074 if (c) {
0f4b6630 10075 if (isPRINT(c))
1c846c1f 10076 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
10077 "\"%%%c\"", c & 0xFF);
10078 else
10079 Perl_sv_catpvf(aTHX_ msg,
57def98f 10080 "\"%%\\%03"UVof"\"",
0f4b6630 10081 (UV)c & 0xFF);
0f4b6630 10082 } else
c635e13b 10083 sv_catpv(msg, "end of string");
9014280d 10084 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 10085 }
fb73857a 10086
10087 /* output mangled stuff ... */
10088 if (c == '\0')
10089 --q;
46fc3d4c 10090 eptr = p;
10091 elen = q - p;
fb73857a 10092
10093 /* ... right here, because formatting flags should not apply */
10094 SvGROW(sv, SvCUR(sv) + elen + 1);
10095 p = SvEND(sv);
4459522c 10096 Copy(eptr, p, elen, char);
fb73857a 10097 p += elen;
10098 *p = '\0';
b162af07 10099 SvCUR_set(sv, p - SvPVX(sv));
58e33a90 10100 svix = osvix;
fb73857a 10101 continue; /* not "break" */
46fc3d4c 10102 }
10103
6c94ec8b
HS
10104 /* calculate width before utf8_upgrade changes it */
10105 have = esignlen + zeros + elen;
10106
d2876be5
JH
10107 if (is_utf8 != has_utf8) {
10108 if (is_utf8) {
10109 if (SvCUR(sv))
10110 sv_utf8_upgrade(sv);
10111 }
10112 else {
10113 SV *nsv = sv_2mortal(newSVpvn(eptr, elen));
10114 sv_utf8_upgrade(nsv);
10115 eptr = SvPVX(nsv);
10116 elen = SvCUR(nsv);
10117 }
10118 SvGROW(sv, SvCUR(sv) + elen + 1);
10119 p = SvEND(sv);
10120 *p = '\0';
10121 }
6af65485 10122
46fc3d4c 10123 need = (have > width ? have : width);
10124 gap = need - have;
10125
b22c7a20 10126 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 10127 p = SvEND(sv);
10128 if (esignlen && fill == '0') {
eb160463 10129 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10130 *p++ = esignbuf[i];
10131 }
10132 if (gap && !left) {
10133 memset(p, fill, gap);
10134 p += gap;
10135 }
10136 if (esignlen && fill != '0') {
eb160463 10137 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10138 *p++ = esignbuf[i];
10139 }
fc36a67e 10140 if (zeros) {
10141 for (i = zeros; i; i--)
10142 *p++ = '0';
10143 }
46fc3d4c 10144 if (elen) {
4459522c 10145 Copy(eptr, p, elen, char);
46fc3d4c 10146 p += elen;
10147 }
10148 if (gap && left) {
10149 memset(p, ' ', gap);
10150 p += gap;
10151 }
b22c7a20
GS
10152 if (vectorize) {
10153 if (veclen) {
4459522c 10154 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
10155 p += dotstrlen;
10156 }
10157 else
10158 vectorize = FALSE; /* done iterating over vecstr */
10159 }
2cf2cfc6
A
10160 if (is_utf8)
10161 has_utf8 = TRUE;
10162 if (has_utf8)
7e2040f0 10163 SvUTF8_on(sv);
46fc3d4c 10164 *p = '\0';
b162af07 10165 SvCUR_set(sv, p - SvPVX(sv));
b22c7a20
GS
10166 if (vectorize) {
10167 esignlen = 0;
10168 goto vector;
10169 }
46fc3d4c 10170 }
10171}
51371543 10172
645c22ef
DM
10173/* =========================================================================
10174
10175=head1 Cloning an interpreter
10176
10177All the macros and functions in this section are for the private use of
10178the main function, perl_clone().
10179
10180The foo_dup() functions make an exact copy of an existing foo thinngy.
10181During the course of a cloning, a hash table is used to map old addresses
10182to new addresses. The table is created and manipulated with the
10183ptr_table_* functions.
10184
10185=cut
10186
10187============================================================================*/
10188
10189
1d7c1841
GS
10190#if defined(USE_ITHREADS)
10191
1d7c1841
GS
10192#ifndef GpREFCNT_inc
10193# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
10194#endif
10195
10196
d2d73c3e
AB
10197#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
10198#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
10199#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10200#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
10201#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10202#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
10203#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10204#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
10205#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
10206#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
10207#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
10208#define SAVEPV(p) (p ? savepv(p) : Nullch)
10209#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 10210
d2d73c3e 10211
d2f185dc
AMS
10212/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
10213 regcomp.c. AMS 20010712 */
645c22ef 10214
1d7c1841 10215REGEXP *
a8fc9800 10216Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
1d7c1841 10217{
27da23d5 10218 dVAR;
d2f185dc
AMS
10219 REGEXP *ret;
10220 int i, len, npar;
10221 struct reg_substr_datum *s;
10222
10223 if (!r)
10224 return (REGEXP *)NULL;
10225
10226 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
10227 return ret;
10228
10229 len = r->offsets[0];
10230 npar = r->nparens+1;
10231
10232 Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
10233 Copy(r->program, ret->program, len+1, regnode);
10234
10235 New(0, ret->startp, npar, I32);
10236 Copy(r->startp, ret->startp, npar, I32);
10237 New(0, ret->endp, npar, I32);
10238 Copy(r->startp, ret->startp, npar, I32);
10239
d2f185dc
AMS
10240 New(0, ret->substrs, 1, struct reg_substr_data);
10241 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
10242 s->min_offset = r->substrs->data[i].min_offset;
10243 s->max_offset = r->substrs->data[i].max_offset;
10244 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 10245 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
10246 }
10247
70612e96 10248 ret->regstclass = NULL;
d2f185dc
AMS
10249 if (r->data) {
10250 struct reg_data *d;
e1ec3a88 10251 const int count = r->data->count;
d2f185dc
AMS
10252
10253 Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
10254 char, struct reg_data);
10255 New(0, d->what, count, U8);
10256
10257 d->count = count;
10258 for (i = 0; i < count; i++) {
10259 d->what[i] = r->data->what[i];
10260 switch (d->what[i]) {
a3621e74
YO
10261 /* legal options are one of: sfpont
10262 see also regcomp.h and pregfree() */
d2f185dc
AMS
10263 case 's':
10264 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
10265 break;
10266 case 'p':
10267 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
10268 break;
10269 case 'f':
10270 /* This is cheating. */
10271 New(0, d->data[i], 1, struct regnode_charclass_class);
10272 StructCopy(r->data->data[i], d->data[i],
10273 struct regnode_charclass_class);
70612e96 10274 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
10275 break;
10276 case 'o':
33773810
AMS
10277 /* Compiled op trees are readonly, and can thus be
10278 shared without duplication. */
b34c0dd4 10279 OP_REFCNT_LOCK;
9b978d73 10280 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
b34c0dd4 10281 OP_REFCNT_UNLOCK;
9b978d73 10282 break;
d2f185dc
AMS
10283 case 'n':
10284 d->data[i] = r->data->data[i];
10285 break;
a3621e74
YO
10286 case 't':
10287 d->data[i] = r->data->data[i];
10288 OP_REFCNT_LOCK;
10289 ((reg_trie_data*)d->data[i])->refcount++;
10290 OP_REFCNT_UNLOCK;
10291 break;
10292 default:
10293 Perl_croak(aTHX_ "panic: re_dup unknown data code '%c'", r->data->what[i]);
d2f185dc
AMS
10294 }
10295 }
10296
10297 ret->data = d;
10298 }
10299 else
10300 ret->data = NULL;
10301
10302 New(0, ret->offsets, 2*len+1, U32);
10303 Copy(r->offsets, ret->offsets, 2*len+1, U32);
10304
e01c5899 10305 ret->precomp = SAVEPVN(r->precomp, r->prelen);
d2f185dc
AMS
10306 ret->refcnt = r->refcnt;
10307 ret->minlen = r->minlen;
10308 ret->prelen = r->prelen;
10309 ret->nparens = r->nparens;
10310 ret->lastparen = r->lastparen;
10311 ret->lastcloseparen = r->lastcloseparen;
10312 ret->reganch = r->reganch;
10313
70612e96
RG
10314 ret->sublen = r->sublen;
10315
10316 if (RX_MATCH_COPIED(ret))
e01c5899 10317 ret->subbeg = SAVEPVN(r->subbeg, r->sublen);
70612e96
RG
10318 else
10319 ret->subbeg = Nullch;
9a26048b
NC
10320#ifdef PERL_COPY_ON_WRITE
10321 ret->saved_copy = Nullsv;
10322#endif
70612e96 10323
d2f185dc
AMS
10324 ptr_table_store(PL_ptr_table, r, ret);
10325 return ret;
1d7c1841
GS
10326}
10327
d2d73c3e 10328/* duplicate a file handle */
645c22ef 10329
1d7c1841 10330PerlIO *
a8fc9800 10331Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
10332{
10333 PerlIO *ret;
73d840c0
AL
10334 (void)type;
10335
1d7c1841
GS
10336 if (!fp)
10337 return (PerlIO*)NULL;
10338
10339 /* look for it in the table first */
10340 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
10341 if (ret)
10342 return ret;
10343
10344 /* create anew and remember what it is */
ecdeb87c 10345 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
10346 ptr_table_store(PL_ptr_table, fp, ret);
10347 return ret;
10348}
10349
645c22ef
DM
10350/* duplicate a directory handle */
10351
1d7c1841
GS
10352DIR *
10353Perl_dirp_dup(pTHX_ DIR *dp)
10354{
10355 if (!dp)
10356 return (DIR*)NULL;
10357 /* XXX TODO */
10358 return dp;
10359}
10360
ff276b08 10361/* duplicate a typeglob */
645c22ef 10362
1d7c1841 10363GP *
a8fc9800 10364Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
10365{
10366 GP *ret;
10367 if (!gp)
10368 return (GP*)NULL;
10369 /* look for it in the table first */
10370 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
10371 if (ret)
10372 return ret;
10373
10374 /* create anew and remember what it is */
10375 Newz(0, ret, 1, GP);
10376 ptr_table_store(PL_ptr_table, gp, ret);
10377
10378 /* clone */
10379 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
10380 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
10381 ret->gp_io = io_dup_inc(gp->gp_io, param);
10382 ret->gp_form = cv_dup_inc(gp->gp_form, param);
10383 ret->gp_av = av_dup_inc(gp->gp_av, param);
10384 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
10385 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
10386 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
10387 ret->gp_cvgen = gp->gp_cvgen;
10388 ret->gp_flags = gp->gp_flags;
10389 ret->gp_line = gp->gp_line;
10390 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
10391 return ret;
10392}
10393
645c22ef
DM
10394/* duplicate a chain of magic */
10395
1d7c1841 10396MAGIC *
a8fc9800 10397Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 10398{
cb359b41
JH
10399 MAGIC *mgprev = (MAGIC*)NULL;
10400 MAGIC *mgret;
1d7c1841
GS
10401 if (!mg)
10402 return (MAGIC*)NULL;
10403 /* look for it in the table first */
10404 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
10405 if (mgret)
10406 return mgret;
10407
10408 for (; mg; mg = mg->mg_moremagic) {
10409 MAGIC *nmg;
10410 Newz(0, nmg, 1, MAGIC);
cb359b41 10411 if (mgprev)
1d7c1841 10412 mgprev->mg_moremagic = nmg;
cb359b41
JH
10413 else
10414 mgret = nmg;
1d7c1841
GS
10415 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
10416 nmg->mg_private = mg->mg_private;
10417 nmg->mg_type = mg->mg_type;
10418 nmg->mg_flags = mg->mg_flags;
14befaf4 10419 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 10420 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 10421 }
05bd4103 10422 else if(mg->mg_type == PERL_MAGIC_backref) {
7fc63493 10423 const AV * const av = (AV*) mg->mg_obj;
fdc9a813
AE
10424 SV **svp;
10425 I32 i;
7fc63493 10426 (void)SvREFCNT_inc(nmg->mg_obj = (SV*)newAV());
fdc9a813
AE
10427 svp = AvARRAY(av);
10428 for (i = AvFILLp(av); i >= 0; i--) {
3a81978b 10429 if (!svp[i]) continue;
fdc9a813
AE
10430 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
10431 }
05bd4103 10432 }
1d7c1841
GS
10433 else {
10434 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
10435 ? sv_dup_inc(mg->mg_obj, param)
10436 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
10437 }
10438 nmg->mg_len = mg->mg_len;
10439 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 10440 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 10441 if (mg->mg_len > 0) {
1d7c1841 10442 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
10443 if (mg->mg_type == PERL_MAGIC_overload_table &&
10444 AMT_AMAGIC((AMT*)mg->mg_ptr))
10445 {
1d7c1841
GS
10446 AMT *amtp = (AMT*)mg->mg_ptr;
10447 AMT *namtp = (AMT*)nmg->mg_ptr;
10448 I32 i;
10449 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 10450 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
10451 }
10452 }
10453 }
10454 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 10455 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 10456 }
68795e93
NIS
10457 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
10458 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
10459 }
1d7c1841
GS
10460 mgprev = nmg;
10461 }
10462 return mgret;
10463}
10464
645c22ef
DM
10465/* create a new pointer-mapping table */
10466
1d7c1841
GS
10467PTR_TBL_t *
10468Perl_ptr_table_new(pTHX)
10469{
10470 PTR_TBL_t *tbl;
10471 Newz(0, tbl, 1, PTR_TBL_t);
10472 tbl->tbl_max = 511;
10473 tbl->tbl_items = 0;
10474 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
10475 return tbl;
10476}
10477
134ca3d6
DM
10478#if (PTRSIZE == 8)
10479# define PTR_TABLE_HASH(ptr) (PTR2UV(ptr) >> 3)
10480#else
10481# define PTR_TABLE_HASH(ptr) (PTR2UV(ptr) >> 2)
10482#endif
10483
32e691d0
NC
10484
10485
10486STATIC void
10487S_more_pte(pTHX)
10488{
cac9b346
NC
10489 struct ptr_tbl_ent* pte;
10490 struct ptr_tbl_ent* pteend;
c3929b72
NC
10491 New(0, pte, PERL_ARENA_SIZE/sizeof(struct ptr_tbl_ent), struct ptr_tbl_ent);
10492 pte->next = PL_pte_arenaroot;
10493 PL_pte_arenaroot = pte;
32e691d0 10494
9c17f24a 10495 pteend = &pte[PERL_ARENA_SIZE / sizeof(struct ptr_tbl_ent) - 1];
32e691d0
NC
10496 PL_pte_root = ++pte;
10497 while (pte < pteend) {
10498 pte->next = pte + 1;
10499 pte++;
10500 }
10501 pte->next = 0;
10502}
10503
10504STATIC struct ptr_tbl_ent*
10505S_new_pte(pTHX)
10506{
10507 struct ptr_tbl_ent* pte;
10508 if (!PL_pte_root)
10509 S_more_pte(aTHX);
10510 pte = PL_pte_root;
10511 PL_pte_root = pte->next;
10512 return pte;
10513}
10514
10515STATIC void
10516S_del_pte(pTHX_ struct ptr_tbl_ent*p)
10517{
10518 p->next = PL_pte_root;
10519 PL_pte_root = p;
10520}
10521
645c22ef
DM
10522/* map an existing pointer using a table */
10523
1d7c1841
GS
10524void *
10525Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
10526{
10527 PTR_TBL_ENT_t *tblent;
4373e329 10528 const UV hash = PTR_TABLE_HASH(sv);
1d7c1841
GS
10529 assert(tbl);
10530 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
10531 for (; tblent; tblent = tblent->next) {
10532 if (tblent->oldval == sv)
10533 return tblent->newval;
10534 }
10535 return (void*)NULL;
10536}
10537
645c22ef
DM
10538/* add a new entry to a pointer-mapping table */
10539
1d7c1841
GS
10540void
10541Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
10542{
10543 PTR_TBL_ENT_t *tblent, **otblent;
10544 /* XXX this may be pessimal on platforms where pointers aren't good
10545 * hash values e.g. if they grow faster in the most significant
10546 * bits */
4373e329 10547 const UV hash = PTR_TABLE_HASH(oldv);
14cade97 10548 bool empty = 1;
1d7c1841
GS
10549
10550 assert(tbl);
10551 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
14cade97 10552 for (tblent = *otblent; tblent; empty=0, tblent = tblent->next) {
1d7c1841
GS
10553 if (tblent->oldval == oldv) {
10554 tblent->newval = newv;
1d7c1841
GS
10555 return;
10556 }
10557 }
32e691d0 10558 tblent = S_new_pte(aTHX);
1d7c1841
GS
10559 tblent->oldval = oldv;
10560 tblent->newval = newv;
10561 tblent->next = *otblent;
10562 *otblent = tblent;
10563 tbl->tbl_items++;
14cade97 10564 if (!empty && tbl->tbl_items > tbl->tbl_max)
1d7c1841
GS
10565 ptr_table_split(tbl);
10566}
10567
645c22ef
DM
10568/* double the hash bucket size of an existing ptr table */
10569
1d7c1841
GS
10570void
10571Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
10572{
10573 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
4373e329 10574 const UV oldsize = tbl->tbl_max + 1;
1d7c1841
GS
10575 UV newsize = oldsize * 2;
10576 UV i;
10577
10578 Renew(ary, newsize, PTR_TBL_ENT_t*);
10579 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
10580 tbl->tbl_max = --newsize;
10581 tbl->tbl_ary = ary;
10582 for (i=0; i < oldsize; i++, ary++) {
10583 PTR_TBL_ENT_t **curentp, **entp, *ent;
10584 if (!*ary)
10585 continue;
10586 curentp = ary + oldsize;
10587 for (entp = ary, ent = *ary; ent; ent = *entp) {
134ca3d6 10588 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
10589 *entp = ent->next;
10590 ent->next = *curentp;
10591 *curentp = ent;
10592 continue;
10593 }
10594 else
10595 entp = &ent->next;
10596 }
10597 }
10598}
10599
645c22ef
DM
10600/* remove all the entries from a ptr table */
10601
a0739874
DM
10602void
10603Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
10604{
10605 register PTR_TBL_ENT_t **array;
10606 register PTR_TBL_ENT_t *entry;
a0739874
DM
10607 UV riter = 0;
10608 UV max;
10609
10610 if (!tbl || !tbl->tbl_items) {
10611 return;
10612 }
10613
10614 array = tbl->tbl_ary;
10615 entry = array[0];
10616 max = tbl->tbl_max;
10617
10618 for (;;) {
10619 if (entry) {
4373e329 10620 PTR_TBL_ENT_t *oentry = entry;
a0739874 10621 entry = entry->next;
32e691d0 10622 S_del_pte(aTHX_ oentry);
a0739874
DM
10623 }
10624 if (!entry) {
10625 if (++riter > max) {
10626 break;
10627 }
10628 entry = array[riter];
10629 }
10630 }
10631
10632 tbl->tbl_items = 0;
10633}
10634
645c22ef
DM
10635/* clear and free a ptr table */
10636
a0739874
DM
10637void
10638Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
10639{
10640 if (!tbl) {
10641 return;
10642 }
10643 ptr_table_clear(tbl);
10644 Safefree(tbl->tbl_ary);
10645 Safefree(tbl);
10646}
10647
645c22ef
DM
10648/* attempt to make everything in the typeglob readonly */
10649
5bd07a3d 10650STATIC SV *
59b40662 10651S_gv_share(pTHX_ SV *sstr, CLONE_PARAMS *param)
5bd07a3d
DM
10652{
10653 GV *gv = (GV*)sstr;
59b40662 10654 SV *sv = &param->proto_perl->Isv_no; /* just need SvREADONLY-ness */
5bd07a3d
DM
10655
10656 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 10657 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
10658 }
10659 else if (!GvCV(gv)) {
10660 GvCV(gv) = (CV*)sv;
10661 }
10662 else {
10663 /* CvPADLISTs cannot be shared */
37e20706 10664 if (!SvREADONLY(GvCV(gv)) && !CvXSUB(GvCV(gv))) {
7fb37951 10665 GvUNIQUE_off(gv);
5bd07a3d
DM
10666 }
10667 }
10668
7fb37951 10669 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
10670#if 0
10671 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
10672 HvNAME(GvSTASH(gv)), GvNAME(gv));
10673#endif
10674 return Nullsv;
10675 }
10676
4411f3b6 10677 /*
5bd07a3d
DM
10678 * write attempts will die with
10679 * "Modification of a read-only value attempted"
10680 */
10681 if (!GvSV(gv)) {
10682 GvSV(gv) = sv;
10683 }
10684 else {
10685 SvREADONLY_on(GvSV(gv));
10686 }
10687
10688 if (!GvAV(gv)) {
10689 GvAV(gv) = (AV*)sv;
10690 }
10691 else {
10692 SvREADONLY_on(GvAV(gv));
10693 }
10694
10695 if (!GvHV(gv)) {
10696 GvHV(gv) = (HV*)sv;
10697 }
10698 else {
53c33732 10699 SvREADONLY_on(GvHV(gv));
5bd07a3d
DM
10700 }
10701
10702 return sstr; /* he_dup() will SvREFCNT_inc() */
10703}
10704
645c22ef
DM
10705/* duplicate an SV of any type (including AV, HV etc) */
10706
83841fad
NIS
10707void
10708Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
10709{
10710 if (SvROK(sstr)) {
b162af07
SP
10711 SvRV_set(dstr, SvWEAKREF(sstr)
10712 ? sv_dup(SvRV(sstr), param)
10713 : sv_dup_inc(SvRV(sstr), param));
f880fe2f 10714
83841fad
NIS
10715 }
10716 else if (SvPVX(sstr)) {
10717 /* Has something there */
10718 if (SvLEN(sstr)) {
68795e93 10719 /* Normal PV - clone whole allocated space */
f880fe2f 10720 SvPV_set(dstr, SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1));
d3d0e6f1
NC
10721 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10722 /* Not that normal - actually sstr is copy on write.
10723 But we are a true, independant SV, so: */
10724 SvREADONLY_off(dstr);
10725 SvFAKE_off(dstr);
10726 }
68795e93 10727 }
83841fad
NIS
10728 else {
10729 /* Special case - not normally malloced for some reason */
10730 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10731 /* A "shared" PV - clone it as unshared string */
281b2760 10732 if(SvPADTMP(sstr)) {
5e6160dc
AB
10733 /* However, some of them live in the pad
10734 and they should not have these flags
10735 turned off */
281b2760 10736
f880fe2f
SP
10737 SvPV_set(dstr, sharepvn(SvPVX(sstr), SvCUR(sstr),
10738 SvUVX(sstr)));
607fa7f2 10739 SvUV_set(dstr, SvUVX(sstr));
281b2760
AB
10740 } else {
10741
f880fe2f 10742 SvPV_set(dstr, SAVEPVN(SvPVX(sstr), SvCUR(sstr)));
281b2760
AB
10743 SvFAKE_off(dstr);
10744 SvREADONLY_off(dstr);
5e6160dc 10745 }
83841fad
NIS
10746 }
10747 else {
10748 /* Some other special case - random pointer */
f880fe2f 10749 SvPV_set(dstr, SvPVX(sstr));
d3d0e6f1 10750 }
83841fad
NIS
10751 }
10752 }
10753 else {
10754 /* Copy the Null */
f880fe2f 10755 if (SvTYPE(dstr) == SVt_RV)
b162af07 10756 SvRV_set(dstr, NULL);
f880fe2f
SP
10757 else
10758 SvPV_set(dstr, 0);
83841fad
NIS
10759 }
10760}
10761
1d7c1841 10762SV *
a8fc9800 10763Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
1d7c1841 10764{
27da23d5 10765 dVAR;
1d7c1841
GS
10766 SV *dstr;
10767
10768 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
10769 return Nullsv;
10770 /* look for it in the table first */
10771 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
10772 if (dstr)
10773 return dstr;
10774
0405e91e
AB
10775 if(param->flags & CLONEf_JOIN_IN) {
10776 /** We are joining here so we don't want do clone
10777 something that is bad **/
10778
10779 if(SvTYPE(sstr) == SVt_PVHV &&
10780 HvNAME(sstr)) {
10781 /** don't clone stashes if they already exist **/
10782 HV* old_stash = gv_stashpv(HvNAME(sstr),0);
10783 return (SV*) old_stash;
10784 }
10785 }
10786
1d7c1841
GS
10787 /* create anew and remember what it is */
10788 new_SV(dstr);
fd0854ff
DM
10789
10790#ifdef DEBUG_LEAKING_SCALARS
10791 dstr->sv_debug_optype = sstr->sv_debug_optype;
10792 dstr->sv_debug_line = sstr->sv_debug_line;
10793 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
10794 dstr->sv_debug_cloned = 1;
10795# ifdef NETWARE
10796 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
10797# else
10798 dstr->sv_debug_file = savesharedpv(sstr->sv_debug_file);
10799# endif
10800#endif
10801
1d7c1841
GS
10802 ptr_table_store(PL_ptr_table, sstr, dstr);
10803
10804 /* clone */
10805 SvFLAGS(dstr) = SvFLAGS(sstr);
10806 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
10807 SvREFCNT(dstr) = 0; /* must be before any other dups! */
10808
10809#ifdef DEBUGGING
10810 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
10811 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
10812 PL_watch_pvx, SvPVX(sstr));
10813#endif
10814
9660f481
DM
10815 /* don't clone objects whose class has asked us not to */
10816 if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
10817 SvFLAGS(dstr) &= ~SVTYPEMASK;
10818 SvOBJECT_off(dstr);
10819 return dstr;
10820 }
10821
1d7c1841
GS
10822 switch (SvTYPE(sstr)) {
10823 case SVt_NULL:
10824 SvANY(dstr) = NULL;
10825 break;
10826 case SVt_IV:
10827 SvANY(dstr) = new_XIV();
45977657 10828 SvIV_set(dstr, SvIVX(sstr));
1d7c1841
GS
10829 break;
10830 case SVt_NV:
10831 SvANY(dstr) = new_XNV();
9d6ce603 10832 SvNV_set(dstr, SvNVX(sstr));
1d7c1841
GS
10833 break;
10834 case SVt_RV:
10835 SvANY(dstr) = new_XRV();
83841fad 10836 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10837 break;
10838 case SVt_PV:
10839 SvANY(dstr) = new_XPV();
b162af07
SP
10840 SvCUR_set(dstr, SvCUR(sstr));
10841 SvLEN_set(dstr, SvLEN(sstr));
83841fad 10842 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10843 break;
10844 case SVt_PVIV:
10845 SvANY(dstr) = new_XPVIV();
b162af07
SP
10846 SvCUR_set(dstr, SvCUR(sstr));
10847 SvLEN_set(dstr, SvLEN(sstr));
45977657 10848 SvIV_set(dstr, SvIVX(sstr));
83841fad 10849 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10850 break;
10851 case SVt_PVNV:
10852 SvANY(dstr) = new_XPVNV();
b162af07
SP
10853 SvCUR_set(dstr, SvCUR(sstr));
10854 SvLEN_set(dstr, SvLEN(sstr));
45977657 10855 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10856 SvNV_set(dstr, SvNVX(sstr));
83841fad 10857 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10858 break;
10859 case SVt_PVMG:
10860 SvANY(dstr) = new_XPVMG();
b162af07
SP
10861 SvCUR_set(dstr, SvCUR(sstr));
10862 SvLEN_set(dstr, SvLEN(sstr));
45977657 10863 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10864 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10865 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10866 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10867 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10868 break;
10869 case SVt_PVBM:
10870 SvANY(dstr) = new_XPVBM();
b162af07
SP
10871 SvCUR_set(dstr, SvCUR(sstr));
10872 SvLEN_set(dstr, SvLEN(sstr));
45977657 10873 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10874 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10875 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10876 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10877 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10878 BmRARE(dstr) = BmRARE(sstr);
10879 BmUSEFUL(dstr) = BmUSEFUL(sstr);
10880 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
10881 break;
10882 case SVt_PVLV:
10883 SvANY(dstr) = new_XPVLV();
b162af07
SP
10884 SvCUR_set(dstr, SvCUR(sstr));
10885 SvLEN_set(dstr, SvLEN(sstr));
45977657 10886 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10887 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10888 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10889 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10890 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10891 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
10892 LvTARGLEN(dstr) = LvTARGLEN(sstr);
dd28f7bb
DM
10893 if (LvTYPE(sstr) == 't') /* for tie: unrefcnted fake (SV**) */
10894 LvTARG(dstr) = dstr;
10895 else if (LvTYPE(sstr) == 'T') /* for tie: fake HE */
10896 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(sstr), 0, param);
10897 else
10898 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr), param);
1d7c1841
GS
10899 LvTYPE(dstr) = LvTYPE(sstr);
10900 break;
10901 case SVt_PVGV:
7fb37951 10902 if (GvUNIQUE((GV*)sstr)) {
5bd07a3d 10903 SV *share;
59b40662 10904 if ((share = gv_share(sstr, param))) {
5bd07a3d
DM
10905 del_SV(dstr);
10906 dstr = share;
37e20706 10907 ptr_table_store(PL_ptr_table, sstr, dstr);
5bd07a3d
DM
10908#if 0
10909 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
10910 HvNAME(GvSTASH(share)), GvNAME(share));
10911#endif
10912 break;
10913 }
10914 }
1d7c1841 10915 SvANY(dstr) = new_XPVGV();
b162af07
SP
10916 SvCUR_set(dstr, SvCUR(sstr));
10917 SvLEN_set(dstr, SvLEN(sstr));
45977657 10918 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10919 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10920 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10921 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10922 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10923 GvNAMELEN(dstr) = GvNAMELEN(sstr);
10924 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
d2d73c3e 10925 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr), param);
1d7c1841 10926 GvFLAGS(dstr) = GvFLAGS(sstr);
d2d73c3e 10927 GvGP(dstr) = gp_dup(GvGP(sstr), param);
1d7c1841
GS
10928 (void)GpREFCNT_inc(GvGP(dstr));
10929 break;
10930 case SVt_PVIO:
10931 SvANY(dstr) = new_XPVIO();
b162af07
SP
10932 SvCUR_set(dstr, SvCUR(sstr));
10933 SvLEN_set(dstr, SvLEN(sstr));
45977657 10934 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10935 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10936 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10937 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10938 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
a8fc9800 10939 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10940 if (IoOFP(sstr) == IoIFP(sstr))
10941 IoOFP(dstr) = IoIFP(dstr);
10942 else
a8fc9800 10943 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10944 /* PL_rsfp_filters entries have fake IoDIRP() */
10945 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
10946 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
10947 else
10948 IoDIRP(dstr) = IoDIRP(sstr);
10949 IoLINES(dstr) = IoLINES(sstr);
10950 IoPAGE(dstr) = IoPAGE(sstr);
10951 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
10952 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
7a5fa8a2 10953 if(IoFLAGS(sstr) & IOf_FAKE_DIRP) {
5a37521b
AB
10954 /* I have no idea why fake dirp (rsfps)
10955 should be treaded differently but otherwise
10956 we end up with leaks -- sky*/
10957 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(sstr), param);
10958 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(sstr), param);
10959 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(sstr), param);
10960 } else {
10961 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr), param);
10962 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr), param);
10963 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr), param);
10964 }
1d7c1841 10965 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
1d7c1841 10966 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
1d7c1841 10967 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
1d7c1841
GS
10968 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
10969 IoTYPE(dstr) = IoTYPE(sstr);
10970 IoFLAGS(dstr) = IoFLAGS(sstr);
10971 break;
10972 case SVt_PVAV:
10973 SvANY(dstr) = new_XPVAV();
b162af07
SP
10974 SvCUR_set(dstr, SvCUR(sstr));
10975 SvLEN_set(dstr, SvLEN(sstr));
45977657 10976 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10977 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10978 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10979 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
d2d73c3e 10980 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
1d7c1841
GS
10981 if (AvARRAY((AV*)sstr)) {
10982 SV **dst_ary, **src_ary;
10983 SSize_t items = AvFILLp((AV*)sstr) + 1;
10984
10985 src_ary = AvARRAY((AV*)sstr);
10986 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
10987 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
f880fe2f 10988 SvPV_set(dstr, (char*)dst_ary);
1d7c1841
GS
10989 AvALLOC((AV*)dstr) = dst_ary;
10990 if (AvREAL((AV*)sstr)) {
10991 while (items-- > 0)
d2d73c3e 10992 *dst_ary++ = sv_dup_inc(*src_ary++, param);
1d7c1841
GS
10993 }
10994 else {
10995 while (items-- > 0)
d2d73c3e 10996 *dst_ary++ = sv_dup(*src_ary++, param);
1d7c1841
GS
10997 }
10998 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10999 while (items-- > 0) {
11000 *dst_ary++ = &PL_sv_undef;
11001 }
11002 }
11003 else {
f880fe2f 11004 SvPV_set(dstr, Nullch);
1d7c1841
GS
11005 AvALLOC((AV*)dstr) = (SV**)NULL;
11006 }
11007 break;
11008 case SVt_PVHV:
11009 SvANY(dstr) = new_XPVHV();
b162af07
SP
11010 SvCUR_set(dstr, SvCUR(sstr));
11011 SvLEN_set(dstr, SvLEN(sstr));
45977657 11012 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 11013 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
11014 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
11015 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
1d7c1841
GS
11016 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
11017 if (HvARRAY((HV*)sstr)) {
1d7c1841
GS
11018 STRLEN i = 0;
11019 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
11020 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
11021 Newz(0, dxhv->xhv_array,
11022 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
11023 while (i <= sxhv->xhv_max) {
11024 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
eb160463
GS
11025 (bool)!!HvSHAREKEYS(sstr),
11026 param);
1d7c1841
GS
11027 ++i;
11028 }
eb160463
GS
11029 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter,
11030 (bool)!!HvSHAREKEYS(sstr), param);
1d7c1841
GS
11031 }
11032 else {
f880fe2f 11033 SvPV_set(dstr, Nullch);
1d7c1841
GS
11034 HvEITER((HV*)dstr) = (HE*)NULL;
11035 }
11036 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
11037 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
c43294b8 11038 /* Record stashes for possible cloning in Perl_clone(). */
6676db26 11039 if(HvNAME((HV*)dstr))
d2d73c3e 11040 av_push(param->stashes, dstr);
1d7c1841
GS
11041 break;
11042 case SVt_PVFM:
11043 SvANY(dstr) = new_XPVFM();
11044 FmLINES(dstr) = FmLINES(sstr);
11045 goto dup_pvcv;
11046 /* NOTREACHED */
11047 case SVt_PVCV:
11048 SvANY(dstr) = new_XPVCV();
d2d73c3e 11049 dup_pvcv:
b162af07
SP
11050 SvCUR_set(dstr, SvCUR(sstr));
11051 SvLEN_set(dstr, SvLEN(sstr));
45977657 11052 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 11053 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
11054 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
11055 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 11056 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
d2d73c3e 11057 CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
1d7c1841 11058 CvSTART(dstr) = CvSTART(sstr);
b34c0dd4 11059 OP_REFCNT_LOCK;
1d7c1841 11060 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
b34c0dd4 11061 OP_REFCNT_UNLOCK;
1d7c1841
GS
11062 CvXSUB(dstr) = CvXSUB(sstr);
11063 CvXSUBANY(dstr) = CvXSUBANY(sstr);
01485f8b
DM
11064 if (CvCONST(sstr)) {
11065 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
11066 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
8f77bfdb 11067 sv_dup_inc((SV *)CvXSUBANY(sstr).any_ptr, param);
01485f8b 11068 }
b23f1a86
DM
11069 /* don't dup if copying back - CvGV isn't refcounted, so the
11070 * duped GV may never be freed. A bit of a hack! DAPM */
11071 CvGV(dstr) = (param->flags & CLONEf_JOIN_IN) ?
11072 Nullgv : gv_dup(CvGV(sstr), param) ;
d2d73c3e
AB
11073 if (param->flags & CLONEf_COPY_STACKS) {
11074 CvDEPTH(dstr) = CvDEPTH(sstr);
11075 } else {
11076 CvDEPTH(dstr) = 0;
11077 }
dd2155a4 11078 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
7dafbf52
DM
11079 CvOUTSIDE_SEQ(dstr) = CvOUTSIDE_SEQ(sstr);
11080 CvOUTSIDE(dstr) =
11081 CvWEAKOUTSIDE(sstr)
11082 ? cv_dup( CvOUTSIDE(sstr), param)
11083 : cv_dup_inc(CvOUTSIDE(sstr), param);
1d7c1841 11084 CvFLAGS(dstr) = CvFLAGS(sstr);
54356c7d 11085 CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
1d7c1841
GS
11086 break;
11087 default:
c803eecc 11088 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
1d7c1841
GS
11089 break;
11090 }
11091
11092 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
11093 ++PL_sv_objcount;
11094
11095 return dstr;
d2d73c3e 11096 }
1d7c1841 11097
645c22ef
DM
11098/* duplicate a context */
11099
1d7c1841 11100PERL_CONTEXT *
a8fc9800 11101Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
11102{
11103 PERL_CONTEXT *ncxs;
11104
11105 if (!cxs)
11106 return (PERL_CONTEXT*)NULL;
11107
11108 /* look for it in the table first */
11109 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
11110 if (ncxs)
11111 return ncxs;
11112
11113 /* create anew and remember what it is */
11114 Newz(56, ncxs, max + 1, PERL_CONTEXT);
11115 ptr_table_store(PL_ptr_table, cxs, ncxs);
11116
11117 while (ix >= 0) {
11118 PERL_CONTEXT *cx = &cxs[ix];
11119 PERL_CONTEXT *ncx = &ncxs[ix];
11120 ncx->cx_type = cx->cx_type;
11121 if (CxTYPE(cx) == CXt_SUBST) {
11122 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
11123 }
11124 else {
11125 ncx->blk_oldsp = cx->blk_oldsp;
11126 ncx->blk_oldcop = cx->blk_oldcop;
1d7c1841
GS
11127 ncx->blk_oldmarksp = cx->blk_oldmarksp;
11128 ncx->blk_oldscopesp = cx->blk_oldscopesp;
11129 ncx->blk_oldpm = cx->blk_oldpm;
11130 ncx->blk_gimme = cx->blk_gimme;
11131 switch (CxTYPE(cx)) {
11132 case CXt_SUB:
11133 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
11134 ? cv_dup_inc(cx->blk_sub.cv, param)
11135 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 11136 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 11137 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 11138 : Nullav);
d2d73c3e 11139 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
11140 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
11141 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
11142 ncx->blk_sub.lval = cx->blk_sub.lval;
f39bc417 11143 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
11144 break;
11145 case CXt_EVAL:
11146 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
11147 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 11148 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 11149 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 11150 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
f39bc417 11151 ncx->blk_eval.retop = cx->blk_eval.retop;
1d7c1841
GS
11152 break;
11153 case CXt_LOOP:
11154 ncx->blk_loop.label = cx->blk_loop.label;
11155 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
11156 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
11157 ncx->blk_loop.next_op = cx->blk_loop.next_op;
11158 ncx->blk_loop.last_op = cx->blk_loop.last_op;
11159 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
11160 ? cx->blk_loop.iterdata
d2d73c3e 11161 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
11162 ncx->blk_loop.oldcomppad
11163 = (PAD*)ptr_table_fetch(PL_ptr_table,
11164 cx->blk_loop.oldcomppad);
d2d73c3e
AB
11165 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
11166 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
11167 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
11168 ncx->blk_loop.iterix = cx->blk_loop.iterix;
11169 ncx->blk_loop.itermax = cx->blk_loop.itermax;
11170 break;
11171 case CXt_FORMAT:
d2d73c3e
AB
11172 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
11173 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
11174 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841 11175 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
f39bc417 11176 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
11177 break;
11178 case CXt_BLOCK:
11179 case CXt_NULL:
11180 break;
11181 }
11182 }
11183 --ix;
11184 }
11185 return ncxs;
11186}
11187
645c22ef
DM
11188/* duplicate a stack info structure */
11189
1d7c1841 11190PERL_SI *
a8fc9800 11191Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
11192{
11193 PERL_SI *nsi;
11194
11195 if (!si)
11196 return (PERL_SI*)NULL;
11197
11198 /* look for it in the table first */
11199 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
11200 if (nsi)
11201 return nsi;
11202
11203 /* create anew and remember what it is */
11204 Newz(56, nsi, 1, PERL_SI);
11205 ptr_table_store(PL_ptr_table, si, nsi);
11206
d2d73c3e 11207 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
11208 nsi->si_cxix = si->si_cxix;
11209 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 11210 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 11211 nsi->si_type = si->si_type;
d2d73c3e
AB
11212 nsi->si_prev = si_dup(si->si_prev, param);
11213 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
11214 nsi->si_markoff = si->si_markoff;
11215
11216 return nsi;
11217}
11218
11219#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
11220#define TOPINT(ss,ix) ((ss)[ix].any_i32)
11221#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
11222#define TOPLONG(ss,ix) ((ss)[ix].any_long)
11223#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
11224#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
11225#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
11226#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
11227#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
11228#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
11229#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
11230#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
11231#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
11232#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
11233
11234/* XXXXX todo */
11235#define pv_dup_inc(p) SAVEPV(p)
11236#define pv_dup(p) SAVEPV(p)
11237#define svp_dup_inc(p,pp) any_dup(p,pp)
11238
645c22ef
DM
11239/* map any object to the new equivent - either something in the
11240 * ptr table, or something in the interpreter structure
11241 */
11242
1d7c1841
GS
11243void *
11244Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
11245{
11246 void *ret;
11247
11248 if (!v)
11249 return (void*)NULL;
11250
11251 /* look for it in the table first */
11252 ret = ptr_table_fetch(PL_ptr_table, v);
11253 if (ret)
11254 return ret;
11255
11256 /* see if it is part of the interpreter structure */
11257 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 11258 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 11259 else {
1d7c1841 11260 ret = v;
05ec9bb3 11261 }
1d7c1841
GS
11262
11263 return ret;
11264}
11265
645c22ef
DM
11266/* duplicate the save stack */
11267
1d7c1841 11268ANY *
a8fc9800 11269Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841
GS
11270{
11271 ANY *ss = proto_perl->Tsavestack;
11272 I32 ix = proto_perl->Tsavestack_ix;
11273 I32 max = proto_perl->Tsavestack_max;
11274 ANY *nss;
11275 SV *sv;
11276 GV *gv;
11277 AV *av;
11278 HV *hv;
11279 void* ptr;
11280 int intval;
11281 long longval;
11282 GP *gp;
11283 IV iv;
11284 I32 i;
c4e33207 11285 char *c = NULL;
1d7c1841 11286 void (*dptr) (void*);
acfe0abc 11287 void (*dxptr) (pTHX_ void*);
e977893f 11288 OP *o;
1d7c1841
GS
11289
11290 Newz(54, nss, max, ANY);
11291
11292 while (ix > 0) {
11293 i = POPINT(ss,ix);
11294 TOPINT(nss,ix) = i;
11295 switch (i) {
11296 case SAVEt_ITEM: /* normal string */
11297 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11298 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11299 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11300 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11301 break;
11302 case SAVEt_SV: /* scalar reference */
11303 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11304 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11305 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11306 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 11307 break;
f4dd75d9
GS
11308 case SAVEt_GENERIC_PVREF: /* generic char* */
11309 c = (char*)POPPTR(ss,ix);
11310 TOPPTR(nss,ix) = pv_dup(c);
11311 ptr = POPPTR(ss,ix);
11312 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11313 break;
05ec9bb3
NIS
11314 case SAVEt_SHARED_PVREF: /* char* in shared space */
11315 c = (char*)POPPTR(ss,ix);
11316 TOPPTR(nss,ix) = savesharedpv(c);
11317 ptr = POPPTR(ss,ix);
11318 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11319 break;
1d7c1841
GS
11320 case SAVEt_GENERIC_SVREF: /* generic sv */
11321 case SAVEt_SVREF: /* scalar reference */
11322 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11323 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11324 ptr = POPPTR(ss,ix);
11325 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
11326 break;
11327 case SAVEt_AV: /* array reference */
11328 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11329 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 11330 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11331 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11332 break;
11333 case SAVEt_HV: /* hash reference */
11334 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11335 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 11336 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11337 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11338 break;
11339 case SAVEt_INT: /* int reference */
11340 ptr = POPPTR(ss,ix);
11341 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11342 intval = (int)POPINT(ss,ix);
11343 TOPINT(nss,ix) = intval;
11344 break;
11345 case SAVEt_LONG: /* long reference */
11346 ptr = POPPTR(ss,ix);
11347 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11348 longval = (long)POPLONG(ss,ix);
11349 TOPLONG(nss,ix) = longval;
11350 break;
11351 case SAVEt_I32: /* I32 reference */
11352 case SAVEt_I16: /* I16 reference */
11353 case SAVEt_I8: /* I8 reference */
11354 ptr = POPPTR(ss,ix);
11355 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11356 i = POPINT(ss,ix);
11357 TOPINT(nss,ix) = i;
11358 break;
11359 case SAVEt_IV: /* IV reference */
11360 ptr = POPPTR(ss,ix);
11361 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11362 iv = POPIV(ss,ix);
11363 TOPIV(nss,ix) = iv;
11364 break;
11365 case SAVEt_SPTR: /* SV* reference */
11366 ptr = POPPTR(ss,ix);
11367 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11368 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11369 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
11370 break;
11371 case SAVEt_VPTR: /* random* reference */
11372 ptr = POPPTR(ss,ix);
11373 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11374 ptr = POPPTR(ss,ix);
11375 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11376 break;
11377 case SAVEt_PPTR: /* char* reference */
11378 ptr = POPPTR(ss,ix);
11379 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11380 c = (char*)POPPTR(ss,ix);
11381 TOPPTR(nss,ix) = pv_dup(c);
11382 break;
11383 case SAVEt_HPTR: /* HV* reference */
11384 ptr = POPPTR(ss,ix);
11385 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11386 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11387 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
11388 break;
11389 case SAVEt_APTR: /* AV* reference */
11390 ptr = POPPTR(ss,ix);
11391 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11392 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11393 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
11394 break;
11395 case SAVEt_NSTAB:
11396 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11397 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11398 break;
11399 case SAVEt_GP: /* scalar reference */
11400 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 11401 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
11402 (void)GpREFCNT_inc(gp);
11403 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 11404 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
11405 c = (char*)POPPTR(ss,ix);
11406 TOPPTR(nss,ix) = pv_dup(c);
11407 iv = POPIV(ss,ix);
11408 TOPIV(nss,ix) = iv;
11409 iv = POPIV(ss,ix);
11410 TOPIV(nss,ix) = iv;
11411 break;
11412 case SAVEt_FREESV:
26d9b02f 11413 case SAVEt_MORTALIZESV:
1d7c1841 11414 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11415 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11416 break;
11417 case SAVEt_FREEOP:
11418 ptr = POPPTR(ss,ix);
11419 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
11420 /* these are assumed to be refcounted properly */
11421 switch (((OP*)ptr)->op_type) {
11422 case OP_LEAVESUB:
11423 case OP_LEAVESUBLV:
11424 case OP_LEAVEEVAL:
11425 case OP_LEAVE:
11426 case OP_SCOPE:
11427 case OP_LEAVEWRITE:
e977893f
GS
11428 TOPPTR(nss,ix) = ptr;
11429 o = (OP*)ptr;
11430 OpREFCNT_inc(o);
1d7c1841
GS
11431 break;
11432 default:
11433 TOPPTR(nss,ix) = Nullop;
11434 break;
11435 }
11436 }
11437 else
11438 TOPPTR(nss,ix) = Nullop;
11439 break;
11440 case SAVEt_FREEPV:
11441 c = (char*)POPPTR(ss,ix);
11442 TOPPTR(nss,ix) = pv_dup_inc(c);
11443 break;
11444 case SAVEt_CLEARSV:
11445 longval = POPLONG(ss,ix);
11446 TOPLONG(nss,ix) = longval;
11447 break;
11448 case SAVEt_DELETE:
11449 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11450 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
11451 c = (char*)POPPTR(ss,ix);
11452 TOPPTR(nss,ix) = pv_dup_inc(c);
11453 i = POPINT(ss,ix);
11454 TOPINT(nss,ix) = i;
11455 break;
11456 case SAVEt_DESTRUCTOR:
11457 ptr = POPPTR(ss,ix);
11458 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11459 dptr = POPDPTR(ss,ix);
ef75a179 11460 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
11461 break;
11462 case SAVEt_DESTRUCTOR_X:
11463 ptr = POPPTR(ss,ix);
11464 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11465 dxptr = POPDXPTR(ss,ix);
acfe0abc 11466 TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
11467 break;
11468 case SAVEt_REGCONTEXT:
11469 case SAVEt_ALLOC:
11470 i = POPINT(ss,ix);
11471 TOPINT(nss,ix) = i;
11472 ix -= i;
11473 break;
11474 case SAVEt_STACK_POS: /* Position on Perl stack */
11475 i = POPINT(ss,ix);
11476 TOPINT(nss,ix) = i;
11477 break;
11478 case SAVEt_AELEM: /* array element */
11479 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11480 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11481 i = POPINT(ss,ix);
11482 TOPINT(nss,ix) = i;
11483 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11484 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
11485 break;
11486 case SAVEt_HELEM: /* hash element */
11487 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11488 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11489 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11490 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11491 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11492 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
11493 break;
11494 case SAVEt_OP:
11495 ptr = POPPTR(ss,ix);
11496 TOPPTR(nss,ix) = ptr;
11497 break;
11498 case SAVEt_HINTS:
11499 i = POPINT(ss,ix);
11500 TOPINT(nss,ix) = i;
11501 break;
c4410b1b
GS
11502 case SAVEt_COMPPAD:
11503 av = (AV*)POPPTR(ss,ix);
58ed4fbe 11504 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 11505 break;
c3564e5c
GS
11506 case SAVEt_PADSV:
11507 longval = (long)POPLONG(ss,ix);
11508 TOPLONG(nss,ix) = longval;
11509 ptr = POPPTR(ss,ix);
11510 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11511 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11512 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 11513 break;
a1bb4754 11514 case SAVEt_BOOL:
38d8b13e 11515 ptr = POPPTR(ss,ix);
b9609c01 11516 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 11517 longval = (long)POPBOOL(ss,ix);
b9609c01 11518 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 11519 break;
8bd2680e
MHM
11520 case SAVEt_SET_SVFLAGS:
11521 i = POPINT(ss,ix);
11522 TOPINT(nss,ix) = i;
11523 i = POPINT(ss,ix);
11524 TOPINT(nss,ix) = i;
11525 sv = (SV*)POPPTR(ss,ix);
11526 TOPPTR(nss,ix) = sv_dup(sv, param);
11527 break;
1d7c1841
GS
11528 default:
11529 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
11530 }
11531 }
11532
11533 return nss;
11534}
11535
9660f481
DM
11536
11537/* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
11538 * flag to the result. This is done for each stash before cloning starts,
11539 * so we know which stashes want their objects cloned */
11540
11541static void
11542do_mark_cloneable_stash(pTHX_ SV *sv)
11543{
11544 if (HvNAME((HV*)sv)) {
11545 GV* cloner = gv_fetchmethod_autoload((HV*)sv, "CLONE_SKIP", 0);
11546 SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
11547 if (cloner && GvCV(cloner)) {
11548 dSP;
11549 UV status;
11550
11551 ENTER;
11552 SAVETMPS;
11553 PUSHMARK(SP);
11554 XPUSHs(sv_2mortal(newSVpv(HvNAME((HV*)sv), 0)));
11555 PUTBACK;
11556 call_sv((SV*)GvCV(cloner), G_SCALAR);
11557 SPAGAIN;
11558 status = POPu;
11559 PUTBACK;
11560 FREETMPS;
11561 LEAVE;
11562 if (status)
11563 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
11564 }
11565 }
11566}
11567
11568
11569
645c22ef
DM
11570/*
11571=for apidoc perl_clone
11572
11573Create and return a new interpreter by cloning the current one.
11574
4be49ee6 11575perl_clone takes these flags as parameters:
6a78b4db 11576
7a5fa8a2
NIS
11577CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
11578without it we only clone the data and zero the stacks,
11579with it we copy the stacks and the new perl interpreter is
11580ready to run at the exact same point as the previous one.
11581The pseudo-fork code uses COPY_STACKS while the
6a78b4db
AB
11582threads->new doesn't.
11583
11584CLONEf_KEEP_PTR_TABLE
7a5fa8a2
NIS
11585perl_clone keeps a ptr_table with the pointer of the old
11586variable as a key and the new variable as a value,
11587this allows it to check if something has been cloned and not
11588clone it again but rather just use the value and increase the
11589refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
11590the ptr_table using the function
11591C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
11592reason to keep it around is if you want to dup some of your own
11593variable who are outside the graph perl scans, example of this
6a78b4db
AB
11594code is in threads.xs create
11595
11596CLONEf_CLONE_HOST
7a5fa8a2
NIS
11597This is a win32 thing, it is ignored on unix, it tells perls
11598win32host code (which is c++) to clone itself, this is needed on
11599win32 if you want to run two threads at the same time,
11600if you just want to do some stuff in a separate perl interpreter
11601and then throw it away and return to the original one,
6a78b4db
AB
11602you don't need to do anything.
11603
645c22ef
DM
11604=cut
11605*/
11606
11607/* XXX the above needs expanding by someone who actually understands it ! */
3fc56081
NK
11608EXTERN_C PerlInterpreter *
11609perl_clone_host(PerlInterpreter* proto_perl, UV flags);
645c22ef 11610
1d7c1841
GS
11611PerlInterpreter *
11612perl_clone(PerlInterpreter *proto_perl, UV flags)
11613{
27da23d5 11614 dVAR;
1d7c1841 11615#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
11616
11617 /* perlhost.h so we need to call into it
11618 to clone the host, CPerlHost should have a c interface, sky */
11619
11620 if (flags & CLONEf_CLONE_HOST) {
11621 return perl_clone_host(proto_perl,flags);
11622 }
11623 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
11624 proto_perl->IMem,
11625 proto_perl->IMemShared,
11626 proto_perl->IMemParse,
11627 proto_perl->IEnv,
11628 proto_perl->IStdIO,
11629 proto_perl->ILIO,
11630 proto_perl->IDir,
11631 proto_perl->ISock,
11632 proto_perl->IProc);
11633}
11634
11635PerlInterpreter *
11636perl_clone_using(PerlInterpreter *proto_perl, UV flags,
11637 struct IPerlMem* ipM, struct IPerlMem* ipMS,
11638 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
11639 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
11640 struct IPerlDir* ipD, struct IPerlSock* ipS,
11641 struct IPerlProc* ipP)
11642{
11643 /* XXX many of the string copies here can be optimized if they're
11644 * constants; they need to be allocated as common memory and just
11645 * their pointers copied. */
11646
11647 IV i;
64aa0685
GS
11648 CLONE_PARAMS clone_params;
11649 CLONE_PARAMS* param = &clone_params;
d2d73c3e 11650
1d7c1841 11651 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
9660f481
DM
11652 /* for each stash, determine whether its objects should be cloned */
11653 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
ba869deb 11654 PERL_SET_THX(my_perl);
1d7c1841 11655
acfe0abc 11656# ifdef DEBUGGING
a4530404 11657 Poison(my_perl, 1, PerlInterpreter);
fd0854ff 11658 PL_op = Nullop;
c008732b 11659 PL_curcop = (COP *)Nullop;
1d7c1841
GS
11660 PL_markstack = 0;
11661 PL_scopestack = 0;
11662 PL_savestack = 0;
22f7c9c9
JH
11663 PL_savestack_ix = 0;
11664 PL_savestack_max = -1;
66fe0623 11665 PL_sig_pending = 0;
25596c82 11666 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
acfe0abc 11667# else /* !DEBUGGING */
1d7c1841 11668 Zero(my_perl, 1, PerlInterpreter);
acfe0abc 11669# endif /* DEBUGGING */
1d7c1841
GS
11670
11671 /* host pointers */
11672 PL_Mem = ipM;
11673 PL_MemShared = ipMS;
11674 PL_MemParse = ipMP;
11675 PL_Env = ipE;
11676 PL_StdIO = ipStd;
11677 PL_LIO = ipLIO;
11678 PL_Dir = ipD;
11679 PL_Sock = ipS;
11680 PL_Proc = ipP;
1d7c1841
GS
11681#else /* !PERL_IMPLICIT_SYS */
11682 IV i;
64aa0685
GS
11683 CLONE_PARAMS clone_params;
11684 CLONE_PARAMS* param = &clone_params;
1d7c1841 11685 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
9660f481
DM
11686 /* for each stash, determine whether its objects should be cloned */
11687 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
ba869deb 11688 PERL_SET_THX(my_perl);
1d7c1841
GS
11689
11690# ifdef DEBUGGING
a4530404 11691 Poison(my_perl, 1, PerlInterpreter);
fd0854ff 11692 PL_op = Nullop;
c008732b 11693 PL_curcop = (COP *)Nullop;
1d7c1841
GS
11694 PL_markstack = 0;
11695 PL_scopestack = 0;
11696 PL_savestack = 0;
22f7c9c9
JH
11697 PL_savestack_ix = 0;
11698 PL_savestack_max = -1;
66fe0623 11699 PL_sig_pending = 0;
25596c82 11700 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
1d7c1841
GS
11701# else /* !DEBUGGING */
11702 Zero(my_perl, 1, PerlInterpreter);
11703# endif /* DEBUGGING */
11704#endif /* PERL_IMPLICIT_SYS */
83236556 11705 param->flags = flags;
59b40662 11706 param->proto_perl = proto_perl;
1d7c1841
GS
11707
11708 /* arena roots */
11709 PL_xiv_arenaroot = NULL;
11710 PL_xiv_root = NULL;
612f20c3 11711 PL_xnv_arenaroot = NULL;
1d7c1841 11712 PL_xnv_root = NULL;
612f20c3 11713 PL_xrv_arenaroot = NULL;
1d7c1841 11714 PL_xrv_root = NULL;
612f20c3 11715 PL_xpv_arenaroot = NULL;
1d7c1841 11716 PL_xpv_root = NULL;
612f20c3 11717 PL_xpviv_arenaroot = NULL;
1d7c1841 11718 PL_xpviv_root = NULL;
612f20c3 11719 PL_xpvnv_arenaroot = NULL;
1d7c1841 11720 PL_xpvnv_root = NULL;
612f20c3 11721 PL_xpvcv_arenaroot = NULL;
1d7c1841 11722 PL_xpvcv_root = NULL;
612f20c3 11723 PL_xpvav_arenaroot = NULL;
1d7c1841 11724 PL_xpvav_root = NULL;
612f20c3 11725 PL_xpvhv_arenaroot = NULL;
1d7c1841 11726 PL_xpvhv_root = NULL;
612f20c3 11727 PL_xpvmg_arenaroot = NULL;
1d7c1841 11728 PL_xpvmg_root = NULL;
7552b40b
DM
11729 PL_xpvgv_arenaroot = NULL;
11730 PL_xpvgv_root = NULL;
612f20c3 11731 PL_xpvlv_arenaroot = NULL;
1d7c1841 11732 PL_xpvlv_root = NULL;
612f20c3 11733 PL_xpvbm_arenaroot = NULL;
1d7c1841 11734 PL_xpvbm_root = NULL;
612f20c3 11735 PL_he_arenaroot = NULL;
1d7c1841 11736 PL_he_root = NULL;
892b45be 11737#if defined(USE_ITHREADS)
32e691d0
NC
11738 PL_pte_arenaroot = NULL;
11739 PL_pte_root = NULL;
892b45be 11740#endif
1d7c1841
GS
11741 PL_nice_chunk = NULL;
11742 PL_nice_chunk_size = 0;
11743 PL_sv_count = 0;
11744 PL_sv_objcount = 0;
11745 PL_sv_root = Nullsv;
11746 PL_sv_arenaroot = Nullsv;
11747
11748 PL_debug = proto_perl->Idebug;
11749
e5dd39fc 11750#ifdef USE_REENTRANT_API
68853529
SB
11751 /* XXX: things like -Dm will segfault here in perlio, but doing
11752 * PERL_SET_CONTEXT(proto_perl);
11753 * breaks too many other things
11754 */
59bd0823 11755 Perl_reentrant_init(aTHX);
e5dd39fc
AB
11756#endif
11757
1d7c1841
GS
11758 /* create SV map for pointer relocation */
11759 PL_ptr_table = ptr_table_new();
11760
11761 /* initialize these special pointers as early as possible */
11762 SvANY(&PL_sv_undef) = NULL;
11763 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
11764 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
11765 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
11766
1d7c1841 11767 SvANY(&PL_sv_no) = new_XPVNV();
1d7c1841 11768 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
0309f36e
NC
11769 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11770 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
f880fe2f 11771 SvPV_set(&PL_sv_no, SAVEPVN(PL_No, 0));
b162af07
SP
11772 SvCUR_set(&PL_sv_no, 0);
11773 SvLEN_set(&PL_sv_no, 1);
45977657 11774 SvIV_set(&PL_sv_no, 0);
9d6ce603 11775 SvNV_set(&PL_sv_no, 0);
1d7c1841
GS
11776 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
11777
1d7c1841 11778 SvANY(&PL_sv_yes) = new_XPVNV();
1d7c1841 11779 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
0309f36e
NC
11780 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11781 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
f880fe2f 11782 SvPV_set(&PL_sv_yes, SAVEPVN(PL_Yes, 1));
b162af07
SP
11783 SvCUR_set(&PL_sv_yes, 1);
11784 SvLEN_set(&PL_sv_yes, 2);
45977657 11785 SvIV_set(&PL_sv_yes, 1);
9d6ce603 11786 SvNV_set(&PL_sv_yes, 1);
1d7c1841
GS
11787 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
11788
05ec9bb3 11789 /* create (a non-shared!) shared string table */
1d7c1841
GS
11790 PL_strtab = newHV();
11791 HvSHAREKEYS_off(PL_strtab);
11792 hv_ksplit(PL_strtab, 512);
11793 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
11794
05ec9bb3
NIS
11795 PL_compiling = proto_perl->Icompiling;
11796
11797 /* These two PVs will be free'd special way so must set them same way op.c does */
11798 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
11799 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
11800
11801 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
11802 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
11803
1d7c1841
GS
11804 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
11805 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 11806 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 11807 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 11808 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
11809 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
11810
11811 /* pseudo environmental stuff */
11812 PL_origargc = proto_perl->Iorigargc;
e2975953 11813 PL_origargv = proto_perl->Iorigargv;
d2d73c3e 11814
d2d73c3e
AB
11815 param->stashes = newAV(); /* Setup array of objects to call clone on */
11816
a1ea730d 11817#ifdef PERLIO_LAYERS
3a1ee7e8
NIS
11818 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11819 PerlIO_clone(aTHX_ proto_perl, param);
a1ea730d 11820#endif
d2d73c3e
AB
11821
11822 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
11823 PL_incgv = gv_dup(proto_perl->Iincgv, param);
11824 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 11825 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
11826 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
11827 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
11828
11829 /* switches */
11830 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 11831 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
11832 PL_localpatches = proto_perl->Ilocalpatches;
11833 PL_splitstr = proto_perl->Isplitstr;
11834 PL_preprocess = proto_perl->Ipreprocess;
11835 PL_minus_n = proto_perl->Iminus_n;
11836 PL_minus_p = proto_perl->Iminus_p;
11837 PL_minus_l = proto_perl->Iminus_l;
11838 PL_minus_a = proto_perl->Iminus_a;
11839 PL_minus_F = proto_perl->Iminus_F;
11840 PL_doswitches = proto_perl->Idoswitches;
11841 PL_dowarn = proto_perl->Idowarn;
11842 PL_doextract = proto_perl->Idoextract;
11843 PL_sawampersand = proto_perl->Isawampersand;
11844 PL_unsafe = proto_perl->Iunsafe;
11845 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 11846 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
11847 PL_perldb = proto_perl->Iperldb;
11848 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
1cbb0781 11849 PL_exit_flags = proto_perl->Iexit_flags;
1d7c1841
GS
11850
11851 /* magical thingies */
11852 /* XXX time(&PL_basetime) when asked for? */
11853 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 11854 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
11855
11856 PL_maxsysfd = proto_perl->Imaxsysfd;
11857 PL_multiline = proto_perl->Imultiline;
11858 PL_statusvalue = proto_perl->Istatusvalue;
11859#ifdef VMS
11860 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
11861#endif
0a378802 11862 PL_encoding = sv_dup(proto_perl->Iencoding, param);
1d7c1841 11863
4a4c6fe3 11864 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
1f483ca1
JH
11865 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
11866 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
4a4c6fe3 11867
d2f185dc
AMS
11868 /* Clone the regex array */
11869 PL_regex_padav = newAV();
11870 {
a3b680e6 11871 const I32 len = av_len((AV*)proto_perl->Iregex_padav);
d2f185dc 11872 SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
0f95fc41
AB
11873 av_push(PL_regex_padav,
11874 sv_dup_inc(regexen[0],param));
11875 for(i = 1; i <= len; i++) {
11876 if(SvREPADTMP(regexen[i])) {
11877 av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
8cf8f3d1 11878 } else {
0f95fc41
AB
11879 av_push(PL_regex_padav,
11880 SvREFCNT_inc(
8cf8f3d1 11881 newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
cbfa9890 11882 SvIVX(regexen[i])), param)))
0f95fc41
AB
11883 ));
11884 }
d2f185dc
AMS
11885 }
11886 }
11887 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 11888
1d7c1841 11889 /* shortcuts to various I/O objects */
d2d73c3e
AB
11890 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
11891 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
11892 PL_defgv = gv_dup(proto_perl->Idefgv, param);
11893 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
11894 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
11895 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
11896
11897 /* shortcuts to regexp stuff */
d2d73c3e 11898 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
11899
11900 /* shortcuts to misc objects */
d2d73c3e 11901 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
11902
11903 /* shortcuts to debugging objects */
d2d73c3e
AB
11904 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
11905 PL_DBline = gv_dup(proto_perl->IDBline, param);
11906 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
11907 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
11908 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
11909 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
06492da6 11910 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
d2d73c3e
AB
11911 PL_lineary = av_dup(proto_perl->Ilineary, param);
11912 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
11913
11914 /* symbol tables */
d2d73c3e
AB
11915 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
11916 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
d2d73c3e
AB
11917 PL_debstash = hv_dup(proto_perl->Idebstash, param);
11918 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
11919 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
11920
11921 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
ee1c5a4e 11922 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
ece599bd 11923 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
d2d73c3e
AB
11924 PL_endav = av_dup_inc(proto_perl->Iendav, param);
11925 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
11926 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
11927
11928 PL_sub_generation = proto_perl->Isub_generation;
11929
11930 /* funky return mechanisms */
11931 PL_forkprocess = proto_perl->Iforkprocess;
11932
11933 /* subprocess state */
d2d73c3e 11934 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
11935
11936 /* internal state */
11937 PL_tainting = proto_perl->Itainting;
7135f00b 11938 PL_taint_warn = proto_perl->Itaint_warn;
1d7c1841
GS
11939 PL_maxo = proto_perl->Imaxo;
11940 if (proto_perl->Iop_mask)
11941 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11942 else
11943 PL_op_mask = Nullch;
06492da6 11944 /* PL_asserting = proto_perl->Iasserting; */
1d7c1841
GS
11945
11946 /* current interpreter roots */
d2d73c3e 11947 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
11948 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
11949 PL_main_start = proto_perl->Imain_start;
e977893f 11950 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
11951 PL_eval_start = proto_perl->Ieval_start;
11952
11953 /* runtime control stuff */
11954 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
11955 PL_copline = proto_perl->Icopline;
11956
11957 PL_filemode = proto_perl->Ifilemode;
11958 PL_lastfd = proto_perl->Ilastfd;
11959 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
11960 PL_Argv = NULL;
11961 PL_Cmd = Nullch;
11962 PL_gensym = proto_perl->Igensym;
11963 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 11964 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
11965 PL_laststatval = proto_perl->Ilaststatval;
11966 PL_laststype = proto_perl->Ilaststype;
11967 PL_mess_sv = Nullsv;
11968
d2d73c3e 11969 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
11970 PL_ofmt = SAVEPV(proto_perl->Iofmt);
11971
11972 /* interpreter atexit processing */
11973 PL_exitlistlen = proto_perl->Iexitlistlen;
11974 if (PL_exitlistlen) {
11975 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11976 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11977 }
11978 else
11979 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 11980 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
19e8ce8e
AB
11981 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
11982 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1d7c1841
GS
11983
11984 PL_profiledata = NULL;
a8fc9800 11985 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
1d7c1841 11986 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 11987 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 11988
d2d73c3e 11989 PL_compcv = cv_dup(proto_perl->Icompcv, param);
dd2155a4
DM
11990
11991 PAD_CLONE_VARS(proto_perl, param);
1d7c1841
GS
11992
11993#ifdef HAVE_INTERP_INTERN
11994 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11995#endif
11996
11997 /* more statics moved here */
11998 PL_generation = proto_perl->Igeneration;
d2d73c3e 11999 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
12000
12001 PL_in_clean_objs = proto_perl->Iin_clean_objs;
12002 PL_in_clean_all = proto_perl->Iin_clean_all;
12003
12004 PL_uid = proto_perl->Iuid;
12005 PL_euid = proto_perl->Ieuid;
12006 PL_gid = proto_perl->Igid;
12007 PL_egid = proto_perl->Iegid;
12008 PL_nomemok = proto_perl->Inomemok;
12009 PL_an = proto_perl->Ian;
1d7c1841
GS
12010 PL_evalseq = proto_perl->Ievalseq;
12011 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
12012 PL_origalen = proto_perl->Iorigalen;
12013 PL_pidstatus = newHV(); /* XXX flag for cloning? */
12014 PL_osname = SAVEPV(proto_perl->Iosname);
5c728af0 12015 PL_sh_path_compat = proto_perl->Ish_path_compat; /* XXX never deallocated */
1d7c1841
GS
12016 PL_sighandlerp = proto_perl->Isighandlerp;
12017
12018
12019 PL_runops = proto_perl->Irunops;
12020
12021 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
12022
12023#ifdef CSH
12024 PL_cshlen = proto_perl->Icshlen;
74f1b2b8 12025 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
1d7c1841
GS
12026#endif
12027
12028 PL_lex_state = proto_perl->Ilex_state;
12029 PL_lex_defer = proto_perl->Ilex_defer;
12030 PL_lex_expect = proto_perl->Ilex_expect;
12031 PL_lex_formbrack = proto_perl->Ilex_formbrack;
12032 PL_lex_dojoin = proto_perl->Ilex_dojoin;
12033 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
12034 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
12035 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
12036 PL_lex_op = proto_perl->Ilex_op;
12037 PL_lex_inpat = proto_perl->Ilex_inpat;
12038 PL_lex_inwhat = proto_perl->Ilex_inwhat;
12039 PL_lex_brackets = proto_perl->Ilex_brackets;
12040 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
12041 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
12042 PL_lex_casemods = proto_perl->Ilex_casemods;
12043 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
12044 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
12045
12046 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
12047 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
12048 PL_nexttoke = proto_perl->Inexttoke;
12049
1d773130
TB
12050 /* XXX This is probably masking the deeper issue of why
12051 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
12052 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
12053 * (A little debugging with a watchpoint on it may help.)
12054 */
389edf32
TB
12055 if (SvANY(proto_perl->Ilinestr)) {
12056 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
12057 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
12058 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
12059 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
12060 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
12061 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
12062 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
12063 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
12064 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
12065 }
12066 else {
12067 PL_linestr = NEWSV(65,79);
12068 sv_upgrade(PL_linestr,SVt_PVIV);
12069 sv_setpvn(PL_linestr,"",0);
12070 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
12071 }
1d7c1841 12072 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1d7c1841
GS
12073 PL_pending_ident = proto_perl->Ipending_ident;
12074 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
12075
12076 PL_expect = proto_perl->Iexpect;
12077
12078 PL_multi_start = proto_perl->Imulti_start;
12079 PL_multi_end = proto_perl->Imulti_end;
12080 PL_multi_open = proto_perl->Imulti_open;
12081 PL_multi_close = proto_perl->Imulti_close;
12082
12083 PL_error_count = proto_perl->Ierror_count;
12084 PL_subline = proto_perl->Isubline;
d2d73c3e 12085 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841 12086
1d773130 12087 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
389edf32
TB
12088 if (SvANY(proto_perl->Ilinestr)) {
12089 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
12090 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
12091 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
12092 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
12093 PL_last_lop_op = proto_perl->Ilast_lop_op;
12094 }
12095 else {
12096 PL_last_uni = SvPVX(PL_linestr);
12097 PL_last_lop = SvPVX(PL_linestr);
12098 PL_last_lop_op = 0;
12099 }
1d7c1841 12100 PL_in_my = proto_perl->Iin_my;
d2d73c3e 12101 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
12102#ifdef FCRYPT
12103 PL_cryptseen = proto_perl->Icryptseen;
12104#endif
12105
12106 PL_hints = proto_perl->Ihints;
12107
12108 PL_amagic_generation = proto_perl->Iamagic_generation;
12109
12110#ifdef USE_LOCALE_COLLATE
12111 PL_collation_ix = proto_perl->Icollation_ix;
12112 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
12113 PL_collation_standard = proto_perl->Icollation_standard;
12114 PL_collxfrm_base = proto_perl->Icollxfrm_base;
12115 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
12116#endif /* USE_LOCALE_COLLATE */
12117
12118#ifdef USE_LOCALE_NUMERIC
12119 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
12120 PL_numeric_standard = proto_perl->Inumeric_standard;
12121 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 12122 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
12123#endif /* !USE_LOCALE_NUMERIC */
12124
12125 /* utf8 character classes */
d2d73c3e
AB
12126 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
12127 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
12128 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
12129 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
12130 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
12131 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
12132 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
12133 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
12134 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
12135 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
12136 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
12137 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
12138 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
12139 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
12140 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
12141 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
12142 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
b4e400f9 12143 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
82686b01
JH
12144 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
12145 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 12146
6c3182a5 12147 /* Did the locale setup indicate UTF-8? */
9769094f 12148 PL_utf8locale = proto_perl->Iutf8locale;
6c3182a5
JH
12149 /* Unicode features (see perlrun/-C) */
12150 PL_unicode = proto_perl->Iunicode;
12151
12152 /* Pre-5.8 signals control */
12153 PL_signals = proto_perl->Isignals;
12154
12155 /* times() ticks per second */
12156 PL_clocktick = proto_perl->Iclocktick;
12157
12158 /* Recursion stopper for PerlIO_find_layer */
12159 PL_in_load_module = proto_perl->Iin_load_module;
12160
12161 /* sort() routine */
12162 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
12163
57c6e6d2
JH
12164 /* Not really needed/useful since the reenrant_retint is "volatile",
12165 * but do it for consistency's sake. */
12166 PL_reentrant_retint = proto_perl->Ireentrant_retint;
12167
15a5279a
JH
12168 /* Hooks to shared SVs and locks. */
12169 PL_sharehook = proto_perl->Isharehook;
12170 PL_lockhook = proto_perl->Ilockhook;
12171 PL_unlockhook = proto_perl->Iunlockhook;
12172 PL_threadhook = proto_perl->Ithreadhook;
12173
bce260cd
JH
12174 PL_runops_std = proto_perl->Irunops_std;
12175 PL_runops_dbg = proto_perl->Irunops_dbg;
12176
12177#ifdef THREADS_HAVE_PIDS
12178 PL_ppid = proto_perl->Ippid;
12179#endif
12180
1d7c1841
GS
12181 /* swatch cache */
12182 PL_last_swash_hv = Nullhv; /* reinits on demand */
12183 PL_last_swash_klen = 0;
12184 PL_last_swash_key[0]= '\0';
12185 PL_last_swash_tmps = (U8*)NULL;
12186 PL_last_swash_slen = 0;
12187
1d7c1841
GS
12188 PL_glob_index = proto_perl->Iglob_index;
12189 PL_srand_called = proto_perl->Isrand_called;
504f80c1 12190 PL_hash_seed = proto_perl->Ihash_seed;
008fb0c0 12191 PL_rehash_seed = proto_perl->Irehash_seed;
1d7c1841
GS
12192 PL_uudmap['M'] = 0; /* reinits on demand */
12193 PL_bitcount = Nullch; /* reinits on demand */
12194
66fe0623
NIS
12195 if (proto_perl->Ipsig_pend) {
12196 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 12197 }
66fe0623
NIS
12198 else {
12199 PL_psig_pend = (int*)NULL;
12200 }
12201
1d7c1841 12202 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
12203 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
12204 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 12205 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
12206 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
12207 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
12208 }
12209 }
12210 else {
12211 PL_psig_ptr = (SV**)NULL;
12212 PL_psig_name = (SV**)NULL;
12213 }
12214
12215 /* thrdvar.h stuff */
12216
a0739874 12217 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
12218 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
12219 PL_tmps_ix = proto_perl->Ttmps_ix;
12220 PL_tmps_max = proto_perl->Ttmps_max;
12221 PL_tmps_floor = proto_perl->Ttmps_floor;
12222 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
12223 i = 0;
12224 while (i <= PL_tmps_ix) {
d2d73c3e 12225 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
12226 ++i;
12227 }
12228
12229 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
12230 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
12231 Newz(54, PL_markstack, i, I32);
12232 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
12233 - proto_perl->Tmarkstack);
12234 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
12235 - proto_perl->Tmarkstack);
12236 Copy(proto_perl->Tmarkstack, PL_markstack,
12237 PL_markstack_ptr - PL_markstack + 1, I32);
12238
12239 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
12240 * NOTE: unlike the others! */
12241 PL_scopestack_ix = proto_perl->Tscopestack_ix;
12242 PL_scopestack_max = proto_perl->Tscopestack_max;
12243 Newz(54, PL_scopestack, PL_scopestack_max, I32);
12244 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
12245
1d7c1841 12246 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 12247 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
12248
12249 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
12250 PL_curstack = av_dup(proto_perl->Tcurstack, param);
12251 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
12252
12253 /* next PUSHs() etc. set *(PL_stack_sp+1) */
12254 PL_stack_base = AvARRAY(PL_curstack);
12255 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
12256 - proto_perl->Tstack_base);
12257 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
12258
12259 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
12260 * NOTE: unlike the others! */
12261 PL_savestack_ix = proto_perl->Tsavestack_ix;
12262 PL_savestack_max = proto_perl->Tsavestack_max;
12263 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 12264 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
12265 }
12266 else {
12267 init_stacks();
985e7056 12268 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
12269 }
12270
12271 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
12272 PL_top_env = &PL_start_env;
12273
12274 PL_op = proto_perl->Top;
12275
12276 PL_Sv = Nullsv;
12277 PL_Xpv = (XPV*)NULL;
12278 PL_na = proto_perl->Tna;
12279
12280 PL_statbuf = proto_perl->Tstatbuf;
12281 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
12282 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
12283 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
12284#ifdef HAS_TIMES
12285 PL_timesbuf = proto_perl->Ttimesbuf;
12286#endif
12287
12288 PL_tainted = proto_perl->Ttainted;
12289 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
12290 PL_rs = sv_dup_inc(proto_perl->Trs, param);
12291 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
12292 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
12293 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 12294 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
12295 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
12296 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
12297 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
12298
12299 PL_restartop = proto_perl->Trestartop;
12300 PL_in_eval = proto_perl->Tin_eval;
12301 PL_delaymagic = proto_perl->Tdelaymagic;
12302 PL_dirty = proto_perl->Tdirty;
12303 PL_localizing = proto_perl->Tlocalizing;
12304
d2d73c3e 12305 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
dd28f7bb 12306 PL_hv_fetch_ent_mh = Nullhe;
1d7c1841
GS
12307 PL_modcount = proto_perl->Tmodcount;
12308 PL_lastgotoprobe = Nullop;
12309 PL_dumpindent = proto_perl->Tdumpindent;
12310
12311 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
12312 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
12313 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
12314 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
12315 PL_sortcxix = proto_perl->Tsortcxix;
12316 PL_efloatbuf = Nullch; /* reinits on demand */
12317 PL_efloatsize = 0; /* reinits on demand */
12318
12319 /* regex stuff */
12320
12321 PL_screamfirst = NULL;
12322 PL_screamnext = NULL;
12323 PL_maxscream = -1; /* reinits on demand */
12324 PL_lastscream = Nullsv;
12325
12326 PL_watchaddr = NULL;
12327 PL_watchok = Nullch;
12328
12329 PL_regdummy = proto_perl->Tregdummy;
1d7c1841
GS
12330 PL_regprecomp = Nullch;
12331 PL_regnpar = 0;
12332 PL_regsize = 0;
1d7c1841
GS
12333 PL_colorset = 0; /* reinits PL_colors[] */
12334 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841
GS
12335 PL_reginput = Nullch;
12336 PL_regbol = Nullch;
12337 PL_regeol = Nullch;
12338 PL_regstartp = (I32*)NULL;
12339 PL_regendp = (I32*)NULL;
12340 PL_reglastparen = (U32*)NULL;
2d862feb 12341 PL_reglastcloseparen = (U32*)NULL;
1d7c1841 12342 PL_regtill = Nullch;
1d7c1841
GS
12343 PL_reg_start_tmp = (char**)NULL;
12344 PL_reg_start_tmpl = 0;
12345 PL_regdata = (struct reg_data*)NULL;
12346 PL_bostr = Nullch;
12347 PL_reg_flags = 0;
12348 PL_reg_eval_set = 0;
12349 PL_regnarrate = 0;
12350 PL_regprogram = (regnode*)NULL;
12351 PL_regindent = 0;
12352 PL_regcc = (CURCUR*)NULL;
12353 PL_reg_call_cc = (struct re_cc_state*)NULL;
12354 PL_reg_re = (regexp*)NULL;
12355 PL_reg_ganch = Nullch;
12356 PL_reg_sv = Nullsv;
53c4c00c 12357 PL_reg_match_utf8 = FALSE;
1d7c1841
GS
12358 PL_reg_magic = (MAGIC*)NULL;
12359 PL_reg_oldpos = 0;
12360 PL_reg_oldcurpm = (PMOP*)NULL;
12361 PL_reg_curpm = (PMOP*)NULL;
12362 PL_reg_oldsaved = Nullch;
12363 PL_reg_oldsavedlen = 0;
ed252734 12364#ifdef PERL_COPY_ON_WRITE
504cff3b 12365 PL_nrs = Nullsv;
ed252734 12366#endif
1d7c1841
GS
12367 PL_reg_maxiter = 0;
12368 PL_reg_leftiter = 0;
12369 PL_reg_poscache = Nullch;
12370 PL_reg_poscache_size= 0;
12371
12372 /* RE engine - function pointers */
12373 PL_regcompp = proto_perl->Tregcompp;
12374 PL_regexecp = proto_perl->Tregexecp;
12375 PL_regint_start = proto_perl->Tregint_start;
12376 PL_regint_string = proto_perl->Tregint_string;
12377 PL_regfree = proto_perl->Tregfree;
12378
12379 PL_reginterp_cnt = 0;
12380 PL_reg_starttry = 0;
12381
a2efc822
SC
12382 /* Pluggable optimizer */
12383 PL_peepp = proto_perl->Tpeepp;
12384
081fc587
AB
12385 PL_stashcache = newHV();
12386
a0739874
DM
12387 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
12388 ptr_table_free(PL_ptr_table);
12389 PL_ptr_table = NULL;
12390 }
8cf8f3d1 12391
f284b03f
AMS
12392 /* Call the ->CLONE method, if it exists, for each of the stashes
12393 identified by sv_dup() above.
12394 */
d2d73c3e
AB
12395 while(av_len(param->stashes) != -1) {
12396 HV* stash = (HV*) av_shift(param->stashes);
f284b03f
AMS
12397 GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
12398 if (cloner && GvCV(cloner)) {
12399 dSP;
12400 ENTER;
12401 SAVETMPS;
12402 PUSHMARK(SP);
9660f481 12403 XPUSHs(sv_2mortal(newSVpv(HvNAME(stash), 0)));
f284b03f
AMS
12404 PUTBACK;
12405 call_sv((SV*)GvCV(cloner), G_DISCARD);
12406 FREETMPS;
12407 LEAVE;
12408 }
4a09accc 12409 }
a0739874 12410
dc507217 12411 SvREFCNT_dec(param->stashes);
dc507217 12412
6d26897e
DM
12413 /* orphaned? eg threads->new inside BEGIN or use */
12414 if (PL_compcv && ! SvREFCNT(PL_compcv)) {
a3b680e6 12415 (void)SvREFCNT_inc(PL_compcv);
6d26897e
DM
12416 SAVEFREESV(PL_compcv);
12417 }
12418
1d7c1841 12419 return my_perl;
1d7c1841
GS
12420}
12421
1d7c1841 12422#endif /* USE_ITHREADS */
a0ae6670 12423
9f4817db 12424/*
ccfc67b7
JH
12425=head1 Unicode Support
12426
9f4817db
JH
12427=for apidoc sv_recode_to_utf8
12428
5d170f3a
JH
12429The encoding is assumed to be an Encode object, on entry the PV
12430of the sv is assumed to be octets in that encoding, and the sv
12431will be converted into Unicode (and UTF-8).
9f4817db 12432
5d170f3a
JH
12433If the sv already is UTF-8 (or if it is not POK), or if the encoding
12434is not a reference, nothing is done to the sv. If the encoding is not
1768d7eb
JH
12435an C<Encode::XS> Encoding object, bad things will happen.
12436(See F<lib/encoding.pm> and L<Encode>).
9f4817db 12437
5d170f3a 12438The PV of the sv is returned.
9f4817db 12439
5d170f3a
JH
12440=cut */
12441
12442char *
12443Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
12444{
27da23d5 12445 dVAR;
220e2d4e 12446 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
d0063567
DK
12447 SV *uni;
12448 STRLEN len;
12449 char *s;
12450 dSP;
12451 ENTER;
12452 SAVETMPS;
220e2d4e 12453 save_re_context();
d0063567
DK
12454 PUSHMARK(sp);
12455 EXTEND(SP, 3);
12456 XPUSHs(encoding);
12457 XPUSHs(sv);
7a5fa8a2 12458/*
f9893866
NIS
12459 NI-S 2002/07/09
12460 Passing sv_yes is wrong - it needs to be or'ed set of constants
7a5fa8a2 12461 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
f9893866
NIS
12462 remove converted chars from source.
12463
12464 Both will default the value - let them.
7a5fa8a2 12465
d0063567 12466 XPUSHs(&PL_sv_yes);
f9893866 12467*/
d0063567
DK
12468 PUTBACK;
12469 call_method("decode", G_SCALAR);
12470 SPAGAIN;
12471 uni = POPs;
12472 PUTBACK;
12473 s = SvPV(uni, len);
d0063567
DK
12474 if (s != SvPVX(sv)) {
12475 SvGROW(sv, len + 1);
12476 Move(s, SvPVX(sv), len, char);
12477 SvCUR_set(sv, len);
12478 SvPVX(sv)[len] = 0;
12479 }
12480 FREETMPS;
12481 LEAVE;
d0063567 12482 SvUTF8_on(sv);
95899a2a 12483 return SvPVX(sv);
f9893866 12484 }
95899a2a 12485 return SvPOKp(sv) ? SvPVX(sv) : NULL;
9f4817db
JH
12486}
12487
220e2d4e
IH
12488/*
12489=for apidoc sv_cat_decode
12490
12491The encoding is assumed to be an Encode object, the PV of the ssv is
12492assumed to be octets in that encoding and decoding the input starts
12493from the position which (PV + *offset) pointed to. The dsv will be
12494concatenated the decoded UTF-8 string from ssv. Decoding will terminate
12495when the string tstr appears in decoding output or the input ends on
12496the PV of the ssv. The value which the offset points will be modified
12497to the last input position on the ssv.
68795e93 12498
220e2d4e
IH
12499Returns TRUE if the terminator was found, else returns FALSE.
12500
12501=cut */
12502
12503bool
12504Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
12505 SV *ssv, int *offset, char *tstr, int tlen)
12506{
27da23d5 12507 dVAR;
a73e8557 12508 bool ret = FALSE;
220e2d4e 12509 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
220e2d4e
IH
12510 SV *offsv;
12511 dSP;
12512 ENTER;
12513 SAVETMPS;
12514 save_re_context();
12515 PUSHMARK(sp);
12516 EXTEND(SP, 6);
12517 XPUSHs(encoding);
12518 XPUSHs(dsv);
12519 XPUSHs(ssv);
12520 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
12521 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
12522 PUTBACK;
12523 call_method("cat_decode", G_SCALAR);
12524 SPAGAIN;
12525 ret = SvTRUE(TOPs);
12526 *offset = SvIV(offsv);
12527 PUTBACK;
12528 FREETMPS;
12529 LEAVE;
220e2d4e 12530 }
a73e8557
JH
12531 else
12532 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
12533 return ret;
220e2d4e 12534}
f9893866 12535
241d1a3b
NC
12536/*
12537 * Local variables:
12538 * c-indentation-style: bsd
12539 * c-basic-offset: 4
12540 * indent-tabs-mode: t
12541 * End:
12542 *
37442d52
RGS
12543 * ex: set ts=8 sts=4 sw=4 noet:
12544 */