This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Teeny optimization in S_hv_magic_check
[perl5.git] / sv.c
CommitLineData
a0d0e21e 1/* sv.c
79072805 2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
241d1a3b 4 * 2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
79072805
LW
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
a0d0e21e 9 * "I wonder what the Entish is for 'yes' and 'no'," he thought.
645c22ef
DM
10 *
11 *
5e045b90
AMS
12 * This file contains the code that creates, manipulates and destroys
13 * scalar values (SVs). The other types (AV, HV, GV, etc.) reuse the
14 * structure of an SV, so their creation and destruction is handled
15 * here; higher-level functions are in av.c, hv.c, and so on. Opcode
16 * level functions (eg. substr, split, join) for each of the types are
17 * in the pp*.c files.
79072805
LW
18 */
19
20#include "EXTERN.h"
864dbfa3 21#define PERL_IN_SV_C
79072805 22#include "perl.h"
d2f185dc 23#include "regcomp.h"
79072805 24
51371543 25#define FCALL *f
2c5424a7 26
2f8ed50e
OS
27#ifdef __Lynx__
28/* Missing proto on LynxOS */
29 char *gconvert(double, int, int, char *);
30#endif
31
e23c8137
JH
32#ifdef PERL_UTF8_CACHE_ASSERT
33/* The cache element 0 is the Unicode offset;
34 * the cache element 1 is the byte offset of the element 0;
35 * the cache element 2 is the Unicode length of the substring;
36 * the cache element 3 is the byte length of the substring;
37 * The checking of the substring side would be good
38 * but substr() has enough code paths to make my head spin;
39 * if adding more checks watch out for the following tests:
40 * t/op/index.t t/op/length.t t/op/pat.t t/op/substr.t
41 * lib/utf8.t lib/Unicode/Collate/t/index.t
42 * --jhi
43 */
44#define ASSERT_UTF8_CACHE(cache) \
45 STMT_START { if (cache) { assert((cache)[0] <= (cache)[1]); } } STMT_END
46#else
47#define ASSERT_UTF8_CACHE(cache) NOOP
48#endif
49
765f542d
NC
50#ifdef PERL_COPY_ON_WRITE
51#define SV_COW_NEXT_SV(sv) INT2PTR(SV *,SvUVX(sv))
607fa7f2 52#define SV_COW_NEXT_SV_SET(current,next) SvUV_set(current, PTR2UV(next))
b5ccf5f2 53/* This is a pessimistic view. Scalar must be purely a read-write PV to copy-
765f542d 54 on-write. */
765f542d 55#endif
645c22ef
DM
56
57/* ============================================================================
58
59=head1 Allocation and deallocation of SVs.
60
5e045b90
AMS
61An SV (or AV, HV, etc.) is allocated in two parts: the head (struct sv,
62av, hv...) contains type and reference count information, as well as a
63pointer to the body (struct xrv, xpv, xpviv...), which contains fields
64specific to each type.
65
4977e971
NC
66Normally, this allocation is done using arenas, which by default are
67approximately 4K chunks of memory parcelled up into N heads or bodies. The
68first slot in each arena is reserved, and is used to hold a link to the next
69arena. In the case of heads, the unused first slot also contains some flags
70and a note of the number of slots. Snaked through each arena chain is a
5e045b90 71linked list of free items; when this becomes empty, an extra arena is
4977e971 72allocated and divided up into N items which are threaded into the free list.
645c22ef
DM
73
74The following global variables are associated with arenas:
75
76 PL_sv_arenaroot pointer to list of SV arenas
77 PL_sv_root pointer to list of free SV structures
78
79 PL_foo_arenaroot pointer to list of foo arenas,
80 PL_foo_root pointer to list of free foo bodies
81 ... for foo in xiv, xnv, xrv, xpv etc.
82
83Note that some of the larger and more rarely used body types (eg xpvio)
84are not allocated using arenas, but are instead just malloc()/free()ed as
85required. Also, if PURIFY is defined, arenas are abandoned altogether,
86with all items individually malloc()ed. In addition, a few SV heads are
87not allocated from an arena, but are instead directly created as static
4977e971
NC
88or auto variables, eg PL_sv_undef. The size of arenas can be changed from
89the default by setting PERL_ARENA_SIZE appropriately at compile time.
645c22ef
DM
90
91The SV arena serves the secondary purpose of allowing still-live SVs
92to be located and destroyed during final cleanup.
93
94At the lowest level, the macros new_SV() and del_SV() grab and free
95an SV head. (If debugging with -DD, del_SV() calls the function S_del_sv()
96to return the SV to the free list with error checking.) new_SV() calls
97more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
98SVs in the free list have their SvTYPE field set to all ones.
99
100Similarly, there are macros new_XIV()/del_XIV(), new_XNV()/del_XNV() etc
101that allocate and return individual body types. Normally these are mapped
ff276b08
RG
102to the arena-manipulating functions new_xiv()/del_xiv() etc, but may be
103instead mapped directly to malloc()/free() if PURIFY is defined. The
645c22ef
DM
104new/del functions remove from, or add to, the appropriate PL_foo_root
105list, and call more_xiv() etc to add a new arena if the list is empty.
106
ff276b08 107At the time of very final cleanup, sv_free_arenas() is called from
645c22ef
DM
108perl_destruct() to physically free all the arenas allocated since the
109start of the interpreter. Note that this also clears PL_he_arenaroot,
110which is otherwise dealt with in hv.c.
111
112Manipulation of any of the PL_*root pointers is protected by enclosing
113LOCK_SV_MUTEX; ... UNLOCK_SV_MUTEX calls which should Do the Right Thing
114if threads are enabled.
115
116The function visit() scans the SV arenas list, and calls a specified
117function for each SV it finds which is still live - ie which has an SvTYPE
118other than all 1's, and a non-zero SvREFCNT. visit() is used by the
119following functions (specified as [function that calls visit()] / [function
120called by visit() for each SV]):
121
122 sv_report_used() / do_report_used()
123 dump all remaining SVs (debugging aid)
124
125 sv_clean_objs() / do_clean_objs(),do_clean_named_objs()
126 Attempt to free all objects pointed to by RVs,
127 and, unless DISABLE_DESTRUCTOR_KLUDGE is defined,
128 try to do the same for all objects indirectly
129 referenced by typeglobs too. Called once from
130 perl_destruct(), prior to calling sv_clean_all()
131 below.
132
133 sv_clean_all() / do_clean_all()
134 SvREFCNT_dec(sv) each remaining SV, possibly
135 triggering an sv_free(). It also sets the
136 SVf_BREAK flag on the SV to indicate that the
137 refcnt has been artificially lowered, and thus
138 stopping sv_free() from giving spurious warnings
139 about SVs which unexpectedly have a refcnt
140 of zero. called repeatedly from perl_destruct()
141 until there are no SVs left.
142
143=head2 Summary
144
145Private API to rest of sv.c
146
147 new_SV(), del_SV(),
148
149 new_XIV(), del_XIV(),
150 new_XNV(), del_XNV(),
151 etc
152
153Public API:
154
8cf8f3d1 155 sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
645c22ef
DM
156
157
158=cut
159
160============================================================================ */
161
162
51371543 163
4561caa4
CS
164/*
165 * "A time to plant, and a time to uproot what was planted..."
166 */
167
cac9b346 168
fd0854ff
DM
169#ifdef DEBUG_LEAKING_SCALARS
170# ifdef NETWARE
171# define FREE_SV_DEBUG_FILE(sv) PerlMemfree((sv)->sv_debug_file)
172# else
173# define FREE_SV_DEBUG_FILE(sv) PerlMemShared_free((sv)->sv_debug_file)
174# endif
175#else
176# define FREE_SV_DEBUG_FILE(sv)
177#endif
178
053fc874
GS
179#define plant_SV(p) \
180 STMT_START { \
fd0854ff 181 FREE_SV_DEBUG_FILE(p); \
053fc874
GS
182 SvANY(p) = (void *)PL_sv_root; \
183 SvFLAGS(p) = SVTYPEMASK; \
184 PL_sv_root = (p); \
185 --PL_sv_count; \
186 } STMT_END
a0d0e21e 187
fba3b22e 188/* sv_mutex must be held while calling uproot_SV() */
053fc874
GS
189#define uproot_SV(p) \
190 STMT_START { \
191 (p) = PL_sv_root; \
192 PL_sv_root = (SV*)SvANY(p); \
193 ++PL_sv_count; \
194 } STMT_END
195
645c22ef 196
cac9b346
NC
197/* make some more SVs by adding another arena */
198
199/* sv_mutex must be held while calling more_sv() */
200STATIC SV*
201S_more_sv(pTHX)
202{
203 SV* sv;
204
205 if (PL_nice_chunk) {
206 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
207 PL_nice_chunk = Nullch;
208 PL_nice_chunk_size = 0;
209 }
210 else {
211 char *chunk; /* must use New here to match call to */
2e7ed132
NC
212 New(704,chunk,PERL_ARENA_SIZE,char); /* Safefree() in sv_free_arenas() */
213 sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
cac9b346
NC
214 }
215 uproot_SV(sv);
216 return sv;
217}
218
645c22ef
DM
219/* new_SV(): return a new, empty SV head */
220
eba0f806
DM
221#ifdef DEBUG_LEAKING_SCALARS
222/* provide a real function for a debugger to play with */
223STATIC SV*
224S_new_SV(pTHX)
225{
226 SV* sv;
227
228 LOCK_SV_MUTEX;
229 if (PL_sv_root)
230 uproot_SV(sv);
231 else
cac9b346 232 sv = S_more_sv(aTHX);
eba0f806
DM
233 UNLOCK_SV_MUTEX;
234 SvANY(sv) = 0;
235 SvREFCNT(sv) = 1;
236 SvFLAGS(sv) = 0;
fd0854ff
DM
237 sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
238 sv->sv_debug_line = (U16) ((PL_copline == NOLINE) ?
239 (PL_curcop ? CopLINE(PL_curcop) : 0) : PL_copline);
240 sv->sv_debug_inpad = 0;
241 sv->sv_debug_cloned = 0;
242# ifdef NETWARE
243 sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
244# else
245 sv->sv_debug_file = PL_curcop ? savesharedpv(CopFILE(PL_curcop)): NULL;
246# endif
247
eba0f806
DM
248 return sv;
249}
250# define new_SV(p) (p)=S_new_SV(aTHX)
251
252#else
253# define new_SV(p) \
053fc874
GS
254 STMT_START { \
255 LOCK_SV_MUTEX; \
256 if (PL_sv_root) \
257 uproot_SV(p); \
258 else \
cac9b346 259 (p) = S_more_sv(aTHX); \
053fc874
GS
260 UNLOCK_SV_MUTEX; \
261 SvANY(p) = 0; \
262 SvREFCNT(p) = 1; \
263 SvFLAGS(p) = 0; \
264 } STMT_END
eba0f806 265#endif
463ee0b2 266
645c22ef
DM
267
268/* del_SV(): return an empty SV head to the free list */
269
a0d0e21e 270#ifdef DEBUGGING
4561caa4 271
053fc874
GS
272#define del_SV(p) \
273 STMT_START { \
274 LOCK_SV_MUTEX; \
aea4f609 275 if (DEBUG_D_TEST) \
053fc874
GS
276 del_sv(p); \
277 else \
278 plant_SV(p); \
279 UNLOCK_SV_MUTEX; \
280 } STMT_END
a0d0e21e 281
76e3520e 282STATIC void
cea2e8a9 283S_del_sv(pTHX_ SV *p)
463ee0b2 284{
aea4f609 285 if (DEBUG_D_TEST) {
4633a7c4 286 SV* sva;
a3b680e6 287 bool ok = 0;
3280af22 288 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
a3b680e6
AL
289 SV *sv = sva + 1;
290 SV *svend = &sva[SvREFCNT(sva)];
c0ff570e 291 if (p >= sv && p < svend) {
a0d0e21e 292 ok = 1;
c0ff570e
NC
293 break;
294 }
a0d0e21e
LW
295 }
296 if (!ok) {
0453d815 297 if (ckWARN_d(WARN_INTERNAL))
9014280d 298 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
299 "Attempt to free non-arena SV: 0x%"UVxf
300 pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
a0d0e21e
LW
301 return;
302 }
303 }
4561caa4 304 plant_SV(p);
463ee0b2 305}
a0d0e21e 306
4561caa4
CS
307#else /* ! DEBUGGING */
308
309#define del_SV(p) plant_SV(p)
310
311#endif /* DEBUGGING */
463ee0b2 312
645c22ef
DM
313
314/*
ccfc67b7
JH
315=head1 SV Manipulation Functions
316
645c22ef
DM
317=for apidoc sv_add_arena
318
319Given a chunk of memory, link it to the head of the list of arenas,
320and split it into a list of free SVs.
321
322=cut
323*/
324
4633a7c4 325void
864dbfa3 326Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
463ee0b2 327{
4633a7c4 328 SV* sva = (SV*)ptr;
463ee0b2
LW
329 register SV* sv;
330 register SV* svend;
4633a7c4
LW
331
332 /* The first SV in an arena isn't an SV. */
3280af22 333 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
334 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
335 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
336
3280af22
NIS
337 PL_sv_arenaroot = sva;
338 PL_sv_root = sva + 1;
4633a7c4
LW
339
340 svend = &sva[SvREFCNT(sva) - 1];
341 sv = sva + 1;
463ee0b2 342 while (sv < svend) {
a0d0e21e 343 SvANY(sv) = (void *)(SV*)(sv + 1);
03e36789 344#ifdef DEBUGGING
978b032e 345 SvREFCNT(sv) = 0;
03e36789
NC
346#endif
347 /* Must always set typemask because it's awlays checked in on cleanup
348 when the arenas are walked looking for objects. */
8990e307 349 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
350 sv++;
351 }
352 SvANY(sv) = 0;
03e36789
NC
353#ifdef DEBUGGING
354 SvREFCNT(sv) = 0;
355#endif
4633a7c4
LW
356 SvFLAGS(sv) = SVTYPEMASK;
357}
358
055972dc
DM
359/* visit(): call the named function for each non-free SV in the arenas
360 * whose flags field matches the flags/mask args. */
645c22ef 361
5226ed68 362STATIC I32
055972dc 363S_visit(pTHX_ SVFUNC_t f, U32 flags, U32 mask)
8990e307 364{
4633a7c4 365 SV* sva;
5226ed68 366 I32 visited = 0;
8990e307 367
3280af22 368 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
a3b680e6
AL
369 register SV * const svend = &sva[SvREFCNT(sva)];
370 register SV* sv;
4561caa4 371 for (sv = sva + 1; sv < svend; ++sv) {
055972dc
DM
372 if (SvTYPE(sv) != SVTYPEMASK
373 && (sv->sv_flags & mask) == flags
374 && SvREFCNT(sv))
375 {
acfe0abc 376 (FCALL)(aTHX_ sv);
5226ed68
JH
377 ++visited;
378 }
8990e307
LW
379 }
380 }
5226ed68 381 return visited;
8990e307
LW
382}
383
758a08c3
JH
384#ifdef DEBUGGING
385
645c22ef
DM
386/* called by sv_report_used() for each live SV */
387
388static void
acfe0abc 389do_report_used(pTHX_ SV *sv)
645c22ef
DM
390{
391 if (SvTYPE(sv) != SVTYPEMASK) {
392 PerlIO_printf(Perl_debug_log, "****\n");
393 sv_dump(sv);
394 }
395}
758a08c3 396#endif
645c22ef
DM
397
398/*
399=for apidoc sv_report_used
400
401Dump the contents of all SVs not yet freed. (Debugging aid).
402
403=cut
404*/
405
8990e307 406void
864dbfa3 407Perl_sv_report_used(pTHX)
4561caa4 408{
ff270d3a 409#ifdef DEBUGGING
055972dc 410 visit(do_report_used, 0, 0);
ff270d3a 411#endif
4561caa4
CS
412}
413
645c22ef
DM
414/* called by sv_clean_objs() for each live SV */
415
416static void
acfe0abc 417do_clean_objs(pTHX_ SV *sv)
645c22ef
DM
418{
419 SV* rv;
420
421 if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
422 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv)));
423 if (SvWEAKREF(sv)) {
424 sv_del_backref(sv);
425 SvWEAKREF_off(sv);
b162af07 426 SvRV_set(sv, NULL);
645c22ef
DM
427 } else {
428 SvROK_off(sv);
b162af07 429 SvRV_set(sv, NULL);
645c22ef
DM
430 SvREFCNT_dec(rv);
431 }
432 }
433
434 /* XXX Might want to check arrays, etc. */
435}
436
437/* called by sv_clean_objs() for each live SV */
438
439#ifndef DISABLE_DESTRUCTOR_KLUDGE
440static void
acfe0abc 441do_clean_named_objs(pTHX_ SV *sv)
645c22ef
DM
442{
443 if (SvTYPE(sv) == SVt_PVGV && GvGP(sv)) {
444 if ( SvOBJECT(GvSV(sv)) ||
445 (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
446 (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
447 (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
448 (GvCV(sv) && SvOBJECT(GvCV(sv))) )
449 {
450 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
ec5f3c78 451 SvFLAGS(sv) |= SVf_BREAK;
645c22ef
DM
452 SvREFCNT_dec(sv);
453 }
454 }
455}
456#endif
457
458/*
459=for apidoc sv_clean_objs
460
461Attempt to destroy all objects not yet freed
462
463=cut
464*/
465
4561caa4 466void
864dbfa3 467Perl_sv_clean_objs(pTHX)
4561caa4 468{
3280af22 469 PL_in_clean_objs = TRUE;
055972dc 470 visit(do_clean_objs, SVf_ROK, SVf_ROK);
4561caa4 471#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 472 /* some barnacles may yet remain, clinging to typeglobs */
055972dc 473 visit(do_clean_named_objs, SVt_PVGV, SVTYPEMASK);
4561caa4 474#endif
3280af22 475 PL_in_clean_objs = FALSE;
4561caa4
CS
476}
477
645c22ef
DM
478/* called by sv_clean_all() for each live SV */
479
480static void
acfe0abc 481do_clean_all(pTHX_ SV *sv)
645c22ef
DM
482{
483 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
484 SvFLAGS(sv) |= SVf_BREAK;
0e705b3b
DM
485 if (PL_comppad == (AV*)sv) {
486 PL_comppad = Nullav;
487 PL_curpad = Null(SV**);
488 }
645c22ef
DM
489 SvREFCNT_dec(sv);
490}
491
492/*
493=for apidoc sv_clean_all
494
495Decrement the refcnt of each remaining SV, possibly triggering a
496cleanup. This function may have to be called multiple times to free
ff276b08 497SVs which are in complex self-referential hierarchies.
645c22ef
DM
498
499=cut
500*/
501
5226ed68 502I32
864dbfa3 503Perl_sv_clean_all(pTHX)
8990e307 504{
5226ed68 505 I32 cleaned;
3280af22 506 PL_in_clean_all = TRUE;
055972dc 507 cleaned = visit(do_clean_all, 0,0);
3280af22 508 PL_in_clean_all = FALSE;
5226ed68 509 return cleaned;
8990e307 510}
463ee0b2 511
645c22ef
DM
512/*
513=for apidoc sv_free_arenas
514
515Deallocate the memory used by all arenas. Note that all the individual SV
516heads and bodies within the arenas must already have been freed.
517
518=cut
519*/
520
4633a7c4 521void
864dbfa3 522Perl_sv_free_arenas(pTHX)
4633a7c4
LW
523{
524 SV* sva;
525 SV* svanext;
7b2c381c 526 void *arena, *arenanext;
4633a7c4
LW
527
528 /* Free arenas here, but be careful about fake ones. (We assume
529 contiguity of the fake ones with the corresponding real ones.) */
530
3280af22 531 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
532 svanext = (SV*) SvANY(sva);
533 while (svanext && SvFAKE(svanext))
534 svanext = (SV*) SvANY(svanext);
535
536 if (!SvFAKE(sva))
1df70142 537 Safefree(sva);
4633a7c4 538 }
5f05dabc 539
612f20c3 540 for (arena = PL_xnv_arenaroot; arena; arena = arenanext) {
7b2c381c 541 arenanext = *(void **)arena;
612f20c3
GS
542 Safefree(arena);
543 }
544 PL_xnv_arenaroot = 0;
bf9cdc68 545 PL_xnv_root = 0;
612f20c3 546
612f20c3 547 for (arena = PL_xpv_arenaroot; arena; arena = arenanext) {
7b2c381c 548 arenanext = *(void **)arena;
612f20c3
GS
549 Safefree(arena);
550 }
551 PL_xpv_arenaroot = 0;
bf9cdc68 552 PL_xpv_root = 0;
612f20c3 553
7b2c381c
NC
554 for (arena = PL_xpviv_arenaroot; arena; arena = arenanext) {
555 arenanext = *(void **)arena;
612f20c3
GS
556 Safefree(arena);
557 }
558 PL_xpviv_arenaroot = 0;
bf9cdc68 559 PL_xpviv_root = 0;
612f20c3 560
7b2c381c
NC
561 for (arena = PL_xpvnv_arenaroot; arena; arena = arenanext) {
562 arenanext = *(void **)arena;
612f20c3
GS
563 Safefree(arena);
564 }
565 PL_xpvnv_arenaroot = 0;
bf9cdc68 566 PL_xpvnv_root = 0;
612f20c3 567
7b2c381c
NC
568 for (arena = PL_xpvcv_arenaroot; arena; arena = arenanext) {
569 arenanext = *(void **)arena;
612f20c3
GS
570 Safefree(arena);
571 }
572 PL_xpvcv_arenaroot = 0;
bf9cdc68 573 PL_xpvcv_root = 0;
612f20c3 574
7b2c381c
NC
575 for (arena = PL_xpvav_arenaroot; arena; arena = arenanext) {
576 arenanext = *(void **)arena;
612f20c3
GS
577 Safefree(arena);
578 }
579 PL_xpvav_arenaroot = 0;
bf9cdc68 580 PL_xpvav_root = 0;
612f20c3 581
7b2c381c
NC
582 for (arena = PL_xpvhv_arenaroot; arena; arena = arenanext) {
583 arenanext = *(void **)arena;
612f20c3
GS
584 Safefree(arena);
585 }
586 PL_xpvhv_arenaroot = 0;
bf9cdc68 587 PL_xpvhv_root = 0;
612f20c3 588
7b2c381c
NC
589 for (arena = PL_xpvmg_arenaroot; arena; arena = arenanext) {
590 arenanext = *(void **)arena;
612f20c3
GS
591 Safefree(arena);
592 }
593 PL_xpvmg_arenaroot = 0;
bf9cdc68 594 PL_xpvmg_root = 0;
612f20c3 595
7b2c381c
NC
596 for (arena = PL_xpvgv_arenaroot; arena; arena = arenanext) {
597 arenanext = *(void **)arena;
727879eb
NC
598 Safefree(arena);
599 }
600 PL_xpvgv_arenaroot = 0;
601 PL_xpvgv_root = 0;
602
7b2c381c
NC
603 for (arena = PL_xpvlv_arenaroot; arena; arena = arenanext) {
604 arenanext = *(void **)arena;
612f20c3
GS
605 Safefree(arena);
606 }
607 PL_xpvlv_arenaroot = 0;
bf9cdc68 608 PL_xpvlv_root = 0;
612f20c3 609
7b2c381c
NC
610 for (arena = PL_xpvbm_arenaroot; arena; arena = arenanext) {
611 arenanext = *(void **)arena;
612f20c3
GS
612 Safefree(arena);
613 }
614 PL_xpvbm_arenaroot = 0;
bf9cdc68 615 PL_xpvbm_root = 0;
612f20c3 616
b1135e3d
NC
617 {
618 HE *he;
619 HE *he_next;
620 for (he = PL_he_arenaroot; he; he = he_next) {
621 he_next = HeNEXT(he);
622 Safefree(he);
623 }
612f20c3
GS
624 }
625 PL_he_arenaroot = 0;
bf9cdc68 626 PL_he_root = 0;
612f20c3 627
892b45be 628#if defined(USE_ITHREADS)
b1135e3d
NC
629 {
630 struct ptr_tbl_ent *pte;
631 struct ptr_tbl_ent *pte_next;
632 for (pte = PL_pte_arenaroot; pte; pte = pte_next) {
633 pte_next = pte->next;
634 Safefree(pte);
635 }
32e691d0
NC
636 }
637 PL_pte_arenaroot = 0;
638 PL_pte_root = 0;
892b45be 639#endif
32e691d0 640
3280af22
NIS
641 if (PL_nice_chunk)
642 Safefree(PL_nice_chunk);
643 PL_nice_chunk = Nullch;
644 PL_nice_chunk_size = 0;
645 PL_sv_arenaroot = 0;
646 PL_sv_root = 0;
4633a7c4
LW
647}
648
29489e7c
DM
649/* ---------------------------------------------------------------------
650 *
651 * support functions for report_uninit()
652 */
653
654/* the maxiumum size of array or hash where we will scan looking
655 * for the undefined element that triggered the warning */
656
657#define FUV_MAX_SEARCH_SIZE 1000
658
659/* Look for an entry in the hash whose value has the same SV as val;
660 * If so, return a mortal copy of the key. */
661
662STATIC SV*
663S_find_hash_subscript(pTHX_ HV *hv, SV* val)
664{
27da23d5 665 dVAR;
29489e7c 666 register HE **array;
29489e7c
DM
667 I32 i;
668
669 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
670 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
671 return Nullsv;
672
673 array = HvARRAY(hv);
674
675 for (i=HvMAX(hv); i>0; i--) {
f54cb97a 676 register HE *entry;
29489e7c
DM
677 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
678 if (HeVAL(entry) != val)
679 continue;
680 if ( HeVAL(entry) == &PL_sv_undef ||
681 HeVAL(entry) == &PL_sv_placeholder)
682 continue;
683 if (!HeKEY(entry))
684 return Nullsv;
685 if (HeKLEN(entry) == HEf_SVKEY)
686 return sv_mortalcopy(HeKEY_sv(entry));
687 return sv_2mortal(newSVpvn(HeKEY(entry), HeKLEN(entry)));
688 }
689 }
690 return Nullsv;
691}
692
693/* Look for an entry in the array whose value has the same SV as val;
694 * If so, return the index, otherwise return -1. */
695
696STATIC I32
697S_find_array_subscript(pTHX_ AV *av, SV* val)
698{
699 SV** svp;
700 I32 i;
701 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
702 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
703 return -1;
704
705 svp = AvARRAY(av);
706 for (i=AvFILLp(av); i>=0; i--) {
707 if (svp[i] == val && svp[i] != &PL_sv_undef)
708 return i;
709 }
710 return -1;
711}
712
713/* S_varname(): return the name of a variable, optionally with a subscript.
714 * If gv is non-zero, use the name of that global, along with gvtype (one
715 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
716 * targ. Depending on the value of the subscript_type flag, return:
717 */
718
719#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
720#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
721#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
722#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
723
724STATIC SV*
bfed75c6 725S_varname(pTHX_ GV *gv, const char *gvtype, PADOFFSET targ,
29489e7c
DM
726 SV* keyname, I32 aindex, int subscript_type)
727{
728 AV *av;
a3b680e6 729 SV *sv;
29489e7c 730
a3b680e6 731 SV * const name = sv_newmortal();
29489e7c
DM
732 if (gv) {
733
734 /* simulate gv_fullname4(), but add literal '^' for $^FOO names
735 * XXX get rid of all this if gv_fullnameX() ever supports this
736 * directly */
737
bfed75c6 738 const char *p;
29489e7c
DM
739 HV *hv = GvSTASH(gv);
740 sv_setpv(name, gvtype);
741 if (!hv)
742 p = "???";
bfcb3514 743 else if (!(p=HvNAME_get(hv)))
29489e7c 744 p = "__ANON__";
29489e7c
DM
745 if (strNE(p, "main")) {
746 sv_catpv(name,p);
747 sv_catpvn(name,"::", 2);
748 }
749 if (GvNAMELEN(gv)>= 1 &&
750 ((unsigned int)*GvNAME(gv)) <= 26)
751 { /* handle $^FOO */
752 Perl_sv_catpvf(aTHX_ name,"^%c", *GvNAME(gv) + 'A' - 1);
753 sv_catpvn(name,GvNAME(gv)+1,GvNAMELEN(gv)-1);
754 }
755 else
756 sv_catpvn(name,GvNAME(gv),GvNAMELEN(gv));
757 }
758 else {
759 U32 u;
760 CV *cv = find_runcv(&u);
761 if (!cv || !CvPADLIST(cv))
762 return Nullsv;;
763 av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
764 sv = *av_fetch(av, targ, FALSE);
765 /* SvLEN in a pad name is not to be trusted */
766 sv_setpv(name, SvPV_nolen(sv));
767 }
768
769 if (subscript_type == FUV_SUBSCRIPT_HASH) {
770 *SvPVX(name) = '$';
771 sv = NEWSV(0,0);
772 Perl_sv_catpvf(aTHX_ name, "{%s}",
773 pv_display(sv,SvPVX(keyname), SvCUR(keyname), 0, 32));
774 SvREFCNT_dec(sv);
775 }
776 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
777 *SvPVX(name) = '$';
265a12b8 778 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
29489e7c
DM
779 }
780 else if (subscript_type == FUV_SUBSCRIPT_WITHIN)
781 sv_insert(name, 0, 0, "within ", 7);
782
783 return name;
784}
785
786
787/*
788=for apidoc find_uninit_var
789
790Find the name of the undefined variable (if any) that caused the operator o
791to issue a "Use of uninitialized value" warning.
792If match is true, only return a name if it's value matches uninit_sv.
793So roughly speaking, if a unary operator (such as OP_COS) generates a
794warning, then following the direct child of the op may yield an
795OP_PADSV or OP_GV that gives the name of the undefined variable. On the
796other hand, with OP_ADD there are two branches to follow, so we only print
797the variable name if we get an exact match.
798
799The name is returned as a mortal SV.
800
801Assumes that PL_op is the op that originally triggered the error, and that
802PL_comppad/PL_curpad points to the currently executing pad.
803
804=cut
805*/
806
807STATIC SV *
808S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
809{
27da23d5 810 dVAR;
29489e7c
DM
811 SV *sv;
812 AV *av;
813 SV **svp;
814 GV *gv;
815 OP *o, *o2, *kid;
816
817 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
818 uninit_sv == &PL_sv_placeholder)))
819 return Nullsv;
820
821 switch (obase->op_type) {
822
823 case OP_RV2AV:
824 case OP_RV2HV:
825 case OP_PADAV:
826 case OP_PADHV:
827 {
f54cb97a
AL
828 const bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
829 const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
112dcc46
RGS
830 I32 index = 0;
831 SV *keysv = Nullsv;
29489e7c
DM
832 int subscript_type = FUV_SUBSCRIPT_WITHIN;
833
834 if (pad) { /* @lex, %lex */
835 sv = PAD_SVl(obase->op_targ);
836 gv = Nullgv;
837 }
838 else {
839 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
840 /* @global, %global */
841 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
842 if (!gv)
843 break;
844 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
845 }
846 else /* @{expr}, %{expr} */
847 return find_uninit_var(cUNOPx(obase)->op_first,
848 uninit_sv, match);
849 }
850
851 /* attempt to find a match within the aggregate */
852 if (hash) {
853 keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
854 if (keysv)
855 subscript_type = FUV_SUBSCRIPT_HASH;
856 }
857 else {
858 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
859 if (index >= 0)
860 subscript_type = FUV_SUBSCRIPT_ARRAY;
861 }
862
863 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
864 break;
865
866 return S_varname(aTHX_ gv, hash ? "%" : "@", obase->op_targ,
867 keysv, index, subscript_type);
868 }
869
870 case OP_PADSV:
871 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
872 break;
873 return S_varname(aTHX_ Nullgv, "$", obase->op_targ,
874 Nullsv, 0, FUV_SUBSCRIPT_NONE);
875
876 case OP_GVSV:
877 gv = cGVOPx_gv(obase);
878 if (!gv || (match && GvSV(gv) != uninit_sv))
879 break;
880 return S_varname(aTHX_ gv, "$", 0, Nullsv, 0, FUV_SUBSCRIPT_NONE);
881
882 case OP_AELEMFAST:
883 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
884 if (match) {
885 av = (AV*)PAD_SV(obase->op_targ);
886 if (!av || SvRMAGICAL(av))
887 break;
888 svp = av_fetch(av, (I32)obase->op_private, FALSE);
889 if (!svp || *svp != uninit_sv)
890 break;
891 }
892 return S_varname(aTHX_ Nullgv, "$", obase->op_targ,
893 Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
894 }
895 else {
896 gv = cGVOPx_gv(obase);
897 if (!gv)
898 break;
899 if (match) {
900 av = GvAV(gv);
901 if (!av || SvRMAGICAL(av))
902 break;
903 svp = av_fetch(av, (I32)obase->op_private, FALSE);
904 if (!svp || *svp != uninit_sv)
905 break;
906 }
907 return S_varname(aTHX_ gv, "$", 0,
908 Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
909 }
910 break;
911
912 case OP_EXISTS:
913 o = cUNOPx(obase)->op_first;
914 if (!o || o->op_type != OP_NULL ||
915 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
916 break;
917 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
918
919 case OP_AELEM:
920 case OP_HELEM:
921 if (PL_op == obase)
922 /* $a[uninit_expr] or $h{uninit_expr} */
923 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
924
925 gv = Nullgv;
926 o = cBINOPx(obase)->op_first;
927 kid = cBINOPx(obase)->op_last;
928
929 /* get the av or hv, and optionally the gv */
930 sv = Nullsv;
931 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
932 sv = PAD_SV(o->op_targ);
933 }
934 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
935 && cUNOPo->op_first->op_type == OP_GV)
936 {
937 gv = cGVOPx_gv(cUNOPo->op_first);
938 if (!gv)
939 break;
940 sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
941 }
942 if (!sv)
943 break;
944
945 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
946 /* index is constant */
947 if (match) {
948 if (SvMAGICAL(sv))
949 break;
950 if (obase->op_type == OP_HELEM) {
951 HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
952 if (!he || HeVAL(he) != uninit_sv)
953 break;
954 }
955 else {
956 svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
957 if (!svp || *svp != uninit_sv)
958 break;
959 }
960 }
961 if (obase->op_type == OP_HELEM)
962 return S_varname(aTHX_ gv, "%", o->op_targ,
963 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
964 else
965 return S_varname(aTHX_ gv, "@", o->op_targ, Nullsv,
966 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
967 ;
968 }
969 else {
970 /* index is an expression;
971 * attempt to find a match within the aggregate */
972 if (obase->op_type == OP_HELEM) {
973 SV *keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
974 if (keysv)
975 return S_varname(aTHX_ gv, "%", o->op_targ,
976 keysv, 0, FUV_SUBSCRIPT_HASH);
977 }
978 else {
f54cb97a 979 const I32 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
29489e7c 980 if (index >= 0)
f54cb97a 981 return S_varname(aTHX_ gv, "@", o->op_targ,
29489e7c
DM
982 Nullsv, index, FUV_SUBSCRIPT_ARRAY);
983 }
984 if (match)
985 break;
986 return S_varname(aTHX_ gv,
987 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
988 ? "@" : "%",
989 o->op_targ, Nullsv, 0, FUV_SUBSCRIPT_WITHIN);
990 }
991
992 break;
993
994 case OP_AASSIGN:
995 /* only examine RHS */
996 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
997
998 case OP_OPEN:
999 o = cUNOPx(obase)->op_first;
1000 if (o->op_type == OP_PUSHMARK)
1001 o = o->op_sibling;
1002
1003 if (!o->op_sibling) {
1004 /* one-arg version of open is highly magical */
1005
1006 if (o->op_type == OP_GV) { /* open FOO; */
1007 gv = cGVOPx_gv(o);
1008 if (match && GvSV(gv) != uninit_sv)
1009 break;
7a5fa8a2 1010 return S_varname(aTHX_ gv, "$", 0,
29489e7c
DM
1011 Nullsv, 0, FUV_SUBSCRIPT_NONE);
1012 }
1013 /* other possibilities not handled are:
1014 * open $x; or open my $x; should return '${*$x}'
1015 * open expr; should return '$'.expr ideally
1016 */
1017 break;
1018 }
1019 goto do_op;
1020
1021 /* ops where $_ may be an implicit arg */
1022 case OP_TRANS:
1023 case OP_SUBST:
1024 case OP_MATCH:
1025 if ( !(obase->op_flags & OPf_STACKED)) {
1026 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
1027 ? PAD_SVl(obase->op_targ)
1028 : DEFSV))
1029 {
1030 sv = sv_newmortal();
1031 sv_setpv(sv, "$_");
1032 return sv;
1033 }
1034 }
1035 goto do_op;
1036
1037 case OP_PRTF:
1038 case OP_PRINT:
1039 /* skip filehandle as it can't produce 'undef' warning */
1040 o = cUNOPx(obase)->op_first;
1041 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
1042 o = o->op_sibling->op_sibling;
1043 goto do_op2;
1044
1045
e21bd382 1046 case OP_RV2SV:
29489e7c
DM
1047 case OP_CUSTOM:
1048 case OP_ENTERSUB:
1049 match = 1; /* XS or custom code could trigger random warnings */
1050 goto do_op;
1051
1052 case OP_SCHOMP:
1053 case OP_CHOMP:
1054 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
1055 return sv_2mortal(newSVpv("${$/}", 0));
1056 /* FALL THROUGH */
1057
1058 default:
1059 do_op:
1060 if (!(obase->op_flags & OPf_KIDS))
1061 break;
1062 o = cUNOPx(obase)->op_first;
1063
1064 do_op2:
1065 if (!o)
1066 break;
1067
1068 /* if all except one arg are constant, or have no side-effects,
1069 * or are optimized away, then it's unambiguous */
1070 o2 = Nullop;
1071 for (kid=o; kid; kid = kid->op_sibling) {
1072 if (kid &&
1073 ( (kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid)))
1074 || (kid->op_type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
1075 || (kid->op_type == OP_PUSHMARK)
1076 )
1077 )
1078 continue;
1079 if (o2) { /* more than one found */
1080 o2 = Nullop;
1081 break;
1082 }
1083 o2 = kid;
1084 }
1085 if (o2)
1086 return find_uninit_var(o2, uninit_sv, match);
1087
1088 /* scan all args */
1089 while (o) {
1090 sv = find_uninit_var(o, uninit_sv, 1);
1091 if (sv)
1092 return sv;
1093 o = o->op_sibling;
1094 }
1095 break;
1096 }
1097 return Nullsv;
1098}
1099
1100
645c22ef
DM
1101/*
1102=for apidoc report_uninit
1103
1104Print appropriate "Use of uninitialized variable" warning
1105
1106=cut
1107*/
1108
1d7c1841 1109void
29489e7c
DM
1110Perl_report_uninit(pTHX_ SV* uninit_sv)
1111{
1112 if (PL_op) {
112dcc46 1113 SV* varname = Nullsv;
29489e7c
DM
1114 if (uninit_sv) {
1115 varname = find_uninit_var(PL_op, uninit_sv,0);
1116 if (varname)
1117 sv_insert(varname, 0, 0, " ", 1);
1118 }
9014280d 1119 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
29489e7c
DM
1120 varname ? SvPV_nolen(varname) : "",
1121 " in ", OP_DESC(PL_op));
1122 }
1d7c1841 1123 else
29489e7c
DM
1124 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
1125 "", "", "");
1d7c1841
GS
1126}
1127
645c22ef
DM
1128/* allocate another arena's worth of NV bodies */
1129
cbe51380 1130STATIC void
cea2e8a9 1131S_more_xnv(pTHX)
463ee0b2 1132{
cac9b346
NC
1133 NV* xnv;
1134 NV* xnvend;
7b2c381c
NC
1135 void *ptr;
1136 New(711, ptr, PERL_ARENA_SIZE/sizeof(NV), NV);
1137 *((void **) ptr) = (void *)PL_xnv_arenaroot;
612f20c3
GS
1138 PL_xnv_arenaroot = ptr;
1139
1140 xnv = (NV*) ptr;
9c17f24a 1141 xnvend = &xnv[PERL_ARENA_SIZE / sizeof(NV) - 1];
65202027 1142 xnv += (sizeof(XPVIV) - 1) / sizeof(NV) + 1; /* fudge by sizeof XPVIV */
3280af22 1143 PL_xnv_root = xnv;
463ee0b2 1144 while (xnv < xnvend) {
65202027 1145 *(NV**)xnv = (NV*)(xnv + 1);
463ee0b2
LW
1146 xnv++;
1147 }
cac9b346
NC
1148 *(NV**)xnv = 0;
1149}
1150
1151/* allocate another arena's worth of struct xpv */
1152
1153STATIC void
1154S_more_xpv(pTHX)
1155{
59813432
NC
1156 xpv_allocated* xpv;
1157 xpv_allocated* xpvend;
1158 New(713, xpv, PERL_ARENA_SIZE/sizeof(xpv_allocated), xpv_allocated);
1159 *((xpv_allocated**)xpv) = PL_xpv_arenaroot;
cac9b346
NC
1160 PL_xpv_arenaroot = xpv;
1161
59813432 1162 xpvend = &xpv[PERL_ARENA_SIZE / sizeof(xpv_allocated) - 1];
cac9b346
NC
1163 PL_xpv_root = ++xpv;
1164 while (xpv < xpvend) {
59813432 1165 *((xpv_allocated**)xpv) = xpv + 1;
cac9b346
NC
1166 xpv++;
1167 }
59813432 1168 *((xpv_allocated**)xpv) = 0;
cac9b346
NC
1169}
1170
1171/* allocate another arena's worth of struct xpviv */
1172
1173STATIC void
1174S_more_xpviv(pTHX)
1175{
311a25d9
NC
1176 xpviv_allocated* xpviv;
1177 xpviv_allocated* xpvivend;
1178 New(713, xpviv, PERL_ARENA_SIZE/sizeof(xpviv_allocated), xpviv_allocated);
1179 *((xpviv_allocated**)xpviv) = PL_xpviv_arenaroot;
cac9b346
NC
1180 PL_xpviv_arenaroot = xpviv;
1181
311a25d9 1182 xpvivend = &xpviv[PERL_ARENA_SIZE / sizeof(xpviv_allocated) - 1];
cac9b346
NC
1183 PL_xpviv_root = ++xpviv;
1184 while (xpviv < xpvivend) {
311a25d9 1185 *((xpviv_allocated**)xpviv) = xpviv + 1;
cac9b346
NC
1186 xpviv++;
1187 }
311a25d9 1188 *((xpviv_allocated**)xpviv) = 0;
cac9b346
NC
1189}
1190
1191/* allocate another arena's worth of struct xpvnv */
1192
1193STATIC void
1194S_more_xpvnv(pTHX)
1195{
1196 XPVNV* xpvnv;
1197 XPVNV* xpvnvend;
1198 New(715, xpvnv, PERL_ARENA_SIZE/sizeof(XPVNV), XPVNV);
7b2c381c 1199 *((XPVNV**)xpvnv) = PL_xpvnv_arenaroot;
cac9b346
NC
1200 PL_xpvnv_arenaroot = xpvnv;
1201
1202 xpvnvend = &xpvnv[PERL_ARENA_SIZE / sizeof(XPVNV) - 1];
1203 PL_xpvnv_root = ++xpvnv;
1204 while (xpvnv < xpvnvend) {
7b2c381c 1205 *((XPVNV**)xpvnv) = xpvnv + 1;
cac9b346
NC
1206 xpvnv++;
1207 }
7b2c381c 1208 *((XPVNV**)xpvnv) = 0;
cac9b346
NC
1209}
1210
1211/* allocate another arena's worth of struct xpvcv */
1212
1213STATIC void
1214S_more_xpvcv(pTHX)
1215{
1216 XPVCV* xpvcv;
1217 XPVCV* xpvcvend;
1218 New(716, xpvcv, PERL_ARENA_SIZE/sizeof(XPVCV), XPVCV);
7b2c381c 1219 *((XPVCV**)xpvcv) = PL_xpvcv_arenaroot;
cac9b346
NC
1220 PL_xpvcv_arenaroot = xpvcv;
1221
1222 xpvcvend = &xpvcv[PERL_ARENA_SIZE / sizeof(XPVCV) - 1];
1223 PL_xpvcv_root = ++xpvcv;
1224 while (xpvcv < xpvcvend) {
7b2c381c 1225 *((XPVCV**)xpvcv) = xpvcv + 1;
cac9b346
NC
1226 xpvcv++;
1227 }
7b2c381c 1228 *((XPVCV**)xpvcv) = 0;
cac9b346
NC
1229}
1230
1231/* allocate another arena's worth of struct xpvav */
1232
1233STATIC void
1234S_more_xpvav(pTHX)
1235{
59813432
NC
1236 xpvav_allocated* xpvav;
1237 xpvav_allocated* xpvavend;
1238 New(717, xpvav, PERL_ARENA_SIZE/sizeof(xpvav_allocated),
1239 xpvav_allocated);
1240 *((xpvav_allocated**)xpvav) = PL_xpvav_arenaroot;
cac9b346
NC
1241 PL_xpvav_arenaroot = xpvav;
1242
59813432 1243 xpvavend = &xpvav[PERL_ARENA_SIZE / sizeof(xpvav_allocated) - 1];
cac9b346
NC
1244 PL_xpvav_root = ++xpvav;
1245 while (xpvav < xpvavend) {
59813432 1246 *((xpvav_allocated**)xpvav) = xpvav + 1;
cac9b346
NC
1247 xpvav++;
1248 }
59813432 1249 *((xpvav_allocated**)xpvav) = 0;
cac9b346
NC
1250}
1251
1252/* allocate another arena's worth of struct xpvhv */
1253
1254STATIC void
1255S_more_xpvhv(pTHX)
1256{
59813432
NC
1257 xpvhv_allocated* xpvhv;
1258 xpvhv_allocated* xpvhvend;
1259 New(718, xpvhv, PERL_ARENA_SIZE/sizeof(xpvhv_allocated),
1260 xpvhv_allocated);
1261 *((xpvhv_allocated**)xpvhv) = PL_xpvhv_arenaroot;
cac9b346
NC
1262 PL_xpvhv_arenaroot = xpvhv;
1263
59813432 1264 xpvhvend = &xpvhv[PERL_ARENA_SIZE / sizeof(xpvhv_allocated) - 1];
cac9b346
NC
1265 PL_xpvhv_root = ++xpvhv;
1266 while (xpvhv < xpvhvend) {
59813432 1267 *((xpvhv_allocated**)xpvhv) = xpvhv + 1;
cac9b346
NC
1268 xpvhv++;
1269 }
59813432 1270 *((xpvhv_allocated**)xpvhv) = 0;
cac9b346
NC
1271}
1272
1273/* allocate another arena's worth of struct xpvmg */
1274
1275STATIC void
1276S_more_xpvmg(pTHX)
1277{
1278 XPVMG* xpvmg;
1279 XPVMG* xpvmgend;
1280 New(719, xpvmg, PERL_ARENA_SIZE/sizeof(XPVMG), XPVMG);
7b2c381c 1281 *((XPVMG**)xpvmg) = PL_xpvmg_arenaroot;
cac9b346
NC
1282 PL_xpvmg_arenaroot = xpvmg;
1283
1284 xpvmgend = &xpvmg[PERL_ARENA_SIZE / sizeof(XPVMG) - 1];
1285 PL_xpvmg_root = ++xpvmg;
1286 while (xpvmg < xpvmgend) {
7b2c381c 1287 *((XPVMG**)xpvmg) = xpvmg + 1;
cac9b346
NC
1288 xpvmg++;
1289 }
7b2c381c 1290 *((XPVMG**)xpvmg) = 0;
cac9b346
NC
1291}
1292
1293/* allocate another arena's worth of struct xpvgv */
1294
1295STATIC void
1296S_more_xpvgv(pTHX)
1297{
1298 XPVGV* xpvgv;
1299 XPVGV* xpvgvend;
1300 New(720, xpvgv, PERL_ARENA_SIZE/sizeof(XPVGV), XPVGV);
7b2c381c 1301 *((XPVGV**)xpvgv) = PL_xpvgv_arenaroot;
cac9b346
NC
1302 PL_xpvgv_arenaroot = xpvgv;
1303
1304 xpvgvend = &xpvgv[PERL_ARENA_SIZE / sizeof(XPVGV) - 1];
1305 PL_xpvgv_root = ++xpvgv;
1306 while (xpvgv < xpvgvend) {
7b2c381c 1307 *((XPVGV**)xpvgv) = xpvgv + 1;
cac9b346
NC
1308 xpvgv++;
1309 }
7b2c381c 1310 *((XPVGV**)xpvgv) = 0;
cac9b346
NC
1311}
1312
1313/* allocate another arena's worth of struct xpvlv */
1314
1315STATIC void
1316S_more_xpvlv(pTHX)
1317{
1318 XPVLV* xpvlv;
1319 XPVLV* xpvlvend;
1320 New(720, xpvlv, PERL_ARENA_SIZE/sizeof(XPVLV), XPVLV);
7b2c381c 1321 *((XPVLV**)xpvlv) = PL_xpvlv_arenaroot;
cac9b346
NC
1322 PL_xpvlv_arenaroot = xpvlv;
1323
1324 xpvlvend = &xpvlv[PERL_ARENA_SIZE / sizeof(XPVLV) - 1];
1325 PL_xpvlv_root = ++xpvlv;
1326 while (xpvlv < xpvlvend) {
7b2c381c 1327 *((XPVLV**)xpvlv) = xpvlv + 1;
cac9b346
NC
1328 xpvlv++;
1329 }
7b2c381c 1330 *((XPVLV**)xpvlv) = 0;
cac9b346
NC
1331}
1332
1333/* allocate another arena's worth of struct xpvbm */
1334
1335STATIC void
1336S_more_xpvbm(pTHX)
1337{
1338 XPVBM* xpvbm;
1339 XPVBM* xpvbmend;
1340 New(721, xpvbm, PERL_ARENA_SIZE/sizeof(XPVBM), XPVBM);
7b2c381c 1341 *((XPVBM**)xpvbm) = PL_xpvbm_arenaroot;
cac9b346
NC
1342 PL_xpvbm_arenaroot = xpvbm;
1343
1344 xpvbmend = &xpvbm[PERL_ARENA_SIZE / sizeof(XPVBM) - 1];
1345 PL_xpvbm_root = ++xpvbm;
1346 while (xpvbm < xpvbmend) {
7b2c381c 1347 *((XPVBM**)xpvbm) = xpvbm + 1;
cac9b346
NC
1348 xpvbm++;
1349 }
7b2c381c 1350 *((XPVBM**)xpvbm) = 0;
cac9b346 1351}
612f20c3 1352
cac9b346
NC
1353/* grab a new NV body from the free list, allocating more if necessary */
1354
1355STATIC XPVNV*
1356S_new_xnv(pTHX)
1357{
1358 NV* xnv;
1359 LOCK_SV_MUTEX;
1360 if (!PL_xnv_root)
1361 S_more_xnv(aTHX);
1362 xnv = PL_xnv_root;
1363 PL_xnv_root = *(NV**)xnv;
1364 UNLOCK_SV_MUTEX;
1365 return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
1366}
1367
1368/* return an NV body to the free list */
1369
1370STATIC void
1371S_del_xnv(pTHX_ XPVNV *p)
1372{
1373 NV* xnv = (NV*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
1374 LOCK_SV_MUTEX;
1375 *(NV**)xnv = PL_xnv_root;
1376 PL_xnv_root = xnv;
1377 UNLOCK_SV_MUTEX;
ed6116ce
LW
1378}
1379
645c22ef
DM
1380/* grab a new struct xpv from the free list, allocating more if necessary */
1381
76e3520e 1382STATIC XPV*
cea2e8a9 1383S_new_xpv(pTHX)
463ee0b2 1384{
59813432 1385 xpv_allocated* xpv;
cbe51380
GS
1386 LOCK_SV_MUTEX;
1387 if (!PL_xpv_root)
cac9b346 1388 S_more_xpv(aTHX);
cbe51380 1389 xpv = PL_xpv_root;
59813432 1390 PL_xpv_root = *(xpv_allocated**)xpv;
cbe51380 1391 UNLOCK_SV_MUTEX;
59813432
NC
1392 /* If xpv_allocated is the same structure as XPV then the two OFFSETs
1393 sum to zero, and the pointer is unchanged. If the allocated structure
1394 is smaller (no initial IV actually allocated) then the net effect is
1395 to subtract the size of the IV from the pointer, to return a new pointer
1396 as if an initial IV were actually allocated. */
1397 return (XPV*)((char*)xpv - STRUCT_OFFSET(XPV, xpv_cur)
1398 + STRUCT_OFFSET(xpv_allocated, xpv_cur));
463ee0b2
LW
1399}
1400
645c22ef
DM
1401/* return a struct xpv to the free list */
1402
76e3520e 1403STATIC void
cea2e8a9 1404S_del_xpv(pTHX_ XPV *p)
463ee0b2 1405{
59813432
NC
1406 xpv_allocated* xpv
1407 = (xpv_allocated*)((char*)(p) + STRUCT_OFFSET(XPV, xpv_cur)
1408 - STRUCT_OFFSET(xpv_allocated, xpv_cur));
cbe51380 1409 LOCK_SV_MUTEX;
59813432
NC
1410 *(xpv_allocated**)xpv = PL_xpv_root;
1411 PL_xpv_root = xpv;
cbe51380 1412 UNLOCK_SV_MUTEX;
463ee0b2
LW
1413}
1414
645c22ef
DM
1415/* grab a new struct xpviv from the free list, allocating more if necessary */
1416
932e9ff9
VB
1417STATIC XPVIV*
1418S_new_xpviv(pTHX)
1419{
311a25d9 1420 xpviv_allocated* xpviv;
932e9ff9
VB
1421 LOCK_SV_MUTEX;
1422 if (!PL_xpviv_root)
cac9b346 1423 S_more_xpviv(aTHX);
932e9ff9 1424 xpviv = PL_xpviv_root;
311a25d9 1425 PL_xpviv_root = *(xpviv_allocated**)xpviv;
932e9ff9 1426 UNLOCK_SV_MUTEX;
311a25d9
NC
1427 /* If xpviv_allocated is the same structure as XPVIV then the two OFFSETs
1428 sum to zero, and the pointer is unchanged. If the allocated structure
1429 is smaller (no initial IV actually allocated) then the net effect is
1430 to subtract the size of the IV from the pointer, to return a new pointer
1431 as if an initial IV were actually allocated. */
1432 return (XPVIV*)((char*)xpviv - STRUCT_OFFSET(XPVIV, xpv_cur)
1433 + STRUCT_OFFSET(xpviv_allocated, xpv_cur));
932e9ff9
VB
1434}
1435
645c22ef
DM
1436/* return a struct xpviv to the free list */
1437
932e9ff9
VB
1438STATIC void
1439S_del_xpviv(pTHX_ XPVIV *p)
1440{
311a25d9
NC
1441 xpviv_allocated* xpviv
1442 = (xpviv_allocated*)((char*)(p) + STRUCT_OFFSET(XPVIV, xpv_cur)
1443 - STRUCT_OFFSET(xpviv_allocated, xpv_cur));
932e9ff9 1444 LOCK_SV_MUTEX;
311a25d9
NC
1445 *(xpviv_allocated**)xpviv = PL_xpviv_root;
1446 PL_xpviv_root = xpviv;
932e9ff9
VB
1447 UNLOCK_SV_MUTEX;
1448}
1449
645c22ef
DM
1450/* grab a new struct xpvnv from the free list, allocating more if necessary */
1451
932e9ff9
VB
1452STATIC XPVNV*
1453S_new_xpvnv(pTHX)
1454{
1455 XPVNV* xpvnv;
1456 LOCK_SV_MUTEX;
1457 if (!PL_xpvnv_root)
cac9b346 1458 S_more_xpvnv(aTHX);
932e9ff9 1459 xpvnv = PL_xpvnv_root;
7b2c381c 1460 PL_xpvnv_root = *(XPVNV**)xpvnv;
932e9ff9
VB
1461 UNLOCK_SV_MUTEX;
1462 return xpvnv;
1463}
1464
645c22ef
DM
1465/* return a struct xpvnv to the free list */
1466
932e9ff9
VB
1467STATIC void
1468S_del_xpvnv(pTHX_ XPVNV *p)
1469{
1470 LOCK_SV_MUTEX;
7b2c381c 1471 *(XPVNV**)p = PL_xpvnv_root;
932e9ff9
VB
1472 PL_xpvnv_root = p;
1473 UNLOCK_SV_MUTEX;
1474}
1475
645c22ef
DM
1476/* grab a new struct xpvcv from the free list, allocating more if necessary */
1477
932e9ff9
VB
1478STATIC XPVCV*
1479S_new_xpvcv(pTHX)
1480{
1481 XPVCV* xpvcv;
1482 LOCK_SV_MUTEX;
1483 if (!PL_xpvcv_root)
cac9b346 1484 S_more_xpvcv(aTHX);
932e9ff9 1485 xpvcv = PL_xpvcv_root;
7b2c381c 1486 PL_xpvcv_root = *(XPVCV**)xpvcv;
932e9ff9
VB
1487 UNLOCK_SV_MUTEX;
1488 return xpvcv;
1489}
1490
645c22ef
DM
1491/* return a struct xpvcv to the free list */
1492
932e9ff9
VB
1493STATIC void
1494S_del_xpvcv(pTHX_ XPVCV *p)
1495{
1496 LOCK_SV_MUTEX;
7b2c381c 1497 *(XPVCV**)p = PL_xpvcv_root;
932e9ff9
VB
1498 PL_xpvcv_root = p;
1499 UNLOCK_SV_MUTEX;
1500}
1501
645c22ef
DM
1502/* grab a new struct xpvav from the free list, allocating more if necessary */
1503
932e9ff9
VB
1504STATIC XPVAV*
1505S_new_xpvav(pTHX)
1506{
59813432 1507 xpvav_allocated* xpvav;
932e9ff9
VB
1508 LOCK_SV_MUTEX;
1509 if (!PL_xpvav_root)
cac9b346 1510 S_more_xpvav(aTHX);
932e9ff9 1511 xpvav = PL_xpvav_root;
59813432 1512 PL_xpvav_root = *(xpvav_allocated**)xpvav;
932e9ff9 1513 UNLOCK_SV_MUTEX;
59813432
NC
1514 return (XPVAV*)((char*)xpvav - STRUCT_OFFSET(XPVAV, xav_fill)
1515 + STRUCT_OFFSET(xpvav_allocated, xav_fill));
932e9ff9
VB
1516}
1517
645c22ef
DM
1518/* return a struct xpvav to the free list */
1519
932e9ff9
VB
1520STATIC void
1521S_del_xpvav(pTHX_ XPVAV *p)
1522{
59813432
NC
1523 xpvav_allocated* xpvav
1524 = (xpvav_allocated*)((char*)(p) + STRUCT_OFFSET(XPVAV, xav_fill)
1525 - STRUCT_OFFSET(xpvav_allocated, xav_fill));
932e9ff9 1526 LOCK_SV_MUTEX;
59813432
NC
1527 *(xpvav_allocated**)xpvav = PL_xpvav_root;
1528 PL_xpvav_root = xpvav;
932e9ff9
VB
1529 UNLOCK_SV_MUTEX;
1530}
1531
645c22ef
DM
1532/* grab a new struct xpvhv from the free list, allocating more if necessary */
1533
932e9ff9
VB
1534STATIC XPVHV*
1535S_new_xpvhv(pTHX)
1536{
59813432 1537 xpvhv_allocated* xpvhv;
932e9ff9
VB
1538 LOCK_SV_MUTEX;
1539 if (!PL_xpvhv_root)
cac9b346 1540 S_more_xpvhv(aTHX);
932e9ff9 1541 xpvhv = PL_xpvhv_root;
59813432 1542 PL_xpvhv_root = *(xpvhv_allocated**)xpvhv;
932e9ff9 1543 UNLOCK_SV_MUTEX;
59813432
NC
1544 return (XPVHV*)((char*)xpvhv - STRUCT_OFFSET(XPVHV, xhv_fill)
1545 + STRUCT_OFFSET(xpvhv_allocated, xhv_fill));
932e9ff9
VB
1546}
1547
645c22ef
DM
1548/* return a struct xpvhv to the free list */
1549
932e9ff9
VB
1550STATIC void
1551S_del_xpvhv(pTHX_ XPVHV *p)
1552{
59813432
NC
1553 xpvhv_allocated* xpvhv
1554 = (xpvhv_allocated*)((char*)(p) + STRUCT_OFFSET(XPVHV, xhv_fill)
1555 - STRUCT_OFFSET(xpvhv_allocated, xhv_fill));
932e9ff9 1556 LOCK_SV_MUTEX;
59813432
NC
1557 *(xpvhv_allocated**)xpvhv = PL_xpvhv_root;
1558 PL_xpvhv_root = xpvhv;
932e9ff9
VB
1559 UNLOCK_SV_MUTEX;
1560}
1561
645c22ef
DM
1562/* grab a new struct xpvmg from the free list, allocating more if necessary */
1563
932e9ff9
VB
1564STATIC XPVMG*
1565S_new_xpvmg(pTHX)
1566{
1567 XPVMG* xpvmg;
1568 LOCK_SV_MUTEX;
1569 if (!PL_xpvmg_root)
cac9b346 1570 S_more_xpvmg(aTHX);
932e9ff9 1571 xpvmg = PL_xpvmg_root;
7b2c381c 1572 PL_xpvmg_root = *(XPVMG**)xpvmg;
932e9ff9
VB
1573 UNLOCK_SV_MUTEX;
1574 return xpvmg;
1575}
1576
645c22ef
DM
1577/* return a struct xpvmg to the free list */
1578
932e9ff9
VB
1579STATIC void
1580S_del_xpvmg(pTHX_ XPVMG *p)
1581{
1582 LOCK_SV_MUTEX;
7b2c381c 1583 *(XPVMG**)p = PL_xpvmg_root;
932e9ff9
VB
1584 PL_xpvmg_root = p;
1585 UNLOCK_SV_MUTEX;
1586}
1587
727879eb
NC
1588/* grab a new struct xpvgv from the free list, allocating more if necessary */
1589
1590STATIC XPVGV*
1591S_new_xpvgv(pTHX)
1592{
1593 XPVGV* xpvgv;
1594 LOCK_SV_MUTEX;
1595 if (!PL_xpvgv_root)
cac9b346 1596 S_more_xpvgv(aTHX);
727879eb 1597 xpvgv = PL_xpvgv_root;
7b2c381c 1598 PL_xpvgv_root = *(XPVGV**)xpvgv;
727879eb
NC
1599 UNLOCK_SV_MUTEX;
1600 return xpvgv;
1601}
1602
1603/* return a struct xpvgv to the free list */
1604
1605STATIC void
1606S_del_xpvgv(pTHX_ XPVGV *p)
1607{
1608 LOCK_SV_MUTEX;
7b2c381c 1609 *(XPVGV**)p = PL_xpvgv_root;
727879eb
NC
1610 PL_xpvgv_root = p;
1611 UNLOCK_SV_MUTEX;
1612}
1613
645c22ef
DM
1614/* grab a new struct xpvlv from the free list, allocating more if necessary */
1615
932e9ff9
VB
1616STATIC XPVLV*
1617S_new_xpvlv(pTHX)
1618{
1619 XPVLV* xpvlv;
1620 LOCK_SV_MUTEX;
1621 if (!PL_xpvlv_root)
cac9b346 1622 S_more_xpvlv(aTHX);
932e9ff9 1623 xpvlv = PL_xpvlv_root;
7b2c381c 1624 PL_xpvlv_root = *(XPVLV**)xpvlv;
932e9ff9
VB
1625 UNLOCK_SV_MUTEX;
1626 return xpvlv;
1627}
1628
645c22ef
DM
1629/* return a struct xpvlv to the free list */
1630
932e9ff9
VB
1631STATIC void
1632S_del_xpvlv(pTHX_ XPVLV *p)
1633{
1634 LOCK_SV_MUTEX;
7b2c381c 1635 *(XPVLV**)p = PL_xpvlv_root;
932e9ff9
VB
1636 PL_xpvlv_root = p;
1637 UNLOCK_SV_MUTEX;
1638}
1639
645c22ef
DM
1640/* grab a new struct xpvbm from the free list, allocating more if necessary */
1641
932e9ff9
VB
1642STATIC XPVBM*
1643S_new_xpvbm(pTHX)
1644{
1645 XPVBM* xpvbm;
1646 LOCK_SV_MUTEX;
1647 if (!PL_xpvbm_root)
cac9b346 1648 S_more_xpvbm(aTHX);
932e9ff9 1649 xpvbm = PL_xpvbm_root;
7b2c381c 1650 PL_xpvbm_root = *(XPVBM**)xpvbm;
932e9ff9
VB
1651 UNLOCK_SV_MUTEX;
1652 return xpvbm;
1653}
1654
645c22ef
DM
1655/* return a struct xpvbm to the free list */
1656
932e9ff9
VB
1657STATIC void
1658S_del_xpvbm(pTHX_ XPVBM *p)
1659{
1660 LOCK_SV_MUTEX;
7b2c381c 1661 *(XPVBM**)p = PL_xpvbm_root;
932e9ff9
VB
1662 PL_xpvbm_root = p;
1663 UNLOCK_SV_MUTEX;
1664}
1665
7bab3ede
MB
1666#define my_safemalloc(s) (void*)safemalloc(s)
1667#define my_safefree(p) safefree((char*)p)
463ee0b2 1668
d33b2eba 1669#ifdef PURIFY
463ee0b2 1670
d33b2eba
GS
1671#define new_XNV() my_safemalloc(sizeof(XPVNV))
1672#define del_XNV(p) my_safefree(p)
463ee0b2 1673
d33b2eba
GS
1674#define new_XPV() my_safemalloc(sizeof(XPV))
1675#define del_XPV(p) my_safefree(p)
9b94d1dd 1676
d33b2eba
GS
1677#define new_XPVIV() my_safemalloc(sizeof(XPVIV))
1678#define del_XPVIV(p) my_safefree(p)
932e9ff9 1679
d33b2eba
GS
1680#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
1681#define del_XPVNV(p) my_safefree(p)
932e9ff9 1682
d33b2eba
GS
1683#define new_XPVCV() my_safemalloc(sizeof(XPVCV))
1684#define del_XPVCV(p) my_safefree(p)
932e9ff9 1685
d33b2eba
GS
1686#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
1687#define del_XPVAV(p) my_safefree(p)
1688
1689#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
1690#define del_XPVHV(p) my_safefree(p)
1c846c1f 1691
d33b2eba
GS
1692#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
1693#define del_XPVMG(p) my_safefree(p)
1694
727879eb
NC
1695#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
1696#define del_XPVGV(p) my_safefree(p)
1697
d33b2eba
GS
1698#define new_XPVLV() my_safemalloc(sizeof(XPVLV))
1699#define del_XPVLV(p) my_safefree(p)
1700
1701#define new_XPVBM() my_safemalloc(sizeof(XPVBM))
1702#define del_XPVBM(p) my_safefree(p)
1703
1704#else /* !PURIFY */
1705
d33b2eba
GS
1706#define new_XNV() (void*)new_xnv()
1707#define del_XNV(p) del_xnv((XPVNV*) p)
9b94d1dd 1708
d33b2eba
GS
1709#define new_XPV() (void*)new_xpv()
1710#define del_XPV(p) del_xpv((XPV *)p)
1711
1712#define new_XPVIV() (void*)new_xpviv()
1713#define del_XPVIV(p) del_xpviv((XPVIV *)p)
1714
1715#define new_XPVNV() (void*)new_xpvnv()
1716#define del_XPVNV(p) del_xpvnv((XPVNV *)p)
1717
1718#define new_XPVCV() (void*)new_xpvcv()
1719#define del_XPVCV(p) del_xpvcv((XPVCV *)p)
1720
1721#define new_XPVAV() (void*)new_xpvav()
1722#define del_XPVAV(p) del_xpvav((XPVAV *)p)
1723
1724#define new_XPVHV() (void*)new_xpvhv()
1725#define del_XPVHV(p) del_xpvhv((XPVHV *)p)
1c846c1f 1726
d33b2eba
GS
1727#define new_XPVMG() (void*)new_xpvmg()
1728#define del_XPVMG(p) del_xpvmg((XPVMG *)p)
1729
727879eb
NC
1730#define new_XPVGV() (void*)new_xpvgv()
1731#define del_XPVGV(p) del_xpvgv((XPVGV *)p)
1732
d33b2eba
GS
1733#define new_XPVLV() (void*)new_xpvlv()
1734#define del_XPVLV(p) del_xpvlv((XPVLV *)p)
1735
1736#define new_XPVBM() (void*)new_xpvbm()
1737#define del_XPVBM(p) del_xpvbm((XPVBM *)p)
1738
1739#endif /* PURIFY */
9b94d1dd 1740
d33b2eba
GS
1741#define new_XPVFM() my_safemalloc(sizeof(XPVFM))
1742#define del_XPVFM(p) my_safefree(p)
1c846c1f 1743
d33b2eba
GS
1744#define new_XPVIO() my_safemalloc(sizeof(XPVIO))
1745#define del_XPVIO(p) my_safefree(p)
8990e307 1746
954c1994
GS
1747/*
1748=for apidoc sv_upgrade
1749
ff276b08 1750Upgrade an SV to a more complex form. Generally adds a new body type to the
645c22ef 1751SV, then copies across as much information as possible from the old body.
ff276b08 1752You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
954c1994
GS
1753
1754=cut
1755*/
1756
79072805 1757bool
864dbfa3 1758Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
79072805 1759{
e763e3dc 1760
d2e56290
NC
1761 char* pv;
1762 U32 cur;
1763 U32 len;
1764 IV iv;
1765 NV nv;
1766 MAGIC* magic;
1767 HV* stash;
79072805 1768
765f542d
NC
1769 if (mt != SVt_PV && SvIsCOW(sv)) {
1770 sv_force_normal_flags(sv, 0);
f130fd45
NIS
1771 }
1772
79072805
LW
1773 if (SvTYPE(sv) == mt)
1774 return TRUE;
1775
d2e56290
NC
1776 pv = NULL;
1777 cur = 0;
1778 len = 0;
1779 iv = 0;
1780 nv = 0.0;
1781 magic = NULL;
1782 stash = Nullhv;
1783
79072805
LW
1784 switch (SvTYPE(sv)) {
1785 case SVt_NULL:
79072805 1786 break;
79072805 1787 case SVt_IV:
463ee0b2 1788 iv = SvIVX(sv);
ed6116ce 1789 if (mt == SVt_NV)
463ee0b2 1790 mt = SVt_PVNV;
ed6116ce
LW
1791 else if (mt < SVt_PVIV)
1792 mt = SVt_PVIV;
79072805
LW
1793 break;
1794 case SVt_NV:
463ee0b2 1795 nv = SvNVX(sv);
79072805 1796 del_XNV(SvANY(sv));
ed6116ce 1797 if (mt < SVt_PVNV)
79072805
LW
1798 mt = SVt_PVNV;
1799 break;
ed6116ce
LW
1800 case SVt_RV:
1801 pv = (char*)SvRV(sv);
ed6116ce 1802 break;
79072805 1803 case SVt_PV:
463ee0b2 1804 pv = SvPVX(sv);
79072805
LW
1805 cur = SvCUR(sv);
1806 len = SvLEN(sv);
79072805 1807 del_XPV(SvANY(sv));
748a9306
LW
1808 if (mt <= SVt_IV)
1809 mt = SVt_PVIV;
1810 else if (mt == SVt_NV)
1811 mt = SVt_PVNV;
79072805
LW
1812 break;
1813 case SVt_PVIV:
463ee0b2 1814 pv = SvPVX(sv);
79072805
LW
1815 cur = SvCUR(sv);
1816 len = SvLEN(sv);
463ee0b2 1817 iv = SvIVX(sv);
79072805
LW
1818 del_XPVIV(SvANY(sv));
1819 break;
1820 case SVt_PVNV:
463ee0b2 1821 pv = SvPVX(sv);
79072805
LW
1822 cur = SvCUR(sv);
1823 len = SvLEN(sv);
463ee0b2
LW
1824 iv = SvIVX(sv);
1825 nv = SvNVX(sv);
79072805
LW
1826 del_XPVNV(SvANY(sv));
1827 break;
1828 case SVt_PVMG:
0ec50a73
NC
1829 /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1830 there's no way that it can be safely upgraded, because perl.c
1831 expects to Safefree(SvANY(PL_mess_sv)) */
1832 assert(sv != PL_mess_sv);
bce8f412
NC
1833 /* This flag bit is used to mean other things in other scalar types.
1834 Given that it only has meaning inside the pad, it shouldn't be set
1835 on anything that can get upgraded. */
1836 assert((SvFLAGS(sv) & SVpad_TYPED) == 0);
463ee0b2 1837 pv = SvPVX(sv);
79072805
LW
1838 cur = SvCUR(sv);
1839 len = SvLEN(sv);
463ee0b2
LW
1840 iv = SvIVX(sv);
1841 nv = SvNVX(sv);
79072805
LW
1842 magic = SvMAGIC(sv);
1843 stash = SvSTASH(sv);
1844 del_XPVMG(SvANY(sv));
1845 break;
1846 default:
cea2e8a9 1847 Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
79072805
LW
1848 }
1849
ffb05e06
NC
1850 SvFLAGS(sv) &= ~SVTYPEMASK;
1851 SvFLAGS(sv) |= mt;
1852
79072805
LW
1853 switch (mt) {
1854 case SVt_NULL:
cea2e8a9 1855 Perl_croak(aTHX_ "Can't upgrade to undef");
79072805 1856 case SVt_IV:
339049b0 1857 SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
45977657 1858 SvIV_set(sv, iv);
79072805
LW
1859 break;
1860 case SVt_NV:
1861 SvANY(sv) = new_XNV();
9d6ce603 1862 SvNV_set(sv, nv);
79072805 1863 break;
ed6116ce 1864 case SVt_RV:
339049b0 1865 SvANY(sv) = &sv->sv_u.svu_rv;
b162af07 1866 SvRV_set(sv, (SV*)pv);
ed6116ce 1867 break;
79072805
LW
1868 case SVt_PVHV:
1869 SvANY(sv) = new_XPVHV();
bfcb3514 1870 ((XPVHV*) SvANY(sv))->xhv_aux = 0;
463ee0b2
LW
1871 HvFILL(sv) = 0;
1872 HvMAX(sv) = 0;
8aacddc1 1873 HvTOTALKEYS(sv) = 0;
bd4b1eb5
NC
1874
1875 /* Fall through... */
1876 if (0) {
1877 case SVt_PVAV:
1878 SvANY(sv) = new_XPVAV();
1879 AvMAX(sv) = -1;
1880 AvFILLp(sv) = -1;
1881 AvALLOC(sv) = 0;
11ca45c0 1882 AvREAL_only(sv);
bd4b1eb5
NC
1883 }
1884 /* to here. */
c2bfdfaf
NC
1885 /* XXX? Only SVt_NULL is ever upgraded to AV or HV? */
1886 assert(!pv);
8bd4d4c5
NC
1887 /* FIXME. Should be able to remove all this if()... if the above
1888 assertion is genuinely always true. */
1889 if(SvOOK(sv)) {
1890 pv -= iv;
1891 SvFLAGS(sv) &= ~SVf_OOK;
1892 }
1893 Safefree(pv);
bd4b1eb5 1894 SvPV_set(sv, (char*)0);
b162af07
SP
1895 SvMAGIC_set(sv, magic);
1896 SvSTASH_set(sv, stash);
79072805 1897 break;
bd4b1eb5
NC
1898
1899 case SVt_PVIO:
1900 SvANY(sv) = new_XPVIO();
1901 Zero(SvANY(sv), 1, XPVIO);
1902 IoPAGE_LEN(sv) = 60;
1903 goto set_magic_common;
1904 case SVt_PVFM:
1905 SvANY(sv) = new_XPVFM();
1906 Zero(SvANY(sv), 1, XPVFM);
1907 goto set_magic_common;
1908 case SVt_PVBM:
1909 SvANY(sv) = new_XPVBM();
1910 BmRARE(sv) = 0;
1911 BmUSEFUL(sv) = 0;
1912 BmPREVIOUS(sv) = 0;
1913 goto set_magic_common;
1914 case SVt_PVGV:
1915 SvANY(sv) = new_XPVGV();
1916 GvGP(sv) = 0;
1917 GvNAME(sv) = 0;
1918 GvNAMELEN(sv) = 0;
1919 GvSTASH(sv) = 0;
1920 GvFLAGS(sv) = 0;
1921 goto set_magic_common;
79072805
LW
1922 case SVt_PVCV:
1923 SvANY(sv) = new_XPVCV();
748a9306 1924 Zero(SvANY(sv), 1, XPVCV);
bd4b1eb5
NC
1925 goto set_magic_common;
1926 case SVt_PVLV:
1927 SvANY(sv) = new_XPVLV();
1928 LvTARGOFF(sv) = 0;
1929 LvTARGLEN(sv) = 0;
1930 LvTARG(sv) = 0;
1931 LvTYPE(sv) = 0;
93a17b20 1932 GvGP(sv) = 0;
79072805
LW
1933 GvNAME(sv) = 0;
1934 GvNAMELEN(sv) = 0;
1935 GvSTASH(sv) = 0;
a5f75d66 1936 GvFLAGS(sv) = 0;
bd4b1eb5
NC
1937 /* Fall through. */
1938 if (0) {
1939 case SVt_PVMG:
1940 SvANY(sv) = new_XPVMG();
1941 }
1942 set_magic_common:
b162af07
SP
1943 SvMAGIC_set(sv, magic);
1944 SvSTASH_set(sv, stash);
bd4b1eb5
NC
1945 /* Fall through. */
1946 if (0) {
1947 case SVt_PVNV:
1948 SvANY(sv) = new_XPVNV();
1949 }
9d6ce603 1950 SvNV_set(sv, nv);
bd4b1eb5
NC
1951 /* Fall through. */
1952 if (0) {
1953 case SVt_PVIV:
1954 SvANY(sv) = new_XPVIV();
1955 if (SvNIOK(sv))
1956 (void)SvIOK_on(sv);
1957 SvNOK_off(sv);
1958 }
1959 SvIV_set(sv, iv);
1960 /* Fall through. */
1961 if (0) {
1962 case SVt_PV:
1963 SvANY(sv) = new_XPV();
1964 }
f880fe2f 1965 SvPV_set(sv, pv);
b162af07
SP
1966 SvCUR_set(sv, cur);
1967 SvLEN_set(sv, len);
8990e307
LW
1968 break;
1969 }
79072805
LW
1970 return TRUE;
1971}
1972
645c22ef
DM
1973/*
1974=for apidoc sv_backoff
1975
1976Remove any string offset. You should normally use the C<SvOOK_off> macro
1977wrapper instead.
1978
1979=cut
1980*/
1981
79072805 1982int
864dbfa3 1983Perl_sv_backoff(pTHX_ register SV *sv)
79072805
LW
1984{
1985 assert(SvOOK(sv));
463ee0b2
LW
1986 if (SvIVX(sv)) {
1987 char *s = SvPVX(sv);
b162af07 1988 SvLEN_set(sv, SvLEN(sv) + SvIVX(sv));
f880fe2f 1989 SvPV_set(sv, SvPVX(sv) - SvIVX(sv));
79072805 1990 SvIV_set(sv, 0);
463ee0b2 1991 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
79072805
LW
1992 }
1993 SvFLAGS(sv) &= ~SVf_OOK;
a0d0e21e 1994 return 0;
79072805
LW
1995}
1996
954c1994
GS
1997/*
1998=for apidoc sv_grow
1999
645c22ef
DM
2000Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
2001upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
2002Use the C<SvGROW> wrapper instead.
954c1994
GS
2003
2004=cut
2005*/
2006
79072805 2007char *
864dbfa3 2008Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
79072805
LW
2009{
2010 register char *s;
2011
55497cff 2012#ifdef HAS_64K_LIMIT
79072805 2013 if (newlen >= 0x10000) {
1d7c1841
GS
2014 PerlIO_printf(Perl_debug_log,
2015 "Allocation too large: %"UVxf"\n", (UV)newlen);
79072805
LW
2016 my_exit(1);
2017 }
55497cff 2018#endif /* HAS_64K_LIMIT */
a0d0e21e
LW
2019 if (SvROK(sv))
2020 sv_unref(sv);
79072805
LW
2021 if (SvTYPE(sv) < SVt_PV) {
2022 sv_upgrade(sv, SVt_PV);
463ee0b2 2023 s = SvPVX(sv);
79072805
LW
2024 }
2025 else if (SvOOK(sv)) { /* pv is offset? */
2026 sv_backoff(sv);
463ee0b2 2027 s = SvPVX(sv);
79072805
LW
2028 if (newlen > SvLEN(sv))
2029 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
c6f8c383
GA
2030#ifdef HAS_64K_LIMIT
2031 if (newlen >= 0x10000)
2032 newlen = 0xFFFF;
2033#endif
79072805 2034 }
bc44a8a2 2035 else
463ee0b2 2036 s = SvPVX(sv);
54f0641b 2037
79072805 2038 if (newlen > SvLEN(sv)) { /* need more room? */
8d6dde3e 2039 if (SvLEN(sv) && s) {
7bab3ede 2040#ifdef MYMALLOC
a3b680e6 2041 const STRLEN l = malloced_size((void*)SvPVX(sv));
8d6dde3e
IZ
2042 if (newlen <= l) {
2043 SvLEN_set(sv, l);
2044 return s;
2045 } else
c70c8a0a 2046#endif
79072805 2047 Renew(s,newlen,char);
8d6dde3e 2048 }
bfed75c6 2049 else {
4e83176d 2050 New(703, s, newlen, char);
40565179 2051 if (SvPVX(sv) && SvCUR(sv)) {
54f0641b 2052 Move(SvPVX(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
40565179 2053 }
4e83176d 2054 }
79072805 2055 SvPV_set(sv, s);
e1ec3a88 2056 SvLEN_set(sv, newlen);
79072805
LW
2057 }
2058 return s;
2059}
2060
954c1994
GS
2061/*
2062=for apidoc sv_setiv
2063
645c22ef
DM
2064Copies an integer into the given SV, upgrading first if necessary.
2065Does not handle 'set' magic. See also C<sv_setiv_mg>.
954c1994
GS
2066
2067=cut
2068*/
2069
79072805 2070void
864dbfa3 2071Perl_sv_setiv(pTHX_ register SV *sv, IV i)
79072805 2072{
765f542d 2073 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2
LW
2074 switch (SvTYPE(sv)) {
2075 case SVt_NULL:
79072805 2076 sv_upgrade(sv, SVt_IV);
463ee0b2
LW
2077 break;
2078 case SVt_NV:
2079 sv_upgrade(sv, SVt_PVNV);
2080 break;
ed6116ce 2081 case SVt_RV:
463ee0b2 2082 case SVt_PV:
79072805 2083 sv_upgrade(sv, SVt_PVIV);
463ee0b2 2084 break;
a0d0e21e
LW
2085
2086 case SVt_PVGV:
a0d0e21e
LW
2087 case SVt_PVAV:
2088 case SVt_PVHV:
2089 case SVt_PVCV:
2090 case SVt_PVFM:
2091 case SVt_PVIO:
411caa50 2092 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
53e06cf0 2093 OP_DESC(PL_op));
463ee0b2 2094 }
a0d0e21e 2095 (void)SvIOK_only(sv); /* validate number */
45977657 2096 SvIV_set(sv, i);
463ee0b2 2097 SvTAINT(sv);
79072805
LW
2098}
2099
954c1994
GS
2100/*
2101=for apidoc sv_setiv_mg
2102
2103Like C<sv_setiv>, but also handles 'set' magic.
2104
2105=cut
2106*/
2107
79072805 2108void
864dbfa3 2109Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
ef50df4b
GS
2110{
2111 sv_setiv(sv,i);
2112 SvSETMAGIC(sv);
2113}
2114
954c1994
GS
2115/*
2116=for apidoc sv_setuv
2117
645c22ef
DM
2118Copies an unsigned integer into the given SV, upgrading first if necessary.
2119Does not handle 'set' magic. See also C<sv_setuv_mg>.
954c1994
GS
2120
2121=cut
2122*/
2123
ef50df4b 2124void
864dbfa3 2125Perl_sv_setuv(pTHX_ register SV *sv, UV u)
55497cff 2126{
55ada374
NC
2127 /* With these two if statements:
2128 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 2129
55ada374
NC
2130 without
2131 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 2132
55ada374
NC
2133 If you wish to remove them, please benchmark to see what the effect is
2134 */
28e5dec8
JH
2135 if (u <= (UV)IV_MAX) {
2136 sv_setiv(sv, (IV)u);
2137 return;
2138 }
25da4f38
IZ
2139 sv_setiv(sv, 0);
2140 SvIsUV_on(sv);
607fa7f2 2141 SvUV_set(sv, u);
55497cff 2142}
2143
954c1994
GS
2144/*
2145=for apidoc sv_setuv_mg
2146
2147Like C<sv_setuv>, but also handles 'set' magic.
2148
2149=cut
2150*/
2151
55497cff 2152void
864dbfa3 2153Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
ef50df4b 2154{
55ada374
NC
2155 /* With these two if statements:
2156 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 2157
55ada374
NC
2158 without
2159 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 2160
55ada374
NC
2161 If you wish to remove them, please benchmark to see what the effect is
2162 */
28e5dec8
JH
2163 if (u <= (UV)IV_MAX) {
2164 sv_setiv(sv, (IV)u);
2165 } else {
2166 sv_setiv(sv, 0);
2167 SvIsUV_on(sv);
2168 sv_setuv(sv,u);
2169 }
ef50df4b
GS
2170 SvSETMAGIC(sv);
2171}
2172
954c1994
GS
2173/*
2174=for apidoc sv_setnv
2175
645c22ef
DM
2176Copies a double into the given SV, upgrading first if necessary.
2177Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
2178
2179=cut
2180*/
2181
ef50df4b 2182void
65202027 2183Perl_sv_setnv(pTHX_ register SV *sv, NV num)
79072805 2184{
765f542d 2185 SV_CHECK_THINKFIRST_COW_DROP(sv);
a0d0e21e
LW
2186 switch (SvTYPE(sv)) {
2187 case SVt_NULL:
2188 case SVt_IV:
79072805 2189 sv_upgrade(sv, SVt_NV);
a0d0e21e 2190 break;
a0d0e21e
LW
2191 case SVt_RV:
2192 case SVt_PV:
2193 case SVt_PVIV:
79072805 2194 sv_upgrade(sv, SVt_PVNV);
a0d0e21e 2195 break;
827b7e14 2196
a0d0e21e 2197 case SVt_PVGV:
a0d0e21e
LW
2198 case SVt_PVAV:
2199 case SVt_PVHV:
2200 case SVt_PVCV:
2201 case SVt_PVFM:
2202 case SVt_PVIO:
411caa50 2203 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
53e06cf0 2204 OP_NAME(PL_op));
79072805 2205 }
9d6ce603 2206 SvNV_set(sv, num);
a0d0e21e 2207 (void)SvNOK_only(sv); /* validate number */
463ee0b2 2208 SvTAINT(sv);
79072805
LW
2209}
2210
954c1994
GS
2211/*
2212=for apidoc sv_setnv_mg
2213
2214Like C<sv_setnv>, but also handles 'set' magic.
2215
2216=cut
2217*/
2218
ef50df4b 2219void
65202027 2220Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
ef50df4b
GS
2221{
2222 sv_setnv(sv,num);
2223 SvSETMAGIC(sv);
2224}
2225
645c22ef
DM
2226/* Print an "isn't numeric" warning, using a cleaned-up,
2227 * printable version of the offending string
2228 */
2229
76e3520e 2230STATIC void
cea2e8a9 2231S_not_a_number(pTHX_ SV *sv)
a0d0e21e 2232{
94463019
JH
2233 SV *dsv;
2234 char tmpbuf[64];
2235 char *pv;
2236
2237 if (DO_UTF8(sv)) {
2238 dsv = sv_2mortal(newSVpv("", 0));
2239 pv = sv_uni_display(dsv, sv, 10, 0);
2240 } else {
2241 char *d = tmpbuf;
2242 char *limit = tmpbuf + sizeof(tmpbuf) - 8;
2243 /* each *s can expand to 4 chars + "...\0",
2244 i.e. need room for 8 chars */
ecdeb87c 2245
94463019
JH
2246 char *s, *end;
2247 for (s = SvPVX(sv), end = s + SvCUR(sv); s < end && d < limit; s++) {
2248 int ch = *s & 0xFF;
2249 if (ch & 128 && !isPRINT_LC(ch)) {
2250 *d++ = 'M';
2251 *d++ = '-';
2252 ch &= 127;
2253 }
2254 if (ch == '\n') {
2255 *d++ = '\\';
2256 *d++ = 'n';
2257 }
2258 else if (ch == '\r') {
2259 *d++ = '\\';
2260 *d++ = 'r';
2261 }
2262 else if (ch == '\f') {
2263 *d++ = '\\';
2264 *d++ = 'f';
2265 }
2266 else if (ch == '\\') {
2267 *d++ = '\\';
2268 *d++ = '\\';
2269 }
2270 else if (ch == '\0') {
2271 *d++ = '\\';
2272 *d++ = '0';
2273 }
2274 else if (isPRINT_LC(ch))
2275 *d++ = ch;
2276 else {
2277 *d++ = '^';
2278 *d++ = toCTRL(ch);
2279 }
2280 }
2281 if (s < end) {
2282 *d++ = '.';
2283 *d++ = '.';
2284 *d++ = '.';
2285 }
2286 *d = '\0';
2287 pv = tmpbuf;
a0d0e21e 2288 }
a0d0e21e 2289
533c011a 2290 if (PL_op)
9014280d 2291 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
2292 "Argument \"%s\" isn't numeric in %s", pv,
2293 OP_DESC(PL_op));
a0d0e21e 2294 else
9014280d 2295 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 2296 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
2297}
2298
c2988b20
NC
2299/*
2300=for apidoc looks_like_number
2301
645c22ef
DM
2302Test if the content of an SV looks like a number (or is a number).
2303C<Inf> and C<Infinity> are treated as numbers (so will not issue a
2304non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
2305
2306=cut
2307*/
2308
2309I32
2310Perl_looks_like_number(pTHX_ SV *sv)
2311{
a3b680e6 2312 register const char *sbegin;
c2988b20
NC
2313 STRLEN len;
2314
2315 if (SvPOK(sv)) {
2316 sbegin = SvPVX(sv);
2317 len = SvCUR(sv);
2318 }
2319 else if (SvPOKp(sv))
2320 sbegin = SvPV(sv, len);
2321 else
e0ab1c0e 2322 return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
c2988b20
NC
2323 return grok_number(sbegin, len, NULL);
2324}
25da4f38
IZ
2325
2326/* Actually, ISO C leaves conversion of UV to IV undefined, but
2327 until proven guilty, assume that things are not that bad... */
2328
645c22ef
DM
2329/*
2330 NV_PRESERVES_UV:
2331
2332 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
2333 an IV (an assumption perl has been based on to date) it becomes necessary
2334 to remove the assumption that the NV always carries enough precision to
2335 recreate the IV whenever needed, and that the NV is the canonical form.
2336 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 2337 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
2338 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
2339 1) to distinguish between IV/UV/NV slots that have cached a valid
2340 conversion where precision was lost and IV/UV/NV slots that have a
2341 valid conversion which has lost no precision
645c22ef 2342 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
2343 would lose precision, the precise conversion (or differently
2344 imprecise conversion) is also performed and cached, to prevent
2345 requests for different numeric formats on the same SV causing
2346 lossy conversion chains. (lossless conversion chains are perfectly
2347 acceptable (still))
2348
2349
2350 flags are used:
2351 SvIOKp is true if the IV slot contains a valid value
2352 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
2353 SvNOKp is true if the NV slot contains a valid value
2354 SvNOK is true only if the NV value is accurate
2355
2356 so
645c22ef 2357 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
2358 IV(or UV) would lose accuracy over a direct conversion from PV to
2359 IV(or UV). If it would, cache both conversions, return NV, but mark
2360 SV as IOK NOKp (ie not NOK).
2361
645c22ef 2362 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
2363 NV would lose accuracy over a direct conversion from PV to NV. If it
2364 would, cache both conversions, flag similarly.
2365
2366 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
2367 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
2368 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
2369 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 2370 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 2371
645c22ef
DM
2372 The benefit of this is that operations such as pp_add know that if
2373 SvIOK is true for both left and right operands, then integer addition
2374 can be used instead of floating point (for cases where the result won't
2375 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
2376 loss of precision compared with integer addition.
2377
2378 * making IV and NV equal status should make maths accurate on 64 bit
2379 platforms
2380 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 2381 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
2382 looking for SvIOK and checking for overflow will not outweigh the
2383 fp to integer speedup)
2384 * will slow down integer operations (callers of SvIV) on "inaccurate"
2385 values, as the change from SvIOK to SvIOKp will cause a call into
2386 sv_2iv each time rather than a macro access direct to the IV slot
2387 * should speed up number->string conversion on integers as IV is
645c22ef 2388 favoured when IV and NV are equally accurate
28e5dec8
JH
2389
2390 ####################################################################
645c22ef
DM
2391 You had better be using SvIOK_notUV if you want an IV for arithmetic:
2392 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
2393 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
2394 ####################################################################
2395
645c22ef 2396 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
2397 performance ratio.
2398*/
2399
2400#ifndef NV_PRESERVES_UV
645c22ef
DM
2401# define IS_NUMBER_UNDERFLOW_IV 1
2402# define IS_NUMBER_UNDERFLOW_UV 2
2403# define IS_NUMBER_IV_AND_UV 2
2404# define IS_NUMBER_OVERFLOW_IV 4
2405# define IS_NUMBER_OVERFLOW_UV 5
2406
2407/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
2408
2409/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
2410STATIC int
645c22ef 2411S_sv_2iuv_non_preserve(pTHX_ register SV *sv, I32 numtype)
28e5dec8 2412{
1779d84d 2413 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
2414 if (SvNVX(sv) < (NV)IV_MIN) {
2415 (void)SvIOKp_on(sv);
2416 (void)SvNOK_on(sv);
45977657 2417 SvIV_set(sv, IV_MIN);
28e5dec8
JH
2418 return IS_NUMBER_UNDERFLOW_IV;
2419 }
2420 if (SvNVX(sv) > (NV)UV_MAX) {
2421 (void)SvIOKp_on(sv);
2422 (void)SvNOK_on(sv);
2423 SvIsUV_on(sv);
607fa7f2 2424 SvUV_set(sv, UV_MAX);
28e5dec8
JH
2425 return IS_NUMBER_OVERFLOW_UV;
2426 }
c2988b20
NC
2427 (void)SvIOKp_on(sv);
2428 (void)SvNOK_on(sv);
2429 /* Can't use strtol etc to convert this string. (See truth table in
2430 sv_2iv */
2431 if (SvNVX(sv) <= (UV)IV_MAX) {
45977657 2432 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2433 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2434 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
2435 } else {
2436 /* Integer is imprecise. NOK, IOKp */
2437 }
2438 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
2439 }
2440 SvIsUV_on(sv);
607fa7f2 2441 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
2442 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2443 if (SvUVX(sv) == UV_MAX) {
2444 /* As we know that NVs don't preserve UVs, UV_MAX cannot
2445 possibly be preserved by NV. Hence, it must be overflow.
2446 NOK, IOKp */
2447 return IS_NUMBER_OVERFLOW_UV;
2448 }
2449 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
2450 } else {
2451 /* Integer is imprecise. NOK, IOKp */
28e5dec8 2452 }
c2988b20 2453 return IS_NUMBER_OVERFLOW_IV;
28e5dec8 2454}
645c22ef
DM
2455#endif /* !NV_PRESERVES_UV*/
2456
891f9566
YST
2457/* sv_2iv() is now a macro using Perl_sv_2iv_flags();
2458 * this function provided for binary compatibility only
2459 */
2460
2461IV
2462Perl_sv_2iv(pTHX_ register SV *sv)
2463{
2464 return sv_2iv_flags(sv, SV_GMAGIC);
2465}
2466
645c22ef 2467/*
891f9566 2468=for apidoc sv_2iv_flags
645c22ef 2469
891f9566
YST
2470Return the integer value of an SV, doing any necessary string
2471conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2472Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
645c22ef
DM
2473
2474=cut
2475*/
28e5dec8 2476
a0d0e21e 2477IV
891f9566 2478Perl_sv_2iv_flags(pTHX_ register SV *sv, I32 flags)
79072805
LW
2479{
2480 if (!sv)
2481 return 0;
8990e307 2482 if (SvGMAGICAL(sv)) {
891f9566
YST
2483 if (flags & SV_GMAGIC)
2484 mg_get(sv);
463ee0b2
LW
2485 if (SvIOKp(sv))
2486 return SvIVX(sv);
748a9306 2487 if (SvNOKp(sv)) {
25da4f38 2488 return I_V(SvNVX(sv));
748a9306 2489 }
36477c24 2490 if (SvPOKp(sv) && SvLEN(sv))
2491 return asIV(sv);
3fe9a6f1 2492 if (!SvROK(sv)) {
d008e5eb 2493 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2494 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 2495 report_uninit(sv);
c6ee37c5 2496 }
36477c24 2497 return 0;
3fe9a6f1 2498 }
463ee0b2 2499 }
ed6116ce 2500 if (SvTHINKFIRST(sv)) {
a0d0e21e 2501 if (SvROK(sv)) {
a0d0e21e 2502 SV* tmpstr;
1554e226 2503 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2504 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2505 return SvIV(tmpstr);
56431972 2506 return PTR2IV(SvRV(sv));
a0d0e21e 2507 }
765f542d
NC
2508 if (SvIsCOW(sv)) {
2509 sv_force_normal_flags(sv, 0);
47deb5e7 2510 }
0336b60e 2511 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2512 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2513 report_uninit(sv);
ed6116ce
LW
2514 return 0;
2515 }
79072805 2516 }
25da4f38
IZ
2517 if (SvIOKp(sv)) {
2518 if (SvIsUV(sv)) {
2519 return (IV)(SvUVX(sv));
2520 }
2521 else {
2522 return SvIVX(sv);
2523 }
463ee0b2 2524 }
748a9306 2525 if (SvNOKp(sv)) {
28e5dec8
JH
2526 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2527 * without also getting a cached IV/UV from it at the same time
2528 * (ie PV->NV conversion should detect loss of accuracy and cache
2529 * IV or UV at same time to avoid this. NWC */
25da4f38
IZ
2530
2531 if (SvTYPE(sv) == SVt_NV)
2532 sv_upgrade(sv, SVt_PVNV);
2533
28e5dec8
JH
2534 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2535 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
2536 certainly cast into the IV range at IV_MAX, whereas the correct
2537 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
2538 cases go to UV */
2539 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2540 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
2541 if (SvNVX(sv) == (NV) SvIVX(sv)
2542#ifndef NV_PRESERVES_UV
2543 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2544 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2545 /* Don't flag it as "accurately an integer" if the number
2546 came from a (by definition imprecise) NV operation, and
2547 we're outside the range of NV integer precision */
2548#endif
2549 ) {
2550 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2551 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2552 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2553 PTR2UV(sv),
2554 SvNVX(sv),
2555 SvIVX(sv)));
2556
2557 } else {
2558 /* IV not precise. No need to convert from PV, as NV
2559 conversion would already have cached IV if it detected
2560 that PV->IV would be better than PV->NV->IV
2561 flags already correct - don't set public IOK. */
2562 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2563 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2564 PTR2UV(sv),
2565 SvNVX(sv),
2566 SvIVX(sv)));
2567 }
2568 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2569 but the cast (NV)IV_MIN rounds to a the value less (more
2570 negative) than IV_MIN which happens to be equal to SvNVX ??
2571 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2572 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2573 (NV)UVX == NVX are both true, but the values differ. :-(
2574 Hopefully for 2s complement IV_MIN is something like
2575 0x8000000000000000 which will be exact. NWC */
d460ef45 2576 }
25da4f38 2577 else {
607fa7f2 2578 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
2579 if (
2580 (SvNVX(sv) == (NV) SvUVX(sv))
2581#ifndef NV_PRESERVES_UV
2582 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2583 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2584 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2585 /* Don't flag it as "accurately an integer" if the number
2586 came from a (by definition imprecise) NV operation, and
2587 we're outside the range of NV integer precision */
2588#endif
2589 )
2590 SvIOK_on(sv);
25da4f38
IZ
2591 SvIsUV_on(sv);
2592 ret_iv_max:
1c846c1f 2593 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 2594 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 2595 PTR2UV(sv),
57def98f
JH
2596 SvUVX(sv),
2597 SvUVX(sv)));
25da4f38
IZ
2598 return (IV)SvUVX(sv);
2599 }
748a9306
LW
2600 }
2601 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2602 UV value;
504618e9 2603 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
25da4f38
IZ
2604 /* We want to avoid a possible problem when we cache an IV which
2605 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
2606 the same as the direct translation of the initial string
2607 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2608 be careful to ensure that the value with the .456 is around if the
2609 NV value is requested in the future).
1c846c1f 2610
25da4f38
IZ
2611 This means that if we cache such an IV, we need to cache the
2612 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 2613 cache the NV if we are sure it's not needed.
25da4f38 2614 */
16b7a9a4 2615
c2988b20
NC
2616 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2617 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2618 == IS_NUMBER_IN_UV) {
5e045b90 2619 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
2620 if (SvTYPE(sv) < SVt_PVIV)
2621 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 2622 (void)SvIOK_on(sv);
c2988b20
NC
2623 } else if (SvTYPE(sv) < SVt_PVNV)
2624 sv_upgrade(sv, SVt_PVNV);
28e5dec8 2625
c2988b20
NC
2626 /* If NV preserves UV then we only use the UV value if we know that
2627 we aren't going to call atof() below. If NVs don't preserve UVs
2628 then the value returned may have more precision than atof() will
2629 return, even though value isn't perfectly accurate. */
2630 if ((numtype & (IS_NUMBER_IN_UV
2631#ifdef NV_PRESERVES_UV
2632 | IS_NUMBER_NOT_INT
2633#endif
2634 )) == IS_NUMBER_IN_UV) {
2635 /* This won't turn off the public IOK flag if it was set above */
2636 (void)SvIOKp_on(sv);
2637
2638 if (!(numtype & IS_NUMBER_NEG)) {
2639 /* positive */;
2640 if (value <= (UV)IV_MAX) {
45977657 2641 SvIV_set(sv, (IV)value);
c2988b20 2642 } else {
607fa7f2 2643 SvUV_set(sv, value);
c2988b20
NC
2644 SvIsUV_on(sv);
2645 }
2646 } else {
2647 /* 2s complement assumption */
2648 if (value <= (UV)IV_MIN) {
45977657 2649 SvIV_set(sv, -(IV)value);
c2988b20
NC
2650 } else {
2651 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2652 I'm assuming it will be rare. */
c2988b20
NC
2653 if (SvTYPE(sv) < SVt_PVNV)
2654 sv_upgrade(sv, SVt_PVNV);
2655 SvNOK_on(sv);
2656 SvIOK_off(sv);
2657 SvIOKp_on(sv);
9d6ce603 2658 SvNV_set(sv, -(NV)value);
45977657 2659 SvIV_set(sv, IV_MIN);
c2988b20
NC
2660 }
2661 }
2662 }
2663 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2664 will be in the previous block to set the IV slot, and the next
2665 block to set the NV slot. So no else here. */
2666
2667 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2668 != IS_NUMBER_IN_UV) {
2669 /* It wasn't an (integer that doesn't overflow the UV). */
9d6ce603 2670 SvNV_set(sv, Atof(SvPVX(sv)));
28e5dec8 2671
c2988b20
NC
2672 if (! numtype && ckWARN(WARN_NUMERIC))
2673 not_a_number(sv);
28e5dec8 2674
65202027 2675#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2676 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2677 PTR2UV(sv), SvNVX(sv)));
65202027 2678#else
1779d84d 2679 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 2680 PTR2UV(sv), SvNVX(sv)));
65202027 2681#endif
28e5dec8
JH
2682
2683
2684#ifdef NV_PRESERVES_UV
c2988b20
NC
2685 (void)SvIOKp_on(sv);
2686 (void)SvNOK_on(sv);
2687 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2688 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2689 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2690 SvIOK_on(sv);
28e5dec8 2691 } else {
c2988b20
NC
2692 /* Integer is imprecise. NOK, IOKp */
2693 }
2694 /* UV will not work better than IV */
2695 } else {
2696 if (SvNVX(sv) > (NV)UV_MAX) {
2697 SvIsUV_on(sv);
2698 /* Integer is inaccurate. NOK, IOKp, is UV */
607fa7f2 2699 SvUV_set(sv, UV_MAX);
c2988b20
NC
2700 SvIsUV_on(sv);
2701 } else {
607fa7f2 2702 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
2703 /* 0xFFFFFFFFFFFFFFFF not an issue in here */
2704 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2705 SvIOK_on(sv);
28e5dec8
JH
2706 SvIsUV_on(sv);
2707 } else {
c2988b20
NC
2708 /* Integer is imprecise. NOK, IOKp, is UV */
2709 SvIsUV_on(sv);
28e5dec8 2710 }
28e5dec8 2711 }
c2988b20
NC
2712 goto ret_iv_max;
2713 }
28e5dec8 2714#else /* NV_PRESERVES_UV */
c2988b20
NC
2715 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2716 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2717 /* The IV slot will have been set from value returned by
2718 grok_number above. The NV slot has just been set using
2719 Atof. */
560b0c46 2720 SvNOK_on(sv);
c2988b20
NC
2721 assert (SvIOKp(sv));
2722 } else {
2723 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2724 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2725 /* Small enough to preserve all bits. */
2726 (void)SvIOKp_on(sv);
2727 SvNOK_on(sv);
45977657 2728 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2729 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2730 SvIOK_on(sv);
2731 /* Assumption: first non-preserved integer is < IV_MAX,
2732 this NV is in the preserved range, therefore: */
2733 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2734 < (UV)IV_MAX)) {
32fdb065 2735 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
2736 }
2737 } else {
2738 /* IN_UV NOT_INT
2739 0 0 already failed to read UV.
2740 0 1 already failed to read UV.
2741 1 0 you won't get here in this case. IV/UV
2742 slot set, public IOK, Atof() unneeded.
2743 1 1 already read UV.
2744 so there's no point in sv_2iuv_non_preserve() attempting
2745 to use atol, strtol, strtoul etc. */
2746 if (sv_2iuv_non_preserve (sv, numtype)
2747 >= IS_NUMBER_OVERFLOW_IV)
2748 goto ret_iv_max;
2749 }
2750 }
28e5dec8 2751#endif /* NV_PRESERVES_UV */
25da4f38 2752 }
28e5dec8 2753 } else {
599cee73 2754 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 2755 report_uninit(sv);
25da4f38
IZ
2756 if (SvTYPE(sv) < SVt_IV)
2757 /* Typically the caller expects that sv_any is not NULL now. */
2758 sv_upgrade(sv, SVt_IV);
a0d0e21e 2759 return 0;
79072805 2760 }
1d7c1841
GS
2761 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2762 PTR2UV(sv),SvIVX(sv)));
25da4f38 2763 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
2764}
2765
891f9566
YST
2766/* sv_2uv() is now a macro using Perl_sv_2uv_flags();
2767 * this function provided for binary compatibility only
2768 */
2769
2770UV
2771Perl_sv_2uv(pTHX_ register SV *sv)
2772{
2773 return sv_2uv_flags(sv, SV_GMAGIC);
2774}
2775
645c22ef 2776/*
891f9566 2777=for apidoc sv_2uv_flags
645c22ef
DM
2778
2779Return the unsigned integer value of an SV, doing any necessary string
891f9566
YST
2780conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2781Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
645c22ef
DM
2782
2783=cut
2784*/
2785
ff68c719 2786UV
891f9566 2787Perl_sv_2uv_flags(pTHX_ register SV *sv, I32 flags)
ff68c719 2788{
2789 if (!sv)
2790 return 0;
2791 if (SvGMAGICAL(sv)) {
891f9566
YST
2792 if (flags & SV_GMAGIC)
2793 mg_get(sv);
ff68c719 2794 if (SvIOKp(sv))
2795 return SvUVX(sv);
2796 if (SvNOKp(sv))
2797 return U_V(SvNVX(sv));
36477c24 2798 if (SvPOKp(sv) && SvLEN(sv))
2799 return asUV(sv);
3fe9a6f1 2800 if (!SvROK(sv)) {
d008e5eb 2801 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2802 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 2803 report_uninit(sv);
c6ee37c5 2804 }
36477c24 2805 return 0;
3fe9a6f1 2806 }
ff68c719 2807 }
2808 if (SvTHINKFIRST(sv)) {
2809 if (SvROK(sv)) {
ff68c719 2810 SV* tmpstr;
1554e226 2811 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2812 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2813 return SvUV(tmpstr);
56431972 2814 return PTR2UV(SvRV(sv));
ff68c719 2815 }
765f542d
NC
2816 if (SvIsCOW(sv)) {
2817 sv_force_normal_flags(sv, 0);
8a818333 2818 }
0336b60e 2819 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2820 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2821 report_uninit(sv);
ff68c719 2822 return 0;
2823 }
2824 }
25da4f38
IZ
2825 if (SvIOKp(sv)) {
2826 if (SvIsUV(sv)) {
2827 return SvUVX(sv);
2828 }
2829 else {
2830 return (UV)SvIVX(sv);
2831 }
ff68c719 2832 }
2833 if (SvNOKp(sv)) {
28e5dec8
JH
2834 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2835 * without also getting a cached IV/UV from it at the same time
2836 * (ie PV->NV conversion should detect loss of accuracy and cache
2837 * IV or UV at same time to avoid this. */
2838 /* IV-over-UV optimisation - choose to cache IV if possible */
2839
25da4f38
IZ
2840 if (SvTYPE(sv) == SVt_NV)
2841 sv_upgrade(sv, SVt_PVNV);
28e5dec8
JH
2842
2843 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2844 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2845 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
2846 if (SvNVX(sv) == (NV) SvIVX(sv)
2847#ifndef NV_PRESERVES_UV
2848 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2849 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2850 /* Don't flag it as "accurately an integer" if the number
2851 came from a (by definition imprecise) NV operation, and
2852 we're outside the range of NV integer precision */
2853#endif
2854 ) {
2855 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2856 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2857 "0x%"UVxf" uv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2858 PTR2UV(sv),
2859 SvNVX(sv),
2860 SvIVX(sv)));
2861
2862 } else {
2863 /* IV not precise. No need to convert from PV, as NV
2864 conversion would already have cached IV if it detected
2865 that PV->IV would be better than PV->NV->IV
2866 flags already correct - don't set public IOK. */
2867 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2868 "0x%"UVxf" uv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2869 PTR2UV(sv),
2870 SvNVX(sv),
2871 SvIVX(sv)));
2872 }
2873 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2874 but the cast (NV)IV_MIN rounds to a the value less (more
2875 negative) than IV_MIN which happens to be equal to SvNVX ??
2876 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2877 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2878 (NV)UVX == NVX are both true, but the values differ. :-(
2879 Hopefully for 2s complement IV_MIN is something like
2880 0x8000000000000000 which will be exact. NWC */
d460ef45 2881 }
28e5dec8 2882 else {
607fa7f2 2883 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
2884 if (
2885 (SvNVX(sv) == (NV) SvUVX(sv))
2886#ifndef NV_PRESERVES_UV
2887 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2888 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2889 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2890 /* Don't flag it as "accurately an integer" if the number
2891 came from a (by definition imprecise) NV operation, and
2892 we're outside the range of NV integer precision */
2893#endif
2894 )
2895 SvIOK_on(sv);
2896 SvIsUV_on(sv);
1c846c1f 2897 DEBUG_c(PerlIO_printf(Perl_debug_log,
28e5dec8 2898 "0x%"UVxf" 2uv(%"UVuf" => %"IVdf") (as unsigned)\n",
57def98f 2899 PTR2UV(sv),
28e5dec8
JH
2900 SvUVX(sv),
2901 SvUVX(sv)));
25da4f38 2902 }
ff68c719 2903 }
2904 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2905 UV value;
504618e9 2906 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
25da4f38
IZ
2907
2908 /* We want to avoid a possible problem when we cache a UV which
2909 may be later translated to an NV, and the resulting NV is not
2910 the translation of the initial data.
1c846c1f 2911
25da4f38
IZ
2912 This means that if we cache such a UV, we need to cache the
2913 NV as well. Moreover, we trade speed for space, and do not
2914 cache the NV if not needed.
2915 */
16b7a9a4 2916
c2988b20
NC
2917 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2918 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2919 == IS_NUMBER_IN_UV) {
5e045b90 2920 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8 2921 if (SvTYPE(sv) < SVt_PVIV)
f7bbb42a
JH
2922 sv_upgrade(sv, SVt_PVIV);
2923 (void)SvIOK_on(sv);
c2988b20
NC
2924 } else if (SvTYPE(sv) < SVt_PVNV)
2925 sv_upgrade(sv, SVt_PVNV);
d460ef45 2926
c2988b20
NC
2927 /* If NV preserves UV then we only use the UV value if we know that
2928 we aren't going to call atof() below. If NVs don't preserve UVs
2929 then the value returned may have more precision than atof() will
2930 return, even though it isn't accurate. */
2931 if ((numtype & (IS_NUMBER_IN_UV
2932#ifdef NV_PRESERVES_UV
2933 | IS_NUMBER_NOT_INT
2934#endif
2935 )) == IS_NUMBER_IN_UV) {
2936 /* This won't turn off the public IOK flag if it was set above */
2937 (void)SvIOKp_on(sv);
2938
2939 if (!(numtype & IS_NUMBER_NEG)) {
2940 /* positive */;
2941 if (value <= (UV)IV_MAX) {
45977657 2942 SvIV_set(sv, (IV)value);
28e5dec8
JH
2943 } else {
2944 /* it didn't overflow, and it was positive. */
607fa7f2 2945 SvUV_set(sv, value);
28e5dec8
JH
2946 SvIsUV_on(sv);
2947 }
c2988b20
NC
2948 } else {
2949 /* 2s complement assumption */
2950 if (value <= (UV)IV_MIN) {
45977657 2951 SvIV_set(sv, -(IV)value);
c2988b20
NC
2952 } else {
2953 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2954 I'm assuming it will be rare. */
c2988b20
NC
2955 if (SvTYPE(sv) < SVt_PVNV)
2956 sv_upgrade(sv, SVt_PVNV);
2957 SvNOK_on(sv);
2958 SvIOK_off(sv);
2959 SvIOKp_on(sv);
9d6ce603 2960 SvNV_set(sv, -(NV)value);
45977657 2961 SvIV_set(sv, IV_MIN);
c2988b20
NC
2962 }
2963 }
2964 }
2965
2966 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2967 != IS_NUMBER_IN_UV) {
2968 /* It wasn't an integer, or it overflowed the UV. */
9d6ce603 2969 SvNV_set(sv, Atof(SvPVX(sv)));
28e5dec8 2970
c2988b20 2971 if (! numtype && ckWARN(WARN_NUMERIC))
28e5dec8
JH
2972 not_a_number(sv);
2973
2974#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2975 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%" PERL_PRIgldbl ")\n",
2976 PTR2UV(sv), SvNVX(sv)));
28e5dec8 2977#else
1779d84d 2978 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"NVgf")\n",
c2988b20 2979 PTR2UV(sv), SvNVX(sv)));
28e5dec8
JH
2980#endif
2981
2982#ifdef NV_PRESERVES_UV
c2988b20
NC
2983 (void)SvIOKp_on(sv);
2984 (void)SvNOK_on(sv);
2985 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2986 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2987 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2988 SvIOK_on(sv);
2989 } else {
2990 /* Integer is imprecise. NOK, IOKp */
2991 }
2992 /* UV will not work better than IV */
2993 } else {
2994 if (SvNVX(sv) > (NV)UV_MAX) {
2995 SvIsUV_on(sv);
2996 /* Integer is inaccurate. NOK, IOKp, is UV */
607fa7f2 2997 SvUV_set(sv, UV_MAX);
c2988b20
NC
2998 SvIsUV_on(sv);
2999 } else {
607fa7f2 3000 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
3001 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
3002 NV preservse UV so can do correct comparison. */
3003 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
3004 SvIOK_on(sv);
3005 SvIsUV_on(sv);
3006 } else {
3007 /* Integer is imprecise. NOK, IOKp, is UV */
3008 SvIsUV_on(sv);
3009 }
3010 }
3011 }
28e5dec8 3012#else /* NV_PRESERVES_UV */
c2988b20
NC
3013 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3014 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
3015 /* The UV slot will have been set from value returned by
3016 grok_number above. The NV slot has just been set using
3017 Atof. */
560b0c46 3018 SvNOK_on(sv);
c2988b20
NC
3019 assert (SvIOKp(sv));
3020 } else {
3021 if (((UV)1 << NV_PRESERVES_UV_BITS) >
3022 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
3023 /* Small enough to preserve all bits. */
3024 (void)SvIOKp_on(sv);
3025 SvNOK_on(sv);
45977657 3026 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
3027 if ((NV)(SvIVX(sv)) == SvNVX(sv))
3028 SvIOK_on(sv);
3029 /* Assumption: first non-preserved integer is < IV_MAX,
3030 this NV is in the preserved range, therefore: */
3031 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
3032 < (UV)IV_MAX)) {
32fdb065 3033 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
3034 }
3035 } else
3036 sv_2iuv_non_preserve (sv, numtype);
3037 }
28e5dec8 3038#endif /* NV_PRESERVES_UV */
f7bbb42a 3039 }
ff68c719 3040 }
3041 else {
d008e5eb 3042 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3043 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3044 report_uninit(sv);
c6ee37c5 3045 }
25da4f38
IZ
3046 if (SvTYPE(sv) < SVt_IV)
3047 /* Typically the caller expects that sv_any is not NULL now. */
3048 sv_upgrade(sv, SVt_IV);
ff68c719 3049 return 0;
3050 }
25da4f38 3051
1d7c1841
GS
3052 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
3053 PTR2UV(sv),SvUVX(sv)));
25da4f38 3054 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 3055}
3056
645c22ef
DM
3057/*
3058=for apidoc sv_2nv
3059
3060Return the num value of an SV, doing any necessary string or integer
3061conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
3062macros.
3063
3064=cut
3065*/
3066
65202027 3067NV
864dbfa3 3068Perl_sv_2nv(pTHX_ register SV *sv)
79072805
LW
3069{
3070 if (!sv)
3071 return 0.0;
8990e307 3072 if (SvGMAGICAL(sv)) {
463ee0b2
LW
3073 mg_get(sv);
3074 if (SvNOKp(sv))
3075 return SvNVX(sv);
a0d0e21e 3076 if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 3077 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) &&
504618e9 3078 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
a0d0e21e 3079 not_a_number(sv);
097ee67d 3080 return Atof(SvPVX(sv));
a0d0e21e 3081 }
25da4f38 3082 if (SvIOKp(sv)) {
1c846c1f 3083 if (SvIsUV(sv))
65202027 3084 return (NV)SvUVX(sv);
25da4f38 3085 else
65202027 3086 return (NV)SvIVX(sv);
25da4f38 3087 }
16d20bd9 3088 if (!SvROK(sv)) {
d008e5eb 3089 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3090 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3091 report_uninit(sv);
c6ee37c5 3092 }
16d20bd9
AD
3093 return 0;
3094 }
463ee0b2 3095 }
ed6116ce 3096 if (SvTHINKFIRST(sv)) {
a0d0e21e 3097 if (SvROK(sv)) {
a0d0e21e 3098 SV* tmpstr;
1554e226 3099 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 3100 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 3101 return SvNV(tmpstr);
56431972 3102 return PTR2NV(SvRV(sv));
a0d0e21e 3103 }
765f542d
NC
3104 if (SvIsCOW(sv)) {
3105 sv_force_normal_flags(sv, 0);
8a818333 3106 }
0336b60e 3107 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 3108 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 3109 report_uninit(sv);
ed6116ce
LW
3110 return 0.0;
3111 }
79072805
LW
3112 }
3113 if (SvTYPE(sv) < SVt_NV) {
463ee0b2
LW
3114 if (SvTYPE(sv) == SVt_IV)
3115 sv_upgrade(sv, SVt_PVNV);
3116 else
3117 sv_upgrade(sv, SVt_NV);
906f284f 3118#ifdef USE_LONG_DOUBLE
097ee67d 3119 DEBUG_c({
f93f4e46 3120 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
3121 PerlIO_printf(Perl_debug_log,
3122 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
3123 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
3124 RESTORE_NUMERIC_LOCAL();
3125 });
65202027 3126#else
572bbb43 3127 DEBUG_c({
f93f4e46 3128 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 3129 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 3130 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
3131 RESTORE_NUMERIC_LOCAL();
3132 });
572bbb43 3133#endif
79072805
LW
3134 }
3135 else if (SvTYPE(sv) < SVt_PVNV)
3136 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
3137 if (SvNOKp(sv)) {
3138 return SvNVX(sv);
61604483 3139 }
59d8ce62 3140 if (SvIOKp(sv)) {
9d6ce603 3141 SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
28e5dec8
JH
3142#ifdef NV_PRESERVES_UV
3143 SvNOK_on(sv);
3144#else
3145 /* Only set the public NV OK flag if this NV preserves the IV */
3146 /* Check it's not 0xFFFFFFFFFFFFFFFF */
3147 if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
3148 : (SvIVX(sv) == I_V(SvNVX(sv))))
3149 SvNOK_on(sv);
3150 else
3151 SvNOKp_on(sv);
3152#endif
93a17b20 3153 }
748a9306 3154 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 3155 UV value;
f54cb97a 3156 const int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
c2988b20 3157 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !numtype)
a0d0e21e 3158 not_a_number(sv);
28e5dec8 3159#ifdef NV_PRESERVES_UV
c2988b20
NC
3160 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3161 == IS_NUMBER_IN_UV) {
5e045b90 3162 /* It's definitely an integer */
9d6ce603 3163 SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
c2988b20 3164 } else
9d6ce603 3165 SvNV_set(sv, Atof(SvPVX(sv)));
28e5dec8
JH
3166 SvNOK_on(sv);
3167#else
9d6ce603 3168 SvNV_set(sv, Atof(SvPVX(sv)));
28e5dec8
JH
3169 /* Only set the public NV OK flag if this NV preserves the value in
3170 the PV at least as well as an IV/UV would.
3171 Not sure how to do this 100% reliably. */
3172 /* if that shift count is out of range then Configure's test is
3173 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
3174 UV_BITS */
3175 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 3176 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 3177 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
3178 } else if (!(numtype & IS_NUMBER_IN_UV)) {
3179 /* Can't use strtol etc to convert this string, so don't try.
3180 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
3181 SvNOK_on(sv);
3182 } else {
3183 /* value has been set. It may not be precise. */
3184 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
3185 /* 2s complement assumption for (UV)IV_MIN */
3186 SvNOK_on(sv); /* Integer is too negative. */
3187 } else {
3188 SvNOKp_on(sv);
3189 SvIOKp_on(sv);
6fa402ec 3190
c2988b20 3191 if (numtype & IS_NUMBER_NEG) {
45977657 3192 SvIV_set(sv, -(IV)value);
c2988b20 3193 } else if (value <= (UV)IV_MAX) {
45977657 3194 SvIV_set(sv, (IV)value);
c2988b20 3195 } else {
607fa7f2 3196 SvUV_set(sv, value);
c2988b20
NC
3197 SvIsUV_on(sv);
3198 }
3199
3200 if (numtype & IS_NUMBER_NOT_INT) {
3201 /* I believe that even if the original PV had decimals,
3202 they are lost beyond the limit of the FP precision.
3203 However, neither is canonical, so both only get p
3204 flags. NWC, 2000/11/25 */
3205 /* Both already have p flags, so do nothing */
3206 } else {
3207 NV nv = SvNVX(sv);
3208 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
3209 if (SvIVX(sv) == I_V(nv)) {
3210 SvNOK_on(sv);
3211 SvIOK_on(sv);
3212 } else {
3213 SvIOK_on(sv);
3214 /* It had no "." so it must be integer. */
3215 }
3216 } else {
3217 /* between IV_MAX and NV(UV_MAX).
3218 Could be slightly > UV_MAX */
6fa402ec 3219
c2988b20
NC
3220 if (numtype & IS_NUMBER_NOT_INT) {
3221 /* UV and NV both imprecise. */
3222 } else {
3223 UV nv_as_uv = U_V(nv);
3224
3225 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
3226 SvNOK_on(sv);
3227 SvIOK_on(sv);
3228 } else {
3229 SvIOK_on(sv);
3230 }
3231 }
3232 }
3233 }
3234 }
3235 }
28e5dec8 3236#endif /* NV_PRESERVES_UV */
93a17b20 3237 }
79072805 3238 else {
599cee73 3239 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 3240 report_uninit(sv);
25da4f38
IZ
3241 if (SvTYPE(sv) < SVt_NV)
3242 /* Typically the caller expects that sv_any is not NULL now. */
28e5dec8
JH
3243 /* XXX Ilya implies that this is a bug in callers that assume this
3244 and ideally should be fixed. */
25da4f38 3245 sv_upgrade(sv, SVt_NV);
a0d0e21e 3246 return 0.0;
79072805 3247 }
572bbb43 3248#if defined(USE_LONG_DOUBLE)
097ee67d 3249 DEBUG_c({
f93f4e46 3250 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
3251 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
3252 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
3253 RESTORE_NUMERIC_LOCAL();
3254 });
65202027 3255#else
572bbb43 3256 DEBUG_c({
f93f4e46 3257 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 3258 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 3259 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
3260 RESTORE_NUMERIC_LOCAL();
3261 });
572bbb43 3262#endif
463ee0b2 3263 return SvNVX(sv);
79072805
LW
3264}
3265
645c22ef
DM
3266/* asIV(): extract an integer from the string value of an SV.
3267 * Caller must validate PVX */
3268
76e3520e 3269STATIC IV
cea2e8a9 3270S_asIV(pTHX_ SV *sv)
36477c24 3271{
c2988b20
NC
3272 UV value;
3273 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
3274
3275 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3276 == IS_NUMBER_IN_UV) {
645c22ef 3277 /* It's definitely an integer */
c2988b20
NC
3278 if (numtype & IS_NUMBER_NEG) {
3279 if (value < (UV)IV_MIN)
3280 return -(IV)value;
3281 } else {
3282 if (value < (UV)IV_MAX)
3283 return (IV)value;
3284 }
3285 }
d008e5eb 3286 if (!numtype) {
d008e5eb
GS
3287 if (ckWARN(WARN_NUMERIC))
3288 not_a_number(sv);
3289 }
c2988b20 3290 return I_V(Atof(SvPVX(sv)));
36477c24 3291}
3292
645c22ef
DM
3293/* asUV(): extract an unsigned integer from the string value of an SV
3294 * Caller must validate PVX */
3295
76e3520e 3296STATIC UV
cea2e8a9 3297S_asUV(pTHX_ SV *sv)
36477c24 3298{
c2988b20 3299 UV value;
504618e9 3300 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
36477c24 3301
c2988b20
NC
3302 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3303 == IS_NUMBER_IN_UV) {
645c22ef 3304 /* It's definitely an integer */
6fa402ec 3305 if (!(numtype & IS_NUMBER_NEG))
c2988b20
NC
3306 return value;
3307 }
d008e5eb 3308 if (!numtype) {
d008e5eb
GS
3309 if (ckWARN(WARN_NUMERIC))
3310 not_a_number(sv);
3311 }
097ee67d 3312 return U_V(Atof(SvPVX(sv)));
36477c24 3313}
3314
645c22ef
DM
3315/*
3316=for apidoc sv_2pv_nolen
3317
3318Like C<sv_2pv()>, but doesn't return the length too. You should usually
3319use the macro wrapper C<SvPV_nolen(sv)> instead.
3320=cut
3321*/
3322
79072805 3323char *
864dbfa3 3324Perl_sv_2pv_nolen(pTHX_ register SV *sv)
1fa8b10d
JD
3325{
3326 STRLEN n_a;
3327 return sv_2pv(sv, &n_a);
3328}
3329
645c22ef
DM
3330/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
3331 * UV as a string towards the end of buf, and return pointers to start and
3332 * end of it.
3333 *
3334 * We assume that buf is at least TYPE_CHARS(UV) long.
3335 */
3336
864dbfa3 3337static char *
25da4f38
IZ
3338uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
3339{
25da4f38
IZ
3340 char *ptr = buf + TYPE_CHARS(UV);
3341 char *ebuf = ptr;
3342 int sign;
25da4f38
IZ
3343
3344 if (is_uv)
3345 sign = 0;
3346 else if (iv >= 0) {
3347 uv = iv;
3348 sign = 0;
3349 } else {
3350 uv = -iv;
3351 sign = 1;
3352 }
3353 do {
eb160463 3354 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
3355 } while (uv /= 10);
3356 if (sign)
3357 *--ptr = '-';
3358 *peob = ebuf;
3359 return ptr;
3360}
3361
09540bc3
JH
3362/* sv_2pv() is now a macro using Perl_sv_2pv_flags();
3363 * this function provided for binary compatibility only
3364 */
3365
3366char *
3367Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
3368{
3369 return sv_2pv_flags(sv, lp, SV_GMAGIC);
3370}
3371
645c22ef
DM
3372/*
3373=for apidoc sv_2pv_flags
3374
ff276b08 3375Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
3376If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
3377if necessary.
3378Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
3379usually end up here too.
3380
3381=cut
3382*/
3383
8d6d96c1
HS
3384char *
3385Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
3386{
79072805
LW
3387 register char *s;
3388 int olderrno;
cb50f42d 3389 SV *tsv, *origsv;
25da4f38
IZ
3390 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
3391 char *tmpbuf = tbuf;
79072805 3392
463ee0b2
LW
3393 if (!sv) {
3394 *lp = 0;
73d840c0 3395 return (char *)"";
463ee0b2 3396 }
8990e307 3397 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
3398 if (flags & SV_GMAGIC)
3399 mg_get(sv);
463ee0b2
LW
3400 if (SvPOKp(sv)) {
3401 *lp = SvCUR(sv);
3402 return SvPVX(sv);
3403 }
cf2093f6 3404 if (SvIOKp(sv)) {
1c846c1f 3405 if (SvIsUV(sv))
57def98f 3406 (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
cf2093f6 3407 else
57def98f 3408 (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
46fc3d4c 3409 tsv = Nullsv;
a0d0e21e 3410 goto tokensave;
463ee0b2
LW
3411 }
3412 if (SvNOKp(sv)) {
2d4389e4 3413 Gconvert(SvNVX(sv), NV_DIG, 0, tmpbuf);
46fc3d4c 3414 tsv = Nullsv;
a0d0e21e 3415 goto tokensave;
463ee0b2 3416 }
16d20bd9 3417 if (!SvROK(sv)) {
d008e5eb 3418 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3419 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3420 report_uninit(sv);
c6ee37c5 3421 }
16d20bd9 3422 *lp = 0;
73d840c0 3423 return (char *)"";
16d20bd9 3424 }
463ee0b2 3425 }
ed6116ce
LW
3426 if (SvTHINKFIRST(sv)) {
3427 if (SvROK(sv)) {
a0d0e21e 3428 SV* tmpstr;
e1ec3a88 3429 register const char *typestr;
1554e226 3430 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)) &&
b4b9a328 3431 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
446eaa42
YST
3432 char *pv = SvPV(tmpstr, *lp);
3433 if (SvUTF8(tmpstr))
3434 SvUTF8_on(sv);
3435 else
3436 SvUTF8_off(sv);
3437 return pv;
3438 }
cb50f42d 3439 origsv = sv;
ed6116ce
LW
3440 sv = (SV*)SvRV(sv);
3441 if (!sv)
e1ec3a88 3442 typestr = "NULLREF";
ed6116ce 3443 else {
f9277f47
IZ
3444 MAGIC *mg;
3445
ed6116ce 3446 switch (SvTYPE(sv)) {
f9277f47
IZ
3447 case SVt_PVMG:
3448 if ( ((SvFLAGS(sv) &
1c846c1f 3449 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
faf82a0b 3450 == (SVs_OBJECT|SVs_SMG))
14befaf4 3451 && (mg = mg_find(sv, PERL_MAGIC_qr))) {
e1ec3a88 3452 const regexp *re = (regexp *)mg->mg_obj;
1bd3ad17 3453
2cd61cdb 3454 if (!mg->mg_ptr) {
e1ec3a88 3455 const char *fptr = "msix";
8782bef2
GB
3456 char reflags[6];
3457 char ch;
3458 int left = 0;
3459 int right = 4;
ff385a1b 3460 char need_newline = 0;
eb160463 3461 U16 reganch = (U16)((re->reganch & PMf_COMPILETIME) >> 12);
8782bef2 3462
155aba94 3463 while((ch = *fptr++)) {
8782bef2
GB
3464 if(reganch & 1) {
3465 reflags[left++] = ch;
3466 }
3467 else {
3468 reflags[right--] = ch;
3469 }
3470 reganch >>= 1;
3471 }
3472 if(left != 4) {
3473 reflags[left] = '-';
3474 left = 5;
3475 }
3476
3477 mg->mg_len = re->prelen + 4 + left;
ff385a1b
JF
3478 /*
3479 * If /x was used, we have to worry about a regex
3480 * ending with a comment later being embedded
3481 * within another regex. If so, we don't want this
3482 * regex's "commentization" to leak out to the
3483 * right part of the enclosing regex, we must cap
3484 * it with a newline.
3485 *
3486 * So, if /x was used, we scan backwards from the
3487 * end of the regex. If we find a '#' before we
3488 * find a newline, we need to add a newline
3489 * ourself. If we find a '\n' first (or if we
3490 * don't find '#' or '\n'), we don't need to add
3491 * anything. -jfriedl
3492 */
3493 if (PMf_EXTENDED & re->reganch)
3494 {
e1ec3a88 3495 const char *endptr = re->precomp + re->prelen;
ff385a1b
JF
3496 while (endptr >= re->precomp)
3497 {
e1ec3a88 3498 const char c = *(endptr--);
ff385a1b
JF
3499 if (c == '\n')
3500 break; /* don't need another */
3501 if (c == '#') {
3502 /* we end while in a comment, so we
3503 need a newline */
3504 mg->mg_len++; /* save space for it */
3505 need_newline = 1; /* note to add it */
ab01544f 3506 break;
ff385a1b
JF
3507 }
3508 }
3509 }
3510
8782bef2
GB
3511 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
3512 Copy("(?", mg->mg_ptr, 2, char);
3513 Copy(reflags, mg->mg_ptr+2, left, char);
3514 Copy(":", mg->mg_ptr+left+2, 1, char);
3515 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
ff385a1b
JF
3516 if (need_newline)
3517 mg->mg_ptr[mg->mg_len - 2] = '\n';
1bd3ad17
IZ
3518 mg->mg_ptr[mg->mg_len - 1] = ')';
3519 mg->mg_ptr[mg->mg_len] = 0;
3520 }
3280af22 3521 PL_reginterp_cnt += re->program[0].next_off;
cb50f42d
YST
3522
3523 if (re->reganch & ROPT_UTF8)
3524 SvUTF8_on(origsv);
3525 else
3526 SvUTF8_off(origsv);
1bd3ad17
IZ
3527 *lp = mg->mg_len;
3528 return mg->mg_ptr;
f9277f47
IZ
3529 }
3530 /* Fall through */
ed6116ce
LW
3531 case SVt_NULL:
3532 case SVt_IV:
3533 case SVt_NV:
3534 case SVt_RV:
3535 case SVt_PV:
3536 case SVt_PVIV:
3537 case SVt_PVNV:
e1ec3a88
AL
3538 case SVt_PVBM: typestr = SvROK(sv) ? "REF" : "SCALAR"; break;
3539 case SVt_PVLV: typestr = SvROK(sv) ? "REF"
be65207d
DM
3540 /* tied lvalues should appear to be
3541 * scalars for backwards compatitbility */
3542 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
3543 ? "SCALAR" : "LVALUE"; break;
e1ec3a88
AL
3544 case SVt_PVAV: typestr = "ARRAY"; break;
3545 case SVt_PVHV: typestr = "HASH"; break;
3546 case SVt_PVCV: typestr = "CODE"; break;
3547 case SVt_PVGV: typestr = "GLOB"; break;
3548 case SVt_PVFM: typestr = "FORMAT"; break;
3549 case SVt_PVIO: typestr = "IO"; break;
3550 default: typestr = "UNKNOWN"; break;
ed6116ce 3551 }
46fc3d4c 3552 tsv = NEWSV(0,0);
a5cb6b62 3553 if (SvOBJECT(sv)) {
bfcb3514 3554 const char *name = HvNAME_get(SvSTASH(sv));
a5cb6b62 3555 Perl_sv_setpvf(aTHX_ tsv, "%s=%s(0x%"UVxf")",
e1ec3a88 3556 name ? name : "__ANON__" , typestr, PTR2UV(sv));
a5cb6b62 3557 }
ed6116ce 3558 else
e1ec3a88 3559 Perl_sv_setpvf(aTHX_ tsv, "%s(0x%"UVxf")", typestr, PTR2UV(sv));
a0d0e21e 3560 goto tokensaveref;
463ee0b2 3561 }
e1ec3a88 3562 *lp = strlen(typestr);
73d840c0 3563 return (char *)typestr;
79072805 3564 }
0336b60e 3565 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 3566 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 3567 report_uninit(sv);
ed6116ce 3568 *lp = 0;
73d840c0 3569 return (char *)"";
79072805 3570 }
79072805 3571 }
28e5dec8
JH
3572 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
3573 /* I'm assuming that if both IV and NV are equally valid then
3574 converting the IV is going to be more efficient */
e1ec3a88
AL
3575 const U32 isIOK = SvIOK(sv);
3576 const U32 isUIOK = SvIsUV(sv);
28e5dec8
JH
3577 char buf[TYPE_CHARS(UV)];
3578 char *ebuf, *ptr;
3579
3580 if (SvTYPE(sv) < SVt_PVIV)
3581 sv_upgrade(sv, SVt_PVIV);
3582 if (isUIOK)
3583 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
3584 else
3585 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
eb160463 3586 SvGROW(sv, (STRLEN)(ebuf - ptr + 1)); /* inlined from sv_setpvn */
28e5dec8
JH
3587 Move(ptr,SvPVX(sv),ebuf - ptr,char);
3588 SvCUR_set(sv, ebuf - ptr);
3589 s = SvEND(sv);
3590 *s = '\0';
3591 if (isIOK)
3592 SvIOK_on(sv);
3593 else
3594 SvIOKp_on(sv);
3595 if (isUIOK)
3596 SvIsUV_on(sv);
3597 }
3598 else if (SvNOKp(sv)) {
79072805
LW
3599 if (SvTYPE(sv) < SVt_PVNV)
3600 sv_upgrade(sv, SVt_PVNV);
1c846c1f 3601 /* The +20 is pure guesswork. Configure test needed. --jhi */
59155cc0 3602 SvGROW(sv, NV_DIG + 20);
463ee0b2 3603 s = SvPVX(sv);
79072805 3604 olderrno = errno; /* some Xenix systems wipe out errno here */
79072805 3605#ifdef apollo
463ee0b2 3606 if (SvNVX(sv) == 0.0)
79072805
LW
3607 (void)strcpy(s,"0");
3608 else
3609#endif /*apollo*/
bbce6d69 3610 {
2d4389e4 3611 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 3612 }
79072805 3613 errno = olderrno;
a0d0e21e
LW
3614#ifdef FIXNEGATIVEZERO
3615 if (*s == '-' && s[1] == '0' && !s[2])
3616 strcpy(s,"0");
3617#endif
79072805
LW
3618 while (*s) s++;
3619#ifdef hcx
3620 if (s[-1] == '.')
46fc3d4c 3621 *--s = '\0';
79072805
LW
3622#endif
3623 }
79072805 3624 else {
0336b60e
IZ
3625 if (ckWARN(WARN_UNINITIALIZED)
3626 && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 3627 report_uninit(sv);
a0d0e21e 3628 *lp = 0;
25da4f38
IZ
3629 if (SvTYPE(sv) < SVt_PV)
3630 /* Typically the caller expects that sv_any is not NULL now. */
3631 sv_upgrade(sv, SVt_PV);
73d840c0 3632 return (char *)"";
79072805 3633 }
463ee0b2
LW
3634 *lp = s - SvPVX(sv);
3635 SvCUR_set(sv, *lp);
79072805 3636 SvPOK_on(sv);
1d7c1841
GS
3637 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3638 PTR2UV(sv),SvPVX(sv)));
463ee0b2 3639 return SvPVX(sv);
a0d0e21e
LW
3640
3641 tokensave:
3642 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
3643 /* Sneaky stuff here */
3644
3645 tokensaveref:
46fc3d4c 3646 if (!tsv)
96827780 3647 tsv = newSVpv(tmpbuf, 0);
46fc3d4c 3648 sv_2mortal(tsv);
3649 *lp = SvCUR(tsv);
3650 return SvPVX(tsv);
a0d0e21e
LW
3651 }
3652 else {
27da23d5 3653 dVAR;
a0d0e21e 3654 STRLEN len;
73d840c0 3655 const char *t;
46fc3d4c 3656
3657 if (tsv) {
3658 sv_2mortal(tsv);
3659 t = SvPVX(tsv);
3660 len = SvCUR(tsv);
3661 }
3662 else {
96827780
MB
3663 t = tmpbuf;
3664 len = strlen(tmpbuf);
46fc3d4c 3665 }
a0d0e21e 3666#ifdef FIXNEGATIVEZERO
46fc3d4c 3667 if (len == 2 && t[0] == '-' && t[1] == '0') {
3668 t = "0";
3669 len = 1;
3670 }
a0d0e21e
LW
3671#endif
3672 (void)SvUPGRADE(sv, SVt_PV);
46fc3d4c 3673 *lp = len;
a0d0e21e
LW
3674 s = SvGROW(sv, len + 1);
3675 SvCUR_set(sv, len);
6bf554b4 3676 SvPOKp_on(sv);
e90e2364 3677 return strcpy(s, t);
a0d0e21e 3678 }
463ee0b2
LW
3679}
3680
645c22ef 3681/*
6050d10e
JP
3682=for apidoc sv_copypv
3683
3684Copies a stringified representation of the source SV into the
3685destination SV. Automatically performs any necessary mg_get and
54f0641b 3686coercion of numeric values into strings. Guaranteed to preserve
6050d10e 3687UTF-8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
3688sv_2pv[_flags] but operates directly on an SV instead of just the
3689string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
3690would lose the UTF-8'ness of the PV.
3691
3692=cut
3693*/
3694
3695void
3696Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
3697{
446eaa42
YST
3698 STRLEN len;
3699 char *s;
3700 s = SvPV(ssv,len);
cb50f42d 3701 sv_setpvn(dsv,s,len);
446eaa42 3702 if (SvUTF8(ssv))
cb50f42d 3703 SvUTF8_on(dsv);
446eaa42 3704 else
cb50f42d 3705 SvUTF8_off(dsv);
6050d10e
JP
3706}
3707
3708/*
645c22ef
DM
3709=for apidoc sv_2pvbyte_nolen
3710
3711Return a pointer to the byte-encoded representation of the SV.
1e54db1a 3712May cause the SV to be downgraded from UTF-8 as a side-effect.
645c22ef
DM
3713
3714Usually accessed via the C<SvPVbyte_nolen> macro.
3715
3716=cut
3717*/
3718
7340a771
GS
3719char *
3720Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
3721{
560a288e
GS
3722 STRLEN n_a;
3723 return sv_2pvbyte(sv, &n_a);
7340a771
GS
3724}
3725
645c22ef
DM
3726/*
3727=for apidoc sv_2pvbyte
3728
3729Return a pointer to the byte-encoded representation of the SV, and set *lp
1e54db1a 3730to its length. May cause the SV to be downgraded from UTF-8 as a
645c22ef
DM
3731side-effect.
3732
3733Usually accessed via the C<SvPVbyte> macro.
3734
3735=cut
3736*/
3737
7340a771
GS
3738char *
3739Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
3740{
0875d2fe
NIS
3741 sv_utf8_downgrade(sv,0);
3742 return SvPV(sv,*lp);
7340a771
GS
3743}
3744
645c22ef
DM
3745/*
3746=for apidoc sv_2pvutf8_nolen
3747
1e54db1a
JH
3748Return a pointer to the UTF-8-encoded representation of the SV.
3749May cause the SV to be upgraded to UTF-8 as a side-effect.
645c22ef
DM
3750
3751Usually accessed via the C<SvPVutf8_nolen> macro.
3752
3753=cut
3754*/
3755
7340a771
GS
3756char *
3757Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
3758{
560a288e
GS
3759 STRLEN n_a;
3760 return sv_2pvutf8(sv, &n_a);
7340a771
GS
3761}
3762
645c22ef
DM
3763/*
3764=for apidoc sv_2pvutf8
3765
1e54db1a
JH
3766Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3767to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
645c22ef
DM
3768
3769Usually accessed via the C<SvPVutf8> macro.
3770
3771=cut
3772*/
3773
7340a771
GS
3774char *
3775Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
3776{
560a288e 3777 sv_utf8_upgrade(sv);
7d59b7e4 3778 return SvPV(sv,*lp);
7340a771 3779}
1c846c1f 3780
645c22ef
DM
3781/*
3782=for apidoc sv_2bool
3783
3784This function is only called on magical items, and is only used by
8cf8f3d1 3785sv_true() or its macro equivalent.
645c22ef
DM
3786
3787=cut
3788*/
3789
463ee0b2 3790bool
864dbfa3 3791Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 3792{
8990e307 3793 if (SvGMAGICAL(sv))
463ee0b2
LW
3794 mg_get(sv);
3795
a0d0e21e
LW
3796 if (!SvOK(sv))
3797 return 0;
3798 if (SvROK(sv)) {
a0d0e21e 3799 SV* tmpsv;
1554e226 3800 if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
9e3013b1 3801 (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
8a31060d 3802 return (bool)SvTRUE(tmpsv);
a0d0e21e
LW
3803 return SvRV(sv) != 0;
3804 }
463ee0b2 3805 if (SvPOKp(sv)) {
11343788
MB
3806 register XPV* Xpvtmp;
3807 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
339049b0 3808 (*sv->sv_u.svu_pv > '0' ||
11343788 3809 Xpvtmp->xpv_cur > 1 ||
339049b0 3810 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
463ee0b2
LW
3811 return 1;
3812 else
3813 return 0;
3814 }
3815 else {
3816 if (SvIOKp(sv))
3817 return SvIVX(sv) != 0;
3818 else {
3819 if (SvNOKp(sv))
3820 return SvNVX(sv) != 0.0;
3821 else
3822 return FALSE;
3823 }
3824 }
79072805
LW
3825}
3826
09540bc3
JH
3827/* sv_utf8_upgrade() is now a macro using sv_utf8_upgrade_flags();
3828 * this function provided for binary compatibility only
3829 */
3830
3831
3832STRLEN
3833Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
3834{
3835 return sv_utf8_upgrade_flags(sv, SV_GMAGIC);
3836}
3837
c461cf8f
JH
3838/*
3839=for apidoc sv_utf8_upgrade
3840
78ea37eb 3841Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3842Forces the SV to string form if it is not already.
4411f3b6
NIS
3843Always sets the SvUTF8 flag to avoid future validity checks even
3844if all the bytes have hibit clear.
c461cf8f 3845
13a6c0e0
JH
3846This is not as a general purpose byte encoding to Unicode interface:
3847use the Encode extension for that.
3848
8d6d96c1
HS
3849=for apidoc sv_utf8_upgrade_flags
3850
78ea37eb 3851Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3852Forces the SV to string form if it is not already.
8d6d96c1
HS
3853Always sets the SvUTF8 flag to avoid future validity checks even
3854if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
3855will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
3856C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3857
13a6c0e0
JH
3858This is not as a general purpose byte encoding to Unicode interface:
3859use the Encode extension for that.
3860
8d6d96c1
HS
3861=cut
3862*/
3863
3864STRLEN
3865Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
3866{
808c356f
RGS
3867 if (sv == &PL_sv_undef)
3868 return 0;
e0e62c2a
NIS
3869 if (!SvPOK(sv)) {
3870 STRLEN len = 0;
d52b7888
NC
3871 if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3872 (void) sv_2pv_flags(sv,&len, flags);
3873 if (SvUTF8(sv))
3874 return len;
3875 } else {
3876 (void) SvPV_force(sv,len);
3877 }
e0e62c2a 3878 }
4411f3b6 3879
f5cee72b 3880 if (SvUTF8(sv)) {
5fec3b1d 3881 return SvCUR(sv);
f5cee72b 3882 }
5fec3b1d 3883
765f542d
NC
3884 if (SvIsCOW(sv)) {
3885 sv_force_normal_flags(sv, 0);
db42d148
NIS
3886 }
3887
88632417 3888 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
799ef3cb 3889 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 3890 else { /* Assume Latin-1/EBCDIC */
c4e7c712
NC
3891 /* This function could be much more efficient if we
3892 * had a FLAG in SVs to signal if there are any hibit
3893 * chars in the PV. Given that there isn't such a flag
3894 * make the loop as fast as possible. */
3895 U8 *s = (U8 *) SvPVX(sv);
3896 U8 *e = (U8 *) SvEND(sv);
3897 U8 *t = s;
3898 int hibit = 0;
3899
3900 while (t < e) {
3901 U8 ch = *t++;
3902 if ((hibit = !NATIVE_IS_INVARIANT(ch)))
3903 break;
3904 }
3905 if (hibit) {
3906 STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
3907 s = bytes_to_utf8((U8*)s, &len);
3908
3909 SvPV_free(sv); /* No longer using what was there before. */
3910
3911 SvPV_set(sv, (char*)s);
3912 SvCUR_set(sv, len - 1);
3913 SvLEN_set(sv, len); /* No longer know the real size. */
3914 }
3915 /* Mark as UTF-8 even if no hibit - saves scanning loop */
3916 SvUTF8_on(sv);
560a288e 3917 }
4411f3b6 3918 return SvCUR(sv);
560a288e
GS
3919}
3920
c461cf8f
JH
3921/*
3922=for apidoc sv_utf8_downgrade
3923
78ea37eb
TS
3924Attempts to convert the PV of an SV from characters to bytes.
3925If the PV contains a character beyond byte, this conversion will fail;
3926in this case, either returns false or, if C<fail_ok> is not
c461cf8f
JH
3927true, croaks.
3928
13a6c0e0
JH
3929This is not as a general purpose Unicode to byte encoding interface:
3930use the Encode extension for that.
3931
c461cf8f
JH
3932=cut
3933*/
3934
560a288e
GS
3935bool
3936Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
3937{
78ea37eb 3938 if (SvPOKp(sv) && SvUTF8(sv)) {
fa301091 3939 if (SvCUR(sv)) {
03cfe0ae 3940 U8 *s;
652088fc 3941 STRLEN len;
fa301091 3942
765f542d
NC
3943 if (SvIsCOW(sv)) {
3944 sv_force_normal_flags(sv, 0);
3945 }
03cfe0ae
NIS
3946 s = (U8 *) SvPV(sv, len);
3947 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
3948 if (fail_ok)
3949 return FALSE;
3950 else {
3951 if (PL_op)
3952 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 3953 OP_DESC(PL_op));
fa301091
JH
3954 else
3955 Perl_croak(aTHX_ "Wide character");
3956 }
4b3603a4 3957 }
b162af07 3958 SvCUR_set(sv, len);
67e989fb 3959 }
560a288e 3960 }
ffebcc3e 3961 SvUTF8_off(sv);
560a288e
GS
3962 return TRUE;
3963}
3964
c461cf8f
JH
3965/*
3966=for apidoc sv_utf8_encode
3967
78ea37eb
TS
3968Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3969flag off so that it looks like octets again.
c461cf8f
JH
3970
3971=cut
3972*/
3973
560a288e
GS
3974void
3975Perl_sv_utf8_encode(pTHX_ register SV *sv)
3976{
4411f3b6 3977 (void) sv_utf8_upgrade(sv);
4c94c214
NC
3978 if (SvIsCOW(sv)) {
3979 sv_force_normal_flags(sv, 0);
3980 }
3981 if (SvREADONLY(sv)) {
3982 Perl_croak(aTHX_ PL_no_modify);
3983 }
560a288e
GS
3984 SvUTF8_off(sv);
3985}
3986
4411f3b6
NIS
3987/*
3988=for apidoc sv_utf8_decode
3989
78ea37eb
TS
3990If the PV of the SV is an octet sequence in UTF-8
3991and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3992so that it looks like a character. If the PV contains only single-byte
3993characters, the C<SvUTF8> flag stays being off.
3994Scans PV for validity and returns false if the PV is invalid UTF-8.
4411f3b6
NIS
3995
3996=cut
3997*/
3998
560a288e
GS
3999bool
4000Perl_sv_utf8_decode(pTHX_ register SV *sv)
4001{
78ea37eb 4002 if (SvPOKp(sv)) {
63cd0674
NIS
4003 U8 *c;
4004 U8 *e;
9cbac4c7 4005
645c22ef
DM
4006 /* The octets may have got themselves encoded - get them back as
4007 * bytes
4008 */
4009 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
4010 return FALSE;
4011
4012 /* it is actually just a matter of turning the utf8 flag on, but
4013 * we want to make sure everything inside is valid utf8 first.
4014 */
63cd0674
NIS
4015 c = (U8 *) SvPVX(sv);
4016 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 4017 return FALSE;
63cd0674 4018 e = (U8 *) SvEND(sv);
511c2ff0 4019 while (c < e) {
c4d5f83a
NIS
4020 U8 ch = *c++;
4021 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
4022 SvUTF8_on(sv);
4023 break;
4024 }
560a288e 4025 }
560a288e
GS
4026 }
4027 return TRUE;
4028}
4029
09540bc3
JH
4030/* sv_setsv() is now a macro using Perl_sv_setsv_flags();
4031 * this function provided for binary compatibility only
4032 */
4033
4034void
4035Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
4036{
4037 sv_setsv_flags(dstr, sstr, SV_GMAGIC);
4038}
4039
954c1994
GS
4040/*
4041=for apidoc sv_setsv
4042
645c22ef
DM
4043Copies the contents of the source SV C<ssv> into the destination SV
4044C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
4045function if the source SV needs to be reused. Does not handle 'set' magic.
4046Loosely speaking, it performs a copy-by-value, obliterating any previous
4047content of the destination.
4048
4049You probably want to use one of the assortment of wrappers, such as
4050C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
4051C<SvSetMagicSV_nosteal>.
4052
8d6d96c1
HS
4053=for apidoc sv_setsv_flags
4054
645c22ef
DM
4055Copies the contents of the source SV C<ssv> into the destination SV
4056C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
4057function if the source SV needs to be reused. Does not handle 'set' magic.
4058Loosely speaking, it performs a copy-by-value, obliterating any previous
4059content of the destination.
4060If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
5fcdf167
NC
4061C<ssv> if appropriate, else not. If the C<flags> parameter has the
4062C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
4063and C<sv_setsv_nomg> are implemented in terms of this function.
645c22ef
DM
4064
4065You probably want to use one of the assortment of wrappers, such as
4066C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
4067C<SvSetMagicSV_nosteal>.
4068
4069This is the primary function for copying scalars, and most other
4070copy-ish functions and macros use this underneath.
8d6d96c1
HS
4071
4072=cut
4073*/
4074
4075void
4076Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
4077{
8990e307
LW
4078 register U32 sflags;
4079 register int dtype;
4080 register int stype;
463ee0b2 4081
79072805
LW
4082 if (sstr == dstr)
4083 return;
765f542d 4084 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 4085 if (!sstr)
3280af22 4086 sstr = &PL_sv_undef;
8990e307
LW
4087 stype = SvTYPE(sstr);
4088 dtype = SvTYPE(dstr);
79072805 4089
a0d0e21e 4090 SvAMAGIC_off(dstr);
7a5fa8a2 4091 if ( SvVOK(dstr) )
ece467f9
JP
4092 {
4093 /* need to nuke the magic */
4094 mg_free(dstr);
4095 SvRMAGICAL_off(dstr);
4096 }
9e7bc3e8 4097
463ee0b2 4098 /* There's a lot of redundancy below but we're going for speed here */
79072805 4099
8990e307 4100 switch (stype) {
79072805 4101 case SVt_NULL:
aece5585 4102 undef_sstr:
20408e3c
GS
4103 if (dtype != SVt_PVGV) {
4104 (void)SvOK_off(dstr);
4105 return;
4106 }
4107 break;
463ee0b2 4108 case SVt_IV:
aece5585
GA
4109 if (SvIOK(sstr)) {
4110 switch (dtype) {
4111 case SVt_NULL:
8990e307 4112 sv_upgrade(dstr, SVt_IV);
aece5585
GA
4113 break;
4114 case SVt_NV:
8990e307 4115 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
4116 break;
4117 case SVt_RV:
4118 case SVt_PV:
a0d0e21e 4119 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
4120 break;
4121 }
4122 (void)SvIOK_only(dstr);
45977657 4123 SvIV_set(dstr, SvIVX(sstr));
25da4f38
IZ
4124 if (SvIsUV(sstr))
4125 SvIsUV_on(dstr);
27c9684d
AP
4126 if (SvTAINTED(sstr))
4127 SvTAINT(dstr);
aece5585 4128 return;
8990e307 4129 }
aece5585
GA
4130 goto undef_sstr;
4131
463ee0b2 4132 case SVt_NV:
aece5585
GA
4133 if (SvNOK(sstr)) {
4134 switch (dtype) {
4135 case SVt_NULL:
4136 case SVt_IV:
8990e307 4137 sv_upgrade(dstr, SVt_NV);
aece5585
GA
4138 break;
4139 case SVt_RV:
4140 case SVt_PV:
4141 case SVt_PVIV:
a0d0e21e 4142 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
4143 break;
4144 }
9d6ce603 4145 SvNV_set(dstr, SvNVX(sstr));
aece5585 4146 (void)SvNOK_only(dstr);
27c9684d
AP
4147 if (SvTAINTED(sstr))
4148 SvTAINT(dstr);
aece5585 4149 return;
8990e307 4150 }
aece5585
GA
4151 goto undef_sstr;
4152
ed6116ce 4153 case SVt_RV:
8990e307 4154 if (dtype < SVt_RV)
ed6116ce 4155 sv_upgrade(dstr, SVt_RV);
c07a80fd 4156 else if (dtype == SVt_PVGV &&
23bb1b96 4157 SvROK(sstr) && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
c07a80fd 4158 sstr = SvRV(sstr);
a5f75d66 4159 if (sstr == dstr) {
1d7c1841
GS
4160 if (GvIMPORTED(dstr) != GVf_IMPORTED
4161 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4162 {
a5f75d66 4163 GvIMPORTED_on(dstr);
1d7c1841 4164 }
a5f75d66
AD
4165 GvMULTI_on(dstr);
4166 return;
4167 }
c07a80fd 4168 goto glob_assign;
4169 }
ed6116ce 4170 break;
fc36a67e 4171 case SVt_PVFM:
d89fc664
NC
4172#ifdef PERL_COPY_ON_WRITE
4173 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
4174 if (dtype < SVt_PVIV)
4175 sv_upgrade(dstr, SVt_PVIV);
4176 break;
4177 }
4178 /* Fall through */
4179#endif
4180 case SVt_PV:
8990e307 4181 if (dtype < SVt_PV)
463ee0b2 4182 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
4183 break;
4184 case SVt_PVIV:
8990e307 4185 if (dtype < SVt_PVIV)
463ee0b2 4186 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
4187 break;
4188 case SVt_PVNV:
8990e307 4189 if (dtype < SVt_PVNV)
463ee0b2 4190 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 4191 break;
4633a7c4
LW
4192 case SVt_PVAV:
4193 case SVt_PVHV:
4194 case SVt_PVCV:
4633a7c4 4195 case SVt_PVIO:
a3b680e6
AL
4196 {
4197 const char * const type = sv_reftype(sstr,0);
533c011a 4198 if (PL_op)
a3b680e6 4199 Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_NAME(PL_op));
4633a7c4 4200 else
a3b680e6
AL
4201 Perl_croak(aTHX_ "Bizarre copy of %s", type);
4202 }
4633a7c4
LW
4203 break;
4204
79072805 4205 case SVt_PVGV:
8990e307 4206 if (dtype <= SVt_PVGV) {
c07a80fd 4207 glob_assign:
a5f75d66 4208 if (dtype != SVt_PVGV) {
a3b680e6
AL
4209 const char * const name = GvNAME(sstr);
4210 const STRLEN len = GvNAMELEN(sstr);
b76195c2
DM
4211 /* don't upgrade SVt_PVLV: it can hold a glob */
4212 if (dtype != SVt_PVLV)
4213 sv_upgrade(dstr, SVt_PVGV);
14befaf4 4214 sv_magic(dstr, dstr, PERL_MAGIC_glob, Nullch, 0);
85aff577 4215 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
4216 GvNAME(dstr) = savepvn(name, len);
4217 GvNAMELEN(dstr) = len;
4218 SvFAKE_on(dstr); /* can coerce to non-glob */
4219 }
7bac28a0 4220 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
4221 else if (PL_curstackinfo->si_type == PERLSI_SORT
4222 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
cea2e8a9 4223 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
7bac28a0 4224 GvNAME(dstr));
5bd07a3d 4225
7fb37951
AMS
4226#ifdef GV_UNIQUE_CHECK
4227 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
4228 Perl_croak(aTHX_ PL_no_modify);
4229 }
4230#endif
4231
a0d0e21e 4232 (void)SvOK_off(dstr);
a5f75d66 4233 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 4234 gp_free((GV*)dstr);
79072805 4235 GvGP(dstr) = gp_ref(GvGP(sstr));
27c9684d
AP
4236 if (SvTAINTED(sstr))
4237 SvTAINT(dstr);
1d7c1841
GS
4238 if (GvIMPORTED(dstr) != GVf_IMPORTED
4239 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4240 {
a5f75d66 4241 GvIMPORTED_on(dstr);
1d7c1841 4242 }
a5f75d66 4243 GvMULTI_on(dstr);
79072805
LW
4244 return;
4245 }
4246 /* FALL THROUGH */
4247
4248 default:
8d6d96c1 4249 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 4250 mg_get(sstr);
eb160463 4251 if ((int)SvTYPE(sstr) != stype) {
973f89ab
CS
4252 stype = SvTYPE(sstr);
4253 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
4254 goto glob_assign;
4255 }
4256 }
ded42b9f 4257 if (stype == SVt_PVLV)
6fc92669 4258 (void)SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 4259 else
eb160463 4260 (void)SvUPGRADE(dstr, (U32)stype);
79072805
LW
4261 }
4262
8990e307
LW
4263 sflags = SvFLAGS(sstr);
4264
4265 if (sflags & SVf_ROK) {
4266 if (dtype >= SVt_PV) {
4267 if (dtype == SVt_PVGV) {
4268 SV *sref = SvREFCNT_inc(SvRV(sstr));
4269 SV *dref = 0;
a3b680e6 4270 const int intro = GvINTRO(dstr);
a0d0e21e 4271
7fb37951
AMS
4272#ifdef GV_UNIQUE_CHECK
4273 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
4274 Perl_croak(aTHX_ PL_no_modify);
4275 }
4276#endif
4277
a0d0e21e 4278 if (intro) {
a5f75d66 4279 GvINTRO_off(dstr); /* one-shot flag */
1d7c1841 4280 GvLINE(dstr) = CopLINE(PL_curcop);
1edc1566 4281 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 4282 }
a5f75d66 4283 GvMULTI_on(dstr);
8990e307
LW
4284 switch (SvTYPE(sref)) {
4285 case SVt_PVAV:
a0d0e21e 4286 if (intro)
890ed176 4287 SAVEGENERICSV(GvAV(dstr));
a0d0e21e
LW
4288 else
4289 dref = (SV*)GvAV(dstr);
8990e307 4290 GvAV(dstr) = (AV*)sref;
39bac7f7 4291 if (!GvIMPORTED_AV(dstr)
1d7c1841
GS
4292 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4293 {
a5f75d66 4294 GvIMPORTED_AV_on(dstr);
1d7c1841 4295 }
8990e307
LW
4296 break;
4297 case SVt_PVHV:
a0d0e21e 4298 if (intro)
890ed176 4299 SAVEGENERICSV(GvHV(dstr));
a0d0e21e
LW
4300 else
4301 dref = (SV*)GvHV(dstr);
8990e307 4302 GvHV(dstr) = (HV*)sref;
39bac7f7 4303 if (!GvIMPORTED_HV(dstr)
1d7c1841
GS
4304 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4305 {
a5f75d66 4306 GvIMPORTED_HV_on(dstr);
1d7c1841 4307 }
8990e307
LW
4308 break;
4309 case SVt_PVCV:
8ebc5c01 4310 if (intro) {
4311 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
4312 SvREFCNT_dec(GvCV(dstr));
4313 GvCV(dstr) = Nullcv;
68dc0745 4314 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 4315 PL_sub_generation++;
8ebc5c01 4316 }
890ed176 4317 SAVEGENERICSV(GvCV(dstr));
8ebc5c01 4318 }
68dc0745 4319 else
4320 dref = (SV*)GvCV(dstr);
4321 if (GvCV(dstr) != (CV*)sref) {
748a9306 4322 CV* cv = GvCV(dstr);
4633a7c4 4323 if (cv) {
68dc0745 4324 if (!GvCVGEN((GV*)dstr) &&
4325 (CvROOT(cv) || CvXSUB(cv)))
4326 {
7bac28a0 4327 /* ahem, death to those who redefine
4328 * active sort subs */
3280af22
NIS
4329 if (PL_curstackinfo->si_type == PERLSI_SORT &&
4330 PL_sortcop == CvSTART(cv))
1c846c1f 4331 Perl_croak(aTHX_
7bac28a0 4332 "Can't redefine active sort subroutine %s",
4333 GvENAME((GV*)dstr));
beab0874
JT
4334 /* Redefining a sub - warning is mandatory if
4335 it was a const and its value changed. */
4336 if (ckWARN(WARN_REDEFINE)
4337 || (CvCONST(cv)
4338 && (!CvCONST((CV*)sref)
4339 || sv_cmp(cv_const_sv(cv),
4340 cv_const_sv((CV*)sref)))))
4341 {
9014280d 4342 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
beab0874 4343 CvCONST(cv)
910764e6
RGS
4344 ? "Constant subroutine %s::%s redefined"
4345 : "Subroutine %s::%s redefined",
bfcb3514 4346 HvNAME_get(GvSTASH((GV*)dstr)),
beab0874
JT
4347 GvENAME((GV*)dstr));
4348 }
9607fc9c 4349 }
fb24441d
RGS
4350 if (!intro)
4351 cv_ckproto(cv, (GV*)dstr,
4352 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 4353 }
a5f75d66 4354 GvCV(dstr) = (CV*)sref;
7a4c00b4 4355 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 4356 GvASSUMECV_on(dstr);
3280af22 4357 PL_sub_generation++;
a5f75d66 4358 }
39bac7f7 4359 if (!GvIMPORTED_CV(dstr)
1d7c1841
GS
4360 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4361 {
a5f75d66 4362 GvIMPORTED_CV_on(dstr);
1d7c1841 4363 }
8990e307 4364 break;
91bba347
LW
4365 case SVt_PVIO:
4366 if (intro)
890ed176 4367 SAVEGENERICSV(GvIOp(dstr));
91bba347
LW
4368 else
4369 dref = (SV*)GvIOp(dstr);
4370 GvIOp(dstr) = (IO*)sref;
4371 break;
f4d13ee9
JH
4372 case SVt_PVFM:
4373 if (intro)
890ed176 4374 SAVEGENERICSV(GvFORM(dstr));
f4d13ee9
JH
4375 else
4376 dref = (SV*)GvFORM(dstr);
4377 GvFORM(dstr) = (CV*)sref;
4378 break;
8990e307 4379 default:
a0d0e21e 4380 if (intro)
890ed176 4381 SAVEGENERICSV(GvSV(dstr));
a0d0e21e
LW
4382 else
4383 dref = (SV*)GvSV(dstr);
8990e307 4384 GvSV(dstr) = sref;
39bac7f7 4385 if (!GvIMPORTED_SV(dstr)
1d7c1841
GS
4386 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4387 {
a5f75d66 4388 GvIMPORTED_SV_on(dstr);
1d7c1841 4389 }
8990e307
LW
4390 break;
4391 }
4392 if (dref)
4393 SvREFCNT_dec(dref);
27c9684d
AP
4394 if (SvTAINTED(sstr))
4395 SvTAINT(dstr);
8990e307
LW
4396 return;
4397 }
a0d0e21e 4398 if (SvPVX(dstr)) {
8bd4d4c5 4399 SvPV_free(dstr);
b162af07
SP
4400 SvLEN_set(dstr, 0);
4401 SvCUR_set(dstr, 0);
a0d0e21e 4402 }
8990e307 4403 }
a0d0e21e 4404 (void)SvOK_off(dstr);
b162af07 4405 SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
ed6116ce 4406 SvROK_on(dstr);
8990e307 4407 if (sflags & SVp_NOK) {
3332b3c1
JH
4408 SvNOKp_on(dstr);
4409 /* Only set the public OK flag if the source has public OK. */
4410 if (sflags & SVf_NOK)
4411 SvFLAGS(dstr) |= SVf_NOK;
9d6ce603 4412 SvNV_set(dstr, SvNVX(sstr));
ed6116ce 4413 }
8990e307 4414 if (sflags & SVp_IOK) {
3332b3c1
JH
4415 (void)SvIOKp_on(dstr);
4416 if (sflags & SVf_IOK)
4417 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4418 if (sflags & SVf_IVisUV)
25da4f38 4419 SvIsUV_on(dstr);
45977657 4420 SvIV_set(dstr, SvIVX(sstr));
ed6116ce 4421 }
a0d0e21e
LW
4422 if (SvAMAGIC(sstr)) {
4423 SvAMAGIC_on(dstr);
4424 }
ed6116ce 4425 }
8990e307 4426 else if (sflags & SVp_POK) {
765f542d 4427 bool isSwipe = 0;
79072805
LW
4428
4429 /*
4430 * Check to see if we can just swipe the string. If so, it's a
4431 * possible small lose on short strings, but a big win on long ones.
463ee0b2
LW
4432 * It might even be a win on short strings if SvPVX(dstr)
4433 * has to be allocated and SvPVX(sstr) has to be freed.
79072805
LW
4434 */
4435
120fac95
NC
4436 /* Whichever path we take through the next code, we want this true,
4437 and doing it now facilitates the COW check. */
4438 (void)SvPOK_only(dstr);
4439
765f542d
NC
4440 if (
4441#ifdef PERL_COPY_ON_WRITE
4442 (sflags & (SVf_FAKE | SVf_READONLY)) != (SVf_FAKE | SVf_READONLY)
4443 &&
4444#endif
4445 !(isSwipe =
4446 (sflags & SVs_TEMP) && /* slated for free anyway? */
4447 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
5fcdf167
NC
4448 (!(flags & SV_NOSTEAL)) &&
4449 /* and we're allowed to steal temps */
765f542d
NC
4450 SvREFCNT(sstr) == 1 && /* and no other references to it? */
4451 SvLEN(sstr) && /* and really is a string */
645c22ef 4452 /* and won't be needed again, potentially */
765f542d
NC
4453 !(PL_op && PL_op->op_type == OP_AASSIGN))
4454#ifdef PERL_COPY_ON_WRITE
4455 && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
120fac95 4456 && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
765f542d
NC
4457 && SvTYPE(sstr) >= SVt_PVIV)
4458#endif
4459 ) {
4460 /* Failed the swipe test, and it's not a shared hash key either.
4461 Have to copy the string. */
4462 STRLEN len = SvCUR(sstr);
4463 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
4464 Move(SvPVX(sstr),SvPVX(dstr),len,char);
4465 SvCUR_set(dstr, len);
4466 *SvEND(dstr) = '\0';
765f542d
NC
4467 } else {
4468 /* If PERL_COPY_ON_WRITE is not defined, then isSwipe will always
4469 be true in here. */
4470#ifdef PERL_COPY_ON_WRITE
4471 /* Either it's a shared hash key, or it's suitable for
4472 copy-on-write or we can swipe the string. */
46187eeb 4473 if (DEBUG_C_TEST) {
ed252734 4474 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
4475 sv_dump(sstr);
4476 sv_dump(dstr);
46187eeb 4477 }
765f542d
NC
4478 if (!isSwipe) {
4479 /* I believe I should acquire a global SV mutex if
4480 it's a COW sv (not a shared hash key) to stop
4481 it going un copy-on-write.
4482 If the source SV has gone un copy on write between up there
4483 and down here, then (assert() that) it is of the correct
4484 form to make it copy on write again */
4485 if ((sflags & (SVf_FAKE | SVf_READONLY))
4486 != (SVf_FAKE | SVf_READONLY)) {
4487 SvREADONLY_on(sstr);
4488 SvFAKE_on(sstr);
4489 /* Make the source SV into a loop of 1.
4490 (about to become 2) */
a29f6d03 4491 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
4492 }
4493 }
4494#endif
4495 /* Initial code is common. */
adbc6bb1 4496 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
4497 if (SvOOK(dstr)) {
4498 SvFLAGS(dstr) &= ~SVf_OOK;
4499 Safefree(SvPVX(dstr) - SvIVX(dstr));
4500 }
50483b2c 4501 else if (SvLEN(dstr))
a5f75d66 4502 Safefree(SvPVX(dstr));
79072805 4503 }
765f542d
NC
4504
4505#ifdef PERL_COPY_ON_WRITE
4506 if (!isSwipe) {
4507 /* making another shared SV. */
4508 STRLEN cur = SvCUR(sstr);
4509 STRLEN len = SvLEN(sstr);
d89fc664 4510 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
4511 if (len) {
4512 /* SvIsCOW_normal */
4513 /* splice us in between source and next-after-source. */
a29f6d03
NC
4514 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4515 SV_COW_NEXT_SV_SET(sstr, dstr);
765f542d
NC
4516 SvPV_set(dstr, SvPVX(sstr));
4517 } else {
4518 /* SvIsCOW_shared_hash */
4519 UV hash = SvUVX(sstr);
46187eeb
NC
4520 DEBUG_C(PerlIO_printf(Perl_debug_log,
4521 "Copy on write: Sharing hash\n"));
765f542d
NC
4522 SvPV_set(dstr,
4523 sharepvn(SvPVX(sstr),
4524 (sflags & SVf_UTF8?-cur:cur), hash));
607fa7f2 4525 SvUV_set(dstr, hash);
765f542d 4526 }
87a1ef3d
SP
4527 SvLEN_set(dstr, len);
4528 SvCUR_set(dstr, cur);
765f542d
NC
4529 SvREADONLY_on(dstr);
4530 SvFAKE_on(dstr);
4531 /* Relesase a global SV mutex. */
4532 }
4533 else
4534#endif
4535 { /* Passes the swipe test. */
4536 SvPV_set(dstr, SvPVX(sstr));
4537 SvLEN_set(dstr, SvLEN(sstr));
4538 SvCUR_set(dstr, SvCUR(sstr));
4539
4540 SvTEMP_off(dstr);
4541 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
4542 SvPV_set(sstr, Nullch);
4543 SvLEN_set(sstr, 0);
4544 SvCUR_set(sstr, 0);
4545 SvTEMP_off(sstr);
4546 }
4547 }
9aa983d2 4548 if (sflags & SVf_UTF8)
a7cb1f99 4549 SvUTF8_on(dstr);
79072805 4550 /*SUPPRESS 560*/
8990e307 4551 if (sflags & SVp_NOK) {
3332b3c1
JH
4552 SvNOKp_on(dstr);
4553 if (sflags & SVf_NOK)
4554 SvFLAGS(dstr) |= SVf_NOK;
9d6ce603 4555 SvNV_set(dstr, SvNVX(sstr));
79072805 4556 }
8990e307 4557 if (sflags & SVp_IOK) {
3332b3c1
JH
4558 (void)SvIOKp_on(dstr);
4559 if (sflags & SVf_IOK)
4560 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4561 if (sflags & SVf_IVisUV)
25da4f38 4562 SvIsUV_on(dstr);
45977657 4563 SvIV_set(dstr, SvIVX(sstr));
79072805 4564 }
92f0c265 4565 if (SvVOK(sstr)) {
7a5fa8a2 4566 MAGIC *smg = mg_find(sstr,PERL_MAGIC_vstring);
ece467f9
JP
4567 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4568 smg->mg_ptr, smg->mg_len);
439cb1c4 4569 SvRMAGICAL_on(dstr);
7a5fa8a2 4570 }
79072805 4571 }
8990e307 4572 else if (sflags & SVp_IOK) {
3332b3c1
JH
4573 if (sflags & SVf_IOK)
4574 (void)SvIOK_only(dstr);
4575 else {
9cbac4c7
DM
4576 (void)SvOK_off(dstr);
4577 (void)SvIOKp_on(dstr);
3332b3c1
JH
4578 }
4579 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2b1c7e3e 4580 if (sflags & SVf_IVisUV)
25da4f38 4581 SvIsUV_on(dstr);
45977657 4582 SvIV_set(dstr, SvIVX(sstr));
3332b3c1
JH
4583 if (sflags & SVp_NOK) {
4584 if (sflags & SVf_NOK)
4585 (void)SvNOK_on(dstr);
4586 else
4587 (void)SvNOKp_on(dstr);
9d6ce603 4588 SvNV_set(dstr, SvNVX(sstr));
3332b3c1
JH
4589 }
4590 }
4591 else if (sflags & SVp_NOK) {
4592 if (sflags & SVf_NOK)
4593 (void)SvNOK_only(dstr);
4594 else {
9cbac4c7 4595 (void)SvOK_off(dstr);
3332b3c1
JH
4596 SvNOKp_on(dstr);
4597 }
9d6ce603 4598 SvNV_set(dstr, SvNVX(sstr));
79072805
LW
4599 }
4600 else {
20408e3c 4601 if (dtype == SVt_PVGV) {
e476b1b5 4602 if (ckWARN(WARN_MISC))
9014280d 4603 Perl_warner(aTHX_ packWARN(WARN_MISC), "Undefined value assigned to typeglob");
20408e3c
GS
4604 }
4605 else
4606 (void)SvOK_off(dstr);
a0d0e21e 4607 }
27c9684d
AP
4608 if (SvTAINTED(sstr))
4609 SvTAINT(dstr);
79072805
LW
4610}
4611
954c1994
GS
4612/*
4613=for apidoc sv_setsv_mg
4614
4615Like C<sv_setsv>, but also handles 'set' magic.
4616
4617=cut
4618*/
4619
79072805 4620void
864dbfa3 4621Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
4622{
4623 sv_setsv(dstr,sstr);
4624 SvSETMAGIC(dstr);
4625}
4626
ed252734
NC
4627#ifdef PERL_COPY_ON_WRITE
4628SV *
4629Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4630{
4631 STRLEN cur = SvCUR(sstr);
4632 STRLEN len = SvLEN(sstr);
4633 register char *new_pv;
4634
4635 if (DEBUG_C_TEST) {
4636 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4637 sstr, dstr);
4638 sv_dump(sstr);
4639 if (dstr)
4640 sv_dump(dstr);
4641 }
4642
4643 if (dstr) {
4644 if (SvTHINKFIRST(dstr))
4645 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
4646 else if (SvPVX(dstr))
4647 Safefree(SvPVX(dstr));
4648 }
4649 else
4650 new_SV(dstr);
b988aa42 4651 (void)SvUPGRADE (dstr, SVt_PVIV);
ed252734
NC
4652
4653 assert (SvPOK(sstr));
4654 assert (SvPOKp(sstr));
4655 assert (!SvIOK(sstr));
4656 assert (!SvIOKp(sstr));
4657 assert (!SvNOK(sstr));
4658 assert (!SvNOKp(sstr));
4659
4660 if (SvIsCOW(sstr)) {
4661
4662 if (SvLEN(sstr) == 0) {
4663 /* source is a COW shared hash key. */
4664 UV hash = SvUVX(sstr);
4665 DEBUG_C(PerlIO_printf(Perl_debug_log,
4666 "Fast copy on write: Sharing hash\n"));
607fa7f2 4667 SvUV_set(dstr, hash);
ed252734
NC
4668 new_pv = sharepvn(SvPVX(sstr), (SvUTF8(sstr)?-cur:cur), hash);
4669 goto common_exit;
4670 }
4671 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4672 } else {
4673 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
b988aa42 4674 (void)SvUPGRADE (sstr, SVt_PVIV);
ed252734
NC
4675 SvREADONLY_on(sstr);
4676 SvFAKE_on(sstr);
4677 DEBUG_C(PerlIO_printf(Perl_debug_log,
4678 "Fast copy on write: Converting sstr to COW\n"));
4679 SV_COW_NEXT_SV_SET(dstr, sstr);
4680 }
4681 SV_COW_NEXT_SV_SET(sstr, dstr);
4682 new_pv = SvPVX(sstr);
4683
4684 common_exit:
4685 SvPV_set(dstr, new_pv);
4686 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4687 if (SvUTF8(sstr))
4688 SvUTF8_on(dstr);
87a1ef3d
SP
4689 SvLEN_set(dstr, len);
4690 SvCUR_set(dstr, cur);
ed252734
NC
4691 if (DEBUG_C_TEST) {
4692 sv_dump(dstr);
4693 }
4694 return dstr;
4695}
4696#endif
4697
954c1994
GS
4698/*
4699=for apidoc sv_setpvn
4700
4701Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
4702bytes to be copied. If the C<ptr> argument is NULL the SV will become
4703undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
4704
4705=cut
4706*/
4707
ef50df4b 4708void
864dbfa3 4709Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 4710{
c6f8c383 4711 register char *dptr;
22c522df 4712
765f542d 4713 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4714 if (!ptr) {
a0d0e21e 4715 (void)SvOK_off(sv);
463ee0b2
LW
4716 return;
4717 }
22c522df
JH
4718 else {
4719 /* len is STRLEN which is unsigned, need to copy to signed */
a3b680e6 4720 const IV iv = len;
9c5ffd7c
JH
4721 if (iv < 0)
4722 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 4723 }
6fc92669 4724 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4725
79072805 4726 SvGROW(sv, len + 1);
c6f8c383
GA
4727 dptr = SvPVX(sv);
4728 Move(ptr,dptr,len,char);
4729 dptr[len] = '\0';
79072805 4730 SvCUR_set(sv, len);
1aa99e6b 4731 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4732 SvTAINT(sv);
79072805
LW
4733}
4734
954c1994
GS
4735/*
4736=for apidoc sv_setpvn_mg
4737
4738Like C<sv_setpvn>, but also handles 'set' magic.
4739
4740=cut
4741*/
4742
79072805 4743void
864dbfa3 4744Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4745{
4746 sv_setpvn(sv,ptr,len);
4747 SvSETMAGIC(sv);
4748}
4749
954c1994
GS
4750/*
4751=for apidoc sv_setpv
4752
4753Copies a string into an SV. The string must be null-terminated. Does not
4754handle 'set' magic. See C<sv_setpv_mg>.
4755
4756=cut
4757*/
4758
ef50df4b 4759void
864dbfa3 4760Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4761{
4762 register STRLEN len;
4763
765f542d 4764 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4765 if (!ptr) {
a0d0e21e 4766 (void)SvOK_off(sv);
463ee0b2
LW
4767 return;
4768 }
79072805 4769 len = strlen(ptr);
6fc92669 4770 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4771
79072805 4772 SvGROW(sv, len + 1);
463ee0b2 4773 Move(ptr,SvPVX(sv),len+1,char);
79072805 4774 SvCUR_set(sv, len);
1aa99e6b 4775 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
4776 SvTAINT(sv);
4777}
4778
954c1994
GS
4779/*
4780=for apidoc sv_setpv_mg
4781
4782Like C<sv_setpv>, but also handles 'set' magic.
4783
4784=cut
4785*/
4786
463ee0b2 4787void
864dbfa3 4788Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
4789{
4790 sv_setpv(sv,ptr);
4791 SvSETMAGIC(sv);
4792}
4793
954c1994
GS
4794/*
4795=for apidoc sv_usepvn
4796
4797Tells an SV to use C<ptr> to find its string value. Normally the string is
1c846c1f 4798stored inside the SV but sv_usepvn allows the SV to use an outside string.
954c1994
GS
4799The C<ptr> should point to memory that was allocated by C<malloc>. The
4800string length, C<len>, must be supplied. This function will realloc the
4801memory pointed to by C<ptr>, so that pointer should not be freed or used by
4802the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
4803See C<sv_usepvn_mg>.
4804
4805=cut
4806*/
4807
ef50df4b 4808void
864dbfa3 4809Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 4810{
765f542d 4811 SV_CHECK_THINKFIRST_COW_DROP(sv);
c6f8c383 4812 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 4813 if (!ptr) {
a0d0e21e 4814 (void)SvOK_off(sv);
463ee0b2
LW
4815 return;
4816 }
8bd4d4c5
NC
4817 if (SvPVX(sv))
4818 SvPV_free(sv);
463ee0b2 4819 Renew(ptr, len+1, char);
f880fe2f 4820 SvPV_set(sv, ptr);
463ee0b2
LW
4821 SvCUR_set(sv, len);
4822 SvLEN_set(sv, len+1);
4823 *SvEND(sv) = '\0';
1aa99e6b 4824 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4825 SvTAINT(sv);
79072805
LW
4826}
4827
954c1994
GS
4828/*
4829=for apidoc sv_usepvn_mg
4830
4831Like C<sv_usepvn>, but also handles 'set' magic.
4832
4833=cut
4834*/
4835
ef50df4b 4836void
864dbfa3 4837Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 4838{
51c1089b 4839 sv_usepvn(sv,ptr,len);
ef50df4b
GS
4840 SvSETMAGIC(sv);
4841}
4842
765f542d
NC
4843#ifdef PERL_COPY_ON_WRITE
4844/* Need to do this *after* making the SV normal, as we need the buffer
4845 pointer to remain valid until after we've copied it. If we let go too early,
4846 another thread could invalidate it by unsharing last of the same hash key
4847 (which it can do by means other than releasing copy-on-write Svs)
4848 or by changing the other copy-on-write SVs in the loop. */
4849STATIC void
4850S_sv_release_COW(pTHX_ register SV *sv, char *pvx, STRLEN cur, STRLEN len,
4851 U32 hash, SV *after)
4852{
4853 if (len) { /* this SV was SvIsCOW_normal(sv) */
4854 /* we need to find the SV pointing to us. */
4855 SV *current = SV_COW_NEXT_SV(after);
7a5fa8a2 4856
765f542d
NC
4857 if (current == sv) {
4858 /* The SV we point to points back to us (there were only two of us
4859 in the loop.)
4860 Hence other SV is no longer copy on write either. */
4861 SvFAKE_off(after);
4862 SvREADONLY_off(after);
4863 } else {
4864 /* We need to follow the pointers around the loop. */
4865 SV *next;
4866 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4867 assert (next);
4868 current = next;
4869 /* don't loop forever if the structure is bust, and we have
4870 a pointer into a closed loop. */
4871 assert (current != after);
e419cbc5 4872 assert (SvPVX(current) == pvx);
765f542d
NC
4873 }
4874 /* Make the SV before us point to the SV after us. */
a29f6d03 4875 SV_COW_NEXT_SV_SET(current, after);
765f542d
NC
4876 }
4877 } else {
4878 unsharepvn(pvx, SvUTF8(sv) ? -(I32)cur : cur, hash);
4879 }
4880}
4881
4882int
4883Perl_sv_release_IVX(pTHX_ register SV *sv)
4884{
4885 if (SvIsCOW(sv))
4886 sv_force_normal_flags(sv, 0);
0c34ef67
MHM
4887 SvOOK_off(sv);
4888 return 0;
765f542d
NC
4889}
4890#endif
645c22ef
DM
4891/*
4892=for apidoc sv_force_normal_flags
4893
4894Undo various types of fakery on an SV: if the PV is a shared string, make
4895a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4896an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4897we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4898then a copy-on-write scalar drops its PV buffer (if any) and becomes
4899SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 4900set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
4901C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4902with flags set to 0.
645c22ef
DM
4903
4904=cut
4905*/
4906
6fc92669 4907void
840a7b70 4908Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 4909{
765f542d
NC
4910#ifdef PERL_COPY_ON_WRITE
4911 if (SvREADONLY(sv)) {
4912 /* At this point I believe I should acquire a global SV mutex. */
4913 if (SvFAKE(sv)) {
4914 char *pvx = SvPVX(sv);
4915 STRLEN len = SvLEN(sv);
4916 STRLEN cur = SvCUR(sv);
4917 U32 hash = SvUVX(sv);
4918 SV *next = SV_COW_NEXT_SV(sv); /* next COW sv in the loop. */
46187eeb
NC
4919 if (DEBUG_C_TEST) {
4920 PerlIO_printf(Perl_debug_log,
4921 "Copy on write: Force normal %ld\n",
4922 (long) flags);
e419cbc5 4923 sv_dump(sv);
46187eeb 4924 }
765f542d
NC
4925 SvFAKE_off(sv);
4926 SvREADONLY_off(sv);
4927 /* This SV doesn't own the buffer, so need to New() a new one: */
f880fe2f 4928 SvPV_set(sv, (char*)0);
87a1ef3d 4929 SvLEN_set(sv, 0);
765f542d
NC
4930 if (flags & SV_COW_DROP_PV) {
4931 /* OK, so we don't need to copy our buffer. */
4932 SvPOK_off(sv);
4933 } else {
4934 SvGROW(sv, cur + 1);
4935 Move(pvx,SvPVX(sv),cur,char);
87a1ef3d 4936 SvCUR_set(sv, cur);
765f542d
NC
4937 *SvEND(sv) = '\0';
4938 }
e419cbc5 4939 sv_release_COW(sv, pvx, cur, len, hash, next);
46187eeb 4940 if (DEBUG_C_TEST) {
e419cbc5 4941 sv_dump(sv);
46187eeb 4942 }
765f542d 4943 }
923e4eb5 4944 else if (IN_PERL_RUNTIME)
765f542d
NC
4945 Perl_croak(aTHX_ PL_no_modify);
4946 /* At this point I believe that I can drop the global SV mutex. */
4947 }
4948#else
2213622d 4949 if (SvREADONLY(sv)) {
1c846c1f
NIS
4950 if (SvFAKE(sv)) {
4951 char *pvx = SvPVX(sv);
1df70142 4952 const int is_utf8 = SvUTF8(sv);
1c846c1f
NIS
4953 STRLEN len = SvCUR(sv);
4954 U32 hash = SvUVX(sv);
10bcdfd6
NC
4955 SvFAKE_off(sv);
4956 SvREADONLY_off(sv);
f880fe2f 4957 SvPV_set(sv, (char*)0);
b162af07 4958 SvLEN_set(sv, 0);
1c846c1f
NIS
4959 SvGROW(sv, len + 1);
4960 Move(pvx,SvPVX(sv),len,char);
4961 *SvEND(sv) = '\0';
5c98da1c 4962 unsharepvn(pvx, is_utf8 ? -(I32)len : len, hash);
1c846c1f 4963 }
923e4eb5 4964 else if (IN_PERL_RUNTIME)
cea2e8a9 4965 Perl_croak(aTHX_ PL_no_modify);
0f15f207 4966 }
765f542d 4967#endif
2213622d 4968 if (SvROK(sv))
840a7b70 4969 sv_unref_flags(sv, flags);
6fc92669
GS
4970 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4971 sv_unglob(sv);
0f15f207 4972}
1c846c1f 4973
645c22ef
DM
4974/*
4975=for apidoc sv_force_normal
4976
4977Undo various types of fakery on an SV: if the PV is a shared string, make
4978a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4979an xpvmg. See also C<sv_force_normal_flags>.
4980
4981=cut
4982*/
4983
840a7b70
IZ
4984void
4985Perl_sv_force_normal(pTHX_ register SV *sv)
4986{
4987 sv_force_normal_flags(sv, 0);
4988}
4989
954c1994
GS
4990/*
4991=for apidoc sv_chop
4992
1c846c1f 4993Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4994SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4995the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4996string. Uses the "OOK hack".
31869a79
AE
4997Beware: after this function returns, C<ptr> and SvPVX(sv) may no longer
4998refer to the same chunk of data.
954c1994
GS
4999
5000=cut
5001*/
5002
79072805 5003void
f54cb97a 5004Perl_sv_chop(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
5005{
5006 register STRLEN delta;
a0d0e21e 5007 if (!ptr || !SvPOKp(sv))
79072805 5008 return;
31869a79 5009 delta = ptr - SvPVX(sv);
2213622d 5010 SV_CHECK_THINKFIRST(sv);
79072805
LW
5011 if (SvTYPE(sv) < SVt_PVIV)
5012 sv_upgrade(sv,SVt_PVIV);
5013
5014 if (!SvOOK(sv)) {
50483b2c 5015 if (!SvLEN(sv)) { /* make copy of shared string */
f54cb97a 5016 const char *pvx = SvPVX(sv);
50483b2c
JD
5017 STRLEN len = SvCUR(sv);
5018 SvGROW(sv, len + 1);
5019 Move(pvx,SvPVX(sv),len,char);
5020 *SvEND(sv) = '\0';
5021 }
45977657 5022 SvIV_set(sv, 0);
a4bfb290
AB
5023 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
5024 and we do that anyway inside the SvNIOK_off
5025 */
7a5fa8a2 5026 SvFLAGS(sv) |= SVf_OOK;
79072805 5027 }
a4bfb290 5028 SvNIOK_off(sv);
b162af07
SP
5029 SvLEN_set(sv, SvLEN(sv) - delta);
5030 SvCUR_set(sv, SvCUR(sv) - delta);
f880fe2f 5031 SvPV_set(sv, SvPVX(sv) + delta);
45977657 5032 SvIV_set(sv, SvIVX(sv) + delta);
79072805
LW
5033}
5034
09540bc3
JH
5035/* sv_catpvn() is now a macro using Perl_sv_catpvn_flags();
5036 * this function provided for binary compatibility only
5037 */
5038
5039void
5040Perl_sv_catpvn(pTHX_ SV *dsv, const char* sstr, STRLEN slen)
5041{
5042 sv_catpvn_flags(dsv, sstr, slen, SV_GMAGIC);
5043}
5044
954c1994
GS
5045/*
5046=for apidoc sv_catpvn
5047
5048Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
5049C<len> indicates number of bytes to copy. If the SV has the UTF-8
5050status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 5051Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 5052
8d6d96c1
HS
5053=for apidoc sv_catpvn_flags
5054
5055Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
5056C<len> indicates number of bytes to copy. If the SV has the UTF-8
5057status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
5058If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
5059appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
5060in terms of this function.
5061
5062=cut
5063*/
5064
5065void
5066Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
5067{
5068 STRLEN dlen;
f54cb97a 5069 const char *dstr = SvPV_force_flags(dsv, dlen, flags);
8d6d96c1 5070
8d6d96c1
HS
5071 SvGROW(dsv, dlen + slen + 1);
5072 if (sstr == dstr)
5073 sstr = SvPVX(dsv);
5074 Move(sstr, SvPVX(dsv) + dlen, slen, char);
b162af07 5075 SvCUR_set(dsv, SvCUR(dsv) + slen);
8d6d96c1
HS
5076 *SvEND(dsv) = '\0';
5077 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
5078 SvTAINT(dsv);
79072805
LW
5079}
5080
954c1994
GS
5081/*
5082=for apidoc sv_catpvn_mg
5083
5084Like C<sv_catpvn>, but also handles 'set' magic.
5085
5086=cut
5087*/
5088
79072805 5089void
864dbfa3 5090Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
5091{
5092 sv_catpvn(sv,ptr,len);
5093 SvSETMAGIC(sv);
5094}
5095
09540bc3
JH
5096/* sv_catsv() is now a macro using Perl_sv_catsv_flags();
5097 * this function provided for binary compatibility only
5098 */
5099
5100void
5101Perl_sv_catsv(pTHX_ SV *dstr, register SV *sstr)
5102{
5103 sv_catsv_flags(dstr, sstr, SV_GMAGIC);
5104}
5105
954c1994
GS
5106/*
5107=for apidoc sv_catsv
5108
13e8c8e3
JH
5109Concatenates the string from SV C<ssv> onto the end of the string in
5110SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
5111not 'set' magic. See C<sv_catsv_mg>.
954c1994 5112
8d6d96c1
HS
5113=for apidoc sv_catsv_flags
5114
5115Concatenates the string from SV C<ssv> onto the end of the string in
5116SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
5117bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
5118and C<sv_catsv_nomg> are implemented in terms of this function.
5119
5120=cut */
5121
ef50df4b 5122void
8d6d96c1 5123Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 5124{
13e8c8e3
JH
5125 char *spv;
5126 STRLEN slen;
46199a12 5127 if (!ssv)
79072805 5128 return;
46199a12 5129 if ((spv = SvPV(ssv, slen))) {
4fd84b44
AD
5130 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
5131 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
8cf8f3d1
NIS
5132 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
5133 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4fd84b44
AD
5134 dsv->sv_flags doesn't have that bit set.
5135 Andy Dougherty 12 Oct 2001
5136 */
5137 I32 sutf8 = DO_UTF8(ssv);
5138 I32 dutf8;
13e8c8e3 5139
8d6d96c1
HS
5140 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
5141 mg_get(dsv);
5142 dutf8 = DO_UTF8(dsv);
5143
5144 if (dutf8 != sutf8) {
13e8c8e3 5145 if (dutf8) {
46199a12 5146 /* Not modifying source SV, so taking a temporary copy. */
8d6d96c1 5147 SV* csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 5148
46199a12 5149 sv_utf8_upgrade(csv);
8d6d96c1 5150 spv = SvPV(csv, slen);
13e8c8e3 5151 }
8d6d96c1
HS
5152 else
5153 sv_utf8_upgrade_nomg(dsv);
e84ff256 5154 }
8d6d96c1 5155 sv_catpvn_nomg(dsv, spv, slen);
560a288e 5156 }
79072805
LW
5157}
5158
954c1994
GS
5159/*
5160=for apidoc sv_catsv_mg
5161
5162Like C<sv_catsv>, but also handles 'set' magic.
5163
5164=cut
5165*/
5166
79072805 5167void
46199a12 5168Perl_sv_catsv_mg(pTHX_ SV *dsv, register SV *ssv)
ef50df4b 5169{
46199a12
JH
5170 sv_catsv(dsv,ssv);
5171 SvSETMAGIC(dsv);
ef50df4b
GS
5172}
5173
954c1994
GS
5174/*
5175=for apidoc sv_catpv
5176
5177Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
5178If the SV has the UTF-8 status set, then the bytes appended should be
5179valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 5180
d5ce4a7c 5181=cut */
954c1994 5182
ef50df4b 5183void
0c981600 5184Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
5185{
5186 register STRLEN len;
463ee0b2 5187 STRLEN tlen;
748a9306 5188 char *junk;
79072805 5189
0c981600 5190 if (!ptr)
79072805 5191 return;
748a9306 5192 junk = SvPV_force(sv, tlen);
0c981600 5193 len = strlen(ptr);
463ee0b2 5194 SvGROW(sv, tlen + len + 1);
0c981600
JH
5195 if (ptr == junk)
5196 ptr = SvPVX(sv);
5197 Move(ptr,SvPVX(sv)+tlen,len+1,char);
b162af07 5198 SvCUR_set(sv, SvCUR(sv) + len);
d41ff1b8 5199 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 5200 SvTAINT(sv);
79072805
LW
5201}
5202
954c1994
GS
5203/*
5204=for apidoc sv_catpv_mg
5205
5206Like C<sv_catpv>, but also handles 'set' magic.
5207
5208=cut
5209*/
5210
ef50df4b 5211void
0c981600 5212Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 5213{
0c981600 5214 sv_catpv(sv,ptr);
ef50df4b
GS
5215 SvSETMAGIC(sv);
5216}
5217
645c22ef
DM
5218/*
5219=for apidoc newSV
5220
5221Create a new null SV, or if len > 0, create a new empty SVt_PV type SV
5222with an initial PV allocation of len+1. Normally accessed via the C<NEWSV>
5223macro.
5224
5225=cut
5226*/
5227
79072805 5228SV *
864dbfa3 5229Perl_newSV(pTHX_ STRLEN len)
79072805
LW
5230{
5231 register SV *sv;
1c846c1f 5232
4561caa4 5233 new_SV(sv);
79072805
LW
5234 if (len) {
5235 sv_upgrade(sv, SVt_PV);
5236 SvGROW(sv, len + 1);
5237 }
5238 return sv;
5239}
954c1994 5240/*
92110913 5241=for apidoc sv_magicext
954c1994 5242
68795e93 5243Adds magic to an SV, upgrading it if necessary. Applies the
2d8d5d5a 5244supplied vtable and returns a pointer to the magic added.
92110913 5245
2d8d5d5a
SH
5246Note that C<sv_magicext> will allow things that C<sv_magic> will not.
5247In particular, you can add magic to SvREADONLY SVs, and add more than
5248one instance of the same 'how'.
645c22ef 5249
2d8d5d5a
SH
5250If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
5251stored, if C<namlen> is zero then C<name> is stored as-is and - as another
5252special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
5253to contain an C<SV*> and is stored as-is with its REFCNT incremented.
92110913 5254
2d8d5d5a 5255(This is now used as a subroutine by C<sv_magic>.)
954c1994
GS
5256
5257=cut
5258*/
92110913 5259MAGIC *
e1ec3a88 5260Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, const MGVTBL *vtable,
92110913 5261 const char* name, I32 namlen)
79072805
LW
5262{
5263 MAGIC* mg;
68795e93 5264
92110913
NIS
5265 if (SvTYPE(sv) < SVt_PVMG) {
5266 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 5267 }
79072805
LW
5268 Newz(702,mg, 1, MAGIC);
5269 mg->mg_moremagic = SvMAGIC(sv);
b162af07 5270 SvMAGIC_set(sv, mg);
75f9d97a 5271
05f95b08
SB
5272 /* Sometimes a magic contains a reference loop, where the sv and
5273 object refer to each other. To prevent a reference loop that
5274 would prevent such objects being freed, we look for such loops
5275 and if we find one we avoid incrementing the object refcount.
87f0b213
JH
5276
5277 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 5278 have its REFCNT incremented to keep it in existence.
87f0b213
JH
5279
5280 */
14befaf4
DM
5281 if (!obj || obj == sv ||
5282 how == PERL_MAGIC_arylen ||
5283 how == PERL_MAGIC_qr ||
8d2f4536 5284 how == PERL_MAGIC_symtab ||
75f9d97a
JH
5285 (SvTYPE(obj) == SVt_PVGV &&
5286 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
5287 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 5288 GvFORM(obj) == (CV*)sv)))
75f9d97a 5289 {
8990e307 5290 mg->mg_obj = obj;
75f9d97a 5291 }
85e6fe83 5292 else {
8990e307 5293 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
5294 mg->mg_flags |= MGf_REFCOUNTED;
5295 }
b5ccf5f2
YST
5296
5297 /* Normal self-ties simply pass a null object, and instead of
5298 using mg_obj directly, use the SvTIED_obj macro to produce a
5299 new RV as needed. For glob "self-ties", we are tieing the PVIO
5300 with an RV obj pointing to the glob containing the PVIO. In
5301 this case, to avoid a reference loop, we need to weaken the
5302 reference.
5303 */
5304
5305 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
5306 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
5307 {
5308 sv_rvweaken(obj);
5309 }
5310
79072805 5311 mg->mg_type = how;
565764a8 5312 mg->mg_len = namlen;
9cbac4c7 5313 if (name) {
92110913 5314 if (namlen > 0)
1edc1566 5315 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 5316 else if (namlen == HEf_SVKEY)
1edc1566 5317 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
68795e93 5318 else
92110913 5319 mg->mg_ptr = (char *) name;
9cbac4c7 5320 }
92110913 5321 mg->mg_virtual = vtable;
68795e93 5322
92110913
NIS
5323 mg_magical(sv);
5324 if (SvGMAGICAL(sv))
5325 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
5326 return mg;
5327}
5328
5329/*
5330=for apidoc sv_magic
1c846c1f 5331
92110913
NIS
5332Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
5333then adds a new magic item of type C<how> to the head of the magic list.
5334
2d8d5d5a
SH
5335See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
5336handling of the C<name> and C<namlen> arguments.
5337
4509d3fb
SB
5338You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
5339to add more than one instance of the same 'how'.
5340
92110913
NIS
5341=cut
5342*/
5343
5344void
5345Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 5346{
e1ec3a88 5347 const MGVTBL *vtable = 0;
92110913 5348 MAGIC* mg;
92110913 5349
765f542d
NC
5350#ifdef PERL_COPY_ON_WRITE
5351 if (SvIsCOW(sv))
5352 sv_force_normal_flags(sv, 0);
5353#endif
92110913 5354 if (SvREADONLY(sv)) {
923e4eb5 5355 if (IN_PERL_RUNTIME
92110913
NIS
5356 && how != PERL_MAGIC_regex_global
5357 && how != PERL_MAGIC_bm
5358 && how != PERL_MAGIC_fm
5359 && how != PERL_MAGIC_sv
e6469971 5360 && how != PERL_MAGIC_backref
92110913
NIS
5361 )
5362 {
5363 Perl_croak(aTHX_ PL_no_modify);
5364 }
5365 }
5366 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
5367 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
5368 /* sv_magic() refuses to add a magic of the same 'how' as an
5369 existing one
92110913
NIS
5370 */
5371 if (how == PERL_MAGIC_taint)
5372 mg->mg_len |= 1;
5373 return;
5374 }
5375 }
68795e93 5376
79072805 5377 switch (how) {
14befaf4 5378 case PERL_MAGIC_sv:
92110913 5379 vtable = &PL_vtbl_sv;
79072805 5380 break;
14befaf4 5381 case PERL_MAGIC_overload:
92110913 5382 vtable = &PL_vtbl_amagic;
a0d0e21e 5383 break;
14befaf4 5384 case PERL_MAGIC_overload_elem:
92110913 5385 vtable = &PL_vtbl_amagicelem;
a0d0e21e 5386 break;
14befaf4 5387 case PERL_MAGIC_overload_table:
92110913 5388 vtable = &PL_vtbl_ovrld;
a0d0e21e 5389 break;
14befaf4 5390 case PERL_MAGIC_bm:
92110913 5391 vtable = &PL_vtbl_bm;
79072805 5392 break;
14befaf4 5393 case PERL_MAGIC_regdata:
92110913 5394 vtable = &PL_vtbl_regdata;
6cef1e77 5395 break;
14befaf4 5396 case PERL_MAGIC_regdatum:
92110913 5397 vtable = &PL_vtbl_regdatum;
6cef1e77 5398 break;
14befaf4 5399 case PERL_MAGIC_env:
92110913 5400 vtable = &PL_vtbl_env;
79072805 5401 break;
14befaf4 5402 case PERL_MAGIC_fm:
92110913 5403 vtable = &PL_vtbl_fm;
55497cff 5404 break;
14befaf4 5405 case PERL_MAGIC_envelem:
92110913 5406 vtable = &PL_vtbl_envelem;
79072805 5407 break;
14befaf4 5408 case PERL_MAGIC_regex_global:
92110913 5409 vtable = &PL_vtbl_mglob;
93a17b20 5410 break;
14befaf4 5411 case PERL_MAGIC_isa:
92110913 5412 vtable = &PL_vtbl_isa;
463ee0b2 5413 break;
14befaf4 5414 case PERL_MAGIC_isaelem:
92110913 5415 vtable = &PL_vtbl_isaelem;
463ee0b2 5416 break;
14befaf4 5417 case PERL_MAGIC_nkeys:
92110913 5418 vtable = &PL_vtbl_nkeys;
16660edb 5419 break;
14befaf4 5420 case PERL_MAGIC_dbfile:
92110913 5421 vtable = 0;
93a17b20 5422 break;
14befaf4 5423 case PERL_MAGIC_dbline:
92110913 5424 vtable = &PL_vtbl_dbline;
79072805 5425 break;
36477c24 5426#ifdef USE_LOCALE_COLLATE
14befaf4 5427 case PERL_MAGIC_collxfrm:
92110913 5428 vtable = &PL_vtbl_collxfrm;
bbce6d69 5429 break;
36477c24 5430#endif /* USE_LOCALE_COLLATE */
14befaf4 5431 case PERL_MAGIC_tied:
92110913 5432 vtable = &PL_vtbl_pack;
463ee0b2 5433 break;
14befaf4
DM
5434 case PERL_MAGIC_tiedelem:
5435 case PERL_MAGIC_tiedscalar:
92110913 5436 vtable = &PL_vtbl_packelem;
463ee0b2 5437 break;
14befaf4 5438 case PERL_MAGIC_qr:
92110913 5439 vtable = &PL_vtbl_regexp;
c277df42 5440 break;
14befaf4 5441 case PERL_MAGIC_sig:
92110913 5442 vtable = &PL_vtbl_sig;
79072805 5443 break;
14befaf4 5444 case PERL_MAGIC_sigelem:
92110913 5445 vtable = &PL_vtbl_sigelem;
79072805 5446 break;
14befaf4 5447 case PERL_MAGIC_taint:
92110913 5448 vtable = &PL_vtbl_taint;
463ee0b2 5449 break;
14befaf4 5450 case PERL_MAGIC_uvar:
92110913 5451 vtable = &PL_vtbl_uvar;
79072805 5452 break;
14befaf4 5453 case PERL_MAGIC_vec:
92110913 5454 vtable = &PL_vtbl_vec;
79072805 5455 break;
a3874608 5456 case PERL_MAGIC_arylen_p:
bfcb3514 5457 case PERL_MAGIC_rhash:
8d2f4536 5458 case PERL_MAGIC_symtab:
ece467f9
JP
5459 case PERL_MAGIC_vstring:
5460 vtable = 0;
5461 break;
7e8c5dac
HS
5462 case PERL_MAGIC_utf8:
5463 vtable = &PL_vtbl_utf8;
5464 break;
14befaf4 5465 case PERL_MAGIC_substr:
92110913 5466 vtable = &PL_vtbl_substr;
79072805 5467 break;
14befaf4 5468 case PERL_MAGIC_defelem:
92110913 5469 vtable = &PL_vtbl_defelem;
5f05dabc 5470 break;
14befaf4 5471 case PERL_MAGIC_glob:
92110913 5472 vtable = &PL_vtbl_glob;
79072805 5473 break;
14befaf4 5474 case PERL_MAGIC_arylen:
92110913 5475 vtable = &PL_vtbl_arylen;
79072805 5476 break;
14befaf4 5477 case PERL_MAGIC_pos:
92110913 5478 vtable = &PL_vtbl_pos;
a0d0e21e 5479 break;
14befaf4 5480 case PERL_MAGIC_backref:
92110913 5481 vtable = &PL_vtbl_backref;
810b8aa5 5482 break;
14befaf4
DM
5483 case PERL_MAGIC_ext:
5484 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
5485 /* Useful for attaching extension internal data to perl vars. */
5486 /* Note that multiple extensions may clash if magical scalars */
5487 /* etc holding private data from one are passed to another. */
a0d0e21e 5488 break;
79072805 5489 default:
14befaf4 5490 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 5491 }
68795e93 5492
92110913 5493 /* Rest of work is done else where */
27da23d5 5494 mg = sv_magicext(sv,obj,how,(MGVTBL*)vtable,name,namlen);
68795e93 5495
92110913
NIS
5496 switch (how) {
5497 case PERL_MAGIC_taint:
5498 mg->mg_len = 1;
5499 break;
5500 case PERL_MAGIC_ext:
5501 case PERL_MAGIC_dbfile:
5502 SvRMAGICAL_on(sv);
5503 break;
5504 }
463ee0b2
LW
5505}
5506
c461cf8f
JH
5507/*
5508=for apidoc sv_unmagic
5509
645c22ef 5510Removes all magic of type C<type> from an SV.
c461cf8f
JH
5511
5512=cut
5513*/
5514
463ee0b2 5515int
864dbfa3 5516Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
5517{
5518 MAGIC* mg;
5519 MAGIC** mgp;
91bba347 5520 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
5521 return 0;
5522 mgp = &SvMAGIC(sv);
5523 for (mg = *mgp; mg; mg = *mgp) {
5524 if (mg->mg_type == type) {
e1ec3a88 5525 const MGVTBL* const vtbl = mg->mg_virtual;
463ee0b2 5526 *mgp = mg->mg_moremagic;
1d7c1841 5527 if (vtbl && vtbl->svt_free)
fc0dc3b3 5528 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 5529 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 5530 if (mg->mg_len > 0)
1edc1566 5531 Safefree(mg->mg_ptr);
565764a8 5532 else if (mg->mg_len == HEf_SVKEY)
1edc1566 5533 SvREFCNT_dec((SV*)mg->mg_ptr);
7e8c5dac
HS
5534 else if (mg->mg_type == PERL_MAGIC_utf8 && mg->mg_ptr)
5535 Safefree(mg->mg_ptr);
9cbac4c7 5536 }
a0d0e21e
LW
5537 if (mg->mg_flags & MGf_REFCOUNTED)
5538 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
5539 Safefree(mg);
5540 }
5541 else
5542 mgp = &mg->mg_moremagic;
79072805 5543 }
91bba347 5544 if (!SvMAGIC(sv)) {
463ee0b2 5545 SvMAGICAL_off(sv);
06759ea0 5546 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
5547 }
5548
5549 return 0;
79072805
LW
5550}
5551
c461cf8f
JH
5552/*
5553=for apidoc sv_rvweaken
5554
645c22ef
DM
5555Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5556referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5557push a back-reference to this RV onto the array of backreferences
5558associated with that magic.
c461cf8f
JH
5559
5560=cut
5561*/
5562
810b8aa5 5563SV *
864dbfa3 5564Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
5565{
5566 SV *tsv;
5567 if (!SvOK(sv)) /* let undefs pass */
5568 return sv;
5569 if (!SvROK(sv))
cea2e8a9 5570 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 5571 else if (SvWEAKREF(sv)) {
810b8aa5 5572 if (ckWARN(WARN_MISC))
9014280d 5573 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
5574 return sv;
5575 }
5576 tsv = SvRV(sv);
5577 sv_add_backref(tsv, sv);
5578 SvWEAKREF_on(sv);
1c846c1f 5579 SvREFCNT_dec(tsv);
810b8aa5
GS
5580 return sv;
5581}
5582
645c22ef
DM
5583/* Give tsv backref magic if it hasn't already got it, then push a
5584 * back-reference to sv onto the array associated with the backref magic.
5585 */
5586
810b8aa5 5587STATIC void
cea2e8a9 5588S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
5589{
5590 AV *av;
5591 MAGIC *mg;
14befaf4 5592 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, PERL_MAGIC_backref)))
810b8aa5
GS
5593 av = (AV*)mg->mg_obj;
5594 else {
5595 av = newAV();
14befaf4 5596 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
d99b02a1
DM
5597 /* av now has a refcnt of 2, which avoids it getting freed
5598 * before us during global cleanup. The extra ref is removed
5599 * by magic_killbackrefs() when tsv is being freed */
810b8aa5 5600 }
d91d49e8 5601 if (AvFILLp(av) >= AvMAX(av)) {
fdc9a813 5602 I32 i;
d91d49e8 5603 SV **svp = AvARRAY(av);
fdc9a813
AE
5604 for (i = AvFILLp(av); i >= 0; i--)
5605 if (!svp[i]) {
d91d49e8
MM
5606 svp[i] = sv; /* reuse the slot */
5607 return;
5608 }
d91d49e8
MM
5609 av_extend(av, AvFILLp(av)+1);
5610 }
5611 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
5612}
5613
645c22ef
DM
5614/* delete a back-reference to ourselves from the backref magic associated
5615 * with the SV we point to.
5616 */
5617
1c846c1f 5618STATIC void
cea2e8a9 5619S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
5620{
5621 AV *av;
5622 SV **svp;
5623 I32 i;
5624 SV *tsv = SvRV(sv);
c04a4dfe 5625 MAGIC *mg = NULL;
14befaf4 5626 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, PERL_MAGIC_backref)))
cea2e8a9 5627 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
5628 av = (AV *)mg->mg_obj;
5629 svp = AvARRAY(av);
fdc9a813
AE
5630 for (i = AvFILLp(av); i >= 0; i--)
5631 if (svp[i] == sv) svp[i] = Nullsv;
810b8aa5
GS
5632}
5633
954c1994
GS
5634/*
5635=for apidoc sv_insert
5636
5637Inserts a string at the specified offset/length within the SV. Similar to
5638the Perl substr() function.
5639
5640=cut
5641*/
5642
79072805 5643void
e1ec3a88 5644Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, const char *little, STRLEN littlelen)
79072805
LW
5645{
5646 register char *big;
5647 register char *mid;
5648 register char *midend;
5649 register char *bigend;
5650 register I32 i;
6ff81951 5651 STRLEN curlen;
1c846c1f 5652
79072805 5653
8990e307 5654 if (!bigstr)
cea2e8a9 5655 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 5656 SvPV_force(bigstr, curlen);
60fa28ff 5657 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
5658 if (offset + len > curlen) {
5659 SvGROW(bigstr, offset+len+1);
5660 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
5661 SvCUR_set(bigstr, offset+len);
5662 }
79072805 5663
69b47968 5664 SvTAINT(bigstr);
79072805
LW
5665 i = littlelen - len;
5666 if (i > 0) { /* string might grow */
a0d0e21e 5667 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
5668 mid = big + offset + len;
5669 midend = bigend = big + SvCUR(bigstr);
5670 bigend += i;
5671 *bigend = '\0';
5672 while (midend > mid) /* shove everything down */
5673 *--bigend = *--midend;
5674 Move(little,big+offset,littlelen,char);
b162af07 5675 SvCUR_set(bigstr, SvCUR(bigstr) + i);
79072805
LW
5676 SvSETMAGIC(bigstr);
5677 return;
5678 }
5679 else if (i == 0) {
463ee0b2 5680 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
5681 SvSETMAGIC(bigstr);
5682 return;
5683 }
5684
463ee0b2 5685 big = SvPVX(bigstr);
79072805
LW
5686 mid = big + offset;
5687 midend = mid + len;
5688 bigend = big + SvCUR(bigstr);
5689
5690 if (midend > bigend)
cea2e8a9 5691 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5692
5693 if (mid - big > bigend - midend) { /* faster to shorten from end */
5694 if (littlelen) {
5695 Move(little, mid, littlelen,char);
5696 mid += littlelen;
5697 }
5698 i = bigend - midend;
5699 if (i > 0) {
5700 Move(midend, mid, i,char);
5701 mid += i;
5702 }
5703 *mid = '\0';
5704 SvCUR_set(bigstr, mid - big);
5705 }
5706 /*SUPPRESS 560*/
155aba94 5707 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5708 midend -= littlelen;
5709 mid = midend;
5710 sv_chop(bigstr,midend-i);
5711 big += i;
5712 while (i--)
5713 *--midend = *--big;
5714 if (littlelen)
5715 Move(little, mid, littlelen,char);
5716 }
5717 else if (littlelen) {
5718 midend -= littlelen;
5719 sv_chop(bigstr,midend);
5720 Move(little,midend,littlelen,char);
5721 }
5722 else {
5723 sv_chop(bigstr,midend);
5724 }
5725 SvSETMAGIC(bigstr);
5726}
5727
c461cf8f
JH
5728/*
5729=for apidoc sv_replace
5730
5731Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5732The target SV physically takes over ownership of the body of the source SV
5733and inherits its flags; however, the target keeps any magic it owns,
5734and any magic in the source is discarded.
ff276b08 5735Note that this is a rather specialist SV copying operation; most of the
645c22ef 5736time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5737
5738=cut
5739*/
79072805
LW
5740
5741void
864dbfa3 5742Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805 5743{
a3b680e6 5744 const U32 refcnt = SvREFCNT(sv);
765f542d 5745 SV_CHECK_THINKFIRST_COW_DROP(sv);
0453d815 5746 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
9014280d 5747 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
93a17b20 5748 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5749 if (SvMAGICAL(nsv))
5750 mg_free(nsv);
5751 else
5752 sv_upgrade(nsv, SVt_PVMG);
b162af07 5753 SvMAGIC_set(nsv, SvMAGIC(sv));
a0d0e21e 5754 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20 5755 SvMAGICAL_off(sv);
b162af07 5756 SvMAGIC_set(sv, NULL);
93a17b20 5757 }
79072805
LW
5758 SvREFCNT(sv) = 0;
5759 sv_clear(sv);
477f5d66 5760 assert(!SvREFCNT(sv));
fd0854ff
DM
5761#ifdef DEBUG_LEAKING_SCALARS
5762 sv->sv_flags = nsv->sv_flags;
5763 sv->sv_any = nsv->sv_any;
5764 sv->sv_refcnt = nsv->sv_refcnt;
5765#else
79072805 5766 StructCopy(nsv,sv,SV);
fd0854ff 5767#endif
7b2c381c
NC
5768 /* Currently could join these into one piece of pointer arithmetic, but
5769 it would be unclear. */
5770 if(SvTYPE(sv) == SVt_IV)
5771 SvANY(sv)
339049b0 5772 = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
7b2c381c 5773 else if (SvTYPE(sv) == SVt_RV) {
339049b0 5774 SvANY(sv) = &sv->sv_u.svu_rv;
7b2c381c
NC
5775 }
5776
fd0854ff 5777
d3d0e6f1
NC
5778#ifdef PERL_COPY_ON_WRITE
5779 if (SvIsCOW_normal(nsv)) {
5780 /* We need to follow the pointers around the loop to make the
5781 previous SV point to sv, rather than nsv. */
5782 SV *next;
5783 SV *current = nsv;
5784 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5785 assert(next);
5786 current = next;
5787 assert(SvPVX(current) == SvPVX(nsv));
5788 }
5789 /* Make the SV before us point to the SV after us. */
5790 if (DEBUG_C_TEST) {
5791 PerlIO_printf(Perl_debug_log, "previous is\n");
5792 sv_dump(current);
a29f6d03
NC
5793 PerlIO_printf(Perl_debug_log,
5794 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5795 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5796 }
a29f6d03 5797 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5798 }
5799#endif
79072805 5800 SvREFCNT(sv) = refcnt;
1edc1566 5801 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 5802 SvREFCNT(nsv) = 0;
463ee0b2 5803 del_SV(nsv);
79072805
LW
5804}
5805
c461cf8f
JH
5806/*
5807=for apidoc sv_clear
5808
645c22ef
DM
5809Clear an SV: call any destructors, free up any memory used by the body,
5810and free the body itself. The SV's head is I<not> freed, although
5811its type is set to all 1's so that it won't inadvertently be assumed
5812to be live during global destruction etc.
5813This function should only be called when REFCNT is zero. Most of the time
5814you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5815instead.
c461cf8f
JH
5816
5817=cut
5818*/
5819
79072805 5820void
864dbfa3 5821Perl_sv_clear(pTHX_ register SV *sv)
79072805 5822{
27da23d5 5823 dVAR;
ec12f114 5824 HV* stash;
79072805
LW
5825 assert(sv);
5826 assert(SvREFCNT(sv) == 0);
5827
ed6116ce 5828 if (SvOBJECT(sv)) {
3280af22 5829 if (PL_defstash) { /* Still have a symbol table? */
39644a26 5830 dSP;
32251b26 5831 CV* destructor;
a0d0e21e 5832
5cc433a6 5833
8ebc5c01 5834
d460ef45 5835 do {
4e8e7886 5836 stash = SvSTASH(sv);
32251b26 5837 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 5838 if (destructor) {
5cc433a6
AB
5839 SV* tmpref = newRV(sv);
5840 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 5841 ENTER;
e788e7d3 5842 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
5843 EXTEND(SP, 2);
5844 PUSHMARK(SP);
5cc433a6 5845 PUSHs(tmpref);
4e8e7886 5846 PUTBACK;
44389ee9 5847 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
7a5fa8a2
NIS
5848
5849
d3acc0f7 5850 POPSTACK;
3095d977 5851 SPAGAIN;
4e8e7886 5852 LEAVE;
5cc433a6
AB
5853 if(SvREFCNT(tmpref) < 2) {
5854 /* tmpref is not kept alive! */
5855 SvREFCNT(sv)--;
b162af07 5856 SvRV_set(tmpref, NULL);
5cc433a6
AB
5857 SvROK_off(tmpref);
5858 }
5859 SvREFCNT_dec(tmpref);
4e8e7886
GS
5860 }
5861 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5862
6f44e0a4
JP
5863
5864 if (SvREFCNT(sv)) {
5865 if (PL_in_clean_objs)
cea2e8a9 5866 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
bfcb3514 5867 HvNAME_get(stash));
6f44e0a4
JP
5868 /* DESTROY gave object new lease on life */
5869 return;
5870 }
a0d0e21e 5871 }
4e8e7886 5872
a0d0e21e 5873 if (SvOBJECT(sv)) {
4e8e7886 5874 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
5875 SvOBJECT_off(sv); /* Curse the object. */
5876 if (SvTYPE(sv) != SVt_PVIO)
3280af22 5877 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5878 }
463ee0b2 5879 }
524189f1
JH
5880 if (SvTYPE(sv) >= SVt_PVMG) {
5881 if (SvMAGIC(sv))
5882 mg_free(sv);
bce8f412 5883 if (SvTYPE(sv) == SVt_PVMG && SvFLAGS(sv) & SVpad_TYPED)
524189f1
JH
5884 SvREFCNT_dec(SvSTASH(sv));
5885 }
ec12f114 5886 stash = NULL;
79072805 5887 switch (SvTYPE(sv)) {
8990e307 5888 case SVt_PVIO:
df0bd2f4
GS
5889 if (IoIFP(sv) &&
5890 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5891 IoIFP(sv) != PerlIO_stdout() &&
5892 IoIFP(sv) != PerlIO_stderr())
93578b34 5893 {
f2b5be74 5894 io_close((IO*)sv, FALSE);
93578b34 5895 }
1d7c1841 5896 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5897 PerlDir_close(IoDIRP(sv));
1d7c1841 5898 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5899 Safefree(IoTOP_NAME(sv));
5900 Safefree(IoFMT_NAME(sv));
5901 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 5902 /* FALL THROUGH */
79072805 5903 case SVt_PVBM:
a0d0e21e 5904 goto freescalar;
79072805 5905 case SVt_PVCV:
748a9306 5906 case SVt_PVFM:
85e6fe83 5907 cv_undef((CV*)sv);
a0d0e21e 5908 goto freescalar;
79072805 5909 case SVt_PVHV:
85e6fe83 5910 hv_undef((HV*)sv);
a0d0e21e 5911 break;
79072805 5912 case SVt_PVAV:
85e6fe83 5913 av_undef((AV*)sv);
a0d0e21e 5914 break;
02270b4e 5915 case SVt_PVLV:
dd28f7bb
DM
5916 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5917 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5918 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5919 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5920 }
5921 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
5922 SvREFCNT_dec(LvTARG(sv));
02270b4e 5923 goto freescalar;
a0d0e21e 5924 case SVt_PVGV:
1edc1566 5925 gp_free((GV*)sv);
a0d0e21e 5926 Safefree(GvNAME(sv));
ec12f114
JPC
5927 /* cannot decrease stash refcount yet, as we might recursively delete
5928 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
5929 of stash until current sv is completely gone.
5930 -- JohnPC, 27 Mar 1998 */
5931 stash = GvSTASH(sv);
a0d0e21e 5932 /* FALL THROUGH */
79072805 5933 case SVt_PVMG:
79072805
LW
5934 case SVt_PVNV:
5935 case SVt_PVIV:
a0d0e21e 5936 freescalar:
5228ca4e
NC
5937 /* Don't bother with SvOOK_off(sv); as we're only going to free it. */
5938 if (SvOOK(sv)) {
5939 SvPV_set(sv, SvPVX(sv) - SvIVX(sv));
5940 /* Don't even bother with turning off the OOK flag. */
5941 }
79072805
LW
5942 /* FALL THROUGH */
5943 case SVt_PV:
a0d0e21e 5944 case SVt_RV:
810b8aa5
GS
5945 if (SvROK(sv)) {
5946 if (SvWEAKREF(sv))
5947 sv_del_backref(sv);
5948 else
5949 SvREFCNT_dec(SvRV(sv));
5950 }
765f542d
NC
5951#ifdef PERL_COPY_ON_WRITE
5952 else if (SvPVX(sv)) {
5953 if (SvIsCOW(sv)) {
5954 /* I believe I need to grab the global SV mutex here and
5955 then recheck the COW status. */
46187eeb
NC
5956 if (DEBUG_C_TEST) {
5957 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5958 sv_dump(sv);
46187eeb 5959 }
e419cbc5 5960 sv_release_COW(sv, SvPVX(sv), SvCUR(sv), SvLEN(sv),
765f542d
NC
5961 SvUVX(sv), SV_COW_NEXT_SV(sv));
5962 /* And drop it here. */
5963 SvFAKE_off(sv);
5964 } else if (SvLEN(sv)) {
5965 Safefree(SvPVX(sv));
5966 }
5967 }
5968#else
1edc1566 5969 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 5970 Safefree(SvPVX(sv));
1c846c1f 5971 else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
25716404
GS
5972 unsharepvn(SvPVX(sv),
5973 SvUTF8(sv) ? -(I32)SvCUR(sv) : SvCUR(sv),
5974 SvUVX(sv));
1c846c1f
NIS
5975 SvFAKE_off(sv);
5976 }
765f542d 5977#endif
79072805 5978 break;
a0d0e21e 5979/*
79072805 5980 case SVt_NV:
79072805 5981 case SVt_IV:
79072805
LW
5982 case SVt_NULL:
5983 break;
a0d0e21e 5984*/
79072805
LW
5985 }
5986
5987 switch (SvTYPE(sv)) {
5988 case SVt_NULL:
5989 break;
79072805 5990 case SVt_IV:
79072805
LW
5991 break;
5992 case SVt_NV:
5993 del_XNV(SvANY(sv));
5994 break;
ed6116ce 5995 case SVt_RV:
ed6116ce 5996 break;
79072805
LW
5997 case SVt_PV:
5998 del_XPV(SvANY(sv));
5999 break;
6000 case SVt_PVIV:
6001 del_XPVIV(SvANY(sv));
6002 break;
6003 case SVt_PVNV:
6004 del_XPVNV(SvANY(sv));
6005 break;
6006 case SVt_PVMG:
6007 del_XPVMG(SvANY(sv));
6008 break;
6009 case SVt_PVLV:
6010 del_XPVLV(SvANY(sv));
6011 break;
6012 case SVt_PVAV:
6013 del_XPVAV(SvANY(sv));
6014 break;
6015 case SVt_PVHV:
6016 del_XPVHV(SvANY(sv));
6017 break;
6018 case SVt_PVCV:
6019 del_XPVCV(SvANY(sv));
6020 break;
6021 case SVt_PVGV:
6022 del_XPVGV(SvANY(sv));
ec12f114
JPC
6023 /* code duplication for increased performance. */
6024 SvFLAGS(sv) &= SVf_BREAK;
6025 SvFLAGS(sv) |= SVTYPEMASK;
6026 /* decrease refcount of the stash that owns this GV, if any */
6027 if (stash)
6028 SvREFCNT_dec(stash);
6029 return; /* not break, SvFLAGS reset already happened */
79072805
LW
6030 case SVt_PVBM:
6031 del_XPVBM(SvANY(sv));
6032 break;
6033 case SVt_PVFM:
6034 del_XPVFM(SvANY(sv));
6035 break;
8990e307
LW
6036 case SVt_PVIO:
6037 del_XPVIO(SvANY(sv));
6038 break;
79072805 6039 }
a0d0e21e 6040 SvFLAGS(sv) &= SVf_BREAK;
8990e307 6041 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
6042}
6043
645c22ef
DM
6044/*
6045=for apidoc sv_newref
6046
6047Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
6048instead.
6049
6050=cut
6051*/
6052
79072805 6053SV *
864dbfa3 6054Perl_sv_newref(pTHX_ SV *sv)
79072805 6055{
463ee0b2 6056 if (sv)
4db098f4 6057 (SvREFCNT(sv))++;
79072805
LW
6058 return sv;
6059}
6060
c461cf8f
JH
6061/*
6062=for apidoc sv_free
6063
645c22ef
DM
6064Decrement an SV's reference count, and if it drops to zero, call
6065C<sv_clear> to invoke destructors and free up any memory used by
6066the body; finally, deallocate the SV's head itself.
6067Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
6068
6069=cut
6070*/
6071
79072805 6072void
864dbfa3 6073Perl_sv_free(pTHX_ SV *sv)
79072805 6074{
27da23d5 6075 dVAR;
79072805
LW
6076 if (!sv)
6077 return;
a0d0e21e
LW
6078 if (SvREFCNT(sv) == 0) {
6079 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
6080 /* this SV's refcnt has been artificially decremented to
6081 * trigger cleanup */
a0d0e21e 6082 return;
3280af22 6083 if (PL_in_clean_all) /* All is fair */
1edc1566 6084 return;
d689ffdd
JP
6085 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6086 /* make sure SvREFCNT(sv)==0 happens very seldom */
6087 SvREFCNT(sv) = (~(U32)0)/2;
6088 return;
6089 }
0453d815 6090 if (ckWARN_d(WARN_INTERNAL))
d5dede04 6091 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
6092 "Attempt to free unreferenced scalar: SV 0x%"UVxf
6093 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805
LW
6094 return;
6095 }
4db098f4 6096 if (--(SvREFCNT(sv)) > 0)
8990e307 6097 return;
8c4d3c90
NC
6098 Perl_sv_free2(aTHX_ sv);
6099}
6100
6101void
6102Perl_sv_free2(pTHX_ SV *sv)
6103{
27da23d5 6104 dVAR;
463ee0b2
LW
6105#ifdef DEBUGGING
6106 if (SvTEMP(sv)) {
0453d815 6107 if (ckWARN_d(WARN_DEBUGGING))
9014280d 6108 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
472d47bc
SB
6109 "Attempt to free temp prematurely: SV 0x%"UVxf
6110 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 6111 return;
79072805 6112 }
463ee0b2 6113#endif
d689ffdd
JP
6114 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6115 /* make sure SvREFCNT(sv)==0 happens very seldom */
6116 SvREFCNT(sv) = (~(U32)0)/2;
6117 return;
6118 }
79072805 6119 sv_clear(sv);
477f5d66
CS
6120 if (! SvREFCNT(sv))
6121 del_SV(sv);
79072805
LW
6122}
6123
954c1994
GS
6124/*
6125=for apidoc sv_len
6126
645c22ef
DM
6127Returns the length of the string in the SV. Handles magic and type
6128coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
6129
6130=cut
6131*/
6132
79072805 6133STRLEN
864dbfa3 6134Perl_sv_len(pTHX_ register SV *sv)
79072805 6135{
463ee0b2 6136 STRLEN len;
79072805
LW
6137
6138 if (!sv)
6139 return 0;
6140
8990e307 6141 if (SvGMAGICAL(sv))
565764a8 6142 len = mg_length(sv);
8990e307 6143 else
497b47a8 6144 (void)SvPV(sv, len);
463ee0b2 6145 return len;
79072805
LW
6146}
6147
c461cf8f
JH
6148/*
6149=for apidoc sv_len_utf8
6150
6151Returns the number of characters in the string in an SV, counting wide
1e54db1a 6152UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
6153
6154=cut
6155*/
6156
7e8c5dac
HS
6157/*
6158 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
6159 * mg_ptr is used, by sv_pos_u2b(), see the comments of S_utf8_mg_pos_init().
6160 * (Note that the mg_len is not the length of the mg_ptr field.)
7a5fa8a2 6161 *
7e8c5dac
HS
6162 */
6163
a0ed51b3 6164STRLEN
864dbfa3 6165Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 6166{
a0ed51b3
LW
6167 if (!sv)
6168 return 0;
6169
a0ed51b3 6170 if (SvGMAGICAL(sv))
b76347f2 6171 return mg_length(sv);
a0ed51b3 6172 else
b76347f2 6173 {
7e8c5dac 6174 STRLEN len, ulen;
a3b680e6 6175 const U8 *s = (U8*)SvPV(sv, len);
7e8c5dac
HS
6176 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
6177
e23c8137 6178 if (mg && mg->mg_len != -1 && (mg->mg_len > 0 || len == 0)) {
7e8c5dac 6179 ulen = mg->mg_len;
e23c8137
JH
6180#ifdef PERL_UTF8_CACHE_ASSERT
6181 assert(ulen == Perl_utf8_length(aTHX_ s, s + len));
6182#endif
6183 }
7e8c5dac
HS
6184 else {
6185 ulen = Perl_utf8_length(aTHX_ s, s + len);
6186 if (!mg && !SvREADONLY(sv)) {
6187 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
6188 mg = mg_find(sv, PERL_MAGIC_utf8);
6189 assert(mg);
6190 }
6191 if (mg)
6192 mg->mg_len = ulen;
6193 }
6194 return ulen;
6195 }
6196}
6197
6198/* S_utf8_mg_pos_init() is used to initialize the mg_ptr field of
6199 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
6200 * between UTF-8 and byte offsets. There are two (substr offset and substr
6201 * length, the i offset, PERL_MAGIC_UTF8_CACHESIZE) times two (UTF-8 offset
6202 * and byte offset) cache positions.
6203 *
6204 * The mg_len field is used by sv_len_utf8(), see its comments.
6205 * Note that the mg_len is not the length of the mg_ptr field.
6206 *
6207 */
6208STATIC bool
a3b680e6 6209S_utf8_mg_pos_init(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 offsetp, U8 *s, U8 *start)
7e8c5dac 6210{
7a5fa8a2 6211 bool found = FALSE;
7e8c5dac
HS
6212
6213 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
8f78557a 6214 if (!*mgp)
27da23d5 6215 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0, 0);
7e8c5dac 6216 assert(*mgp);
b76347f2 6217
7e8c5dac
HS
6218 if ((*mgp)->mg_ptr)
6219 *cachep = (STRLEN *) (*mgp)->mg_ptr;
6220 else {
6221 Newz(0, *cachep, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
6222 (*mgp)->mg_ptr = (char *) *cachep;
6223 }
6224 assert(*cachep);
6225
a3b680e6 6226 (*cachep)[i] = offsetp;
7e8c5dac
HS
6227 (*cachep)[i+1] = s - start;
6228 found = TRUE;
a0ed51b3 6229 }
7e8c5dac
HS
6230
6231 return found;
a0ed51b3
LW
6232}
6233
645c22ef 6234/*
7e8c5dac
HS
6235 * S_utf8_mg_pos() is used to query and update mg_ptr field of
6236 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
6237 * between UTF-8 and byte offsets. See also the comments of
6238 * S_utf8_mg_pos_init().
6239 *
6240 */
6241STATIC bool
6e551876 6242S_utf8_mg_pos(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, I32 uoff, U8 **sp, U8 *start, U8 *send)
7e8c5dac
HS
6243{
6244 bool found = FALSE;
6245
6246 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
6247 if (!*mgp)
6248 *mgp = mg_find(sv, PERL_MAGIC_utf8);
6249 if (*mgp && (*mgp)->mg_ptr) {
6250 *cachep = (STRLEN *) (*mgp)->mg_ptr;
e23c8137 6251 ASSERT_UTF8_CACHE(*cachep);
667208dd 6252 if ((*cachep)[i] == (STRLEN)uoff) /* An exact match. */
7a5fa8a2 6253 found = TRUE;
7e8c5dac
HS
6254 else { /* We will skip to the right spot. */
6255 STRLEN forw = 0;
6256 STRLEN backw = 0;
a3b680e6 6257 const U8* p = NULL;
7e8c5dac
HS
6258
6259 /* The assumption is that going backward is half
6260 * the speed of going forward (that's where the
6261 * 2 * backw in the below comes from). (The real
6262 * figure of course depends on the UTF-8 data.) */
6263
667208dd 6264 if ((*cachep)[i] > (STRLEN)uoff) {
7e8c5dac 6265 forw = uoff;
667208dd 6266 backw = (*cachep)[i] - (STRLEN)uoff;
7e8c5dac
HS
6267
6268 if (forw < 2 * backw)
6269 p = start;
6270 else
6271 p = start + (*cachep)[i+1];
6272 }
6273 /* Try this only for the substr offset (i == 0),
6274 * not for the substr length (i == 2). */
6275 else if (i == 0) { /* (*cachep)[i] < uoff */
a3b680e6 6276 const STRLEN ulen = sv_len_utf8(sv);
7e8c5dac 6277
667208dd
JH
6278 if ((STRLEN)uoff < ulen) {
6279 forw = (STRLEN)uoff - (*cachep)[i];
6280 backw = ulen - (STRLEN)uoff;
7e8c5dac
HS
6281
6282 if (forw < 2 * backw)
6283 p = start + (*cachep)[i+1];
6284 else
6285 p = send;
6286 }
6287
6288 /* If the string is not long enough for uoff,
6289 * we could extend it, but not at this low a level. */
6290 }
6291
6292 if (p) {
6293 if (forw < 2 * backw) {
6294 while (forw--)
6295 p += UTF8SKIP(p);
6296 }
6297 else {
6298 while (backw--) {
6299 p--;
6300 while (UTF8_IS_CONTINUATION(*p))
6301 p--;
6302 }
6303 }
6304
6305 /* Update the cache. */
667208dd 6306 (*cachep)[i] = (STRLEN)uoff;
7e8c5dac 6307 (*cachep)[i+1] = p - start;
8f78557a
AE
6308
6309 /* Drop the stale "length" cache */
6310 if (i == 0) {
6311 (*cachep)[2] = 0;
6312 (*cachep)[3] = 0;
6313 }
7a5fa8a2 6314
7e8c5dac
HS
6315 found = TRUE;
6316 }
6317 }
6318 if (found) { /* Setup the return values. */
6319 *offsetp = (*cachep)[i+1];
6320 *sp = start + *offsetp;
6321 if (*sp >= send) {
6322 *sp = send;
6323 *offsetp = send - start;
6324 }
6325 else if (*sp < start) {
6326 *sp = start;
6327 *offsetp = 0;
6328 }
6329 }
6330 }
e23c8137
JH
6331#ifdef PERL_UTF8_CACHE_ASSERT
6332 if (found) {
6333 U8 *s = start;
6334 I32 n = uoff;
6335
6336 while (n-- && s < send)
6337 s += UTF8SKIP(s);
6338
6339 if (i == 0) {
6340 assert(*offsetp == s - start);
6341 assert((*cachep)[0] == (STRLEN)uoff);
6342 assert((*cachep)[1] == *offsetp);
6343 }
6344 ASSERT_UTF8_CACHE(*cachep);
6345 }
6346#endif
7e8c5dac 6347 }
e23c8137 6348
7e8c5dac
HS
6349 return found;
6350}
7a5fa8a2 6351
7e8c5dac 6352/*
645c22ef
DM
6353=for apidoc sv_pos_u2b
6354
1e54db1a 6355Converts the value pointed to by offsetp from a count of UTF-8 chars from
645c22ef
DM
6356the start of the string, to a count of the equivalent number of bytes; if
6357lenp is non-zero, it does the same to lenp, but this time starting from
6358the offset, rather than from the start of the string. Handles magic and
6359type coercion.
6360
6361=cut
6362*/
6363
7e8c5dac
HS
6364/*
6365 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
6366 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
6367 * byte offsets. See also the comments of S_utf8_mg_pos().
6368 *
6369 */
6370
a0ed51b3 6371void
864dbfa3 6372Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 6373{
dfe13c55
GS
6374 U8 *start;
6375 U8 *s;
a0ed51b3 6376 STRLEN len;
7e8c5dac
HS
6377 STRLEN *cache = 0;
6378 STRLEN boffset = 0;
a0ed51b3
LW
6379
6380 if (!sv)
6381 return;
6382
dfe13c55 6383 start = s = (U8*)SvPV(sv, len);
7e8c5dac
HS
6384 if (len) {
6385 I32 uoffset = *offsetp;
6386 U8 *send = s + len;
6387 MAGIC *mg = 0;
6388 bool found = FALSE;
6389
bdf77a2a 6390 if (utf8_mg_pos(sv, &mg, &cache, 0, offsetp, *offsetp, &s, start, send))
7e8c5dac
HS
6391 found = TRUE;
6392 if (!found && uoffset > 0) {
6393 while (s < send && uoffset--)
6394 s += UTF8SKIP(s);
6395 if (s >= send)
6396 s = send;
a3b680e6 6397 if (utf8_mg_pos_init(sv, &mg, &cache, 0, *offsetp, s, start))
7e8c5dac
HS
6398 boffset = cache[1];
6399 *offsetp = s - start;
6400 }
6401 if (lenp) {
6402 found = FALSE;
6403 start = s;
ec062429 6404 if (utf8_mg_pos(sv, &mg, &cache, 2, lenp, *lenp, &s, start, send)) {
7e8c5dac
HS
6405 *lenp -= boffset;
6406 found = TRUE;
6407 }
6408 if (!found && *lenp > 0) {
6409 I32 ulen = *lenp;
6410 if (ulen > 0)
6411 while (s < send && ulen--)
6412 s += UTF8SKIP(s);
6413 if (s >= send)
6414 s = send;
a3b680e6 6415 utf8_mg_pos_init(sv, &mg, &cache, 2, *lenp, s, start);
7e8c5dac
HS
6416 }
6417 *lenp = s - start;
6418 }
e23c8137 6419 ASSERT_UTF8_CACHE(cache);
7e8c5dac
HS
6420 }
6421 else {
6422 *offsetp = 0;
6423 if (lenp)
6424 *lenp = 0;
a0ed51b3 6425 }
e23c8137 6426
a0ed51b3
LW
6427 return;
6428}
6429
645c22ef
DM
6430/*
6431=for apidoc sv_pos_b2u
6432
6433Converts the value pointed to by offsetp from a count of bytes from the
1e54db1a 6434start of the string, to a count of the equivalent number of UTF-8 chars.
645c22ef
DM
6435Handles magic and type coercion.
6436
6437=cut
6438*/
6439
7e8c5dac
HS
6440/*
6441 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
6442 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
6443 * byte offsets. See also the comments of S_utf8_mg_pos().
6444 *
6445 */
6446
a0ed51b3 6447void
7e8c5dac 6448Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 6449{
7e8c5dac 6450 U8* s;
a0ed51b3
LW
6451 STRLEN len;
6452
6453 if (!sv)
6454 return;
6455
dfe13c55 6456 s = (U8*)SvPV(sv, len);
eb160463 6457 if ((I32)len < *offsetp)
a0dbb045 6458 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac
HS
6459 else {
6460 U8* send = s + *offsetp;
6461 MAGIC* mg = NULL;
6462 STRLEN *cache = NULL;
6463
6464 len = 0;
6465
6466 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
6467 mg = mg_find(sv, PERL_MAGIC_utf8);
6468 if (mg && mg->mg_ptr) {
6469 cache = (STRLEN *) mg->mg_ptr;
c5661c80 6470 if (cache[1] == (STRLEN)*offsetp) {
7e8c5dac
HS
6471 /* An exact match. */
6472 *offsetp = cache[0];
6473
6474 return;
6475 }
c5661c80 6476 else if (cache[1] < (STRLEN)*offsetp) {
7e8c5dac
HS
6477 /* We already know part of the way. */
6478 len = cache[0];
6479 s += cache[1];
7a5fa8a2 6480 /* Let the below loop do the rest. */
7e8c5dac
HS
6481 }
6482 else { /* cache[1] > *offsetp */
6483 /* We already know all of the way, now we may
6484 * be able to walk back. The same assumption
6485 * is made as in S_utf8_mg_pos(), namely that
6486 * walking backward is twice slower than
6487 * walking forward. */
6488 STRLEN forw = *offsetp;
6489 STRLEN backw = cache[1] - *offsetp;
6490
6491 if (!(forw < 2 * backw)) {
6492 U8 *p = s + cache[1];
6493 STRLEN ubackw = 0;
7a5fa8a2 6494
a5b510f2
AE
6495 cache[1] -= backw;
6496
7e8c5dac
HS
6497 while (backw--) {
6498 p--;
0aeb64d0 6499 while (UTF8_IS_CONTINUATION(*p)) {
7e8c5dac 6500 p--;
0aeb64d0
JH
6501 backw--;
6502 }
7e8c5dac
HS
6503 ubackw++;
6504 }
6505
6506 cache[0] -= ubackw;
0aeb64d0 6507 *offsetp = cache[0];
a67d7df9
TS
6508
6509 /* Drop the stale "length" cache */
6510 cache[2] = 0;
6511 cache[3] = 0;
6512
0aeb64d0 6513 return;
7e8c5dac
HS
6514 }
6515 }
6516 }
e23c8137 6517 ASSERT_UTF8_CACHE(cache);
a0dbb045 6518 }
7e8c5dac
HS
6519
6520 while (s < send) {
6521 STRLEN n = 1;
6522
6523 /* Call utf8n_to_uvchr() to validate the sequence
6524 * (unless a simple non-UTF character) */
6525 if (!UTF8_IS_INVARIANT(*s))
6526 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
6527 if (n > 0) {
6528 s += n;
6529 len++;
6530 }
6531 else
6532 break;
6533 }
6534
6535 if (!SvREADONLY(sv)) {
6536 if (!mg) {
6537 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
6538 mg = mg_find(sv, PERL_MAGIC_utf8);
6539 }
6540 assert(mg);
6541
6542 if (!mg->mg_ptr) {
979acdb5 6543 Newz(0, cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7e8c5dac
HS
6544 mg->mg_ptr = (char *) cache;
6545 }
6546 assert(cache);
6547
6548 cache[0] = len;
6549 cache[1] = *offsetp;
a67d7df9
TS
6550 /* Drop the stale "length" cache */
6551 cache[2] = 0;
6552 cache[3] = 0;
7e8c5dac
HS
6553 }
6554
6555 *offsetp = len;
a0ed51b3 6556 }
a0ed51b3
LW
6557 return;
6558}
6559
954c1994
GS
6560/*
6561=for apidoc sv_eq
6562
6563Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
6564identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6565coerce its args to strings if necessary.
954c1994
GS
6566
6567=cut
6568*/
6569
79072805 6570I32
e01b9e88 6571Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805 6572{
e1ec3a88 6573 const char *pv1;
463ee0b2 6574 STRLEN cur1;
e1ec3a88 6575 const char *pv2;
463ee0b2 6576 STRLEN cur2;
e01b9e88 6577 I32 eq = 0;
553e1bcc
AT
6578 char *tpv = Nullch;
6579 SV* svrecode = Nullsv;
79072805 6580
e01b9e88 6581 if (!sv1) {
79072805
LW
6582 pv1 = "";
6583 cur1 = 0;
6584 }
463ee0b2 6585 else
e01b9e88 6586 pv1 = SvPV(sv1, cur1);
79072805 6587
e01b9e88
SC
6588 if (!sv2){
6589 pv2 = "";
6590 cur2 = 0;
92d29cee 6591 }
e01b9e88
SC
6592 else
6593 pv2 = SvPV(sv2, cur2);
79072805 6594
cf48d248 6595 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6596 /* Differing utf8ness.
6597 * Do not UTF8size the comparands as a side-effect. */
6598 if (PL_encoding) {
6599 if (SvUTF8(sv1)) {
553e1bcc
AT
6600 svrecode = newSVpvn(pv2, cur2);
6601 sv_recode_to_utf8(svrecode, PL_encoding);
6602 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6603 }
6604 else {
553e1bcc
AT
6605 svrecode = newSVpvn(pv1, cur1);
6606 sv_recode_to_utf8(svrecode, PL_encoding);
6607 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6608 }
6609 /* Now both are in UTF-8. */
0a1bd7ac
DM
6610 if (cur1 != cur2) {
6611 SvREFCNT_dec(svrecode);
799ef3cb 6612 return FALSE;
0a1bd7ac 6613 }
799ef3cb
JH
6614 }
6615 else {
6616 bool is_utf8 = TRUE;
6617
6618 if (SvUTF8(sv1)) {
6619 /* sv1 is the UTF-8 one,
6620 * if is equal it must be downgrade-able */
e1ec3a88 6621 char *pv = (char*)bytes_from_utf8((const U8*)pv1,
799ef3cb
JH
6622 &cur1, &is_utf8);
6623 if (pv != pv1)
553e1bcc 6624 pv1 = tpv = pv;
799ef3cb
JH
6625 }
6626 else {
6627 /* sv2 is the UTF-8 one,
6628 * if is equal it must be downgrade-able */
e1ec3a88 6629 char *pv = (char *)bytes_from_utf8((const U8*)pv2,
799ef3cb
JH
6630 &cur2, &is_utf8);
6631 if (pv != pv2)
553e1bcc 6632 pv2 = tpv = pv;
799ef3cb
JH
6633 }
6634 if (is_utf8) {
6635 /* Downgrade not possible - cannot be eq */
bf694877 6636 assert (tpv == 0);
799ef3cb
JH
6637 return FALSE;
6638 }
6639 }
cf48d248
JH
6640 }
6641
6642 if (cur1 == cur2)
765f542d 6643 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 6644
553e1bcc
AT
6645 if (svrecode)
6646 SvREFCNT_dec(svrecode);
799ef3cb 6647
553e1bcc
AT
6648 if (tpv)
6649 Safefree(tpv);
cf48d248 6650
e01b9e88 6651 return eq;
79072805
LW
6652}
6653
954c1994
GS
6654/*
6655=for apidoc sv_cmp
6656
6657Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
6658string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
6659C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6660coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
6661
6662=cut
6663*/
6664
79072805 6665I32
e01b9e88 6666Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 6667{
560a288e 6668 STRLEN cur1, cur2;
e1ec3a88
AL
6669 const char *pv1, *pv2;
6670 char *tpv = Nullch;
cf48d248 6671 I32 cmp;
553e1bcc 6672 SV *svrecode = Nullsv;
560a288e 6673
e01b9e88
SC
6674 if (!sv1) {
6675 pv1 = "";
560a288e
GS
6676 cur1 = 0;
6677 }
e01b9e88
SC
6678 else
6679 pv1 = SvPV(sv1, cur1);
560a288e 6680
553e1bcc 6681 if (!sv2) {
e01b9e88 6682 pv2 = "";
560a288e
GS
6683 cur2 = 0;
6684 }
e01b9e88
SC
6685 else
6686 pv2 = SvPV(sv2, cur2);
79072805 6687
cf48d248 6688 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6689 /* Differing utf8ness.
6690 * Do not UTF8size the comparands as a side-effect. */
cf48d248 6691 if (SvUTF8(sv1)) {
799ef3cb 6692 if (PL_encoding) {
553e1bcc
AT
6693 svrecode = newSVpvn(pv2, cur2);
6694 sv_recode_to_utf8(svrecode, PL_encoding);
6695 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6696 }
6697 else {
e1ec3a88 6698 pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
799ef3cb 6699 }
cf48d248
JH
6700 }
6701 else {
799ef3cb 6702 if (PL_encoding) {
553e1bcc
AT
6703 svrecode = newSVpvn(pv1, cur1);
6704 sv_recode_to_utf8(svrecode, PL_encoding);
6705 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6706 }
6707 else {
e1ec3a88 6708 pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
799ef3cb 6709 }
cf48d248
JH
6710 }
6711 }
6712
e01b9e88 6713 if (!cur1) {
cf48d248 6714 cmp = cur2 ? -1 : 0;
e01b9e88 6715 } else if (!cur2) {
cf48d248
JH
6716 cmp = 1;
6717 } else {
e1ec3a88 6718 const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
6719
6720 if (retval) {
cf48d248 6721 cmp = retval < 0 ? -1 : 1;
e01b9e88 6722 } else if (cur1 == cur2) {
cf48d248
JH
6723 cmp = 0;
6724 } else {
6725 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 6726 }
cf48d248 6727 }
16660edb 6728
553e1bcc
AT
6729 if (svrecode)
6730 SvREFCNT_dec(svrecode);
799ef3cb 6731
553e1bcc
AT
6732 if (tpv)
6733 Safefree(tpv);
cf48d248
JH
6734
6735 return cmp;
bbce6d69 6736}
16660edb 6737
c461cf8f
JH
6738/*
6739=for apidoc sv_cmp_locale
6740
645c22ef
DM
6741Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6742'use bytes' aware, handles get magic, and will coerce its args to strings
6743if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
6744
6745=cut
6746*/
6747
bbce6d69 6748I32
864dbfa3 6749Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 6750{
36477c24 6751#ifdef USE_LOCALE_COLLATE
16660edb 6752
bbce6d69 6753 char *pv1, *pv2;
6754 STRLEN len1, len2;
6755 I32 retval;
16660edb 6756
3280af22 6757 if (PL_collation_standard)
bbce6d69 6758 goto raw_compare;
16660edb 6759
bbce6d69 6760 len1 = 0;
8ac85365 6761 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 6762 len2 = 0;
8ac85365 6763 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 6764
bbce6d69 6765 if (!pv1 || !len1) {
6766 if (pv2 && len2)
6767 return -1;
6768 else
6769 goto raw_compare;
6770 }
6771 else {
6772 if (!pv2 || !len2)
6773 return 1;
6774 }
16660edb 6775
bbce6d69 6776 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 6777
bbce6d69 6778 if (retval)
16660edb 6779 return retval < 0 ? -1 : 1;
6780
bbce6d69 6781 /*
6782 * When the result of collation is equality, that doesn't mean
6783 * that there are no differences -- some locales exclude some
6784 * characters from consideration. So to avoid false equalities,
6785 * we use the raw string as a tiebreaker.
6786 */
16660edb 6787
bbce6d69 6788 raw_compare:
6789 /* FALL THROUGH */
16660edb 6790
36477c24 6791#endif /* USE_LOCALE_COLLATE */
16660edb 6792
bbce6d69 6793 return sv_cmp(sv1, sv2);
6794}
79072805 6795
645c22ef 6796
36477c24 6797#ifdef USE_LOCALE_COLLATE
645c22ef 6798
7a4c00b4 6799/*
645c22ef
DM
6800=for apidoc sv_collxfrm
6801
6802Add Collate Transform magic to an SV if it doesn't already have it.
6803
6804Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6805scalar data of the variable, but transformed to such a format that a normal
6806memory comparison can be used to compare the data according to the locale
6807settings.
6808
6809=cut
6810*/
6811
bbce6d69 6812char *
864dbfa3 6813Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 6814{
7a4c00b4 6815 MAGIC *mg;
16660edb 6816
14befaf4 6817 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 6818 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 6819 char *s, *xf;
6820 STRLEN len, xlen;
6821
7a4c00b4 6822 if (mg)
6823 Safefree(mg->mg_ptr);
bbce6d69 6824 s = SvPV(sv, len);
6825 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 6826 if (SvREADONLY(sv)) {
6827 SAVEFREEPV(xf);
6828 *nxp = xlen;
3280af22 6829 return xf + sizeof(PL_collation_ix);
ff0cee69 6830 }
7a4c00b4 6831 if (! mg) {
14befaf4
DM
6832 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
6833 mg = mg_find(sv, PERL_MAGIC_collxfrm);
7a4c00b4 6834 assert(mg);
bbce6d69 6835 }
7a4c00b4 6836 mg->mg_ptr = xf;
565764a8 6837 mg->mg_len = xlen;
7a4c00b4 6838 }
6839 else {
ff0cee69 6840 if (mg) {
6841 mg->mg_ptr = NULL;
565764a8 6842 mg->mg_len = -1;
ff0cee69 6843 }
bbce6d69 6844 }
6845 }
7a4c00b4 6846 if (mg && mg->mg_ptr) {
565764a8 6847 *nxp = mg->mg_len;
3280af22 6848 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 6849 }
6850 else {
6851 *nxp = 0;
6852 return NULL;
16660edb 6853 }
79072805
LW
6854}
6855
36477c24 6856#endif /* USE_LOCALE_COLLATE */
bbce6d69 6857
c461cf8f
JH
6858/*
6859=for apidoc sv_gets
6860
6861Get a line from the filehandle and store it into the SV, optionally
6862appending to the currently-stored string.
6863
6864=cut
6865*/
6866
79072805 6867char *
864dbfa3 6868Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 6869{
e1ec3a88 6870 const char *rsptr;
c07a80fd 6871 STRLEN rslen;
6872 register STDCHAR rslast;
6873 register STDCHAR *bp;
6874 register I32 cnt;
9c5ffd7c 6875 I32 i = 0;
8bfdd7d9 6876 I32 rspara = 0;
e311fd51 6877 I32 recsize;
c07a80fd 6878
bc44a8a2
NC
6879 if (SvTHINKFIRST(sv))
6880 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
6881 /* XXX. If you make this PVIV, then copy on write can copy scalars read
6882 from <>.
6883 However, perlbench says it's slower, because the existing swipe code
6884 is faster than copy on write.
6885 Swings and roundabouts. */
6fc92669 6886 (void)SvUPGRADE(sv, SVt_PV);
99491443 6887
ff68c719 6888 SvSCREAM_off(sv);
efd8b2ba
AE
6889
6890 if (append) {
6891 if (PerlIO_isutf8(fp)) {
6892 if (!SvUTF8(sv)) {
6893 sv_utf8_upgrade_nomg(sv);
6894 sv_pos_u2b(sv,&append,0);
6895 }
6896 } else if (SvUTF8(sv)) {
6897 SV *tsv = NEWSV(0,0);
6898 sv_gets(tsv, fp, 0);
6899 sv_utf8_upgrade_nomg(tsv);
6900 SvCUR_set(sv,append);
6901 sv_catsv(sv,tsv);
6902 sv_free(tsv);
6903 goto return_string_or_null;
6904 }
6905 }
6906
6907 SvPOK_only(sv);
6908 if (PerlIO_isutf8(fp))
6909 SvUTF8_on(sv);
c07a80fd 6910
923e4eb5 6911 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
6912 /* we always read code in line mode */
6913 rsptr = "\n";
6914 rslen = 1;
6915 }
6916 else if (RsSNARF(PL_rs)) {
7a5fa8a2
NIS
6917 /* If it is a regular disk file use size from stat() as estimate
6918 of amount we are going to read - may result in malloc-ing
6919 more memory than we realy need if layers bellow reduce
e468d35b
NIS
6920 size we read (e.g. CRLF or a gzip layer)
6921 */
e311fd51 6922 Stat_t st;
e468d35b 6923 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
f54cb97a 6924 const Off_t offset = PerlIO_tell(fp);
58f1856e 6925 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
6926 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6927 }
6928 }
c07a80fd 6929 rsptr = NULL;
6930 rslen = 0;
6931 }
3280af22 6932 else if (RsRECORD(PL_rs)) {
e311fd51 6933 I32 bytesread;
5b2b9c68
HM
6934 char *buffer;
6935
6936 /* Grab the size of the record we're getting */
3280af22 6937 recsize = SvIV(SvRV(PL_rs));
e311fd51 6938 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
6939 /* Go yank in */
6940#ifdef VMS
6941 /* VMS wants read instead of fread, because fread doesn't respect */
6942 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
6943 /* doing, but we've got no other real choice - except avoid stdio
6944 as implementation - perhaps write a :vms layer ?
6945 */
5b2b9c68
HM
6946 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
6947#else
6948 bytesread = PerlIO_read(fp, buffer, recsize);
6949#endif
27e6ca2d
AE
6950 if (bytesread < 0)
6951 bytesread = 0;
e311fd51 6952 SvCUR_set(sv, bytesread += append);
e670df4e 6953 buffer[bytesread] = '\0';
efd8b2ba 6954 goto return_string_or_null;
5b2b9c68 6955 }
3280af22 6956 else if (RsPARA(PL_rs)) {
c07a80fd 6957 rsptr = "\n\n";
6958 rslen = 2;
8bfdd7d9 6959 rspara = 1;
c07a80fd 6960 }
7d59b7e4
NIS
6961 else {
6962 /* Get $/ i.e. PL_rs into same encoding as stream wants */
6963 if (PerlIO_isutf8(fp)) {
6964 rsptr = SvPVutf8(PL_rs, rslen);
6965 }
6966 else {
6967 if (SvUTF8(PL_rs)) {
6968 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
6969 Perl_croak(aTHX_ "Wide character in $/");
6970 }
6971 }
6972 rsptr = SvPV(PL_rs, rslen);
6973 }
6974 }
6975
c07a80fd 6976 rslast = rslen ? rsptr[rslen - 1] : '\0';
6977
8bfdd7d9 6978 if (rspara) { /* have to do this both before and after */
79072805 6979 do { /* to make sure file boundaries work right */
760ac839 6980 if (PerlIO_eof(fp))
a0d0e21e 6981 return 0;
760ac839 6982 i = PerlIO_getc(fp);
79072805 6983 if (i != '\n') {
a0d0e21e
LW
6984 if (i == -1)
6985 return 0;
760ac839 6986 PerlIO_ungetc(fp,i);
79072805
LW
6987 break;
6988 }
6989 } while (i != EOF);
6990 }
c07a80fd 6991
760ac839
LW
6992 /* See if we know enough about I/O mechanism to cheat it ! */
6993
6994 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 6995 of abstracting out stdio interface. One call should be cheap
760ac839
LW
6996 enough here - and may even be a macro allowing compile
6997 time optimization.
6998 */
6999
7000 if (PerlIO_fast_gets(fp)) {
7001
7002 /*
7003 * We're going to steal some values from the stdio struct
7004 * and put EVERYTHING in the innermost loop into registers.
7005 */
7006 register STDCHAR *ptr;
7007 STRLEN bpx;
7008 I32 shortbuffered;
7009
16660edb 7010#if defined(VMS) && defined(PERLIO_IS_STDIO)
7011 /* An ungetc()d char is handled separately from the regular
7012 * buffer, so we getc() it back out and stuff it in the buffer.
7013 */
7014 i = PerlIO_getc(fp);
7015 if (i == EOF) return 0;
7016 *(--((*fp)->_ptr)) = (unsigned char) i;
7017 (*fp)->_cnt++;
7018#endif
c07a80fd 7019
c2960299 7020 /* Here is some breathtakingly efficient cheating */
c07a80fd 7021
a20bf0c3 7022 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b 7023 /* make sure we have the room */
7a5fa8a2 7024 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
e468d35b 7025 /* Not room for all of it
7a5fa8a2 7026 if we are looking for a separator and room for some
e468d35b
NIS
7027 */
7028 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7a5fa8a2 7029 /* just process what we have room for */
79072805
LW
7030 shortbuffered = cnt - SvLEN(sv) + append + 1;
7031 cnt -= shortbuffered;
7032 }
7033 else {
7034 shortbuffered = 0;
bbce6d69 7035 /* remember that cnt can be negative */
eb160463 7036 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
7037 }
7038 }
7a5fa8a2 7039 else
79072805 7040 shortbuffered = 0;
c07a80fd 7041 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
a20bf0c3 7042 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 7043 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7044 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 7045 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 7046 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7047 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7048 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
7049 for (;;) {
7050 screamer:
93a17b20 7051 if (cnt > 0) {
c07a80fd 7052 if (rslen) {
760ac839
LW
7053 while (cnt > 0) { /* this | eat */
7054 cnt--;
c07a80fd 7055 if ((*bp++ = *ptr++) == rslast) /* really | dust */
7056 goto thats_all_folks; /* screams | sed :-) */
7057 }
7058 }
7059 else {
1c846c1f
NIS
7060 Copy(ptr, bp, cnt, char); /* this | eat */
7061 bp += cnt; /* screams | dust */
c07a80fd 7062 ptr += cnt; /* louder | sed :-) */
a5f75d66 7063 cnt = 0;
93a17b20 7064 }
79072805
LW
7065 }
7066
748a9306 7067 if (shortbuffered) { /* oh well, must extend */
79072805
LW
7068 cnt = shortbuffered;
7069 shortbuffered = 0;
c07a80fd 7070 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
7071 SvCUR_set(sv, bpx);
7072 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 7073 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
7074 continue;
7075 }
7076
16660edb 7077 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
7078 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
7079 PTR2UV(ptr),(long)cnt));
cc00df79 7080 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 7081#if 0
16660edb 7082 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7083 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7084 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7085 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 7086#endif
1c846c1f 7087 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 7088 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
7089 another abstraction. */
760ac839 7090 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 7091#if 0
16660edb 7092 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7093 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7094 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7095 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 7096#endif
a20bf0c3
JH
7097 cnt = PerlIO_get_cnt(fp);
7098 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 7099 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7100 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 7101
748a9306
LW
7102 if (i == EOF) /* all done for ever? */
7103 goto thats_really_all_folks;
7104
c07a80fd 7105 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
7106 SvCUR_set(sv, bpx);
7107 SvGROW(sv, bpx + cnt + 2);
c07a80fd 7108 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
7109
eb160463 7110 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 7111
c07a80fd 7112 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 7113 goto thats_all_folks;
79072805
LW
7114 }
7115
7116thats_all_folks:
eb160463 7117 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX(sv)) < rslen) ||
36477c24 7118 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 7119 goto screamer; /* go back to the fray */
79072805
LW
7120thats_really_all_folks:
7121 if (shortbuffered)
7122 cnt += shortbuffered;
16660edb 7123 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7124 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 7125 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 7126 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7127 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7128 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7129 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 7130 *bp = '\0';
760ac839 7131 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 7132 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 7133 "Screamer: done, len=%ld, string=|%.*s|\n",
7134 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
7135 }
7136 else
79072805 7137 {
6edd2cd5 7138 /*The big, slow, and stupid way. */
27da23d5 7139#ifdef USE_HEAP_INSTEAD_OF_STACK /* Even slower way. */
6edd2cd5
JH
7140 STDCHAR *buf = 0;
7141 New(0, buf, 8192, STDCHAR);
7142 assert(buf);
4d2c4e07 7143#else
6edd2cd5 7144 STDCHAR buf[8192];
4d2c4e07 7145#endif
79072805 7146
760ac839 7147screamer2:
c07a80fd 7148 if (rslen) {
6867be6d 7149 const register STDCHAR *bpe = buf + sizeof(buf);
760ac839 7150 bp = buf;
eb160463 7151 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
7152 ; /* keep reading */
7153 cnt = bp - buf;
c07a80fd 7154 }
7155 else {
760ac839 7156 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 7157 /* Accomodate broken VAXC compiler, which applies U8 cast to
7158 * both args of ?: operator, causing EOF to change into 255
7159 */
37be0adf 7160 if (cnt > 0)
cbe9e203
JH
7161 i = (U8)buf[cnt - 1];
7162 else
37be0adf 7163 i = EOF;
c07a80fd 7164 }
79072805 7165
cbe9e203
JH
7166 if (cnt < 0)
7167 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
7168 if (append)
7169 sv_catpvn(sv, (char *) buf, cnt);
7170 else
7171 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 7172
7173 if (i != EOF && /* joy */
7174 (!rslen ||
7175 SvCUR(sv) < rslen ||
36477c24 7176 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
7177 {
7178 append = -1;
63e4d877
CS
7179 /*
7180 * If we're reading from a TTY and we get a short read,
7181 * indicating that the user hit his EOF character, we need
7182 * to notice it now, because if we try to read from the TTY
7183 * again, the EOF condition will disappear.
7184 *
7185 * The comparison of cnt to sizeof(buf) is an optimization
7186 * that prevents unnecessary calls to feof().
7187 *
7188 * - jik 9/25/96
7189 */
7190 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
7191 goto screamer2;
79072805 7192 }
6edd2cd5 7193
27da23d5 7194#ifdef USE_HEAP_INSTEAD_OF_STACK
6edd2cd5
JH
7195 Safefree(buf);
7196#endif
79072805
LW
7197 }
7198
8bfdd7d9 7199 if (rspara) { /* have to do this both before and after */
c07a80fd 7200 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 7201 i = PerlIO_getc(fp);
79072805 7202 if (i != '\n') {
760ac839 7203 PerlIO_ungetc(fp,i);
79072805
LW
7204 break;
7205 }
7206 }
7207 }
c07a80fd 7208
efd8b2ba 7209return_string_or_null:
c07a80fd 7210 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
7211}
7212
954c1994
GS
7213/*
7214=for apidoc sv_inc
7215
645c22ef
DM
7216Auto-increment of the value in the SV, doing string to numeric conversion
7217if necessary. Handles 'get' magic.
954c1994
GS
7218
7219=cut
7220*/
7221
79072805 7222void
864dbfa3 7223Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
7224{
7225 register char *d;
463ee0b2 7226 int flags;
79072805
LW
7227
7228 if (!sv)
7229 return;
b23a5f78
GB
7230 if (SvGMAGICAL(sv))
7231 mg_get(sv);
ed6116ce 7232 if (SvTHINKFIRST(sv)) {
765f542d
NC
7233 if (SvIsCOW(sv))
7234 sv_force_normal_flags(sv, 0);
0f15f207 7235 if (SvREADONLY(sv)) {
923e4eb5 7236 if (IN_PERL_RUNTIME)
cea2e8a9 7237 Perl_croak(aTHX_ PL_no_modify);
0f15f207 7238 }
a0d0e21e 7239 if (SvROK(sv)) {
b5be31e9 7240 IV i;
9e7bc3e8
JD
7241 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
7242 return;
56431972 7243 i = PTR2IV(SvRV(sv));
b5be31e9
SM
7244 sv_unref(sv);
7245 sv_setiv(sv, i);
a0d0e21e 7246 }
ed6116ce 7247 }
8990e307 7248 flags = SvFLAGS(sv);
28e5dec8
JH
7249 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
7250 /* It's (privately or publicly) a float, but not tested as an
7251 integer, so test it to see. */
d460ef45 7252 (void) SvIV(sv);
28e5dec8
JH
7253 flags = SvFLAGS(sv);
7254 }
7255 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7256 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 7257#ifdef PERL_PRESERVE_IVUV
28e5dec8 7258 oops_its_int:
59d8ce62 7259#endif
25da4f38
IZ
7260 if (SvIsUV(sv)) {
7261 if (SvUVX(sv) == UV_MAX)
a1e868e7 7262 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
7263 else
7264 (void)SvIOK_only_UV(sv);
607fa7f2 7265 SvUV_set(sv, SvUVX(sv) + 1);
25da4f38
IZ
7266 } else {
7267 if (SvIVX(sv) == IV_MAX)
28e5dec8 7268 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
7269 else {
7270 (void)SvIOK_only(sv);
45977657 7271 SvIV_set(sv, SvIVX(sv) + 1);
1c846c1f 7272 }
55497cff 7273 }
79072805
LW
7274 return;
7275 }
28e5dec8
JH
7276 if (flags & SVp_NOK) {
7277 (void)SvNOK_only(sv);
9d6ce603 7278 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
7279 return;
7280 }
7281
8990e307 7282 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
28e5dec8
JH
7283 if ((flags & SVTYPEMASK) < SVt_PVIV)
7284 sv_upgrade(sv, SVt_IV);
7285 (void)SvIOK_only(sv);
45977657 7286 SvIV_set(sv, 1);
79072805
LW
7287 return;
7288 }
463ee0b2 7289 d = SvPVX(sv);
79072805
LW
7290 while (isALPHA(*d)) d++;
7291 while (isDIGIT(*d)) d++;
7292 if (*d) {
28e5dec8 7293#ifdef PERL_PRESERVE_IVUV
d1be9408 7294 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
7295 warnings. Probably ought to make the sv_iv_please() that does
7296 the conversion if possible, and silently. */
504618e9 7297 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
7298 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7299 /* Need to try really hard to see if it's an integer.
7300 9.22337203685478e+18 is an integer.
7301 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7302 so $a="9.22337203685478e+18"; $a+0; $a++
7303 needs to be the same as $a="9.22337203685478e+18"; $a++
7304 or we go insane. */
d460ef45 7305
28e5dec8
JH
7306 (void) sv_2iv(sv);
7307 if (SvIOK(sv))
7308 goto oops_its_int;
7309
7310 /* sv_2iv *should* have made this an NV */
7311 if (flags & SVp_NOK) {
7312 (void)SvNOK_only(sv);
9d6ce603 7313 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
7314 return;
7315 }
7316 /* I don't think we can get here. Maybe I should assert this
7317 And if we do get here I suspect that sv_setnv will croak. NWC
7318 Fall through. */
7319#if defined(USE_LONG_DOUBLE)
7320 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",
7321 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7322#else
1779d84d 7323 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
7324 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7325#endif
7326 }
7327#endif /* PERL_PRESERVE_IVUV */
7328 sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
79072805
LW
7329 return;
7330 }
7331 d--;
463ee0b2 7332 while (d >= SvPVX(sv)) {
79072805
LW
7333 if (isDIGIT(*d)) {
7334 if (++*d <= '9')
7335 return;
7336 *(d--) = '0';
7337 }
7338 else {
9d116dd7
JH
7339#ifdef EBCDIC
7340 /* MKS: The original code here died if letters weren't consecutive.
7341 * at least it didn't have to worry about non-C locales. The
7342 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 7343 * arranged in order (although not consecutively) and that only
9d116dd7
JH
7344 * [A-Za-z] are accepted by isALPHA in the C locale.
7345 */
7346 if (*d != 'z' && *d != 'Z') {
7347 do { ++*d; } while (!isALPHA(*d));
7348 return;
7349 }
7350 *(d--) -= 'z' - 'a';
7351#else
79072805
LW
7352 ++*d;
7353 if (isALPHA(*d))
7354 return;
7355 *(d--) -= 'z' - 'a' + 1;
9d116dd7 7356#endif
79072805
LW
7357 }
7358 }
7359 /* oh,oh, the number grew */
7360 SvGROW(sv, SvCUR(sv) + 2);
b162af07 7361 SvCUR_set(sv, SvCUR(sv) + 1);
463ee0b2 7362 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
7363 *d = d[-1];
7364 if (isDIGIT(d[1]))
7365 *d = '1';
7366 else
7367 *d = d[1];
7368}
7369
954c1994
GS
7370/*
7371=for apidoc sv_dec
7372
645c22ef
DM
7373Auto-decrement of the value in the SV, doing string to numeric conversion
7374if necessary. Handles 'get' magic.
954c1994
GS
7375
7376=cut
7377*/
7378
79072805 7379void
864dbfa3 7380Perl_sv_dec(pTHX_ register SV *sv)
79072805 7381{
463ee0b2
LW
7382 int flags;
7383
79072805
LW
7384 if (!sv)
7385 return;
b23a5f78
GB
7386 if (SvGMAGICAL(sv))
7387 mg_get(sv);
ed6116ce 7388 if (SvTHINKFIRST(sv)) {
765f542d
NC
7389 if (SvIsCOW(sv))
7390 sv_force_normal_flags(sv, 0);
0f15f207 7391 if (SvREADONLY(sv)) {
923e4eb5 7392 if (IN_PERL_RUNTIME)
cea2e8a9 7393 Perl_croak(aTHX_ PL_no_modify);
0f15f207 7394 }
a0d0e21e 7395 if (SvROK(sv)) {
b5be31e9 7396 IV i;
9e7bc3e8
JD
7397 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
7398 return;
56431972 7399 i = PTR2IV(SvRV(sv));
b5be31e9
SM
7400 sv_unref(sv);
7401 sv_setiv(sv, i);
a0d0e21e 7402 }
ed6116ce 7403 }
28e5dec8
JH
7404 /* Unlike sv_inc we don't have to worry about string-never-numbers
7405 and keeping them magic. But we mustn't warn on punting */
8990e307 7406 flags = SvFLAGS(sv);
28e5dec8
JH
7407 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7408 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 7409#ifdef PERL_PRESERVE_IVUV
28e5dec8 7410 oops_its_int:
59d8ce62 7411#endif
25da4f38
IZ
7412 if (SvIsUV(sv)) {
7413 if (SvUVX(sv) == 0) {
7414 (void)SvIOK_only(sv);
45977657 7415 SvIV_set(sv, -1);
25da4f38
IZ
7416 }
7417 else {
7418 (void)SvIOK_only_UV(sv);
607fa7f2 7419 SvUV_set(sv, SvUVX(sv) + 1);
1c846c1f 7420 }
25da4f38
IZ
7421 } else {
7422 if (SvIVX(sv) == IV_MIN)
65202027 7423 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
7424 else {
7425 (void)SvIOK_only(sv);
45977657 7426 SvIV_set(sv, SvIVX(sv) - 1);
1c846c1f 7427 }
55497cff 7428 }
7429 return;
7430 }
28e5dec8 7431 if (flags & SVp_NOK) {
9d6ce603 7432 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
7433 (void)SvNOK_only(sv);
7434 return;
7435 }
8990e307 7436 if (!(flags & SVp_POK)) {
4633a7c4
LW
7437 if ((flags & SVTYPEMASK) < SVt_PVNV)
7438 sv_upgrade(sv, SVt_NV);
f599b64b 7439 SvNV_set(sv, 1.0);
a0d0e21e 7440 (void)SvNOK_only(sv);
79072805
LW
7441 return;
7442 }
28e5dec8
JH
7443#ifdef PERL_PRESERVE_IVUV
7444 {
504618e9 7445 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
7446 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7447 /* Need to try really hard to see if it's an integer.
7448 9.22337203685478e+18 is an integer.
7449 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7450 so $a="9.22337203685478e+18"; $a+0; $a--
7451 needs to be the same as $a="9.22337203685478e+18"; $a--
7452 or we go insane. */
d460ef45 7453
28e5dec8
JH
7454 (void) sv_2iv(sv);
7455 if (SvIOK(sv))
7456 goto oops_its_int;
7457
7458 /* sv_2iv *should* have made this an NV */
7459 if (flags & SVp_NOK) {
7460 (void)SvNOK_only(sv);
9d6ce603 7461 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
7462 return;
7463 }
7464 /* I don't think we can get here. Maybe I should assert this
7465 And if we do get here I suspect that sv_setnv will croak. NWC
7466 Fall through. */
7467#if defined(USE_LONG_DOUBLE)
7468 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",
7469 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7470#else
1779d84d 7471 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
7472 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7473#endif
7474 }
7475 }
7476#endif /* PERL_PRESERVE_IVUV */
097ee67d 7477 sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
7478}
7479
954c1994
GS
7480/*
7481=for apidoc sv_mortalcopy
7482
645c22ef 7483Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
7484The new SV is marked as mortal. It will be destroyed "soon", either by an
7485explicit call to FREETMPS, or by an implicit call at places such as
7486statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
7487
7488=cut
7489*/
7490
79072805
LW
7491/* Make a string that will exist for the duration of the expression
7492 * evaluation. Actually, it may have to last longer than that, but
7493 * hopefully we won't free it until it has been assigned to a
7494 * permanent location. */
7495
7496SV *
864dbfa3 7497Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 7498{
463ee0b2 7499 register SV *sv;
b881518d 7500
4561caa4 7501 new_SV(sv);
79072805 7502 sv_setsv(sv,oldstr);
677b06e3
GS
7503 EXTEND_MORTAL(1);
7504 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
7505 SvTEMP_on(sv);
7506 return sv;
7507}
7508
954c1994
GS
7509/*
7510=for apidoc sv_newmortal
7511
645c22ef 7512Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
7513set to 1. It will be destroyed "soon", either by an explicit call to
7514FREETMPS, or by an implicit call at places such as statement boundaries.
7515See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
7516
7517=cut
7518*/
7519
8990e307 7520SV *
864dbfa3 7521Perl_sv_newmortal(pTHX)
8990e307
LW
7522{
7523 register SV *sv;
7524
4561caa4 7525 new_SV(sv);
8990e307 7526 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
7527 EXTEND_MORTAL(1);
7528 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
7529 return sv;
7530}
7531
954c1994
GS
7532/*
7533=for apidoc sv_2mortal
7534
d4236ebc
DM
7535Marks an existing SV as mortal. The SV will be destroyed "soon", either
7536by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
7537statement boundaries. SvTEMP() is turned on which means that the SV's
7538string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
7539and C<sv_mortalcopy>.
954c1994
GS
7540
7541=cut
7542*/
7543
79072805 7544SV *
864dbfa3 7545Perl_sv_2mortal(pTHX_ register SV *sv)
79072805 7546{
27da23d5 7547 dVAR;
79072805
LW
7548 if (!sv)
7549 return sv;
d689ffdd 7550 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 7551 return sv;
677b06e3
GS
7552 EXTEND_MORTAL(1);
7553 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 7554 SvTEMP_on(sv);
79072805
LW
7555 return sv;
7556}
7557
954c1994
GS
7558/*
7559=for apidoc newSVpv
7560
7561Creates a new SV and copies a string into it. The reference count for the
7562SV is set to 1. If C<len> is zero, Perl will compute the length using
7563strlen(). For efficiency, consider using C<newSVpvn> instead.
7564
7565=cut
7566*/
7567
79072805 7568SV *
864dbfa3 7569Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 7570{
463ee0b2 7571 register SV *sv;
79072805 7572
4561caa4 7573 new_SV(sv);
79072805
LW
7574 if (!len)
7575 len = strlen(s);
7576 sv_setpvn(sv,s,len);
7577 return sv;
7578}
7579
954c1994
GS
7580/*
7581=for apidoc newSVpvn
7582
7583Creates a new SV and copies a string into it. The reference count for the
1c846c1f 7584SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 7585string. You are responsible for ensuring that the source string is at least
9e09f5f2 7586C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
7587
7588=cut
7589*/
7590
9da1e3b5 7591SV *
864dbfa3 7592Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
7593{
7594 register SV *sv;
7595
7596 new_SV(sv);
9da1e3b5
MUN
7597 sv_setpvn(sv,s,len);
7598 return sv;
7599}
7600
1c846c1f
NIS
7601/*
7602=for apidoc newSVpvn_share
7603
645c22ef
DM
7604Creates a new SV with its SvPVX pointing to a shared string in the string
7605table. If the string does not already exist in the table, it is created
7606first. Turns on READONLY and FAKE. The string's hash is stored in the UV
7607slot of the SV; if the C<hash> parameter is non-zero, that value is used;
7608otherwise the hash is computed. The idea here is that as the string table
7609is used for shared hash keys these strings will have SvPVX == HeKEY and
7610hash lookup will avoid string compare.
1c846c1f
NIS
7611
7612=cut
7613*/
7614
7615SV *
c3654f1a 7616Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
7617{
7618 register SV *sv;
c3654f1a
IH
7619 bool is_utf8 = FALSE;
7620 if (len < 0) {
77caf834 7621 STRLEN tmplen = -len;
c3654f1a 7622 is_utf8 = TRUE;
75a54232 7623 /* See the note in hv.c:hv_fetch() --jhi */
e1ec3a88 7624 src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
75a54232
JH
7625 len = tmplen;
7626 }
1c846c1f 7627 if (!hash)
5afd6d42 7628 PERL_HASH(hash, src, len);
1c846c1f
NIS
7629 new_SV(sv);
7630 sv_upgrade(sv, SVt_PVIV);
f880fe2f 7631 SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
b162af07 7632 SvCUR_set(sv, len);
607fa7f2 7633 SvUV_set(sv, hash);
b162af07 7634 SvLEN_set(sv, 0);
1c846c1f
NIS
7635 SvREADONLY_on(sv);
7636 SvFAKE_on(sv);
7637 SvPOK_on(sv);
c3654f1a
IH
7638 if (is_utf8)
7639 SvUTF8_on(sv);
1c846c1f
NIS
7640 return sv;
7641}
7642
645c22ef 7643
cea2e8a9 7644#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7645
7646/* pTHX_ magic can't cope with varargs, so this is a no-context
7647 * version of the main function, (which may itself be aliased to us).
7648 * Don't access this version directly.
7649 */
7650
46fc3d4c 7651SV *
cea2e8a9 7652Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 7653{
cea2e8a9 7654 dTHX;
46fc3d4c 7655 register SV *sv;
7656 va_list args;
46fc3d4c 7657 va_start(args, pat);
c5be433b 7658 sv = vnewSVpvf(pat, &args);
46fc3d4c 7659 va_end(args);
7660 return sv;
7661}
cea2e8a9 7662#endif
46fc3d4c 7663
954c1994
GS
7664/*
7665=for apidoc newSVpvf
7666
645c22ef 7667Creates a new SV and initializes it with the string formatted like
954c1994
GS
7668C<sprintf>.
7669
7670=cut
7671*/
7672
cea2e8a9
GS
7673SV *
7674Perl_newSVpvf(pTHX_ const char* pat, ...)
7675{
7676 register SV *sv;
7677 va_list args;
cea2e8a9 7678 va_start(args, pat);
c5be433b 7679 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
7680 va_end(args);
7681 return sv;
7682}
46fc3d4c 7683
645c22ef
DM
7684/* backend for newSVpvf() and newSVpvf_nocontext() */
7685
79072805 7686SV *
c5be433b
GS
7687Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
7688{
7689 register SV *sv;
7690 new_SV(sv);
7691 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7692 return sv;
7693}
7694
954c1994
GS
7695/*
7696=for apidoc newSVnv
7697
7698Creates a new SV and copies a floating point value into it.
7699The reference count for the SV is set to 1.
7700
7701=cut
7702*/
7703
c5be433b 7704SV *
65202027 7705Perl_newSVnv(pTHX_ NV n)
79072805 7706{
463ee0b2 7707 register SV *sv;
79072805 7708
4561caa4 7709 new_SV(sv);
79072805
LW
7710 sv_setnv(sv,n);
7711 return sv;
7712}
7713
954c1994
GS
7714/*
7715=for apidoc newSViv
7716
7717Creates a new SV and copies an integer into it. The reference count for the
7718SV is set to 1.
7719
7720=cut
7721*/
7722
79072805 7723SV *
864dbfa3 7724Perl_newSViv(pTHX_ IV i)
79072805 7725{
463ee0b2 7726 register SV *sv;
79072805 7727
4561caa4 7728 new_SV(sv);
79072805
LW
7729 sv_setiv(sv,i);
7730 return sv;
7731}
7732
954c1994 7733/*
1a3327fb
JH
7734=for apidoc newSVuv
7735
7736Creates a new SV and copies an unsigned integer into it.
7737The reference count for the SV is set to 1.
7738
7739=cut
7740*/
7741
7742SV *
7743Perl_newSVuv(pTHX_ UV u)
7744{
7745 register SV *sv;
7746
7747 new_SV(sv);
7748 sv_setuv(sv,u);
7749 return sv;
7750}
7751
7752/*
954c1994
GS
7753=for apidoc newRV_noinc
7754
7755Creates an RV wrapper for an SV. The reference count for the original
7756SV is B<not> incremented.
7757
7758=cut
7759*/
7760
2304df62 7761SV *
864dbfa3 7762Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
7763{
7764 register SV *sv;
7765
4561caa4 7766 new_SV(sv);
2304df62 7767 sv_upgrade(sv, SVt_RV);
76e3520e 7768 SvTEMP_off(tmpRef);
b162af07 7769 SvRV_set(sv, tmpRef);
2304df62 7770 SvROK_on(sv);
2304df62
AD
7771 return sv;
7772}
7773
ff276b08 7774/* newRV_inc is the official function name to use now.
645c22ef
DM
7775 * newRV_inc is in fact #defined to newRV in sv.h
7776 */
7777
5f05dabc 7778SV *
864dbfa3 7779Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 7780{
5f6447b6 7781 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 7782}
5f05dabc 7783
954c1994
GS
7784/*
7785=for apidoc newSVsv
7786
7787Creates a new SV which is an exact duplicate of the original SV.
645c22ef 7788(Uses C<sv_setsv>).
954c1994
GS
7789
7790=cut
7791*/
7792
79072805 7793SV *
864dbfa3 7794Perl_newSVsv(pTHX_ register SV *old)
79072805 7795{
463ee0b2 7796 register SV *sv;
79072805
LW
7797
7798 if (!old)
7799 return Nullsv;
8990e307 7800 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 7801 if (ckWARN_d(WARN_INTERNAL))
9014280d 7802 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
79072805
LW
7803 return Nullsv;
7804 }
4561caa4 7805 new_SV(sv);
e90aabeb
NC
7806 /* SV_GMAGIC is the default for sv_setv()
7807 SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
7808 with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
7809 sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
463ee0b2 7810 return sv;
79072805
LW
7811}
7812
645c22ef
DM
7813/*
7814=for apidoc sv_reset
7815
7816Underlying implementation for the C<reset> Perl function.
7817Note that the perl-level function is vaguely deprecated.
7818
7819=cut
7820*/
7821
79072805 7822void
e1ec3a88 7823Perl_sv_reset(pTHX_ register const char *s, HV *stash)
79072805 7824{
27da23d5 7825 dVAR;
79072805
LW
7826 register HE *entry;
7827 register GV *gv;
7828 register SV *sv;
7829 register I32 i;
79072805 7830 register I32 max;
4802d5d7 7831 char todo[PERL_UCHAR_MAX+1];
79072805 7832
49d8d3a1
MB
7833 if (!stash)
7834 return;
7835
79072805 7836 if (!*s) { /* reset ?? searches */
8d2f4536
NC
7837 MAGIC *mg = mg_find((SV *)stash, PERL_MAGIC_symtab);
7838 if (mg) {
7839 PMOP *pm = (PMOP *) mg->mg_obj;
7840 while (pm) {
7841 pm->op_pmdynflags &= ~PMdf_USED;
7842 pm = pm->op_pmnext;
7843 }
79072805
LW
7844 }
7845 return;
7846 }
7847
7848 /* reset variables */
7849
7850 if (!HvARRAY(stash))
7851 return;
463ee0b2
LW
7852
7853 Zero(todo, 256, char);
79072805 7854 while (*s) {
4802d5d7 7855 i = (unsigned char)*s;
79072805
LW
7856 if (s[1] == '-') {
7857 s += 2;
7858 }
4802d5d7 7859 max = (unsigned char)*s++;
79072805 7860 for ( ; i <= max; i++) {
463ee0b2
LW
7861 todo[i] = 1;
7862 }
a0d0e21e 7863 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 7864 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7865 entry;
7866 entry = HeNEXT(entry))
7867 {
1edc1566 7868 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7869 continue;
1edc1566 7870 gv = (GV*)HeVAL(entry);
79072805 7871 sv = GvSV(gv);
9e35f4b3
GS
7872 if (SvTHINKFIRST(sv)) {
7873 if (!SvREADONLY(sv) && SvROK(sv))
7874 sv_unref(sv);
7875 continue;
7876 }
0c34ef67 7877 SvOK_off(sv);
79072805
LW
7878 if (SvTYPE(sv) >= SVt_PV) {
7879 SvCUR_set(sv, 0);
463ee0b2
LW
7880 if (SvPVX(sv) != Nullch)
7881 *SvPVX(sv) = '\0';
44a8e56a 7882 SvTAINT(sv);
79072805
LW
7883 }
7884 if (GvAV(gv)) {
7885 av_clear(GvAV(gv));
7886 }
bfcb3514 7887 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
463ee0b2 7888 hv_clear(GvHV(gv));
2f42fcb0 7889#ifndef PERL_MICRO
fa6a1c44 7890#ifdef USE_ENVIRON_ARRAY
4efc5df6
GS
7891 if (gv == PL_envgv
7892# ifdef USE_ITHREADS
7893 && PL_curinterp == aTHX
7894# endif
7895 )
7896 {
79072805 7897 environ[0] = Nullch;
4efc5df6 7898 }
a0d0e21e 7899#endif
2f42fcb0 7900#endif /* !PERL_MICRO */
79072805
LW
7901 }
7902 }
7903 }
7904 }
7905}
7906
645c22ef
DM
7907/*
7908=for apidoc sv_2io
7909
7910Using various gambits, try to get an IO from an SV: the IO slot if its a
7911GV; or the recursive result if we're an RV; or the IO slot of the symbol
7912named after the PV if we're a string.
7913
7914=cut
7915*/
7916
46fc3d4c 7917IO*
864dbfa3 7918Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 7919{
7920 IO* io;
7921 GV* gv;
7922
7923 switch (SvTYPE(sv)) {
7924 case SVt_PVIO:
7925 io = (IO*)sv;
7926 break;
7927 case SVt_PVGV:
7928 gv = (GV*)sv;
7929 io = GvIO(gv);
7930 if (!io)
cea2e8a9 7931 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 7932 break;
7933 default:
7934 if (!SvOK(sv))
cea2e8a9 7935 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 7936 if (SvROK(sv))
7937 return sv_2io(SvRV(sv));
7a5fd60d 7938 gv = gv_fetchsv(sv, FALSE, SVt_PVIO);
46fc3d4c 7939 if (gv)
7940 io = GvIO(gv);
7941 else
7942 io = 0;
7943 if (!io)
35c1215d 7944 Perl_croak(aTHX_ "Bad filehandle: %"SVf, sv);
46fc3d4c 7945 break;
7946 }
7947 return io;
7948}
7949
645c22ef
DM
7950/*
7951=for apidoc sv_2cv
7952
7953Using various gambits, try to get a CV from an SV; in addition, try if
7954possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
7955
7956=cut
7957*/
7958
79072805 7959CV *
864dbfa3 7960Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 7961{
27da23d5 7962 dVAR;
c04a4dfe
JH
7963 GV *gv = Nullgv;
7964 CV *cv = Nullcv;
79072805
LW
7965
7966 if (!sv)
93a17b20 7967 return *gvp = Nullgv, Nullcv;
79072805 7968 switch (SvTYPE(sv)) {
79072805
LW
7969 case SVt_PVCV:
7970 *st = CvSTASH(sv);
7971 *gvp = Nullgv;
7972 return (CV*)sv;
7973 case SVt_PVHV:
7974 case SVt_PVAV:
7975 *gvp = Nullgv;
7976 return Nullcv;
8990e307
LW
7977 case SVt_PVGV:
7978 gv = (GV*)sv;
a0d0e21e 7979 *gvp = gv;
8990e307
LW
7980 *st = GvESTASH(gv);
7981 goto fix_gv;
7982
79072805 7983 default:
a0d0e21e
LW
7984 if (SvGMAGICAL(sv))
7985 mg_get(sv);
7986 if (SvROK(sv)) {
f5284f61
IZ
7987 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
7988 tryAMAGICunDEREF(to_cv);
7989
62f274bf
GS
7990 sv = SvRV(sv);
7991 if (SvTYPE(sv) == SVt_PVCV) {
7992 cv = (CV*)sv;
7993 *gvp = Nullgv;
7994 *st = CvSTASH(cv);
7995 return cv;
7996 }
7997 else if(isGV(sv))
7998 gv = (GV*)sv;
7999 else
cea2e8a9 8000 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 8001 }
62f274bf 8002 else if (isGV(sv))
79072805
LW
8003 gv = (GV*)sv;
8004 else
7a5fd60d 8005 gv = gv_fetchsv(sv, lref, SVt_PVCV);
79072805
LW
8006 *gvp = gv;
8007 if (!gv)
8008 return Nullcv;
8009 *st = GvESTASH(gv);
8990e307 8010 fix_gv:
8ebc5c01 8011 if (lref && !GvCVu(gv)) {
4633a7c4 8012 SV *tmpsv;
748a9306 8013 ENTER;
4633a7c4 8014 tmpsv = NEWSV(704,0);
16660edb 8015 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
8016 /* XXX this is probably not what they think they're getting.
8017 * It has the same effect as "sub name;", i.e. just a forward
8018 * declaration! */
774d564b 8019 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
8020 newSVOP(OP_CONST, 0, tmpsv),
8021 Nullop,
8990e307 8022 Nullop);
748a9306 8023 LEAVE;
8ebc5c01 8024 if (!GvCVu(gv))
35c1215d
NC
8025 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
8026 sv);
8990e307 8027 }
8ebc5c01 8028 return GvCVu(gv);
79072805
LW
8029 }
8030}
8031
c461cf8f
JH
8032/*
8033=for apidoc sv_true
8034
8035Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
8036Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
8037instead use an in-line version.
c461cf8f
JH
8038
8039=cut
8040*/
8041
79072805 8042I32
864dbfa3 8043Perl_sv_true(pTHX_ register SV *sv)
79072805 8044{
8990e307
LW
8045 if (!sv)
8046 return 0;
79072805 8047 if (SvPOK(sv)) {
e1ec3a88 8048 const register XPV* tXpv;
4e35701f 8049 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 8050 (tXpv->xpv_cur > 1 ||
339049b0 8051 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
79072805
LW
8052 return 1;
8053 else
8054 return 0;
8055 }
8056 else {
8057 if (SvIOK(sv))
463ee0b2 8058 return SvIVX(sv) != 0;
79072805
LW
8059 else {
8060 if (SvNOK(sv))
463ee0b2 8061 return SvNVX(sv) != 0.0;
79072805 8062 else
463ee0b2 8063 return sv_2bool(sv);
79072805
LW
8064 }
8065 }
8066}
79072805 8067
645c22ef
DM
8068/*
8069=for apidoc sv_iv
8070
8071A private implementation of the C<SvIVx> macro for compilers which can't
8072cope with complex macro expressions. Always use the macro instead.
8073
8074=cut
8075*/
8076
ff68c719 8077IV
864dbfa3 8078Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 8079{
25da4f38
IZ
8080 if (SvIOK(sv)) {
8081 if (SvIsUV(sv))
8082 return (IV)SvUVX(sv);
ff68c719 8083 return SvIVX(sv);
25da4f38 8084 }
ff68c719 8085 return sv_2iv(sv);
85e6fe83 8086}
85e6fe83 8087
645c22ef
DM
8088/*
8089=for apidoc sv_uv
8090
8091A private implementation of the C<SvUVx> macro for compilers which can't
8092cope with complex macro expressions. Always use the macro instead.
8093
8094=cut
8095*/
8096
ff68c719 8097UV
864dbfa3 8098Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 8099{
25da4f38
IZ
8100 if (SvIOK(sv)) {
8101 if (SvIsUV(sv))
8102 return SvUVX(sv);
8103 return (UV)SvIVX(sv);
8104 }
ff68c719 8105 return sv_2uv(sv);
8106}
85e6fe83 8107
645c22ef
DM
8108/*
8109=for apidoc sv_nv
8110
8111A private implementation of the C<SvNVx> macro for compilers which can't
8112cope with complex macro expressions. Always use the macro instead.
8113
8114=cut
8115*/
8116
65202027 8117NV
864dbfa3 8118Perl_sv_nv(pTHX_ register SV *sv)
79072805 8119{
ff68c719 8120 if (SvNOK(sv))
8121 return SvNVX(sv);
8122 return sv_2nv(sv);
79072805 8123}
79072805 8124
09540bc3
JH
8125/* sv_pv() is now a macro using SvPV_nolen();
8126 * this function provided for binary compatibility only
8127 */
8128
8129char *
8130Perl_sv_pv(pTHX_ SV *sv)
8131{
8132 STRLEN n_a;
8133
8134 if (SvPOK(sv))
8135 return SvPVX(sv);
8136
8137 return sv_2pv(sv, &n_a);
8138}
8139
645c22ef
DM
8140/*
8141=for apidoc sv_pv
8142
baca2b92 8143Use the C<SvPV_nolen> macro instead
645c22ef 8144
645c22ef
DM
8145=for apidoc sv_pvn
8146
8147A private implementation of the C<SvPV> macro for compilers which can't
8148cope with complex macro expressions. Always use the macro instead.
8149
8150=cut
8151*/
8152
1fa8b10d 8153char *
864dbfa3 8154Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 8155{
85e6fe83
LW
8156 if (SvPOK(sv)) {
8157 *lp = SvCUR(sv);
a0d0e21e 8158 return SvPVX(sv);
85e6fe83 8159 }
463ee0b2 8160 return sv_2pv(sv, lp);
79072805 8161}
79072805 8162
6e9d1081
NC
8163
8164char *
8165Perl_sv_pvn_nomg(pTHX_ register SV *sv, STRLEN *lp)
8166{
8167 if (SvPOK(sv)) {
8168 *lp = SvCUR(sv);
8169 return SvPVX(sv);
8170 }
8171 return sv_2pv_flags(sv, lp, 0);
8172}
8173
09540bc3
JH
8174/* sv_pvn_force() is now a macro using Perl_sv_pvn_force_flags();
8175 * this function provided for binary compatibility only
8176 */
8177
8178char *
8179Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
8180{
8181 return sv_pvn_force_flags(sv, lp, SV_GMAGIC);
8182}
8183
c461cf8f
JH
8184/*
8185=for apidoc sv_pvn_force
8186
8187Get a sensible string out of the SV somehow.
645c22ef
DM
8188A private implementation of the C<SvPV_force> macro for compilers which
8189can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 8190
8d6d96c1
HS
8191=for apidoc sv_pvn_force_flags
8192
8193Get a sensible string out of the SV somehow.
8194If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
8195appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
8196implemented in terms of this function.
645c22ef
DM
8197You normally want to use the various wrapper macros instead: see
8198C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
8199
8200=cut
8201*/
8202
8203char *
8204Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
8205{
a0d0e21e 8206
6fc92669 8207 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 8208 sv_force_normal_flags(sv, 0);
1c846c1f 8209
a0d0e21e
LW
8210 if (SvPOK(sv)) {
8211 *lp = SvCUR(sv);
8212 }
8213 else {
a3b680e6 8214 char *s;
748a9306 8215 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 8216 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 8217 OP_NAME(PL_op));
a0d0e21e 8218 }
4633a7c4 8219 else
8d6d96c1 8220 s = sv_2pv_flags(sv, lp, flags);
a0d0e21e 8221 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
a3b680e6 8222 const STRLEN len = *lp;
1c846c1f 8223
a0d0e21e
LW
8224 if (SvROK(sv))
8225 sv_unref(sv);
8226 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
8227 SvGROW(sv, len + 1);
8228 Move(s,SvPVX(sv),len,char);
8229 SvCUR_set(sv, len);
8230 *SvEND(sv) = '\0';
8231 }
8232 if (!SvPOK(sv)) {
8233 SvPOK_on(sv); /* validate pointer */
8234 SvTAINT(sv);
1d7c1841
GS
8235 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
8236 PTR2UV(sv),SvPVX(sv)));
a0d0e21e
LW
8237 }
8238 }
8239 return SvPVX(sv);
8240}
8241
09540bc3
JH
8242/* sv_pvbyte () is now a macro using Perl_sv_2pv_flags();
8243 * this function provided for binary compatibility only
8244 */
8245
8246char *
8247Perl_sv_pvbyte(pTHX_ SV *sv)
8248{
8249 sv_utf8_downgrade(sv,0);
8250 return sv_pv(sv);
8251}
8252
645c22ef
DM
8253/*
8254=for apidoc sv_pvbyte
8255
baca2b92 8256Use C<SvPVbyte_nolen> instead.
645c22ef 8257
645c22ef
DM
8258=for apidoc sv_pvbyten
8259
8260A private implementation of the C<SvPVbyte> macro for compilers
8261which can't cope with complex macro expressions. Always use the macro
8262instead.
8263
8264=cut
8265*/
8266
7340a771
GS
8267char *
8268Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
8269{
ffebcc3e 8270 sv_utf8_downgrade(sv,0);
7340a771
GS
8271 return sv_pvn(sv,lp);
8272}
8273
645c22ef
DM
8274/*
8275=for apidoc sv_pvbyten_force
8276
8277A private implementation of the C<SvPVbytex_force> macro for compilers
8278which can't cope with complex macro expressions. Always use the macro
8279instead.
8280
8281=cut
8282*/
8283
7340a771
GS
8284char *
8285Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
8286{
46ec2f14 8287 sv_pvn_force(sv,lp);
ffebcc3e 8288 sv_utf8_downgrade(sv,0);
46ec2f14
TS
8289 *lp = SvCUR(sv);
8290 return SvPVX(sv);
7340a771
GS
8291}
8292
09540bc3
JH
8293/* sv_pvutf8 () is now a macro using Perl_sv_2pv_flags();
8294 * this function provided for binary compatibility only
8295 */
8296
8297char *
8298Perl_sv_pvutf8(pTHX_ SV *sv)
8299{
8300 sv_utf8_upgrade(sv);
8301 return sv_pv(sv);
8302}
8303
645c22ef
DM
8304/*
8305=for apidoc sv_pvutf8
8306
baca2b92 8307Use the C<SvPVutf8_nolen> macro instead
645c22ef 8308
645c22ef
DM
8309=for apidoc sv_pvutf8n
8310
8311A private implementation of the C<SvPVutf8> macro for compilers
8312which can't cope with complex macro expressions. Always use the macro
8313instead.
8314
8315=cut
8316*/
8317
7340a771
GS
8318char *
8319Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
8320{
560a288e 8321 sv_utf8_upgrade(sv);
7340a771
GS
8322 return sv_pvn(sv,lp);
8323}
8324
c461cf8f
JH
8325/*
8326=for apidoc sv_pvutf8n_force
8327
645c22ef
DM
8328A private implementation of the C<SvPVutf8_force> macro for compilers
8329which can't cope with complex macro expressions. Always use the macro
8330instead.
c461cf8f
JH
8331
8332=cut
8333*/
8334
7340a771
GS
8335char *
8336Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
8337{
46ec2f14 8338 sv_pvn_force(sv,lp);
560a288e 8339 sv_utf8_upgrade(sv);
46ec2f14
TS
8340 *lp = SvCUR(sv);
8341 return SvPVX(sv);
7340a771
GS
8342}
8343
c461cf8f
JH
8344/*
8345=for apidoc sv_reftype
8346
8347Returns a string describing what the SV is a reference to.
8348
8349=cut
8350*/
8351
1cb0ed9b 8352char *
bfed75c6 8353Perl_sv_reftype(pTHX_ const SV *sv, int ob)
a0d0e21e 8354{
07409e01
NC
8355 /* The fact that I don't need to downcast to char * everywhere, only in ?:
8356 inside return suggests a const propagation bug in g++. */
c86bf373 8357 if (ob && SvOBJECT(sv)) {
bfcb3514 8358 char *name = HvNAME_get(SvSTASH(sv));
07409e01 8359 return name ? name : (char *) "__ANON__";
c86bf373 8360 }
a0d0e21e
LW
8361 else {
8362 switch (SvTYPE(sv)) {
8363 case SVt_NULL:
8364 case SVt_IV:
8365 case SVt_NV:
8366 case SVt_RV:
8367 case SVt_PV:
8368 case SVt_PVIV:
8369 case SVt_PVNV:
8370 case SVt_PVMG:
8371 case SVt_PVBM:
1cb0ed9b 8372 if (SvVOK(sv))
439cb1c4 8373 return "VSTRING";
a0d0e21e
LW
8374 if (SvROK(sv))
8375 return "REF";
8376 else
8377 return "SCALAR";
1cb0ed9b 8378
07409e01 8379 case SVt_PVLV: return (char *) (SvROK(sv) ? "REF"
be65207d
DM
8380 /* tied lvalues should appear to be
8381 * scalars for backwards compatitbility */
8382 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
07409e01 8383 ? "SCALAR" : "LVALUE");
a0d0e21e
LW
8384 case SVt_PVAV: return "ARRAY";
8385 case SVt_PVHV: return "HASH";
8386 case SVt_PVCV: return "CODE";
8387 case SVt_PVGV: return "GLOB";
1d2dff63 8388 case SVt_PVFM: return "FORMAT";
27f9d8f3 8389 case SVt_PVIO: return "IO";
a0d0e21e
LW
8390 default: return "UNKNOWN";
8391 }
8392 }
8393}
8394
954c1994
GS
8395/*
8396=for apidoc sv_isobject
8397
8398Returns a boolean indicating whether the SV is an RV pointing to a blessed
8399object. If the SV is not an RV, or if the object is not blessed, then this
8400will return false.
8401
8402=cut
8403*/
8404
463ee0b2 8405int
864dbfa3 8406Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 8407{
68dc0745 8408 if (!sv)
8409 return 0;
8410 if (SvGMAGICAL(sv))
8411 mg_get(sv);
85e6fe83
LW
8412 if (!SvROK(sv))
8413 return 0;
8414 sv = (SV*)SvRV(sv);
8415 if (!SvOBJECT(sv))
8416 return 0;
8417 return 1;
8418}
8419
954c1994
GS
8420/*
8421=for apidoc sv_isa
8422
8423Returns a boolean indicating whether the SV is blessed into the specified
8424class. This does not check for subtypes; use C<sv_derived_from> to verify
8425an inheritance relationship.
8426
8427=cut
8428*/
8429
85e6fe83 8430int
864dbfa3 8431Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 8432{
bfcb3514 8433 const char *hvname;
68dc0745 8434 if (!sv)
8435 return 0;
8436 if (SvGMAGICAL(sv))
8437 mg_get(sv);
ed6116ce 8438 if (!SvROK(sv))
463ee0b2 8439 return 0;
ed6116ce
LW
8440 sv = (SV*)SvRV(sv);
8441 if (!SvOBJECT(sv))
463ee0b2 8442 return 0;
bfcb3514
NC
8443 hvname = HvNAME_get(SvSTASH(sv));
8444 if (!hvname)
e27ad1f2 8445 return 0;
463ee0b2 8446
bfcb3514 8447 return strEQ(hvname, name);
463ee0b2
LW
8448}
8449
954c1994
GS
8450/*
8451=for apidoc newSVrv
8452
8453Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
8454it will be upgraded to one. If C<classname> is non-null then the new SV will
8455be blessed in the specified package. The new SV is returned and its
8456reference count is 1.
8457
8458=cut
8459*/
8460
463ee0b2 8461SV*
864dbfa3 8462Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 8463{
463ee0b2
LW
8464 SV *sv;
8465
4561caa4 8466 new_SV(sv);
51cf62d8 8467
765f542d 8468 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 8469 SvAMAGIC_off(rv);
51cf62d8 8470
0199fce9 8471 if (SvTYPE(rv) >= SVt_PVMG) {
a3b680e6 8472 const U32 refcnt = SvREFCNT(rv);
0199fce9
JD
8473 SvREFCNT(rv) = 0;
8474 sv_clear(rv);
8475 SvFLAGS(rv) = 0;
8476 SvREFCNT(rv) = refcnt;
8477 }
8478
51cf62d8 8479 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
8480 sv_upgrade(rv, SVt_RV);
8481 else if (SvTYPE(rv) > SVt_RV) {
8bd4d4c5 8482 SvPV_free(rv);
0199fce9
JD
8483 SvCUR_set(rv, 0);
8484 SvLEN_set(rv, 0);
8485 }
51cf62d8 8486
0c34ef67 8487 SvOK_off(rv);
b162af07 8488 SvRV_set(rv, sv);
ed6116ce 8489 SvROK_on(rv);
463ee0b2 8490
a0d0e21e
LW
8491 if (classname) {
8492 HV* stash = gv_stashpv(classname, TRUE);
8493 (void)sv_bless(rv, stash);
8494 }
8495 return sv;
8496}
8497
954c1994
GS
8498/*
8499=for apidoc sv_setref_pv
8500
8501Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
8502argument will be upgraded to an RV. That RV will be modified to point to
8503the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
8504into the SV. The C<classname> argument indicates the package for the
8505blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8506will have a reference count of 1, and the RV will be returned.
954c1994
GS
8507
8508Do not use with other Perl types such as HV, AV, SV, CV, because those
8509objects will become corrupted by the pointer copy process.
8510
8511Note that C<sv_setref_pvn> copies the string while this copies the pointer.
8512
8513=cut
8514*/
8515
a0d0e21e 8516SV*
864dbfa3 8517Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 8518{
189b2af5 8519 if (!pv) {
3280af22 8520 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
8521 SvSETMAGIC(rv);
8522 }
a0d0e21e 8523 else
56431972 8524 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
8525 return rv;
8526}
8527
954c1994
GS
8528/*
8529=for apidoc sv_setref_iv
8530
8531Copies an integer into a new SV, optionally blessing the SV. The C<rv>
8532argument will be upgraded to an RV. That RV will be modified to point to
8533the new SV. The C<classname> argument indicates the package for the
8534blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8535will have a reference count of 1, and the RV will be returned.
954c1994
GS
8536
8537=cut
8538*/
8539
a0d0e21e 8540SV*
864dbfa3 8541Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
8542{
8543 sv_setiv(newSVrv(rv,classname), iv);
8544 return rv;
8545}
8546
954c1994 8547/*
e1c57cef
JH
8548=for apidoc sv_setref_uv
8549
8550Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
8551argument will be upgraded to an RV. That RV will be modified to point to
8552the new SV. The C<classname> argument indicates the package for the
8553blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8554will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
8555
8556=cut
8557*/
8558
8559SV*
8560Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
8561{
8562 sv_setuv(newSVrv(rv,classname), uv);
8563 return rv;
8564}
8565
8566/*
954c1994
GS
8567=for apidoc sv_setref_nv
8568
8569Copies a double into a new SV, optionally blessing the SV. The C<rv>
8570argument will be upgraded to an RV. That RV will be modified to point to
8571the new SV. The C<classname> argument indicates the package for the
8572blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8573will have a reference count of 1, and the RV will be returned.
954c1994
GS
8574
8575=cut
8576*/
8577
a0d0e21e 8578SV*
65202027 8579Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
8580{
8581 sv_setnv(newSVrv(rv,classname), nv);
8582 return rv;
8583}
463ee0b2 8584
954c1994
GS
8585/*
8586=for apidoc sv_setref_pvn
8587
8588Copies a string into a new SV, optionally blessing the SV. The length of the
8589string must be specified with C<n>. The C<rv> argument will be upgraded to
8590an RV. That RV will be modified to point to the new SV. The C<classname>
8591argument indicates the package for the blessing. Set C<classname> to
7a5fa8a2 8592C<Nullch> to avoid the blessing. The new SV will have a reference count
d34c2299 8593of 1, and the RV will be returned.
954c1994
GS
8594
8595Note that C<sv_setref_pv> copies the pointer while this copies the string.
8596
8597=cut
8598*/
8599
a0d0e21e 8600SV*
864dbfa3 8601Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
8602{
8603 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
8604 return rv;
8605}
8606
954c1994
GS
8607/*
8608=for apidoc sv_bless
8609
8610Blesses an SV into a specified package. The SV must be an RV. The package
8611must be designated by its stash (see C<gv_stashpv()>). The reference count
8612of the SV is unaffected.
8613
8614=cut
8615*/
8616
a0d0e21e 8617SV*
864dbfa3 8618Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 8619{
76e3520e 8620 SV *tmpRef;
a0d0e21e 8621 if (!SvROK(sv))
cea2e8a9 8622 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
8623 tmpRef = SvRV(sv);
8624 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
8625 if (SvREADONLY(tmpRef))
cea2e8a9 8626 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
8627 if (SvOBJECT(tmpRef)) {
8628 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8629 --PL_sv_objcount;
76e3520e 8630 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 8631 }
a0d0e21e 8632 }
76e3520e
GS
8633 SvOBJECT_on(tmpRef);
8634 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8635 ++PL_sv_objcount;
76e3520e 8636 (void)SvUPGRADE(tmpRef, SVt_PVMG);
b162af07 8637 SvSTASH_set(tmpRef, (HV*)SvREFCNT_inc(stash));
a0d0e21e 8638
2e3febc6
CS
8639 if (Gv_AMG(stash))
8640 SvAMAGIC_on(sv);
8641 else
8642 SvAMAGIC_off(sv);
a0d0e21e 8643
1edbfb88
AB
8644 if(SvSMAGICAL(tmpRef))
8645 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8646 mg_set(tmpRef);
8647
8648
ecdeb87c 8649
a0d0e21e
LW
8650 return sv;
8651}
8652
645c22ef 8653/* Downgrades a PVGV to a PVMG.
645c22ef
DM
8654 */
8655
76e3520e 8656STATIC void
cea2e8a9 8657S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 8658{
850fabdf
GS
8659 void *xpvmg;
8660
a0d0e21e
LW
8661 assert(SvTYPE(sv) == SVt_PVGV);
8662 SvFAKE_off(sv);
8663 if (GvGP(sv))
1edc1566 8664 gp_free((GV*)sv);
e826b3c7
GS
8665 if (GvSTASH(sv)) {
8666 SvREFCNT_dec(GvSTASH(sv));
8667 GvSTASH(sv) = Nullhv;
8668 }
14befaf4 8669 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 8670 Safefree(GvNAME(sv));
a5f75d66 8671 GvMULTI_off(sv);
850fabdf
GS
8672
8673 /* need to keep SvANY(sv) in the right arena */
8674 xpvmg = new_XPVMG();
8675 StructCopy(SvANY(sv), xpvmg, XPVMG);
8676 del_XPVGV(SvANY(sv));
8677 SvANY(sv) = xpvmg;
8678
a0d0e21e
LW
8679 SvFLAGS(sv) &= ~SVTYPEMASK;
8680 SvFLAGS(sv) |= SVt_PVMG;
8681}
8682
954c1994 8683/*
840a7b70 8684=for apidoc sv_unref_flags
954c1994
GS
8685
8686Unsets the RV status of the SV, and decrements the reference count of
8687whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
8688as a reversal of C<newSVrv>. The C<cflags> argument can contain
8689C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8690(otherwise the decrementing is conditional on the reference count being
8691different from one or the reference being a readonly SV).
7889fe52 8692See C<SvROK_off>.
954c1994
GS
8693
8694=cut
8695*/
8696
ed6116ce 8697void
840a7b70 8698Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 8699{
a0d0e21e 8700 SV* rv = SvRV(sv);
810b8aa5
GS
8701
8702 if (SvWEAKREF(sv)) {
8703 sv_del_backref(sv);
8704 SvWEAKREF_off(sv);
b162af07 8705 SvRV_set(sv, NULL);
810b8aa5
GS
8706 return;
8707 }
b162af07 8708 SvRV_set(sv, NULL);
ed6116ce 8709 SvROK_off(sv);
04ca4930
NC
8710 /* You can't have a || SvREADONLY(rv) here, as $a = $$a, where $a was
8711 assigned to as BEGIN {$a = \"Foo"} will fail. */
8712 if (SvREFCNT(rv) != 1 || (flags & SV_IMMEDIATE_UNREF))
4633a7c4 8713 SvREFCNT_dec(rv);
840a7b70 8714 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 8715 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 8716}
8990e307 8717
840a7b70
IZ
8718/*
8719=for apidoc sv_unref
8720
8721Unsets the RV status of the SV, and decrements the reference count of
8722whatever was being referenced by the RV. This can almost be thought of
8723as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 8724being zero. See C<SvROK_off>.
840a7b70
IZ
8725
8726=cut
8727*/
8728
8729void
8730Perl_sv_unref(pTHX_ SV *sv)
8731{
8732 sv_unref_flags(sv, 0);
8733}
8734
645c22ef
DM
8735/*
8736=for apidoc sv_taint
8737
8738Taint an SV. Use C<SvTAINTED_on> instead.
8739=cut
8740*/
8741
bbce6d69 8742void
864dbfa3 8743Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 8744{
14befaf4 8745 sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
bbce6d69 8746}
8747
645c22ef
DM
8748/*
8749=for apidoc sv_untaint
8750
8751Untaint an SV. Use C<SvTAINTED_off> instead.
8752=cut
8753*/
8754
bbce6d69 8755void
864dbfa3 8756Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 8757{
13f57bf8 8758 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8759 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 8760 if (mg)
565764a8 8761 mg->mg_len &= ~1;
36477c24 8762 }
bbce6d69 8763}
8764
645c22ef
DM
8765/*
8766=for apidoc sv_tainted
8767
8768Test an SV for taintedness. Use C<SvTAINTED> instead.
8769=cut
8770*/
8771
bbce6d69 8772bool
864dbfa3 8773Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 8774{
13f57bf8 8775 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8776 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
155aba94 8777 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 8778 return TRUE;
8779 }
8780 return FALSE;
bbce6d69 8781}
8782
09540bc3
JH
8783/*
8784=for apidoc sv_setpviv
8785
8786Copies an integer into the given SV, also updating its string value.
8787Does not handle 'set' magic. See C<sv_setpviv_mg>.
8788
8789=cut
8790*/
8791
8792void
8793Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
8794{
8795 char buf[TYPE_CHARS(UV)];
8796 char *ebuf;
8797 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8798
8799 sv_setpvn(sv, ptr, ebuf - ptr);
8800}
8801
8802/*
8803=for apidoc sv_setpviv_mg
8804
8805Like C<sv_setpviv>, but also handles 'set' magic.
8806
8807=cut
8808*/
8809
8810void
8811Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
8812{
8813 char buf[TYPE_CHARS(UV)];
8814 char *ebuf;
8815 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8816
8817 sv_setpvn(sv, ptr, ebuf - ptr);
8818 SvSETMAGIC(sv);
8819}
8820
cea2e8a9 8821#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8822
8823/* pTHX_ magic can't cope with varargs, so this is a no-context
8824 * version of the main function, (which may itself be aliased to us).
8825 * Don't access this version directly.
8826 */
8827
cea2e8a9
GS
8828void
8829Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
8830{
8831 dTHX;
8832 va_list args;
8833 va_start(args, pat);
c5be433b 8834 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
8835 va_end(args);
8836}
8837
645c22ef
DM
8838/* pTHX_ magic can't cope with varargs, so this is a no-context
8839 * version of the main function, (which may itself be aliased to us).
8840 * Don't access this version directly.
8841 */
cea2e8a9
GS
8842
8843void
8844Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
8845{
8846 dTHX;
8847 va_list args;
8848 va_start(args, pat);
c5be433b 8849 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 8850 va_end(args);
cea2e8a9
GS
8851}
8852#endif
8853
954c1994
GS
8854/*
8855=for apidoc sv_setpvf
8856
bffc3d17
SH
8857Works like C<sv_catpvf> but copies the text into the SV instead of
8858appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
8859
8860=cut
8861*/
8862
46fc3d4c 8863void
864dbfa3 8864Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8865{
8866 va_list args;
46fc3d4c 8867 va_start(args, pat);
c5be433b 8868 sv_vsetpvf(sv, pat, &args);
46fc3d4c 8869 va_end(args);
8870}
8871
bffc3d17
SH
8872/*
8873=for apidoc sv_vsetpvf
8874
8875Works like C<sv_vcatpvf> but copies the text into the SV instead of
8876appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
8877
8878Usually used via its frontend C<sv_setpvf>.
8879
8880=cut
8881*/
645c22ef 8882
c5be433b
GS
8883void
8884Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8885{
8886 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8887}
ef50df4b 8888
954c1994
GS
8889/*
8890=for apidoc sv_setpvf_mg
8891
8892Like C<sv_setpvf>, but also handles 'set' magic.
8893
8894=cut
8895*/
8896
ef50df4b 8897void
864dbfa3 8898Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8899{
8900 va_list args;
ef50df4b 8901 va_start(args, pat);
c5be433b 8902 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 8903 va_end(args);
c5be433b
GS
8904}
8905
bffc3d17
SH
8906/*
8907=for apidoc sv_vsetpvf_mg
8908
8909Like C<sv_vsetpvf>, but also handles 'set' magic.
8910
8911Usually used via its frontend C<sv_setpvf_mg>.
8912
8913=cut
8914*/
645c22ef 8915
c5be433b
GS
8916void
8917Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8918{
8919 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
8920 SvSETMAGIC(sv);
8921}
8922
cea2e8a9 8923#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8924
8925/* pTHX_ magic can't cope with varargs, so this is a no-context
8926 * version of the main function, (which may itself be aliased to us).
8927 * Don't access this version directly.
8928 */
8929
cea2e8a9
GS
8930void
8931Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
8932{
8933 dTHX;
8934 va_list args;
8935 va_start(args, pat);
c5be433b 8936 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
8937 va_end(args);
8938}
8939
645c22ef
DM
8940/* pTHX_ magic can't cope with varargs, so this is a no-context
8941 * version of the main function, (which may itself be aliased to us).
8942 * Don't access this version directly.
8943 */
8944
cea2e8a9
GS
8945void
8946Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
8947{
8948 dTHX;
8949 va_list args;
8950 va_start(args, pat);
c5be433b 8951 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 8952 va_end(args);
cea2e8a9
GS
8953}
8954#endif
8955
954c1994
GS
8956/*
8957=for apidoc sv_catpvf
8958
d5ce4a7c
GA
8959Processes its arguments like C<sprintf> and appends the formatted
8960output to an SV. If the appended data contains "wide" characters
8961(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
8962and characters >255 formatted with %c), the original SV might get
bffc3d17 8963upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
8964C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
8965valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 8966
d5ce4a7c 8967=cut */
954c1994 8968
46fc3d4c 8969void
864dbfa3 8970Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8971{
8972 va_list args;
46fc3d4c 8973 va_start(args, pat);
c5be433b 8974 sv_vcatpvf(sv, pat, &args);
46fc3d4c 8975 va_end(args);
8976}
8977
bffc3d17
SH
8978/*
8979=for apidoc sv_vcatpvf
8980
8981Processes its arguments like C<vsprintf> and appends the formatted output
8982to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
8983
8984Usually used via its frontend C<sv_catpvf>.
8985
8986=cut
8987*/
645c22ef 8988
ef50df4b 8989void
c5be433b
GS
8990Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8991{
8992 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8993}
8994
954c1994
GS
8995/*
8996=for apidoc sv_catpvf_mg
8997
8998Like C<sv_catpvf>, but also handles 'set' magic.
8999
9000=cut
9001*/
9002
c5be433b 9003void
864dbfa3 9004Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
9005{
9006 va_list args;
ef50df4b 9007 va_start(args, pat);
c5be433b 9008 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 9009 va_end(args);
c5be433b
GS
9010}
9011
bffc3d17
SH
9012/*
9013=for apidoc sv_vcatpvf_mg
9014
9015Like C<sv_vcatpvf>, but also handles 'set' magic.
9016
9017Usually used via its frontend C<sv_catpvf_mg>.
9018
9019=cut
9020*/
645c22ef 9021
c5be433b
GS
9022void
9023Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
9024{
9025 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
9026 SvSETMAGIC(sv);
9027}
9028
954c1994
GS
9029/*
9030=for apidoc sv_vsetpvfn
9031
bffc3d17 9032Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
9033appending it.
9034
bffc3d17 9035Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 9036
954c1994
GS
9037=cut
9038*/
9039
46fc3d4c 9040void
7d5ea4e7 9041Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 9042{
9043 sv_setpvn(sv, "", 0);
7d5ea4e7 9044 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 9045}
9046
645c22ef
DM
9047/* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
9048
2d00ba3b 9049STATIC I32
9dd79c3f 9050S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
9051{
9052 I32 var = 0;
9053 switch (**pattern) {
9054 case '1': case '2': case '3':
9055 case '4': case '5': case '6':
9056 case '7': case '8': case '9':
9057 while (isDIGIT(**pattern))
9058 var = var * 10 + (*(*pattern)++ - '0');
9059 }
9060 return var;
9061}
9dd79c3f 9062#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 9063
4151a5fe
IZ
9064static char *
9065F0convert(NV nv, char *endbuf, STRLEN *len)
9066{
a3b680e6 9067 const int neg = nv < 0;
4151a5fe
IZ
9068 UV uv;
9069 char *p = endbuf;
9070
9071 if (neg)
9072 nv = -nv;
9073 if (nv < UV_MAX) {
9074 nv += 0.5;
028f8eaa 9075 uv = (UV)nv;
4151a5fe
IZ
9076 if (uv & 1 && uv == nv)
9077 uv--; /* Round to even */
9078 do {
a3b680e6 9079 const unsigned dig = uv % 10;
4151a5fe
IZ
9080 *--p = '0' + dig;
9081 } while (uv /= 10);
9082 if (neg)
9083 *--p = '-';
9084 *len = endbuf - p;
9085 return p;
9086 }
9087 return Nullch;
9088}
9089
9090
954c1994
GS
9091/*
9092=for apidoc sv_vcatpvfn
9093
9094Processes its arguments like C<vsprintf> and appends the formatted output
9095to an SV. Uses an array of SVs if the C style variable argument list is
9096missing (NULL). When running with taint checks enabled, indicates via
9097C<maybe_tainted> if results are untrustworthy (often due to the use of
9098locales).
9099
bffc3d17 9100Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 9101
954c1994
GS
9102=cut
9103*/
9104
1ef29b0e
RGS
9105/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
9106
46fc3d4c 9107void
7d5ea4e7 9108Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 9109{
9110 char *p;
9111 char *q;
a3b680e6 9112 const char *patend;
fc36a67e 9113 STRLEN origlen;
46fc3d4c 9114 I32 svix = 0;
27da23d5 9115 static const char nullstr[] = "(null)";
9c5ffd7c 9116 SV *argsv = Nullsv;
db79b45b
JH
9117 bool has_utf8; /* has the result utf8? */
9118 bool pat_utf8; /* the pattern is in utf8? */
9119 SV *nsv = Nullsv;
4151a5fe
IZ
9120 /* Times 4: a decimal digit takes more than 3 binary digits.
9121 * NV_DIG: mantissa takes than many decimal digits.
9122 * Plus 32: Playing safe. */
9123 char ebuf[IV_DIG * 4 + NV_DIG + 32];
9124 /* large enough for "%#.#f" --chip */
9125 /* what about long double NVs? --jhi */
db79b45b
JH
9126
9127 has_utf8 = pat_utf8 = DO_UTF8(sv);
46fc3d4c 9128
9129 /* no matter what, this is a string now */
fc36a67e 9130 (void)SvPV_force(sv, origlen);
46fc3d4c 9131
0dbb1585 9132 /* special-case "", "%s", and "%-p" (SVf) */
46fc3d4c 9133 if (patlen == 0)
9134 return;
0dbb1585 9135 if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
c635e13b 9136 if (args) {
73d840c0 9137 const char *s = va_arg(*args, char*);
c635e13b 9138 sv_catpv(sv, s ? s : nullstr);
9139 }
7e2040f0 9140 else if (svix < svmax) {
fc36a67e 9141 sv_catsv(sv, *svargs);
7e2040f0
GS
9142 if (DO_UTF8(*svargs))
9143 SvUTF8_on(sv);
9144 }
fc36a67e 9145 return;
0dbb1585
AL
9146 }
9147 if (patlen == 3 && pat[0] == '%' &&
9148 pat[1] == '-' && pat[2] == 'p') {
fc36a67e 9149 if (args) {
7e2040f0
GS
9150 argsv = va_arg(*args, SV*);
9151 sv_catsv(sv, argsv);
9152 if (DO_UTF8(argsv))
9153 SvUTF8_on(sv);
fc36a67e 9154 return;
9155 }
46fc3d4c 9156 }
9157
1d917b39 9158#ifndef USE_LONG_DOUBLE
4151a5fe
IZ
9159 /* special-case "%.<number>[gf]" */
9160 if ( patlen <= 5 && pat[0] == '%' && pat[1] == '.'
9161 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
9162 unsigned digits = 0;
9163 const char *pp;
9164
9165 pp = pat + 2;
9166 while (*pp >= '0' && *pp <= '9')
9167 digits = 10 * digits + (*pp++ - '0');
028f8eaa 9168 if (pp - pat == (int)patlen - 1) {
4151a5fe
IZ
9169 NV nv;
9170
9171 if (args)
9172 nv = (NV)va_arg(*args, double);
9173 else if (svix < svmax)
9174 nv = SvNV(*svargs);
9175 else
9176 return;
9177 if (*pp == 'g') {
2873255c
NC
9178 /* Add check for digits != 0 because it seems that some
9179 gconverts are buggy in this case, and we don't yet have
9180 a Configure test for this. */
9181 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
9182 /* 0, point, slack */
2e59c212 9183 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
9184 sv_catpv(sv, ebuf);
9185 if (*ebuf) /* May return an empty string for digits==0 */
9186 return;
9187 }
9188 } else if (!digits) {
9189 STRLEN l;
9190
9191 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
9192 sv_catpvn(sv, p, l);
9193 return;
9194 }
9195 }
9196 }
9197 }
1d917b39 9198#endif /* !USE_LONG_DOUBLE */
4151a5fe 9199
2cf2cfc6 9200 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 9201 has_utf8 = TRUE;
2cf2cfc6 9202
46fc3d4c 9203 patend = (char*)pat + patlen;
9204 for (p = (char*)pat; p < patend; p = q) {
9205 bool alt = FALSE;
9206 bool left = FALSE;
b22c7a20 9207 bool vectorize = FALSE;
211dfcf1 9208 bool vectorarg = FALSE;
2cf2cfc6 9209 bool vec_utf8 = FALSE;
46fc3d4c 9210 char fill = ' ';
9211 char plus = 0;
9212 char intsize = 0;
9213 STRLEN width = 0;
fc36a67e 9214 STRLEN zeros = 0;
46fc3d4c 9215 bool has_precis = FALSE;
9216 STRLEN precis = 0;
58e33a90 9217 I32 osvix = svix;
2cf2cfc6 9218 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
9219#ifdef HAS_LDBL_SPRINTF_BUG
9220 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 9221 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
9222 bool fix_ldbl_sprintf_bug = FALSE;
9223#endif
205f51d8 9224
46fc3d4c 9225 char esignbuf[4];
89ebb4a3 9226 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 9227 STRLEN esignlen = 0;
9228
9229 char *eptr = Nullch;
fc36a67e 9230 STRLEN elen = 0;
81f715da 9231 SV *vecsv = Nullsv;
a05b299f 9232 U8 *vecstr = Null(U8*);
b22c7a20 9233 STRLEN veclen = 0;
934abaf1 9234 char c = 0;
46fc3d4c 9235 int i;
9c5ffd7c 9236 unsigned base = 0;
8c8eb53c
RB
9237 IV iv = 0;
9238 UV uv = 0;
9e5b023a
JH
9239 /* we need a long double target in case HAS_LONG_DOUBLE but
9240 not USE_LONG_DOUBLE
9241 */
35fff930 9242#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
9243 long double nv;
9244#else
65202027 9245 NV nv;
9e5b023a 9246#endif
46fc3d4c 9247 STRLEN have;
9248 STRLEN need;
9249 STRLEN gap;
e1ec3a88 9250 const char *dotstr = ".";
b22c7a20 9251 STRLEN dotstrlen = 1;
211dfcf1 9252 I32 efix = 0; /* explicit format parameter index */
eb3fce90 9253 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
9254 I32 epix = 0; /* explicit precision index */
9255 I32 evix = 0; /* explicit vector index */
eb3fce90 9256 bool asterisk = FALSE;
46fc3d4c 9257
211dfcf1 9258 /* echo everything up to the next format specification */
46fc3d4c 9259 for (q = p; q < patend && *q != '%'; ++q) ;
9260 if (q > p) {
db79b45b
JH
9261 if (has_utf8 && !pat_utf8)
9262 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
9263 else
9264 sv_catpvn(sv, p, q - p);
46fc3d4c 9265 p = q;
9266 }
9267 if (q++ >= patend)
9268 break;
9269
211dfcf1
HS
9270/*
9271 We allow format specification elements in this order:
9272 \d+\$ explicit format parameter index
9273 [-+ 0#]+ flags
a472f209 9274 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 9275 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
9276 \d+|\*(\d+\$)? width using optional (optionally specified) arg
9277 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
9278 [hlqLV] size
9279 [%bcdefginopsux_DFOUX] format (mandatory)
9280*/
9281 if (EXPECT_NUMBER(q, width)) {
9282 if (*q == '$') {
9283 ++q;
9284 efix = width;
9285 } else {
9286 goto gotwidth;
9287 }
9288 }
9289
fc36a67e 9290 /* FLAGS */
9291
46fc3d4c 9292 while (*q) {
9293 switch (*q) {
9294 case ' ':
9295 case '+':
9296 plus = *q++;
9297 continue;
9298
9299 case '-':
9300 left = TRUE;
9301 q++;
9302 continue;
9303
9304 case '0':
9305 fill = *q++;
9306 continue;
9307
9308 case '#':
9309 alt = TRUE;
9310 q++;
9311 continue;
9312
fc36a67e 9313 default:
9314 break;
9315 }
9316 break;
9317 }
46fc3d4c 9318
211dfcf1 9319 tryasterisk:
eb3fce90 9320 if (*q == '*') {
211dfcf1
HS
9321 q++;
9322 if (EXPECT_NUMBER(q, ewix))
9323 if (*q++ != '$')
9324 goto unknown;
eb3fce90 9325 asterisk = TRUE;
211dfcf1
HS
9326 }
9327 if (*q == 'v') {
eb3fce90 9328 q++;
211dfcf1
HS
9329 if (vectorize)
9330 goto unknown;
9cbac4c7 9331 if ((vectorarg = asterisk)) {
211dfcf1
HS
9332 evix = ewix;
9333 ewix = 0;
9334 asterisk = FALSE;
9335 }
9336 vectorize = TRUE;
9337 goto tryasterisk;
eb3fce90
JH
9338 }
9339
211dfcf1 9340 if (!asterisk)
7a5fa8a2 9341 if( *q == '0' )
f3583277 9342 fill = *q++;
211dfcf1
HS
9343 EXPECT_NUMBER(q, width);
9344
9345 if (vectorize) {
9346 if (vectorarg) {
9347 if (args)
9348 vecsv = va_arg(*args, SV*);
9349 else
9350 vecsv = (evix ? evix <= svmax : svix < svmax) ?
3a7a539e 9351 svargs[evix ? evix-1 : svix++] : &PL_sv_undef;
4459522c 9352 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1 9353 if (DO_UTF8(vecsv))
2cf2cfc6 9354 is_utf8 = TRUE;
211dfcf1
HS
9355 }
9356 if (args) {
9357 vecsv = va_arg(*args, SV*);
9358 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 9359 vec_utf8 = DO_UTF8(vecsv);
eb3fce90 9360 }
211dfcf1
HS
9361 else if (efix ? efix <= svmax : svix < svmax) {
9362 vecsv = svargs[efix ? efix-1 : svix++];
9363 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 9364 vec_utf8 = DO_UTF8(vecsv);
d7aa5382
JP
9365 /* if this is a version object, we need to return the
9366 * stringified representation (which the SvPVX has
9367 * already done for us), but not vectorize the args
9368 */
9369 if ( *q == 'd' && sv_derived_from(vecsv,"version") )
9370 {
9371 q++; /* skip past the rest of the %vd format */
da6068d9 9372 eptr = (char *) vecstr;
d7aa5382
JP
9373 elen = strlen(eptr);
9374 vectorize=FALSE;
9375 goto string;
9376 }
211dfcf1
HS
9377 }
9378 else {
9379 vecstr = (U8*)"";
9380 veclen = 0;
9381 }
eb3fce90 9382 }
fc36a67e 9383
eb3fce90 9384 if (asterisk) {
fc36a67e 9385 if (args)
9386 i = va_arg(*args, int);
9387 else
eb3fce90
JH
9388 i = (ewix ? ewix <= svmax : svix < svmax) ?
9389 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 9390 left |= (i < 0);
9391 width = (i < 0) ? -i : i;
fc36a67e 9392 }
211dfcf1 9393 gotwidth:
fc36a67e 9394
9395 /* PRECISION */
46fc3d4c 9396
fc36a67e 9397 if (*q == '.') {
9398 q++;
9399 if (*q == '*') {
211dfcf1 9400 q++;
7b8dd722
HS
9401 if (EXPECT_NUMBER(q, epix) && *q++ != '$')
9402 goto unknown;
9403 /* XXX: todo, support specified precision parameter */
9404 if (epix)
211dfcf1 9405 goto unknown;
46fc3d4c 9406 if (args)
9407 i = va_arg(*args, int);
9408 else
eb3fce90
JH
9409 i = (ewix ? ewix <= svmax : svix < svmax)
9410 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 9411 precis = (i < 0) ? 0 : i;
fc36a67e 9412 }
9413 else {
9414 precis = 0;
9415 while (isDIGIT(*q))
9416 precis = precis * 10 + (*q++ - '0');
9417 }
9418 has_precis = TRUE;
9419 }
46fc3d4c 9420
fc36a67e 9421 /* SIZE */
46fc3d4c 9422
fc36a67e 9423 switch (*q) {
c623ac67
GS
9424#ifdef WIN32
9425 case 'I': /* Ix, I32x, and I64x */
9426# ifdef WIN64
9427 if (q[1] == '6' && q[2] == '4') {
9428 q += 3;
9429 intsize = 'q';
9430 break;
9431 }
9432# endif
9433 if (q[1] == '3' && q[2] == '2') {
9434 q += 3;
9435 break;
9436 }
9437# ifdef WIN64
9438 intsize = 'q';
9439# endif
9440 q++;
9441 break;
9442#endif
9e5b023a 9443#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 9444 case 'L': /* Ld */
e5c81feb 9445 /* FALL THROUGH */
e5c81feb 9446#ifdef HAS_QUAD
6f9bb7fd 9447 case 'q': /* qd */
9e5b023a 9448#endif
6f9bb7fd
GS
9449 intsize = 'q';
9450 q++;
9451 break;
9452#endif
fc36a67e 9453 case 'l':
9e5b023a 9454#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 9455 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 9456 intsize = 'q';
9457 q += 2;
46fc3d4c 9458 break;
cf2093f6 9459 }
fc36a67e 9460#endif
6f9bb7fd 9461 /* FALL THROUGH */
fc36a67e 9462 case 'h':
cf2093f6 9463 /* FALL THROUGH */
fc36a67e 9464 case 'V':
9465 intsize = *q++;
46fc3d4c 9466 break;
9467 }
9468
fc36a67e 9469 /* CONVERSION */
9470
211dfcf1
HS
9471 if (*q == '%') {
9472 eptr = q++;
9473 elen = 1;
9474 goto string;
9475 }
9476
be75b157
HS
9477 if (vectorize)
9478 argsv = vecsv;
9479 else if (!args)
211dfcf1
HS
9480 argsv = (efix ? efix <= svmax : svix < svmax) ?
9481 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
9482
46fc3d4c 9483 switch (c = *q++) {
9484
9485 /* STRINGS */
9486
46fc3d4c 9487 case 'c':
be75b157 9488 uv = (args && !vectorize) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
9489 if ((uv > 255 ||
9490 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 9491 && !IN_BYTES) {
dfe13c55 9492 eptr = (char*)utf8buf;
9041c2e3 9493 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 9494 is_utf8 = TRUE;
7e2040f0
GS
9495 }
9496 else {
9497 c = (char)uv;
9498 eptr = &c;
9499 elen = 1;
a0ed51b3 9500 }
46fc3d4c 9501 goto string;
9502
46fc3d4c 9503 case 's':
be75b157 9504 if (args && !vectorize) {
fc36a67e 9505 eptr = va_arg(*args, char*);
c635e13b 9506 if (eptr)
1d7c1841
GS
9507#ifdef MACOS_TRADITIONAL
9508 /* On MacOS, %#s format is used for Pascal strings */
9509 if (alt)
9510 elen = *eptr++;
9511 else
9512#endif
c635e13b 9513 elen = strlen(eptr);
9514 else {
27da23d5 9515 eptr = (char *)nullstr;
c635e13b 9516 elen = sizeof nullstr - 1;
9517 }
46fc3d4c 9518 }
211dfcf1 9519 else {
7e2040f0
GS
9520 eptr = SvPVx(argsv, elen);
9521 if (DO_UTF8(argsv)) {
a0ed51b3
LW
9522 if (has_precis && precis < elen) {
9523 I32 p = precis;
7e2040f0 9524 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
9525 precis = p;
9526 }
9527 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 9528 width += elen - sv_len_utf8(argsv);
a0ed51b3 9529 }
2cf2cfc6 9530 is_utf8 = TRUE;
a0ed51b3
LW
9531 }
9532 }
fc36a67e 9533
46fc3d4c 9534 string:
b22c7a20 9535 vectorize = FALSE;
46fc3d4c 9536 if (has_precis && elen > precis)
9537 elen = precis;
9538 break;
9539
9540 /* INTEGERS */
9541
fc36a67e 9542 case 'p':
0dbb1585 9543 if (left && args) { /* SVf */
5df617be 9544 left = FALSE;
0dbb1585
AL
9545 if (width) {
9546 precis = width;
9547 has_precis = TRUE;
9548 width = 0;
9549 }
9550 if (vectorize)
9551 goto unknown;
9552 argsv = va_arg(*args, SV*);
9553 eptr = SvPVx(argsv, elen);
9554 if (DO_UTF8(argsv))
9555 is_utf8 = TRUE;
9556 goto string;
5df617be 9557 }
be75b157 9558 if (alt || vectorize)
c2e66d9e 9559 goto unknown;
211dfcf1 9560 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 9561 base = 16;
9562 goto integer;
9563
46fc3d4c 9564 case 'D':
29fe7a80 9565#ifdef IV_IS_QUAD
22f3ae8c 9566 intsize = 'q';
29fe7a80 9567#else
46fc3d4c 9568 intsize = 'l';
29fe7a80 9569#endif
46fc3d4c 9570 /* FALL THROUGH */
9571 case 'd':
9572 case 'i':
b22c7a20 9573 if (vectorize) {
ba210ebe 9574 STRLEN ulen;
211dfcf1
HS
9575 if (!veclen)
9576 continue;
2cf2cfc6
A
9577 if (vec_utf8)
9578 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9579 UTF8_ALLOW_ANYUV);
b22c7a20 9580 else {
e83d50c9 9581 uv = *vecstr;
b22c7a20
GS
9582 ulen = 1;
9583 }
9584 vecstr += ulen;
9585 veclen -= ulen;
e83d50c9
JP
9586 if (plus)
9587 esignbuf[esignlen++] = plus;
b22c7a20
GS
9588 }
9589 else if (args) {
46fc3d4c 9590 switch (intsize) {
9591 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 9592 case 'l': iv = va_arg(*args, long); break;
fc36a67e 9593 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 9594 default: iv = va_arg(*args, int); break;
cf2093f6
JH
9595#ifdef HAS_QUAD
9596 case 'q': iv = va_arg(*args, Quad_t); break;
9597#endif
46fc3d4c 9598 }
9599 }
9600 else {
b10c0dba 9601 IV tiv = SvIVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 9602 switch (intsize) {
b10c0dba
MHM
9603 case 'h': iv = (short)tiv; break;
9604 case 'l': iv = (long)tiv; break;
9605 case 'V':
9606 default: iv = tiv; break;
cf2093f6 9607#ifdef HAS_QUAD
b10c0dba 9608 case 'q': iv = (Quad_t)tiv; break;
cf2093f6 9609#endif
46fc3d4c 9610 }
9611 }
e83d50c9
JP
9612 if ( !vectorize ) /* we already set uv above */
9613 {
9614 if (iv >= 0) {
9615 uv = iv;
9616 if (plus)
9617 esignbuf[esignlen++] = plus;
9618 }
9619 else {
9620 uv = -iv;
9621 esignbuf[esignlen++] = '-';
9622 }
46fc3d4c 9623 }
9624 base = 10;
9625 goto integer;
9626
fc36a67e 9627 case 'U':
29fe7a80 9628#ifdef IV_IS_QUAD
22f3ae8c 9629 intsize = 'q';
29fe7a80 9630#else
fc36a67e 9631 intsize = 'l';
29fe7a80 9632#endif
fc36a67e 9633 /* FALL THROUGH */
9634 case 'u':
9635 base = 10;
9636 goto uns_integer;
9637
4f19785b
WSI
9638 case 'b':
9639 base = 2;
9640 goto uns_integer;
9641
46fc3d4c 9642 case 'O':
29fe7a80 9643#ifdef IV_IS_QUAD
22f3ae8c 9644 intsize = 'q';
29fe7a80 9645#else
46fc3d4c 9646 intsize = 'l';
29fe7a80 9647#endif
46fc3d4c 9648 /* FALL THROUGH */
9649 case 'o':
9650 base = 8;
9651 goto uns_integer;
9652
9653 case 'X':
46fc3d4c 9654 case 'x':
9655 base = 16;
46fc3d4c 9656
9657 uns_integer:
b22c7a20 9658 if (vectorize) {
ba210ebe 9659 STRLEN ulen;
b22c7a20 9660 vector:
211dfcf1
HS
9661 if (!veclen)
9662 continue;
2cf2cfc6
A
9663 if (vec_utf8)
9664 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9665 UTF8_ALLOW_ANYUV);
b22c7a20 9666 else {
a05b299f 9667 uv = *vecstr;
b22c7a20
GS
9668 ulen = 1;
9669 }
9670 vecstr += ulen;
9671 veclen -= ulen;
9672 }
9673 else if (args) {
46fc3d4c 9674 switch (intsize) {
9675 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 9676 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 9677 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 9678 default: uv = va_arg(*args, unsigned); break;
cf2093f6 9679#ifdef HAS_QUAD
9e3321a5 9680 case 'q': uv = va_arg(*args, Uquad_t); break;
cf2093f6 9681#endif
46fc3d4c 9682 }
9683 }
9684 else {
b10c0dba 9685 UV tuv = SvUVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 9686 switch (intsize) {
b10c0dba
MHM
9687 case 'h': uv = (unsigned short)tuv; break;
9688 case 'l': uv = (unsigned long)tuv; break;
9689 case 'V':
9690 default: uv = tuv; break;
cf2093f6 9691#ifdef HAS_QUAD
b10c0dba 9692 case 'q': uv = (Uquad_t)tuv; break;
cf2093f6 9693#endif
46fc3d4c 9694 }
9695 }
9696
9697 integer:
46fc3d4c 9698 eptr = ebuf + sizeof ebuf;
fc36a67e 9699 switch (base) {
9700 unsigned dig;
9701 case 16:
c10ed8b9
HS
9702 if (!uv)
9703 alt = FALSE;
1d7c1841
GS
9704 p = (char*)((c == 'X')
9705 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 9706 do {
9707 dig = uv & 15;
9708 *--eptr = p[dig];
9709 } while (uv >>= 4);
9710 if (alt) {
46fc3d4c 9711 esignbuf[esignlen++] = '0';
fc36a67e 9712 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 9713 }
fc36a67e 9714 break;
9715 case 8:
9716 do {
9717 dig = uv & 7;
9718 *--eptr = '0' + dig;
9719 } while (uv >>= 3);
9720 if (alt && *eptr != '0')
9721 *--eptr = '0';
9722 break;
4f19785b
WSI
9723 case 2:
9724 do {
9725 dig = uv & 1;
9726 *--eptr = '0' + dig;
9727 } while (uv >>= 1);
eda88b6d
JH
9728 if (alt) {
9729 esignbuf[esignlen++] = '0';
7481bb52 9730 esignbuf[esignlen++] = 'b';
eda88b6d 9731 }
4f19785b 9732 break;
fc36a67e 9733 default: /* it had better be ten or less */
9734 do {
9735 dig = uv % base;
9736 *--eptr = '0' + dig;
9737 } while (uv /= base);
9738 break;
46fc3d4c 9739 }
9740 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
9741 if (has_precis) {
9742 if (precis > elen)
9743 zeros = precis - elen;
9744 else if (precis == 0 && elen == 1 && *eptr == '0')
9745 elen = 0;
9746 }
46fc3d4c 9747 break;
9748
9749 /* FLOATING POINT */
9750
fc36a67e 9751 case 'F':
9752 c = 'f'; /* maybe %F isn't supported here */
9753 /* FALL THROUGH */
46fc3d4c 9754 case 'e': case 'E':
fc36a67e 9755 case 'f':
46fc3d4c 9756 case 'g': case 'G':
9757
9758 /* This is evil, but floating point is even more evil */
9759
9e5b023a
JH
9760 /* for SV-style calling, we can only get NV
9761 for C-style calling, we assume %f is double;
9762 for simplicity we allow any of %Lf, %llf, %qf for long double
9763 */
9764 switch (intsize) {
9765 case 'V':
9766#if defined(USE_LONG_DOUBLE)
9767 intsize = 'q';
9768#endif
9769 break;
8a2e3f14 9770/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364
HS
9771 case 'l':
9772 /* FALL THROUGH */
9e5b023a
JH
9773 default:
9774#if defined(USE_LONG_DOUBLE)
9775 intsize = args ? 0 : 'q';
9776#endif
9777 break;
9778 case 'q':
9779#if defined(HAS_LONG_DOUBLE)
9780 break;
9781#else
9782 /* FALL THROUGH */
9783#endif
9784 case 'h':
9e5b023a
JH
9785 goto unknown;
9786 }
9787
9788 /* now we need (long double) if intsize == 'q', else (double) */
be75b157 9789 nv = (args && !vectorize) ?
35fff930
JH
9790#if LONG_DOUBLESIZE > DOUBLESIZE
9791 intsize == 'q' ?
205f51d8
AS
9792 va_arg(*args, long double) :
9793 va_arg(*args, double)
35fff930 9794#else
205f51d8 9795 va_arg(*args, double)
35fff930 9796#endif
9e5b023a 9797 : SvNVx(argsv);
fc36a67e 9798
9799 need = 0;
be75b157 9800 vectorize = FALSE;
fc36a67e 9801 if (c != 'e' && c != 'E') {
9802 i = PERL_INT_MIN;
9e5b023a
JH
9803 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9804 will cast our (long double) to (double) */
73b309ea 9805 (void)Perl_frexp(nv, &i);
fc36a67e 9806 if (i == PERL_INT_MIN)
cea2e8a9 9807 Perl_die(aTHX_ "panic: frexp");
c635e13b 9808 if (i > 0)
fc36a67e 9809 need = BIT_DIGITS(i);
9810 }
9811 need += has_precis ? precis : 6; /* known default */
20f6aaab 9812
fc36a67e 9813 if (need < width)
9814 need = width;
9815
20f6aaab
AS
9816#ifdef HAS_LDBL_SPRINTF_BUG
9817 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9818 with sfio - Allen <allens@cpan.org> */
9819
9820# ifdef DBL_MAX
9821# define MY_DBL_MAX DBL_MAX
9822# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9823# if DOUBLESIZE >= 8
9824# define MY_DBL_MAX 1.7976931348623157E+308L
9825# else
9826# define MY_DBL_MAX 3.40282347E+38L
9827# endif
9828# endif
9829
9830# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9831# define MY_DBL_MAX_BUG 1L
20f6aaab 9832# else
205f51d8 9833# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9834# endif
20f6aaab 9835
205f51d8
AS
9836# ifdef DBL_MIN
9837# define MY_DBL_MIN DBL_MIN
9838# else /* XXX guessing! -Allen */
9839# if DOUBLESIZE >= 8
9840# define MY_DBL_MIN 2.2250738585072014E-308L
9841# else
9842# define MY_DBL_MIN 1.17549435E-38L
9843# endif
9844# endif
20f6aaab 9845
205f51d8
AS
9846 if ((intsize == 'q') && (c == 'f') &&
9847 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9848 (need < DBL_DIG)) {
9849 /* it's going to be short enough that
9850 * long double precision is not needed */
9851
9852 if ((nv <= 0L) && (nv >= -0L))
9853 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9854 else {
9855 /* would use Perl_fp_class as a double-check but not
9856 * functional on IRIX - see perl.h comments */
9857
9858 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9859 /* It's within the range that a double can represent */
9860#if defined(DBL_MAX) && !defined(DBL_MIN)
9861 if ((nv >= ((long double)1/DBL_MAX)) ||
9862 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9863#endif
205f51d8 9864 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9865 }
205f51d8
AS
9866 }
9867 if (fix_ldbl_sprintf_bug == TRUE) {
9868 double temp;
9869
9870 intsize = 0;
9871 temp = (double)nv;
9872 nv = (NV)temp;
9873 }
20f6aaab 9874 }
205f51d8
AS
9875
9876# undef MY_DBL_MAX
9877# undef MY_DBL_MAX_BUG
9878# undef MY_DBL_MIN
9879
20f6aaab
AS
9880#endif /* HAS_LDBL_SPRINTF_BUG */
9881
46fc3d4c 9882 need += 20; /* fudge factor */
80252599
GS
9883 if (PL_efloatsize < need) {
9884 Safefree(PL_efloatbuf);
9885 PL_efloatsize = need + 20; /* more fudge */
9886 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9887 PL_efloatbuf[0] = '\0';
46fc3d4c 9888 }
9889
4151a5fe
IZ
9890 if ( !(width || left || plus || alt) && fill != '0'
9891 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
9892 /* See earlier comment about buggy Gconvert when digits,
9893 aka precis is 0 */
9894 if ( c == 'g' && precis) {
2e59c212 9895 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4151a5fe
IZ
9896 if (*PL_efloatbuf) /* May return an empty string for digits==0 */
9897 goto float_converted;
9898 } else if ( c == 'f' && !precis) {
9899 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9900 break;
9901 }
9902 }
46fc3d4c 9903 eptr = ebuf + sizeof ebuf;
9904 *--eptr = '\0';
9905 *--eptr = c;
9e5b023a
JH
9906 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9907#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
9908 if (intsize == 'q') {
e5c81feb
JH
9909 /* Copy the one or more characters in a long double
9910 * format before the 'base' ([efgEFG]) character to
9911 * the format string. */
9912 static char const prifldbl[] = PERL_PRIfldbl;
9913 char const *p = prifldbl + sizeof(prifldbl) - 3;
9914 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 9915 }
65202027 9916#endif
46fc3d4c 9917 if (has_precis) {
9918 base = precis;
9919 do { *--eptr = '0' + (base % 10); } while (base /= 10);
9920 *--eptr = '.';
9921 }
9922 if (width) {
9923 base = width;
9924 do { *--eptr = '0' + (base % 10); } while (base /= 10);
9925 }
9926 if (fill == '0')
9927 *--eptr = fill;
84902520
TB
9928 if (left)
9929 *--eptr = '-';
46fc3d4c 9930 if (plus)
9931 *--eptr = plus;
9932 if (alt)
9933 *--eptr = '#';
9934 *--eptr = '%';
9935
ff9121f8
JH
9936 /* No taint. Otherwise we are in the strange situation
9937 * where printf() taints but print($float) doesn't.
bda0f7a5 9938 * --jhi */
9e5b023a
JH
9939#if defined(HAS_LONG_DOUBLE)
9940 if (intsize == 'q')
9941 (void)sprintf(PL_efloatbuf, eptr, nv);
9942 else
9943 (void)sprintf(PL_efloatbuf, eptr, (double)nv);
9944#else
dd8482fc 9945 (void)sprintf(PL_efloatbuf, eptr, nv);
9e5b023a 9946#endif
4151a5fe 9947 float_converted:
80252599
GS
9948 eptr = PL_efloatbuf;
9949 elen = strlen(PL_efloatbuf);
46fc3d4c 9950 break;
9951
fc36a67e 9952 /* SPECIAL */
9953
9954 case 'n':
9955 i = SvCUR(sv) - origlen;
be75b157 9956 if (args && !vectorize) {
c635e13b 9957 switch (intsize) {
9958 case 'h': *(va_arg(*args, short*)) = i; break;
9959 default: *(va_arg(*args, int*)) = i; break;
9960 case 'l': *(va_arg(*args, long*)) = i; break;
9961 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
9962#ifdef HAS_QUAD
9963 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
9964#endif
c635e13b 9965 }
fc36a67e 9966 }
9dd79c3f 9967 else
211dfcf1 9968 sv_setuv_mg(argsv, (UV)i);
be75b157 9969 vectorize = FALSE;
fc36a67e 9970 continue; /* not "break" */
9971
9972 /* UNKNOWN */
9973
46fc3d4c 9974 default:
fc36a67e 9975 unknown:
599cee73 9976 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 9977 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 9978 SV *msg = sv_newmortal();
35c1215d
NC
9979 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9980 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 9981 if (c) {
0f4b6630 9982 if (isPRINT(c))
1c846c1f 9983 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
9984 "\"%%%c\"", c & 0xFF);
9985 else
9986 Perl_sv_catpvf(aTHX_ msg,
57def98f 9987 "\"%%\\%03"UVof"\"",
0f4b6630 9988 (UV)c & 0xFF);
0f4b6630 9989 } else
c635e13b 9990 sv_catpv(msg, "end of string");
9014280d 9991 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 9992 }
fb73857a 9993
9994 /* output mangled stuff ... */
9995 if (c == '\0')
9996 --q;
46fc3d4c 9997 eptr = p;
9998 elen = q - p;
fb73857a 9999
10000 /* ... right here, because formatting flags should not apply */
10001 SvGROW(sv, SvCUR(sv) + elen + 1);
10002 p = SvEND(sv);
4459522c 10003 Copy(eptr, p, elen, char);
fb73857a 10004 p += elen;
10005 *p = '\0';
b162af07 10006 SvCUR_set(sv, p - SvPVX(sv));
58e33a90 10007 svix = osvix;
fb73857a 10008 continue; /* not "break" */
46fc3d4c 10009 }
10010
6c94ec8b
HS
10011 /* calculate width before utf8_upgrade changes it */
10012 have = esignlen + zeros + elen;
10013
d2876be5
JH
10014 if (is_utf8 != has_utf8) {
10015 if (is_utf8) {
10016 if (SvCUR(sv))
10017 sv_utf8_upgrade(sv);
10018 }
10019 else {
10020 SV *nsv = sv_2mortal(newSVpvn(eptr, elen));
10021 sv_utf8_upgrade(nsv);
10022 eptr = SvPVX(nsv);
10023 elen = SvCUR(nsv);
10024 }
10025 SvGROW(sv, SvCUR(sv) + elen + 1);
10026 p = SvEND(sv);
10027 *p = '\0';
10028 }
6af65485 10029
46fc3d4c 10030 need = (have > width ? have : width);
10031 gap = need - have;
10032
b22c7a20 10033 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 10034 p = SvEND(sv);
10035 if (esignlen && fill == '0') {
eb160463 10036 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10037 *p++ = esignbuf[i];
10038 }
10039 if (gap && !left) {
10040 memset(p, fill, gap);
10041 p += gap;
10042 }
10043 if (esignlen && fill != '0') {
eb160463 10044 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10045 *p++ = esignbuf[i];
10046 }
fc36a67e 10047 if (zeros) {
10048 for (i = zeros; i; i--)
10049 *p++ = '0';
10050 }
46fc3d4c 10051 if (elen) {
4459522c 10052 Copy(eptr, p, elen, char);
46fc3d4c 10053 p += elen;
10054 }
10055 if (gap && left) {
10056 memset(p, ' ', gap);
10057 p += gap;
10058 }
b22c7a20
GS
10059 if (vectorize) {
10060 if (veclen) {
4459522c 10061 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
10062 p += dotstrlen;
10063 }
10064 else
10065 vectorize = FALSE; /* done iterating over vecstr */
10066 }
2cf2cfc6
A
10067 if (is_utf8)
10068 has_utf8 = TRUE;
10069 if (has_utf8)
7e2040f0 10070 SvUTF8_on(sv);
46fc3d4c 10071 *p = '\0';
b162af07 10072 SvCUR_set(sv, p - SvPVX(sv));
b22c7a20
GS
10073 if (vectorize) {
10074 esignlen = 0;
10075 goto vector;
10076 }
46fc3d4c 10077 }
10078}
51371543 10079
645c22ef
DM
10080/* =========================================================================
10081
10082=head1 Cloning an interpreter
10083
10084All the macros and functions in this section are for the private use of
10085the main function, perl_clone().
10086
10087The foo_dup() functions make an exact copy of an existing foo thinngy.
10088During the course of a cloning, a hash table is used to map old addresses
10089to new addresses. The table is created and manipulated with the
10090ptr_table_* functions.
10091
10092=cut
10093
10094============================================================================*/
10095
10096
1d7c1841
GS
10097#if defined(USE_ITHREADS)
10098
1d7c1841
GS
10099#ifndef GpREFCNT_inc
10100# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
10101#endif
10102
10103
d2d73c3e
AB
10104#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
10105#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
10106#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10107#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
10108#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10109#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
10110#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10111#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
10112#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
10113#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
10114#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
10115#define SAVEPV(p) (p ? savepv(p) : Nullch)
10116#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 10117
d2d73c3e 10118
d2f185dc
AMS
10119/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
10120 regcomp.c. AMS 20010712 */
645c22ef 10121
1d7c1841 10122REGEXP *
a8fc9800 10123Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
1d7c1841 10124{
27da23d5 10125 dVAR;
d2f185dc
AMS
10126 REGEXP *ret;
10127 int i, len, npar;
10128 struct reg_substr_datum *s;
10129
10130 if (!r)
10131 return (REGEXP *)NULL;
10132
10133 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
10134 return ret;
10135
10136 len = r->offsets[0];
10137 npar = r->nparens+1;
10138
10139 Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
10140 Copy(r->program, ret->program, len+1, regnode);
10141
10142 New(0, ret->startp, npar, I32);
10143 Copy(r->startp, ret->startp, npar, I32);
10144 New(0, ret->endp, npar, I32);
10145 Copy(r->startp, ret->startp, npar, I32);
10146
d2f185dc
AMS
10147 New(0, ret->substrs, 1, struct reg_substr_data);
10148 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
10149 s->min_offset = r->substrs->data[i].min_offset;
10150 s->max_offset = r->substrs->data[i].max_offset;
10151 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 10152 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
10153 }
10154
70612e96 10155 ret->regstclass = NULL;
d2f185dc
AMS
10156 if (r->data) {
10157 struct reg_data *d;
e1ec3a88 10158 const int count = r->data->count;
d2f185dc
AMS
10159
10160 Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
10161 char, struct reg_data);
10162 New(0, d->what, count, U8);
10163
10164 d->count = count;
10165 for (i = 0; i < count; i++) {
10166 d->what[i] = r->data->what[i];
10167 switch (d->what[i]) {
a3621e74
YO
10168 /* legal options are one of: sfpont
10169 see also regcomp.h and pregfree() */
d2f185dc
AMS
10170 case 's':
10171 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
10172 break;
10173 case 'p':
10174 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
10175 break;
10176 case 'f':
10177 /* This is cheating. */
10178 New(0, d->data[i], 1, struct regnode_charclass_class);
10179 StructCopy(r->data->data[i], d->data[i],
10180 struct regnode_charclass_class);
70612e96 10181 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
10182 break;
10183 case 'o':
33773810
AMS
10184 /* Compiled op trees are readonly, and can thus be
10185 shared without duplication. */
b34c0dd4 10186 OP_REFCNT_LOCK;
9b978d73 10187 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
b34c0dd4 10188 OP_REFCNT_UNLOCK;
9b978d73 10189 break;
d2f185dc
AMS
10190 case 'n':
10191 d->data[i] = r->data->data[i];
10192 break;
a3621e74
YO
10193 case 't':
10194 d->data[i] = r->data->data[i];
10195 OP_REFCNT_LOCK;
10196 ((reg_trie_data*)d->data[i])->refcount++;
10197 OP_REFCNT_UNLOCK;
10198 break;
10199 default:
10200 Perl_croak(aTHX_ "panic: re_dup unknown data code '%c'", r->data->what[i]);
d2f185dc
AMS
10201 }
10202 }
10203
10204 ret->data = d;
10205 }
10206 else
10207 ret->data = NULL;
10208
10209 New(0, ret->offsets, 2*len+1, U32);
10210 Copy(r->offsets, ret->offsets, 2*len+1, U32);
10211
e01c5899 10212 ret->precomp = SAVEPVN(r->precomp, r->prelen);
d2f185dc
AMS
10213 ret->refcnt = r->refcnt;
10214 ret->minlen = r->minlen;
10215 ret->prelen = r->prelen;
10216 ret->nparens = r->nparens;
10217 ret->lastparen = r->lastparen;
10218 ret->lastcloseparen = r->lastcloseparen;
10219 ret->reganch = r->reganch;
10220
70612e96
RG
10221 ret->sublen = r->sublen;
10222
10223 if (RX_MATCH_COPIED(ret))
e01c5899 10224 ret->subbeg = SAVEPVN(r->subbeg, r->sublen);
70612e96
RG
10225 else
10226 ret->subbeg = Nullch;
9a26048b
NC
10227#ifdef PERL_COPY_ON_WRITE
10228 ret->saved_copy = Nullsv;
10229#endif
70612e96 10230
d2f185dc
AMS
10231 ptr_table_store(PL_ptr_table, r, ret);
10232 return ret;
1d7c1841
GS
10233}
10234
d2d73c3e 10235/* duplicate a file handle */
645c22ef 10236
1d7c1841 10237PerlIO *
a8fc9800 10238Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
10239{
10240 PerlIO *ret;
73d840c0
AL
10241 (void)type;
10242
1d7c1841
GS
10243 if (!fp)
10244 return (PerlIO*)NULL;
10245
10246 /* look for it in the table first */
10247 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
10248 if (ret)
10249 return ret;
10250
10251 /* create anew and remember what it is */
ecdeb87c 10252 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
10253 ptr_table_store(PL_ptr_table, fp, ret);
10254 return ret;
10255}
10256
645c22ef
DM
10257/* duplicate a directory handle */
10258
1d7c1841
GS
10259DIR *
10260Perl_dirp_dup(pTHX_ DIR *dp)
10261{
10262 if (!dp)
10263 return (DIR*)NULL;
10264 /* XXX TODO */
10265 return dp;
10266}
10267
ff276b08 10268/* duplicate a typeglob */
645c22ef 10269
1d7c1841 10270GP *
a8fc9800 10271Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
10272{
10273 GP *ret;
10274 if (!gp)
10275 return (GP*)NULL;
10276 /* look for it in the table first */
10277 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
10278 if (ret)
10279 return ret;
10280
10281 /* create anew and remember what it is */
10282 Newz(0, ret, 1, GP);
10283 ptr_table_store(PL_ptr_table, gp, ret);
10284
10285 /* clone */
10286 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
10287 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
10288 ret->gp_io = io_dup_inc(gp->gp_io, param);
10289 ret->gp_form = cv_dup_inc(gp->gp_form, param);
10290 ret->gp_av = av_dup_inc(gp->gp_av, param);
10291 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
10292 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
10293 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
10294 ret->gp_cvgen = gp->gp_cvgen;
10295 ret->gp_flags = gp->gp_flags;
10296 ret->gp_line = gp->gp_line;
10297 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
10298 return ret;
10299}
10300
645c22ef
DM
10301/* duplicate a chain of magic */
10302
1d7c1841 10303MAGIC *
a8fc9800 10304Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 10305{
cb359b41
JH
10306 MAGIC *mgprev = (MAGIC*)NULL;
10307 MAGIC *mgret;
1d7c1841
GS
10308 if (!mg)
10309 return (MAGIC*)NULL;
10310 /* look for it in the table first */
10311 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
10312 if (mgret)
10313 return mgret;
10314
10315 for (; mg; mg = mg->mg_moremagic) {
10316 MAGIC *nmg;
10317 Newz(0, nmg, 1, MAGIC);
cb359b41 10318 if (mgprev)
1d7c1841 10319 mgprev->mg_moremagic = nmg;
cb359b41
JH
10320 else
10321 mgret = nmg;
1d7c1841
GS
10322 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
10323 nmg->mg_private = mg->mg_private;
10324 nmg->mg_type = mg->mg_type;
10325 nmg->mg_flags = mg->mg_flags;
14befaf4 10326 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 10327 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 10328 }
05bd4103 10329 else if(mg->mg_type == PERL_MAGIC_backref) {
7fc63493 10330 const AV * const av = (AV*) mg->mg_obj;
fdc9a813
AE
10331 SV **svp;
10332 I32 i;
7fc63493 10333 (void)SvREFCNT_inc(nmg->mg_obj = (SV*)newAV());
fdc9a813
AE
10334 svp = AvARRAY(av);
10335 for (i = AvFILLp(av); i >= 0; i--) {
3a81978b 10336 if (!svp[i]) continue;
fdc9a813
AE
10337 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
10338 }
05bd4103 10339 }
8d2f4536
NC
10340 else if (mg->mg_type == PERL_MAGIC_symtab) {
10341 nmg->mg_obj = mg->mg_obj;
10342 }
1d7c1841
GS
10343 else {
10344 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
10345 ? sv_dup_inc(mg->mg_obj, param)
10346 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
10347 }
10348 nmg->mg_len = mg->mg_len;
10349 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 10350 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 10351 if (mg->mg_len > 0) {
1d7c1841 10352 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
10353 if (mg->mg_type == PERL_MAGIC_overload_table &&
10354 AMT_AMAGIC((AMT*)mg->mg_ptr))
10355 {
1d7c1841
GS
10356 AMT *amtp = (AMT*)mg->mg_ptr;
10357 AMT *namtp = (AMT*)nmg->mg_ptr;
10358 I32 i;
10359 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 10360 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
10361 }
10362 }
10363 }
10364 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 10365 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 10366 }
68795e93
NIS
10367 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
10368 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
10369 }
1d7c1841
GS
10370 mgprev = nmg;
10371 }
10372 return mgret;
10373}
10374
645c22ef
DM
10375/* create a new pointer-mapping table */
10376
1d7c1841
GS
10377PTR_TBL_t *
10378Perl_ptr_table_new(pTHX)
10379{
10380 PTR_TBL_t *tbl;
10381 Newz(0, tbl, 1, PTR_TBL_t);
10382 tbl->tbl_max = 511;
10383 tbl->tbl_items = 0;
10384 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
10385 return tbl;
10386}
10387
134ca3d6
DM
10388#if (PTRSIZE == 8)
10389# define PTR_TABLE_HASH(ptr) (PTR2UV(ptr) >> 3)
10390#else
10391# define PTR_TABLE_HASH(ptr) (PTR2UV(ptr) >> 2)
10392#endif
10393
32e691d0
NC
10394
10395
10396STATIC void
10397S_more_pte(pTHX)
10398{
cac9b346
NC
10399 struct ptr_tbl_ent* pte;
10400 struct ptr_tbl_ent* pteend;
c3929b72
NC
10401 New(0, pte, PERL_ARENA_SIZE/sizeof(struct ptr_tbl_ent), struct ptr_tbl_ent);
10402 pte->next = PL_pte_arenaroot;
10403 PL_pte_arenaroot = pte;
32e691d0 10404
9c17f24a 10405 pteend = &pte[PERL_ARENA_SIZE / sizeof(struct ptr_tbl_ent) - 1];
32e691d0
NC
10406 PL_pte_root = ++pte;
10407 while (pte < pteend) {
10408 pte->next = pte + 1;
10409 pte++;
10410 }
10411 pte->next = 0;
10412}
10413
10414STATIC struct ptr_tbl_ent*
10415S_new_pte(pTHX)
10416{
10417 struct ptr_tbl_ent* pte;
10418 if (!PL_pte_root)
10419 S_more_pte(aTHX);
10420 pte = PL_pte_root;
10421 PL_pte_root = pte->next;
10422 return pte;
10423}
10424
10425STATIC void
10426S_del_pte(pTHX_ struct ptr_tbl_ent*p)
10427{
10428 p->next = PL_pte_root;
10429 PL_pte_root = p;
10430}
10431
645c22ef
DM
10432/* map an existing pointer using a table */
10433
1d7c1841
GS
10434void *
10435Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
10436{
10437 PTR_TBL_ENT_t *tblent;
4373e329 10438 const UV hash = PTR_TABLE_HASH(sv);
1d7c1841
GS
10439 assert(tbl);
10440 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
10441 for (; tblent; tblent = tblent->next) {
10442 if (tblent->oldval == sv)
10443 return tblent->newval;
10444 }
10445 return (void*)NULL;
10446}
10447
645c22ef
DM
10448/* add a new entry to a pointer-mapping table */
10449
1d7c1841
GS
10450void
10451Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
10452{
10453 PTR_TBL_ENT_t *tblent, **otblent;
10454 /* XXX this may be pessimal on platforms where pointers aren't good
10455 * hash values e.g. if they grow faster in the most significant
10456 * bits */
4373e329 10457 const UV hash = PTR_TABLE_HASH(oldv);
14cade97 10458 bool empty = 1;
1d7c1841
GS
10459
10460 assert(tbl);
10461 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
14cade97 10462 for (tblent = *otblent; tblent; empty=0, tblent = tblent->next) {
1d7c1841
GS
10463 if (tblent->oldval == oldv) {
10464 tblent->newval = newv;
1d7c1841
GS
10465 return;
10466 }
10467 }
32e691d0 10468 tblent = S_new_pte(aTHX);
1d7c1841
GS
10469 tblent->oldval = oldv;
10470 tblent->newval = newv;
10471 tblent->next = *otblent;
10472 *otblent = tblent;
10473 tbl->tbl_items++;
14cade97 10474 if (!empty && tbl->tbl_items > tbl->tbl_max)
1d7c1841
GS
10475 ptr_table_split(tbl);
10476}
10477
645c22ef
DM
10478/* double the hash bucket size of an existing ptr table */
10479
1d7c1841
GS
10480void
10481Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
10482{
10483 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
4373e329 10484 const UV oldsize = tbl->tbl_max + 1;
1d7c1841
GS
10485 UV newsize = oldsize * 2;
10486 UV i;
10487
10488 Renew(ary, newsize, PTR_TBL_ENT_t*);
10489 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
10490 tbl->tbl_max = --newsize;
10491 tbl->tbl_ary = ary;
10492 for (i=0; i < oldsize; i++, ary++) {
10493 PTR_TBL_ENT_t **curentp, **entp, *ent;
10494 if (!*ary)
10495 continue;
10496 curentp = ary + oldsize;
10497 for (entp = ary, ent = *ary; ent; ent = *entp) {
134ca3d6 10498 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
10499 *entp = ent->next;
10500 ent->next = *curentp;
10501 *curentp = ent;
10502 continue;
10503 }
10504 else
10505 entp = &ent->next;
10506 }
10507 }
10508}
10509
645c22ef
DM
10510/* remove all the entries from a ptr table */
10511
a0739874
DM
10512void
10513Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
10514{
10515 register PTR_TBL_ENT_t **array;
10516 register PTR_TBL_ENT_t *entry;
a0739874
DM
10517 UV riter = 0;
10518 UV max;
10519
10520 if (!tbl || !tbl->tbl_items) {
10521 return;
10522 }
10523
10524 array = tbl->tbl_ary;
10525 entry = array[0];
10526 max = tbl->tbl_max;
10527
10528 for (;;) {
10529 if (entry) {
4373e329 10530 PTR_TBL_ENT_t *oentry = entry;
a0739874 10531 entry = entry->next;
32e691d0 10532 S_del_pte(aTHX_ oentry);
a0739874
DM
10533 }
10534 if (!entry) {
10535 if (++riter > max) {
10536 break;
10537 }
10538 entry = array[riter];
10539 }
10540 }
10541
10542 tbl->tbl_items = 0;
10543}
10544
645c22ef
DM
10545/* clear and free a ptr table */
10546
a0739874
DM
10547void
10548Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
10549{
10550 if (!tbl) {
10551 return;
10552 }
10553 ptr_table_clear(tbl);
10554 Safefree(tbl->tbl_ary);
10555 Safefree(tbl);
10556}
10557
645c22ef
DM
10558/* attempt to make everything in the typeglob readonly */
10559
5bd07a3d 10560STATIC SV *
59b40662 10561S_gv_share(pTHX_ SV *sstr, CLONE_PARAMS *param)
5bd07a3d
DM
10562{
10563 GV *gv = (GV*)sstr;
59b40662 10564 SV *sv = &param->proto_perl->Isv_no; /* just need SvREADONLY-ness */
5bd07a3d
DM
10565
10566 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 10567 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
10568 }
10569 else if (!GvCV(gv)) {
10570 GvCV(gv) = (CV*)sv;
10571 }
10572 else {
10573 /* CvPADLISTs cannot be shared */
37e20706 10574 if (!SvREADONLY(GvCV(gv)) && !CvXSUB(GvCV(gv))) {
7fb37951 10575 GvUNIQUE_off(gv);
5bd07a3d
DM
10576 }
10577 }
10578
7fb37951 10579 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
10580#if 0
10581 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
bfcb3514 10582 HvNAME_get(GvSTASH(gv)), GvNAME(gv));
5bd07a3d
DM
10583#endif
10584 return Nullsv;
10585 }
10586
4411f3b6 10587 /*
5bd07a3d
DM
10588 * write attempts will die with
10589 * "Modification of a read-only value attempted"
10590 */
10591 if (!GvSV(gv)) {
10592 GvSV(gv) = sv;
10593 }
10594 else {
10595 SvREADONLY_on(GvSV(gv));
10596 }
10597
10598 if (!GvAV(gv)) {
10599 GvAV(gv) = (AV*)sv;
10600 }
10601 else {
10602 SvREADONLY_on(GvAV(gv));
10603 }
10604
10605 if (!GvHV(gv)) {
10606 GvHV(gv) = (HV*)sv;
10607 }
10608 else {
53c33732 10609 SvREADONLY_on(GvHV(gv));
5bd07a3d
DM
10610 }
10611
10612 return sstr; /* he_dup() will SvREFCNT_inc() */
10613}
10614
645c22ef
DM
10615/* duplicate an SV of any type (including AV, HV etc) */
10616
83841fad
NIS
10617void
10618Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
10619{
10620 if (SvROK(sstr)) {
b162af07
SP
10621 SvRV_set(dstr, SvWEAKREF(sstr)
10622 ? sv_dup(SvRV(sstr), param)
10623 : sv_dup_inc(SvRV(sstr), param));
f880fe2f 10624
83841fad
NIS
10625 }
10626 else if (SvPVX(sstr)) {
10627 /* Has something there */
10628 if (SvLEN(sstr)) {
68795e93 10629 /* Normal PV - clone whole allocated space */
f880fe2f 10630 SvPV_set(dstr, SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1));
d3d0e6f1
NC
10631 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10632 /* Not that normal - actually sstr is copy on write.
10633 But we are a true, independant SV, so: */
10634 SvREADONLY_off(dstr);
10635 SvFAKE_off(dstr);
10636 }
68795e93 10637 }
83841fad
NIS
10638 else {
10639 /* Special case - not normally malloced for some reason */
10640 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10641 /* A "shared" PV - clone it as unshared string */
281b2760 10642 if(SvPADTMP(sstr)) {
5e6160dc
AB
10643 /* However, some of them live in the pad
10644 and they should not have these flags
10645 turned off */
281b2760 10646
f880fe2f
SP
10647 SvPV_set(dstr, sharepvn(SvPVX(sstr), SvCUR(sstr),
10648 SvUVX(sstr)));
607fa7f2 10649 SvUV_set(dstr, SvUVX(sstr));
281b2760
AB
10650 } else {
10651
f880fe2f 10652 SvPV_set(dstr, SAVEPVN(SvPVX(sstr), SvCUR(sstr)));
281b2760
AB
10653 SvFAKE_off(dstr);
10654 SvREADONLY_off(dstr);
5e6160dc 10655 }
83841fad
NIS
10656 }
10657 else {
10658 /* Some other special case - random pointer */
f880fe2f 10659 SvPV_set(dstr, SvPVX(sstr));
d3d0e6f1 10660 }
83841fad
NIS
10661 }
10662 }
10663 else {
10664 /* Copy the Null */
f880fe2f 10665 if (SvTYPE(dstr) == SVt_RV)
b162af07 10666 SvRV_set(dstr, NULL);
f880fe2f
SP
10667 else
10668 SvPV_set(dstr, 0);
83841fad
NIS
10669 }
10670}
10671
1d7c1841 10672SV *
a8fc9800 10673Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
1d7c1841 10674{
27da23d5 10675 dVAR;
1d7c1841
GS
10676 SV *dstr;
10677
10678 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
10679 return Nullsv;
10680 /* look for it in the table first */
10681 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
10682 if (dstr)
10683 return dstr;
10684
0405e91e
AB
10685 if(param->flags & CLONEf_JOIN_IN) {
10686 /** We are joining here so we don't want do clone
10687 something that is bad **/
bfcb3514 10688 const char *hvname;
0405e91e
AB
10689
10690 if(SvTYPE(sstr) == SVt_PVHV &&
bfcb3514 10691 (hvname = HvNAME_get(sstr))) {
0405e91e 10692 /** don't clone stashes if they already exist **/
bfcb3514 10693 HV* old_stash = gv_stashpv(hvname,0);
0405e91e
AB
10694 return (SV*) old_stash;
10695 }
10696 }
10697
1d7c1841
GS
10698 /* create anew and remember what it is */
10699 new_SV(dstr);
fd0854ff
DM
10700
10701#ifdef DEBUG_LEAKING_SCALARS
10702 dstr->sv_debug_optype = sstr->sv_debug_optype;
10703 dstr->sv_debug_line = sstr->sv_debug_line;
10704 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
10705 dstr->sv_debug_cloned = 1;
10706# ifdef NETWARE
10707 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
10708# else
10709 dstr->sv_debug_file = savesharedpv(sstr->sv_debug_file);
10710# endif
10711#endif
10712
1d7c1841
GS
10713 ptr_table_store(PL_ptr_table, sstr, dstr);
10714
10715 /* clone */
10716 SvFLAGS(dstr) = SvFLAGS(sstr);
10717 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
10718 SvREFCNT(dstr) = 0; /* must be before any other dups! */
10719
10720#ifdef DEBUGGING
10721 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
10722 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
10723 PL_watch_pvx, SvPVX(sstr));
10724#endif
10725
9660f481
DM
10726 /* don't clone objects whose class has asked us not to */
10727 if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
10728 SvFLAGS(dstr) &= ~SVTYPEMASK;
10729 SvOBJECT_off(dstr);
10730 return dstr;
10731 }
10732
1d7c1841
GS
10733 switch (SvTYPE(sstr)) {
10734 case SVt_NULL:
10735 SvANY(dstr) = NULL;
10736 break;
10737 case SVt_IV:
339049b0 10738 SvANY(dstr) = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
45977657 10739 SvIV_set(dstr, SvIVX(sstr));
1d7c1841
GS
10740 break;
10741 case SVt_NV:
10742 SvANY(dstr) = new_XNV();
9d6ce603 10743 SvNV_set(dstr, SvNVX(sstr));
1d7c1841
GS
10744 break;
10745 case SVt_RV:
339049b0 10746 SvANY(dstr) = &(dstr->sv_u.svu_rv);
83841fad 10747 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10748 break;
10749 case SVt_PV:
10750 SvANY(dstr) = new_XPV();
b162af07
SP
10751 SvCUR_set(dstr, SvCUR(sstr));
10752 SvLEN_set(dstr, SvLEN(sstr));
83841fad 10753 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10754 break;
10755 case SVt_PVIV:
10756 SvANY(dstr) = new_XPVIV();
b162af07
SP
10757 SvCUR_set(dstr, SvCUR(sstr));
10758 SvLEN_set(dstr, SvLEN(sstr));
45977657 10759 SvIV_set(dstr, SvIVX(sstr));
83841fad 10760 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10761 break;
10762 case SVt_PVNV:
10763 SvANY(dstr) = new_XPVNV();
b162af07
SP
10764 SvCUR_set(dstr, SvCUR(sstr));
10765 SvLEN_set(dstr, SvLEN(sstr));
45977657 10766 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10767 SvNV_set(dstr, SvNVX(sstr));
83841fad 10768 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10769 break;
10770 case SVt_PVMG:
10771 SvANY(dstr) = new_XPVMG();
b162af07
SP
10772 SvCUR_set(dstr, SvCUR(sstr));
10773 SvLEN_set(dstr, SvLEN(sstr));
45977657 10774 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10775 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10776 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10777 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10778 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10779 break;
10780 case SVt_PVBM:
10781 SvANY(dstr) = new_XPVBM();
b162af07
SP
10782 SvCUR_set(dstr, SvCUR(sstr));
10783 SvLEN_set(dstr, SvLEN(sstr));
45977657 10784 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10785 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10786 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10787 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10788 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10789 BmRARE(dstr) = BmRARE(sstr);
10790 BmUSEFUL(dstr) = BmUSEFUL(sstr);
10791 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
10792 break;
10793 case SVt_PVLV:
10794 SvANY(dstr) = new_XPVLV();
b162af07
SP
10795 SvCUR_set(dstr, SvCUR(sstr));
10796 SvLEN_set(dstr, SvLEN(sstr));
45977657 10797 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10798 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10799 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10800 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10801 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10802 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
10803 LvTARGLEN(dstr) = LvTARGLEN(sstr);
dd28f7bb
DM
10804 if (LvTYPE(sstr) == 't') /* for tie: unrefcnted fake (SV**) */
10805 LvTARG(dstr) = dstr;
10806 else if (LvTYPE(sstr) == 'T') /* for tie: fake HE */
10807 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(sstr), 0, param);
10808 else
10809 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr), param);
1d7c1841
GS
10810 LvTYPE(dstr) = LvTYPE(sstr);
10811 break;
10812 case SVt_PVGV:
7fb37951 10813 if (GvUNIQUE((GV*)sstr)) {
5bd07a3d 10814 SV *share;
59b40662 10815 if ((share = gv_share(sstr, param))) {
5bd07a3d
DM
10816 del_SV(dstr);
10817 dstr = share;
37e20706 10818 ptr_table_store(PL_ptr_table, sstr, dstr);
5bd07a3d
DM
10819#if 0
10820 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
bfcb3514 10821 HvNAME_get(GvSTASH(share)), GvNAME(share));
5bd07a3d
DM
10822#endif
10823 break;
10824 }
10825 }
1d7c1841 10826 SvANY(dstr) = new_XPVGV();
b162af07
SP
10827 SvCUR_set(dstr, SvCUR(sstr));
10828 SvLEN_set(dstr, SvLEN(sstr));
45977657 10829 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10830 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10831 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10832 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10833 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10834 GvNAMELEN(dstr) = GvNAMELEN(sstr);
10835 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
d2d73c3e 10836 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr), param);
1d7c1841 10837 GvFLAGS(dstr) = GvFLAGS(sstr);
d2d73c3e 10838 GvGP(dstr) = gp_dup(GvGP(sstr), param);
1d7c1841
GS
10839 (void)GpREFCNT_inc(GvGP(dstr));
10840 break;
10841 case SVt_PVIO:
10842 SvANY(dstr) = new_XPVIO();
b162af07
SP
10843 SvCUR_set(dstr, SvCUR(sstr));
10844 SvLEN_set(dstr, SvLEN(sstr));
45977657 10845 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10846 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10847 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10848 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10849 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
a8fc9800 10850 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10851 if (IoOFP(sstr) == IoIFP(sstr))
10852 IoOFP(dstr) = IoIFP(dstr);
10853 else
a8fc9800 10854 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10855 /* PL_rsfp_filters entries have fake IoDIRP() */
10856 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
10857 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
10858 else
10859 IoDIRP(dstr) = IoDIRP(sstr);
10860 IoLINES(dstr) = IoLINES(sstr);
10861 IoPAGE(dstr) = IoPAGE(sstr);
10862 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
10863 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
7a5fa8a2 10864 if(IoFLAGS(sstr) & IOf_FAKE_DIRP) {
5a37521b
AB
10865 /* I have no idea why fake dirp (rsfps)
10866 should be treaded differently but otherwise
10867 we end up with leaks -- sky*/
10868 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(sstr), param);
10869 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(sstr), param);
10870 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(sstr), param);
10871 } else {
10872 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr), param);
10873 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr), param);
10874 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr), param);
10875 }
1d7c1841 10876 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
1d7c1841 10877 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
1d7c1841 10878 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
1d7c1841
GS
10879 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
10880 IoTYPE(dstr) = IoTYPE(sstr);
10881 IoFLAGS(dstr) = IoFLAGS(sstr);
10882 break;
10883 case SVt_PVAV:
10884 SvANY(dstr) = new_XPVAV();
b162af07
SP
10885 SvCUR_set(dstr, SvCUR(sstr));
10886 SvLEN_set(dstr, SvLEN(sstr));
b162af07
SP
10887 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10888 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
1d7c1841
GS
10889 if (AvARRAY((AV*)sstr)) {
10890 SV **dst_ary, **src_ary;
10891 SSize_t items = AvFILLp((AV*)sstr) + 1;
10892
10893 src_ary = AvARRAY((AV*)sstr);
10894 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
10895 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
f880fe2f 10896 SvPV_set(dstr, (char*)dst_ary);
1d7c1841
GS
10897 AvALLOC((AV*)dstr) = dst_ary;
10898 if (AvREAL((AV*)sstr)) {
10899 while (items-- > 0)
d2d73c3e 10900 *dst_ary++ = sv_dup_inc(*src_ary++, param);
1d7c1841
GS
10901 }
10902 else {
10903 while (items-- > 0)
d2d73c3e 10904 *dst_ary++ = sv_dup(*src_ary++, param);
1d7c1841
GS
10905 }
10906 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10907 while (items-- > 0) {
10908 *dst_ary++ = &PL_sv_undef;
10909 }
10910 }
10911 else {
f880fe2f 10912 SvPV_set(dstr, Nullch);
1d7c1841
GS
10913 AvALLOC((AV*)dstr) = (SV**)NULL;
10914 }
10915 break;
10916 case SVt_PVHV:
10917 SvANY(dstr) = new_XPVHV();
b162af07
SP
10918 SvCUR_set(dstr, SvCUR(sstr));
10919 SvLEN_set(dstr, SvLEN(sstr));
94a66813 10920 HvTOTALKEYS(dstr) = HvTOTALKEYS(sstr);
b162af07
SP
10921 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10922 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
bfcb3514 10923 {
bfcb3514 10924 struct xpvhv_aux *aux = ((XPVHV *)SvANY(sstr))->xhv_aux;
7423f6db 10925 HEK *hvname = 0;
bfcb3514
NC
10926
10927 if (aux) {
7423f6db
NC
10928 I32 riter = aux->xhv_riter;
10929
10930 hvname = aux->xhv_name;
10931 if (hvname || riter != -1) {
10932 struct xpvhv_aux *d_aux;
10933
10934 New(0, d_aux, 1, struct xpvhv_aux);
10935
10936 d_aux->xhv_riter = riter;
10937 d_aux->xhv_eiter = 0;
10938 d_aux->xhv_name = hvname ? hek_dup(hvname, param) : hvname;
10939
10940 ((XPVHV *)SvANY(dstr))->xhv_aux = d_aux;
10941 } else {
10942 ((XPVHV *)SvANY(dstr))->xhv_aux = 0;
10943 }
10944 }
10945 else {
10946 ((XPVHV *)SvANY(dstr))->xhv_aux = 0;
1d7c1841 10947 }
bfcb3514
NC
10948 if (HvARRAY((HV*)sstr)) {
10949 STRLEN i = 0;
10950 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
10951 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
7b2c381c
NC
10952 char *darray;
10953 /* FIXME - surely this doesn't need to be zeroed? */
10954 Newz(0, darray,
bfcb3514 10955 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
7b2c381c 10956 HvARRAY(dstr) = (HE**)darray;
bfcb3514 10957 while (i <= sxhv->xhv_max) {
7b2c381c
NC
10958 HvARRAY(dstr)[i]
10959 = he_dup(HvARRAY(sstr)[i],
bfcb3514
NC
10960 (bool)!!HvSHAREKEYS(sstr), param);
10961 ++i;
10962 }
10963 HvEITER_set(dstr, he_dup(HvEITER_get(sstr),
10964 (bool)!!HvSHAREKEYS(sstr), param));
10965 }
10966 else {
10967 SvPV_set(dstr, Nullch);
10968 HvEITER_set((HV*)dstr, (HE*)NULL);
10969 }
10970 /* Record stashes for possible cloning in Perl_clone(). */
10971 if(hvname)
10972 av_push(param->stashes, dstr);
1d7c1841 10973 }
1d7c1841
GS
10974 break;
10975 case SVt_PVFM:
10976 SvANY(dstr) = new_XPVFM();
10977 FmLINES(dstr) = FmLINES(sstr);
10978 goto dup_pvcv;
10979 /* NOTREACHED */
10980 case SVt_PVCV:
10981 SvANY(dstr) = new_XPVCV();
d2d73c3e 10982 dup_pvcv:
b162af07
SP
10983 SvCUR_set(dstr, SvCUR(sstr));
10984 SvLEN_set(dstr, SvLEN(sstr));
45977657 10985 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10986 SvNV_set(dstr, SvNVX(sstr));
b162af07
SP
10987 SvMAGIC_set(dstr, mg_dup(SvMAGIC(sstr), param));
10988 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
83841fad 10989 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
d2d73c3e 10990 CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
1d7c1841 10991 CvSTART(dstr) = CvSTART(sstr);
b34c0dd4 10992 OP_REFCNT_LOCK;
1d7c1841 10993 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
b34c0dd4 10994 OP_REFCNT_UNLOCK;
1d7c1841
GS
10995 CvXSUB(dstr) = CvXSUB(sstr);
10996 CvXSUBANY(dstr) = CvXSUBANY(sstr);
01485f8b
DM
10997 if (CvCONST(sstr)) {
10998 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
10999 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
8f77bfdb 11000 sv_dup_inc((SV *)CvXSUBANY(sstr).any_ptr, param);
01485f8b 11001 }
b23f1a86
DM
11002 /* don't dup if copying back - CvGV isn't refcounted, so the
11003 * duped GV may never be freed. A bit of a hack! DAPM */
11004 CvGV(dstr) = (param->flags & CLONEf_JOIN_IN) ?
11005 Nullgv : gv_dup(CvGV(sstr), param) ;
d2d73c3e
AB
11006 if (param->flags & CLONEf_COPY_STACKS) {
11007 CvDEPTH(dstr) = CvDEPTH(sstr);
11008 } else {
11009 CvDEPTH(dstr) = 0;
11010 }
dd2155a4 11011 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
7dafbf52
DM
11012 CvOUTSIDE_SEQ(dstr) = CvOUTSIDE_SEQ(sstr);
11013 CvOUTSIDE(dstr) =
11014 CvWEAKOUTSIDE(sstr)
11015 ? cv_dup( CvOUTSIDE(sstr), param)
11016 : cv_dup_inc(CvOUTSIDE(sstr), param);
1d7c1841 11017 CvFLAGS(dstr) = CvFLAGS(sstr);
54356c7d 11018 CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
1d7c1841
GS
11019 break;
11020 default:
c803eecc 11021 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
1d7c1841
GS
11022 break;
11023 }
11024
11025 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
11026 ++PL_sv_objcount;
11027
11028 return dstr;
d2d73c3e 11029 }
1d7c1841 11030
645c22ef
DM
11031/* duplicate a context */
11032
1d7c1841 11033PERL_CONTEXT *
a8fc9800 11034Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
11035{
11036 PERL_CONTEXT *ncxs;
11037
11038 if (!cxs)
11039 return (PERL_CONTEXT*)NULL;
11040
11041 /* look for it in the table first */
11042 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
11043 if (ncxs)
11044 return ncxs;
11045
11046 /* create anew and remember what it is */
11047 Newz(56, ncxs, max + 1, PERL_CONTEXT);
11048 ptr_table_store(PL_ptr_table, cxs, ncxs);
11049
11050 while (ix >= 0) {
11051 PERL_CONTEXT *cx = &cxs[ix];
11052 PERL_CONTEXT *ncx = &ncxs[ix];
11053 ncx->cx_type = cx->cx_type;
11054 if (CxTYPE(cx) == CXt_SUBST) {
11055 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
11056 }
11057 else {
11058 ncx->blk_oldsp = cx->blk_oldsp;
11059 ncx->blk_oldcop = cx->blk_oldcop;
1d7c1841
GS
11060 ncx->blk_oldmarksp = cx->blk_oldmarksp;
11061 ncx->blk_oldscopesp = cx->blk_oldscopesp;
11062 ncx->blk_oldpm = cx->blk_oldpm;
11063 ncx->blk_gimme = cx->blk_gimme;
11064 switch (CxTYPE(cx)) {
11065 case CXt_SUB:
11066 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
11067 ? cv_dup_inc(cx->blk_sub.cv, param)
11068 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 11069 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 11070 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 11071 : Nullav);
d2d73c3e 11072 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
11073 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
11074 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
11075 ncx->blk_sub.lval = cx->blk_sub.lval;
f39bc417 11076 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
11077 break;
11078 case CXt_EVAL:
11079 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
11080 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 11081 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 11082 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 11083 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
f39bc417 11084 ncx->blk_eval.retop = cx->blk_eval.retop;
1d7c1841
GS
11085 break;
11086 case CXt_LOOP:
11087 ncx->blk_loop.label = cx->blk_loop.label;
11088 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
11089 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
11090 ncx->blk_loop.next_op = cx->blk_loop.next_op;
11091 ncx->blk_loop.last_op = cx->blk_loop.last_op;
11092 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
11093 ? cx->blk_loop.iterdata
d2d73c3e 11094 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
11095 ncx->blk_loop.oldcomppad
11096 = (PAD*)ptr_table_fetch(PL_ptr_table,
11097 cx->blk_loop.oldcomppad);
d2d73c3e
AB
11098 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
11099 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
11100 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
11101 ncx->blk_loop.iterix = cx->blk_loop.iterix;
11102 ncx->blk_loop.itermax = cx->blk_loop.itermax;
11103 break;
11104 case CXt_FORMAT:
d2d73c3e
AB
11105 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
11106 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
11107 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841 11108 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
f39bc417 11109 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
11110 break;
11111 case CXt_BLOCK:
11112 case CXt_NULL:
11113 break;
11114 }
11115 }
11116 --ix;
11117 }
11118 return ncxs;
11119}
11120
645c22ef
DM
11121/* duplicate a stack info structure */
11122
1d7c1841 11123PERL_SI *
a8fc9800 11124Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
11125{
11126 PERL_SI *nsi;
11127
11128 if (!si)
11129 return (PERL_SI*)NULL;
11130
11131 /* look for it in the table first */
11132 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
11133 if (nsi)
11134 return nsi;
11135
11136 /* create anew and remember what it is */
11137 Newz(56, nsi, 1, PERL_SI);
11138 ptr_table_store(PL_ptr_table, si, nsi);
11139
d2d73c3e 11140 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
11141 nsi->si_cxix = si->si_cxix;
11142 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 11143 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 11144 nsi->si_type = si->si_type;
d2d73c3e
AB
11145 nsi->si_prev = si_dup(si->si_prev, param);
11146 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
11147 nsi->si_markoff = si->si_markoff;
11148
11149 return nsi;
11150}
11151
11152#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
11153#define TOPINT(ss,ix) ((ss)[ix].any_i32)
11154#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
11155#define TOPLONG(ss,ix) ((ss)[ix].any_long)
11156#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
11157#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
11158#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
11159#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
11160#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
11161#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
11162#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
11163#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
11164#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
11165#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
11166
11167/* XXXXX todo */
11168#define pv_dup_inc(p) SAVEPV(p)
11169#define pv_dup(p) SAVEPV(p)
11170#define svp_dup_inc(p,pp) any_dup(p,pp)
11171
645c22ef
DM
11172/* map any object to the new equivent - either something in the
11173 * ptr table, or something in the interpreter structure
11174 */
11175
1d7c1841
GS
11176void *
11177Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
11178{
11179 void *ret;
11180
11181 if (!v)
11182 return (void*)NULL;
11183
11184 /* look for it in the table first */
11185 ret = ptr_table_fetch(PL_ptr_table, v);
11186 if (ret)
11187 return ret;
11188
11189 /* see if it is part of the interpreter structure */
11190 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 11191 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 11192 else {
1d7c1841 11193 ret = v;
05ec9bb3 11194 }
1d7c1841
GS
11195
11196 return ret;
11197}
11198
645c22ef
DM
11199/* duplicate the save stack */
11200
1d7c1841 11201ANY *
a8fc9800 11202Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841
GS
11203{
11204 ANY *ss = proto_perl->Tsavestack;
11205 I32 ix = proto_perl->Tsavestack_ix;
11206 I32 max = proto_perl->Tsavestack_max;
11207 ANY *nss;
11208 SV *sv;
11209 GV *gv;
11210 AV *av;
11211 HV *hv;
11212 void* ptr;
11213 int intval;
11214 long longval;
11215 GP *gp;
11216 IV iv;
11217 I32 i;
c4e33207 11218 char *c = NULL;
1d7c1841 11219 void (*dptr) (void*);
acfe0abc 11220 void (*dxptr) (pTHX_ void*);
e977893f 11221 OP *o;
1d7c1841
GS
11222
11223 Newz(54, nss, max, ANY);
11224
11225 while (ix > 0) {
11226 i = POPINT(ss,ix);
11227 TOPINT(nss,ix) = i;
11228 switch (i) {
11229 case SAVEt_ITEM: /* normal string */
11230 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11231 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11232 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11233 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11234 break;
11235 case SAVEt_SV: /* scalar reference */
11236 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11237 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11238 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11239 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 11240 break;
f4dd75d9
GS
11241 case SAVEt_GENERIC_PVREF: /* generic char* */
11242 c = (char*)POPPTR(ss,ix);
11243 TOPPTR(nss,ix) = pv_dup(c);
11244 ptr = POPPTR(ss,ix);
11245 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11246 break;
05ec9bb3
NIS
11247 case SAVEt_SHARED_PVREF: /* char* in shared space */
11248 c = (char*)POPPTR(ss,ix);
11249 TOPPTR(nss,ix) = savesharedpv(c);
11250 ptr = POPPTR(ss,ix);
11251 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11252 break;
1d7c1841
GS
11253 case SAVEt_GENERIC_SVREF: /* generic sv */
11254 case SAVEt_SVREF: /* scalar reference */
11255 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11256 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11257 ptr = POPPTR(ss,ix);
11258 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
11259 break;
11260 case SAVEt_AV: /* array reference */
11261 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11262 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 11263 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11264 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11265 break;
11266 case SAVEt_HV: /* hash reference */
11267 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11268 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 11269 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11270 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11271 break;
11272 case SAVEt_INT: /* int reference */
11273 ptr = POPPTR(ss,ix);
11274 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11275 intval = (int)POPINT(ss,ix);
11276 TOPINT(nss,ix) = intval;
11277 break;
11278 case SAVEt_LONG: /* long reference */
11279 ptr = POPPTR(ss,ix);
11280 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11281 longval = (long)POPLONG(ss,ix);
11282 TOPLONG(nss,ix) = longval;
11283 break;
11284 case SAVEt_I32: /* I32 reference */
11285 case SAVEt_I16: /* I16 reference */
11286 case SAVEt_I8: /* I8 reference */
11287 ptr = POPPTR(ss,ix);
11288 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11289 i = POPINT(ss,ix);
11290 TOPINT(nss,ix) = i;
11291 break;
11292 case SAVEt_IV: /* IV reference */
11293 ptr = POPPTR(ss,ix);
11294 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11295 iv = POPIV(ss,ix);
11296 TOPIV(nss,ix) = iv;
11297 break;
11298 case SAVEt_SPTR: /* SV* reference */
11299 ptr = POPPTR(ss,ix);
11300 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11301 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11302 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
11303 break;
11304 case SAVEt_VPTR: /* random* reference */
11305 ptr = POPPTR(ss,ix);
11306 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11307 ptr = POPPTR(ss,ix);
11308 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11309 break;
11310 case SAVEt_PPTR: /* char* reference */
11311 ptr = POPPTR(ss,ix);
11312 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11313 c = (char*)POPPTR(ss,ix);
11314 TOPPTR(nss,ix) = pv_dup(c);
11315 break;
11316 case SAVEt_HPTR: /* HV* reference */
11317 ptr = POPPTR(ss,ix);
11318 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11319 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11320 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
11321 break;
11322 case SAVEt_APTR: /* AV* reference */
11323 ptr = POPPTR(ss,ix);
11324 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11325 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11326 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
11327 break;
11328 case SAVEt_NSTAB:
11329 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11330 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11331 break;
11332 case SAVEt_GP: /* scalar reference */
11333 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 11334 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
11335 (void)GpREFCNT_inc(gp);
11336 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 11337 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
11338 c = (char*)POPPTR(ss,ix);
11339 TOPPTR(nss,ix) = pv_dup(c);
11340 iv = POPIV(ss,ix);
11341 TOPIV(nss,ix) = iv;
11342 iv = POPIV(ss,ix);
11343 TOPIV(nss,ix) = iv;
11344 break;
11345 case SAVEt_FREESV:
26d9b02f 11346 case SAVEt_MORTALIZESV:
1d7c1841 11347 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11348 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11349 break;
11350 case SAVEt_FREEOP:
11351 ptr = POPPTR(ss,ix);
11352 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
11353 /* these are assumed to be refcounted properly */
11354 switch (((OP*)ptr)->op_type) {
11355 case OP_LEAVESUB:
11356 case OP_LEAVESUBLV:
11357 case OP_LEAVEEVAL:
11358 case OP_LEAVE:
11359 case OP_SCOPE:
11360 case OP_LEAVEWRITE:
e977893f
GS
11361 TOPPTR(nss,ix) = ptr;
11362 o = (OP*)ptr;
11363 OpREFCNT_inc(o);
1d7c1841
GS
11364 break;
11365 default:
11366 TOPPTR(nss,ix) = Nullop;
11367 break;
11368 }
11369 }
11370 else
11371 TOPPTR(nss,ix) = Nullop;
11372 break;
11373 case SAVEt_FREEPV:
11374 c = (char*)POPPTR(ss,ix);
11375 TOPPTR(nss,ix) = pv_dup_inc(c);
11376 break;
11377 case SAVEt_CLEARSV:
11378 longval = POPLONG(ss,ix);
11379 TOPLONG(nss,ix) = longval;
11380 break;
11381 case SAVEt_DELETE:
11382 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11383 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
11384 c = (char*)POPPTR(ss,ix);
11385 TOPPTR(nss,ix) = pv_dup_inc(c);
11386 i = POPINT(ss,ix);
11387 TOPINT(nss,ix) = i;
11388 break;
11389 case SAVEt_DESTRUCTOR:
11390 ptr = POPPTR(ss,ix);
11391 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11392 dptr = POPDPTR(ss,ix);
ef75a179 11393 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
11394 break;
11395 case SAVEt_DESTRUCTOR_X:
11396 ptr = POPPTR(ss,ix);
11397 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11398 dxptr = POPDXPTR(ss,ix);
acfe0abc 11399 TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
11400 break;
11401 case SAVEt_REGCONTEXT:
11402 case SAVEt_ALLOC:
11403 i = POPINT(ss,ix);
11404 TOPINT(nss,ix) = i;
11405 ix -= i;
11406 break;
11407 case SAVEt_STACK_POS: /* Position on Perl stack */
11408 i = POPINT(ss,ix);
11409 TOPINT(nss,ix) = i;
11410 break;
11411 case SAVEt_AELEM: /* array element */
11412 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11413 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11414 i = POPINT(ss,ix);
11415 TOPINT(nss,ix) = i;
11416 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11417 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
11418 break;
11419 case SAVEt_HELEM: /* hash element */
11420 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11421 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11422 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11423 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11424 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11425 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
11426 break;
11427 case SAVEt_OP:
11428 ptr = POPPTR(ss,ix);
11429 TOPPTR(nss,ix) = ptr;
11430 break;
11431 case SAVEt_HINTS:
11432 i = POPINT(ss,ix);
11433 TOPINT(nss,ix) = i;
11434 break;
c4410b1b
GS
11435 case SAVEt_COMPPAD:
11436 av = (AV*)POPPTR(ss,ix);
58ed4fbe 11437 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 11438 break;
c3564e5c
GS
11439 case SAVEt_PADSV:
11440 longval = (long)POPLONG(ss,ix);
11441 TOPLONG(nss,ix) = longval;
11442 ptr = POPPTR(ss,ix);
11443 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11444 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11445 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 11446 break;
a1bb4754 11447 case SAVEt_BOOL:
38d8b13e 11448 ptr = POPPTR(ss,ix);
b9609c01 11449 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 11450 longval = (long)POPBOOL(ss,ix);
b9609c01 11451 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 11452 break;
8bd2680e
MHM
11453 case SAVEt_SET_SVFLAGS:
11454 i = POPINT(ss,ix);
11455 TOPINT(nss,ix) = i;
11456 i = POPINT(ss,ix);
11457 TOPINT(nss,ix) = i;
11458 sv = (SV*)POPPTR(ss,ix);
11459 TOPPTR(nss,ix) = sv_dup(sv, param);
11460 break;
1d7c1841
GS
11461 default:
11462 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
11463 }
11464 }
11465
11466 return nss;
11467}
11468
9660f481
DM
11469
11470/* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
11471 * flag to the result. This is done for each stash before cloning starts,
11472 * so we know which stashes want their objects cloned */
11473
11474static void
11475do_mark_cloneable_stash(pTHX_ SV *sv)
11476{
bfcb3514
NC
11477 const char *hvname = HvNAME_get((HV*)sv);
11478 if (hvname) {
9660f481 11479 GV* cloner = gv_fetchmethod_autoload((HV*)sv, "CLONE_SKIP", 0);
7423f6db 11480 STRLEN len = HvNAMELEN_get((HV*)sv);
9660f481
DM
11481 SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
11482 if (cloner && GvCV(cloner)) {
11483 dSP;
11484 UV status;
11485
11486 ENTER;
11487 SAVETMPS;
11488 PUSHMARK(SP);
7423f6db 11489 XPUSHs(sv_2mortal(newSVpvn(hvname, len)));
9660f481
DM
11490 PUTBACK;
11491 call_sv((SV*)GvCV(cloner), G_SCALAR);
11492 SPAGAIN;
11493 status = POPu;
11494 PUTBACK;
11495 FREETMPS;
11496 LEAVE;
11497 if (status)
11498 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
11499 }
11500 }
11501}
11502
11503
11504
645c22ef
DM
11505/*
11506=for apidoc perl_clone
11507
11508Create and return a new interpreter by cloning the current one.
11509
4be49ee6 11510perl_clone takes these flags as parameters:
6a78b4db 11511
7a5fa8a2
NIS
11512CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
11513without it we only clone the data and zero the stacks,
11514with it we copy the stacks and the new perl interpreter is
11515ready to run at the exact same point as the previous one.
11516The pseudo-fork code uses COPY_STACKS while the
6a78b4db
AB
11517threads->new doesn't.
11518
11519CLONEf_KEEP_PTR_TABLE
7a5fa8a2
NIS
11520perl_clone keeps a ptr_table with the pointer of the old
11521variable as a key and the new variable as a value,
11522this allows it to check if something has been cloned and not
11523clone it again but rather just use the value and increase the
11524refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
11525the ptr_table using the function
11526C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
11527reason to keep it around is if you want to dup some of your own
11528variable who are outside the graph perl scans, example of this
6a78b4db
AB
11529code is in threads.xs create
11530
11531CLONEf_CLONE_HOST
7a5fa8a2
NIS
11532This is a win32 thing, it is ignored on unix, it tells perls
11533win32host code (which is c++) to clone itself, this is needed on
11534win32 if you want to run two threads at the same time,
11535if you just want to do some stuff in a separate perl interpreter
11536and then throw it away and return to the original one,
6a78b4db
AB
11537you don't need to do anything.
11538
645c22ef
DM
11539=cut
11540*/
11541
11542/* XXX the above needs expanding by someone who actually understands it ! */
3fc56081
NK
11543EXTERN_C PerlInterpreter *
11544perl_clone_host(PerlInterpreter* proto_perl, UV flags);
645c22ef 11545
1d7c1841
GS
11546PerlInterpreter *
11547perl_clone(PerlInterpreter *proto_perl, UV flags)
11548{
27da23d5 11549 dVAR;
1d7c1841 11550#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
11551
11552 /* perlhost.h so we need to call into it
11553 to clone the host, CPerlHost should have a c interface, sky */
11554
11555 if (flags & CLONEf_CLONE_HOST) {
11556 return perl_clone_host(proto_perl,flags);
11557 }
11558 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
11559 proto_perl->IMem,
11560 proto_perl->IMemShared,
11561 proto_perl->IMemParse,
11562 proto_perl->IEnv,
11563 proto_perl->IStdIO,
11564 proto_perl->ILIO,
11565 proto_perl->IDir,
11566 proto_perl->ISock,
11567 proto_perl->IProc);
11568}
11569
11570PerlInterpreter *
11571perl_clone_using(PerlInterpreter *proto_perl, UV flags,
11572 struct IPerlMem* ipM, struct IPerlMem* ipMS,
11573 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
11574 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
11575 struct IPerlDir* ipD, struct IPerlSock* ipS,
11576 struct IPerlProc* ipP)
11577{
11578 /* XXX many of the string copies here can be optimized if they're
11579 * constants; they need to be allocated as common memory and just
11580 * their pointers copied. */
11581
11582 IV i;
64aa0685
GS
11583 CLONE_PARAMS clone_params;
11584 CLONE_PARAMS* param = &clone_params;
d2d73c3e 11585
1d7c1841 11586 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
9660f481
DM
11587 /* for each stash, determine whether its objects should be cloned */
11588 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
ba869deb 11589 PERL_SET_THX(my_perl);
1d7c1841 11590
acfe0abc 11591# ifdef DEBUGGING
a4530404 11592 Poison(my_perl, 1, PerlInterpreter);
fd0854ff 11593 PL_op = Nullop;
c008732b 11594 PL_curcop = (COP *)Nullop;
1d7c1841
GS
11595 PL_markstack = 0;
11596 PL_scopestack = 0;
11597 PL_savestack = 0;
22f7c9c9
JH
11598 PL_savestack_ix = 0;
11599 PL_savestack_max = -1;
66fe0623 11600 PL_sig_pending = 0;
25596c82 11601 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
acfe0abc 11602# else /* !DEBUGGING */
1d7c1841 11603 Zero(my_perl, 1, PerlInterpreter);
acfe0abc 11604# endif /* DEBUGGING */
1d7c1841
GS
11605
11606 /* host pointers */
11607 PL_Mem = ipM;
11608 PL_MemShared = ipMS;
11609 PL_MemParse = ipMP;
11610 PL_Env = ipE;
11611 PL_StdIO = ipStd;
11612 PL_LIO = ipLIO;
11613 PL_Dir = ipD;
11614 PL_Sock = ipS;
11615 PL_Proc = ipP;
1d7c1841
GS
11616#else /* !PERL_IMPLICIT_SYS */
11617 IV i;
64aa0685
GS
11618 CLONE_PARAMS clone_params;
11619 CLONE_PARAMS* param = &clone_params;
1d7c1841 11620 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
9660f481
DM
11621 /* for each stash, determine whether its objects should be cloned */
11622 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
ba869deb 11623 PERL_SET_THX(my_perl);
1d7c1841
GS
11624
11625# ifdef DEBUGGING
a4530404 11626 Poison(my_perl, 1, PerlInterpreter);
fd0854ff 11627 PL_op = Nullop;
c008732b 11628 PL_curcop = (COP *)Nullop;
1d7c1841
GS
11629 PL_markstack = 0;
11630 PL_scopestack = 0;
11631 PL_savestack = 0;
22f7c9c9
JH
11632 PL_savestack_ix = 0;
11633 PL_savestack_max = -1;
66fe0623 11634 PL_sig_pending = 0;
25596c82 11635 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
1d7c1841
GS
11636# else /* !DEBUGGING */
11637 Zero(my_perl, 1, PerlInterpreter);
11638# endif /* DEBUGGING */
11639#endif /* PERL_IMPLICIT_SYS */
83236556 11640 param->flags = flags;
59b40662 11641 param->proto_perl = proto_perl;
1d7c1841
GS
11642
11643 /* arena roots */
612f20c3 11644 PL_xnv_arenaroot = NULL;
1d7c1841 11645 PL_xnv_root = NULL;
612f20c3 11646 PL_xpv_arenaroot = NULL;
1d7c1841 11647 PL_xpv_root = NULL;
612f20c3 11648 PL_xpviv_arenaroot = NULL;
1d7c1841 11649 PL_xpviv_root = NULL;
612f20c3 11650 PL_xpvnv_arenaroot = NULL;
1d7c1841 11651 PL_xpvnv_root = NULL;
612f20c3 11652 PL_xpvcv_arenaroot = NULL;
1d7c1841 11653 PL_xpvcv_root = NULL;
612f20c3 11654 PL_xpvav_arenaroot = NULL;
1d7c1841 11655 PL_xpvav_root = NULL;
612f20c3 11656 PL_xpvhv_arenaroot = NULL;
1d7c1841 11657 PL_xpvhv_root = NULL;
612f20c3 11658 PL_xpvmg_arenaroot = NULL;
1d7c1841 11659 PL_xpvmg_root = NULL;
7552b40b
DM
11660 PL_xpvgv_arenaroot = NULL;
11661 PL_xpvgv_root = NULL;
612f20c3 11662 PL_xpvlv_arenaroot = NULL;
1d7c1841 11663 PL_xpvlv_root = NULL;
612f20c3 11664 PL_xpvbm_arenaroot = NULL;
1d7c1841 11665 PL_xpvbm_root = NULL;
612f20c3 11666 PL_he_arenaroot = NULL;
1d7c1841 11667 PL_he_root = NULL;
892b45be 11668#if defined(USE_ITHREADS)
32e691d0
NC
11669 PL_pte_arenaroot = NULL;
11670 PL_pte_root = NULL;
892b45be 11671#endif
1d7c1841
GS
11672 PL_nice_chunk = NULL;
11673 PL_nice_chunk_size = 0;
11674 PL_sv_count = 0;
11675 PL_sv_objcount = 0;
11676 PL_sv_root = Nullsv;
11677 PL_sv_arenaroot = Nullsv;
11678
11679 PL_debug = proto_perl->Idebug;
11680
8df990a8
NC
11681 PL_hash_seed = proto_perl->Ihash_seed;
11682 PL_rehash_seed = proto_perl->Irehash_seed;
11683
e5dd39fc 11684#ifdef USE_REENTRANT_API
68853529
SB
11685 /* XXX: things like -Dm will segfault here in perlio, but doing
11686 * PERL_SET_CONTEXT(proto_perl);
11687 * breaks too many other things
11688 */
59bd0823 11689 Perl_reentrant_init(aTHX);
e5dd39fc
AB
11690#endif
11691
1d7c1841
GS
11692 /* create SV map for pointer relocation */
11693 PL_ptr_table = ptr_table_new();
c21d1a0f
NC
11694 /* and one for finding shared hash keys quickly */
11695 PL_shared_hek_table = ptr_table_new();
1d7c1841
GS
11696
11697 /* initialize these special pointers as early as possible */
11698 SvANY(&PL_sv_undef) = NULL;
11699 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
11700 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
11701 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
11702
1d7c1841 11703 SvANY(&PL_sv_no) = new_XPVNV();
1d7c1841 11704 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
0309f36e
NC
11705 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11706 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
f880fe2f 11707 SvPV_set(&PL_sv_no, SAVEPVN(PL_No, 0));
b162af07
SP
11708 SvCUR_set(&PL_sv_no, 0);
11709 SvLEN_set(&PL_sv_no, 1);
45977657 11710 SvIV_set(&PL_sv_no, 0);
9d6ce603 11711 SvNV_set(&PL_sv_no, 0);
1d7c1841
GS
11712 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
11713
1d7c1841 11714 SvANY(&PL_sv_yes) = new_XPVNV();
1d7c1841 11715 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
0309f36e
NC
11716 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11717 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
f880fe2f 11718 SvPV_set(&PL_sv_yes, SAVEPVN(PL_Yes, 1));
b162af07
SP
11719 SvCUR_set(&PL_sv_yes, 1);
11720 SvLEN_set(&PL_sv_yes, 2);
45977657 11721 SvIV_set(&PL_sv_yes, 1);
9d6ce603 11722 SvNV_set(&PL_sv_yes, 1);
1d7c1841
GS
11723 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
11724
05ec9bb3 11725 /* create (a non-shared!) shared string table */
1d7c1841
GS
11726 PL_strtab = newHV();
11727 HvSHAREKEYS_off(PL_strtab);
c4a9c09d 11728 hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
1d7c1841
GS
11729 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
11730
05ec9bb3
NIS
11731 PL_compiling = proto_perl->Icompiling;
11732
11733 /* These two PVs will be free'd special way so must set them same way op.c does */
11734 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
11735 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
11736
11737 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
11738 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
11739
1d7c1841
GS
11740 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
11741 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 11742 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 11743 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 11744 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
11745 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
11746
11747 /* pseudo environmental stuff */
11748 PL_origargc = proto_perl->Iorigargc;
e2975953 11749 PL_origargv = proto_perl->Iorigargv;
d2d73c3e 11750
d2d73c3e
AB
11751 param->stashes = newAV(); /* Setup array of objects to call clone on */
11752
a1ea730d 11753#ifdef PERLIO_LAYERS
3a1ee7e8
NIS
11754 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11755 PerlIO_clone(aTHX_ proto_perl, param);
a1ea730d 11756#endif
d2d73c3e
AB
11757
11758 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
11759 PL_incgv = gv_dup(proto_perl->Iincgv, param);
11760 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 11761 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
11762 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
11763 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
11764
11765 /* switches */
11766 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 11767 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
11768 PL_localpatches = proto_perl->Ilocalpatches;
11769 PL_splitstr = proto_perl->Isplitstr;
11770 PL_preprocess = proto_perl->Ipreprocess;
11771 PL_minus_n = proto_perl->Iminus_n;
11772 PL_minus_p = proto_perl->Iminus_p;
11773 PL_minus_l = proto_perl->Iminus_l;
11774 PL_minus_a = proto_perl->Iminus_a;
11775 PL_minus_F = proto_perl->Iminus_F;
11776 PL_doswitches = proto_perl->Idoswitches;
11777 PL_dowarn = proto_perl->Idowarn;
11778 PL_doextract = proto_perl->Idoextract;
11779 PL_sawampersand = proto_perl->Isawampersand;
11780 PL_unsafe = proto_perl->Iunsafe;
11781 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 11782 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
11783 PL_perldb = proto_perl->Iperldb;
11784 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
1cbb0781 11785 PL_exit_flags = proto_perl->Iexit_flags;
1d7c1841
GS
11786
11787 /* magical thingies */
11788 /* XXX time(&PL_basetime) when asked for? */
11789 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 11790 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
11791
11792 PL_maxsysfd = proto_perl->Imaxsysfd;
11793 PL_multiline = proto_perl->Imultiline;
11794 PL_statusvalue = proto_perl->Istatusvalue;
11795#ifdef VMS
11796 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
11797#endif
0a378802 11798 PL_encoding = sv_dup(proto_perl->Iencoding, param);
1d7c1841 11799
4a4c6fe3 11800 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
1f483ca1
JH
11801 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
11802 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
4a4c6fe3 11803
d2f185dc
AMS
11804 /* Clone the regex array */
11805 PL_regex_padav = newAV();
11806 {
a3b680e6 11807 const I32 len = av_len((AV*)proto_perl->Iregex_padav);
d2f185dc 11808 SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
0f95fc41
AB
11809 av_push(PL_regex_padav,
11810 sv_dup_inc(regexen[0],param));
11811 for(i = 1; i <= len; i++) {
11812 if(SvREPADTMP(regexen[i])) {
11813 av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
8cf8f3d1 11814 } else {
0f95fc41
AB
11815 av_push(PL_regex_padav,
11816 SvREFCNT_inc(
8cf8f3d1 11817 newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
cbfa9890 11818 SvIVX(regexen[i])), param)))
0f95fc41
AB
11819 ));
11820 }
d2f185dc
AMS
11821 }
11822 }
11823 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 11824
1d7c1841 11825 /* shortcuts to various I/O objects */
d2d73c3e
AB
11826 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
11827 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
11828 PL_defgv = gv_dup(proto_perl->Idefgv, param);
11829 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
11830 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
11831 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
11832
11833 /* shortcuts to regexp stuff */
d2d73c3e 11834 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
11835
11836 /* shortcuts to misc objects */
d2d73c3e 11837 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
11838
11839 /* shortcuts to debugging objects */
d2d73c3e
AB
11840 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
11841 PL_DBline = gv_dup(proto_perl->IDBline, param);
11842 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
11843 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
11844 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
11845 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
06492da6 11846 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
d2d73c3e
AB
11847 PL_lineary = av_dup(proto_perl->Ilineary, param);
11848 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
11849
11850 /* symbol tables */
d2d73c3e
AB
11851 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
11852 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
d2d73c3e
AB
11853 PL_debstash = hv_dup(proto_perl->Idebstash, param);
11854 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
11855 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
11856
11857 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
ee1c5a4e 11858 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
ece599bd 11859 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
d2d73c3e
AB
11860 PL_endav = av_dup_inc(proto_perl->Iendav, param);
11861 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
11862 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
11863
11864 PL_sub_generation = proto_perl->Isub_generation;
11865
11866 /* funky return mechanisms */
11867 PL_forkprocess = proto_perl->Iforkprocess;
11868
11869 /* subprocess state */
d2d73c3e 11870 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
11871
11872 /* internal state */
11873 PL_tainting = proto_perl->Itainting;
7135f00b 11874 PL_taint_warn = proto_perl->Itaint_warn;
1d7c1841
GS
11875 PL_maxo = proto_perl->Imaxo;
11876 if (proto_perl->Iop_mask)
11877 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11878 else
11879 PL_op_mask = Nullch;
06492da6 11880 /* PL_asserting = proto_perl->Iasserting; */
1d7c1841
GS
11881
11882 /* current interpreter roots */
d2d73c3e 11883 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
11884 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
11885 PL_main_start = proto_perl->Imain_start;
e977893f 11886 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
11887 PL_eval_start = proto_perl->Ieval_start;
11888
11889 /* runtime control stuff */
11890 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
11891 PL_copline = proto_perl->Icopline;
11892
11893 PL_filemode = proto_perl->Ifilemode;
11894 PL_lastfd = proto_perl->Ilastfd;
11895 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
11896 PL_Argv = NULL;
11897 PL_Cmd = Nullch;
11898 PL_gensym = proto_perl->Igensym;
11899 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 11900 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
11901 PL_laststatval = proto_perl->Ilaststatval;
11902 PL_laststype = proto_perl->Ilaststype;
11903 PL_mess_sv = Nullsv;
11904
d2d73c3e 11905 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
11906 PL_ofmt = SAVEPV(proto_perl->Iofmt);
11907
11908 /* interpreter atexit processing */
11909 PL_exitlistlen = proto_perl->Iexitlistlen;
11910 if (PL_exitlistlen) {
11911 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11912 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11913 }
11914 else
11915 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 11916 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
19e8ce8e
AB
11917 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
11918 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1d7c1841
GS
11919
11920 PL_profiledata = NULL;
a8fc9800 11921 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
1d7c1841 11922 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 11923 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 11924
d2d73c3e 11925 PL_compcv = cv_dup(proto_perl->Icompcv, param);
dd2155a4
DM
11926
11927 PAD_CLONE_VARS(proto_perl, param);
1d7c1841
GS
11928
11929#ifdef HAVE_INTERP_INTERN
11930 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11931#endif
11932
11933 /* more statics moved here */
11934 PL_generation = proto_perl->Igeneration;
d2d73c3e 11935 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
11936
11937 PL_in_clean_objs = proto_perl->Iin_clean_objs;
11938 PL_in_clean_all = proto_perl->Iin_clean_all;
11939
11940 PL_uid = proto_perl->Iuid;
11941 PL_euid = proto_perl->Ieuid;
11942 PL_gid = proto_perl->Igid;
11943 PL_egid = proto_perl->Iegid;
11944 PL_nomemok = proto_perl->Inomemok;
11945 PL_an = proto_perl->Ian;
1d7c1841
GS
11946 PL_evalseq = proto_perl->Ievalseq;
11947 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
11948 PL_origalen = proto_perl->Iorigalen;
11949 PL_pidstatus = newHV(); /* XXX flag for cloning? */
11950 PL_osname = SAVEPV(proto_perl->Iosname);
5c728af0 11951 PL_sh_path_compat = proto_perl->Ish_path_compat; /* XXX never deallocated */
1d7c1841
GS
11952 PL_sighandlerp = proto_perl->Isighandlerp;
11953
11954
11955 PL_runops = proto_perl->Irunops;
11956
11957 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
11958
11959#ifdef CSH
11960 PL_cshlen = proto_perl->Icshlen;
74f1b2b8 11961 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
1d7c1841
GS
11962#endif
11963
11964 PL_lex_state = proto_perl->Ilex_state;
11965 PL_lex_defer = proto_perl->Ilex_defer;
11966 PL_lex_expect = proto_perl->Ilex_expect;
11967 PL_lex_formbrack = proto_perl->Ilex_formbrack;
11968 PL_lex_dojoin = proto_perl->Ilex_dojoin;
11969 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
11970 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
11971 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
11972 PL_lex_op = proto_perl->Ilex_op;
11973 PL_lex_inpat = proto_perl->Ilex_inpat;
11974 PL_lex_inwhat = proto_perl->Ilex_inwhat;
11975 PL_lex_brackets = proto_perl->Ilex_brackets;
11976 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
11977 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
11978 PL_lex_casemods = proto_perl->Ilex_casemods;
11979 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
11980 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
11981
11982 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
11983 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
11984 PL_nexttoke = proto_perl->Inexttoke;
11985
1d773130
TB
11986 /* XXX This is probably masking the deeper issue of why
11987 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
11988 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
11989 * (A little debugging with a watchpoint on it may help.)
11990 */
389edf32
TB
11991 if (SvANY(proto_perl->Ilinestr)) {
11992 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
11993 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
11994 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11995 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
11996 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11997 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
11998 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11999 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
12000 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
12001 }
12002 else {
12003 PL_linestr = NEWSV(65,79);
12004 sv_upgrade(PL_linestr,SVt_PVIV);
12005 sv_setpvn(PL_linestr,"",0);
12006 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
12007 }
1d7c1841 12008 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1d7c1841
GS
12009 PL_pending_ident = proto_perl->Ipending_ident;
12010 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
12011
12012 PL_expect = proto_perl->Iexpect;
12013
12014 PL_multi_start = proto_perl->Imulti_start;
12015 PL_multi_end = proto_perl->Imulti_end;
12016 PL_multi_open = proto_perl->Imulti_open;
12017 PL_multi_close = proto_perl->Imulti_close;
12018
12019 PL_error_count = proto_perl->Ierror_count;
12020 PL_subline = proto_perl->Isubline;
d2d73c3e 12021 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841 12022
1d773130 12023 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
389edf32
TB
12024 if (SvANY(proto_perl->Ilinestr)) {
12025 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
12026 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
12027 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
12028 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
12029 PL_last_lop_op = proto_perl->Ilast_lop_op;
12030 }
12031 else {
12032 PL_last_uni = SvPVX(PL_linestr);
12033 PL_last_lop = SvPVX(PL_linestr);
12034 PL_last_lop_op = 0;
12035 }
1d7c1841 12036 PL_in_my = proto_perl->Iin_my;
d2d73c3e 12037 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
12038#ifdef FCRYPT
12039 PL_cryptseen = proto_perl->Icryptseen;
12040#endif
12041
12042 PL_hints = proto_perl->Ihints;
12043
12044 PL_amagic_generation = proto_perl->Iamagic_generation;
12045
12046#ifdef USE_LOCALE_COLLATE
12047 PL_collation_ix = proto_perl->Icollation_ix;
12048 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
12049 PL_collation_standard = proto_perl->Icollation_standard;
12050 PL_collxfrm_base = proto_perl->Icollxfrm_base;
12051 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
12052#endif /* USE_LOCALE_COLLATE */
12053
12054#ifdef USE_LOCALE_NUMERIC
12055 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
12056 PL_numeric_standard = proto_perl->Inumeric_standard;
12057 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 12058 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
12059#endif /* !USE_LOCALE_NUMERIC */
12060
12061 /* utf8 character classes */
d2d73c3e
AB
12062 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
12063 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
12064 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
12065 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
12066 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
12067 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
12068 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
12069 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
12070 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
12071 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
12072 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
12073 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
12074 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
12075 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
12076 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
12077 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
12078 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
b4e400f9 12079 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
82686b01
JH
12080 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
12081 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 12082
6c3182a5 12083 /* Did the locale setup indicate UTF-8? */
9769094f 12084 PL_utf8locale = proto_perl->Iutf8locale;
6c3182a5
JH
12085 /* Unicode features (see perlrun/-C) */
12086 PL_unicode = proto_perl->Iunicode;
12087
12088 /* Pre-5.8 signals control */
12089 PL_signals = proto_perl->Isignals;
12090
12091 /* times() ticks per second */
12092 PL_clocktick = proto_perl->Iclocktick;
12093
12094 /* Recursion stopper for PerlIO_find_layer */
12095 PL_in_load_module = proto_perl->Iin_load_module;
12096
12097 /* sort() routine */
12098 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
12099
57c6e6d2
JH
12100 /* Not really needed/useful since the reenrant_retint is "volatile",
12101 * but do it for consistency's sake. */
12102 PL_reentrant_retint = proto_perl->Ireentrant_retint;
12103
15a5279a
JH
12104 /* Hooks to shared SVs and locks. */
12105 PL_sharehook = proto_perl->Isharehook;
12106 PL_lockhook = proto_perl->Ilockhook;
12107 PL_unlockhook = proto_perl->Iunlockhook;
12108 PL_threadhook = proto_perl->Ithreadhook;
12109
bce260cd
JH
12110 PL_runops_std = proto_perl->Irunops_std;
12111 PL_runops_dbg = proto_perl->Irunops_dbg;
12112
12113#ifdef THREADS_HAVE_PIDS
12114 PL_ppid = proto_perl->Ippid;
12115#endif
12116
1d7c1841
GS
12117 /* swatch cache */
12118 PL_last_swash_hv = Nullhv; /* reinits on demand */
12119 PL_last_swash_klen = 0;
12120 PL_last_swash_key[0]= '\0';
12121 PL_last_swash_tmps = (U8*)NULL;
12122 PL_last_swash_slen = 0;
12123
1d7c1841
GS
12124 PL_glob_index = proto_perl->Iglob_index;
12125 PL_srand_called = proto_perl->Isrand_called;
12126 PL_uudmap['M'] = 0; /* reinits on demand */
12127 PL_bitcount = Nullch; /* reinits on demand */
12128
66fe0623
NIS
12129 if (proto_perl->Ipsig_pend) {
12130 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 12131 }
66fe0623
NIS
12132 else {
12133 PL_psig_pend = (int*)NULL;
12134 }
12135
1d7c1841 12136 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
12137 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
12138 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 12139 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
12140 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
12141 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
12142 }
12143 }
12144 else {
12145 PL_psig_ptr = (SV**)NULL;
12146 PL_psig_name = (SV**)NULL;
12147 }
12148
12149 /* thrdvar.h stuff */
12150
a0739874 12151 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
12152 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
12153 PL_tmps_ix = proto_perl->Ttmps_ix;
12154 PL_tmps_max = proto_perl->Ttmps_max;
12155 PL_tmps_floor = proto_perl->Ttmps_floor;
12156 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
12157 i = 0;
12158 while (i <= PL_tmps_ix) {
d2d73c3e 12159 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
12160 ++i;
12161 }
12162
12163 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
12164 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
12165 Newz(54, PL_markstack, i, I32);
12166 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
12167 - proto_perl->Tmarkstack);
12168 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
12169 - proto_perl->Tmarkstack);
12170 Copy(proto_perl->Tmarkstack, PL_markstack,
12171 PL_markstack_ptr - PL_markstack + 1, I32);
12172
12173 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
12174 * NOTE: unlike the others! */
12175 PL_scopestack_ix = proto_perl->Tscopestack_ix;
12176 PL_scopestack_max = proto_perl->Tscopestack_max;
12177 Newz(54, PL_scopestack, PL_scopestack_max, I32);
12178 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
12179
1d7c1841 12180 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 12181 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
12182
12183 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
12184 PL_curstack = av_dup(proto_perl->Tcurstack, param);
12185 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
12186
12187 /* next PUSHs() etc. set *(PL_stack_sp+1) */
12188 PL_stack_base = AvARRAY(PL_curstack);
12189 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
12190 - proto_perl->Tstack_base);
12191 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
12192
12193 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
12194 * NOTE: unlike the others! */
12195 PL_savestack_ix = proto_perl->Tsavestack_ix;
12196 PL_savestack_max = proto_perl->Tsavestack_max;
12197 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 12198 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
12199 }
12200 else {
12201 init_stacks();
985e7056 12202 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
12203 }
12204
12205 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
12206 PL_top_env = &PL_start_env;
12207
12208 PL_op = proto_perl->Top;
12209
12210 PL_Sv = Nullsv;
12211 PL_Xpv = (XPV*)NULL;
12212 PL_na = proto_perl->Tna;
12213
12214 PL_statbuf = proto_perl->Tstatbuf;
12215 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
12216 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
12217 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
12218#ifdef HAS_TIMES
12219 PL_timesbuf = proto_perl->Ttimesbuf;
12220#endif
12221
12222 PL_tainted = proto_perl->Ttainted;
12223 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
12224 PL_rs = sv_dup_inc(proto_perl->Trs, param);
12225 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
12226 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
12227 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 12228 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
12229 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
12230 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
12231 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
12232
12233 PL_restartop = proto_perl->Trestartop;
12234 PL_in_eval = proto_perl->Tin_eval;
12235 PL_delaymagic = proto_perl->Tdelaymagic;
12236 PL_dirty = proto_perl->Tdirty;
12237 PL_localizing = proto_perl->Tlocalizing;
12238
d2d73c3e 12239 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
dd28f7bb 12240 PL_hv_fetch_ent_mh = Nullhe;
1d7c1841
GS
12241 PL_modcount = proto_perl->Tmodcount;
12242 PL_lastgotoprobe = Nullop;
12243 PL_dumpindent = proto_perl->Tdumpindent;
12244
12245 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
12246 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
12247 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
12248 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
12249 PL_sortcxix = proto_perl->Tsortcxix;
12250 PL_efloatbuf = Nullch; /* reinits on demand */
12251 PL_efloatsize = 0; /* reinits on demand */
12252
12253 /* regex stuff */
12254
12255 PL_screamfirst = NULL;
12256 PL_screamnext = NULL;
12257 PL_maxscream = -1; /* reinits on demand */
12258 PL_lastscream = Nullsv;
12259
12260 PL_watchaddr = NULL;
12261 PL_watchok = Nullch;
12262
12263 PL_regdummy = proto_perl->Tregdummy;
1d7c1841
GS
12264 PL_regprecomp = Nullch;
12265 PL_regnpar = 0;
12266 PL_regsize = 0;
1d7c1841
GS
12267 PL_colorset = 0; /* reinits PL_colors[] */
12268 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841
GS
12269 PL_reginput = Nullch;
12270 PL_regbol = Nullch;
12271 PL_regeol = Nullch;
12272 PL_regstartp = (I32*)NULL;
12273 PL_regendp = (I32*)NULL;
12274 PL_reglastparen = (U32*)NULL;
2d862feb 12275 PL_reglastcloseparen = (U32*)NULL;
1d7c1841 12276 PL_regtill = Nullch;
1d7c1841
GS
12277 PL_reg_start_tmp = (char**)NULL;
12278 PL_reg_start_tmpl = 0;
12279 PL_regdata = (struct reg_data*)NULL;
12280 PL_bostr = Nullch;
12281 PL_reg_flags = 0;
12282 PL_reg_eval_set = 0;
12283 PL_regnarrate = 0;
12284 PL_regprogram = (regnode*)NULL;
12285 PL_regindent = 0;
12286 PL_regcc = (CURCUR*)NULL;
12287 PL_reg_call_cc = (struct re_cc_state*)NULL;
12288 PL_reg_re = (regexp*)NULL;
12289 PL_reg_ganch = Nullch;
12290 PL_reg_sv = Nullsv;
53c4c00c 12291 PL_reg_match_utf8 = FALSE;
1d7c1841
GS
12292 PL_reg_magic = (MAGIC*)NULL;
12293 PL_reg_oldpos = 0;
12294 PL_reg_oldcurpm = (PMOP*)NULL;
12295 PL_reg_curpm = (PMOP*)NULL;
12296 PL_reg_oldsaved = Nullch;
12297 PL_reg_oldsavedlen = 0;
ed252734 12298#ifdef PERL_COPY_ON_WRITE
504cff3b 12299 PL_nrs = Nullsv;
ed252734 12300#endif
1d7c1841
GS
12301 PL_reg_maxiter = 0;
12302 PL_reg_leftiter = 0;
12303 PL_reg_poscache = Nullch;
12304 PL_reg_poscache_size= 0;
12305
12306 /* RE engine - function pointers */
12307 PL_regcompp = proto_perl->Tregcompp;
12308 PL_regexecp = proto_perl->Tregexecp;
12309 PL_regint_start = proto_perl->Tregint_start;
12310 PL_regint_string = proto_perl->Tregint_string;
12311 PL_regfree = proto_perl->Tregfree;
12312
12313 PL_reginterp_cnt = 0;
12314 PL_reg_starttry = 0;
12315
a2efc822
SC
12316 /* Pluggable optimizer */
12317 PL_peepp = proto_perl->Tpeepp;
12318
081fc587
AB
12319 PL_stashcache = newHV();
12320
a0739874
DM
12321 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
12322 ptr_table_free(PL_ptr_table);
12323 PL_ptr_table = NULL;
c21d1a0f
NC
12324 ptr_table_free(PL_shared_hek_table);
12325 PL_shared_hek_table = NULL;
a0739874 12326 }
8cf8f3d1 12327
f284b03f
AMS
12328 /* Call the ->CLONE method, if it exists, for each of the stashes
12329 identified by sv_dup() above.
12330 */
d2d73c3e
AB
12331 while(av_len(param->stashes) != -1) {
12332 HV* stash = (HV*) av_shift(param->stashes);
f284b03f
AMS
12333 GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
12334 if (cloner && GvCV(cloner)) {
12335 dSP;
12336 ENTER;
12337 SAVETMPS;
12338 PUSHMARK(SP);
7423f6db 12339 XPUSHs(sv_2mortal(newSVpvn(HvNAME_get(stash), HvNAMELEN_get(stash))));
f284b03f
AMS
12340 PUTBACK;
12341 call_sv((SV*)GvCV(cloner), G_DISCARD);
12342 FREETMPS;
12343 LEAVE;
12344 }
4a09accc 12345 }
a0739874 12346
dc507217 12347 SvREFCNT_dec(param->stashes);
dc507217 12348
6d26897e
DM
12349 /* orphaned? eg threads->new inside BEGIN or use */
12350 if (PL_compcv && ! SvREFCNT(PL_compcv)) {
a3b680e6 12351 (void)SvREFCNT_inc(PL_compcv);
6d26897e
DM
12352 SAVEFREESV(PL_compcv);
12353 }
12354
1d7c1841 12355 return my_perl;
1d7c1841
GS
12356}
12357
1d7c1841 12358#endif /* USE_ITHREADS */
a0ae6670 12359
9f4817db 12360/*
ccfc67b7
JH
12361=head1 Unicode Support
12362
9f4817db
JH
12363=for apidoc sv_recode_to_utf8
12364
5d170f3a
JH
12365The encoding is assumed to be an Encode object, on entry the PV
12366of the sv is assumed to be octets in that encoding, and the sv
12367will be converted into Unicode (and UTF-8).
9f4817db 12368
5d170f3a
JH
12369If the sv already is UTF-8 (or if it is not POK), or if the encoding
12370is not a reference, nothing is done to the sv. If the encoding is not
1768d7eb
JH
12371an C<Encode::XS> Encoding object, bad things will happen.
12372(See F<lib/encoding.pm> and L<Encode>).
9f4817db 12373
5d170f3a 12374The PV of the sv is returned.
9f4817db 12375
5d170f3a
JH
12376=cut */
12377
12378char *
12379Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
12380{
27da23d5 12381 dVAR;
220e2d4e 12382 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
d0063567
DK
12383 SV *uni;
12384 STRLEN len;
12385 char *s;
12386 dSP;
12387 ENTER;
12388 SAVETMPS;
220e2d4e 12389 save_re_context();
d0063567
DK
12390 PUSHMARK(sp);
12391 EXTEND(SP, 3);
12392 XPUSHs(encoding);
12393 XPUSHs(sv);
7a5fa8a2 12394/*
f9893866
NIS
12395 NI-S 2002/07/09
12396 Passing sv_yes is wrong - it needs to be or'ed set of constants
7a5fa8a2 12397 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
f9893866
NIS
12398 remove converted chars from source.
12399
12400 Both will default the value - let them.
7a5fa8a2 12401
d0063567 12402 XPUSHs(&PL_sv_yes);
f9893866 12403*/
d0063567
DK
12404 PUTBACK;
12405 call_method("decode", G_SCALAR);
12406 SPAGAIN;
12407 uni = POPs;
12408 PUTBACK;
12409 s = SvPV(uni, len);
d0063567
DK
12410 if (s != SvPVX(sv)) {
12411 SvGROW(sv, len + 1);
12412 Move(s, SvPVX(sv), len, char);
12413 SvCUR_set(sv, len);
12414 SvPVX(sv)[len] = 0;
12415 }
12416 FREETMPS;
12417 LEAVE;
d0063567 12418 SvUTF8_on(sv);
95899a2a 12419 return SvPVX(sv);
f9893866 12420 }
95899a2a 12421 return SvPOKp(sv) ? SvPVX(sv) : NULL;
9f4817db
JH
12422}
12423
220e2d4e
IH
12424/*
12425=for apidoc sv_cat_decode
12426
12427The encoding is assumed to be an Encode object, the PV of the ssv is
12428assumed to be octets in that encoding and decoding the input starts
12429from the position which (PV + *offset) pointed to. The dsv will be
12430concatenated the decoded UTF-8 string from ssv. Decoding will terminate
12431when the string tstr appears in decoding output or the input ends on
12432the PV of the ssv. The value which the offset points will be modified
12433to the last input position on the ssv.
68795e93 12434
220e2d4e
IH
12435Returns TRUE if the terminator was found, else returns FALSE.
12436
12437=cut */
12438
12439bool
12440Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
12441 SV *ssv, int *offset, char *tstr, int tlen)
12442{
27da23d5 12443 dVAR;
a73e8557 12444 bool ret = FALSE;
220e2d4e 12445 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
220e2d4e
IH
12446 SV *offsv;
12447 dSP;
12448 ENTER;
12449 SAVETMPS;
12450 save_re_context();
12451 PUSHMARK(sp);
12452 EXTEND(SP, 6);
12453 XPUSHs(encoding);
12454 XPUSHs(dsv);
12455 XPUSHs(ssv);
12456 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
12457 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
12458 PUTBACK;
12459 call_method("cat_decode", G_SCALAR);
12460 SPAGAIN;
12461 ret = SvTRUE(TOPs);
12462 *offset = SvIV(offsv);
12463 PUTBACK;
12464 FREETMPS;
12465 LEAVE;
220e2d4e 12466 }
a73e8557
JH
12467 else
12468 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
12469 return ret;
220e2d4e 12470}
f9893866 12471
241d1a3b
NC
12472/*
12473 * Local variables:
12474 * c-indentation-style: bsd
12475 * c-basic-offset: 4
12476 * indent-tabs-mode: t
12477 * End:
12478 *
37442d52
RGS
12479 * ex: set ts=8 sts=4 sw=4 noet:
12480 */