This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Tests need to skip if there is no Encode configured.
[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))
a29f6d03 52#define SV_COW_NEXT_SV_SET(current,next) SvUVX(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
66Normally, this allocation is done using arenas, which are approximately
671K chunks of memory parcelled up into N heads or bodies. The first slot
68in each arena is reserved, and is used to hold a link to the next arena.
69In the case of heads, the unused first slot also contains some flags and
70a note of the number of slots. Snaked through each arena chain is a
71linked list of free items; when this becomes empty, an extra arena is
72allocated and divided up into N items which are threaded into the free
73list.
645c22ef
DM
74
75The following global variables are associated with arenas:
76
77 PL_sv_arenaroot pointer to list of SV arenas
78 PL_sv_root pointer to list of free SV structures
79
80 PL_foo_arenaroot pointer to list of foo arenas,
81 PL_foo_root pointer to list of free foo bodies
82 ... for foo in xiv, xnv, xrv, xpv etc.
83
84Note that some of the larger and more rarely used body types (eg xpvio)
85are not allocated using arenas, but are instead just malloc()/free()ed as
86required. Also, if PURIFY is defined, arenas are abandoned altogether,
87with all items individually malloc()ed. In addition, a few SV heads are
88not allocated from an arena, but are instead directly created as static
89or auto variables, eg PL_sv_undef.
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
fd0854ff
DM
168#ifdef DEBUG_LEAKING_SCALARS
169# ifdef NETWARE
170# define FREE_SV_DEBUG_FILE(sv) PerlMemfree((sv)->sv_debug_file)
171# else
172# define FREE_SV_DEBUG_FILE(sv) PerlMemShared_free((sv)->sv_debug_file)
173# endif
174#else
175# define FREE_SV_DEBUG_FILE(sv)
176#endif
177
053fc874
GS
178#define plant_SV(p) \
179 STMT_START { \
fd0854ff 180 FREE_SV_DEBUG_FILE(p); \
053fc874
GS
181 SvANY(p) = (void *)PL_sv_root; \
182 SvFLAGS(p) = SVTYPEMASK; \
183 PL_sv_root = (p); \
184 --PL_sv_count; \
185 } STMT_END
a0d0e21e 186
fba3b22e 187/* sv_mutex must be held while calling uproot_SV() */
053fc874
GS
188#define uproot_SV(p) \
189 STMT_START { \
190 (p) = PL_sv_root; \
191 PL_sv_root = (SV*)SvANY(p); \
192 ++PL_sv_count; \
193 } STMT_END
194
645c22ef
DM
195
196/* new_SV(): return a new, empty SV head */
197
eba0f806
DM
198#ifdef DEBUG_LEAKING_SCALARS
199/* provide a real function for a debugger to play with */
200STATIC SV*
201S_new_SV(pTHX)
202{
203 SV* sv;
204
205 LOCK_SV_MUTEX;
206 if (PL_sv_root)
207 uproot_SV(sv);
208 else
209 sv = more_sv();
210 UNLOCK_SV_MUTEX;
211 SvANY(sv) = 0;
212 SvREFCNT(sv) = 1;
213 SvFLAGS(sv) = 0;
fd0854ff
DM
214 sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
215 sv->sv_debug_line = (U16) ((PL_copline == NOLINE) ?
216 (PL_curcop ? CopLINE(PL_curcop) : 0) : PL_copline);
217 sv->sv_debug_inpad = 0;
218 sv->sv_debug_cloned = 0;
219# ifdef NETWARE
220 sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
221# else
222 sv->sv_debug_file = PL_curcop ? savesharedpv(CopFILE(PL_curcop)): NULL;
223# endif
224
eba0f806
DM
225 return sv;
226}
227# define new_SV(p) (p)=S_new_SV(aTHX)
228
229#else
230# define new_SV(p) \
053fc874
GS
231 STMT_START { \
232 LOCK_SV_MUTEX; \
233 if (PL_sv_root) \
234 uproot_SV(p); \
235 else \
236 (p) = more_sv(); \
237 UNLOCK_SV_MUTEX; \
238 SvANY(p) = 0; \
239 SvREFCNT(p) = 1; \
240 SvFLAGS(p) = 0; \
241 } STMT_END
eba0f806 242#endif
463ee0b2 243
645c22ef
DM
244
245/* del_SV(): return an empty SV head to the free list */
246
a0d0e21e 247#ifdef DEBUGGING
4561caa4 248
053fc874
GS
249#define del_SV(p) \
250 STMT_START { \
251 LOCK_SV_MUTEX; \
aea4f609 252 if (DEBUG_D_TEST) \
053fc874
GS
253 del_sv(p); \
254 else \
255 plant_SV(p); \
256 UNLOCK_SV_MUTEX; \
257 } STMT_END
a0d0e21e 258
76e3520e 259STATIC void
cea2e8a9 260S_del_sv(pTHX_ SV *p)
463ee0b2 261{
aea4f609 262 if (DEBUG_D_TEST) {
4633a7c4 263 SV* sva;
a0d0e21e
LW
264 SV* sv;
265 SV* svend;
266 int ok = 0;
3280af22 267 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
4633a7c4
LW
268 sv = sva + 1;
269 svend = &sva[SvREFCNT(sva)];
a0d0e21e
LW
270 if (p >= sv && p < svend)
271 ok = 1;
272 }
273 if (!ok) {
0453d815 274 if (ckWARN_d(WARN_INTERNAL))
9014280d 275 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
276 "Attempt to free non-arena SV: 0x%"UVxf
277 pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
a0d0e21e
LW
278 return;
279 }
280 }
4561caa4 281 plant_SV(p);
463ee0b2 282}
a0d0e21e 283
4561caa4
CS
284#else /* ! DEBUGGING */
285
286#define del_SV(p) plant_SV(p)
287
288#endif /* DEBUGGING */
463ee0b2 289
645c22ef
DM
290
291/*
ccfc67b7
JH
292=head1 SV Manipulation Functions
293
645c22ef
DM
294=for apidoc sv_add_arena
295
296Given a chunk of memory, link it to the head of the list of arenas,
297and split it into a list of free SVs.
298
299=cut
300*/
301
4633a7c4 302void
864dbfa3 303Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
463ee0b2 304{
4633a7c4 305 SV* sva = (SV*)ptr;
463ee0b2
LW
306 register SV* sv;
307 register SV* svend;
4633a7c4
LW
308
309 /* The first SV in an arena isn't an SV. */
3280af22 310 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
311 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
312 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
313
3280af22
NIS
314 PL_sv_arenaroot = sva;
315 PL_sv_root = sva + 1;
4633a7c4
LW
316
317 svend = &sva[SvREFCNT(sva) - 1];
318 sv = sva + 1;
463ee0b2 319 while (sv < svend) {
a0d0e21e 320 SvANY(sv) = (void *)(SV*)(sv + 1);
978b032e 321 SvREFCNT(sv) = 0;
8990e307 322 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
323 sv++;
324 }
325 SvANY(sv) = 0;
4633a7c4
LW
326 SvFLAGS(sv) = SVTYPEMASK;
327}
328
645c22ef
DM
329/* make some more SVs by adding another arena */
330
fba3b22e 331/* sv_mutex must be held while calling more_sv() */
76e3520e 332STATIC SV*
cea2e8a9 333S_more_sv(pTHX)
4633a7c4 334{
4561caa4
CS
335 register SV* sv;
336
3280af22
NIS
337 if (PL_nice_chunk) {
338 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
339 PL_nice_chunk = Nullch;
30ad99e7 340 PL_nice_chunk_size = 0;
c07a80fd 341 }
1edc1566 342 else {
343 char *chunk; /* must use New here to match call to */
344 New(704,chunk,1008,char); /* Safefree() in sv_free_arenas() */
345 sv_add_arena(chunk, 1008, 0);
346 }
4561caa4
CS
347 uproot_SV(sv);
348 return sv;
463ee0b2
LW
349}
350
055972dc
DM
351/* visit(): call the named function for each non-free SV in the arenas
352 * whose flags field matches the flags/mask args. */
645c22ef 353
5226ed68 354STATIC I32
055972dc 355S_visit(pTHX_ SVFUNC_t f, U32 flags, U32 mask)
8990e307 356{
4633a7c4 357 SV* sva;
8990e307
LW
358 SV* sv;
359 register SV* svend;
5226ed68 360 I32 visited = 0;
8990e307 361
3280af22 362 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
4633a7c4 363 svend = &sva[SvREFCNT(sva)];
4561caa4 364 for (sv = sva + 1; sv < svend; ++sv) {
055972dc
DM
365 if (SvTYPE(sv) != SVTYPEMASK
366 && (sv->sv_flags & mask) == flags
367 && SvREFCNT(sv))
368 {
acfe0abc 369 (FCALL)(aTHX_ sv);
5226ed68
JH
370 ++visited;
371 }
8990e307
LW
372 }
373 }
5226ed68 374 return visited;
8990e307
LW
375}
376
758a08c3
JH
377#ifdef DEBUGGING
378
645c22ef
DM
379/* called by sv_report_used() for each live SV */
380
381static void
acfe0abc 382do_report_used(pTHX_ SV *sv)
645c22ef
DM
383{
384 if (SvTYPE(sv) != SVTYPEMASK) {
385 PerlIO_printf(Perl_debug_log, "****\n");
386 sv_dump(sv);
387 }
388}
758a08c3 389#endif
645c22ef
DM
390
391/*
392=for apidoc sv_report_used
393
394Dump the contents of all SVs not yet freed. (Debugging aid).
395
396=cut
397*/
398
8990e307 399void
864dbfa3 400Perl_sv_report_used(pTHX)
4561caa4 401{
ff270d3a 402#ifdef DEBUGGING
055972dc 403 visit(do_report_used, 0, 0);
ff270d3a 404#endif
4561caa4
CS
405}
406
645c22ef
DM
407/* called by sv_clean_objs() for each live SV */
408
409static void
acfe0abc 410do_clean_objs(pTHX_ SV *sv)
645c22ef
DM
411{
412 SV* rv;
413
414 if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
415 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv)));
416 if (SvWEAKREF(sv)) {
417 sv_del_backref(sv);
418 SvWEAKREF_off(sv);
419 SvRV(sv) = 0;
420 } else {
421 SvROK_off(sv);
422 SvRV(sv) = 0;
423 SvREFCNT_dec(rv);
424 }
425 }
426
427 /* XXX Might want to check arrays, etc. */
428}
429
430/* called by sv_clean_objs() for each live SV */
431
432#ifndef DISABLE_DESTRUCTOR_KLUDGE
433static void
acfe0abc 434do_clean_named_objs(pTHX_ SV *sv)
645c22ef
DM
435{
436 if (SvTYPE(sv) == SVt_PVGV && GvGP(sv)) {
437 if ( SvOBJECT(GvSV(sv)) ||
438 (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
439 (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
440 (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
441 (GvCV(sv) && SvOBJECT(GvCV(sv))) )
442 {
443 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
ec5f3c78 444 SvFLAGS(sv) |= SVf_BREAK;
645c22ef
DM
445 SvREFCNT_dec(sv);
446 }
447 }
448}
449#endif
450
451/*
452=for apidoc sv_clean_objs
453
454Attempt to destroy all objects not yet freed
455
456=cut
457*/
458
4561caa4 459void
864dbfa3 460Perl_sv_clean_objs(pTHX)
4561caa4 461{
3280af22 462 PL_in_clean_objs = TRUE;
055972dc 463 visit(do_clean_objs, SVf_ROK, SVf_ROK);
4561caa4 464#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 465 /* some barnacles may yet remain, clinging to typeglobs */
055972dc 466 visit(do_clean_named_objs, SVt_PVGV, SVTYPEMASK);
4561caa4 467#endif
3280af22 468 PL_in_clean_objs = FALSE;
4561caa4
CS
469}
470
645c22ef
DM
471/* called by sv_clean_all() for each live SV */
472
473static void
acfe0abc 474do_clean_all(pTHX_ SV *sv)
645c22ef
DM
475{
476 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
477 SvFLAGS(sv) |= SVf_BREAK;
0e705b3b
DM
478 if (PL_comppad == (AV*)sv) {
479 PL_comppad = Nullav;
480 PL_curpad = Null(SV**);
481 }
645c22ef
DM
482 SvREFCNT_dec(sv);
483}
484
485/*
486=for apidoc sv_clean_all
487
488Decrement the refcnt of each remaining SV, possibly triggering a
489cleanup. This function may have to be called multiple times to free
ff276b08 490SVs which are in complex self-referential hierarchies.
645c22ef
DM
491
492=cut
493*/
494
5226ed68 495I32
864dbfa3 496Perl_sv_clean_all(pTHX)
8990e307 497{
5226ed68 498 I32 cleaned;
3280af22 499 PL_in_clean_all = TRUE;
055972dc 500 cleaned = visit(do_clean_all, 0,0);
3280af22 501 PL_in_clean_all = FALSE;
5226ed68 502 return cleaned;
8990e307 503}
463ee0b2 504
645c22ef
DM
505/*
506=for apidoc sv_free_arenas
507
508Deallocate the memory used by all arenas. Note that all the individual SV
509heads and bodies within the arenas must already have been freed.
510
511=cut
512*/
513
4633a7c4 514void
864dbfa3 515Perl_sv_free_arenas(pTHX)
4633a7c4
LW
516{
517 SV* sva;
518 SV* svanext;
612f20c3 519 XPV *arena, *arenanext;
4633a7c4
LW
520
521 /* Free arenas here, but be careful about fake ones. (We assume
522 contiguity of the fake ones with the corresponding real ones.) */
523
3280af22 524 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
525 svanext = (SV*) SvANY(sva);
526 while (svanext && SvFAKE(svanext))
527 svanext = (SV*) SvANY(svanext);
528
529 if (!SvFAKE(sva))
1edc1566 530 Safefree((void *)sva);
4633a7c4 531 }
5f05dabc 532
612f20c3
GS
533 for (arena = PL_xiv_arenaroot; arena; arena = arenanext) {
534 arenanext = (XPV*)arena->xpv_pv;
535 Safefree(arena);
536 }
537 PL_xiv_arenaroot = 0;
bf9cdc68 538 PL_xiv_root = 0;
612f20c3
GS
539
540 for (arena = PL_xnv_arenaroot; arena; arena = arenanext) {
541 arenanext = (XPV*)arena->xpv_pv;
542 Safefree(arena);
543 }
544 PL_xnv_arenaroot = 0;
bf9cdc68 545 PL_xnv_root = 0;
612f20c3
GS
546
547 for (arena = PL_xrv_arenaroot; arena; arena = arenanext) {
548 arenanext = (XPV*)arena->xpv_pv;
549 Safefree(arena);
550 }
551 PL_xrv_arenaroot = 0;
bf9cdc68 552 PL_xrv_root = 0;
612f20c3
GS
553
554 for (arena = PL_xpv_arenaroot; arena; arena = arenanext) {
555 arenanext = (XPV*)arena->xpv_pv;
556 Safefree(arena);
557 }
558 PL_xpv_arenaroot = 0;
bf9cdc68 559 PL_xpv_root = 0;
612f20c3
GS
560
561 for (arena = (XPV*)PL_xpviv_arenaroot; arena; arena = arenanext) {
562 arenanext = (XPV*)arena->xpv_pv;
563 Safefree(arena);
564 }
565 PL_xpviv_arenaroot = 0;
bf9cdc68 566 PL_xpviv_root = 0;
612f20c3
GS
567
568 for (arena = (XPV*)PL_xpvnv_arenaroot; arena; arena = arenanext) {
569 arenanext = (XPV*)arena->xpv_pv;
570 Safefree(arena);
571 }
572 PL_xpvnv_arenaroot = 0;
bf9cdc68 573 PL_xpvnv_root = 0;
612f20c3
GS
574
575 for (arena = (XPV*)PL_xpvcv_arenaroot; arena; arena = arenanext) {
576 arenanext = (XPV*)arena->xpv_pv;
577 Safefree(arena);
578 }
579 PL_xpvcv_arenaroot = 0;
bf9cdc68 580 PL_xpvcv_root = 0;
612f20c3
GS
581
582 for (arena = (XPV*)PL_xpvav_arenaroot; arena; arena = arenanext) {
583 arenanext = (XPV*)arena->xpv_pv;
584 Safefree(arena);
585 }
586 PL_xpvav_arenaroot = 0;
bf9cdc68 587 PL_xpvav_root = 0;
612f20c3
GS
588
589 for (arena = (XPV*)PL_xpvhv_arenaroot; arena; arena = arenanext) {
590 arenanext = (XPV*)arena->xpv_pv;
591 Safefree(arena);
592 }
593 PL_xpvhv_arenaroot = 0;
bf9cdc68 594 PL_xpvhv_root = 0;
612f20c3
GS
595
596 for (arena = (XPV*)PL_xpvmg_arenaroot; arena; arena = arenanext) {
597 arenanext = (XPV*)arena->xpv_pv;
598 Safefree(arena);
599 }
600 PL_xpvmg_arenaroot = 0;
bf9cdc68 601 PL_xpvmg_root = 0;
612f20c3
GS
602
603 for (arena = (XPV*)PL_xpvlv_arenaroot; arena; arena = arenanext) {
604 arenanext = (XPV*)arena->xpv_pv;
605 Safefree(arena);
606 }
607 PL_xpvlv_arenaroot = 0;
bf9cdc68 608 PL_xpvlv_root = 0;
612f20c3
GS
609
610 for (arena = (XPV*)PL_xpvbm_arenaroot; arena; arena = arenanext) {
611 arenanext = (XPV*)arena->xpv_pv;
612 Safefree(arena);
613 }
614 PL_xpvbm_arenaroot = 0;
bf9cdc68 615 PL_xpvbm_root = 0;
612f20c3
GS
616
617 for (arena = (XPV*)PL_he_arenaroot; arena; arena = arenanext) {
618 arenanext = (XPV*)arena->xpv_pv;
619 Safefree(arena);
620 }
621 PL_he_arenaroot = 0;
bf9cdc68 622 PL_he_root = 0;
612f20c3 623
3280af22
NIS
624 if (PL_nice_chunk)
625 Safefree(PL_nice_chunk);
626 PL_nice_chunk = Nullch;
627 PL_nice_chunk_size = 0;
628 PL_sv_arenaroot = 0;
629 PL_sv_root = 0;
4633a7c4
LW
630}
631
29489e7c
DM
632/* ---------------------------------------------------------------------
633 *
634 * support functions for report_uninit()
635 */
636
637/* the maxiumum size of array or hash where we will scan looking
638 * for the undefined element that triggered the warning */
639
640#define FUV_MAX_SEARCH_SIZE 1000
641
642/* Look for an entry in the hash whose value has the same SV as val;
643 * If so, return a mortal copy of the key. */
644
645STATIC SV*
646S_find_hash_subscript(pTHX_ HV *hv, SV* val)
647{
648 register HE **array;
649 register HE *entry;
650 I32 i;
651
652 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
653 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
654 return Nullsv;
655
656 array = HvARRAY(hv);
657
658 for (i=HvMAX(hv); i>0; i--) {
659 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
660 if (HeVAL(entry) != val)
661 continue;
662 if ( HeVAL(entry) == &PL_sv_undef ||
663 HeVAL(entry) == &PL_sv_placeholder)
664 continue;
665 if (!HeKEY(entry))
666 return Nullsv;
667 if (HeKLEN(entry) == HEf_SVKEY)
668 return sv_mortalcopy(HeKEY_sv(entry));
669 return sv_2mortal(newSVpvn(HeKEY(entry), HeKLEN(entry)));
670 }
671 }
672 return Nullsv;
673}
674
675/* Look for an entry in the array whose value has the same SV as val;
676 * If so, return the index, otherwise return -1. */
677
678STATIC I32
679S_find_array_subscript(pTHX_ AV *av, SV* val)
680{
681 SV** svp;
682 I32 i;
683 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
684 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
685 return -1;
686
687 svp = AvARRAY(av);
688 for (i=AvFILLp(av); i>=0; i--) {
689 if (svp[i] == val && svp[i] != &PL_sv_undef)
690 return i;
691 }
692 return -1;
693}
694
695/* S_varname(): return the name of a variable, optionally with a subscript.
696 * If gv is non-zero, use the name of that global, along with gvtype (one
697 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
698 * targ. Depending on the value of the subscript_type flag, return:
699 */
700
701#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
702#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
703#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
704#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
705
706STATIC SV*
bfed75c6 707S_varname(pTHX_ GV *gv, const char *gvtype, PADOFFSET targ,
29489e7c
DM
708 SV* keyname, I32 aindex, int subscript_type)
709{
710 AV *av;
711
712 SV *sv, *name;
713
714 name = sv_newmortal();
715 if (gv) {
716
717 /* simulate gv_fullname4(), but add literal '^' for $^FOO names
718 * XXX get rid of all this if gv_fullnameX() ever supports this
719 * directly */
720
bfed75c6 721 const char *p;
29489e7c
DM
722 HV *hv = GvSTASH(gv);
723 sv_setpv(name, gvtype);
724 if (!hv)
725 p = "???";
bfed75c6 726 else if (!(p=HvNAME(hv)))
29489e7c 727 p = "__ANON__";
29489e7c
DM
728 if (strNE(p, "main")) {
729 sv_catpv(name,p);
730 sv_catpvn(name,"::", 2);
731 }
732 if (GvNAMELEN(gv)>= 1 &&
733 ((unsigned int)*GvNAME(gv)) <= 26)
734 { /* handle $^FOO */
735 Perl_sv_catpvf(aTHX_ name,"^%c", *GvNAME(gv) + 'A' - 1);
736 sv_catpvn(name,GvNAME(gv)+1,GvNAMELEN(gv)-1);
737 }
738 else
739 sv_catpvn(name,GvNAME(gv),GvNAMELEN(gv));
740 }
741 else {
742 U32 u;
743 CV *cv = find_runcv(&u);
744 if (!cv || !CvPADLIST(cv))
745 return Nullsv;;
746 av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
747 sv = *av_fetch(av, targ, FALSE);
748 /* SvLEN in a pad name is not to be trusted */
749 sv_setpv(name, SvPV_nolen(sv));
750 }
751
752 if (subscript_type == FUV_SUBSCRIPT_HASH) {
753 *SvPVX(name) = '$';
754 sv = NEWSV(0,0);
755 Perl_sv_catpvf(aTHX_ name, "{%s}",
756 pv_display(sv,SvPVX(keyname), SvCUR(keyname), 0, 32));
757 SvREFCNT_dec(sv);
758 }
759 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
760 *SvPVX(name) = '$';
265a12b8 761 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
29489e7c
DM
762 }
763 else if (subscript_type == FUV_SUBSCRIPT_WITHIN)
764 sv_insert(name, 0, 0, "within ", 7);
765
766 return name;
767}
768
769
770/*
771=for apidoc find_uninit_var
772
773Find the name of the undefined variable (if any) that caused the operator o
774to issue a "Use of uninitialized value" warning.
775If match is true, only return a name if it's value matches uninit_sv.
776So roughly speaking, if a unary operator (such as OP_COS) generates a
777warning, then following the direct child of the op may yield an
778OP_PADSV or OP_GV that gives the name of the undefined variable. On the
779other hand, with OP_ADD there are two branches to follow, so we only print
780the variable name if we get an exact match.
781
782The name is returned as a mortal SV.
783
784Assumes that PL_op is the op that originally triggered the error, and that
785PL_comppad/PL_curpad points to the currently executing pad.
786
787=cut
788*/
789
790STATIC SV *
791S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
792{
793 SV *sv;
794 AV *av;
795 SV **svp;
796 GV *gv;
797 OP *o, *o2, *kid;
798
799 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
800 uninit_sv == &PL_sv_placeholder)))
801 return Nullsv;
802
803 switch (obase->op_type) {
804
805 case OP_RV2AV:
806 case OP_RV2HV:
807 case OP_PADAV:
808 case OP_PADHV:
809 {
810 bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
811 bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
112dcc46
RGS
812 I32 index = 0;
813 SV *keysv = Nullsv;
29489e7c
DM
814 int subscript_type = FUV_SUBSCRIPT_WITHIN;
815
816 if (pad) { /* @lex, %lex */
817 sv = PAD_SVl(obase->op_targ);
818 gv = Nullgv;
819 }
820 else {
821 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
822 /* @global, %global */
823 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
824 if (!gv)
825 break;
826 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
827 }
828 else /* @{expr}, %{expr} */
829 return find_uninit_var(cUNOPx(obase)->op_first,
830 uninit_sv, match);
831 }
832
833 /* attempt to find a match within the aggregate */
834 if (hash) {
835 keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
836 if (keysv)
837 subscript_type = FUV_SUBSCRIPT_HASH;
838 }
839 else {
840 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
841 if (index >= 0)
842 subscript_type = FUV_SUBSCRIPT_ARRAY;
843 }
844
845 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
846 break;
847
848 return S_varname(aTHX_ gv, hash ? "%" : "@", obase->op_targ,
849 keysv, index, subscript_type);
850 }
851
852 case OP_PADSV:
853 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
854 break;
855 return S_varname(aTHX_ Nullgv, "$", obase->op_targ,
856 Nullsv, 0, FUV_SUBSCRIPT_NONE);
857
858 case OP_GVSV:
859 gv = cGVOPx_gv(obase);
860 if (!gv || (match && GvSV(gv) != uninit_sv))
861 break;
862 return S_varname(aTHX_ gv, "$", 0, Nullsv, 0, FUV_SUBSCRIPT_NONE);
863
864 case OP_AELEMFAST:
865 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
866 if (match) {
867 av = (AV*)PAD_SV(obase->op_targ);
868 if (!av || SvRMAGICAL(av))
869 break;
870 svp = av_fetch(av, (I32)obase->op_private, FALSE);
871 if (!svp || *svp != uninit_sv)
872 break;
873 }
874 return S_varname(aTHX_ Nullgv, "$", obase->op_targ,
875 Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
876 }
877 else {
878 gv = cGVOPx_gv(obase);
879 if (!gv)
880 break;
881 if (match) {
882 av = GvAV(gv);
883 if (!av || SvRMAGICAL(av))
884 break;
885 svp = av_fetch(av, (I32)obase->op_private, FALSE);
886 if (!svp || *svp != uninit_sv)
887 break;
888 }
889 return S_varname(aTHX_ gv, "$", 0,
890 Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
891 }
892 break;
893
894 case OP_EXISTS:
895 o = cUNOPx(obase)->op_first;
896 if (!o || o->op_type != OP_NULL ||
897 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
898 break;
899 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
900
901 case OP_AELEM:
902 case OP_HELEM:
903 if (PL_op == obase)
904 /* $a[uninit_expr] or $h{uninit_expr} */
905 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
906
907 gv = Nullgv;
908 o = cBINOPx(obase)->op_first;
909 kid = cBINOPx(obase)->op_last;
910
911 /* get the av or hv, and optionally the gv */
912 sv = Nullsv;
913 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
914 sv = PAD_SV(o->op_targ);
915 }
916 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
917 && cUNOPo->op_first->op_type == OP_GV)
918 {
919 gv = cGVOPx_gv(cUNOPo->op_first);
920 if (!gv)
921 break;
922 sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
923 }
924 if (!sv)
925 break;
926
927 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
928 /* index is constant */
929 if (match) {
930 if (SvMAGICAL(sv))
931 break;
932 if (obase->op_type == OP_HELEM) {
933 HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
934 if (!he || HeVAL(he) != uninit_sv)
935 break;
936 }
937 else {
938 svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
939 if (!svp || *svp != uninit_sv)
940 break;
941 }
942 }
943 if (obase->op_type == OP_HELEM)
944 return S_varname(aTHX_ gv, "%", o->op_targ,
945 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
946 else
947 return S_varname(aTHX_ gv, "@", o->op_targ, Nullsv,
948 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
949 ;
950 }
951 else {
952 /* index is an expression;
953 * attempt to find a match within the aggregate */
954 if (obase->op_type == OP_HELEM) {
955 SV *keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
956 if (keysv)
957 return S_varname(aTHX_ gv, "%", o->op_targ,
958 keysv, 0, FUV_SUBSCRIPT_HASH);
959 }
960 else {
961 I32 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
962 if (index >= 0)
963 return S_varname(aTHX_ gv, "@", o->op_targ,
964 Nullsv, index, FUV_SUBSCRIPT_ARRAY);
965 }
966 if (match)
967 break;
968 return S_varname(aTHX_ gv,
969 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
970 ? "@" : "%",
971 o->op_targ, Nullsv, 0, FUV_SUBSCRIPT_WITHIN);
972 }
973
974 break;
975
976 case OP_AASSIGN:
977 /* only examine RHS */
978 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
979
980 case OP_OPEN:
981 o = cUNOPx(obase)->op_first;
982 if (o->op_type == OP_PUSHMARK)
983 o = o->op_sibling;
984
985 if (!o->op_sibling) {
986 /* one-arg version of open is highly magical */
987
988 if (o->op_type == OP_GV) { /* open FOO; */
989 gv = cGVOPx_gv(o);
990 if (match && GvSV(gv) != uninit_sv)
991 break;
7a5fa8a2 992 return S_varname(aTHX_ gv, "$", 0,
29489e7c
DM
993 Nullsv, 0, FUV_SUBSCRIPT_NONE);
994 }
995 /* other possibilities not handled are:
996 * open $x; or open my $x; should return '${*$x}'
997 * open expr; should return '$'.expr ideally
998 */
999 break;
1000 }
1001 goto do_op;
1002
1003 /* ops where $_ may be an implicit arg */
1004 case OP_TRANS:
1005 case OP_SUBST:
1006 case OP_MATCH:
1007 if ( !(obase->op_flags & OPf_STACKED)) {
1008 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
1009 ? PAD_SVl(obase->op_targ)
1010 : DEFSV))
1011 {
1012 sv = sv_newmortal();
1013 sv_setpv(sv, "$_");
1014 return sv;
1015 }
1016 }
1017 goto do_op;
1018
1019 case OP_PRTF:
1020 case OP_PRINT:
1021 /* skip filehandle as it can't produce 'undef' warning */
1022 o = cUNOPx(obase)->op_first;
1023 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
1024 o = o->op_sibling->op_sibling;
1025 goto do_op2;
1026
1027
e21bd382 1028 case OP_RV2SV:
29489e7c
DM
1029 case OP_CUSTOM:
1030 case OP_ENTERSUB:
1031 match = 1; /* XS or custom code could trigger random warnings */
1032 goto do_op;
1033
1034 case OP_SCHOMP:
1035 case OP_CHOMP:
1036 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
1037 return sv_2mortal(newSVpv("${$/}", 0));
1038 /* FALL THROUGH */
1039
1040 default:
1041 do_op:
1042 if (!(obase->op_flags & OPf_KIDS))
1043 break;
1044 o = cUNOPx(obase)->op_first;
1045
1046 do_op2:
1047 if (!o)
1048 break;
1049
1050 /* if all except one arg are constant, or have no side-effects,
1051 * or are optimized away, then it's unambiguous */
1052 o2 = Nullop;
1053 for (kid=o; kid; kid = kid->op_sibling) {
1054 if (kid &&
1055 ( (kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid)))
1056 || (kid->op_type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
1057 || (kid->op_type == OP_PUSHMARK)
1058 )
1059 )
1060 continue;
1061 if (o2) { /* more than one found */
1062 o2 = Nullop;
1063 break;
1064 }
1065 o2 = kid;
1066 }
1067 if (o2)
1068 return find_uninit_var(o2, uninit_sv, match);
1069
1070 /* scan all args */
1071 while (o) {
1072 sv = find_uninit_var(o, uninit_sv, 1);
1073 if (sv)
1074 return sv;
1075 o = o->op_sibling;
1076 }
1077 break;
1078 }
1079 return Nullsv;
1080}
1081
1082
645c22ef
DM
1083/*
1084=for apidoc report_uninit
1085
1086Print appropriate "Use of uninitialized variable" warning
1087
1088=cut
1089*/
1090
1d7c1841 1091void
29489e7c
DM
1092Perl_report_uninit(pTHX_ SV* uninit_sv)
1093{
1094 if (PL_op) {
112dcc46 1095 SV* varname = Nullsv;
29489e7c
DM
1096 if (uninit_sv) {
1097 varname = find_uninit_var(PL_op, uninit_sv,0);
1098 if (varname)
1099 sv_insert(varname, 0, 0, " ", 1);
1100 }
9014280d 1101 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
29489e7c
DM
1102 varname ? SvPV_nolen(varname) : "",
1103 " in ", OP_DESC(PL_op));
1104 }
1d7c1841 1105 else
29489e7c
DM
1106 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
1107 "", "", "");
1d7c1841
GS
1108}
1109
645c22ef
DM
1110/* grab a new IV body from the free list, allocating more if necessary */
1111
76e3520e 1112STATIC XPVIV*
cea2e8a9 1113S_new_xiv(pTHX)
463ee0b2 1114{
ea7c11a3 1115 IV* xiv;
cbe51380
GS
1116 LOCK_SV_MUTEX;
1117 if (!PL_xiv_root)
1118 more_xiv();
1119 xiv = PL_xiv_root;
1120 /*
1121 * See comment in more_xiv() -- RAM.
1122 */
1123 PL_xiv_root = *(IV**)xiv;
1124 UNLOCK_SV_MUTEX;
1125 return (XPVIV*)((char*)xiv - STRUCT_OFFSET(XPVIV, xiv_iv));
463ee0b2
LW
1126}
1127
645c22ef
DM
1128/* return an IV body to the free list */
1129
76e3520e 1130STATIC void
cea2e8a9 1131S_del_xiv(pTHX_ XPVIV *p)
463ee0b2 1132{
23e6a22f 1133 IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
cbe51380 1134 LOCK_SV_MUTEX;
3280af22
NIS
1135 *(IV**)xiv = PL_xiv_root;
1136 PL_xiv_root = xiv;
cbe51380 1137 UNLOCK_SV_MUTEX;
463ee0b2
LW
1138}
1139
645c22ef
DM
1140/* allocate another arena's worth of IV bodies */
1141
cbe51380 1142STATIC void
cea2e8a9 1143S_more_xiv(pTHX)
463ee0b2 1144{
ea7c11a3
SM
1145 register IV* xiv;
1146 register IV* xivend;
8c52afec
IZ
1147 XPV* ptr;
1148 New(705, ptr, 1008/sizeof(XPV), XPV);
645c22ef 1149 ptr->xpv_pv = (char*)PL_xiv_arenaroot; /* linked list of xiv arenas */
3280af22 1150 PL_xiv_arenaroot = ptr; /* to keep Purify happy */
a0d0e21e 1151
ea7c11a3
SM
1152 xiv = (IV*) ptr;
1153 xivend = &xiv[1008 / sizeof(IV) - 1];
645c22ef 1154 xiv += (sizeof(XPV) - 1) / sizeof(IV) + 1; /* fudge by size of XPV */
3280af22 1155 PL_xiv_root = xiv;
463ee0b2 1156 while (xiv < xivend) {
ea7c11a3 1157 *(IV**)xiv = (IV *)(xiv + 1);
463ee0b2
LW
1158 xiv++;
1159 }
ea7c11a3 1160 *(IV**)xiv = 0;
463ee0b2
LW
1161}
1162
645c22ef
DM
1163/* grab a new NV body from the free list, allocating more if necessary */
1164
76e3520e 1165STATIC XPVNV*
cea2e8a9 1166S_new_xnv(pTHX)
463ee0b2 1167{
65202027 1168 NV* xnv;
cbe51380
GS
1169 LOCK_SV_MUTEX;
1170 if (!PL_xnv_root)
1171 more_xnv();
1172 xnv = PL_xnv_root;
65202027 1173 PL_xnv_root = *(NV**)xnv;
cbe51380
GS
1174 UNLOCK_SV_MUTEX;
1175 return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
463ee0b2
LW
1176}
1177
645c22ef
DM
1178/* return an NV body to the free list */
1179
76e3520e 1180STATIC void
cea2e8a9 1181S_del_xnv(pTHX_ XPVNV *p)
463ee0b2 1182{
65202027 1183 NV* xnv = (NV*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
cbe51380 1184 LOCK_SV_MUTEX;
65202027 1185 *(NV**)xnv = PL_xnv_root;
3280af22 1186 PL_xnv_root = xnv;
cbe51380 1187 UNLOCK_SV_MUTEX;
463ee0b2
LW
1188}
1189
645c22ef
DM
1190/* allocate another arena's worth of NV bodies */
1191
cbe51380 1192STATIC void
cea2e8a9 1193S_more_xnv(pTHX)
463ee0b2 1194{
65202027
DS
1195 register NV* xnv;
1196 register NV* xnvend;
612f20c3
GS
1197 XPV *ptr;
1198 New(711, ptr, 1008/sizeof(XPV), XPV);
1199 ptr->xpv_pv = (char*)PL_xnv_arenaroot;
1200 PL_xnv_arenaroot = ptr;
1201
1202 xnv = (NV*) ptr;
65202027
DS
1203 xnvend = &xnv[1008 / sizeof(NV) - 1];
1204 xnv += (sizeof(XPVIV) - 1) / sizeof(NV) + 1; /* fudge by sizeof XPVIV */
3280af22 1205 PL_xnv_root = xnv;
463ee0b2 1206 while (xnv < xnvend) {
65202027 1207 *(NV**)xnv = (NV*)(xnv + 1);
463ee0b2
LW
1208 xnv++;
1209 }
65202027 1210 *(NV**)xnv = 0;
463ee0b2
LW
1211}
1212
645c22ef
DM
1213/* grab a new struct xrv from the free list, allocating more if necessary */
1214
76e3520e 1215STATIC XRV*
cea2e8a9 1216S_new_xrv(pTHX)
ed6116ce
LW
1217{
1218 XRV* xrv;
cbe51380
GS
1219 LOCK_SV_MUTEX;
1220 if (!PL_xrv_root)
1221 more_xrv();
1222 xrv = PL_xrv_root;
1223 PL_xrv_root = (XRV*)xrv->xrv_rv;
1224 UNLOCK_SV_MUTEX;
1225 return xrv;
ed6116ce
LW
1226}
1227
645c22ef
DM
1228/* return a struct xrv to the free list */
1229
76e3520e 1230STATIC void
cea2e8a9 1231S_del_xrv(pTHX_ XRV *p)
ed6116ce 1232{
cbe51380 1233 LOCK_SV_MUTEX;
3280af22
NIS
1234 p->xrv_rv = (SV*)PL_xrv_root;
1235 PL_xrv_root = p;
cbe51380 1236 UNLOCK_SV_MUTEX;
ed6116ce
LW
1237}
1238
645c22ef
DM
1239/* allocate another arena's worth of struct xrv */
1240
cbe51380 1241STATIC void
cea2e8a9 1242S_more_xrv(pTHX)
ed6116ce 1243{
ed6116ce
LW
1244 register XRV* xrv;
1245 register XRV* xrvend;
612f20c3
GS
1246 XPV *ptr;
1247 New(712, ptr, 1008/sizeof(XPV), XPV);
1248 ptr->xpv_pv = (char*)PL_xrv_arenaroot;
1249 PL_xrv_arenaroot = ptr;
1250
1251 xrv = (XRV*) ptr;
ed6116ce 1252 xrvend = &xrv[1008 / sizeof(XRV) - 1];
612f20c3
GS
1253 xrv += (sizeof(XPV) - 1) / sizeof(XRV) + 1;
1254 PL_xrv_root = xrv;
ed6116ce
LW
1255 while (xrv < xrvend) {
1256 xrv->xrv_rv = (SV*)(xrv + 1);
1257 xrv++;
1258 }
1259 xrv->xrv_rv = 0;
ed6116ce
LW
1260}
1261
645c22ef
DM
1262/* grab a new struct xpv from the free list, allocating more if necessary */
1263
76e3520e 1264STATIC XPV*
cea2e8a9 1265S_new_xpv(pTHX)
463ee0b2
LW
1266{
1267 XPV* xpv;
cbe51380
GS
1268 LOCK_SV_MUTEX;
1269 if (!PL_xpv_root)
1270 more_xpv();
1271 xpv = PL_xpv_root;
1272 PL_xpv_root = (XPV*)xpv->xpv_pv;
1273 UNLOCK_SV_MUTEX;
1274 return xpv;
463ee0b2
LW
1275}
1276
645c22ef
DM
1277/* return a struct xpv to the free list */
1278
76e3520e 1279STATIC void
cea2e8a9 1280S_del_xpv(pTHX_ XPV *p)
463ee0b2 1281{
cbe51380 1282 LOCK_SV_MUTEX;
3280af22
NIS
1283 p->xpv_pv = (char*)PL_xpv_root;
1284 PL_xpv_root = p;
cbe51380 1285 UNLOCK_SV_MUTEX;
463ee0b2
LW
1286}
1287
645c22ef
DM
1288/* allocate another arena's worth of struct xpv */
1289
cbe51380 1290STATIC void
cea2e8a9 1291S_more_xpv(pTHX)
463ee0b2 1292{
463ee0b2
LW
1293 register XPV* xpv;
1294 register XPV* xpvend;
612f20c3
GS
1295 New(713, xpv, 1008/sizeof(XPV), XPV);
1296 xpv->xpv_pv = (char*)PL_xpv_arenaroot;
1297 PL_xpv_arenaroot = xpv;
1298
463ee0b2 1299 xpvend = &xpv[1008 / sizeof(XPV) - 1];
612f20c3 1300 PL_xpv_root = ++xpv;
463ee0b2
LW
1301 while (xpv < xpvend) {
1302 xpv->xpv_pv = (char*)(xpv + 1);
1303 xpv++;
1304 }
1305 xpv->xpv_pv = 0;
463ee0b2
LW
1306}
1307
645c22ef
DM
1308/* grab a new struct xpviv from the free list, allocating more if necessary */
1309
932e9ff9
VB
1310STATIC XPVIV*
1311S_new_xpviv(pTHX)
1312{
1313 XPVIV* xpviv;
1314 LOCK_SV_MUTEX;
1315 if (!PL_xpviv_root)
1316 more_xpviv();
1317 xpviv = PL_xpviv_root;
1318 PL_xpviv_root = (XPVIV*)xpviv->xpv_pv;
1319 UNLOCK_SV_MUTEX;
1320 return xpviv;
1321}
1322
645c22ef
DM
1323/* return a struct xpviv to the free list */
1324
932e9ff9
VB
1325STATIC void
1326S_del_xpviv(pTHX_ XPVIV *p)
1327{
1328 LOCK_SV_MUTEX;
1329 p->xpv_pv = (char*)PL_xpviv_root;
1330 PL_xpviv_root = p;
1331 UNLOCK_SV_MUTEX;
1332}
1333
645c22ef
DM
1334/* allocate another arena's worth of struct xpviv */
1335
932e9ff9
VB
1336STATIC void
1337S_more_xpviv(pTHX)
1338{
1339 register XPVIV* xpviv;
1340 register XPVIV* xpvivend;
612f20c3
GS
1341 New(714, xpviv, 1008/sizeof(XPVIV), XPVIV);
1342 xpviv->xpv_pv = (char*)PL_xpviv_arenaroot;
1343 PL_xpviv_arenaroot = xpviv;
1344
932e9ff9 1345 xpvivend = &xpviv[1008 / sizeof(XPVIV) - 1];
612f20c3 1346 PL_xpviv_root = ++xpviv;
932e9ff9
VB
1347 while (xpviv < xpvivend) {
1348 xpviv->xpv_pv = (char*)(xpviv + 1);
1349 xpviv++;
1350 }
1351 xpviv->xpv_pv = 0;
1352}
1353
645c22ef
DM
1354/* grab a new struct xpvnv from the free list, allocating more if necessary */
1355
932e9ff9
VB
1356STATIC XPVNV*
1357S_new_xpvnv(pTHX)
1358{
1359 XPVNV* xpvnv;
1360 LOCK_SV_MUTEX;
1361 if (!PL_xpvnv_root)
1362 more_xpvnv();
1363 xpvnv = PL_xpvnv_root;
1364 PL_xpvnv_root = (XPVNV*)xpvnv->xpv_pv;
1365 UNLOCK_SV_MUTEX;
1366 return xpvnv;
1367}
1368
645c22ef
DM
1369/* return a struct xpvnv to the free list */
1370
932e9ff9
VB
1371STATIC void
1372S_del_xpvnv(pTHX_ XPVNV *p)
1373{
1374 LOCK_SV_MUTEX;
1375 p->xpv_pv = (char*)PL_xpvnv_root;
1376 PL_xpvnv_root = p;
1377 UNLOCK_SV_MUTEX;
1378}
1379
645c22ef
DM
1380/* allocate another arena's worth of struct xpvnv */
1381
932e9ff9
VB
1382STATIC void
1383S_more_xpvnv(pTHX)
1384{
1385 register XPVNV* xpvnv;
1386 register XPVNV* xpvnvend;
612f20c3
GS
1387 New(715, xpvnv, 1008/sizeof(XPVNV), XPVNV);
1388 xpvnv->xpv_pv = (char*)PL_xpvnv_arenaroot;
1389 PL_xpvnv_arenaroot = xpvnv;
1390
932e9ff9 1391 xpvnvend = &xpvnv[1008 / sizeof(XPVNV) - 1];
612f20c3 1392 PL_xpvnv_root = ++xpvnv;
932e9ff9
VB
1393 while (xpvnv < xpvnvend) {
1394 xpvnv->xpv_pv = (char*)(xpvnv + 1);
1395 xpvnv++;
1396 }
1397 xpvnv->xpv_pv = 0;
1398}
1399
645c22ef
DM
1400/* grab a new struct xpvcv from the free list, allocating more if necessary */
1401
932e9ff9
VB
1402STATIC XPVCV*
1403S_new_xpvcv(pTHX)
1404{
1405 XPVCV* xpvcv;
1406 LOCK_SV_MUTEX;
1407 if (!PL_xpvcv_root)
1408 more_xpvcv();
1409 xpvcv = PL_xpvcv_root;
1410 PL_xpvcv_root = (XPVCV*)xpvcv->xpv_pv;
1411 UNLOCK_SV_MUTEX;
1412 return xpvcv;
1413}
1414
645c22ef
DM
1415/* return a struct xpvcv to the free list */
1416
932e9ff9
VB
1417STATIC void
1418S_del_xpvcv(pTHX_ XPVCV *p)
1419{
1420 LOCK_SV_MUTEX;
1421 p->xpv_pv = (char*)PL_xpvcv_root;
1422 PL_xpvcv_root = p;
1423 UNLOCK_SV_MUTEX;
1424}
1425
645c22ef
DM
1426/* allocate another arena's worth of struct xpvcv */
1427
932e9ff9
VB
1428STATIC void
1429S_more_xpvcv(pTHX)
1430{
1431 register XPVCV* xpvcv;
1432 register XPVCV* xpvcvend;
612f20c3
GS
1433 New(716, xpvcv, 1008/sizeof(XPVCV), XPVCV);
1434 xpvcv->xpv_pv = (char*)PL_xpvcv_arenaroot;
1435 PL_xpvcv_arenaroot = xpvcv;
1436
932e9ff9 1437 xpvcvend = &xpvcv[1008 / sizeof(XPVCV) - 1];
612f20c3 1438 PL_xpvcv_root = ++xpvcv;
932e9ff9
VB
1439 while (xpvcv < xpvcvend) {
1440 xpvcv->xpv_pv = (char*)(xpvcv + 1);
1441 xpvcv++;
1442 }
1443 xpvcv->xpv_pv = 0;
1444}
1445
645c22ef
DM
1446/* grab a new struct xpvav from the free list, allocating more if necessary */
1447
932e9ff9
VB
1448STATIC XPVAV*
1449S_new_xpvav(pTHX)
1450{
1451 XPVAV* xpvav;
1452 LOCK_SV_MUTEX;
1453 if (!PL_xpvav_root)
1454 more_xpvav();
1455 xpvav = PL_xpvav_root;
1456 PL_xpvav_root = (XPVAV*)xpvav->xav_array;
1457 UNLOCK_SV_MUTEX;
1458 return xpvav;
1459}
1460
645c22ef
DM
1461/* return a struct xpvav to the free list */
1462
932e9ff9
VB
1463STATIC void
1464S_del_xpvav(pTHX_ XPVAV *p)
1465{
1466 LOCK_SV_MUTEX;
1467 p->xav_array = (char*)PL_xpvav_root;
1468 PL_xpvav_root = p;
1469 UNLOCK_SV_MUTEX;
1470}
1471
645c22ef
DM
1472/* allocate another arena's worth of struct xpvav */
1473
932e9ff9
VB
1474STATIC void
1475S_more_xpvav(pTHX)
1476{
1477 register XPVAV* xpvav;
1478 register XPVAV* xpvavend;
612f20c3
GS
1479 New(717, xpvav, 1008/sizeof(XPVAV), XPVAV);
1480 xpvav->xav_array = (char*)PL_xpvav_arenaroot;
1481 PL_xpvav_arenaroot = xpvav;
1482
932e9ff9 1483 xpvavend = &xpvav[1008 / sizeof(XPVAV) - 1];
612f20c3 1484 PL_xpvav_root = ++xpvav;
932e9ff9
VB
1485 while (xpvav < xpvavend) {
1486 xpvav->xav_array = (char*)(xpvav + 1);
1487 xpvav++;
1488 }
1489 xpvav->xav_array = 0;
1490}
1491
645c22ef
DM
1492/* grab a new struct xpvhv from the free list, allocating more if necessary */
1493
932e9ff9
VB
1494STATIC XPVHV*
1495S_new_xpvhv(pTHX)
1496{
1497 XPVHV* xpvhv;
1498 LOCK_SV_MUTEX;
1499 if (!PL_xpvhv_root)
1500 more_xpvhv();
1501 xpvhv = PL_xpvhv_root;
1502 PL_xpvhv_root = (XPVHV*)xpvhv->xhv_array;
1503 UNLOCK_SV_MUTEX;
1504 return xpvhv;
1505}
1506
645c22ef
DM
1507/* return a struct xpvhv to the free list */
1508
932e9ff9
VB
1509STATIC void
1510S_del_xpvhv(pTHX_ XPVHV *p)
1511{
1512 LOCK_SV_MUTEX;
1513 p->xhv_array = (char*)PL_xpvhv_root;
1514 PL_xpvhv_root = p;
1515 UNLOCK_SV_MUTEX;
1516}
1517
645c22ef
DM
1518/* allocate another arena's worth of struct xpvhv */
1519
932e9ff9
VB
1520STATIC void
1521S_more_xpvhv(pTHX)
1522{
1523 register XPVHV* xpvhv;
1524 register XPVHV* xpvhvend;
612f20c3
GS
1525 New(718, xpvhv, 1008/sizeof(XPVHV), XPVHV);
1526 xpvhv->xhv_array = (char*)PL_xpvhv_arenaroot;
1527 PL_xpvhv_arenaroot = xpvhv;
1528
932e9ff9 1529 xpvhvend = &xpvhv[1008 / sizeof(XPVHV) - 1];
612f20c3 1530 PL_xpvhv_root = ++xpvhv;
932e9ff9
VB
1531 while (xpvhv < xpvhvend) {
1532 xpvhv->xhv_array = (char*)(xpvhv + 1);
1533 xpvhv++;
1534 }
1535 xpvhv->xhv_array = 0;
1536}
1537
645c22ef
DM
1538/* grab a new struct xpvmg from the free list, allocating more if necessary */
1539
932e9ff9
VB
1540STATIC XPVMG*
1541S_new_xpvmg(pTHX)
1542{
1543 XPVMG* xpvmg;
1544 LOCK_SV_MUTEX;
1545 if (!PL_xpvmg_root)
1546 more_xpvmg();
1547 xpvmg = PL_xpvmg_root;
1548 PL_xpvmg_root = (XPVMG*)xpvmg->xpv_pv;
1549 UNLOCK_SV_MUTEX;
1550 return xpvmg;
1551}
1552
645c22ef
DM
1553/* return a struct xpvmg to the free list */
1554
932e9ff9
VB
1555STATIC void
1556S_del_xpvmg(pTHX_ XPVMG *p)
1557{
1558 LOCK_SV_MUTEX;
1559 p->xpv_pv = (char*)PL_xpvmg_root;
1560 PL_xpvmg_root = p;
1561 UNLOCK_SV_MUTEX;
1562}
1563
645c22ef
DM
1564/* allocate another arena's worth of struct xpvmg */
1565
932e9ff9
VB
1566STATIC void
1567S_more_xpvmg(pTHX)
1568{
1569 register XPVMG* xpvmg;
1570 register XPVMG* xpvmgend;
612f20c3
GS
1571 New(719, xpvmg, 1008/sizeof(XPVMG), XPVMG);
1572 xpvmg->xpv_pv = (char*)PL_xpvmg_arenaroot;
1573 PL_xpvmg_arenaroot = xpvmg;
1574
932e9ff9 1575 xpvmgend = &xpvmg[1008 / sizeof(XPVMG) - 1];
612f20c3 1576 PL_xpvmg_root = ++xpvmg;
932e9ff9
VB
1577 while (xpvmg < xpvmgend) {
1578 xpvmg->xpv_pv = (char*)(xpvmg + 1);
1579 xpvmg++;
1580 }
1581 xpvmg->xpv_pv = 0;
1582}
1583
645c22ef
DM
1584/* grab a new struct xpvlv from the free list, allocating more if necessary */
1585
932e9ff9
VB
1586STATIC XPVLV*
1587S_new_xpvlv(pTHX)
1588{
1589 XPVLV* xpvlv;
1590 LOCK_SV_MUTEX;
1591 if (!PL_xpvlv_root)
1592 more_xpvlv();
1593 xpvlv = PL_xpvlv_root;
1594 PL_xpvlv_root = (XPVLV*)xpvlv->xpv_pv;
1595 UNLOCK_SV_MUTEX;
1596 return xpvlv;
1597}
1598
645c22ef
DM
1599/* return a struct xpvlv to the free list */
1600
932e9ff9
VB
1601STATIC void
1602S_del_xpvlv(pTHX_ XPVLV *p)
1603{
1604 LOCK_SV_MUTEX;
1605 p->xpv_pv = (char*)PL_xpvlv_root;
1606 PL_xpvlv_root = p;
1607 UNLOCK_SV_MUTEX;
1608}
1609
645c22ef
DM
1610/* allocate another arena's worth of struct xpvlv */
1611
932e9ff9
VB
1612STATIC void
1613S_more_xpvlv(pTHX)
1614{
1615 register XPVLV* xpvlv;
1616 register XPVLV* xpvlvend;
612f20c3
GS
1617 New(720, xpvlv, 1008/sizeof(XPVLV), XPVLV);
1618 xpvlv->xpv_pv = (char*)PL_xpvlv_arenaroot;
1619 PL_xpvlv_arenaroot = xpvlv;
1620
932e9ff9 1621 xpvlvend = &xpvlv[1008 / sizeof(XPVLV) - 1];
612f20c3 1622 PL_xpvlv_root = ++xpvlv;
932e9ff9
VB
1623 while (xpvlv < xpvlvend) {
1624 xpvlv->xpv_pv = (char*)(xpvlv + 1);
1625 xpvlv++;
1626 }
1627 xpvlv->xpv_pv = 0;
1628}
1629
645c22ef
DM
1630/* grab a new struct xpvbm from the free list, allocating more if necessary */
1631
932e9ff9
VB
1632STATIC XPVBM*
1633S_new_xpvbm(pTHX)
1634{
1635 XPVBM* xpvbm;
1636 LOCK_SV_MUTEX;
1637 if (!PL_xpvbm_root)
1638 more_xpvbm();
1639 xpvbm = PL_xpvbm_root;
1640 PL_xpvbm_root = (XPVBM*)xpvbm->xpv_pv;
1641 UNLOCK_SV_MUTEX;
1642 return xpvbm;
1643}
1644
645c22ef
DM
1645/* return a struct xpvbm to the free list */
1646
932e9ff9
VB
1647STATIC void
1648S_del_xpvbm(pTHX_ XPVBM *p)
1649{
1650 LOCK_SV_MUTEX;
1651 p->xpv_pv = (char*)PL_xpvbm_root;
1652 PL_xpvbm_root = p;
1653 UNLOCK_SV_MUTEX;
1654}
1655
645c22ef
DM
1656/* allocate another arena's worth of struct xpvbm */
1657
932e9ff9
VB
1658STATIC void
1659S_more_xpvbm(pTHX)
1660{
1661 register XPVBM* xpvbm;
1662 register XPVBM* xpvbmend;
612f20c3
GS
1663 New(721, xpvbm, 1008/sizeof(XPVBM), XPVBM);
1664 xpvbm->xpv_pv = (char*)PL_xpvbm_arenaroot;
1665 PL_xpvbm_arenaroot = xpvbm;
1666
932e9ff9 1667 xpvbmend = &xpvbm[1008 / sizeof(XPVBM) - 1];
612f20c3 1668 PL_xpvbm_root = ++xpvbm;
932e9ff9
VB
1669 while (xpvbm < xpvbmend) {
1670 xpvbm->xpv_pv = (char*)(xpvbm + 1);
1671 xpvbm++;
1672 }
1673 xpvbm->xpv_pv = 0;
1674}
1675
7bab3ede
MB
1676#define my_safemalloc(s) (void*)safemalloc(s)
1677#define my_safefree(p) safefree((char*)p)
463ee0b2 1678
d33b2eba 1679#ifdef PURIFY
463ee0b2 1680
d33b2eba
GS
1681#define new_XIV() my_safemalloc(sizeof(XPVIV))
1682#define del_XIV(p) my_safefree(p)
ed6116ce 1683
d33b2eba
GS
1684#define new_XNV() my_safemalloc(sizeof(XPVNV))
1685#define del_XNV(p) my_safefree(p)
463ee0b2 1686
d33b2eba
GS
1687#define new_XRV() my_safemalloc(sizeof(XRV))
1688#define del_XRV(p) my_safefree(p)
8c52afec 1689
d33b2eba
GS
1690#define new_XPV() my_safemalloc(sizeof(XPV))
1691#define del_XPV(p) my_safefree(p)
9b94d1dd 1692
d33b2eba
GS
1693#define new_XPVIV() my_safemalloc(sizeof(XPVIV))
1694#define del_XPVIV(p) my_safefree(p)
932e9ff9 1695
d33b2eba
GS
1696#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
1697#define del_XPVNV(p) my_safefree(p)
932e9ff9 1698
d33b2eba
GS
1699#define new_XPVCV() my_safemalloc(sizeof(XPVCV))
1700#define del_XPVCV(p) my_safefree(p)
932e9ff9 1701
d33b2eba
GS
1702#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
1703#define del_XPVAV(p) my_safefree(p)
1704
1705#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
1706#define del_XPVHV(p) my_safefree(p)
1c846c1f 1707
d33b2eba
GS
1708#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
1709#define del_XPVMG(p) my_safefree(p)
1710
1711#define new_XPVLV() my_safemalloc(sizeof(XPVLV))
1712#define del_XPVLV(p) my_safefree(p)
1713
1714#define new_XPVBM() my_safemalloc(sizeof(XPVBM))
1715#define del_XPVBM(p) my_safefree(p)
1716
1717#else /* !PURIFY */
1718
1719#define new_XIV() (void*)new_xiv()
1720#define del_XIV(p) del_xiv((XPVIV*) p)
1721
1722#define new_XNV() (void*)new_xnv()
1723#define del_XNV(p) del_xnv((XPVNV*) p)
9b94d1dd 1724
d33b2eba
GS
1725#define new_XRV() (void*)new_xrv()
1726#define del_XRV(p) del_xrv((XRV*) p)
9b94d1dd 1727
d33b2eba
GS
1728#define new_XPV() (void*)new_xpv()
1729#define del_XPV(p) del_xpv((XPV *)p)
1730
1731#define new_XPVIV() (void*)new_xpviv()
1732#define del_XPVIV(p) del_xpviv((XPVIV *)p)
1733
1734#define new_XPVNV() (void*)new_xpvnv()
1735#define del_XPVNV(p) del_xpvnv((XPVNV *)p)
1736
1737#define new_XPVCV() (void*)new_xpvcv()
1738#define del_XPVCV(p) del_xpvcv((XPVCV *)p)
1739
1740#define new_XPVAV() (void*)new_xpvav()
1741#define del_XPVAV(p) del_xpvav((XPVAV *)p)
1742
1743#define new_XPVHV() (void*)new_xpvhv()
1744#define del_XPVHV(p) del_xpvhv((XPVHV *)p)
1c846c1f 1745
d33b2eba
GS
1746#define new_XPVMG() (void*)new_xpvmg()
1747#define del_XPVMG(p) del_xpvmg((XPVMG *)p)
1748
1749#define new_XPVLV() (void*)new_xpvlv()
1750#define del_XPVLV(p) del_xpvlv((XPVLV *)p)
1751
1752#define new_XPVBM() (void*)new_xpvbm()
1753#define del_XPVBM(p) del_xpvbm((XPVBM *)p)
1754
1755#endif /* PURIFY */
9b94d1dd 1756
d33b2eba
GS
1757#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
1758#define del_XPVGV(p) my_safefree(p)
1c846c1f 1759
d33b2eba
GS
1760#define new_XPVFM() my_safemalloc(sizeof(XPVFM))
1761#define del_XPVFM(p) my_safefree(p)
1c846c1f 1762
d33b2eba
GS
1763#define new_XPVIO() my_safemalloc(sizeof(XPVIO))
1764#define del_XPVIO(p) my_safefree(p)
8990e307 1765
954c1994
GS
1766/*
1767=for apidoc sv_upgrade
1768
ff276b08 1769Upgrade an SV to a more complex form. Generally adds a new body type to the
645c22ef 1770SV, then copies across as much information as possible from the old body.
ff276b08 1771You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
954c1994
GS
1772
1773=cut
1774*/
1775
79072805 1776bool
864dbfa3 1777Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
79072805 1778{
e763e3dc 1779
c04a4dfe
JH
1780 char* pv = NULL;
1781 U32 cur = 0;
1782 U32 len = 0;
1783 IV iv = 0;
1784 NV nv = 0.0;
1785 MAGIC* magic = NULL;
1786 HV* stash = Nullhv;
79072805 1787
765f542d
NC
1788 if (mt != SVt_PV && SvIsCOW(sv)) {
1789 sv_force_normal_flags(sv, 0);
f130fd45
NIS
1790 }
1791
79072805
LW
1792 if (SvTYPE(sv) == mt)
1793 return TRUE;
1794
a5f75d66
AD
1795 if (mt < SVt_PVIV)
1796 (void)SvOOK_off(sv);
1797
79072805
LW
1798 switch (SvTYPE(sv)) {
1799 case SVt_NULL:
1800 pv = 0;
1801 cur = 0;
1802 len = 0;
1803 iv = 0;
1804 nv = 0.0;
1805 magic = 0;
1806 stash = 0;
1807 break;
79072805
LW
1808 case SVt_IV:
1809 pv = 0;
1810 cur = 0;
1811 len = 0;
463ee0b2 1812 iv = SvIVX(sv);
65202027 1813 nv = (NV)SvIVX(sv);
79072805
LW
1814 del_XIV(SvANY(sv));
1815 magic = 0;
1816 stash = 0;
ed6116ce 1817 if (mt == SVt_NV)
463ee0b2 1818 mt = SVt_PVNV;
ed6116ce
LW
1819 else if (mt < SVt_PVIV)
1820 mt = SVt_PVIV;
79072805
LW
1821 break;
1822 case SVt_NV:
1823 pv = 0;
1824 cur = 0;
1825 len = 0;
463ee0b2 1826 nv = SvNVX(sv);
1bd302c3 1827 iv = I_V(nv);
79072805
LW
1828 magic = 0;
1829 stash = 0;
1830 del_XNV(SvANY(sv));
1831 SvANY(sv) = 0;
ed6116ce 1832 if (mt < SVt_PVNV)
79072805
LW
1833 mt = SVt_PVNV;
1834 break;
ed6116ce
LW
1835 case SVt_RV:
1836 pv = (char*)SvRV(sv);
1837 cur = 0;
1838 len = 0;
56431972
RB
1839 iv = PTR2IV(pv);
1840 nv = PTR2NV(pv);
ed6116ce
LW
1841 del_XRV(SvANY(sv));
1842 magic = 0;
1843 stash = 0;
1844 break;
79072805 1845 case SVt_PV:
463ee0b2 1846 pv = SvPVX(sv);
79072805
LW
1847 cur = SvCUR(sv);
1848 len = SvLEN(sv);
1849 iv = 0;
1850 nv = 0.0;
1851 magic = 0;
1852 stash = 0;
1853 del_XPV(SvANY(sv));
748a9306
LW
1854 if (mt <= SVt_IV)
1855 mt = SVt_PVIV;
1856 else if (mt == SVt_NV)
1857 mt = SVt_PVNV;
79072805
LW
1858 break;
1859 case SVt_PVIV:
463ee0b2 1860 pv = SvPVX(sv);
79072805
LW
1861 cur = SvCUR(sv);
1862 len = SvLEN(sv);
463ee0b2 1863 iv = SvIVX(sv);
79072805
LW
1864 nv = 0.0;
1865 magic = 0;
1866 stash = 0;
1867 del_XPVIV(SvANY(sv));
1868 break;
1869 case SVt_PVNV:
463ee0b2 1870 pv = SvPVX(sv);
79072805
LW
1871 cur = SvCUR(sv);
1872 len = SvLEN(sv);
463ee0b2
LW
1873 iv = SvIVX(sv);
1874 nv = SvNVX(sv);
79072805
LW
1875 magic = 0;
1876 stash = 0;
1877 del_XPVNV(SvANY(sv));
1878 break;
1879 case SVt_PVMG:
463ee0b2 1880 pv = SvPVX(sv);
79072805
LW
1881 cur = SvCUR(sv);
1882 len = SvLEN(sv);
463ee0b2
LW
1883 iv = SvIVX(sv);
1884 nv = SvNVX(sv);
79072805
LW
1885 magic = SvMAGIC(sv);
1886 stash = SvSTASH(sv);
1887 del_XPVMG(SvANY(sv));
1888 break;
1889 default:
cea2e8a9 1890 Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
79072805
LW
1891 }
1892
ffb05e06
NC
1893 SvFLAGS(sv) &= ~SVTYPEMASK;
1894 SvFLAGS(sv) |= mt;
1895
79072805
LW
1896 switch (mt) {
1897 case SVt_NULL:
cea2e8a9 1898 Perl_croak(aTHX_ "Can't upgrade to undef");
79072805
LW
1899 case SVt_IV:
1900 SvANY(sv) = new_XIV();
463ee0b2 1901 SvIVX(sv) = iv;
79072805
LW
1902 break;
1903 case SVt_NV:
1904 SvANY(sv) = new_XNV();
463ee0b2 1905 SvNVX(sv) = nv;
79072805 1906 break;
ed6116ce
LW
1907 case SVt_RV:
1908 SvANY(sv) = new_XRV();
1909 SvRV(sv) = (SV*)pv;
ed6116ce 1910 break;
79072805
LW
1911 case SVt_PV:
1912 SvANY(sv) = new_XPV();
463ee0b2 1913 SvPVX(sv) = pv;
79072805
LW
1914 SvCUR(sv) = cur;
1915 SvLEN(sv) = len;
1916 break;
1917 case SVt_PVIV:
1918 SvANY(sv) = new_XPVIV();
463ee0b2 1919 SvPVX(sv) = pv;
79072805
LW
1920 SvCUR(sv) = cur;
1921 SvLEN(sv) = len;
463ee0b2 1922 SvIVX(sv) = iv;
79072805 1923 if (SvNIOK(sv))
a0d0e21e 1924 (void)SvIOK_on(sv);
79072805
LW
1925 SvNOK_off(sv);
1926 break;
1927 case SVt_PVNV:
1928 SvANY(sv) = new_XPVNV();
463ee0b2 1929 SvPVX(sv) = pv;
79072805
LW
1930 SvCUR(sv) = cur;
1931 SvLEN(sv) = len;
463ee0b2
LW
1932 SvIVX(sv) = iv;
1933 SvNVX(sv) = nv;
79072805
LW
1934 break;
1935 case SVt_PVMG:
1936 SvANY(sv) = new_XPVMG();
463ee0b2 1937 SvPVX(sv) = pv;
79072805
LW
1938 SvCUR(sv) = cur;
1939 SvLEN(sv) = len;
463ee0b2
LW
1940 SvIVX(sv) = iv;
1941 SvNVX(sv) = nv;
79072805
LW
1942 SvMAGIC(sv) = magic;
1943 SvSTASH(sv) = stash;
1944 break;
1945 case SVt_PVLV:
1946 SvANY(sv) = new_XPVLV();
463ee0b2 1947 SvPVX(sv) = pv;
79072805
LW
1948 SvCUR(sv) = cur;
1949 SvLEN(sv) = len;
463ee0b2
LW
1950 SvIVX(sv) = iv;
1951 SvNVX(sv) = nv;
79072805
LW
1952 SvMAGIC(sv) = magic;
1953 SvSTASH(sv) = stash;
1954 LvTARGOFF(sv) = 0;
1955 LvTARGLEN(sv) = 0;
1956 LvTARG(sv) = 0;
1957 LvTYPE(sv) = 0;
b76195c2
DM
1958 GvGP(sv) = 0;
1959 GvNAME(sv) = 0;
1960 GvNAMELEN(sv) = 0;
1961 GvSTASH(sv) = 0;
1962 GvFLAGS(sv) = 0;
79072805
LW
1963 break;
1964 case SVt_PVAV:
1965 SvANY(sv) = new_XPVAV();
463ee0b2
LW
1966 if (pv)
1967 Safefree(pv);
2304df62 1968 SvPVX(sv) = 0;
d1bf51dd 1969 AvMAX(sv) = -1;
93965878 1970 AvFILLp(sv) = -1;
463ee0b2
LW
1971 SvIVX(sv) = 0;
1972 SvNVX(sv) = 0.0;
1973 SvMAGIC(sv) = magic;
1974 SvSTASH(sv) = stash;
1975 AvALLOC(sv) = 0;
79072805 1976 AvARYLEN(sv) = 0;
e763e3dc 1977 AvFLAGS(sv) = AVf_REAL;
79072805
LW
1978 break;
1979 case SVt_PVHV:
1980 SvANY(sv) = new_XPVHV();
463ee0b2
LW
1981 if (pv)
1982 Safefree(pv);
1983 SvPVX(sv) = 0;
1984 HvFILL(sv) = 0;
1985 HvMAX(sv) = 0;
8aacddc1
NIS
1986 HvTOTALKEYS(sv) = 0;
1987 HvPLACEHOLDERS(sv) = 0;
79072805
LW
1988 SvMAGIC(sv) = magic;
1989 SvSTASH(sv) = stash;
79072805
LW
1990 HvRITER(sv) = 0;
1991 HvEITER(sv) = 0;
1992 HvPMROOT(sv) = 0;
1993 HvNAME(sv) = 0;
79072805
LW
1994 break;
1995 case SVt_PVCV:
1996 SvANY(sv) = new_XPVCV();
748a9306 1997 Zero(SvANY(sv), 1, XPVCV);
463ee0b2 1998 SvPVX(sv) = pv;
79072805
LW
1999 SvCUR(sv) = cur;
2000 SvLEN(sv) = len;
463ee0b2
LW
2001 SvIVX(sv) = iv;
2002 SvNVX(sv) = nv;
79072805
LW
2003 SvMAGIC(sv) = magic;
2004 SvSTASH(sv) = stash;
79072805
LW
2005 break;
2006 case SVt_PVGV:
2007 SvANY(sv) = new_XPVGV();
463ee0b2 2008 SvPVX(sv) = pv;
79072805
LW
2009 SvCUR(sv) = cur;
2010 SvLEN(sv) = len;
463ee0b2
LW
2011 SvIVX(sv) = iv;
2012 SvNVX(sv) = nv;
79072805
LW
2013 SvMAGIC(sv) = magic;
2014 SvSTASH(sv) = stash;
93a17b20 2015 GvGP(sv) = 0;
79072805
LW
2016 GvNAME(sv) = 0;
2017 GvNAMELEN(sv) = 0;
2018 GvSTASH(sv) = 0;
a5f75d66 2019 GvFLAGS(sv) = 0;
79072805
LW
2020 break;
2021 case SVt_PVBM:
2022 SvANY(sv) = new_XPVBM();
463ee0b2 2023 SvPVX(sv) = pv;
79072805
LW
2024 SvCUR(sv) = cur;
2025 SvLEN(sv) = len;
463ee0b2
LW
2026 SvIVX(sv) = iv;
2027 SvNVX(sv) = nv;
79072805
LW
2028 SvMAGIC(sv) = magic;
2029 SvSTASH(sv) = stash;
2030 BmRARE(sv) = 0;
2031 BmUSEFUL(sv) = 0;
2032 BmPREVIOUS(sv) = 0;
2033 break;
2034 case SVt_PVFM:
2035 SvANY(sv) = new_XPVFM();
748a9306 2036 Zero(SvANY(sv), 1, XPVFM);
463ee0b2 2037 SvPVX(sv) = pv;
79072805
LW
2038 SvCUR(sv) = cur;
2039 SvLEN(sv) = len;
463ee0b2
LW
2040 SvIVX(sv) = iv;
2041 SvNVX(sv) = nv;
79072805
LW
2042 SvMAGIC(sv) = magic;
2043 SvSTASH(sv) = stash;
79072805 2044 break;
8990e307
LW
2045 case SVt_PVIO:
2046 SvANY(sv) = new_XPVIO();
748a9306 2047 Zero(SvANY(sv), 1, XPVIO);
8990e307
LW
2048 SvPVX(sv) = pv;
2049 SvCUR(sv) = cur;
2050 SvLEN(sv) = len;
2051 SvIVX(sv) = iv;
2052 SvNVX(sv) = nv;
2053 SvMAGIC(sv) = magic;
2054 SvSTASH(sv) = stash;
85e6fe83 2055 IoPAGE_LEN(sv) = 60;
8990e307
LW
2056 break;
2057 }
79072805
LW
2058 return TRUE;
2059}
2060
645c22ef
DM
2061/*
2062=for apidoc sv_backoff
2063
2064Remove any string offset. You should normally use the C<SvOOK_off> macro
2065wrapper instead.
2066
2067=cut
2068*/
2069
79072805 2070int
864dbfa3 2071Perl_sv_backoff(pTHX_ register SV *sv)
79072805
LW
2072{
2073 assert(SvOOK(sv));
463ee0b2
LW
2074 if (SvIVX(sv)) {
2075 char *s = SvPVX(sv);
2076 SvLEN(sv) += SvIVX(sv);
2077 SvPVX(sv) -= SvIVX(sv);
79072805 2078 SvIV_set(sv, 0);
463ee0b2 2079 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
79072805
LW
2080 }
2081 SvFLAGS(sv) &= ~SVf_OOK;
a0d0e21e 2082 return 0;
79072805
LW
2083}
2084
954c1994
GS
2085/*
2086=for apidoc sv_grow
2087
645c22ef
DM
2088Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
2089upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
2090Use the C<SvGROW> wrapper instead.
954c1994
GS
2091
2092=cut
2093*/
2094
79072805 2095char *
864dbfa3 2096Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
79072805
LW
2097{
2098 register char *s;
2099
55497cff 2100#ifdef HAS_64K_LIMIT
79072805 2101 if (newlen >= 0x10000) {
1d7c1841
GS
2102 PerlIO_printf(Perl_debug_log,
2103 "Allocation too large: %"UVxf"\n", (UV)newlen);
79072805
LW
2104 my_exit(1);
2105 }
55497cff 2106#endif /* HAS_64K_LIMIT */
a0d0e21e
LW
2107 if (SvROK(sv))
2108 sv_unref(sv);
79072805
LW
2109 if (SvTYPE(sv) < SVt_PV) {
2110 sv_upgrade(sv, SVt_PV);
463ee0b2 2111 s = SvPVX(sv);
79072805
LW
2112 }
2113 else if (SvOOK(sv)) { /* pv is offset? */
2114 sv_backoff(sv);
463ee0b2 2115 s = SvPVX(sv);
79072805
LW
2116 if (newlen > SvLEN(sv))
2117 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
c6f8c383
GA
2118#ifdef HAS_64K_LIMIT
2119 if (newlen >= 0x10000)
2120 newlen = 0xFFFF;
2121#endif
79072805 2122 }
bc44a8a2 2123 else
463ee0b2 2124 s = SvPVX(sv);
54f0641b 2125
79072805 2126 if (newlen > SvLEN(sv)) { /* need more room? */
8d6dde3e 2127 if (SvLEN(sv) && s) {
7bab3ede 2128#ifdef MYMALLOC
8d6dde3e
IZ
2129 STRLEN l = malloced_size((void*)SvPVX(sv));
2130 if (newlen <= l) {
2131 SvLEN_set(sv, l);
2132 return s;
2133 } else
c70c8a0a 2134#endif
79072805 2135 Renew(s,newlen,char);
8d6dde3e 2136 }
bfed75c6 2137 else {
4e83176d 2138 New(703, s, newlen, char);
40565179 2139 if (SvPVX(sv) && SvCUR(sv)) {
54f0641b 2140 Move(SvPVX(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
40565179 2141 }
4e83176d 2142 }
79072805 2143 SvPV_set(sv, s);
e1ec3a88 2144 SvLEN_set(sv, newlen);
79072805
LW
2145 }
2146 return s;
2147}
2148
954c1994
GS
2149/*
2150=for apidoc sv_setiv
2151
645c22ef
DM
2152Copies an integer into the given SV, upgrading first if necessary.
2153Does not handle 'set' magic. See also C<sv_setiv_mg>.
954c1994
GS
2154
2155=cut
2156*/
2157
79072805 2158void
864dbfa3 2159Perl_sv_setiv(pTHX_ register SV *sv, IV i)
79072805 2160{
765f542d 2161 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2
LW
2162 switch (SvTYPE(sv)) {
2163 case SVt_NULL:
79072805 2164 sv_upgrade(sv, SVt_IV);
463ee0b2
LW
2165 break;
2166 case SVt_NV:
2167 sv_upgrade(sv, SVt_PVNV);
2168 break;
ed6116ce 2169 case SVt_RV:
463ee0b2 2170 case SVt_PV:
79072805 2171 sv_upgrade(sv, SVt_PVIV);
463ee0b2 2172 break;
a0d0e21e
LW
2173
2174 case SVt_PVGV:
a0d0e21e
LW
2175 case SVt_PVAV:
2176 case SVt_PVHV:
2177 case SVt_PVCV:
2178 case SVt_PVFM:
2179 case SVt_PVIO:
411caa50 2180 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
53e06cf0 2181 OP_DESC(PL_op));
463ee0b2 2182 }
a0d0e21e 2183 (void)SvIOK_only(sv); /* validate number */
a5f75d66 2184 SvIVX(sv) = i;
463ee0b2 2185 SvTAINT(sv);
79072805
LW
2186}
2187
954c1994
GS
2188/*
2189=for apidoc sv_setiv_mg
2190
2191Like C<sv_setiv>, but also handles 'set' magic.
2192
2193=cut
2194*/
2195
79072805 2196void
864dbfa3 2197Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
ef50df4b
GS
2198{
2199 sv_setiv(sv,i);
2200 SvSETMAGIC(sv);
2201}
2202
954c1994
GS
2203/*
2204=for apidoc sv_setuv
2205
645c22ef
DM
2206Copies an unsigned integer into the given SV, upgrading first if necessary.
2207Does not handle 'set' magic. See also C<sv_setuv_mg>.
954c1994
GS
2208
2209=cut
2210*/
2211
ef50df4b 2212void
864dbfa3 2213Perl_sv_setuv(pTHX_ register SV *sv, UV u)
55497cff 2214{
55ada374
NC
2215 /* With these two if statements:
2216 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 2217
55ada374
NC
2218 without
2219 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 2220
55ada374
NC
2221 If you wish to remove them, please benchmark to see what the effect is
2222 */
28e5dec8
JH
2223 if (u <= (UV)IV_MAX) {
2224 sv_setiv(sv, (IV)u);
2225 return;
2226 }
25da4f38
IZ
2227 sv_setiv(sv, 0);
2228 SvIsUV_on(sv);
2229 SvUVX(sv) = u;
55497cff 2230}
2231
954c1994
GS
2232/*
2233=for apidoc sv_setuv_mg
2234
2235Like C<sv_setuv>, but also handles 'set' magic.
2236
2237=cut
2238*/
2239
55497cff 2240void
864dbfa3 2241Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
ef50df4b 2242{
55ada374
NC
2243 /* With these two if statements:
2244 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 2245
55ada374
NC
2246 without
2247 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 2248
55ada374
NC
2249 If you wish to remove them, please benchmark to see what the effect is
2250 */
28e5dec8
JH
2251 if (u <= (UV)IV_MAX) {
2252 sv_setiv(sv, (IV)u);
2253 } else {
2254 sv_setiv(sv, 0);
2255 SvIsUV_on(sv);
2256 sv_setuv(sv,u);
2257 }
ef50df4b
GS
2258 SvSETMAGIC(sv);
2259}
2260
954c1994
GS
2261/*
2262=for apidoc sv_setnv
2263
645c22ef
DM
2264Copies a double into the given SV, upgrading first if necessary.
2265Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
2266
2267=cut
2268*/
2269
ef50df4b 2270void
65202027 2271Perl_sv_setnv(pTHX_ register SV *sv, NV num)
79072805 2272{
765f542d 2273 SV_CHECK_THINKFIRST_COW_DROP(sv);
a0d0e21e
LW
2274 switch (SvTYPE(sv)) {
2275 case SVt_NULL:
2276 case SVt_IV:
79072805 2277 sv_upgrade(sv, SVt_NV);
a0d0e21e 2278 break;
a0d0e21e
LW
2279 case SVt_RV:
2280 case SVt_PV:
2281 case SVt_PVIV:
79072805 2282 sv_upgrade(sv, SVt_PVNV);
a0d0e21e 2283 break;
827b7e14 2284
a0d0e21e 2285 case SVt_PVGV:
a0d0e21e
LW
2286 case SVt_PVAV:
2287 case SVt_PVHV:
2288 case SVt_PVCV:
2289 case SVt_PVFM:
2290 case SVt_PVIO:
411caa50 2291 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
53e06cf0 2292 OP_NAME(PL_op));
79072805 2293 }
463ee0b2 2294 SvNVX(sv) = num;
a0d0e21e 2295 (void)SvNOK_only(sv); /* validate number */
463ee0b2 2296 SvTAINT(sv);
79072805
LW
2297}
2298
954c1994
GS
2299/*
2300=for apidoc sv_setnv_mg
2301
2302Like C<sv_setnv>, but also handles 'set' magic.
2303
2304=cut
2305*/
2306
ef50df4b 2307void
65202027 2308Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
ef50df4b
GS
2309{
2310 sv_setnv(sv,num);
2311 SvSETMAGIC(sv);
2312}
2313
645c22ef
DM
2314/* Print an "isn't numeric" warning, using a cleaned-up,
2315 * printable version of the offending string
2316 */
2317
76e3520e 2318STATIC void
cea2e8a9 2319S_not_a_number(pTHX_ SV *sv)
a0d0e21e 2320{
94463019
JH
2321 SV *dsv;
2322 char tmpbuf[64];
2323 char *pv;
2324
2325 if (DO_UTF8(sv)) {
2326 dsv = sv_2mortal(newSVpv("", 0));
2327 pv = sv_uni_display(dsv, sv, 10, 0);
2328 } else {
2329 char *d = tmpbuf;
2330 char *limit = tmpbuf + sizeof(tmpbuf) - 8;
2331 /* each *s can expand to 4 chars + "...\0",
2332 i.e. need room for 8 chars */
ecdeb87c 2333
94463019
JH
2334 char *s, *end;
2335 for (s = SvPVX(sv), end = s + SvCUR(sv); s < end && d < limit; s++) {
2336 int ch = *s & 0xFF;
2337 if (ch & 128 && !isPRINT_LC(ch)) {
2338 *d++ = 'M';
2339 *d++ = '-';
2340 ch &= 127;
2341 }
2342 if (ch == '\n') {
2343 *d++ = '\\';
2344 *d++ = 'n';
2345 }
2346 else if (ch == '\r') {
2347 *d++ = '\\';
2348 *d++ = 'r';
2349 }
2350 else if (ch == '\f') {
2351 *d++ = '\\';
2352 *d++ = 'f';
2353 }
2354 else if (ch == '\\') {
2355 *d++ = '\\';
2356 *d++ = '\\';
2357 }
2358 else if (ch == '\0') {
2359 *d++ = '\\';
2360 *d++ = '0';
2361 }
2362 else if (isPRINT_LC(ch))
2363 *d++ = ch;
2364 else {
2365 *d++ = '^';
2366 *d++ = toCTRL(ch);
2367 }
2368 }
2369 if (s < end) {
2370 *d++ = '.';
2371 *d++ = '.';
2372 *d++ = '.';
2373 }
2374 *d = '\0';
2375 pv = tmpbuf;
a0d0e21e 2376 }
a0d0e21e 2377
533c011a 2378 if (PL_op)
9014280d 2379 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
2380 "Argument \"%s\" isn't numeric in %s", pv,
2381 OP_DESC(PL_op));
a0d0e21e 2382 else
9014280d 2383 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 2384 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
2385}
2386
c2988b20
NC
2387/*
2388=for apidoc looks_like_number
2389
645c22ef
DM
2390Test if the content of an SV looks like a number (or is a number).
2391C<Inf> and C<Infinity> are treated as numbers (so will not issue a
2392non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
2393
2394=cut
2395*/
2396
2397I32
2398Perl_looks_like_number(pTHX_ SV *sv)
2399{
2400 register char *sbegin;
2401 STRLEN len;
2402
2403 if (SvPOK(sv)) {
2404 sbegin = SvPVX(sv);
2405 len = SvCUR(sv);
2406 }
2407 else if (SvPOKp(sv))
2408 sbegin = SvPV(sv, len);
2409 else
e0ab1c0e 2410 return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
c2988b20
NC
2411 return grok_number(sbegin, len, NULL);
2412}
25da4f38
IZ
2413
2414/* Actually, ISO C leaves conversion of UV to IV undefined, but
2415 until proven guilty, assume that things are not that bad... */
2416
645c22ef
DM
2417/*
2418 NV_PRESERVES_UV:
2419
2420 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
2421 an IV (an assumption perl has been based on to date) it becomes necessary
2422 to remove the assumption that the NV always carries enough precision to
2423 recreate the IV whenever needed, and that the NV is the canonical form.
2424 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 2425 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
2426 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
2427 1) to distinguish between IV/UV/NV slots that have cached a valid
2428 conversion where precision was lost and IV/UV/NV slots that have a
2429 valid conversion which has lost no precision
645c22ef 2430 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
2431 would lose precision, the precise conversion (or differently
2432 imprecise conversion) is also performed and cached, to prevent
2433 requests for different numeric formats on the same SV causing
2434 lossy conversion chains. (lossless conversion chains are perfectly
2435 acceptable (still))
2436
2437
2438 flags are used:
2439 SvIOKp is true if the IV slot contains a valid value
2440 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
2441 SvNOKp is true if the NV slot contains a valid value
2442 SvNOK is true only if the NV value is accurate
2443
2444 so
645c22ef 2445 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
2446 IV(or UV) would lose accuracy over a direct conversion from PV to
2447 IV(or UV). If it would, cache both conversions, return NV, but mark
2448 SV as IOK NOKp (ie not NOK).
2449
645c22ef 2450 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
2451 NV would lose accuracy over a direct conversion from PV to NV. If it
2452 would, cache both conversions, flag similarly.
2453
2454 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
2455 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
2456 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
2457 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 2458 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 2459
645c22ef
DM
2460 The benefit of this is that operations such as pp_add know that if
2461 SvIOK is true for both left and right operands, then integer addition
2462 can be used instead of floating point (for cases where the result won't
2463 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
2464 loss of precision compared with integer addition.
2465
2466 * making IV and NV equal status should make maths accurate on 64 bit
2467 platforms
2468 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 2469 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
2470 looking for SvIOK and checking for overflow will not outweigh the
2471 fp to integer speedup)
2472 * will slow down integer operations (callers of SvIV) on "inaccurate"
2473 values, as the change from SvIOK to SvIOKp will cause a call into
2474 sv_2iv each time rather than a macro access direct to the IV slot
2475 * should speed up number->string conversion on integers as IV is
645c22ef 2476 favoured when IV and NV are equally accurate
28e5dec8
JH
2477
2478 ####################################################################
645c22ef
DM
2479 You had better be using SvIOK_notUV if you want an IV for arithmetic:
2480 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
2481 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
2482 ####################################################################
2483
645c22ef 2484 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
2485 performance ratio.
2486*/
2487
2488#ifndef NV_PRESERVES_UV
645c22ef
DM
2489# define IS_NUMBER_UNDERFLOW_IV 1
2490# define IS_NUMBER_UNDERFLOW_UV 2
2491# define IS_NUMBER_IV_AND_UV 2
2492# define IS_NUMBER_OVERFLOW_IV 4
2493# define IS_NUMBER_OVERFLOW_UV 5
2494
2495/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
2496
2497/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
2498STATIC int
645c22ef 2499S_sv_2iuv_non_preserve(pTHX_ register SV *sv, I32 numtype)
28e5dec8 2500{
1779d84d 2501 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
2502 if (SvNVX(sv) < (NV)IV_MIN) {
2503 (void)SvIOKp_on(sv);
2504 (void)SvNOK_on(sv);
2505 SvIVX(sv) = IV_MIN;
2506 return IS_NUMBER_UNDERFLOW_IV;
2507 }
2508 if (SvNVX(sv) > (NV)UV_MAX) {
2509 (void)SvIOKp_on(sv);
2510 (void)SvNOK_on(sv);
2511 SvIsUV_on(sv);
2512 SvUVX(sv) = UV_MAX;
2513 return IS_NUMBER_OVERFLOW_UV;
2514 }
c2988b20
NC
2515 (void)SvIOKp_on(sv);
2516 (void)SvNOK_on(sv);
2517 /* Can't use strtol etc to convert this string. (See truth table in
2518 sv_2iv */
2519 if (SvNVX(sv) <= (UV)IV_MAX) {
2520 SvIVX(sv) = I_V(SvNVX(sv));
2521 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2522 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
2523 } else {
2524 /* Integer is imprecise. NOK, IOKp */
2525 }
2526 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
2527 }
2528 SvIsUV_on(sv);
2529 SvUVX(sv) = U_V(SvNVX(sv));
2530 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2531 if (SvUVX(sv) == UV_MAX) {
2532 /* As we know that NVs don't preserve UVs, UV_MAX cannot
2533 possibly be preserved by NV. Hence, it must be overflow.
2534 NOK, IOKp */
2535 return IS_NUMBER_OVERFLOW_UV;
2536 }
2537 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
2538 } else {
2539 /* Integer is imprecise. NOK, IOKp */
28e5dec8 2540 }
c2988b20 2541 return IS_NUMBER_OVERFLOW_IV;
28e5dec8 2542}
645c22ef
DM
2543#endif /* !NV_PRESERVES_UV*/
2544
891f9566
YST
2545/* sv_2iv() is now a macro using Perl_sv_2iv_flags();
2546 * this function provided for binary compatibility only
2547 */
2548
2549IV
2550Perl_sv_2iv(pTHX_ register SV *sv)
2551{
2552 return sv_2iv_flags(sv, SV_GMAGIC);
2553}
2554
645c22ef 2555/*
891f9566 2556=for apidoc sv_2iv_flags
645c22ef 2557
891f9566
YST
2558Return the integer value of an SV, doing any necessary string
2559conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2560Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
645c22ef
DM
2561
2562=cut
2563*/
28e5dec8 2564
a0d0e21e 2565IV
891f9566 2566Perl_sv_2iv_flags(pTHX_ register SV *sv, I32 flags)
79072805
LW
2567{
2568 if (!sv)
2569 return 0;
8990e307 2570 if (SvGMAGICAL(sv)) {
891f9566
YST
2571 if (flags & SV_GMAGIC)
2572 mg_get(sv);
463ee0b2
LW
2573 if (SvIOKp(sv))
2574 return SvIVX(sv);
748a9306 2575 if (SvNOKp(sv)) {
25da4f38 2576 return I_V(SvNVX(sv));
748a9306 2577 }
36477c24 2578 if (SvPOKp(sv) && SvLEN(sv))
2579 return asIV(sv);
3fe9a6f1 2580 if (!SvROK(sv)) {
d008e5eb 2581 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2582 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 2583 report_uninit(sv);
c6ee37c5 2584 }
36477c24 2585 return 0;
3fe9a6f1 2586 }
463ee0b2 2587 }
ed6116ce 2588 if (SvTHINKFIRST(sv)) {
a0d0e21e 2589 if (SvROK(sv)) {
a0d0e21e 2590 SV* tmpstr;
1554e226 2591 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2592 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2593 return SvIV(tmpstr);
56431972 2594 return PTR2IV(SvRV(sv));
a0d0e21e 2595 }
765f542d
NC
2596 if (SvIsCOW(sv)) {
2597 sv_force_normal_flags(sv, 0);
47deb5e7 2598 }
0336b60e 2599 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2600 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2601 report_uninit(sv);
ed6116ce
LW
2602 return 0;
2603 }
79072805 2604 }
25da4f38
IZ
2605 if (SvIOKp(sv)) {
2606 if (SvIsUV(sv)) {
2607 return (IV)(SvUVX(sv));
2608 }
2609 else {
2610 return SvIVX(sv);
2611 }
463ee0b2 2612 }
748a9306 2613 if (SvNOKp(sv)) {
28e5dec8
JH
2614 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2615 * without also getting a cached IV/UV from it at the same time
2616 * (ie PV->NV conversion should detect loss of accuracy and cache
2617 * IV or UV at same time to avoid this. NWC */
25da4f38
IZ
2618
2619 if (SvTYPE(sv) == SVt_NV)
2620 sv_upgrade(sv, SVt_PVNV);
2621
28e5dec8
JH
2622 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2623 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
2624 certainly cast into the IV range at IV_MAX, whereas the correct
2625 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
2626 cases go to UV */
2627 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
748a9306 2628 SvIVX(sv) = I_V(SvNVX(sv));
28e5dec8
JH
2629 if (SvNVX(sv) == (NV) SvIVX(sv)
2630#ifndef NV_PRESERVES_UV
2631 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2632 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2633 /* Don't flag it as "accurately an integer" if the number
2634 came from a (by definition imprecise) NV operation, and
2635 we're outside the range of NV integer precision */
2636#endif
2637 ) {
2638 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2639 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2640 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2641 PTR2UV(sv),
2642 SvNVX(sv),
2643 SvIVX(sv)));
2644
2645 } else {
2646 /* IV not precise. No need to convert from PV, as NV
2647 conversion would already have cached IV if it detected
2648 that PV->IV would be better than PV->NV->IV
2649 flags already correct - don't set public IOK. */
2650 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2651 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2652 PTR2UV(sv),
2653 SvNVX(sv),
2654 SvIVX(sv)));
2655 }
2656 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2657 but the cast (NV)IV_MIN rounds to a the value less (more
2658 negative) than IV_MIN which happens to be equal to SvNVX ??
2659 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2660 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2661 (NV)UVX == NVX are both true, but the values differ. :-(
2662 Hopefully for 2s complement IV_MIN is something like
2663 0x8000000000000000 which will be exact. NWC */
d460ef45 2664 }
25da4f38 2665 else {
ff68c719 2666 SvUVX(sv) = U_V(SvNVX(sv));
28e5dec8
JH
2667 if (
2668 (SvNVX(sv) == (NV) SvUVX(sv))
2669#ifndef NV_PRESERVES_UV
2670 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2671 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2672 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2673 /* Don't flag it as "accurately an integer" if the number
2674 came from a (by definition imprecise) NV operation, and
2675 we're outside the range of NV integer precision */
2676#endif
2677 )
2678 SvIOK_on(sv);
25da4f38
IZ
2679 SvIsUV_on(sv);
2680 ret_iv_max:
1c846c1f 2681 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 2682 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 2683 PTR2UV(sv),
57def98f
JH
2684 SvUVX(sv),
2685 SvUVX(sv)));
25da4f38
IZ
2686 return (IV)SvUVX(sv);
2687 }
748a9306
LW
2688 }
2689 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20
NC
2690 UV value;
2691 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
25da4f38
IZ
2692 /* We want to avoid a possible problem when we cache an IV which
2693 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
2694 the same as the direct translation of the initial string
2695 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2696 be careful to ensure that the value with the .456 is around if the
2697 NV value is requested in the future).
1c846c1f 2698
25da4f38
IZ
2699 This means that if we cache such an IV, we need to cache the
2700 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 2701 cache the NV if we are sure it's not needed.
25da4f38 2702 */
16b7a9a4 2703
c2988b20
NC
2704 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2705 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2706 == IS_NUMBER_IN_UV) {
5e045b90 2707 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
2708 if (SvTYPE(sv) < SVt_PVIV)
2709 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 2710 (void)SvIOK_on(sv);
c2988b20
NC
2711 } else if (SvTYPE(sv) < SVt_PVNV)
2712 sv_upgrade(sv, SVt_PVNV);
28e5dec8 2713
c2988b20
NC
2714 /* If NV preserves UV then we only use the UV value if we know that
2715 we aren't going to call atof() below. If NVs don't preserve UVs
2716 then the value returned may have more precision than atof() will
2717 return, even though value isn't perfectly accurate. */
2718 if ((numtype & (IS_NUMBER_IN_UV
2719#ifdef NV_PRESERVES_UV
2720 | IS_NUMBER_NOT_INT
2721#endif
2722 )) == IS_NUMBER_IN_UV) {
2723 /* This won't turn off the public IOK flag if it was set above */
2724 (void)SvIOKp_on(sv);
2725
2726 if (!(numtype & IS_NUMBER_NEG)) {
2727 /* positive */;
2728 if (value <= (UV)IV_MAX) {
2729 SvIVX(sv) = (IV)value;
2730 } else {
2731 SvUVX(sv) = value;
2732 SvIsUV_on(sv);
2733 }
2734 } else {
2735 /* 2s complement assumption */
2736 if (value <= (UV)IV_MIN) {
2737 SvIVX(sv) = -(IV)value;
2738 } else {
2739 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2740 I'm assuming it will be rare. */
c2988b20
NC
2741 if (SvTYPE(sv) < SVt_PVNV)
2742 sv_upgrade(sv, SVt_PVNV);
2743 SvNOK_on(sv);
2744 SvIOK_off(sv);
2745 SvIOKp_on(sv);
2746 SvNVX(sv) = -(NV)value;
2747 SvIVX(sv) = IV_MIN;
2748 }
2749 }
2750 }
2751 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2752 will be in the previous block to set the IV slot, and the next
2753 block to set the NV slot. So no else here. */
2754
2755 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2756 != IS_NUMBER_IN_UV) {
2757 /* It wasn't an (integer that doesn't overflow the UV). */
2758 SvNVX(sv) = Atof(SvPVX(sv));
28e5dec8 2759
c2988b20
NC
2760 if (! numtype && ckWARN(WARN_NUMERIC))
2761 not_a_number(sv);
28e5dec8 2762
65202027 2763#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2764 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2765 PTR2UV(sv), SvNVX(sv)));
65202027 2766#else
1779d84d 2767 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 2768 PTR2UV(sv), SvNVX(sv)));
65202027 2769#endif
28e5dec8
JH
2770
2771
2772#ifdef NV_PRESERVES_UV
c2988b20
NC
2773 (void)SvIOKp_on(sv);
2774 (void)SvNOK_on(sv);
2775 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2776 SvIVX(sv) = I_V(SvNVX(sv));
2777 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2778 SvIOK_on(sv);
28e5dec8 2779 } else {
c2988b20
NC
2780 /* Integer is imprecise. NOK, IOKp */
2781 }
2782 /* UV will not work better than IV */
2783 } else {
2784 if (SvNVX(sv) > (NV)UV_MAX) {
2785 SvIsUV_on(sv);
2786 /* Integer is inaccurate. NOK, IOKp, is UV */
2787 SvUVX(sv) = UV_MAX;
2788 SvIsUV_on(sv);
2789 } else {
2790 SvUVX(sv) = U_V(SvNVX(sv));
2791 /* 0xFFFFFFFFFFFFFFFF not an issue in here */
2792 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2793 SvIOK_on(sv);
28e5dec8
JH
2794 SvIsUV_on(sv);
2795 } else {
c2988b20
NC
2796 /* Integer is imprecise. NOK, IOKp, is UV */
2797 SvIsUV_on(sv);
28e5dec8 2798 }
28e5dec8 2799 }
c2988b20
NC
2800 goto ret_iv_max;
2801 }
28e5dec8 2802#else /* NV_PRESERVES_UV */
c2988b20
NC
2803 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2804 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2805 /* The IV slot will have been set from value returned by
2806 grok_number above. The NV slot has just been set using
2807 Atof. */
560b0c46 2808 SvNOK_on(sv);
c2988b20
NC
2809 assert (SvIOKp(sv));
2810 } else {
2811 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2812 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2813 /* Small enough to preserve all bits. */
2814 (void)SvIOKp_on(sv);
2815 SvNOK_on(sv);
2816 SvIVX(sv) = I_V(SvNVX(sv));
2817 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2818 SvIOK_on(sv);
2819 /* Assumption: first non-preserved integer is < IV_MAX,
2820 this NV is in the preserved range, therefore: */
2821 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2822 < (UV)IV_MAX)) {
32fdb065 2823 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
2824 }
2825 } else {
2826 /* IN_UV NOT_INT
2827 0 0 already failed to read UV.
2828 0 1 already failed to read UV.
2829 1 0 you won't get here in this case. IV/UV
2830 slot set, public IOK, Atof() unneeded.
2831 1 1 already read UV.
2832 so there's no point in sv_2iuv_non_preserve() attempting
2833 to use atol, strtol, strtoul etc. */
2834 if (sv_2iuv_non_preserve (sv, numtype)
2835 >= IS_NUMBER_OVERFLOW_IV)
2836 goto ret_iv_max;
2837 }
2838 }
28e5dec8 2839#endif /* NV_PRESERVES_UV */
25da4f38 2840 }
28e5dec8 2841 } else {
599cee73 2842 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 2843 report_uninit(sv);
25da4f38
IZ
2844 if (SvTYPE(sv) < SVt_IV)
2845 /* Typically the caller expects that sv_any is not NULL now. */
2846 sv_upgrade(sv, SVt_IV);
a0d0e21e 2847 return 0;
79072805 2848 }
1d7c1841
GS
2849 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2850 PTR2UV(sv),SvIVX(sv)));
25da4f38 2851 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
2852}
2853
891f9566
YST
2854/* sv_2uv() is now a macro using Perl_sv_2uv_flags();
2855 * this function provided for binary compatibility only
2856 */
2857
2858UV
2859Perl_sv_2uv(pTHX_ register SV *sv)
2860{
2861 return sv_2uv_flags(sv, SV_GMAGIC);
2862}
2863
645c22ef 2864/*
891f9566 2865=for apidoc sv_2uv_flags
645c22ef
DM
2866
2867Return the unsigned integer value of an SV, doing any necessary string
891f9566
YST
2868conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2869Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
645c22ef
DM
2870
2871=cut
2872*/
2873
ff68c719 2874UV
891f9566 2875Perl_sv_2uv_flags(pTHX_ register SV *sv, I32 flags)
ff68c719 2876{
2877 if (!sv)
2878 return 0;
2879 if (SvGMAGICAL(sv)) {
891f9566
YST
2880 if (flags & SV_GMAGIC)
2881 mg_get(sv);
ff68c719 2882 if (SvIOKp(sv))
2883 return SvUVX(sv);
2884 if (SvNOKp(sv))
2885 return U_V(SvNVX(sv));
36477c24 2886 if (SvPOKp(sv) && SvLEN(sv))
2887 return asUV(sv);
3fe9a6f1 2888 if (!SvROK(sv)) {
d008e5eb 2889 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2890 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 2891 report_uninit(sv);
c6ee37c5 2892 }
36477c24 2893 return 0;
3fe9a6f1 2894 }
ff68c719 2895 }
2896 if (SvTHINKFIRST(sv)) {
2897 if (SvROK(sv)) {
ff68c719 2898 SV* tmpstr;
1554e226 2899 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2900 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2901 return SvUV(tmpstr);
56431972 2902 return PTR2UV(SvRV(sv));
ff68c719 2903 }
765f542d
NC
2904 if (SvIsCOW(sv)) {
2905 sv_force_normal_flags(sv, 0);
8a818333 2906 }
0336b60e 2907 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2908 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2909 report_uninit(sv);
ff68c719 2910 return 0;
2911 }
2912 }
25da4f38
IZ
2913 if (SvIOKp(sv)) {
2914 if (SvIsUV(sv)) {
2915 return SvUVX(sv);
2916 }
2917 else {
2918 return (UV)SvIVX(sv);
2919 }
ff68c719 2920 }
2921 if (SvNOKp(sv)) {
28e5dec8
JH
2922 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2923 * without also getting a cached IV/UV from it at the same time
2924 * (ie PV->NV conversion should detect loss of accuracy and cache
2925 * IV or UV at same time to avoid this. */
2926 /* IV-over-UV optimisation - choose to cache IV if possible */
2927
25da4f38
IZ
2928 if (SvTYPE(sv) == SVt_NV)
2929 sv_upgrade(sv, SVt_PVNV);
28e5dec8
JH
2930
2931 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2932 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
f7bbb42a 2933 SvIVX(sv) = I_V(SvNVX(sv));
28e5dec8
JH
2934 if (SvNVX(sv) == (NV) SvIVX(sv)
2935#ifndef NV_PRESERVES_UV
2936 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2937 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2938 /* Don't flag it as "accurately an integer" if the number
2939 came from a (by definition imprecise) NV operation, and
2940 we're outside the range of NV integer precision */
2941#endif
2942 ) {
2943 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2944 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2945 "0x%"UVxf" uv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2946 PTR2UV(sv),
2947 SvNVX(sv),
2948 SvIVX(sv)));
2949
2950 } else {
2951 /* IV not precise. No need to convert from PV, as NV
2952 conversion would already have cached IV if it detected
2953 that PV->IV would be better than PV->NV->IV
2954 flags already correct - don't set public IOK. */
2955 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2956 "0x%"UVxf" uv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2957 PTR2UV(sv),
2958 SvNVX(sv),
2959 SvIVX(sv)));
2960 }
2961 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2962 but the cast (NV)IV_MIN rounds to a the value less (more
2963 negative) than IV_MIN which happens to be equal to SvNVX ??
2964 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2965 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2966 (NV)UVX == NVX are both true, but the values differ. :-(
2967 Hopefully for 2s complement IV_MIN is something like
2968 0x8000000000000000 which will be exact. NWC */
d460ef45 2969 }
28e5dec8
JH
2970 else {
2971 SvUVX(sv) = U_V(SvNVX(sv));
2972 if (
2973 (SvNVX(sv) == (NV) SvUVX(sv))
2974#ifndef NV_PRESERVES_UV
2975 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2976 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2977 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2978 /* Don't flag it as "accurately an integer" if the number
2979 came from a (by definition imprecise) NV operation, and
2980 we're outside the range of NV integer precision */
2981#endif
2982 )
2983 SvIOK_on(sv);
2984 SvIsUV_on(sv);
1c846c1f 2985 DEBUG_c(PerlIO_printf(Perl_debug_log,
28e5dec8 2986 "0x%"UVxf" 2uv(%"UVuf" => %"IVdf") (as unsigned)\n",
57def98f 2987 PTR2UV(sv),
28e5dec8
JH
2988 SvUVX(sv),
2989 SvUVX(sv)));
25da4f38 2990 }
ff68c719 2991 }
2992 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20
NC
2993 UV value;
2994 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
25da4f38
IZ
2995
2996 /* We want to avoid a possible problem when we cache a UV which
2997 may be later translated to an NV, and the resulting NV is not
2998 the translation of the initial data.
1c846c1f 2999
25da4f38
IZ
3000 This means that if we cache such a UV, we need to cache the
3001 NV as well. Moreover, we trade speed for space, and do not
3002 cache the NV if not needed.
3003 */
16b7a9a4 3004
c2988b20
NC
3005 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
3006 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3007 == IS_NUMBER_IN_UV) {
5e045b90 3008 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8 3009 if (SvTYPE(sv) < SVt_PVIV)
f7bbb42a
JH
3010 sv_upgrade(sv, SVt_PVIV);
3011 (void)SvIOK_on(sv);
c2988b20
NC
3012 } else if (SvTYPE(sv) < SVt_PVNV)
3013 sv_upgrade(sv, SVt_PVNV);
d460ef45 3014
c2988b20
NC
3015 /* If NV preserves UV then we only use the UV value if we know that
3016 we aren't going to call atof() below. If NVs don't preserve UVs
3017 then the value returned may have more precision than atof() will
3018 return, even though it isn't accurate. */
3019 if ((numtype & (IS_NUMBER_IN_UV
3020#ifdef NV_PRESERVES_UV
3021 | IS_NUMBER_NOT_INT
3022#endif
3023 )) == IS_NUMBER_IN_UV) {
3024 /* This won't turn off the public IOK flag if it was set above */
3025 (void)SvIOKp_on(sv);
3026
3027 if (!(numtype & IS_NUMBER_NEG)) {
3028 /* positive */;
3029 if (value <= (UV)IV_MAX) {
3030 SvIVX(sv) = (IV)value;
28e5dec8
JH
3031 } else {
3032 /* it didn't overflow, and it was positive. */
c2988b20 3033 SvUVX(sv) = value;
28e5dec8
JH
3034 SvIsUV_on(sv);
3035 }
c2988b20
NC
3036 } else {
3037 /* 2s complement assumption */
3038 if (value <= (UV)IV_MIN) {
3039 SvIVX(sv) = -(IV)value;
3040 } else {
3041 /* Too negative for an IV. This is a double upgrade, but
d1be9408 3042 I'm assuming it will be rare. */
c2988b20
NC
3043 if (SvTYPE(sv) < SVt_PVNV)
3044 sv_upgrade(sv, SVt_PVNV);
3045 SvNOK_on(sv);
3046 SvIOK_off(sv);
3047 SvIOKp_on(sv);
3048 SvNVX(sv) = -(NV)value;
3049 SvIVX(sv) = IV_MIN;
3050 }
3051 }
3052 }
3053
3054 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3055 != IS_NUMBER_IN_UV) {
3056 /* It wasn't an integer, or it overflowed the UV. */
3057 SvNVX(sv) = Atof(SvPVX(sv));
28e5dec8 3058
c2988b20 3059 if (! numtype && ckWARN(WARN_NUMERIC))
28e5dec8
JH
3060 not_a_number(sv);
3061
3062#if defined(USE_LONG_DOUBLE)
c2988b20
NC
3063 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%" PERL_PRIgldbl ")\n",
3064 PTR2UV(sv), SvNVX(sv)));
28e5dec8 3065#else
1779d84d 3066 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"NVgf")\n",
c2988b20 3067 PTR2UV(sv), SvNVX(sv)));
28e5dec8
JH
3068#endif
3069
3070#ifdef NV_PRESERVES_UV
c2988b20
NC
3071 (void)SvIOKp_on(sv);
3072 (void)SvNOK_on(sv);
3073 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
3074 SvIVX(sv) = I_V(SvNVX(sv));
3075 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
3076 SvIOK_on(sv);
3077 } else {
3078 /* Integer is imprecise. NOK, IOKp */
3079 }
3080 /* UV will not work better than IV */
3081 } else {
3082 if (SvNVX(sv) > (NV)UV_MAX) {
3083 SvIsUV_on(sv);
3084 /* Integer is inaccurate. NOK, IOKp, is UV */
3085 SvUVX(sv) = UV_MAX;
3086 SvIsUV_on(sv);
3087 } else {
3088 SvUVX(sv) = U_V(SvNVX(sv));
3089 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
3090 NV preservse UV so can do correct comparison. */
3091 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
3092 SvIOK_on(sv);
3093 SvIsUV_on(sv);
3094 } else {
3095 /* Integer is imprecise. NOK, IOKp, is UV */
3096 SvIsUV_on(sv);
3097 }
3098 }
3099 }
28e5dec8 3100#else /* NV_PRESERVES_UV */
c2988b20
NC
3101 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3102 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
3103 /* The UV slot will have been set from value returned by
3104 grok_number above. The NV slot has just been set using
3105 Atof. */
560b0c46 3106 SvNOK_on(sv);
c2988b20
NC
3107 assert (SvIOKp(sv));
3108 } else {
3109 if (((UV)1 << NV_PRESERVES_UV_BITS) >
3110 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
3111 /* Small enough to preserve all bits. */
3112 (void)SvIOKp_on(sv);
3113 SvNOK_on(sv);
3114 SvIVX(sv) = I_V(SvNVX(sv));
3115 if ((NV)(SvIVX(sv)) == SvNVX(sv))
3116 SvIOK_on(sv);
3117 /* Assumption: first non-preserved integer is < IV_MAX,
3118 this NV is in the preserved range, therefore: */
3119 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
3120 < (UV)IV_MAX)) {
32fdb065 3121 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
3122 }
3123 } else
3124 sv_2iuv_non_preserve (sv, numtype);
3125 }
28e5dec8 3126#endif /* NV_PRESERVES_UV */
f7bbb42a 3127 }
ff68c719 3128 }
3129 else {
d008e5eb 3130 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3131 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3132 report_uninit(sv);
c6ee37c5 3133 }
25da4f38
IZ
3134 if (SvTYPE(sv) < SVt_IV)
3135 /* Typically the caller expects that sv_any is not NULL now. */
3136 sv_upgrade(sv, SVt_IV);
ff68c719 3137 return 0;
3138 }
25da4f38 3139
1d7c1841
GS
3140 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
3141 PTR2UV(sv),SvUVX(sv)));
25da4f38 3142 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 3143}
3144
645c22ef
DM
3145/*
3146=for apidoc sv_2nv
3147
3148Return the num value of an SV, doing any necessary string or integer
3149conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
3150macros.
3151
3152=cut
3153*/
3154
65202027 3155NV
864dbfa3 3156Perl_sv_2nv(pTHX_ register SV *sv)
79072805
LW
3157{
3158 if (!sv)
3159 return 0.0;
8990e307 3160 if (SvGMAGICAL(sv)) {
463ee0b2
LW
3161 mg_get(sv);
3162 if (SvNOKp(sv))
3163 return SvNVX(sv);
a0d0e21e 3164 if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20
NC
3165 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) &&
3166 !grok_number(SvPVX(sv), SvCUR(sv), NULL))
a0d0e21e 3167 not_a_number(sv);
097ee67d 3168 return Atof(SvPVX(sv));
a0d0e21e 3169 }
25da4f38 3170 if (SvIOKp(sv)) {
1c846c1f 3171 if (SvIsUV(sv))
65202027 3172 return (NV)SvUVX(sv);
25da4f38 3173 else
65202027 3174 return (NV)SvIVX(sv);
25da4f38 3175 }
16d20bd9 3176 if (!SvROK(sv)) {
d008e5eb 3177 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3178 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3179 report_uninit(sv);
c6ee37c5 3180 }
16d20bd9
AD
3181 return 0;
3182 }
463ee0b2 3183 }
ed6116ce 3184 if (SvTHINKFIRST(sv)) {
a0d0e21e 3185 if (SvROK(sv)) {
a0d0e21e 3186 SV* tmpstr;
1554e226 3187 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 3188 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 3189 return SvNV(tmpstr);
56431972 3190 return PTR2NV(SvRV(sv));
a0d0e21e 3191 }
765f542d
NC
3192 if (SvIsCOW(sv)) {
3193 sv_force_normal_flags(sv, 0);
8a818333 3194 }
0336b60e 3195 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 3196 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 3197 report_uninit(sv);
ed6116ce
LW
3198 return 0.0;
3199 }
79072805
LW
3200 }
3201 if (SvTYPE(sv) < SVt_NV) {
463ee0b2
LW
3202 if (SvTYPE(sv) == SVt_IV)
3203 sv_upgrade(sv, SVt_PVNV);
3204 else
3205 sv_upgrade(sv, SVt_NV);
906f284f 3206#ifdef USE_LONG_DOUBLE
097ee67d 3207 DEBUG_c({
f93f4e46 3208 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
3209 PerlIO_printf(Perl_debug_log,
3210 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
3211 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
3212 RESTORE_NUMERIC_LOCAL();
3213 });
65202027 3214#else
572bbb43 3215 DEBUG_c({
f93f4e46 3216 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 3217 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 3218 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
3219 RESTORE_NUMERIC_LOCAL();
3220 });
572bbb43 3221#endif
79072805
LW
3222 }
3223 else if (SvTYPE(sv) < SVt_PVNV)
3224 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
3225 if (SvNOKp(sv)) {
3226 return SvNVX(sv);
61604483 3227 }
59d8ce62 3228 if (SvIOKp(sv)) {
65202027 3229 SvNVX(sv) = SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv);
28e5dec8
JH
3230#ifdef NV_PRESERVES_UV
3231 SvNOK_on(sv);
3232#else
3233 /* Only set the public NV OK flag if this NV preserves the IV */
3234 /* Check it's not 0xFFFFFFFFFFFFFFFF */
3235 if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
3236 : (SvIVX(sv) == I_V(SvNVX(sv))))
3237 SvNOK_on(sv);
3238 else
3239 SvNOKp_on(sv);
3240#endif
93a17b20 3241 }
748a9306 3242 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20
NC
3243 UV value;
3244 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
3245 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !numtype)
a0d0e21e 3246 not_a_number(sv);
28e5dec8 3247#ifdef NV_PRESERVES_UV
c2988b20
NC
3248 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3249 == IS_NUMBER_IN_UV) {
5e045b90 3250 /* It's definitely an integer */
c2988b20
NC
3251 SvNVX(sv) = (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value;
3252 } else
3253 SvNVX(sv) = Atof(SvPVX(sv));
28e5dec8
JH
3254 SvNOK_on(sv);
3255#else
c2988b20 3256 SvNVX(sv) = Atof(SvPVX(sv));
28e5dec8
JH
3257 /* Only set the public NV OK flag if this NV preserves the value in
3258 the PV at least as well as an IV/UV would.
3259 Not sure how to do this 100% reliably. */
3260 /* if that shift count is out of range then Configure's test is
3261 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
3262 UV_BITS */
3263 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 3264 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 3265 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
3266 } else if (!(numtype & IS_NUMBER_IN_UV)) {
3267 /* Can't use strtol etc to convert this string, so don't try.
3268 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
3269 SvNOK_on(sv);
3270 } else {
3271 /* value has been set. It may not be precise. */
3272 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
3273 /* 2s complement assumption for (UV)IV_MIN */
3274 SvNOK_on(sv); /* Integer is too negative. */
3275 } else {
3276 SvNOKp_on(sv);
3277 SvIOKp_on(sv);
6fa402ec 3278
c2988b20
NC
3279 if (numtype & IS_NUMBER_NEG) {
3280 SvIVX(sv) = -(IV)value;
3281 } else if (value <= (UV)IV_MAX) {
3282 SvIVX(sv) = (IV)value;
3283 } else {
3284 SvUVX(sv) = value;
3285 SvIsUV_on(sv);
3286 }
3287
3288 if (numtype & IS_NUMBER_NOT_INT) {
3289 /* I believe that even if the original PV had decimals,
3290 they are lost beyond the limit of the FP precision.
3291 However, neither is canonical, so both only get p
3292 flags. NWC, 2000/11/25 */
3293 /* Both already have p flags, so do nothing */
3294 } else {
3295 NV nv = SvNVX(sv);
3296 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
3297 if (SvIVX(sv) == I_V(nv)) {
3298 SvNOK_on(sv);
3299 SvIOK_on(sv);
3300 } else {
3301 SvIOK_on(sv);
3302 /* It had no "." so it must be integer. */
3303 }
3304 } else {
3305 /* between IV_MAX and NV(UV_MAX).
3306 Could be slightly > UV_MAX */
6fa402ec 3307
c2988b20
NC
3308 if (numtype & IS_NUMBER_NOT_INT) {
3309 /* UV and NV both imprecise. */
3310 } else {
3311 UV nv_as_uv = U_V(nv);
3312
3313 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
3314 SvNOK_on(sv);
3315 SvIOK_on(sv);
3316 } else {
3317 SvIOK_on(sv);
3318 }
3319 }
3320 }
3321 }
3322 }
3323 }
28e5dec8 3324#endif /* NV_PRESERVES_UV */
93a17b20 3325 }
79072805 3326 else {
599cee73 3327 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 3328 report_uninit(sv);
25da4f38
IZ
3329 if (SvTYPE(sv) < SVt_NV)
3330 /* Typically the caller expects that sv_any is not NULL now. */
28e5dec8
JH
3331 /* XXX Ilya implies that this is a bug in callers that assume this
3332 and ideally should be fixed. */
25da4f38 3333 sv_upgrade(sv, SVt_NV);
a0d0e21e 3334 return 0.0;
79072805 3335 }
572bbb43 3336#if defined(USE_LONG_DOUBLE)
097ee67d 3337 DEBUG_c({
f93f4e46 3338 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
3339 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
3340 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
3341 RESTORE_NUMERIC_LOCAL();
3342 });
65202027 3343#else
572bbb43 3344 DEBUG_c({
f93f4e46 3345 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 3346 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 3347 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
3348 RESTORE_NUMERIC_LOCAL();
3349 });
572bbb43 3350#endif
463ee0b2 3351 return SvNVX(sv);
79072805
LW
3352}
3353
645c22ef
DM
3354/* asIV(): extract an integer from the string value of an SV.
3355 * Caller must validate PVX */
3356
76e3520e 3357STATIC IV
cea2e8a9 3358S_asIV(pTHX_ SV *sv)
36477c24 3359{
c2988b20
NC
3360 UV value;
3361 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
3362
3363 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3364 == IS_NUMBER_IN_UV) {
645c22ef 3365 /* It's definitely an integer */
c2988b20
NC
3366 if (numtype & IS_NUMBER_NEG) {
3367 if (value < (UV)IV_MIN)
3368 return -(IV)value;
3369 } else {
3370 if (value < (UV)IV_MAX)
3371 return (IV)value;
3372 }
3373 }
d008e5eb 3374 if (!numtype) {
d008e5eb
GS
3375 if (ckWARN(WARN_NUMERIC))
3376 not_a_number(sv);
3377 }
c2988b20 3378 return I_V(Atof(SvPVX(sv)));
36477c24 3379}
3380
645c22ef
DM
3381/* asUV(): extract an unsigned integer from the string value of an SV
3382 * Caller must validate PVX */
3383
76e3520e 3384STATIC UV
cea2e8a9 3385S_asUV(pTHX_ SV *sv)
36477c24 3386{
c2988b20
NC
3387 UV value;
3388 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
36477c24 3389
c2988b20
NC
3390 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3391 == IS_NUMBER_IN_UV) {
645c22ef 3392 /* It's definitely an integer */
6fa402ec 3393 if (!(numtype & IS_NUMBER_NEG))
c2988b20
NC
3394 return value;
3395 }
d008e5eb 3396 if (!numtype) {
d008e5eb
GS
3397 if (ckWARN(WARN_NUMERIC))
3398 not_a_number(sv);
3399 }
097ee67d 3400 return U_V(Atof(SvPVX(sv)));
36477c24 3401}
3402
645c22ef
DM
3403/*
3404=for apidoc sv_2pv_nolen
3405
3406Like C<sv_2pv()>, but doesn't return the length too. You should usually
3407use the macro wrapper C<SvPV_nolen(sv)> instead.
3408=cut
3409*/
3410
79072805 3411char *
864dbfa3 3412Perl_sv_2pv_nolen(pTHX_ register SV *sv)
1fa8b10d
JD
3413{
3414 STRLEN n_a;
3415 return sv_2pv(sv, &n_a);
3416}
3417
645c22ef
DM
3418/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
3419 * UV as a string towards the end of buf, and return pointers to start and
3420 * end of it.
3421 *
3422 * We assume that buf is at least TYPE_CHARS(UV) long.
3423 */
3424
864dbfa3 3425static char *
25da4f38
IZ
3426uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
3427{
25da4f38
IZ
3428 char *ptr = buf + TYPE_CHARS(UV);
3429 char *ebuf = ptr;
3430 int sign;
25da4f38
IZ
3431
3432 if (is_uv)
3433 sign = 0;
3434 else if (iv >= 0) {
3435 uv = iv;
3436 sign = 0;
3437 } else {
3438 uv = -iv;
3439 sign = 1;
3440 }
3441 do {
eb160463 3442 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
3443 } while (uv /= 10);
3444 if (sign)
3445 *--ptr = '-';
3446 *peob = ebuf;
3447 return ptr;
3448}
3449
09540bc3
JH
3450/* sv_2pv() is now a macro using Perl_sv_2pv_flags();
3451 * this function provided for binary compatibility only
3452 */
3453
3454char *
3455Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
3456{
3457 return sv_2pv_flags(sv, lp, SV_GMAGIC);
3458}
3459
645c22ef
DM
3460/*
3461=for apidoc sv_2pv_flags
3462
ff276b08 3463Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
3464If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
3465if necessary.
3466Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
3467usually end up here too.
3468
3469=cut
3470*/
3471
8d6d96c1
HS
3472char *
3473Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
3474{
79072805
LW
3475 register char *s;
3476 int olderrno;
cb50f42d 3477 SV *tsv, *origsv;
25da4f38
IZ
3478 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
3479 char *tmpbuf = tbuf;
79072805 3480
463ee0b2
LW
3481 if (!sv) {
3482 *lp = 0;
73d840c0 3483 return (char *)"";
463ee0b2 3484 }
8990e307 3485 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
3486 if (flags & SV_GMAGIC)
3487 mg_get(sv);
463ee0b2
LW
3488 if (SvPOKp(sv)) {
3489 *lp = SvCUR(sv);
3490 return SvPVX(sv);
3491 }
cf2093f6 3492 if (SvIOKp(sv)) {
1c846c1f 3493 if (SvIsUV(sv))
57def98f 3494 (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
cf2093f6 3495 else
57def98f 3496 (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
46fc3d4c 3497 tsv = Nullsv;
a0d0e21e 3498 goto tokensave;
463ee0b2
LW
3499 }
3500 if (SvNOKp(sv)) {
2d4389e4 3501 Gconvert(SvNVX(sv), NV_DIG, 0, tmpbuf);
46fc3d4c 3502 tsv = Nullsv;
a0d0e21e 3503 goto tokensave;
463ee0b2 3504 }
16d20bd9 3505 if (!SvROK(sv)) {
d008e5eb 3506 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3507 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3508 report_uninit(sv);
c6ee37c5 3509 }
16d20bd9 3510 *lp = 0;
73d840c0 3511 return (char *)"";
16d20bd9 3512 }
463ee0b2 3513 }
ed6116ce
LW
3514 if (SvTHINKFIRST(sv)) {
3515 if (SvROK(sv)) {
a0d0e21e 3516 SV* tmpstr;
e1ec3a88 3517 register const char *typestr;
1554e226 3518 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)) &&
b4b9a328 3519 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
446eaa42
YST
3520 char *pv = SvPV(tmpstr, *lp);
3521 if (SvUTF8(tmpstr))
3522 SvUTF8_on(sv);
3523 else
3524 SvUTF8_off(sv);
3525 return pv;
3526 }
cb50f42d 3527 origsv = sv;
ed6116ce
LW
3528 sv = (SV*)SvRV(sv);
3529 if (!sv)
e1ec3a88 3530 typestr = "NULLREF";
ed6116ce 3531 else {
f9277f47
IZ
3532 MAGIC *mg;
3533
ed6116ce 3534 switch (SvTYPE(sv)) {
f9277f47
IZ
3535 case SVt_PVMG:
3536 if ( ((SvFLAGS(sv) &
1c846c1f 3537 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
faf82a0b 3538 == (SVs_OBJECT|SVs_SMG))
14befaf4 3539 && (mg = mg_find(sv, PERL_MAGIC_qr))) {
e1ec3a88 3540 const regexp *re = (regexp *)mg->mg_obj;
1bd3ad17 3541
2cd61cdb 3542 if (!mg->mg_ptr) {
e1ec3a88 3543 const char *fptr = "msix";
8782bef2
GB
3544 char reflags[6];
3545 char ch;
3546 int left = 0;
3547 int right = 4;
ff385a1b 3548 char need_newline = 0;
eb160463 3549 U16 reganch = (U16)((re->reganch & PMf_COMPILETIME) >> 12);
8782bef2 3550
155aba94 3551 while((ch = *fptr++)) {
8782bef2
GB
3552 if(reganch & 1) {
3553 reflags[left++] = ch;
3554 }
3555 else {
3556 reflags[right--] = ch;
3557 }
3558 reganch >>= 1;
3559 }
3560 if(left != 4) {
3561 reflags[left] = '-';
3562 left = 5;
3563 }
3564
3565 mg->mg_len = re->prelen + 4 + left;
ff385a1b
JF
3566 /*
3567 * If /x was used, we have to worry about a regex
3568 * ending with a comment later being embedded
3569 * within another regex. If so, we don't want this
3570 * regex's "commentization" to leak out to the
3571 * right part of the enclosing regex, we must cap
3572 * it with a newline.
3573 *
3574 * So, if /x was used, we scan backwards from the
3575 * end of the regex. If we find a '#' before we
3576 * find a newline, we need to add a newline
3577 * ourself. If we find a '\n' first (or if we
3578 * don't find '#' or '\n'), we don't need to add
3579 * anything. -jfriedl
3580 */
3581 if (PMf_EXTENDED & re->reganch)
3582 {
e1ec3a88 3583 const char *endptr = re->precomp + re->prelen;
ff385a1b
JF
3584 while (endptr >= re->precomp)
3585 {
e1ec3a88 3586 const char c = *(endptr--);
ff385a1b
JF
3587 if (c == '\n')
3588 break; /* don't need another */
3589 if (c == '#') {
3590 /* we end while in a comment, so we
3591 need a newline */
3592 mg->mg_len++; /* save space for it */
3593 need_newline = 1; /* note to add it */
ab01544f 3594 break;
ff385a1b
JF
3595 }
3596 }
3597 }
3598
8782bef2
GB
3599 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
3600 Copy("(?", mg->mg_ptr, 2, char);
3601 Copy(reflags, mg->mg_ptr+2, left, char);
3602 Copy(":", mg->mg_ptr+left+2, 1, char);
3603 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
ff385a1b
JF
3604 if (need_newline)
3605 mg->mg_ptr[mg->mg_len - 2] = '\n';
1bd3ad17
IZ
3606 mg->mg_ptr[mg->mg_len - 1] = ')';
3607 mg->mg_ptr[mg->mg_len] = 0;
3608 }
3280af22 3609 PL_reginterp_cnt += re->program[0].next_off;
cb50f42d
YST
3610
3611 if (re->reganch & ROPT_UTF8)
3612 SvUTF8_on(origsv);
3613 else
3614 SvUTF8_off(origsv);
1bd3ad17
IZ
3615 *lp = mg->mg_len;
3616 return mg->mg_ptr;
f9277f47
IZ
3617 }
3618 /* Fall through */
ed6116ce
LW
3619 case SVt_NULL:
3620 case SVt_IV:
3621 case SVt_NV:
3622 case SVt_RV:
3623 case SVt_PV:
3624 case SVt_PVIV:
3625 case SVt_PVNV:
e1ec3a88
AL
3626 case SVt_PVBM: typestr = SvROK(sv) ? "REF" : "SCALAR"; break;
3627 case SVt_PVLV: typestr = SvROK(sv) ? "REF"
be65207d
DM
3628 /* tied lvalues should appear to be
3629 * scalars for backwards compatitbility */
3630 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
3631 ? "SCALAR" : "LVALUE"; break;
e1ec3a88
AL
3632 case SVt_PVAV: typestr = "ARRAY"; break;
3633 case SVt_PVHV: typestr = "HASH"; break;
3634 case SVt_PVCV: typestr = "CODE"; break;
3635 case SVt_PVGV: typestr = "GLOB"; break;
3636 case SVt_PVFM: typestr = "FORMAT"; break;
3637 case SVt_PVIO: typestr = "IO"; break;
3638 default: typestr = "UNKNOWN"; break;
ed6116ce 3639 }
46fc3d4c 3640 tsv = NEWSV(0,0);
a5cb6b62
NC
3641 if (SvOBJECT(sv)) {
3642 const char *name = HvNAME(SvSTASH(sv));
3643 Perl_sv_setpvf(aTHX_ tsv, "%s=%s(0x%"UVxf")",
e1ec3a88 3644 name ? name : "__ANON__" , typestr, PTR2UV(sv));
a5cb6b62 3645 }
ed6116ce 3646 else
e1ec3a88 3647 Perl_sv_setpvf(aTHX_ tsv, "%s(0x%"UVxf")", typestr, PTR2UV(sv));
a0d0e21e 3648 goto tokensaveref;
463ee0b2 3649 }
e1ec3a88 3650 *lp = strlen(typestr);
73d840c0 3651 return (char *)typestr;
79072805 3652 }
0336b60e 3653 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 3654 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 3655 report_uninit(sv);
ed6116ce 3656 *lp = 0;
73d840c0 3657 return (char *)"";
79072805 3658 }
79072805 3659 }
28e5dec8
JH
3660 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
3661 /* I'm assuming that if both IV and NV are equally valid then
3662 converting the IV is going to be more efficient */
e1ec3a88
AL
3663 const U32 isIOK = SvIOK(sv);
3664 const U32 isUIOK = SvIsUV(sv);
28e5dec8
JH
3665 char buf[TYPE_CHARS(UV)];
3666 char *ebuf, *ptr;
3667
3668 if (SvTYPE(sv) < SVt_PVIV)
3669 sv_upgrade(sv, SVt_PVIV);
3670 if (isUIOK)
3671 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
3672 else
3673 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
eb160463 3674 SvGROW(sv, (STRLEN)(ebuf - ptr + 1)); /* inlined from sv_setpvn */
28e5dec8
JH
3675 Move(ptr,SvPVX(sv),ebuf - ptr,char);
3676 SvCUR_set(sv, ebuf - ptr);
3677 s = SvEND(sv);
3678 *s = '\0';
3679 if (isIOK)
3680 SvIOK_on(sv);
3681 else
3682 SvIOKp_on(sv);
3683 if (isUIOK)
3684 SvIsUV_on(sv);
3685 }
3686 else if (SvNOKp(sv)) {
79072805
LW
3687 if (SvTYPE(sv) < SVt_PVNV)
3688 sv_upgrade(sv, SVt_PVNV);
1c846c1f 3689 /* The +20 is pure guesswork. Configure test needed. --jhi */
59155cc0 3690 SvGROW(sv, NV_DIG + 20);
463ee0b2 3691 s = SvPVX(sv);
79072805 3692 olderrno = errno; /* some Xenix systems wipe out errno here */
79072805 3693#ifdef apollo
463ee0b2 3694 if (SvNVX(sv) == 0.0)
79072805
LW
3695 (void)strcpy(s,"0");
3696 else
3697#endif /*apollo*/
bbce6d69 3698 {
2d4389e4 3699 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 3700 }
79072805 3701 errno = olderrno;
a0d0e21e
LW
3702#ifdef FIXNEGATIVEZERO
3703 if (*s == '-' && s[1] == '0' && !s[2])
3704 strcpy(s,"0");
3705#endif
79072805
LW
3706 while (*s) s++;
3707#ifdef hcx
3708 if (s[-1] == '.')
46fc3d4c 3709 *--s = '\0';
79072805
LW
3710#endif
3711 }
79072805 3712 else {
0336b60e
IZ
3713 if (ckWARN(WARN_UNINITIALIZED)
3714 && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 3715 report_uninit(sv);
a0d0e21e 3716 *lp = 0;
25da4f38
IZ
3717 if (SvTYPE(sv) < SVt_PV)
3718 /* Typically the caller expects that sv_any is not NULL now. */
3719 sv_upgrade(sv, SVt_PV);
73d840c0 3720 return (char *)"";
79072805 3721 }
463ee0b2
LW
3722 *lp = s - SvPVX(sv);
3723 SvCUR_set(sv, *lp);
79072805 3724 SvPOK_on(sv);
1d7c1841
GS
3725 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3726 PTR2UV(sv),SvPVX(sv)));
463ee0b2 3727 return SvPVX(sv);
a0d0e21e
LW
3728
3729 tokensave:
3730 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
3731 /* Sneaky stuff here */
3732
3733 tokensaveref:
46fc3d4c 3734 if (!tsv)
96827780 3735 tsv = newSVpv(tmpbuf, 0);
46fc3d4c 3736 sv_2mortal(tsv);
3737 *lp = SvCUR(tsv);
3738 return SvPVX(tsv);
a0d0e21e
LW
3739 }
3740 else {
3741 STRLEN len;
73d840c0 3742 const char *t;
46fc3d4c 3743
3744 if (tsv) {
3745 sv_2mortal(tsv);
3746 t = SvPVX(tsv);
3747 len = SvCUR(tsv);
3748 }
3749 else {
96827780
MB
3750 t = tmpbuf;
3751 len = strlen(tmpbuf);
46fc3d4c 3752 }
a0d0e21e 3753#ifdef FIXNEGATIVEZERO
46fc3d4c 3754 if (len == 2 && t[0] == '-' && t[1] == '0') {
3755 t = "0";
3756 len = 1;
3757 }
a0d0e21e
LW
3758#endif
3759 (void)SvUPGRADE(sv, SVt_PV);
46fc3d4c 3760 *lp = len;
a0d0e21e
LW
3761 s = SvGROW(sv, len + 1);
3762 SvCUR_set(sv, len);
6bf554b4 3763 SvPOKp_on(sv);
e90e2364 3764 return strcpy(s, t);
a0d0e21e 3765 }
463ee0b2
LW
3766}
3767
645c22ef 3768/*
6050d10e
JP
3769=for apidoc sv_copypv
3770
3771Copies a stringified representation of the source SV into the
3772destination SV. Automatically performs any necessary mg_get and
54f0641b 3773coercion of numeric values into strings. Guaranteed to preserve
6050d10e 3774UTF-8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
3775sv_2pv[_flags] but operates directly on an SV instead of just the
3776string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
3777would lose the UTF-8'ness of the PV.
3778
3779=cut
3780*/
3781
3782void
3783Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
3784{
446eaa42
YST
3785 STRLEN len;
3786 char *s;
3787 s = SvPV(ssv,len);
cb50f42d 3788 sv_setpvn(dsv,s,len);
446eaa42 3789 if (SvUTF8(ssv))
cb50f42d 3790 SvUTF8_on(dsv);
446eaa42 3791 else
cb50f42d 3792 SvUTF8_off(dsv);
6050d10e
JP
3793}
3794
3795/*
645c22ef
DM
3796=for apidoc sv_2pvbyte_nolen
3797
3798Return a pointer to the byte-encoded representation of the SV.
1e54db1a 3799May cause the SV to be downgraded from UTF-8 as a side-effect.
645c22ef
DM
3800
3801Usually accessed via the C<SvPVbyte_nolen> macro.
3802
3803=cut
3804*/
3805
7340a771
GS
3806char *
3807Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
3808{
560a288e
GS
3809 STRLEN n_a;
3810 return sv_2pvbyte(sv, &n_a);
7340a771
GS
3811}
3812
645c22ef
DM
3813/*
3814=for apidoc sv_2pvbyte
3815
3816Return a pointer to the byte-encoded representation of the SV, and set *lp
1e54db1a 3817to its length. May cause the SV to be downgraded from UTF-8 as a
645c22ef
DM
3818side-effect.
3819
3820Usually accessed via the C<SvPVbyte> macro.
3821
3822=cut
3823*/
3824
7340a771
GS
3825char *
3826Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
3827{
0875d2fe
NIS
3828 sv_utf8_downgrade(sv,0);
3829 return SvPV(sv,*lp);
7340a771
GS
3830}
3831
645c22ef
DM
3832/*
3833=for apidoc sv_2pvutf8_nolen
3834
1e54db1a
JH
3835Return a pointer to the UTF-8-encoded representation of the SV.
3836May cause the SV to be upgraded to UTF-8 as a side-effect.
645c22ef
DM
3837
3838Usually accessed via the C<SvPVutf8_nolen> macro.
3839
3840=cut
3841*/
3842
7340a771
GS
3843char *
3844Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
3845{
560a288e
GS
3846 STRLEN n_a;
3847 return sv_2pvutf8(sv, &n_a);
7340a771
GS
3848}
3849
645c22ef
DM
3850/*
3851=for apidoc sv_2pvutf8
3852
1e54db1a
JH
3853Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3854to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
645c22ef
DM
3855
3856Usually accessed via the C<SvPVutf8> macro.
3857
3858=cut
3859*/
3860
7340a771
GS
3861char *
3862Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
3863{
560a288e 3864 sv_utf8_upgrade(sv);
7d59b7e4 3865 return SvPV(sv,*lp);
7340a771 3866}
1c846c1f 3867
645c22ef
DM
3868/*
3869=for apidoc sv_2bool
3870
3871This function is only called on magical items, and is only used by
8cf8f3d1 3872sv_true() or its macro equivalent.
645c22ef
DM
3873
3874=cut
3875*/
3876
463ee0b2 3877bool
864dbfa3 3878Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 3879{
8990e307 3880 if (SvGMAGICAL(sv))
463ee0b2
LW
3881 mg_get(sv);
3882
a0d0e21e
LW
3883 if (!SvOK(sv))
3884 return 0;
3885 if (SvROK(sv)) {
a0d0e21e 3886 SV* tmpsv;
1554e226 3887 if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
9e3013b1 3888 (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
8a31060d 3889 return (bool)SvTRUE(tmpsv);
a0d0e21e
LW
3890 return SvRV(sv) != 0;
3891 }
463ee0b2 3892 if (SvPOKp(sv)) {
11343788
MB
3893 register XPV* Xpvtmp;
3894 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
3895 (*Xpvtmp->xpv_pv > '0' ||
3896 Xpvtmp->xpv_cur > 1 ||
3897 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
463ee0b2
LW
3898 return 1;
3899 else
3900 return 0;
3901 }
3902 else {
3903 if (SvIOKp(sv))
3904 return SvIVX(sv) != 0;
3905 else {
3906 if (SvNOKp(sv))
3907 return SvNVX(sv) != 0.0;
3908 else
3909 return FALSE;
3910 }
3911 }
79072805
LW
3912}
3913
09540bc3
JH
3914/* sv_utf8_upgrade() is now a macro using sv_utf8_upgrade_flags();
3915 * this function provided for binary compatibility only
3916 */
3917
3918
3919STRLEN
3920Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
3921{
3922 return sv_utf8_upgrade_flags(sv, SV_GMAGIC);
3923}
3924
c461cf8f
JH
3925/*
3926=for apidoc sv_utf8_upgrade
3927
78ea37eb 3928Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3929Forces the SV to string form if it is not already.
4411f3b6
NIS
3930Always sets the SvUTF8 flag to avoid future validity checks even
3931if all the bytes have hibit clear.
c461cf8f 3932
13a6c0e0
JH
3933This is not as a general purpose byte encoding to Unicode interface:
3934use the Encode extension for that.
3935
8d6d96c1
HS
3936=for apidoc sv_utf8_upgrade_flags
3937
78ea37eb 3938Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3939Forces the SV to string form if it is not already.
8d6d96c1
HS
3940Always sets the SvUTF8 flag to avoid future validity checks even
3941if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
3942will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
3943C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3944
13a6c0e0
JH
3945This is not as a general purpose byte encoding to Unicode interface:
3946use the Encode extension for that.
3947
8d6d96c1
HS
3948=cut
3949*/
3950
3951STRLEN
3952Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
3953{
db42d148 3954 U8 *s, *t, *e;
511c2ff0 3955 int hibit = 0;
560a288e 3956
808c356f
RGS
3957 if (sv == &PL_sv_undef)
3958 return 0;
e0e62c2a
NIS
3959 if (!SvPOK(sv)) {
3960 STRLEN len = 0;
d52b7888
NC
3961 if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3962 (void) sv_2pv_flags(sv,&len, flags);
3963 if (SvUTF8(sv))
3964 return len;
3965 } else {
3966 (void) SvPV_force(sv,len);
3967 }
e0e62c2a 3968 }
4411f3b6 3969
f5cee72b 3970 if (SvUTF8(sv)) {
5fec3b1d 3971 return SvCUR(sv);
f5cee72b 3972 }
5fec3b1d 3973
765f542d
NC
3974 if (SvIsCOW(sv)) {
3975 sv_force_normal_flags(sv, 0);
db42d148
NIS
3976 }
3977
88632417 3978 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
799ef3cb 3979 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 3980 else { /* Assume Latin-1/EBCDIC */
0a378802
JH
3981 /* This function could be much more efficient if we
3982 * had a FLAG in SVs to signal if there are any hibit
3983 * chars in the PV. Given that there isn't such a flag
3984 * make the loop as fast as possible. */
3985 s = (U8 *) SvPVX(sv);
3986 e = (U8 *) SvEND(sv);
3987 t = s;
3988 while (t < e) {
3989 U8 ch = *t++;
3990 if ((hibit = !NATIVE_IS_INVARIANT(ch)))
3991 break;
3992 }
3993 if (hibit) {
3994 STRLEN len;
cc2578a4 3995 (void)SvOOK_off(sv);
06a45632 3996 s = (U8*)SvPVX(sv);
0a378802
JH
3997 len = SvCUR(sv) + 1; /* Plus the \0 */
3998 SvPVX(sv) = (char*)bytes_to_utf8((U8*)s, &len);
3999 SvCUR(sv) = len - 1;
4000 if (SvLEN(sv) != 0)
4001 Safefree(s); /* No longer using what was there before. */
4002 SvLEN(sv) = len; /* No longer know the real size. */
4003 }
9f4817db
JH
4004 /* Mark as UTF-8 even if no hibit - saves scanning loop */
4005 SvUTF8_on(sv);
560a288e 4006 }
4411f3b6 4007 return SvCUR(sv);
560a288e
GS
4008}
4009
c461cf8f
JH
4010/*
4011=for apidoc sv_utf8_downgrade
4012
78ea37eb
TS
4013Attempts to convert the PV of an SV from characters to bytes.
4014If the PV contains a character beyond byte, this conversion will fail;
4015in this case, either returns false or, if C<fail_ok> is not
c461cf8f
JH
4016true, croaks.
4017
13a6c0e0
JH
4018This is not as a general purpose Unicode to byte encoding interface:
4019use the Encode extension for that.
4020
c461cf8f
JH
4021=cut
4022*/
4023
560a288e
GS
4024bool
4025Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
4026{
78ea37eb 4027 if (SvPOKp(sv) && SvUTF8(sv)) {
fa301091 4028 if (SvCUR(sv)) {
03cfe0ae 4029 U8 *s;
652088fc 4030 STRLEN len;
fa301091 4031
765f542d
NC
4032 if (SvIsCOW(sv)) {
4033 sv_force_normal_flags(sv, 0);
4034 }
03cfe0ae
NIS
4035 s = (U8 *) SvPV(sv, len);
4036 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
4037 if (fail_ok)
4038 return FALSE;
4039 else {
4040 if (PL_op)
4041 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 4042 OP_DESC(PL_op));
fa301091
JH
4043 else
4044 Perl_croak(aTHX_ "Wide character");
4045 }
4b3603a4 4046 }
fa301091 4047 SvCUR(sv) = len;
67e989fb 4048 }
560a288e 4049 }
ffebcc3e 4050 SvUTF8_off(sv);
560a288e
GS
4051 return TRUE;
4052}
4053
c461cf8f
JH
4054/*
4055=for apidoc sv_utf8_encode
4056
78ea37eb
TS
4057Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
4058flag off so that it looks like octets again.
c461cf8f
JH
4059
4060=cut
4061*/
4062
560a288e
GS
4063void
4064Perl_sv_utf8_encode(pTHX_ register SV *sv)
4065{
4411f3b6 4066 (void) sv_utf8_upgrade(sv);
4c94c214
NC
4067 if (SvIsCOW(sv)) {
4068 sv_force_normal_flags(sv, 0);
4069 }
4070 if (SvREADONLY(sv)) {
4071 Perl_croak(aTHX_ PL_no_modify);
4072 }
560a288e
GS
4073 SvUTF8_off(sv);
4074}
4075
4411f3b6
NIS
4076/*
4077=for apidoc sv_utf8_decode
4078
78ea37eb
TS
4079If the PV of the SV is an octet sequence in UTF-8
4080and contains a multiple-byte character, the C<SvUTF8> flag is turned on
4081so that it looks like a character. If the PV contains only single-byte
4082characters, the C<SvUTF8> flag stays being off.
4083Scans PV for validity and returns false if the PV is invalid UTF-8.
4411f3b6
NIS
4084
4085=cut
4086*/
4087
560a288e
GS
4088bool
4089Perl_sv_utf8_decode(pTHX_ register SV *sv)
4090{
78ea37eb 4091 if (SvPOKp(sv)) {
63cd0674
NIS
4092 U8 *c;
4093 U8 *e;
9cbac4c7 4094
645c22ef
DM
4095 /* The octets may have got themselves encoded - get them back as
4096 * bytes
4097 */
4098 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
4099 return FALSE;
4100
4101 /* it is actually just a matter of turning the utf8 flag on, but
4102 * we want to make sure everything inside is valid utf8 first.
4103 */
63cd0674
NIS
4104 c = (U8 *) SvPVX(sv);
4105 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 4106 return FALSE;
63cd0674 4107 e = (U8 *) SvEND(sv);
511c2ff0 4108 while (c < e) {
c4d5f83a
NIS
4109 U8 ch = *c++;
4110 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
4111 SvUTF8_on(sv);
4112 break;
4113 }
560a288e 4114 }
560a288e
GS
4115 }
4116 return TRUE;
4117}
4118
09540bc3
JH
4119/* sv_setsv() is now a macro using Perl_sv_setsv_flags();
4120 * this function provided for binary compatibility only
4121 */
4122
4123void
4124Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
4125{
4126 sv_setsv_flags(dstr, sstr, SV_GMAGIC);
4127}
4128
954c1994
GS
4129/*
4130=for apidoc sv_setsv
4131
645c22ef
DM
4132Copies the contents of the source SV C<ssv> into the destination SV
4133C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
4134function if the source SV needs to be reused. Does not handle 'set' magic.
4135Loosely speaking, it performs a copy-by-value, obliterating any previous
4136content of the destination.
4137
4138You probably want to use one of the assortment of wrappers, such as
4139C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
4140C<SvSetMagicSV_nosteal>.
4141
8d6d96c1
HS
4142=for apidoc sv_setsv_flags
4143
645c22ef
DM
4144Copies the contents of the source SV C<ssv> into the destination SV
4145C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
4146function if the source SV needs to be reused. Does not handle 'set' magic.
4147Loosely speaking, it performs a copy-by-value, obliterating any previous
4148content of the destination.
4149If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
5fcdf167
NC
4150C<ssv> if appropriate, else not. If the C<flags> parameter has the
4151C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
4152and C<sv_setsv_nomg> are implemented in terms of this function.
645c22ef
DM
4153
4154You probably want to use one of the assortment of wrappers, such as
4155C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
4156C<SvSetMagicSV_nosteal>.
4157
4158This is the primary function for copying scalars, and most other
4159copy-ish functions and macros use this underneath.
8d6d96c1
HS
4160
4161=cut
4162*/
4163
4164void
4165Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
4166{
8990e307
LW
4167 register U32 sflags;
4168 register int dtype;
4169 register int stype;
463ee0b2 4170
79072805
LW
4171 if (sstr == dstr)
4172 return;
765f542d 4173 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 4174 if (!sstr)
3280af22 4175 sstr = &PL_sv_undef;
8990e307
LW
4176 stype = SvTYPE(sstr);
4177 dtype = SvTYPE(dstr);
79072805 4178
a0d0e21e 4179 SvAMAGIC_off(dstr);
7a5fa8a2 4180 if ( SvVOK(dstr) )
ece467f9
JP
4181 {
4182 /* need to nuke the magic */
4183 mg_free(dstr);
4184 SvRMAGICAL_off(dstr);
4185 }
9e7bc3e8 4186
463ee0b2 4187 /* There's a lot of redundancy below but we're going for speed here */
79072805 4188
8990e307 4189 switch (stype) {
79072805 4190 case SVt_NULL:
aece5585 4191 undef_sstr:
20408e3c
GS
4192 if (dtype != SVt_PVGV) {
4193 (void)SvOK_off(dstr);
4194 return;
4195 }
4196 break;
463ee0b2 4197 case SVt_IV:
aece5585
GA
4198 if (SvIOK(sstr)) {
4199 switch (dtype) {
4200 case SVt_NULL:
8990e307 4201 sv_upgrade(dstr, SVt_IV);
aece5585
GA
4202 break;
4203 case SVt_NV:
8990e307 4204 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
4205 break;
4206 case SVt_RV:
4207 case SVt_PV:
a0d0e21e 4208 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
4209 break;
4210 }
4211 (void)SvIOK_only(dstr);
4212 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
4213 if (SvIsUV(sstr))
4214 SvIsUV_on(dstr);
27c9684d
AP
4215 if (SvTAINTED(sstr))
4216 SvTAINT(dstr);
aece5585 4217 return;
8990e307 4218 }
aece5585
GA
4219 goto undef_sstr;
4220
463ee0b2 4221 case SVt_NV:
aece5585
GA
4222 if (SvNOK(sstr)) {
4223 switch (dtype) {
4224 case SVt_NULL:
4225 case SVt_IV:
8990e307 4226 sv_upgrade(dstr, SVt_NV);
aece5585
GA
4227 break;
4228 case SVt_RV:
4229 case SVt_PV:
4230 case SVt_PVIV:
a0d0e21e 4231 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
4232 break;
4233 }
4234 SvNVX(dstr) = SvNVX(sstr);
4235 (void)SvNOK_only(dstr);
27c9684d
AP
4236 if (SvTAINTED(sstr))
4237 SvTAINT(dstr);
aece5585 4238 return;
8990e307 4239 }
aece5585
GA
4240 goto undef_sstr;
4241
ed6116ce 4242 case SVt_RV:
8990e307 4243 if (dtype < SVt_RV)
ed6116ce 4244 sv_upgrade(dstr, SVt_RV);
c07a80fd 4245 else if (dtype == SVt_PVGV &&
23bb1b96 4246 SvROK(sstr) && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
c07a80fd 4247 sstr = SvRV(sstr);
a5f75d66 4248 if (sstr == dstr) {
1d7c1841
GS
4249 if (GvIMPORTED(dstr) != GVf_IMPORTED
4250 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4251 {
a5f75d66 4252 GvIMPORTED_on(dstr);
1d7c1841 4253 }
a5f75d66
AD
4254 GvMULTI_on(dstr);
4255 return;
4256 }
c07a80fd 4257 goto glob_assign;
4258 }
ed6116ce 4259 break;
fc36a67e 4260 case SVt_PVFM:
d89fc664
NC
4261#ifdef PERL_COPY_ON_WRITE
4262 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
4263 if (dtype < SVt_PVIV)
4264 sv_upgrade(dstr, SVt_PVIV);
4265 break;
4266 }
4267 /* Fall through */
4268#endif
4269 case SVt_PV:
8990e307 4270 if (dtype < SVt_PV)
463ee0b2 4271 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
4272 break;
4273 case SVt_PVIV:
8990e307 4274 if (dtype < SVt_PVIV)
463ee0b2 4275 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
4276 break;
4277 case SVt_PVNV:
8990e307 4278 if (dtype < SVt_PVNV)
463ee0b2 4279 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 4280 break;
4633a7c4
LW
4281 case SVt_PVAV:
4282 case SVt_PVHV:
4283 case SVt_PVCV:
4633a7c4 4284 case SVt_PVIO:
533c011a 4285 if (PL_op)
cea2e8a9 4286 Perl_croak(aTHX_ "Bizarre copy of %s in %s", sv_reftype(sstr, 0),
53e06cf0 4287 OP_NAME(PL_op));
4633a7c4 4288 else
cea2e8a9 4289 Perl_croak(aTHX_ "Bizarre copy of %s", sv_reftype(sstr, 0));
4633a7c4
LW
4290 break;
4291
79072805 4292 case SVt_PVGV:
8990e307 4293 if (dtype <= SVt_PVGV) {
c07a80fd 4294 glob_assign:
a5f75d66 4295 if (dtype != SVt_PVGV) {
a0d0e21e
LW
4296 char *name = GvNAME(sstr);
4297 STRLEN len = GvNAMELEN(sstr);
b76195c2
DM
4298 /* don't upgrade SVt_PVLV: it can hold a glob */
4299 if (dtype != SVt_PVLV)
4300 sv_upgrade(dstr, SVt_PVGV);
14befaf4 4301 sv_magic(dstr, dstr, PERL_MAGIC_glob, Nullch, 0);
85aff577 4302 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
4303 GvNAME(dstr) = savepvn(name, len);
4304 GvNAMELEN(dstr) = len;
4305 SvFAKE_on(dstr); /* can coerce to non-glob */
4306 }
7bac28a0 4307 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
4308 else if (PL_curstackinfo->si_type == PERLSI_SORT
4309 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
cea2e8a9 4310 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
7bac28a0 4311 GvNAME(dstr));
5bd07a3d 4312
7fb37951
AMS
4313#ifdef GV_UNIQUE_CHECK
4314 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
4315 Perl_croak(aTHX_ PL_no_modify);
4316 }
4317#endif
4318
a0d0e21e 4319 (void)SvOK_off(dstr);
a5f75d66 4320 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 4321 gp_free((GV*)dstr);
79072805 4322 GvGP(dstr) = gp_ref(GvGP(sstr));
27c9684d
AP
4323 if (SvTAINTED(sstr))
4324 SvTAINT(dstr);
1d7c1841
GS
4325 if (GvIMPORTED(dstr) != GVf_IMPORTED
4326 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4327 {
a5f75d66 4328 GvIMPORTED_on(dstr);
1d7c1841 4329 }
a5f75d66 4330 GvMULTI_on(dstr);
79072805
LW
4331 return;
4332 }
4333 /* FALL THROUGH */
4334
4335 default:
8d6d96c1 4336 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 4337 mg_get(sstr);
eb160463 4338 if ((int)SvTYPE(sstr) != stype) {
973f89ab
CS
4339 stype = SvTYPE(sstr);
4340 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
4341 goto glob_assign;
4342 }
4343 }
ded42b9f 4344 if (stype == SVt_PVLV)
6fc92669 4345 (void)SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 4346 else
eb160463 4347 (void)SvUPGRADE(dstr, (U32)stype);
79072805
LW
4348 }
4349
8990e307
LW
4350 sflags = SvFLAGS(sstr);
4351
4352 if (sflags & SVf_ROK) {
4353 if (dtype >= SVt_PV) {
4354 if (dtype == SVt_PVGV) {
4355 SV *sref = SvREFCNT_inc(SvRV(sstr));
4356 SV *dref = 0;
a5f75d66 4357 int intro = GvINTRO(dstr);
a0d0e21e 4358
7fb37951
AMS
4359#ifdef GV_UNIQUE_CHECK
4360 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
4361 Perl_croak(aTHX_ PL_no_modify);
4362 }
4363#endif
4364
a0d0e21e 4365 if (intro) {
a5f75d66 4366 GvINTRO_off(dstr); /* one-shot flag */
1d7c1841 4367 GvLINE(dstr) = CopLINE(PL_curcop);
1edc1566 4368 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 4369 }
a5f75d66 4370 GvMULTI_on(dstr);
8990e307
LW
4371 switch (SvTYPE(sref)) {
4372 case SVt_PVAV:
a0d0e21e 4373 if (intro)
890ed176 4374 SAVEGENERICSV(GvAV(dstr));
a0d0e21e
LW
4375 else
4376 dref = (SV*)GvAV(dstr);
8990e307 4377 GvAV(dstr) = (AV*)sref;
39bac7f7 4378 if (!GvIMPORTED_AV(dstr)
1d7c1841
GS
4379 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4380 {
a5f75d66 4381 GvIMPORTED_AV_on(dstr);
1d7c1841 4382 }
8990e307
LW
4383 break;
4384 case SVt_PVHV:
a0d0e21e 4385 if (intro)
890ed176 4386 SAVEGENERICSV(GvHV(dstr));
a0d0e21e
LW
4387 else
4388 dref = (SV*)GvHV(dstr);
8990e307 4389 GvHV(dstr) = (HV*)sref;
39bac7f7 4390 if (!GvIMPORTED_HV(dstr)
1d7c1841
GS
4391 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4392 {
a5f75d66 4393 GvIMPORTED_HV_on(dstr);
1d7c1841 4394 }
8990e307
LW
4395 break;
4396 case SVt_PVCV:
8ebc5c01 4397 if (intro) {
4398 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
4399 SvREFCNT_dec(GvCV(dstr));
4400 GvCV(dstr) = Nullcv;
68dc0745 4401 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 4402 PL_sub_generation++;
8ebc5c01 4403 }
890ed176 4404 SAVEGENERICSV(GvCV(dstr));
8ebc5c01 4405 }
68dc0745 4406 else
4407 dref = (SV*)GvCV(dstr);
4408 if (GvCV(dstr) != (CV*)sref) {
748a9306 4409 CV* cv = GvCV(dstr);
4633a7c4 4410 if (cv) {
68dc0745 4411 if (!GvCVGEN((GV*)dstr) &&
4412 (CvROOT(cv) || CvXSUB(cv)))
4413 {
7bac28a0 4414 /* ahem, death to those who redefine
4415 * active sort subs */
3280af22
NIS
4416 if (PL_curstackinfo->si_type == PERLSI_SORT &&
4417 PL_sortcop == CvSTART(cv))
1c846c1f 4418 Perl_croak(aTHX_
7bac28a0 4419 "Can't redefine active sort subroutine %s",
4420 GvENAME((GV*)dstr));
beab0874
JT
4421 /* Redefining a sub - warning is mandatory if
4422 it was a const and its value changed. */
4423 if (ckWARN(WARN_REDEFINE)
4424 || (CvCONST(cv)
4425 && (!CvCONST((CV*)sref)
4426 || sv_cmp(cv_const_sv(cv),
4427 cv_const_sv((CV*)sref)))))
4428 {
9014280d 4429 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
beab0874 4430 CvCONST(cv)
910764e6
RGS
4431 ? "Constant subroutine %s::%s redefined"
4432 : "Subroutine %s::%s redefined",
4433 HvNAME(GvSTASH((GV*)dstr)),
beab0874
JT
4434 GvENAME((GV*)dstr));
4435 }
9607fc9c 4436 }
fb24441d
RGS
4437 if (!intro)
4438 cv_ckproto(cv, (GV*)dstr,
4439 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 4440 }
a5f75d66 4441 GvCV(dstr) = (CV*)sref;
7a4c00b4 4442 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 4443 GvASSUMECV_on(dstr);
3280af22 4444 PL_sub_generation++;
a5f75d66 4445 }
39bac7f7 4446 if (!GvIMPORTED_CV(dstr)
1d7c1841
GS
4447 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4448 {
a5f75d66 4449 GvIMPORTED_CV_on(dstr);
1d7c1841 4450 }
8990e307 4451 break;
91bba347
LW
4452 case SVt_PVIO:
4453 if (intro)
890ed176 4454 SAVEGENERICSV(GvIOp(dstr));
91bba347
LW
4455 else
4456 dref = (SV*)GvIOp(dstr);
4457 GvIOp(dstr) = (IO*)sref;
4458 break;
f4d13ee9
JH
4459 case SVt_PVFM:
4460 if (intro)
890ed176 4461 SAVEGENERICSV(GvFORM(dstr));
f4d13ee9
JH
4462 else
4463 dref = (SV*)GvFORM(dstr);
4464 GvFORM(dstr) = (CV*)sref;
4465 break;
8990e307 4466 default:
a0d0e21e 4467 if (intro)
890ed176 4468 SAVEGENERICSV(GvSV(dstr));
a0d0e21e
LW
4469 else
4470 dref = (SV*)GvSV(dstr);
8990e307 4471 GvSV(dstr) = sref;
39bac7f7 4472 if (!GvIMPORTED_SV(dstr)
1d7c1841
GS
4473 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4474 {
a5f75d66 4475 GvIMPORTED_SV_on(dstr);
1d7c1841 4476 }
8990e307
LW
4477 break;
4478 }
4479 if (dref)
4480 SvREFCNT_dec(dref);
27c9684d
AP
4481 if (SvTAINTED(sstr))
4482 SvTAINT(dstr);
8990e307
LW
4483 return;
4484 }
a0d0e21e 4485 if (SvPVX(dstr)) {
760ac839 4486 (void)SvOOK_off(dstr); /* backoff */
50483b2c
JD
4487 if (SvLEN(dstr))
4488 Safefree(SvPVX(dstr));
a0d0e21e
LW
4489 SvLEN(dstr)=SvCUR(dstr)=0;
4490 }
8990e307 4491 }
a0d0e21e 4492 (void)SvOK_off(dstr);
8990e307 4493 SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
ed6116ce 4494 SvROK_on(dstr);
8990e307 4495 if (sflags & SVp_NOK) {
3332b3c1
JH
4496 SvNOKp_on(dstr);
4497 /* Only set the public OK flag if the source has public OK. */
4498 if (sflags & SVf_NOK)
4499 SvFLAGS(dstr) |= SVf_NOK;
ed6116ce
LW
4500 SvNVX(dstr) = SvNVX(sstr);
4501 }
8990e307 4502 if (sflags & SVp_IOK) {
3332b3c1
JH
4503 (void)SvIOKp_on(dstr);
4504 if (sflags & SVf_IOK)
4505 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4506 if (sflags & SVf_IVisUV)
25da4f38 4507 SvIsUV_on(dstr);
3332b3c1 4508 SvIVX(dstr) = SvIVX(sstr);
ed6116ce 4509 }
a0d0e21e
LW
4510 if (SvAMAGIC(sstr)) {
4511 SvAMAGIC_on(dstr);
4512 }
ed6116ce 4513 }
8990e307 4514 else if (sflags & SVp_POK) {
765f542d 4515 bool isSwipe = 0;
79072805
LW
4516
4517 /*
4518 * Check to see if we can just swipe the string. If so, it's a
4519 * possible small lose on short strings, but a big win on long ones.
463ee0b2
LW
4520 * It might even be a win on short strings if SvPVX(dstr)
4521 * has to be allocated and SvPVX(sstr) has to be freed.
79072805
LW
4522 */
4523
120fac95
NC
4524 /* Whichever path we take through the next code, we want this true,
4525 and doing it now facilitates the COW check. */
4526 (void)SvPOK_only(dstr);
4527
765f542d
NC
4528 if (
4529#ifdef PERL_COPY_ON_WRITE
4530 (sflags & (SVf_FAKE | SVf_READONLY)) != (SVf_FAKE | SVf_READONLY)
4531 &&
4532#endif
4533 !(isSwipe =
4534 (sflags & SVs_TEMP) && /* slated for free anyway? */
4535 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
5fcdf167
NC
4536 (!(flags & SV_NOSTEAL)) &&
4537 /* and we're allowed to steal temps */
765f542d
NC
4538 SvREFCNT(sstr) == 1 && /* and no other references to it? */
4539 SvLEN(sstr) && /* and really is a string */
645c22ef 4540 /* and won't be needed again, potentially */
765f542d
NC
4541 !(PL_op && PL_op->op_type == OP_AASSIGN))
4542#ifdef PERL_COPY_ON_WRITE
4543 && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
120fac95 4544 && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
765f542d
NC
4545 && SvTYPE(sstr) >= SVt_PVIV)
4546#endif
4547 ) {
4548 /* Failed the swipe test, and it's not a shared hash key either.
4549 Have to copy the string. */
4550 STRLEN len = SvCUR(sstr);
4551 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
4552 Move(SvPVX(sstr),SvPVX(dstr),len,char);
4553 SvCUR_set(dstr, len);
4554 *SvEND(dstr) = '\0';
765f542d
NC
4555 } else {
4556 /* If PERL_COPY_ON_WRITE is not defined, then isSwipe will always
4557 be true in here. */
4558#ifdef PERL_COPY_ON_WRITE
4559 /* Either it's a shared hash key, or it's suitable for
4560 copy-on-write or we can swipe the string. */
46187eeb 4561 if (DEBUG_C_TEST) {
ed252734 4562 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
4563 sv_dump(sstr);
4564 sv_dump(dstr);
46187eeb 4565 }
765f542d
NC
4566 if (!isSwipe) {
4567 /* I believe I should acquire a global SV mutex if
4568 it's a COW sv (not a shared hash key) to stop
4569 it going un copy-on-write.
4570 If the source SV has gone un copy on write between up there
4571 and down here, then (assert() that) it is of the correct
4572 form to make it copy on write again */
4573 if ((sflags & (SVf_FAKE | SVf_READONLY))
4574 != (SVf_FAKE | SVf_READONLY)) {
4575 SvREADONLY_on(sstr);
4576 SvFAKE_on(sstr);
4577 /* Make the source SV into a loop of 1.
4578 (about to become 2) */
a29f6d03 4579 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
4580 }
4581 }
4582#endif
4583 /* Initial code is common. */
adbc6bb1 4584 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
4585 if (SvOOK(dstr)) {
4586 SvFLAGS(dstr) &= ~SVf_OOK;
4587 Safefree(SvPVX(dstr) - SvIVX(dstr));
4588 }
50483b2c 4589 else if (SvLEN(dstr))
a5f75d66 4590 Safefree(SvPVX(dstr));
79072805 4591 }
765f542d
NC
4592
4593#ifdef PERL_COPY_ON_WRITE
4594 if (!isSwipe) {
4595 /* making another shared SV. */
4596 STRLEN cur = SvCUR(sstr);
4597 STRLEN len = SvLEN(sstr);
d89fc664 4598 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
4599 if (len) {
4600 /* SvIsCOW_normal */
4601 /* splice us in between source and next-after-source. */
a29f6d03
NC
4602 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4603 SV_COW_NEXT_SV_SET(sstr, dstr);
765f542d
NC
4604 SvPV_set(dstr, SvPVX(sstr));
4605 } else {
4606 /* SvIsCOW_shared_hash */
4607 UV hash = SvUVX(sstr);
46187eeb
NC
4608 DEBUG_C(PerlIO_printf(Perl_debug_log,
4609 "Copy on write: Sharing hash\n"));
765f542d
NC
4610 SvPV_set(dstr,
4611 sharepvn(SvPVX(sstr),
4612 (sflags & SVf_UTF8?-cur:cur), hash));
4613 SvUVX(dstr) = hash;
4614 }
4615 SvLEN(dstr) = len;
4616 SvCUR(dstr) = cur;
4617 SvREADONLY_on(dstr);
4618 SvFAKE_on(dstr);
4619 /* Relesase a global SV mutex. */
4620 }
4621 else
4622#endif
4623 { /* Passes the swipe test. */
4624 SvPV_set(dstr, SvPVX(sstr));
4625 SvLEN_set(dstr, SvLEN(sstr));
4626 SvCUR_set(dstr, SvCUR(sstr));
4627
4628 SvTEMP_off(dstr);
4629 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
4630 SvPV_set(sstr, Nullch);
4631 SvLEN_set(sstr, 0);
4632 SvCUR_set(sstr, 0);
4633 SvTEMP_off(sstr);
4634 }
4635 }
9aa983d2 4636 if (sflags & SVf_UTF8)
a7cb1f99 4637 SvUTF8_on(dstr);
79072805 4638 /*SUPPRESS 560*/
8990e307 4639 if (sflags & SVp_NOK) {
3332b3c1
JH
4640 SvNOKp_on(dstr);
4641 if (sflags & SVf_NOK)
4642 SvFLAGS(dstr) |= SVf_NOK;
463ee0b2 4643 SvNVX(dstr) = SvNVX(sstr);
79072805 4644 }
8990e307 4645 if (sflags & SVp_IOK) {
3332b3c1
JH
4646 (void)SvIOKp_on(dstr);
4647 if (sflags & SVf_IOK)
4648 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4649 if (sflags & SVf_IVisUV)
25da4f38 4650 SvIsUV_on(dstr);
463ee0b2 4651 SvIVX(dstr) = SvIVX(sstr);
79072805 4652 }
92f0c265 4653 if (SvVOK(sstr)) {
7a5fa8a2 4654 MAGIC *smg = mg_find(sstr,PERL_MAGIC_vstring);
ece467f9
JP
4655 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4656 smg->mg_ptr, smg->mg_len);
439cb1c4 4657 SvRMAGICAL_on(dstr);
7a5fa8a2 4658 }
79072805 4659 }
8990e307 4660 else if (sflags & SVp_IOK) {
3332b3c1
JH
4661 if (sflags & SVf_IOK)
4662 (void)SvIOK_only(dstr);
4663 else {
9cbac4c7
DM
4664 (void)SvOK_off(dstr);
4665 (void)SvIOKp_on(dstr);
3332b3c1
JH
4666 }
4667 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2b1c7e3e 4668 if (sflags & SVf_IVisUV)
25da4f38 4669 SvIsUV_on(dstr);
3332b3c1
JH
4670 SvIVX(dstr) = SvIVX(sstr);
4671 if (sflags & SVp_NOK) {
4672 if (sflags & SVf_NOK)
4673 (void)SvNOK_on(dstr);
4674 else
4675 (void)SvNOKp_on(dstr);
4676 SvNVX(dstr) = SvNVX(sstr);
4677 }
4678 }
4679 else if (sflags & SVp_NOK) {
4680 if (sflags & SVf_NOK)
4681 (void)SvNOK_only(dstr);
4682 else {
9cbac4c7 4683 (void)SvOK_off(dstr);
3332b3c1
JH
4684 SvNOKp_on(dstr);
4685 }
4686 SvNVX(dstr) = SvNVX(sstr);
79072805
LW
4687 }
4688 else {
20408e3c 4689 if (dtype == SVt_PVGV) {
e476b1b5 4690 if (ckWARN(WARN_MISC))
9014280d 4691 Perl_warner(aTHX_ packWARN(WARN_MISC), "Undefined value assigned to typeglob");
20408e3c
GS
4692 }
4693 else
4694 (void)SvOK_off(dstr);
a0d0e21e 4695 }
27c9684d
AP
4696 if (SvTAINTED(sstr))
4697 SvTAINT(dstr);
79072805
LW
4698}
4699
954c1994
GS
4700/*
4701=for apidoc sv_setsv_mg
4702
4703Like C<sv_setsv>, but also handles 'set' magic.
4704
4705=cut
4706*/
4707
79072805 4708void
864dbfa3 4709Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
4710{
4711 sv_setsv(dstr,sstr);
4712 SvSETMAGIC(dstr);
4713}
4714
ed252734
NC
4715#ifdef PERL_COPY_ON_WRITE
4716SV *
4717Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4718{
4719 STRLEN cur = SvCUR(sstr);
4720 STRLEN len = SvLEN(sstr);
4721 register char *new_pv;
4722
4723 if (DEBUG_C_TEST) {
4724 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4725 sstr, dstr);
4726 sv_dump(sstr);
4727 if (dstr)
4728 sv_dump(dstr);
4729 }
4730
4731 if (dstr) {
4732 if (SvTHINKFIRST(dstr))
4733 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
4734 else if (SvPVX(dstr))
4735 Safefree(SvPVX(dstr));
4736 }
4737 else
4738 new_SV(dstr);
b988aa42 4739 (void)SvUPGRADE (dstr, SVt_PVIV);
ed252734
NC
4740
4741 assert (SvPOK(sstr));
4742 assert (SvPOKp(sstr));
4743 assert (!SvIOK(sstr));
4744 assert (!SvIOKp(sstr));
4745 assert (!SvNOK(sstr));
4746 assert (!SvNOKp(sstr));
4747
4748 if (SvIsCOW(sstr)) {
4749
4750 if (SvLEN(sstr) == 0) {
4751 /* source is a COW shared hash key. */
4752 UV hash = SvUVX(sstr);
4753 DEBUG_C(PerlIO_printf(Perl_debug_log,
4754 "Fast copy on write: Sharing hash\n"));
4755 SvUVX(dstr) = hash;
4756 new_pv = sharepvn(SvPVX(sstr), (SvUTF8(sstr)?-cur:cur), hash);
4757 goto common_exit;
4758 }
4759 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4760 } else {
4761 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
b988aa42 4762 (void)SvUPGRADE (sstr, SVt_PVIV);
ed252734
NC
4763 SvREADONLY_on(sstr);
4764 SvFAKE_on(sstr);
4765 DEBUG_C(PerlIO_printf(Perl_debug_log,
4766 "Fast copy on write: Converting sstr to COW\n"));
4767 SV_COW_NEXT_SV_SET(dstr, sstr);
4768 }
4769 SV_COW_NEXT_SV_SET(sstr, dstr);
4770 new_pv = SvPVX(sstr);
4771
4772 common_exit:
4773 SvPV_set(dstr, new_pv);
4774 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4775 if (SvUTF8(sstr))
4776 SvUTF8_on(dstr);
4777 SvLEN(dstr) = len;
4778 SvCUR(dstr) = cur;
4779 if (DEBUG_C_TEST) {
4780 sv_dump(dstr);
4781 }
4782 return dstr;
4783}
4784#endif
4785
954c1994
GS
4786/*
4787=for apidoc sv_setpvn
4788
4789Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
4790bytes to be copied. If the C<ptr> argument is NULL the SV will become
4791undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
4792
4793=cut
4794*/
4795
ef50df4b 4796void
864dbfa3 4797Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 4798{
c6f8c383 4799 register char *dptr;
22c522df 4800
765f542d 4801 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4802 if (!ptr) {
a0d0e21e 4803 (void)SvOK_off(sv);
463ee0b2
LW
4804 return;
4805 }
22c522df
JH
4806 else {
4807 /* len is STRLEN which is unsigned, need to copy to signed */
4808 IV iv = len;
9c5ffd7c
JH
4809 if (iv < 0)
4810 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 4811 }
6fc92669 4812 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4813
79072805 4814 SvGROW(sv, len + 1);
c6f8c383
GA
4815 dptr = SvPVX(sv);
4816 Move(ptr,dptr,len,char);
4817 dptr[len] = '\0';
79072805 4818 SvCUR_set(sv, len);
1aa99e6b 4819 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4820 SvTAINT(sv);
79072805
LW
4821}
4822
954c1994
GS
4823/*
4824=for apidoc sv_setpvn_mg
4825
4826Like C<sv_setpvn>, but also handles 'set' magic.
4827
4828=cut
4829*/
4830
79072805 4831void
864dbfa3 4832Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4833{
4834 sv_setpvn(sv,ptr,len);
4835 SvSETMAGIC(sv);
4836}
4837
954c1994
GS
4838/*
4839=for apidoc sv_setpv
4840
4841Copies a string into an SV. The string must be null-terminated. Does not
4842handle 'set' magic. See C<sv_setpv_mg>.
4843
4844=cut
4845*/
4846
ef50df4b 4847void
864dbfa3 4848Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4849{
4850 register STRLEN len;
4851
765f542d 4852 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4853 if (!ptr) {
a0d0e21e 4854 (void)SvOK_off(sv);
463ee0b2
LW
4855 return;
4856 }
79072805 4857 len = strlen(ptr);
6fc92669 4858 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4859
79072805 4860 SvGROW(sv, len + 1);
463ee0b2 4861 Move(ptr,SvPVX(sv),len+1,char);
79072805 4862 SvCUR_set(sv, len);
1aa99e6b 4863 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
4864 SvTAINT(sv);
4865}
4866
954c1994
GS
4867/*
4868=for apidoc sv_setpv_mg
4869
4870Like C<sv_setpv>, but also handles 'set' magic.
4871
4872=cut
4873*/
4874
463ee0b2 4875void
864dbfa3 4876Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
4877{
4878 sv_setpv(sv,ptr);
4879 SvSETMAGIC(sv);
4880}
4881
954c1994
GS
4882/*
4883=for apidoc sv_usepvn
4884
4885Tells an SV to use C<ptr> to find its string value. Normally the string is
1c846c1f 4886stored inside the SV but sv_usepvn allows the SV to use an outside string.
954c1994
GS
4887The C<ptr> should point to memory that was allocated by C<malloc>. The
4888string length, C<len>, must be supplied. This function will realloc the
4889memory pointed to by C<ptr>, so that pointer should not be freed or used by
4890the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
4891See C<sv_usepvn_mg>.
4892
4893=cut
4894*/
4895
ef50df4b 4896void
864dbfa3 4897Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 4898{
765f542d 4899 SV_CHECK_THINKFIRST_COW_DROP(sv);
c6f8c383 4900 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 4901 if (!ptr) {
a0d0e21e 4902 (void)SvOK_off(sv);
463ee0b2
LW
4903 return;
4904 }
a0ed51b3 4905 (void)SvOOK_off(sv);
50483b2c 4906 if (SvPVX(sv) && SvLEN(sv))
463ee0b2
LW
4907 Safefree(SvPVX(sv));
4908 Renew(ptr, len+1, char);
4909 SvPVX(sv) = ptr;
4910 SvCUR_set(sv, len);
4911 SvLEN_set(sv, len+1);
4912 *SvEND(sv) = '\0';
1aa99e6b 4913 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4914 SvTAINT(sv);
79072805
LW
4915}
4916
954c1994
GS
4917/*
4918=for apidoc sv_usepvn_mg
4919
4920Like C<sv_usepvn>, but also handles 'set' magic.
4921
4922=cut
4923*/
4924
ef50df4b 4925void
864dbfa3 4926Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 4927{
51c1089b 4928 sv_usepvn(sv,ptr,len);
ef50df4b
GS
4929 SvSETMAGIC(sv);
4930}
4931
765f542d
NC
4932#ifdef PERL_COPY_ON_WRITE
4933/* Need to do this *after* making the SV normal, as we need the buffer
4934 pointer to remain valid until after we've copied it. If we let go too early,
4935 another thread could invalidate it by unsharing last of the same hash key
4936 (which it can do by means other than releasing copy-on-write Svs)
4937 or by changing the other copy-on-write SVs in the loop. */
4938STATIC void
4939S_sv_release_COW(pTHX_ register SV *sv, char *pvx, STRLEN cur, STRLEN len,
4940 U32 hash, SV *after)
4941{
4942 if (len) { /* this SV was SvIsCOW_normal(sv) */
4943 /* we need to find the SV pointing to us. */
4944 SV *current = SV_COW_NEXT_SV(after);
7a5fa8a2 4945
765f542d
NC
4946 if (current == sv) {
4947 /* The SV we point to points back to us (there were only two of us
4948 in the loop.)
4949 Hence other SV is no longer copy on write either. */
4950 SvFAKE_off(after);
4951 SvREADONLY_off(after);
4952 } else {
4953 /* We need to follow the pointers around the loop. */
4954 SV *next;
4955 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4956 assert (next);
4957 current = next;
4958 /* don't loop forever if the structure is bust, and we have
4959 a pointer into a closed loop. */
4960 assert (current != after);
e419cbc5 4961 assert (SvPVX(current) == pvx);
765f542d
NC
4962 }
4963 /* Make the SV before us point to the SV after us. */
a29f6d03 4964 SV_COW_NEXT_SV_SET(current, after);
765f542d
NC
4965 }
4966 } else {
4967 unsharepvn(pvx, SvUTF8(sv) ? -(I32)cur : cur, hash);
4968 }
4969}
4970
4971int
4972Perl_sv_release_IVX(pTHX_ register SV *sv)
4973{
4974 if (SvIsCOW(sv))
4975 sv_force_normal_flags(sv, 0);
0c34ef67
MHM
4976 SvOOK_off(sv);
4977 return 0;
765f542d
NC
4978}
4979#endif
645c22ef
DM
4980/*
4981=for apidoc sv_force_normal_flags
4982
4983Undo various types of fakery on an SV: if the PV is a shared string, make
4984a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4985an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4986we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4987then a copy-on-write scalar drops its PV buffer (if any) and becomes
4988SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 4989set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
4990C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4991with flags set to 0.
645c22ef
DM
4992
4993=cut
4994*/
4995
6fc92669 4996void
840a7b70 4997Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 4998{
765f542d
NC
4999#ifdef PERL_COPY_ON_WRITE
5000 if (SvREADONLY(sv)) {
5001 /* At this point I believe I should acquire a global SV mutex. */
5002 if (SvFAKE(sv)) {
5003 char *pvx = SvPVX(sv);
5004 STRLEN len = SvLEN(sv);
5005 STRLEN cur = SvCUR(sv);
5006 U32 hash = SvUVX(sv);
5007 SV *next = SV_COW_NEXT_SV(sv); /* next COW sv in the loop. */
46187eeb
NC
5008 if (DEBUG_C_TEST) {
5009 PerlIO_printf(Perl_debug_log,
5010 "Copy on write: Force normal %ld\n",
5011 (long) flags);
e419cbc5 5012 sv_dump(sv);
46187eeb 5013 }
765f542d
NC
5014 SvFAKE_off(sv);
5015 SvREADONLY_off(sv);
5016 /* This SV doesn't own the buffer, so need to New() a new one: */
5017 SvPVX(sv) = 0;
5018 SvLEN(sv) = 0;
5019 if (flags & SV_COW_DROP_PV) {
5020 /* OK, so we don't need to copy our buffer. */
5021 SvPOK_off(sv);
5022 } else {
5023 SvGROW(sv, cur + 1);
5024 Move(pvx,SvPVX(sv),cur,char);
5025 SvCUR(sv) = cur;
5026 *SvEND(sv) = '\0';
5027 }
e419cbc5 5028 sv_release_COW(sv, pvx, cur, len, hash, next);
46187eeb 5029 if (DEBUG_C_TEST) {
e419cbc5 5030 sv_dump(sv);
46187eeb 5031 }
765f542d 5032 }
923e4eb5 5033 else if (IN_PERL_RUNTIME)
765f542d
NC
5034 Perl_croak(aTHX_ PL_no_modify);
5035 /* At this point I believe that I can drop the global SV mutex. */
5036 }
5037#else
2213622d 5038 if (SvREADONLY(sv)) {
1c846c1f
NIS
5039 if (SvFAKE(sv)) {
5040 char *pvx = SvPVX(sv);
5c98da1c 5041 int is_utf8 = SvUTF8(sv);
1c846c1f
NIS
5042 STRLEN len = SvCUR(sv);
5043 U32 hash = SvUVX(sv);
10bcdfd6
NC
5044 SvFAKE_off(sv);
5045 SvREADONLY_off(sv);
5c98da1c
NC
5046 SvPVX(sv) = 0;
5047 SvLEN(sv) = 0;
1c846c1f
NIS
5048 SvGROW(sv, len + 1);
5049 Move(pvx,SvPVX(sv),len,char);
5050 *SvEND(sv) = '\0';
5c98da1c 5051 unsharepvn(pvx, is_utf8 ? -(I32)len : len, hash);
1c846c1f 5052 }
923e4eb5 5053 else if (IN_PERL_RUNTIME)
cea2e8a9 5054 Perl_croak(aTHX_ PL_no_modify);
0f15f207 5055 }
765f542d 5056#endif
2213622d 5057 if (SvROK(sv))
840a7b70 5058 sv_unref_flags(sv, flags);
6fc92669
GS
5059 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
5060 sv_unglob(sv);
0f15f207 5061}
1c846c1f 5062
645c22ef
DM
5063/*
5064=for apidoc sv_force_normal
5065
5066Undo various types of fakery on an SV: if the PV is a shared string, make
5067a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
5068an xpvmg. See also C<sv_force_normal_flags>.
5069
5070=cut
5071*/
5072
840a7b70
IZ
5073void
5074Perl_sv_force_normal(pTHX_ register SV *sv)
5075{
5076 sv_force_normal_flags(sv, 0);
5077}
5078
954c1994
GS
5079/*
5080=for apidoc sv_chop
5081
1c846c1f 5082Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
5083SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
5084the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 5085string. Uses the "OOK hack".
31869a79
AE
5086Beware: after this function returns, C<ptr> and SvPVX(sv) may no longer
5087refer to the same chunk of data.
954c1994
GS
5088
5089=cut
5090*/
5091
79072805 5092void
645c22ef 5093Perl_sv_chop(pTHX_ register SV *sv, register char *ptr)
79072805
LW
5094{
5095 register STRLEN delta;
a0d0e21e 5096 if (!ptr || !SvPOKp(sv))
79072805 5097 return;
31869a79 5098 delta = ptr - SvPVX(sv);
2213622d 5099 SV_CHECK_THINKFIRST(sv);
79072805
LW
5100 if (SvTYPE(sv) < SVt_PVIV)
5101 sv_upgrade(sv,SVt_PVIV);
5102
5103 if (!SvOOK(sv)) {
50483b2c
JD
5104 if (!SvLEN(sv)) { /* make copy of shared string */
5105 char *pvx = SvPVX(sv);
5106 STRLEN len = SvCUR(sv);
5107 SvGROW(sv, len + 1);
5108 Move(pvx,SvPVX(sv),len,char);
5109 *SvEND(sv) = '\0';
5110 }
463ee0b2 5111 SvIVX(sv) = 0;
a4bfb290
AB
5112 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
5113 and we do that anyway inside the SvNIOK_off
5114 */
7a5fa8a2 5115 SvFLAGS(sv) |= SVf_OOK;
79072805 5116 }
a4bfb290 5117 SvNIOK_off(sv);
79072805
LW
5118 SvLEN(sv) -= delta;
5119 SvCUR(sv) -= delta;
463ee0b2
LW
5120 SvPVX(sv) += delta;
5121 SvIVX(sv) += delta;
79072805
LW
5122}
5123
09540bc3
JH
5124/* sv_catpvn() is now a macro using Perl_sv_catpvn_flags();
5125 * this function provided for binary compatibility only
5126 */
5127
5128void
5129Perl_sv_catpvn(pTHX_ SV *dsv, const char* sstr, STRLEN slen)
5130{
5131 sv_catpvn_flags(dsv, sstr, slen, SV_GMAGIC);
5132}
5133
954c1994
GS
5134/*
5135=for apidoc sv_catpvn
5136
5137Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
5138C<len> indicates number of bytes to copy. If the SV has the UTF-8
5139status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 5140Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 5141
8d6d96c1
HS
5142=for apidoc sv_catpvn_flags
5143
5144Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
5145C<len> indicates number of bytes to copy. If the SV has the UTF-8
5146status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
5147If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
5148appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
5149in terms of this function.
5150
5151=cut
5152*/
5153
5154void
5155Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
5156{
5157 STRLEN dlen;
5158 char *dstr;
5159
5160 dstr = SvPV_force_flags(dsv, dlen, flags);
5161 SvGROW(dsv, dlen + slen + 1);
5162 if (sstr == dstr)
5163 sstr = SvPVX(dsv);
5164 Move(sstr, SvPVX(dsv) + dlen, slen, char);
5165 SvCUR(dsv) += slen;
5166 *SvEND(dsv) = '\0';
5167 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
5168 SvTAINT(dsv);
79072805
LW
5169}
5170
954c1994
GS
5171/*
5172=for apidoc sv_catpvn_mg
5173
5174Like C<sv_catpvn>, but also handles 'set' magic.
5175
5176=cut
5177*/
5178
79072805 5179void
864dbfa3 5180Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
5181{
5182 sv_catpvn(sv,ptr,len);
5183 SvSETMAGIC(sv);
5184}
5185
09540bc3
JH
5186/* sv_catsv() is now a macro using Perl_sv_catsv_flags();
5187 * this function provided for binary compatibility only
5188 */
5189
5190void
5191Perl_sv_catsv(pTHX_ SV *dstr, register SV *sstr)
5192{
5193 sv_catsv_flags(dstr, sstr, SV_GMAGIC);
5194}
5195
954c1994
GS
5196/*
5197=for apidoc sv_catsv
5198
13e8c8e3
JH
5199Concatenates the string from SV C<ssv> onto the end of the string in
5200SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
5201not 'set' magic. See C<sv_catsv_mg>.
954c1994 5202
8d6d96c1
HS
5203=for apidoc sv_catsv_flags
5204
5205Concatenates the string from SV C<ssv> onto the end of the string in
5206SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
5207bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
5208and C<sv_catsv_nomg> are implemented in terms of this function.
5209
5210=cut */
5211
ef50df4b 5212void
8d6d96c1 5213Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 5214{
13e8c8e3
JH
5215 char *spv;
5216 STRLEN slen;
46199a12 5217 if (!ssv)
79072805 5218 return;
46199a12 5219 if ((spv = SvPV(ssv, slen))) {
4fd84b44
AD
5220 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
5221 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
8cf8f3d1
NIS
5222 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
5223 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4fd84b44
AD
5224 dsv->sv_flags doesn't have that bit set.
5225 Andy Dougherty 12 Oct 2001
5226 */
5227 I32 sutf8 = DO_UTF8(ssv);
5228 I32 dutf8;
13e8c8e3 5229
8d6d96c1
HS
5230 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
5231 mg_get(dsv);
5232 dutf8 = DO_UTF8(dsv);
5233
5234 if (dutf8 != sutf8) {
13e8c8e3 5235 if (dutf8) {
46199a12 5236 /* Not modifying source SV, so taking a temporary copy. */
8d6d96c1 5237 SV* csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 5238
46199a12 5239 sv_utf8_upgrade(csv);
8d6d96c1 5240 spv = SvPV(csv, slen);
13e8c8e3 5241 }
8d6d96c1
HS
5242 else
5243 sv_utf8_upgrade_nomg(dsv);
e84ff256 5244 }
8d6d96c1 5245 sv_catpvn_nomg(dsv, spv, slen);
560a288e 5246 }
79072805
LW
5247}
5248
954c1994
GS
5249/*
5250=for apidoc sv_catsv_mg
5251
5252Like C<sv_catsv>, but also handles 'set' magic.
5253
5254=cut
5255*/
5256
79072805 5257void
46199a12 5258Perl_sv_catsv_mg(pTHX_ SV *dsv, register SV *ssv)
ef50df4b 5259{
46199a12
JH
5260 sv_catsv(dsv,ssv);
5261 SvSETMAGIC(dsv);
ef50df4b
GS
5262}
5263
954c1994
GS
5264/*
5265=for apidoc sv_catpv
5266
5267Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
5268If the SV has the UTF-8 status set, then the bytes appended should be
5269valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 5270
d5ce4a7c 5271=cut */
954c1994 5272
ef50df4b 5273void
0c981600 5274Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
5275{
5276 register STRLEN len;
463ee0b2 5277 STRLEN tlen;
748a9306 5278 char *junk;
79072805 5279
0c981600 5280 if (!ptr)
79072805 5281 return;
748a9306 5282 junk = SvPV_force(sv, tlen);
0c981600 5283 len = strlen(ptr);
463ee0b2 5284 SvGROW(sv, tlen + len + 1);
0c981600
JH
5285 if (ptr == junk)
5286 ptr = SvPVX(sv);
5287 Move(ptr,SvPVX(sv)+tlen,len+1,char);
79072805 5288 SvCUR(sv) += len;
d41ff1b8 5289 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 5290 SvTAINT(sv);
79072805
LW
5291}
5292
954c1994
GS
5293/*
5294=for apidoc sv_catpv_mg
5295
5296Like C<sv_catpv>, but also handles 'set' magic.
5297
5298=cut
5299*/
5300
ef50df4b 5301void
0c981600 5302Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 5303{
0c981600 5304 sv_catpv(sv,ptr);
ef50df4b
GS
5305 SvSETMAGIC(sv);
5306}
5307
645c22ef
DM
5308/*
5309=for apidoc newSV
5310
5311Create a new null SV, or if len > 0, create a new empty SVt_PV type SV
5312with an initial PV allocation of len+1. Normally accessed via the C<NEWSV>
5313macro.
5314
5315=cut
5316*/
5317
79072805 5318SV *
864dbfa3 5319Perl_newSV(pTHX_ STRLEN len)
79072805
LW
5320{
5321 register SV *sv;
1c846c1f 5322
4561caa4 5323 new_SV(sv);
79072805
LW
5324 if (len) {
5325 sv_upgrade(sv, SVt_PV);
5326 SvGROW(sv, len + 1);
5327 }
5328 return sv;
5329}
954c1994 5330/*
92110913 5331=for apidoc sv_magicext
954c1994 5332
68795e93 5333Adds magic to an SV, upgrading it if necessary. Applies the
2d8d5d5a 5334supplied vtable and returns a pointer to the magic added.
92110913 5335
2d8d5d5a
SH
5336Note that C<sv_magicext> will allow things that C<sv_magic> will not.
5337In particular, you can add magic to SvREADONLY SVs, and add more than
5338one instance of the same 'how'.
645c22ef 5339
2d8d5d5a
SH
5340If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
5341stored, if C<namlen> is zero then C<name> is stored as-is and - as another
5342special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
5343to contain an C<SV*> and is stored as-is with its REFCNT incremented.
92110913 5344
2d8d5d5a 5345(This is now used as a subroutine by C<sv_magic>.)
954c1994
GS
5346
5347=cut
5348*/
92110913 5349MAGIC *
e1ec3a88 5350Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, const MGVTBL *vtable,
92110913 5351 const char* name, I32 namlen)
79072805
LW
5352{
5353 MAGIC* mg;
68795e93 5354
92110913
NIS
5355 if (SvTYPE(sv) < SVt_PVMG) {
5356 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 5357 }
79072805
LW
5358 Newz(702,mg, 1, MAGIC);
5359 mg->mg_moremagic = SvMAGIC(sv);
79072805 5360 SvMAGIC(sv) = mg;
75f9d97a 5361
05f95b08
SB
5362 /* Sometimes a magic contains a reference loop, where the sv and
5363 object refer to each other. To prevent a reference loop that
5364 would prevent such objects being freed, we look for such loops
5365 and if we find one we avoid incrementing the object refcount.
87f0b213
JH
5366
5367 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 5368 have its REFCNT incremented to keep it in existence.
87f0b213
JH
5369
5370 */
14befaf4
DM
5371 if (!obj || obj == sv ||
5372 how == PERL_MAGIC_arylen ||
5373 how == PERL_MAGIC_qr ||
75f9d97a
JH
5374 (SvTYPE(obj) == SVt_PVGV &&
5375 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
5376 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 5377 GvFORM(obj) == (CV*)sv)))
75f9d97a 5378 {
8990e307 5379 mg->mg_obj = obj;
75f9d97a 5380 }
85e6fe83 5381 else {
8990e307 5382 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
5383 mg->mg_flags |= MGf_REFCOUNTED;
5384 }
b5ccf5f2
YST
5385
5386 /* Normal self-ties simply pass a null object, and instead of
5387 using mg_obj directly, use the SvTIED_obj macro to produce a
5388 new RV as needed. For glob "self-ties", we are tieing the PVIO
5389 with an RV obj pointing to the glob containing the PVIO. In
5390 this case, to avoid a reference loop, we need to weaken the
5391 reference.
5392 */
5393
5394 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
5395 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
5396 {
5397 sv_rvweaken(obj);
5398 }
5399
79072805 5400 mg->mg_type = how;
565764a8 5401 mg->mg_len = namlen;
9cbac4c7 5402 if (name) {
92110913 5403 if (namlen > 0)
1edc1566 5404 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 5405 else if (namlen == HEf_SVKEY)
1edc1566 5406 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
68795e93 5407 else
92110913 5408 mg->mg_ptr = (char *) name;
9cbac4c7 5409 }
92110913 5410 mg->mg_virtual = vtable;
68795e93 5411
92110913
NIS
5412 mg_magical(sv);
5413 if (SvGMAGICAL(sv))
5414 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
5415 return mg;
5416}
5417
5418/*
5419=for apidoc sv_magic
1c846c1f 5420
92110913
NIS
5421Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
5422then adds a new magic item of type C<how> to the head of the magic list.
5423
2d8d5d5a
SH
5424See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
5425handling of the C<name> and C<namlen> arguments.
5426
4509d3fb
SB
5427You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
5428to add more than one instance of the same 'how'.
5429
92110913
NIS
5430=cut
5431*/
5432
5433void
5434Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 5435{
e1ec3a88 5436 const MGVTBL *vtable = 0;
92110913 5437 MAGIC* mg;
92110913 5438
765f542d
NC
5439#ifdef PERL_COPY_ON_WRITE
5440 if (SvIsCOW(sv))
5441 sv_force_normal_flags(sv, 0);
5442#endif
92110913 5443 if (SvREADONLY(sv)) {
923e4eb5 5444 if (IN_PERL_RUNTIME
92110913
NIS
5445 && how != PERL_MAGIC_regex_global
5446 && how != PERL_MAGIC_bm
5447 && how != PERL_MAGIC_fm
5448 && how != PERL_MAGIC_sv
e6469971 5449 && how != PERL_MAGIC_backref
92110913
NIS
5450 )
5451 {
5452 Perl_croak(aTHX_ PL_no_modify);
5453 }
5454 }
5455 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
5456 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
5457 /* sv_magic() refuses to add a magic of the same 'how' as an
5458 existing one
92110913
NIS
5459 */
5460 if (how == PERL_MAGIC_taint)
5461 mg->mg_len |= 1;
5462 return;
5463 }
5464 }
68795e93 5465
79072805 5466 switch (how) {
14befaf4 5467 case PERL_MAGIC_sv:
92110913 5468 vtable = &PL_vtbl_sv;
79072805 5469 break;
14befaf4 5470 case PERL_MAGIC_overload:
92110913 5471 vtable = &PL_vtbl_amagic;
a0d0e21e 5472 break;
14befaf4 5473 case PERL_MAGIC_overload_elem:
92110913 5474 vtable = &PL_vtbl_amagicelem;
a0d0e21e 5475 break;
14befaf4 5476 case PERL_MAGIC_overload_table:
92110913 5477 vtable = &PL_vtbl_ovrld;
a0d0e21e 5478 break;
14befaf4 5479 case PERL_MAGIC_bm:
92110913 5480 vtable = &PL_vtbl_bm;
79072805 5481 break;
14befaf4 5482 case PERL_MAGIC_regdata:
92110913 5483 vtable = &PL_vtbl_regdata;
6cef1e77 5484 break;
14befaf4 5485 case PERL_MAGIC_regdatum:
92110913 5486 vtable = &PL_vtbl_regdatum;
6cef1e77 5487 break;
14befaf4 5488 case PERL_MAGIC_env:
92110913 5489 vtable = &PL_vtbl_env;
79072805 5490 break;
14befaf4 5491 case PERL_MAGIC_fm:
92110913 5492 vtable = &PL_vtbl_fm;
55497cff 5493 break;
14befaf4 5494 case PERL_MAGIC_envelem:
92110913 5495 vtable = &PL_vtbl_envelem;
79072805 5496 break;
14befaf4 5497 case PERL_MAGIC_regex_global:
92110913 5498 vtable = &PL_vtbl_mglob;
93a17b20 5499 break;
14befaf4 5500 case PERL_MAGIC_isa:
92110913 5501 vtable = &PL_vtbl_isa;
463ee0b2 5502 break;
14befaf4 5503 case PERL_MAGIC_isaelem:
92110913 5504 vtable = &PL_vtbl_isaelem;
463ee0b2 5505 break;
14befaf4 5506 case PERL_MAGIC_nkeys:
92110913 5507 vtable = &PL_vtbl_nkeys;
16660edb 5508 break;
14befaf4 5509 case PERL_MAGIC_dbfile:
92110913 5510 vtable = 0;
93a17b20 5511 break;
14befaf4 5512 case PERL_MAGIC_dbline:
92110913 5513 vtable = &PL_vtbl_dbline;
79072805 5514 break;
36477c24 5515#ifdef USE_LOCALE_COLLATE
14befaf4 5516 case PERL_MAGIC_collxfrm:
92110913 5517 vtable = &PL_vtbl_collxfrm;
bbce6d69 5518 break;
36477c24 5519#endif /* USE_LOCALE_COLLATE */
14befaf4 5520 case PERL_MAGIC_tied:
92110913 5521 vtable = &PL_vtbl_pack;
463ee0b2 5522 break;
14befaf4
DM
5523 case PERL_MAGIC_tiedelem:
5524 case PERL_MAGIC_tiedscalar:
92110913 5525 vtable = &PL_vtbl_packelem;
463ee0b2 5526 break;
14befaf4 5527 case PERL_MAGIC_qr:
92110913 5528 vtable = &PL_vtbl_regexp;
c277df42 5529 break;
14befaf4 5530 case PERL_MAGIC_sig:
92110913 5531 vtable = &PL_vtbl_sig;
79072805 5532 break;
14befaf4 5533 case PERL_MAGIC_sigelem:
92110913 5534 vtable = &PL_vtbl_sigelem;
79072805 5535 break;
14befaf4 5536 case PERL_MAGIC_taint:
92110913 5537 vtable = &PL_vtbl_taint;
463ee0b2 5538 break;
14befaf4 5539 case PERL_MAGIC_uvar:
92110913 5540 vtable = &PL_vtbl_uvar;
79072805 5541 break;
14befaf4 5542 case PERL_MAGIC_vec:
92110913 5543 vtable = &PL_vtbl_vec;
79072805 5544 break;
ece467f9
JP
5545 case PERL_MAGIC_vstring:
5546 vtable = 0;
5547 break;
7e8c5dac
HS
5548 case PERL_MAGIC_utf8:
5549 vtable = &PL_vtbl_utf8;
5550 break;
14befaf4 5551 case PERL_MAGIC_substr:
92110913 5552 vtable = &PL_vtbl_substr;
79072805 5553 break;
14befaf4 5554 case PERL_MAGIC_defelem:
92110913 5555 vtable = &PL_vtbl_defelem;
5f05dabc 5556 break;
14befaf4 5557 case PERL_MAGIC_glob:
92110913 5558 vtable = &PL_vtbl_glob;
79072805 5559 break;
14befaf4 5560 case PERL_MAGIC_arylen:
92110913 5561 vtable = &PL_vtbl_arylen;
79072805 5562 break;
14befaf4 5563 case PERL_MAGIC_pos:
92110913 5564 vtable = &PL_vtbl_pos;
a0d0e21e 5565 break;
14befaf4 5566 case PERL_MAGIC_backref:
92110913 5567 vtable = &PL_vtbl_backref;
810b8aa5 5568 break;
14befaf4
DM
5569 case PERL_MAGIC_ext:
5570 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
5571 /* Useful for attaching extension internal data to perl vars. */
5572 /* Note that multiple extensions may clash if magical scalars */
5573 /* etc holding private data from one are passed to another. */
a0d0e21e 5574 break;
79072805 5575 default:
14befaf4 5576 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 5577 }
68795e93 5578
92110913
NIS
5579 /* Rest of work is done else where */
5580 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 5581
92110913
NIS
5582 switch (how) {
5583 case PERL_MAGIC_taint:
5584 mg->mg_len = 1;
5585 break;
5586 case PERL_MAGIC_ext:
5587 case PERL_MAGIC_dbfile:
5588 SvRMAGICAL_on(sv);
5589 break;
5590 }
463ee0b2
LW
5591}
5592
c461cf8f
JH
5593/*
5594=for apidoc sv_unmagic
5595
645c22ef 5596Removes all magic of type C<type> from an SV.
c461cf8f
JH
5597
5598=cut
5599*/
5600
463ee0b2 5601int
864dbfa3 5602Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
5603{
5604 MAGIC* mg;
5605 MAGIC** mgp;
91bba347 5606 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
5607 return 0;
5608 mgp = &SvMAGIC(sv);
5609 for (mg = *mgp; mg; mg = *mgp) {
5610 if (mg->mg_type == type) {
e1ec3a88 5611 const MGVTBL* const vtbl = mg->mg_virtual;
463ee0b2 5612 *mgp = mg->mg_moremagic;
1d7c1841 5613 if (vtbl && vtbl->svt_free)
fc0dc3b3 5614 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 5615 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 5616 if (mg->mg_len > 0)
1edc1566 5617 Safefree(mg->mg_ptr);
565764a8 5618 else if (mg->mg_len == HEf_SVKEY)
1edc1566 5619 SvREFCNT_dec((SV*)mg->mg_ptr);
7e8c5dac
HS
5620 else if (mg->mg_type == PERL_MAGIC_utf8 && mg->mg_ptr)
5621 Safefree(mg->mg_ptr);
9cbac4c7 5622 }
a0d0e21e
LW
5623 if (mg->mg_flags & MGf_REFCOUNTED)
5624 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
5625 Safefree(mg);
5626 }
5627 else
5628 mgp = &mg->mg_moremagic;
79072805 5629 }
91bba347 5630 if (!SvMAGIC(sv)) {
463ee0b2 5631 SvMAGICAL_off(sv);
06759ea0 5632 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
5633 }
5634
5635 return 0;
79072805
LW
5636}
5637
c461cf8f
JH
5638/*
5639=for apidoc sv_rvweaken
5640
645c22ef
DM
5641Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5642referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5643push a back-reference to this RV onto the array of backreferences
5644associated with that magic.
c461cf8f
JH
5645
5646=cut
5647*/
5648
810b8aa5 5649SV *
864dbfa3 5650Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
5651{
5652 SV *tsv;
5653 if (!SvOK(sv)) /* let undefs pass */
5654 return sv;
5655 if (!SvROK(sv))
cea2e8a9 5656 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 5657 else if (SvWEAKREF(sv)) {
810b8aa5 5658 if (ckWARN(WARN_MISC))
9014280d 5659 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
5660 return sv;
5661 }
5662 tsv = SvRV(sv);
5663 sv_add_backref(tsv, sv);
5664 SvWEAKREF_on(sv);
1c846c1f 5665 SvREFCNT_dec(tsv);
810b8aa5
GS
5666 return sv;
5667}
5668
645c22ef
DM
5669/* Give tsv backref magic if it hasn't already got it, then push a
5670 * back-reference to sv onto the array associated with the backref magic.
5671 */
5672
810b8aa5 5673STATIC void
cea2e8a9 5674S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
5675{
5676 AV *av;
5677 MAGIC *mg;
14befaf4 5678 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, PERL_MAGIC_backref)))
810b8aa5
GS
5679 av = (AV*)mg->mg_obj;
5680 else {
5681 av = newAV();
14befaf4 5682 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
d99b02a1
DM
5683 /* av now has a refcnt of 2, which avoids it getting freed
5684 * before us during global cleanup. The extra ref is removed
5685 * by magic_killbackrefs() when tsv is being freed */
810b8aa5 5686 }
d91d49e8 5687 if (AvFILLp(av) >= AvMAX(av)) {
fdc9a813 5688 I32 i;
d91d49e8 5689 SV **svp = AvARRAY(av);
fdc9a813
AE
5690 for (i = AvFILLp(av); i >= 0; i--)
5691 if (!svp[i]) {
d91d49e8
MM
5692 svp[i] = sv; /* reuse the slot */
5693 return;
5694 }
d91d49e8
MM
5695 av_extend(av, AvFILLp(av)+1);
5696 }
5697 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
5698}
5699
645c22ef
DM
5700/* delete a back-reference to ourselves from the backref magic associated
5701 * with the SV we point to.
5702 */
5703
1c846c1f 5704STATIC void
cea2e8a9 5705S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
5706{
5707 AV *av;
5708 SV **svp;
5709 I32 i;
5710 SV *tsv = SvRV(sv);
c04a4dfe 5711 MAGIC *mg = NULL;
14befaf4 5712 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, PERL_MAGIC_backref)))
cea2e8a9 5713 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
5714 av = (AV *)mg->mg_obj;
5715 svp = AvARRAY(av);
fdc9a813
AE
5716 for (i = AvFILLp(av); i >= 0; i--)
5717 if (svp[i] == sv) svp[i] = Nullsv;
810b8aa5
GS
5718}
5719
954c1994
GS
5720/*
5721=for apidoc sv_insert
5722
5723Inserts a string at the specified offset/length within the SV. Similar to
5724the Perl substr() function.
5725
5726=cut
5727*/
5728
79072805 5729void
e1ec3a88 5730Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, const char *little, STRLEN littlelen)
79072805
LW
5731{
5732 register char *big;
5733 register char *mid;
5734 register char *midend;
5735 register char *bigend;
5736 register I32 i;
6ff81951 5737 STRLEN curlen;
1c846c1f 5738
79072805 5739
8990e307 5740 if (!bigstr)
cea2e8a9 5741 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 5742 SvPV_force(bigstr, curlen);
60fa28ff 5743 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
5744 if (offset + len > curlen) {
5745 SvGROW(bigstr, offset+len+1);
5746 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
5747 SvCUR_set(bigstr, offset+len);
5748 }
79072805 5749
69b47968 5750 SvTAINT(bigstr);
79072805
LW
5751 i = littlelen - len;
5752 if (i > 0) { /* string might grow */
a0d0e21e 5753 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
5754 mid = big + offset + len;
5755 midend = bigend = big + SvCUR(bigstr);
5756 bigend += i;
5757 *bigend = '\0';
5758 while (midend > mid) /* shove everything down */
5759 *--bigend = *--midend;
5760 Move(little,big+offset,littlelen,char);
5761 SvCUR(bigstr) += i;
5762 SvSETMAGIC(bigstr);
5763 return;
5764 }
5765 else if (i == 0) {
463ee0b2 5766 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
5767 SvSETMAGIC(bigstr);
5768 return;
5769 }
5770
463ee0b2 5771 big = SvPVX(bigstr);
79072805
LW
5772 mid = big + offset;
5773 midend = mid + len;
5774 bigend = big + SvCUR(bigstr);
5775
5776 if (midend > bigend)
cea2e8a9 5777 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5778
5779 if (mid - big > bigend - midend) { /* faster to shorten from end */
5780 if (littlelen) {
5781 Move(little, mid, littlelen,char);
5782 mid += littlelen;
5783 }
5784 i = bigend - midend;
5785 if (i > 0) {
5786 Move(midend, mid, i,char);
5787 mid += i;
5788 }
5789 *mid = '\0';
5790 SvCUR_set(bigstr, mid - big);
5791 }
5792 /*SUPPRESS 560*/
155aba94 5793 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5794 midend -= littlelen;
5795 mid = midend;
5796 sv_chop(bigstr,midend-i);
5797 big += i;
5798 while (i--)
5799 *--midend = *--big;
5800 if (littlelen)
5801 Move(little, mid, littlelen,char);
5802 }
5803 else if (littlelen) {
5804 midend -= littlelen;
5805 sv_chop(bigstr,midend);
5806 Move(little,midend,littlelen,char);
5807 }
5808 else {
5809 sv_chop(bigstr,midend);
5810 }
5811 SvSETMAGIC(bigstr);
5812}
5813
c461cf8f
JH
5814/*
5815=for apidoc sv_replace
5816
5817Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5818The target SV physically takes over ownership of the body of the source SV
5819and inherits its flags; however, the target keeps any magic it owns,
5820and any magic in the source is discarded.
ff276b08 5821Note that this is a rather specialist SV copying operation; most of the
645c22ef 5822time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5823
5824=cut
5825*/
79072805
LW
5826
5827void
864dbfa3 5828Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805
LW
5829{
5830 U32 refcnt = SvREFCNT(sv);
765f542d 5831 SV_CHECK_THINKFIRST_COW_DROP(sv);
0453d815 5832 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
9014280d 5833 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
93a17b20 5834 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5835 if (SvMAGICAL(nsv))
5836 mg_free(nsv);
5837 else
5838 sv_upgrade(nsv, SVt_PVMG);
93a17b20 5839 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 5840 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
5841 SvMAGICAL_off(sv);
5842 SvMAGIC(sv) = 0;
5843 }
79072805
LW
5844 SvREFCNT(sv) = 0;
5845 sv_clear(sv);
477f5d66 5846 assert(!SvREFCNT(sv));
fd0854ff
DM
5847#ifdef DEBUG_LEAKING_SCALARS
5848 sv->sv_flags = nsv->sv_flags;
5849 sv->sv_any = nsv->sv_any;
5850 sv->sv_refcnt = nsv->sv_refcnt;
5851#else
79072805 5852 StructCopy(nsv,sv,SV);
fd0854ff
DM
5853#endif
5854
d3d0e6f1
NC
5855#ifdef PERL_COPY_ON_WRITE
5856 if (SvIsCOW_normal(nsv)) {
5857 /* We need to follow the pointers around the loop to make the
5858 previous SV point to sv, rather than nsv. */
5859 SV *next;
5860 SV *current = nsv;
5861 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5862 assert(next);
5863 current = next;
5864 assert(SvPVX(current) == SvPVX(nsv));
5865 }
5866 /* Make the SV before us point to the SV after us. */
5867 if (DEBUG_C_TEST) {
5868 PerlIO_printf(Perl_debug_log, "previous is\n");
5869 sv_dump(current);
a29f6d03
NC
5870 PerlIO_printf(Perl_debug_log,
5871 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5872 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5873 }
a29f6d03 5874 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5875 }
5876#endif
79072805 5877 SvREFCNT(sv) = refcnt;
1edc1566 5878 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 5879 SvREFCNT(nsv) = 0;
463ee0b2 5880 del_SV(nsv);
79072805
LW
5881}
5882
c461cf8f
JH
5883/*
5884=for apidoc sv_clear
5885
645c22ef
DM
5886Clear an SV: call any destructors, free up any memory used by the body,
5887and free the body itself. The SV's head is I<not> freed, although
5888its type is set to all 1's so that it won't inadvertently be assumed
5889to be live during global destruction etc.
5890This function should only be called when REFCNT is zero. Most of the time
5891you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5892instead.
c461cf8f
JH
5893
5894=cut
5895*/
5896
79072805 5897void
864dbfa3 5898Perl_sv_clear(pTHX_ register SV *sv)
79072805 5899{
ec12f114 5900 HV* stash;
79072805
LW
5901 assert(sv);
5902 assert(SvREFCNT(sv) == 0);
5903
ed6116ce 5904 if (SvOBJECT(sv)) {
3280af22 5905 if (PL_defstash) { /* Still have a symbol table? */
39644a26 5906 dSP;
32251b26 5907 CV* destructor;
a0d0e21e 5908
5cc433a6 5909
8ebc5c01 5910
d460ef45 5911 do {
4e8e7886 5912 stash = SvSTASH(sv);
32251b26 5913 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 5914 if (destructor) {
5cc433a6
AB
5915 SV* tmpref = newRV(sv);
5916 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 5917 ENTER;
e788e7d3 5918 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
5919 EXTEND(SP, 2);
5920 PUSHMARK(SP);
5cc433a6 5921 PUSHs(tmpref);
4e8e7886 5922 PUTBACK;
44389ee9 5923 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
7a5fa8a2
NIS
5924
5925
d3acc0f7 5926 POPSTACK;
3095d977 5927 SPAGAIN;
4e8e7886 5928 LEAVE;
5cc433a6
AB
5929 if(SvREFCNT(tmpref) < 2) {
5930 /* tmpref is not kept alive! */
5931 SvREFCNT(sv)--;
5932 SvRV(tmpref) = 0;
5933 SvROK_off(tmpref);
5934 }
5935 SvREFCNT_dec(tmpref);
4e8e7886
GS
5936 }
5937 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5938
6f44e0a4
JP
5939
5940 if (SvREFCNT(sv)) {
5941 if (PL_in_clean_objs)
cea2e8a9 5942 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
6f44e0a4
JP
5943 HvNAME(stash));
5944 /* DESTROY gave object new lease on life */
5945 return;
5946 }
a0d0e21e 5947 }
4e8e7886 5948
a0d0e21e 5949 if (SvOBJECT(sv)) {
4e8e7886 5950 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
5951 SvOBJECT_off(sv); /* Curse the object. */
5952 if (SvTYPE(sv) != SVt_PVIO)
3280af22 5953 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5954 }
463ee0b2 5955 }
524189f1
JH
5956 if (SvTYPE(sv) >= SVt_PVMG) {
5957 if (SvMAGIC(sv))
5958 mg_free(sv);
5959 if (SvFLAGS(sv) & SVpad_TYPED)
5960 SvREFCNT_dec(SvSTASH(sv));
5961 }
ec12f114 5962 stash = NULL;
79072805 5963 switch (SvTYPE(sv)) {
8990e307 5964 case SVt_PVIO:
df0bd2f4
GS
5965 if (IoIFP(sv) &&
5966 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5967 IoIFP(sv) != PerlIO_stdout() &&
5968 IoIFP(sv) != PerlIO_stderr())
93578b34 5969 {
f2b5be74 5970 io_close((IO*)sv, FALSE);
93578b34 5971 }
1d7c1841 5972 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5973 PerlDir_close(IoDIRP(sv));
1d7c1841 5974 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5975 Safefree(IoTOP_NAME(sv));
5976 Safefree(IoFMT_NAME(sv));
5977 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 5978 /* FALL THROUGH */
79072805 5979 case SVt_PVBM:
a0d0e21e 5980 goto freescalar;
79072805 5981 case SVt_PVCV:
748a9306 5982 case SVt_PVFM:
85e6fe83 5983 cv_undef((CV*)sv);
a0d0e21e 5984 goto freescalar;
79072805 5985 case SVt_PVHV:
85e6fe83 5986 hv_undef((HV*)sv);
a0d0e21e 5987 break;
79072805 5988 case SVt_PVAV:
85e6fe83 5989 av_undef((AV*)sv);
a0d0e21e 5990 break;
02270b4e 5991 case SVt_PVLV:
dd28f7bb
DM
5992 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5993 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5994 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5995 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5996 }
5997 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
5998 SvREFCNT_dec(LvTARG(sv));
02270b4e 5999 goto freescalar;
a0d0e21e 6000 case SVt_PVGV:
1edc1566 6001 gp_free((GV*)sv);
a0d0e21e 6002 Safefree(GvNAME(sv));
ec12f114
JPC
6003 /* cannot decrease stash refcount yet, as we might recursively delete
6004 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
6005 of stash until current sv is completely gone.
6006 -- JohnPC, 27 Mar 1998 */
6007 stash = GvSTASH(sv);
a0d0e21e 6008 /* FALL THROUGH */
79072805 6009 case SVt_PVMG:
79072805
LW
6010 case SVt_PVNV:
6011 case SVt_PVIV:
a0d0e21e 6012 freescalar:
0c34ef67 6013 SvOOK_off(sv);
79072805
LW
6014 /* FALL THROUGH */
6015 case SVt_PV:
a0d0e21e 6016 case SVt_RV:
810b8aa5
GS
6017 if (SvROK(sv)) {
6018 if (SvWEAKREF(sv))
6019 sv_del_backref(sv);
6020 else
6021 SvREFCNT_dec(SvRV(sv));
6022 }
765f542d
NC
6023#ifdef PERL_COPY_ON_WRITE
6024 else if (SvPVX(sv)) {
6025 if (SvIsCOW(sv)) {
6026 /* I believe I need to grab the global SV mutex here and
6027 then recheck the COW status. */
46187eeb
NC
6028 if (DEBUG_C_TEST) {
6029 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 6030 sv_dump(sv);
46187eeb 6031 }
e419cbc5 6032 sv_release_COW(sv, SvPVX(sv), SvCUR(sv), SvLEN(sv),
765f542d
NC
6033 SvUVX(sv), SV_COW_NEXT_SV(sv));
6034 /* And drop it here. */
6035 SvFAKE_off(sv);
6036 } else if (SvLEN(sv)) {
6037 Safefree(SvPVX(sv));
6038 }
6039 }
6040#else
1edc1566 6041 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 6042 Safefree(SvPVX(sv));
1c846c1f 6043 else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
25716404
GS
6044 unsharepvn(SvPVX(sv),
6045 SvUTF8(sv) ? -(I32)SvCUR(sv) : SvCUR(sv),
6046 SvUVX(sv));
1c846c1f
NIS
6047 SvFAKE_off(sv);
6048 }
765f542d 6049#endif
79072805 6050 break;
a0d0e21e 6051/*
79072805 6052 case SVt_NV:
79072805 6053 case SVt_IV:
79072805
LW
6054 case SVt_NULL:
6055 break;
a0d0e21e 6056*/
79072805
LW
6057 }
6058
6059 switch (SvTYPE(sv)) {
6060 case SVt_NULL:
6061 break;
79072805
LW
6062 case SVt_IV:
6063 del_XIV(SvANY(sv));
6064 break;
6065 case SVt_NV:
6066 del_XNV(SvANY(sv));
6067 break;
ed6116ce
LW
6068 case SVt_RV:
6069 del_XRV(SvANY(sv));
6070 break;
79072805
LW
6071 case SVt_PV:
6072 del_XPV(SvANY(sv));
6073 break;
6074 case SVt_PVIV:
6075 del_XPVIV(SvANY(sv));
6076 break;
6077 case SVt_PVNV:
6078 del_XPVNV(SvANY(sv));
6079 break;
6080 case SVt_PVMG:
6081 del_XPVMG(SvANY(sv));
6082 break;
6083 case SVt_PVLV:
6084 del_XPVLV(SvANY(sv));
6085 break;
6086 case SVt_PVAV:
6087 del_XPVAV(SvANY(sv));
6088 break;
6089 case SVt_PVHV:
6090 del_XPVHV(SvANY(sv));
6091 break;
6092 case SVt_PVCV:
6093 del_XPVCV(SvANY(sv));
6094 break;
6095 case SVt_PVGV:
6096 del_XPVGV(SvANY(sv));
ec12f114
JPC
6097 /* code duplication for increased performance. */
6098 SvFLAGS(sv) &= SVf_BREAK;
6099 SvFLAGS(sv) |= SVTYPEMASK;
6100 /* decrease refcount of the stash that owns this GV, if any */
6101 if (stash)
6102 SvREFCNT_dec(stash);
6103 return; /* not break, SvFLAGS reset already happened */
79072805
LW
6104 case SVt_PVBM:
6105 del_XPVBM(SvANY(sv));
6106 break;
6107 case SVt_PVFM:
6108 del_XPVFM(SvANY(sv));
6109 break;
8990e307
LW
6110 case SVt_PVIO:
6111 del_XPVIO(SvANY(sv));
6112 break;
79072805 6113 }
a0d0e21e 6114 SvFLAGS(sv) &= SVf_BREAK;
8990e307 6115 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
6116}
6117
645c22ef
DM
6118/*
6119=for apidoc sv_newref
6120
6121Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
6122instead.
6123
6124=cut
6125*/
6126
79072805 6127SV *
864dbfa3 6128Perl_sv_newref(pTHX_ SV *sv)
79072805 6129{
463ee0b2 6130 if (sv)
4db098f4 6131 (SvREFCNT(sv))++;
79072805
LW
6132 return sv;
6133}
6134
c461cf8f
JH
6135/*
6136=for apidoc sv_free
6137
645c22ef
DM
6138Decrement an SV's reference count, and if it drops to zero, call
6139C<sv_clear> to invoke destructors and free up any memory used by
6140the body; finally, deallocate the SV's head itself.
6141Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
6142
6143=cut
6144*/
6145
79072805 6146void
864dbfa3 6147Perl_sv_free(pTHX_ SV *sv)
79072805
LW
6148{
6149 if (!sv)
6150 return;
a0d0e21e
LW
6151 if (SvREFCNT(sv) == 0) {
6152 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
6153 /* this SV's refcnt has been artificially decremented to
6154 * trigger cleanup */
a0d0e21e 6155 return;
3280af22 6156 if (PL_in_clean_all) /* All is fair */
1edc1566 6157 return;
d689ffdd
JP
6158 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6159 /* make sure SvREFCNT(sv)==0 happens very seldom */
6160 SvREFCNT(sv) = (~(U32)0)/2;
6161 return;
6162 }
0453d815 6163 if (ckWARN_d(WARN_INTERNAL))
d5dede04 6164 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
6165 "Attempt to free unreferenced scalar: SV 0x%"UVxf
6166 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805
LW
6167 return;
6168 }
4db098f4 6169 if (--(SvREFCNT(sv)) > 0)
8990e307 6170 return;
8c4d3c90
NC
6171 Perl_sv_free2(aTHX_ sv);
6172}
6173
6174void
6175Perl_sv_free2(pTHX_ SV *sv)
6176{
463ee0b2
LW
6177#ifdef DEBUGGING
6178 if (SvTEMP(sv)) {
0453d815 6179 if (ckWARN_d(WARN_DEBUGGING))
9014280d 6180 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
472d47bc
SB
6181 "Attempt to free temp prematurely: SV 0x%"UVxf
6182 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 6183 return;
79072805 6184 }
463ee0b2 6185#endif
d689ffdd
JP
6186 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6187 /* make sure SvREFCNT(sv)==0 happens very seldom */
6188 SvREFCNT(sv) = (~(U32)0)/2;
6189 return;
6190 }
79072805 6191 sv_clear(sv);
477f5d66
CS
6192 if (! SvREFCNT(sv))
6193 del_SV(sv);
79072805
LW
6194}
6195
954c1994
GS
6196/*
6197=for apidoc sv_len
6198
645c22ef
DM
6199Returns the length of the string in the SV. Handles magic and type
6200coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
6201
6202=cut
6203*/
6204
79072805 6205STRLEN
864dbfa3 6206Perl_sv_len(pTHX_ register SV *sv)
79072805 6207{
463ee0b2 6208 STRLEN len;
79072805
LW
6209
6210 if (!sv)
6211 return 0;
6212
8990e307 6213 if (SvGMAGICAL(sv))
565764a8 6214 len = mg_length(sv);
8990e307 6215 else
497b47a8 6216 (void)SvPV(sv, len);
463ee0b2 6217 return len;
79072805
LW
6218}
6219
c461cf8f
JH
6220/*
6221=for apidoc sv_len_utf8
6222
6223Returns the number of characters in the string in an SV, counting wide
1e54db1a 6224UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
6225
6226=cut
6227*/
6228
7e8c5dac
HS
6229/*
6230 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
6231 * mg_ptr is used, by sv_pos_u2b(), see the comments of S_utf8_mg_pos_init().
6232 * (Note that the mg_len is not the length of the mg_ptr field.)
7a5fa8a2 6233 *
7e8c5dac
HS
6234 */
6235
a0ed51b3 6236STRLEN
864dbfa3 6237Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 6238{
a0ed51b3
LW
6239 if (!sv)
6240 return 0;
6241
a0ed51b3 6242 if (SvGMAGICAL(sv))
b76347f2 6243 return mg_length(sv);
a0ed51b3 6244 else
b76347f2 6245 {
7e8c5dac 6246 STRLEN len, ulen;
b76347f2 6247 U8 *s = (U8*)SvPV(sv, len);
7e8c5dac
HS
6248 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
6249
e23c8137 6250 if (mg && mg->mg_len != -1 && (mg->mg_len > 0 || len == 0)) {
7e8c5dac 6251 ulen = mg->mg_len;
e23c8137
JH
6252#ifdef PERL_UTF8_CACHE_ASSERT
6253 assert(ulen == Perl_utf8_length(aTHX_ s, s + len));
6254#endif
6255 }
7e8c5dac
HS
6256 else {
6257 ulen = Perl_utf8_length(aTHX_ s, s + len);
6258 if (!mg && !SvREADONLY(sv)) {
6259 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
6260 mg = mg_find(sv, PERL_MAGIC_utf8);
6261 assert(mg);
6262 }
6263 if (mg)
6264 mg->mg_len = ulen;
6265 }
6266 return ulen;
6267 }
6268}
6269
6270/* S_utf8_mg_pos_init() is used to initialize the mg_ptr field of
6271 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
6272 * between UTF-8 and byte offsets. There are two (substr offset and substr
6273 * length, the i offset, PERL_MAGIC_UTF8_CACHESIZE) times two (UTF-8 offset
6274 * and byte offset) cache positions.
6275 *
6276 * The mg_len field is used by sv_len_utf8(), see its comments.
6277 * Note that the mg_len is not the length of the mg_ptr field.
6278 *
6279 */
6280STATIC bool
6e551876 6281S_utf8_mg_pos_init(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, U8 *s, U8 *start)
7e8c5dac 6282{
7a5fa8a2 6283 bool found = FALSE;
7e8c5dac
HS
6284
6285 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
8f78557a
AE
6286 if (!*mgp)
6287 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, &PL_vtbl_utf8, 0, 0);
7e8c5dac 6288 assert(*mgp);
b76347f2 6289
7e8c5dac
HS
6290 if ((*mgp)->mg_ptr)
6291 *cachep = (STRLEN *) (*mgp)->mg_ptr;
6292 else {
6293 Newz(0, *cachep, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
6294 (*mgp)->mg_ptr = (char *) *cachep;
6295 }
6296 assert(*cachep);
6297
6298 (*cachep)[i] = *offsetp;
6299 (*cachep)[i+1] = s - start;
6300 found = TRUE;
a0ed51b3 6301 }
7e8c5dac
HS
6302
6303 return found;
a0ed51b3
LW
6304}
6305
645c22ef 6306/*
7e8c5dac
HS
6307 * S_utf8_mg_pos() is used to query and update mg_ptr field of
6308 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
6309 * between UTF-8 and byte offsets. See also the comments of
6310 * S_utf8_mg_pos_init().
6311 *
6312 */
6313STATIC bool
6e551876 6314S_utf8_mg_pos(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, I32 uoff, U8 **sp, U8 *start, U8 *send)
7e8c5dac
HS
6315{
6316 bool found = FALSE;
6317
6318 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
6319 if (!*mgp)
6320 *mgp = mg_find(sv, PERL_MAGIC_utf8);
6321 if (*mgp && (*mgp)->mg_ptr) {
6322 *cachep = (STRLEN *) (*mgp)->mg_ptr;
e23c8137 6323 ASSERT_UTF8_CACHE(*cachep);
667208dd 6324 if ((*cachep)[i] == (STRLEN)uoff) /* An exact match. */
7a5fa8a2 6325 found = TRUE;
7e8c5dac
HS
6326 else { /* We will skip to the right spot. */
6327 STRLEN forw = 0;
6328 STRLEN backw = 0;
6329 U8* p = NULL;
6330
6331 /* The assumption is that going backward is half
6332 * the speed of going forward (that's where the
6333 * 2 * backw in the below comes from). (The real
6334 * figure of course depends on the UTF-8 data.) */
6335
667208dd 6336 if ((*cachep)[i] > (STRLEN)uoff) {
7e8c5dac 6337 forw = uoff;
667208dd 6338 backw = (*cachep)[i] - (STRLEN)uoff;
7e8c5dac
HS
6339
6340 if (forw < 2 * backw)
6341 p = start;
6342 else
6343 p = start + (*cachep)[i+1];
6344 }
6345 /* Try this only for the substr offset (i == 0),
6346 * not for the substr length (i == 2). */
6347 else if (i == 0) { /* (*cachep)[i] < uoff */
6348 STRLEN ulen = sv_len_utf8(sv);
6349
667208dd
JH
6350 if ((STRLEN)uoff < ulen) {
6351 forw = (STRLEN)uoff - (*cachep)[i];
6352 backw = ulen - (STRLEN)uoff;
7e8c5dac
HS
6353
6354 if (forw < 2 * backw)
6355 p = start + (*cachep)[i+1];
6356 else
6357 p = send;
6358 }
6359
6360 /* If the string is not long enough for uoff,
6361 * we could extend it, but not at this low a level. */
6362 }
6363
6364 if (p) {
6365 if (forw < 2 * backw) {
6366 while (forw--)
6367 p += UTF8SKIP(p);
6368 }
6369 else {
6370 while (backw--) {
6371 p--;
6372 while (UTF8_IS_CONTINUATION(*p))
6373 p--;
6374 }
6375 }
6376
6377 /* Update the cache. */
667208dd 6378 (*cachep)[i] = (STRLEN)uoff;
7e8c5dac 6379 (*cachep)[i+1] = p - start;
8f78557a
AE
6380
6381 /* Drop the stale "length" cache */
6382 if (i == 0) {
6383 (*cachep)[2] = 0;
6384 (*cachep)[3] = 0;
6385 }
7a5fa8a2 6386
7e8c5dac
HS
6387 found = TRUE;
6388 }
6389 }
6390 if (found) { /* Setup the return values. */
6391 *offsetp = (*cachep)[i+1];
6392 *sp = start + *offsetp;
6393 if (*sp >= send) {
6394 *sp = send;
6395 *offsetp = send - start;
6396 }
6397 else if (*sp < start) {
6398 *sp = start;
6399 *offsetp = 0;
6400 }
6401 }
6402 }
e23c8137
JH
6403#ifdef PERL_UTF8_CACHE_ASSERT
6404 if (found) {
6405 U8 *s = start;
6406 I32 n = uoff;
6407
6408 while (n-- && s < send)
6409 s += UTF8SKIP(s);
6410
6411 if (i == 0) {
6412 assert(*offsetp == s - start);
6413 assert((*cachep)[0] == (STRLEN)uoff);
6414 assert((*cachep)[1] == *offsetp);
6415 }
6416 ASSERT_UTF8_CACHE(*cachep);
6417 }
6418#endif
7e8c5dac 6419 }
e23c8137 6420
7e8c5dac
HS
6421 return found;
6422}
7a5fa8a2 6423
7e8c5dac 6424/*
645c22ef
DM
6425=for apidoc sv_pos_u2b
6426
1e54db1a 6427Converts the value pointed to by offsetp from a count of UTF-8 chars from
645c22ef
DM
6428the start of the string, to a count of the equivalent number of bytes; if
6429lenp is non-zero, it does the same to lenp, but this time starting from
6430the offset, rather than from the start of the string. Handles magic and
6431type coercion.
6432
6433=cut
6434*/
6435
7e8c5dac
HS
6436/*
6437 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
6438 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
6439 * byte offsets. See also the comments of S_utf8_mg_pos().
6440 *
6441 */
6442
a0ed51b3 6443void
864dbfa3 6444Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 6445{
dfe13c55
GS
6446 U8 *start;
6447 U8 *s;
a0ed51b3 6448 STRLEN len;
7e8c5dac
HS
6449 STRLEN *cache = 0;
6450 STRLEN boffset = 0;
a0ed51b3
LW
6451
6452 if (!sv)
6453 return;
6454
dfe13c55 6455 start = s = (U8*)SvPV(sv, len);
7e8c5dac
HS
6456 if (len) {
6457 I32 uoffset = *offsetp;
6458 U8 *send = s + len;
6459 MAGIC *mg = 0;
6460 bool found = FALSE;
6461
bdf77a2a 6462 if (utf8_mg_pos(sv, &mg, &cache, 0, offsetp, *offsetp, &s, start, send))
7e8c5dac
HS
6463 found = TRUE;
6464 if (!found && uoffset > 0) {
6465 while (s < send && uoffset--)
6466 s += UTF8SKIP(s);
6467 if (s >= send)
6468 s = send;
bdf77a2a 6469 if (utf8_mg_pos_init(sv, &mg, &cache, 0, offsetp, s, start))
7e8c5dac
HS
6470 boffset = cache[1];
6471 *offsetp = s - start;
6472 }
6473 if (lenp) {
6474 found = FALSE;
6475 start = s;
bdf77a2a 6476 if (utf8_mg_pos(sv, &mg, &cache, 2, lenp, *lenp + *offsetp, &s, start, send)) {
7e8c5dac
HS
6477 *lenp -= boffset;
6478 found = TRUE;
6479 }
6480 if (!found && *lenp > 0) {
6481 I32 ulen = *lenp;
6482 if (ulen > 0)
6483 while (s < send && ulen--)
6484 s += UTF8SKIP(s);
6485 if (s >= send)
6486 s = send;
a67d7df9 6487 utf8_mg_pos_init(sv, &mg, &cache, 2, lenp, s, start);
7e8c5dac
HS
6488 }
6489 *lenp = s - start;
6490 }
e23c8137 6491 ASSERT_UTF8_CACHE(cache);
7e8c5dac
HS
6492 }
6493 else {
6494 *offsetp = 0;
6495 if (lenp)
6496 *lenp = 0;
a0ed51b3 6497 }
e23c8137 6498
a0ed51b3
LW
6499 return;
6500}
6501
645c22ef
DM
6502/*
6503=for apidoc sv_pos_b2u
6504
6505Converts the value pointed to by offsetp from a count of bytes from the
1e54db1a 6506start of the string, to a count of the equivalent number of UTF-8 chars.
645c22ef
DM
6507Handles magic and type coercion.
6508
6509=cut
6510*/
6511
7e8c5dac
HS
6512/*
6513 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
6514 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
6515 * byte offsets. See also the comments of S_utf8_mg_pos().
6516 *
6517 */
6518
a0ed51b3 6519void
7e8c5dac 6520Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 6521{
7e8c5dac 6522 U8* s;
a0ed51b3
LW
6523 STRLEN len;
6524
6525 if (!sv)
6526 return;
6527
dfe13c55 6528 s = (U8*)SvPV(sv, len);
eb160463 6529 if ((I32)len < *offsetp)
a0dbb045 6530 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac
HS
6531 else {
6532 U8* send = s + *offsetp;
6533 MAGIC* mg = NULL;
6534 STRLEN *cache = NULL;
6535
6536 len = 0;
6537
6538 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
6539 mg = mg_find(sv, PERL_MAGIC_utf8);
6540 if (mg && mg->mg_ptr) {
6541 cache = (STRLEN *) mg->mg_ptr;
c5661c80 6542 if (cache[1] == (STRLEN)*offsetp) {
7e8c5dac
HS
6543 /* An exact match. */
6544 *offsetp = cache[0];
6545
6546 return;
6547 }
c5661c80 6548 else if (cache[1] < (STRLEN)*offsetp) {
7e8c5dac
HS
6549 /* We already know part of the way. */
6550 len = cache[0];
6551 s += cache[1];
7a5fa8a2 6552 /* Let the below loop do the rest. */
7e8c5dac
HS
6553 }
6554 else { /* cache[1] > *offsetp */
6555 /* We already know all of the way, now we may
6556 * be able to walk back. The same assumption
6557 * is made as in S_utf8_mg_pos(), namely that
6558 * walking backward is twice slower than
6559 * walking forward. */
6560 STRLEN forw = *offsetp;
6561 STRLEN backw = cache[1] - *offsetp;
6562
6563 if (!(forw < 2 * backw)) {
6564 U8 *p = s + cache[1];
6565 STRLEN ubackw = 0;
7a5fa8a2 6566
a5b510f2
AE
6567 cache[1] -= backw;
6568
7e8c5dac
HS
6569 while (backw--) {
6570 p--;
0aeb64d0 6571 while (UTF8_IS_CONTINUATION(*p)) {
7e8c5dac 6572 p--;
0aeb64d0
JH
6573 backw--;
6574 }
7e8c5dac
HS
6575 ubackw++;
6576 }
6577
6578 cache[0] -= ubackw;
0aeb64d0 6579 *offsetp = cache[0];
a67d7df9
TS
6580
6581 /* Drop the stale "length" cache */
6582 cache[2] = 0;
6583 cache[3] = 0;
6584
0aeb64d0 6585 return;
7e8c5dac
HS
6586 }
6587 }
6588 }
e23c8137 6589 ASSERT_UTF8_CACHE(cache);
a0dbb045 6590 }
7e8c5dac
HS
6591
6592 while (s < send) {
6593 STRLEN n = 1;
6594
6595 /* Call utf8n_to_uvchr() to validate the sequence
6596 * (unless a simple non-UTF character) */
6597 if (!UTF8_IS_INVARIANT(*s))
6598 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
6599 if (n > 0) {
6600 s += n;
6601 len++;
6602 }
6603 else
6604 break;
6605 }
6606
6607 if (!SvREADONLY(sv)) {
6608 if (!mg) {
6609 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
6610 mg = mg_find(sv, PERL_MAGIC_utf8);
6611 }
6612 assert(mg);
6613
6614 if (!mg->mg_ptr) {
979acdb5 6615 Newz(0, cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7e8c5dac
HS
6616 mg->mg_ptr = (char *) cache;
6617 }
6618 assert(cache);
6619
6620 cache[0] = len;
6621 cache[1] = *offsetp;
a67d7df9
TS
6622 /* Drop the stale "length" cache */
6623 cache[2] = 0;
6624 cache[3] = 0;
7e8c5dac
HS
6625 }
6626
6627 *offsetp = len;
a0ed51b3 6628 }
a0ed51b3
LW
6629 return;
6630}
6631
954c1994
GS
6632/*
6633=for apidoc sv_eq
6634
6635Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
6636identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6637coerce its args to strings if necessary.
954c1994
GS
6638
6639=cut
6640*/
6641
79072805 6642I32
e01b9e88 6643Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805 6644{
e1ec3a88 6645 const char *pv1;
463ee0b2 6646 STRLEN cur1;
e1ec3a88 6647 const char *pv2;
463ee0b2 6648 STRLEN cur2;
e01b9e88 6649 I32 eq = 0;
553e1bcc
AT
6650 char *tpv = Nullch;
6651 SV* svrecode = Nullsv;
79072805 6652
e01b9e88 6653 if (!sv1) {
79072805
LW
6654 pv1 = "";
6655 cur1 = 0;
6656 }
463ee0b2 6657 else
e01b9e88 6658 pv1 = SvPV(sv1, cur1);
79072805 6659
e01b9e88
SC
6660 if (!sv2){
6661 pv2 = "";
6662 cur2 = 0;
92d29cee 6663 }
e01b9e88
SC
6664 else
6665 pv2 = SvPV(sv2, cur2);
79072805 6666
cf48d248 6667 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6668 /* Differing utf8ness.
6669 * Do not UTF8size the comparands as a side-effect. */
6670 if (PL_encoding) {
6671 if (SvUTF8(sv1)) {
553e1bcc
AT
6672 svrecode = newSVpvn(pv2, cur2);
6673 sv_recode_to_utf8(svrecode, PL_encoding);
6674 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6675 }
6676 else {
553e1bcc
AT
6677 svrecode = newSVpvn(pv1, cur1);
6678 sv_recode_to_utf8(svrecode, PL_encoding);
6679 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6680 }
6681 /* Now both are in UTF-8. */
0a1bd7ac
DM
6682 if (cur1 != cur2) {
6683 SvREFCNT_dec(svrecode);
799ef3cb 6684 return FALSE;
0a1bd7ac 6685 }
799ef3cb
JH
6686 }
6687 else {
6688 bool is_utf8 = TRUE;
6689
6690 if (SvUTF8(sv1)) {
6691 /* sv1 is the UTF-8 one,
6692 * if is equal it must be downgrade-able */
e1ec3a88 6693 char *pv = (char*)bytes_from_utf8((const U8*)pv1,
799ef3cb
JH
6694 &cur1, &is_utf8);
6695 if (pv != pv1)
553e1bcc 6696 pv1 = tpv = pv;
799ef3cb
JH
6697 }
6698 else {
6699 /* sv2 is the UTF-8 one,
6700 * if is equal it must be downgrade-able */
e1ec3a88 6701 char *pv = (char *)bytes_from_utf8((const U8*)pv2,
799ef3cb
JH
6702 &cur2, &is_utf8);
6703 if (pv != pv2)
553e1bcc 6704 pv2 = tpv = pv;
799ef3cb
JH
6705 }
6706 if (is_utf8) {
6707 /* Downgrade not possible - cannot be eq */
bf694877 6708 assert (tpv == 0);
799ef3cb
JH
6709 return FALSE;
6710 }
6711 }
cf48d248
JH
6712 }
6713
6714 if (cur1 == cur2)
765f542d 6715 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 6716
553e1bcc
AT
6717 if (svrecode)
6718 SvREFCNT_dec(svrecode);
799ef3cb 6719
553e1bcc
AT
6720 if (tpv)
6721 Safefree(tpv);
cf48d248 6722
e01b9e88 6723 return eq;
79072805
LW
6724}
6725
954c1994
GS
6726/*
6727=for apidoc sv_cmp
6728
6729Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
6730string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
6731C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6732coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
6733
6734=cut
6735*/
6736
79072805 6737I32
e01b9e88 6738Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 6739{
560a288e 6740 STRLEN cur1, cur2;
e1ec3a88
AL
6741 const char *pv1, *pv2;
6742 char *tpv = Nullch;
cf48d248 6743 I32 cmp;
553e1bcc 6744 SV *svrecode = Nullsv;
560a288e 6745
e01b9e88
SC
6746 if (!sv1) {
6747 pv1 = "";
560a288e
GS
6748 cur1 = 0;
6749 }
e01b9e88
SC
6750 else
6751 pv1 = SvPV(sv1, cur1);
560a288e 6752
553e1bcc 6753 if (!sv2) {
e01b9e88 6754 pv2 = "";
560a288e
GS
6755 cur2 = 0;
6756 }
e01b9e88
SC
6757 else
6758 pv2 = SvPV(sv2, cur2);
79072805 6759
cf48d248 6760 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6761 /* Differing utf8ness.
6762 * Do not UTF8size the comparands as a side-effect. */
cf48d248 6763 if (SvUTF8(sv1)) {
799ef3cb 6764 if (PL_encoding) {
553e1bcc
AT
6765 svrecode = newSVpvn(pv2, cur2);
6766 sv_recode_to_utf8(svrecode, PL_encoding);
6767 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6768 }
6769 else {
e1ec3a88 6770 pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
799ef3cb 6771 }
cf48d248
JH
6772 }
6773 else {
799ef3cb 6774 if (PL_encoding) {
553e1bcc
AT
6775 svrecode = newSVpvn(pv1, cur1);
6776 sv_recode_to_utf8(svrecode, PL_encoding);
6777 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6778 }
6779 else {
e1ec3a88 6780 pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
799ef3cb 6781 }
cf48d248
JH
6782 }
6783 }
6784
e01b9e88 6785 if (!cur1) {
cf48d248 6786 cmp = cur2 ? -1 : 0;
e01b9e88 6787 } else if (!cur2) {
cf48d248
JH
6788 cmp = 1;
6789 } else {
e1ec3a88 6790 const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
6791
6792 if (retval) {
cf48d248 6793 cmp = retval < 0 ? -1 : 1;
e01b9e88 6794 } else if (cur1 == cur2) {
cf48d248
JH
6795 cmp = 0;
6796 } else {
6797 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 6798 }
cf48d248 6799 }
16660edb 6800
553e1bcc
AT
6801 if (svrecode)
6802 SvREFCNT_dec(svrecode);
799ef3cb 6803
553e1bcc
AT
6804 if (tpv)
6805 Safefree(tpv);
cf48d248
JH
6806
6807 return cmp;
bbce6d69 6808}
16660edb 6809
c461cf8f
JH
6810/*
6811=for apidoc sv_cmp_locale
6812
645c22ef
DM
6813Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6814'use bytes' aware, handles get magic, and will coerce its args to strings
6815if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
6816
6817=cut
6818*/
6819
bbce6d69 6820I32
864dbfa3 6821Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 6822{
36477c24 6823#ifdef USE_LOCALE_COLLATE
16660edb 6824
bbce6d69 6825 char *pv1, *pv2;
6826 STRLEN len1, len2;
6827 I32 retval;
16660edb 6828
3280af22 6829 if (PL_collation_standard)
bbce6d69 6830 goto raw_compare;
16660edb 6831
bbce6d69 6832 len1 = 0;
8ac85365 6833 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 6834 len2 = 0;
8ac85365 6835 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 6836
bbce6d69 6837 if (!pv1 || !len1) {
6838 if (pv2 && len2)
6839 return -1;
6840 else
6841 goto raw_compare;
6842 }
6843 else {
6844 if (!pv2 || !len2)
6845 return 1;
6846 }
16660edb 6847
bbce6d69 6848 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 6849
bbce6d69 6850 if (retval)
16660edb 6851 return retval < 0 ? -1 : 1;
6852
bbce6d69 6853 /*
6854 * When the result of collation is equality, that doesn't mean
6855 * that there are no differences -- some locales exclude some
6856 * characters from consideration. So to avoid false equalities,
6857 * we use the raw string as a tiebreaker.
6858 */
16660edb 6859
bbce6d69 6860 raw_compare:
6861 /* FALL THROUGH */
16660edb 6862
36477c24 6863#endif /* USE_LOCALE_COLLATE */
16660edb 6864
bbce6d69 6865 return sv_cmp(sv1, sv2);
6866}
79072805 6867
645c22ef 6868
36477c24 6869#ifdef USE_LOCALE_COLLATE
645c22ef 6870
7a4c00b4 6871/*
645c22ef
DM
6872=for apidoc sv_collxfrm
6873
6874Add Collate Transform magic to an SV if it doesn't already have it.
6875
6876Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6877scalar data of the variable, but transformed to such a format that a normal
6878memory comparison can be used to compare the data according to the locale
6879settings.
6880
6881=cut
6882*/
6883
bbce6d69 6884char *
864dbfa3 6885Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 6886{
7a4c00b4 6887 MAGIC *mg;
16660edb 6888
14befaf4 6889 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 6890 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 6891 char *s, *xf;
6892 STRLEN len, xlen;
6893
7a4c00b4 6894 if (mg)
6895 Safefree(mg->mg_ptr);
bbce6d69 6896 s = SvPV(sv, len);
6897 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 6898 if (SvREADONLY(sv)) {
6899 SAVEFREEPV(xf);
6900 *nxp = xlen;
3280af22 6901 return xf + sizeof(PL_collation_ix);
ff0cee69 6902 }
7a4c00b4 6903 if (! mg) {
14befaf4
DM
6904 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
6905 mg = mg_find(sv, PERL_MAGIC_collxfrm);
7a4c00b4 6906 assert(mg);
bbce6d69 6907 }
7a4c00b4 6908 mg->mg_ptr = xf;
565764a8 6909 mg->mg_len = xlen;
7a4c00b4 6910 }
6911 else {
ff0cee69 6912 if (mg) {
6913 mg->mg_ptr = NULL;
565764a8 6914 mg->mg_len = -1;
ff0cee69 6915 }
bbce6d69 6916 }
6917 }
7a4c00b4 6918 if (mg && mg->mg_ptr) {
565764a8 6919 *nxp = mg->mg_len;
3280af22 6920 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 6921 }
6922 else {
6923 *nxp = 0;
6924 return NULL;
16660edb 6925 }
79072805
LW
6926}
6927
36477c24 6928#endif /* USE_LOCALE_COLLATE */
bbce6d69 6929
c461cf8f
JH
6930/*
6931=for apidoc sv_gets
6932
6933Get a line from the filehandle and store it into the SV, optionally
6934appending to the currently-stored string.
6935
6936=cut
6937*/
6938
79072805 6939char *
864dbfa3 6940Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 6941{
e1ec3a88 6942 const char *rsptr;
c07a80fd 6943 STRLEN rslen;
6944 register STDCHAR rslast;
6945 register STDCHAR *bp;
6946 register I32 cnt;
9c5ffd7c 6947 I32 i = 0;
8bfdd7d9 6948 I32 rspara = 0;
e311fd51 6949 I32 recsize;
c07a80fd 6950
bc44a8a2
NC
6951 if (SvTHINKFIRST(sv))
6952 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
6953 /* XXX. If you make this PVIV, then copy on write can copy scalars read
6954 from <>.
6955 However, perlbench says it's slower, because the existing swipe code
6956 is faster than copy on write.
6957 Swings and roundabouts. */
6fc92669 6958 (void)SvUPGRADE(sv, SVt_PV);
99491443 6959
ff68c719 6960 SvSCREAM_off(sv);
efd8b2ba
AE
6961
6962 if (append) {
6963 if (PerlIO_isutf8(fp)) {
6964 if (!SvUTF8(sv)) {
6965 sv_utf8_upgrade_nomg(sv);
6966 sv_pos_u2b(sv,&append,0);
6967 }
6968 } else if (SvUTF8(sv)) {
6969 SV *tsv = NEWSV(0,0);
6970 sv_gets(tsv, fp, 0);
6971 sv_utf8_upgrade_nomg(tsv);
6972 SvCUR_set(sv,append);
6973 sv_catsv(sv,tsv);
6974 sv_free(tsv);
6975 goto return_string_or_null;
6976 }
6977 }
6978
6979 SvPOK_only(sv);
6980 if (PerlIO_isutf8(fp))
6981 SvUTF8_on(sv);
c07a80fd 6982
923e4eb5 6983 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
6984 /* we always read code in line mode */
6985 rsptr = "\n";
6986 rslen = 1;
6987 }
6988 else if (RsSNARF(PL_rs)) {
7a5fa8a2
NIS
6989 /* If it is a regular disk file use size from stat() as estimate
6990 of amount we are going to read - may result in malloc-ing
6991 more memory than we realy need if layers bellow reduce
e468d35b
NIS
6992 size we read (e.g. CRLF or a gzip layer)
6993 */
e311fd51 6994 Stat_t st;
e468d35b
NIS
6995 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
6996 Off_t offset = PerlIO_tell(fp);
58f1856e 6997 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
6998 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6999 }
7000 }
c07a80fd 7001 rsptr = NULL;
7002 rslen = 0;
7003 }
3280af22 7004 else if (RsRECORD(PL_rs)) {
e311fd51 7005 I32 bytesread;
5b2b9c68
HM
7006 char *buffer;
7007
7008 /* Grab the size of the record we're getting */
3280af22 7009 recsize = SvIV(SvRV(PL_rs));
e311fd51 7010 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
7011 /* Go yank in */
7012#ifdef VMS
7013 /* VMS wants read instead of fread, because fread doesn't respect */
7014 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
7015 /* doing, but we've got no other real choice - except avoid stdio
7016 as implementation - perhaps write a :vms layer ?
7017 */
5b2b9c68
HM
7018 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
7019#else
7020 bytesread = PerlIO_read(fp, buffer, recsize);
7021#endif
27e6ca2d
AE
7022 if (bytesread < 0)
7023 bytesread = 0;
e311fd51 7024 SvCUR_set(sv, bytesread += append);
e670df4e 7025 buffer[bytesread] = '\0';
efd8b2ba 7026 goto return_string_or_null;
5b2b9c68 7027 }
3280af22 7028 else if (RsPARA(PL_rs)) {
c07a80fd 7029 rsptr = "\n\n";
7030 rslen = 2;
8bfdd7d9 7031 rspara = 1;
c07a80fd 7032 }
7d59b7e4
NIS
7033 else {
7034 /* Get $/ i.e. PL_rs into same encoding as stream wants */
7035 if (PerlIO_isutf8(fp)) {
7036 rsptr = SvPVutf8(PL_rs, rslen);
7037 }
7038 else {
7039 if (SvUTF8(PL_rs)) {
7040 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
7041 Perl_croak(aTHX_ "Wide character in $/");
7042 }
7043 }
7044 rsptr = SvPV(PL_rs, rslen);
7045 }
7046 }
7047
c07a80fd 7048 rslast = rslen ? rsptr[rslen - 1] : '\0';
7049
8bfdd7d9 7050 if (rspara) { /* have to do this both before and after */
79072805 7051 do { /* to make sure file boundaries work right */
760ac839 7052 if (PerlIO_eof(fp))
a0d0e21e 7053 return 0;
760ac839 7054 i = PerlIO_getc(fp);
79072805 7055 if (i != '\n') {
a0d0e21e
LW
7056 if (i == -1)
7057 return 0;
760ac839 7058 PerlIO_ungetc(fp,i);
79072805
LW
7059 break;
7060 }
7061 } while (i != EOF);
7062 }
c07a80fd 7063
760ac839
LW
7064 /* See if we know enough about I/O mechanism to cheat it ! */
7065
7066 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 7067 of abstracting out stdio interface. One call should be cheap
760ac839
LW
7068 enough here - and may even be a macro allowing compile
7069 time optimization.
7070 */
7071
7072 if (PerlIO_fast_gets(fp)) {
7073
7074 /*
7075 * We're going to steal some values from the stdio struct
7076 * and put EVERYTHING in the innermost loop into registers.
7077 */
7078 register STDCHAR *ptr;
7079 STRLEN bpx;
7080 I32 shortbuffered;
7081
16660edb 7082#if defined(VMS) && defined(PERLIO_IS_STDIO)
7083 /* An ungetc()d char is handled separately from the regular
7084 * buffer, so we getc() it back out and stuff it in the buffer.
7085 */
7086 i = PerlIO_getc(fp);
7087 if (i == EOF) return 0;
7088 *(--((*fp)->_ptr)) = (unsigned char) i;
7089 (*fp)->_cnt++;
7090#endif
c07a80fd 7091
c2960299 7092 /* Here is some breathtakingly efficient cheating */
c07a80fd 7093
a20bf0c3 7094 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b 7095 /* make sure we have the room */
7a5fa8a2 7096 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
e468d35b 7097 /* Not room for all of it
7a5fa8a2 7098 if we are looking for a separator and room for some
e468d35b
NIS
7099 */
7100 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7a5fa8a2 7101 /* just process what we have room for */
79072805
LW
7102 shortbuffered = cnt - SvLEN(sv) + append + 1;
7103 cnt -= shortbuffered;
7104 }
7105 else {
7106 shortbuffered = 0;
bbce6d69 7107 /* remember that cnt can be negative */
eb160463 7108 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
7109 }
7110 }
7a5fa8a2 7111 else
79072805 7112 shortbuffered = 0;
c07a80fd 7113 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
a20bf0c3 7114 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 7115 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7116 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 7117 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 7118 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7119 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7120 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
7121 for (;;) {
7122 screamer:
93a17b20 7123 if (cnt > 0) {
c07a80fd 7124 if (rslen) {
760ac839
LW
7125 while (cnt > 0) { /* this | eat */
7126 cnt--;
c07a80fd 7127 if ((*bp++ = *ptr++) == rslast) /* really | dust */
7128 goto thats_all_folks; /* screams | sed :-) */
7129 }
7130 }
7131 else {
1c846c1f
NIS
7132 Copy(ptr, bp, cnt, char); /* this | eat */
7133 bp += cnt; /* screams | dust */
c07a80fd 7134 ptr += cnt; /* louder | sed :-) */
a5f75d66 7135 cnt = 0;
93a17b20 7136 }
79072805
LW
7137 }
7138
748a9306 7139 if (shortbuffered) { /* oh well, must extend */
79072805
LW
7140 cnt = shortbuffered;
7141 shortbuffered = 0;
c07a80fd 7142 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
7143 SvCUR_set(sv, bpx);
7144 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 7145 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
7146 continue;
7147 }
7148
16660edb 7149 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
7150 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
7151 PTR2UV(ptr),(long)cnt));
cc00df79 7152 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 7153#if 0
16660edb 7154 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7155 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7156 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7157 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 7158#endif
1c846c1f 7159 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 7160 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
7161 another abstraction. */
760ac839 7162 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 7163#if 0
16660edb 7164 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7165 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7166 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7167 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 7168#endif
a20bf0c3
JH
7169 cnt = PerlIO_get_cnt(fp);
7170 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 7171 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7172 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 7173
748a9306
LW
7174 if (i == EOF) /* all done for ever? */
7175 goto thats_really_all_folks;
7176
c07a80fd 7177 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
7178 SvCUR_set(sv, bpx);
7179 SvGROW(sv, bpx + cnt + 2);
c07a80fd 7180 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
7181
eb160463 7182 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 7183
c07a80fd 7184 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 7185 goto thats_all_folks;
79072805
LW
7186 }
7187
7188thats_all_folks:
eb160463 7189 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX(sv)) < rslen) ||
36477c24 7190 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 7191 goto screamer; /* go back to the fray */
79072805
LW
7192thats_really_all_folks:
7193 if (shortbuffered)
7194 cnt += shortbuffered;
16660edb 7195 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7196 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 7197 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 7198 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7199 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7200 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7201 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 7202 *bp = '\0';
760ac839 7203 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 7204 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 7205 "Screamer: done, len=%ld, string=|%.*s|\n",
7206 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
7207 }
7208 else
79072805 7209 {
6edd2cd5
JH
7210 /*The big, slow, and stupid way. */
7211
7212 /* Any stack-challenged places. */
33d5f59c 7213#if defined(EPOC)
6edd2cd5
JH
7214 /* EPOC: need to work around SDK features. *
7215 * On WINS: MS VC5 generates calls to _chkstk, *
7216 * if a "large" stack frame is allocated. *
7217 * gcc on MARM does not generate calls like these. */
7218# define USEHEAPINSTEADOFSTACK
7219#endif
7220
7221#ifdef USEHEAPINSTEADOFSTACK
7222 STDCHAR *buf = 0;
7223 New(0, buf, 8192, STDCHAR);
7224 assert(buf);
4d2c4e07 7225#else
6edd2cd5 7226 STDCHAR buf[8192];
4d2c4e07 7227#endif
79072805 7228
760ac839 7229screamer2:
c07a80fd 7230 if (rslen) {
6867be6d 7231 const register STDCHAR *bpe = buf + sizeof(buf);
760ac839 7232 bp = buf;
eb160463 7233 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
7234 ; /* keep reading */
7235 cnt = bp - buf;
c07a80fd 7236 }
7237 else {
760ac839 7238 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 7239 /* Accomodate broken VAXC compiler, which applies U8 cast to
7240 * both args of ?: operator, causing EOF to change into 255
7241 */
37be0adf 7242 if (cnt > 0)
cbe9e203
JH
7243 i = (U8)buf[cnt - 1];
7244 else
37be0adf 7245 i = EOF;
c07a80fd 7246 }
79072805 7247
cbe9e203
JH
7248 if (cnt < 0)
7249 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
7250 if (append)
7251 sv_catpvn(sv, (char *) buf, cnt);
7252 else
7253 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 7254
7255 if (i != EOF && /* joy */
7256 (!rslen ||
7257 SvCUR(sv) < rslen ||
36477c24 7258 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
7259 {
7260 append = -1;
63e4d877
CS
7261 /*
7262 * If we're reading from a TTY and we get a short read,
7263 * indicating that the user hit his EOF character, we need
7264 * to notice it now, because if we try to read from the TTY
7265 * again, the EOF condition will disappear.
7266 *
7267 * The comparison of cnt to sizeof(buf) is an optimization
7268 * that prevents unnecessary calls to feof().
7269 *
7270 * - jik 9/25/96
7271 */
7272 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
7273 goto screamer2;
79072805 7274 }
6edd2cd5
JH
7275
7276#ifdef USEHEAPINSTEADOFSTACK
7277 Safefree(buf);
7278#endif
79072805
LW
7279 }
7280
8bfdd7d9 7281 if (rspara) { /* have to do this both before and after */
c07a80fd 7282 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 7283 i = PerlIO_getc(fp);
79072805 7284 if (i != '\n') {
760ac839 7285 PerlIO_ungetc(fp,i);
79072805
LW
7286 break;
7287 }
7288 }
7289 }
c07a80fd 7290
efd8b2ba 7291return_string_or_null:
c07a80fd 7292 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
7293}
7294
954c1994
GS
7295/*
7296=for apidoc sv_inc
7297
645c22ef
DM
7298Auto-increment of the value in the SV, doing string to numeric conversion
7299if necessary. Handles 'get' magic.
954c1994
GS
7300
7301=cut
7302*/
7303
79072805 7304void
864dbfa3 7305Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
7306{
7307 register char *d;
463ee0b2 7308 int flags;
79072805
LW
7309
7310 if (!sv)
7311 return;
b23a5f78
GB
7312 if (SvGMAGICAL(sv))
7313 mg_get(sv);
ed6116ce 7314 if (SvTHINKFIRST(sv)) {
765f542d
NC
7315 if (SvIsCOW(sv))
7316 sv_force_normal_flags(sv, 0);
0f15f207 7317 if (SvREADONLY(sv)) {
923e4eb5 7318 if (IN_PERL_RUNTIME)
cea2e8a9 7319 Perl_croak(aTHX_ PL_no_modify);
0f15f207 7320 }
a0d0e21e 7321 if (SvROK(sv)) {
b5be31e9 7322 IV i;
9e7bc3e8
JD
7323 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
7324 return;
56431972 7325 i = PTR2IV(SvRV(sv));
b5be31e9
SM
7326 sv_unref(sv);
7327 sv_setiv(sv, i);
a0d0e21e 7328 }
ed6116ce 7329 }
8990e307 7330 flags = SvFLAGS(sv);
28e5dec8
JH
7331 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
7332 /* It's (privately or publicly) a float, but not tested as an
7333 integer, so test it to see. */
d460ef45 7334 (void) SvIV(sv);
28e5dec8
JH
7335 flags = SvFLAGS(sv);
7336 }
7337 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7338 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 7339#ifdef PERL_PRESERVE_IVUV
28e5dec8 7340 oops_its_int:
59d8ce62 7341#endif
25da4f38
IZ
7342 if (SvIsUV(sv)) {
7343 if (SvUVX(sv) == UV_MAX)
a1e868e7 7344 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
7345 else
7346 (void)SvIOK_only_UV(sv);
7347 ++SvUVX(sv);
7348 } else {
7349 if (SvIVX(sv) == IV_MAX)
28e5dec8 7350 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
7351 else {
7352 (void)SvIOK_only(sv);
7353 ++SvIVX(sv);
1c846c1f 7354 }
55497cff 7355 }
79072805
LW
7356 return;
7357 }
28e5dec8
JH
7358 if (flags & SVp_NOK) {
7359 (void)SvNOK_only(sv);
7360 SvNVX(sv) += 1.0;
7361 return;
7362 }
7363
8990e307 7364 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
28e5dec8
JH
7365 if ((flags & SVTYPEMASK) < SVt_PVIV)
7366 sv_upgrade(sv, SVt_IV);
7367 (void)SvIOK_only(sv);
7368 SvIVX(sv) = 1;
79072805
LW
7369 return;
7370 }
463ee0b2 7371 d = SvPVX(sv);
79072805
LW
7372 while (isALPHA(*d)) d++;
7373 while (isDIGIT(*d)) d++;
7374 if (*d) {
28e5dec8 7375#ifdef PERL_PRESERVE_IVUV
d1be9408 7376 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
7377 warnings. Probably ought to make the sv_iv_please() that does
7378 the conversion if possible, and silently. */
c2988b20 7379 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
7380 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7381 /* Need to try really hard to see if it's an integer.
7382 9.22337203685478e+18 is an integer.
7383 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7384 so $a="9.22337203685478e+18"; $a+0; $a++
7385 needs to be the same as $a="9.22337203685478e+18"; $a++
7386 or we go insane. */
d460ef45 7387
28e5dec8
JH
7388 (void) sv_2iv(sv);
7389 if (SvIOK(sv))
7390 goto oops_its_int;
7391
7392 /* sv_2iv *should* have made this an NV */
7393 if (flags & SVp_NOK) {
7394 (void)SvNOK_only(sv);
7395 SvNVX(sv) += 1.0;
7396 return;
7397 }
7398 /* I don't think we can get here. Maybe I should assert this
7399 And if we do get here I suspect that sv_setnv will croak. NWC
7400 Fall through. */
7401#if defined(USE_LONG_DOUBLE)
7402 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",
7403 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7404#else
1779d84d 7405 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
7406 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7407#endif
7408 }
7409#endif /* PERL_PRESERVE_IVUV */
7410 sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
79072805
LW
7411 return;
7412 }
7413 d--;
463ee0b2 7414 while (d >= SvPVX(sv)) {
79072805
LW
7415 if (isDIGIT(*d)) {
7416 if (++*d <= '9')
7417 return;
7418 *(d--) = '0';
7419 }
7420 else {
9d116dd7
JH
7421#ifdef EBCDIC
7422 /* MKS: The original code here died if letters weren't consecutive.
7423 * at least it didn't have to worry about non-C locales. The
7424 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 7425 * arranged in order (although not consecutively) and that only
9d116dd7
JH
7426 * [A-Za-z] are accepted by isALPHA in the C locale.
7427 */
7428 if (*d != 'z' && *d != 'Z') {
7429 do { ++*d; } while (!isALPHA(*d));
7430 return;
7431 }
7432 *(d--) -= 'z' - 'a';
7433#else
79072805
LW
7434 ++*d;
7435 if (isALPHA(*d))
7436 return;
7437 *(d--) -= 'z' - 'a' + 1;
9d116dd7 7438#endif
79072805
LW
7439 }
7440 }
7441 /* oh,oh, the number grew */
7442 SvGROW(sv, SvCUR(sv) + 2);
7443 SvCUR(sv)++;
463ee0b2 7444 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
7445 *d = d[-1];
7446 if (isDIGIT(d[1]))
7447 *d = '1';
7448 else
7449 *d = d[1];
7450}
7451
954c1994
GS
7452/*
7453=for apidoc sv_dec
7454
645c22ef
DM
7455Auto-decrement of the value in the SV, doing string to numeric conversion
7456if necessary. Handles 'get' magic.
954c1994
GS
7457
7458=cut
7459*/
7460
79072805 7461void
864dbfa3 7462Perl_sv_dec(pTHX_ register SV *sv)
79072805 7463{
463ee0b2
LW
7464 int flags;
7465
79072805
LW
7466 if (!sv)
7467 return;
b23a5f78
GB
7468 if (SvGMAGICAL(sv))
7469 mg_get(sv);
ed6116ce 7470 if (SvTHINKFIRST(sv)) {
765f542d
NC
7471 if (SvIsCOW(sv))
7472 sv_force_normal_flags(sv, 0);
0f15f207 7473 if (SvREADONLY(sv)) {
923e4eb5 7474 if (IN_PERL_RUNTIME)
cea2e8a9 7475 Perl_croak(aTHX_ PL_no_modify);
0f15f207 7476 }
a0d0e21e 7477 if (SvROK(sv)) {
b5be31e9 7478 IV i;
9e7bc3e8
JD
7479 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
7480 return;
56431972 7481 i = PTR2IV(SvRV(sv));
b5be31e9
SM
7482 sv_unref(sv);
7483 sv_setiv(sv, i);
a0d0e21e 7484 }
ed6116ce 7485 }
28e5dec8
JH
7486 /* Unlike sv_inc we don't have to worry about string-never-numbers
7487 and keeping them magic. But we mustn't warn on punting */
8990e307 7488 flags = SvFLAGS(sv);
28e5dec8
JH
7489 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7490 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 7491#ifdef PERL_PRESERVE_IVUV
28e5dec8 7492 oops_its_int:
59d8ce62 7493#endif
25da4f38
IZ
7494 if (SvIsUV(sv)) {
7495 if (SvUVX(sv) == 0) {
7496 (void)SvIOK_only(sv);
7497 SvIVX(sv) = -1;
7498 }
7499 else {
7500 (void)SvIOK_only_UV(sv);
7501 --SvUVX(sv);
1c846c1f 7502 }
25da4f38
IZ
7503 } else {
7504 if (SvIVX(sv) == IV_MIN)
65202027 7505 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
7506 else {
7507 (void)SvIOK_only(sv);
7508 --SvIVX(sv);
1c846c1f 7509 }
55497cff 7510 }
7511 return;
7512 }
28e5dec8
JH
7513 if (flags & SVp_NOK) {
7514 SvNVX(sv) -= 1.0;
7515 (void)SvNOK_only(sv);
7516 return;
7517 }
8990e307 7518 if (!(flags & SVp_POK)) {
4633a7c4
LW
7519 if ((flags & SVTYPEMASK) < SVt_PVNV)
7520 sv_upgrade(sv, SVt_NV);
463ee0b2 7521 SvNVX(sv) = -1.0;
a0d0e21e 7522 (void)SvNOK_only(sv);
79072805
LW
7523 return;
7524 }
28e5dec8
JH
7525#ifdef PERL_PRESERVE_IVUV
7526 {
c2988b20 7527 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
7528 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7529 /* Need to try really hard to see if it's an integer.
7530 9.22337203685478e+18 is an integer.
7531 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7532 so $a="9.22337203685478e+18"; $a+0; $a--
7533 needs to be the same as $a="9.22337203685478e+18"; $a--
7534 or we go insane. */
d460ef45 7535
28e5dec8
JH
7536 (void) sv_2iv(sv);
7537 if (SvIOK(sv))
7538 goto oops_its_int;
7539
7540 /* sv_2iv *should* have made this an NV */
7541 if (flags & SVp_NOK) {
7542 (void)SvNOK_only(sv);
7543 SvNVX(sv) -= 1.0;
7544 return;
7545 }
7546 /* I don't think we can get here. Maybe I should assert this
7547 And if we do get here I suspect that sv_setnv will croak. NWC
7548 Fall through. */
7549#if defined(USE_LONG_DOUBLE)
7550 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",
7551 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7552#else
1779d84d 7553 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
7554 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7555#endif
7556 }
7557 }
7558#endif /* PERL_PRESERVE_IVUV */
097ee67d 7559 sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
7560}
7561
954c1994
GS
7562/*
7563=for apidoc sv_mortalcopy
7564
645c22ef 7565Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
7566The new SV is marked as mortal. It will be destroyed "soon", either by an
7567explicit call to FREETMPS, or by an implicit call at places such as
7568statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
7569
7570=cut
7571*/
7572
79072805
LW
7573/* Make a string that will exist for the duration of the expression
7574 * evaluation. Actually, it may have to last longer than that, but
7575 * hopefully we won't free it until it has been assigned to a
7576 * permanent location. */
7577
7578SV *
864dbfa3 7579Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 7580{
463ee0b2 7581 register SV *sv;
b881518d 7582
4561caa4 7583 new_SV(sv);
79072805 7584 sv_setsv(sv,oldstr);
677b06e3
GS
7585 EXTEND_MORTAL(1);
7586 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
7587 SvTEMP_on(sv);
7588 return sv;
7589}
7590
954c1994
GS
7591/*
7592=for apidoc sv_newmortal
7593
645c22ef 7594Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
7595set to 1. It will be destroyed "soon", either by an explicit call to
7596FREETMPS, or by an implicit call at places such as statement boundaries.
7597See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
7598
7599=cut
7600*/
7601
8990e307 7602SV *
864dbfa3 7603Perl_sv_newmortal(pTHX)
8990e307
LW
7604{
7605 register SV *sv;
7606
4561caa4 7607 new_SV(sv);
8990e307 7608 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
7609 EXTEND_MORTAL(1);
7610 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
7611 return sv;
7612}
7613
954c1994
GS
7614/*
7615=for apidoc sv_2mortal
7616
d4236ebc
DM
7617Marks an existing SV as mortal. The SV will be destroyed "soon", either
7618by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
7619statement boundaries. SvTEMP() is turned on which means that the SV's
7620string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
7621and C<sv_mortalcopy>.
954c1994
GS
7622
7623=cut
7624*/
7625
79072805 7626SV *
864dbfa3 7627Perl_sv_2mortal(pTHX_ register SV *sv)
79072805
LW
7628{
7629 if (!sv)
7630 return sv;
d689ffdd 7631 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 7632 return sv;
677b06e3
GS
7633 EXTEND_MORTAL(1);
7634 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 7635 SvTEMP_on(sv);
79072805
LW
7636 return sv;
7637}
7638
954c1994
GS
7639/*
7640=for apidoc newSVpv
7641
7642Creates a new SV and copies a string into it. The reference count for the
7643SV is set to 1. If C<len> is zero, Perl will compute the length using
7644strlen(). For efficiency, consider using C<newSVpvn> instead.
7645
7646=cut
7647*/
7648
79072805 7649SV *
864dbfa3 7650Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 7651{
463ee0b2 7652 register SV *sv;
79072805 7653
4561caa4 7654 new_SV(sv);
79072805
LW
7655 if (!len)
7656 len = strlen(s);
7657 sv_setpvn(sv,s,len);
7658 return sv;
7659}
7660
954c1994
GS
7661/*
7662=for apidoc newSVpvn
7663
7664Creates a new SV and copies a string into it. The reference count for the
1c846c1f 7665SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 7666string. You are responsible for ensuring that the source string is at least
9e09f5f2 7667C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
7668
7669=cut
7670*/
7671
9da1e3b5 7672SV *
864dbfa3 7673Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
7674{
7675 register SV *sv;
7676
7677 new_SV(sv);
9da1e3b5
MUN
7678 sv_setpvn(sv,s,len);
7679 return sv;
7680}
7681
1c846c1f
NIS
7682/*
7683=for apidoc newSVpvn_share
7684
645c22ef
DM
7685Creates a new SV with its SvPVX pointing to a shared string in the string
7686table. If the string does not already exist in the table, it is created
7687first. Turns on READONLY and FAKE. The string's hash is stored in the UV
7688slot of the SV; if the C<hash> parameter is non-zero, that value is used;
7689otherwise the hash is computed. The idea here is that as the string table
7690is used for shared hash keys these strings will have SvPVX == HeKEY and
7691hash lookup will avoid string compare.
1c846c1f
NIS
7692
7693=cut
7694*/
7695
7696SV *
c3654f1a 7697Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
7698{
7699 register SV *sv;
c3654f1a
IH
7700 bool is_utf8 = FALSE;
7701 if (len < 0) {
77caf834 7702 STRLEN tmplen = -len;
c3654f1a 7703 is_utf8 = TRUE;
75a54232 7704 /* See the note in hv.c:hv_fetch() --jhi */
e1ec3a88 7705 src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
75a54232
JH
7706 len = tmplen;
7707 }
1c846c1f 7708 if (!hash)
5afd6d42 7709 PERL_HASH(hash, src, len);
1c846c1f
NIS
7710 new_SV(sv);
7711 sv_upgrade(sv, SVt_PVIV);
c3654f1a 7712 SvPVX(sv) = sharepvn(src, is_utf8?-len:len, hash);
1c846c1f
NIS
7713 SvCUR(sv) = len;
7714 SvUVX(sv) = hash;
7715 SvLEN(sv) = 0;
7716 SvREADONLY_on(sv);
7717 SvFAKE_on(sv);
7718 SvPOK_on(sv);
c3654f1a
IH
7719 if (is_utf8)
7720 SvUTF8_on(sv);
1c846c1f
NIS
7721 return sv;
7722}
7723
645c22ef 7724
cea2e8a9 7725#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7726
7727/* pTHX_ magic can't cope with varargs, so this is a no-context
7728 * version of the main function, (which may itself be aliased to us).
7729 * Don't access this version directly.
7730 */
7731
46fc3d4c 7732SV *
cea2e8a9 7733Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 7734{
cea2e8a9 7735 dTHX;
46fc3d4c 7736 register SV *sv;
7737 va_list args;
46fc3d4c 7738 va_start(args, pat);
c5be433b 7739 sv = vnewSVpvf(pat, &args);
46fc3d4c 7740 va_end(args);
7741 return sv;
7742}
cea2e8a9 7743#endif
46fc3d4c 7744
954c1994
GS
7745/*
7746=for apidoc newSVpvf
7747
645c22ef 7748Creates a new SV and initializes it with the string formatted like
954c1994
GS
7749C<sprintf>.
7750
7751=cut
7752*/
7753
cea2e8a9
GS
7754SV *
7755Perl_newSVpvf(pTHX_ const char* pat, ...)
7756{
7757 register SV *sv;
7758 va_list args;
cea2e8a9 7759 va_start(args, pat);
c5be433b 7760 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
7761 va_end(args);
7762 return sv;
7763}
46fc3d4c 7764
645c22ef
DM
7765/* backend for newSVpvf() and newSVpvf_nocontext() */
7766
79072805 7767SV *
c5be433b
GS
7768Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
7769{
7770 register SV *sv;
7771 new_SV(sv);
7772 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7773 return sv;
7774}
7775
954c1994
GS
7776/*
7777=for apidoc newSVnv
7778
7779Creates a new SV and copies a floating point value into it.
7780The reference count for the SV is set to 1.
7781
7782=cut
7783*/
7784
c5be433b 7785SV *
65202027 7786Perl_newSVnv(pTHX_ NV n)
79072805 7787{
463ee0b2 7788 register SV *sv;
79072805 7789
4561caa4 7790 new_SV(sv);
79072805
LW
7791 sv_setnv(sv,n);
7792 return sv;
7793}
7794
954c1994
GS
7795/*
7796=for apidoc newSViv
7797
7798Creates a new SV and copies an integer into it. The reference count for the
7799SV is set to 1.
7800
7801=cut
7802*/
7803
79072805 7804SV *
864dbfa3 7805Perl_newSViv(pTHX_ IV i)
79072805 7806{
463ee0b2 7807 register SV *sv;
79072805 7808
4561caa4 7809 new_SV(sv);
79072805
LW
7810 sv_setiv(sv,i);
7811 return sv;
7812}
7813
954c1994 7814/*
1a3327fb
JH
7815=for apidoc newSVuv
7816
7817Creates a new SV and copies an unsigned integer into it.
7818The reference count for the SV is set to 1.
7819
7820=cut
7821*/
7822
7823SV *
7824Perl_newSVuv(pTHX_ UV u)
7825{
7826 register SV *sv;
7827
7828 new_SV(sv);
7829 sv_setuv(sv,u);
7830 return sv;
7831}
7832
7833/*
954c1994
GS
7834=for apidoc newRV_noinc
7835
7836Creates an RV wrapper for an SV. The reference count for the original
7837SV is B<not> incremented.
7838
7839=cut
7840*/
7841
2304df62 7842SV *
864dbfa3 7843Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
7844{
7845 register SV *sv;
7846
4561caa4 7847 new_SV(sv);
2304df62 7848 sv_upgrade(sv, SVt_RV);
76e3520e 7849 SvTEMP_off(tmpRef);
d689ffdd 7850 SvRV(sv) = tmpRef;
2304df62 7851 SvROK_on(sv);
2304df62
AD
7852 return sv;
7853}
7854
ff276b08 7855/* newRV_inc is the official function name to use now.
645c22ef
DM
7856 * newRV_inc is in fact #defined to newRV in sv.h
7857 */
7858
5f05dabc 7859SV *
864dbfa3 7860Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 7861{
5f6447b6 7862 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 7863}
5f05dabc 7864
954c1994
GS
7865/*
7866=for apidoc newSVsv
7867
7868Creates a new SV which is an exact duplicate of the original SV.
645c22ef 7869(Uses C<sv_setsv>).
954c1994
GS
7870
7871=cut
7872*/
7873
79072805 7874SV *
864dbfa3 7875Perl_newSVsv(pTHX_ register SV *old)
79072805 7876{
463ee0b2 7877 register SV *sv;
79072805
LW
7878
7879 if (!old)
7880 return Nullsv;
8990e307 7881 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 7882 if (ckWARN_d(WARN_INTERNAL))
9014280d 7883 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
79072805
LW
7884 return Nullsv;
7885 }
4561caa4 7886 new_SV(sv);
e90aabeb
NC
7887 /* SV_GMAGIC is the default for sv_setv()
7888 SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
7889 with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
7890 sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
463ee0b2 7891 return sv;
79072805
LW
7892}
7893
645c22ef
DM
7894/*
7895=for apidoc sv_reset
7896
7897Underlying implementation for the C<reset> Perl function.
7898Note that the perl-level function is vaguely deprecated.
7899
7900=cut
7901*/
7902
79072805 7903void
e1ec3a88 7904Perl_sv_reset(pTHX_ register const char *s, HV *stash)
79072805
LW
7905{
7906 register HE *entry;
7907 register GV *gv;
7908 register SV *sv;
7909 register I32 i;
7910 register PMOP *pm;
7911 register I32 max;
4802d5d7 7912 char todo[PERL_UCHAR_MAX+1];
79072805 7913
49d8d3a1
MB
7914 if (!stash)
7915 return;
7916
79072805
LW
7917 if (!*s) { /* reset ?? searches */
7918 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
48c036b1 7919 pm->op_pmdynflags &= ~PMdf_USED;
79072805
LW
7920 }
7921 return;
7922 }
7923
7924 /* reset variables */
7925
7926 if (!HvARRAY(stash))
7927 return;
463ee0b2
LW
7928
7929 Zero(todo, 256, char);
79072805 7930 while (*s) {
4802d5d7 7931 i = (unsigned char)*s;
79072805
LW
7932 if (s[1] == '-') {
7933 s += 2;
7934 }
4802d5d7 7935 max = (unsigned char)*s++;
79072805 7936 for ( ; i <= max; i++) {
463ee0b2
LW
7937 todo[i] = 1;
7938 }
a0d0e21e 7939 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 7940 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7941 entry;
7942 entry = HeNEXT(entry))
7943 {
1edc1566 7944 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7945 continue;
1edc1566 7946 gv = (GV*)HeVAL(entry);
79072805 7947 sv = GvSV(gv);
9e35f4b3
GS
7948 if (SvTHINKFIRST(sv)) {
7949 if (!SvREADONLY(sv) && SvROK(sv))
7950 sv_unref(sv);
7951 continue;
7952 }
0c34ef67 7953 SvOK_off(sv);
79072805
LW
7954 if (SvTYPE(sv) >= SVt_PV) {
7955 SvCUR_set(sv, 0);
463ee0b2
LW
7956 if (SvPVX(sv) != Nullch)
7957 *SvPVX(sv) = '\0';
44a8e56a 7958 SvTAINT(sv);
79072805
LW
7959 }
7960 if (GvAV(gv)) {
7961 av_clear(GvAV(gv));
7962 }
44a8e56a 7963 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
463ee0b2 7964 hv_clear(GvHV(gv));
2f42fcb0 7965#ifndef PERL_MICRO
fa6a1c44 7966#ifdef USE_ENVIRON_ARRAY
4efc5df6
GS
7967 if (gv == PL_envgv
7968# ifdef USE_ITHREADS
7969 && PL_curinterp == aTHX
7970# endif
7971 )
7972 {
79072805 7973 environ[0] = Nullch;
4efc5df6 7974 }
a0d0e21e 7975#endif
2f42fcb0 7976#endif /* !PERL_MICRO */
79072805
LW
7977 }
7978 }
7979 }
7980 }
7981}
7982
645c22ef
DM
7983/*
7984=for apidoc sv_2io
7985
7986Using various gambits, try to get an IO from an SV: the IO slot if its a
7987GV; or the recursive result if we're an RV; or the IO slot of the symbol
7988named after the PV if we're a string.
7989
7990=cut
7991*/
7992
46fc3d4c 7993IO*
864dbfa3 7994Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 7995{
7996 IO* io;
7997 GV* gv;
7998
7999 switch (SvTYPE(sv)) {
8000 case SVt_PVIO:
8001 io = (IO*)sv;
8002 break;
8003 case SVt_PVGV:
8004 gv = (GV*)sv;
8005 io = GvIO(gv);
8006 if (!io)
cea2e8a9 8007 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 8008 break;
8009 default:
8010 if (!SvOK(sv))
cea2e8a9 8011 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 8012 if (SvROK(sv))
8013 return sv_2io(SvRV(sv));
7a5fd60d 8014 gv = gv_fetchsv(sv, FALSE, SVt_PVIO);
46fc3d4c 8015 if (gv)
8016 io = GvIO(gv);
8017 else
8018 io = 0;
8019 if (!io)
35c1215d 8020 Perl_croak(aTHX_ "Bad filehandle: %"SVf, sv);
46fc3d4c 8021 break;
8022 }
8023 return io;
8024}
8025
645c22ef
DM
8026/*
8027=for apidoc sv_2cv
8028
8029Using various gambits, try to get a CV from an SV; in addition, try if
8030possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
8031
8032=cut
8033*/
8034
79072805 8035CV *
864dbfa3 8036Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 8037{
c04a4dfe
JH
8038 GV *gv = Nullgv;
8039 CV *cv = Nullcv;
79072805
LW
8040
8041 if (!sv)
93a17b20 8042 return *gvp = Nullgv, Nullcv;
79072805 8043 switch (SvTYPE(sv)) {
79072805
LW
8044 case SVt_PVCV:
8045 *st = CvSTASH(sv);
8046 *gvp = Nullgv;
8047 return (CV*)sv;
8048 case SVt_PVHV:
8049 case SVt_PVAV:
8050 *gvp = Nullgv;
8051 return Nullcv;
8990e307
LW
8052 case SVt_PVGV:
8053 gv = (GV*)sv;
a0d0e21e 8054 *gvp = gv;
8990e307
LW
8055 *st = GvESTASH(gv);
8056 goto fix_gv;
8057
79072805 8058 default:
a0d0e21e
LW
8059 if (SvGMAGICAL(sv))
8060 mg_get(sv);
8061 if (SvROK(sv)) {
f5284f61
IZ
8062 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
8063 tryAMAGICunDEREF(to_cv);
8064
62f274bf
GS
8065 sv = SvRV(sv);
8066 if (SvTYPE(sv) == SVt_PVCV) {
8067 cv = (CV*)sv;
8068 *gvp = Nullgv;
8069 *st = CvSTASH(cv);
8070 return cv;
8071 }
8072 else if(isGV(sv))
8073 gv = (GV*)sv;
8074 else
cea2e8a9 8075 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 8076 }
62f274bf 8077 else if (isGV(sv))
79072805
LW
8078 gv = (GV*)sv;
8079 else
7a5fd60d 8080 gv = gv_fetchsv(sv, lref, SVt_PVCV);
79072805
LW
8081 *gvp = gv;
8082 if (!gv)
8083 return Nullcv;
8084 *st = GvESTASH(gv);
8990e307 8085 fix_gv:
8ebc5c01 8086 if (lref && !GvCVu(gv)) {
4633a7c4 8087 SV *tmpsv;
748a9306 8088 ENTER;
4633a7c4 8089 tmpsv = NEWSV(704,0);
16660edb 8090 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
8091 /* XXX this is probably not what they think they're getting.
8092 * It has the same effect as "sub name;", i.e. just a forward
8093 * declaration! */
774d564b 8094 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
8095 newSVOP(OP_CONST, 0, tmpsv),
8096 Nullop,
8990e307 8097 Nullop);
748a9306 8098 LEAVE;
8ebc5c01 8099 if (!GvCVu(gv))
35c1215d
NC
8100 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
8101 sv);
8990e307 8102 }
8ebc5c01 8103 return GvCVu(gv);
79072805
LW
8104 }
8105}
8106
c461cf8f
JH
8107/*
8108=for apidoc sv_true
8109
8110Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
8111Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
8112instead use an in-line version.
c461cf8f
JH
8113
8114=cut
8115*/
8116
79072805 8117I32
864dbfa3 8118Perl_sv_true(pTHX_ register SV *sv)
79072805 8119{
8990e307
LW
8120 if (!sv)
8121 return 0;
79072805 8122 if (SvPOK(sv)) {
e1ec3a88 8123 const register XPV* tXpv;
4e35701f 8124 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 8125 (tXpv->xpv_cur > 1 ||
4e35701f 8126 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
79072805
LW
8127 return 1;
8128 else
8129 return 0;
8130 }
8131 else {
8132 if (SvIOK(sv))
463ee0b2 8133 return SvIVX(sv) != 0;
79072805
LW
8134 else {
8135 if (SvNOK(sv))
463ee0b2 8136 return SvNVX(sv) != 0.0;
79072805 8137 else
463ee0b2 8138 return sv_2bool(sv);
79072805
LW
8139 }
8140 }
8141}
79072805 8142
645c22ef
DM
8143/*
8144=for apidoc sv_iv
8145
8146A private implementation of the C<SvIVx> macro for compilers which can't
8147cope with complex macro expressions. Always use the macro instead.
8148
8149=cut
8150*/
8151
ff68c719 8152IV
864dbfa3 8153Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 8154{
25da4f38
IZ
8155 if (SvIOK(sv)) {
8156 if (SvIsUV(sv))
8157 return (IV)SvUVX(sv);
ff68c719 8158 return SvIVX(sv);
25da4f38 8159 }
ff68c719 8160 return sv_2iv(sv);
85e6fe83 8161}
85e6fe83 8162
645c22ef
DM
8163/*
8164=for apidoc sv_uv
8165
8166A private implementation of the C<SvUVx> macro for compilers which can't
8167cope with complex macro expressions. Always use the macro instead.
8168
8169=cut
8170*/
8171
ff68c719 8172UV
864dbfa3 8173Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 8174{
25da4f38
IZ
8175 if (SvIOK(sv)) {
8176 if (SvIsUV(sv))
8177 return SvUVX(sv);
8178 return (UV)SvIVX(sv);
8179 }
ff68c719 8180 return sv_2uv(sv);
8181}
85e6fe83 8182
645c22ef
DM
8183/*
8184=for apidoc sv_nv
8185
8186A private implementation of the C<SvNVx> macro for compilers which can't
8187cope with complex macro expressions. Always use the macro instead.
8188
8189=cut
8190*/
8191
65202027 8192NV
864dbfa3 8193Perl_sv_nv(pTHX_ register SV *sv)
79072805 8194{
ff68c719 8195 if (SvNOK(sv))
8196 return SvNVX(sv);
8197 return sv_2nv(sv);
79072805 8198}
79072805 8199
09540bc3
JH
8200/* sv_pv() is now a macro using SvPV_nolen();
8201 * this function provided for binary compatibility only
8202 */
8203
8204char *
8205Perl_sv_pv(pTHX_ SV *sv)
8206{
8207 STRLEN n_a;
8208
8209 if (SvPOK(sv))
8210 return SvPVX(sv);
8211
8212 return sv_2pv(sv, &n_a);
8213}
8214
645c22ef
DM
8215/*
8216=for apidoc sv_pv
8217
baca2b92 8218Use the C<SvPV_nolen> macro instead
645c22ef 8219
645c22ef
DM
8220=for apidoc sv_pvn
8221
8222A private implementation of the C<SvPV> macro for compilers which can't
8223cope with complex macro expressions. Always use the macro instead.
8224
8225=cut
8226*/
8227
1fa8b10d 8228char *
864dbfa3 8229Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 8230{
85e6fe83
LW
8231 if (SvPOK(sv)) {
8232 *lp = SvCUR(sv);
a0d0e21e 8233 return SvPVX(sv);
85e6fe83 8234 }
463ee0b2 8235 return sv_2pv(sv, lp);
79072805 8236}
79072805 8237
6e9d1081
NC
8238
8239char *
8240Perl_sv_pvn_nomg(pTHX_ register SV *sv, STRLEN *lp)
8241{
8242 if (SvPOK(sv)) {
8243 *lp = SvCUR(sv);
8244 return SvPVX(sv);
8245 }
8246 return sv_2pv_flags(sv, lp, 0);
8247}
8248
09540bc3
JH
8249/* sv_pvn_force() is now a macro using Perl_sv_pvn_force_flags();
8250 * this function provided for binary compatibility only
8251 */
8252
8253char *
8254Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
8255{
8256 return sv_pvn_force_flags(sv, lp, SV_GMAGIC);
8257}
8258
c461cf8f
JH
8259/*
8260=for apidoc sv_pvn_force
8261
8262Get a sensible string out of the SV somehow.
645c22ef
DM
8263A private implementation of the C<SvPV_force> macro for compilers which
8264can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 8265
8d6d96c1
HS
8266=for apidoc sv_pvn_force_flags
8267
8268Get a sensible string out of the SV somehow.
8269If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
8270appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
8271implemented in terms of this function.
645c22ef
DM
8272You normally want to use the various wrapper macros instead: see
8273C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
8274
8275=cut
8276*/
8277
8278char *
8279Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
8280{
c04a4dfe 8281 char *s = NULL;
a0d0e21e 8282
6fc92669 8283 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 8284 sv_force_normal_flags(sv, 0);
1c846c1f 8285
a0d0e21e
LW
8286 if (SvPOK(sv)) {
8287 *lp = SvCUR(sv);
8288 }
8289 else {
748a9306 8290 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 8291 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 8292 OP_NAME(PL_op));
a0d0e21e 8293 }
4633a7c4 8294 else
8d6d96c1 8295 s = sv_2pv_flags(sv, lp, flags);
a0d0e21e
LW
8296 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
8297 STRLEN len = *lp;
1c846c1f 8298
a0d0e21e
LW
8299 if (SvROK(sv))
8300 sv_unref(sv);
8301 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
8302 SvGROW(sv, len + 1);
8303 Move(s,SvPVX(sv),len,char);
8304 SvCUR_set(sv, len);
8305 *SvEND(sv) = '\0';
8306 }
8307 if (!SvPOK(sv)) {
8308 SvPOK_on(sv); /* validate pointer */
8309 SvTAINT(sv);
1d7c1841
GS
8310 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
8311 PTR2UV(sv),SvPVX(sv)));
a0d0e21e
LW
8312 }
8313 }
8314 return SvPVX(sv);
8315}
8316
09540bc3
JH
8317/* sv_pvbyte () is now a macro using Perl_sv_2pv_flags();
8318 * this function provided for binary compatibility only
8319 */
8320
8321char *
8322Perl_sv_pvbyte(pTHX_ SV *sv)
8323{
8324 sv_utf8_downgrade(sv,0);
8325 return sv_pv(sv);
8326}
8327
645c22ef
DM
8328/*
8329=for apidoc sv_pvbyte
8330
baca2b92 8331Use C<SvPVbyte_nolen> instead.
645c22ef 8332
645c22ef
DM
8333=for apidoc sv_pvbyten
8334
8335A private implementation of the C<SvPVbyte> macro for compilers
8336which can't cope with complex macro expressions. Always use the macro
8337instead.
8338
8339=cut
8340*/
8341
7340a771
GS
8342char *
8343Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
8344{
ffebcc3e 8345 sv_utf8_downgrade(sv,0);
7340a771
GS
8346 return sv_pvn(sv,lp);
8347}
8348
645c22ef
DM
8349/*
8350=for apidoc sv_pvbyten_force
8351
8352A private implementation of the C<SvPVbytex_force> macro for compilers
8353which can't cope with complex macro expressions. Always use the macro
8354instead.
8355
8356=cut
8357*/
8358
7340a771
GS
8359char *
8360Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
8361{
46ec2f14 8362 sv_pvn_force(sv,lp);
ffebcc3e 8363 sv_utf8_downgrade(sv,0);
46ec2f14
TS
8364 *lp = SvCUR(sv);
8365 return SvPVX(sv);
7340a771
GS
8366}
8367
09540bc3
JH
8368/* sv_pvutf8 () is now a macro using Perl_sv_2pv_flags();
8369 * this function provided for binary compatibility only
8370 */
8371
8372char *
8373Perl_sv_pvutf8(pTHX_ SV *sv)
8374{
8375 sv_utf8_upgrade(sv);
8376 return sv_pv(sv);
8377}
8378
645c22ef
DM
8379/*
8380=for apidoc sv_pvutf8
8381
baca2b92 8382Use the C<SvPVutf8_nolen> macro instead
645c22ef 8383
645c22ef
DM
8384=for apidoc sv_pvutf8n
8385
8386A private implementation of the C<SvPVutf8> macro for compilers
8387which can't cope with complex macro expressions. Always use the macro
8388instead.
8389
8390=cut
8391*/
8392
7340a771
GS
8393char *
8394Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
8395{
560a288e 8396 sv_utf8_upgrade(sv);
7340a771
GS
8397 return sv_pvn(sv,lp);
8398}
8399
c461cf8f
JH
8400/*
8401=for apidoc sv_pvutf8n_force
8402
645c22ef
DM
8403A private implementation of the C<SvPVutf8_force> macro for compilers
8404which can't cope with complex macro expressions. Always use the macro
8405instead.
c461cf8f
JH
8406
8407=cut
8408*/
8409
7340a771
GS
8410char *
8411Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
8412{
46ec2f14 8413 sv_pvn_force(sv,lp);
560a288e 8414 sv_utf8_upgrade(sv);
46ec2f14
TS
8415 *lp = SvCUR(sv);
8416 return SvPVX(sv);
7340a771
GS
8417}
8418
c461cf8f
JH
8419/*
8420=for apidoc sv_reftype
8421
8422Returns a string describing what the SV is a reference to.
8423
8424=cut
8425*/
8426
1cb0ed9b 8427char *
bfed75c6 8428Perl_sv_reftype(pTHX_ const SV *sv, int ob)
a0d0e21e 8429{
c86bf373 8430 if (ob && SvOBJECT(sv)) {
1cb0ed9b 8431 char *name = HvNAME(SvSTASH(sv));
b7a91edc 8432 return name ? name : "__ANON__";
c86bf373 8433 }
a0d0e21e
LW
8434 else {
8435 switch (SvTYPE(sv)) {
8436 case SVt_NULL:
8437 case SVt_IV:
8438 case SVt_NV:
8439 case SVt_RV:
8440 case SVt_PV:
8441 case SVt_PVIV:
8442 case SVt_PVNV:
8443 case SVt_PVMG:
8444 case SVt_PVBM:
1cb0ed9b 8445 if (SvVOK(sv))
439cb1c4 8446 return "VSTRING";
a0d0e21e
LW
8447 if (SvROK(sv))
8448 return "REF";
8449 else
8450 return "SCALAR";
1cb0ed9b 8451
be65207d
DM
8452 case SVt_PVLV: return SvROK(sv) ? "REF"
8453 /* tied lvalues should appear to be
8454 * scalars for backwards compatitbility */
8455 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
8456 ? "SCALAR" : "LVALUE";
a0d0e21e
LW
8457 case SVt_PVAV: return "ARRAY";
8458 case SVt_PVHV: return "HASH";
8459 case SVt_PVCV: return "CODE";
8460 case SVt_PVGV: return "GLOB";
1d2dff63 8461 case SVt_PVFM: return "FORMAT";
27f9d8f3 8462 case SVt_PVIO: return "IO";
a0d0e21e
LW
8463 default: return "UNKNOWN";
8464 }
8465 }
8466}
8467
954c1994
GS
8468/*
8469=for apidoc sv_isobject
8470
8471Returns a boolean indicating whether the SV is an RV pointing to a blessed
8472object. If the SV is not an RV, or if the object is not blessed, then this
8473will return false.
8474
8475=cut
8476*/
8477
463ee0b2 8478int
864dbfa3 8479Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 8480{
68dc0745 8481 if (!sv)
8482 return 0;
8483 if (SvGMAGICAL(sv))
8484 mg_get(sv);
85e6fe83
LW
8485 if (!SvROK(sv))
8486 return 0;
8487 sv = (SV*)SvRV(sv);
8488 if (!SvOBJECT(sv))
8489 return 0;
8490 return 1;
8491}
8492
954c1994
GS
8493/*
8494=for apidoc sv_isa
8495
8496Returns a boolean indicating whether the SV is blessed into the specified
8497class. This does not check for subtypes; use C<sv_derived_from> to verify
8498an inheritance relationship.
8499
8500=cut
8501*/
8502
85e6fe83 8503int
864dbfa3 8504Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 8505{
68dc0745 8506 if (!sv)
8507 return 0;
8508 if (SvGMAGICAL(sv))
8509 mg_get(sv);
ed6116ce 8510 if (!SvROK(sv))
463ee0b2 8511 return 0;
ed6116ce
LW
8512 sv = (SV*)SvRV(sv);
8513 if (!SvOBJECT(sv))
463ee0b2 8514 return 0;
e27ad1f2
AV
8515 if (!HvNAME(SvSTASH(sv)))
8516 return 0;
463ee0b2
LW
8517
8518 return strEQ(HvNAME(SvSTASH(sv)), name);
8519}
8520
954c1994
GS
8521/*
8522=for apidoc newSVrv
8523
8524Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
8525it will be upgraded to one. If C<classname> is non-null then the new SV will
8526be blessed in the specified package. The new SV is returned and its
8527reference count is 1.
8528
8529=cut
8530*/
8531
463ee0b2 8532SV*
864dbfa3 8533Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 8534{
463ee0b2
LW
8535 SV *sv;
8536
4561caa4 8537 new_SV(sv);
51cf62d8 8538
765f542d 8539 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 8540 SvAMAGIC_off(rv);
51cf62d8 8541
0199fce9
JD
8542 if (SvTYPE(rv) >= SVt_PVMG) {
8543 U32 refcnt = SvREFCNT(rv);
8544 SvREFCNT(rv) = 0;
8545 sv_clear(rv);
8546 SvFLAGS(rv) = 0;
8547 SvREFCNT(rv) = refcnt;
8548 }
8549
51cf62d8 8550 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
8551 sv_upgrade(rv, SVt_RV);
8552 else if (SvTYPE(rv) > SVt_RV) {
0c34ef67 8553 SvOOK_off(rv);
0199fce9
JD
8554 if (SvPVX(rv) && SvLEN(rv))
8555 Safefree(SvPVX(rv));
8556 SvCUR_set(rv, 0);
8557 SvLEN_set(rv, 0);
8558 }
51cf62d8 8559
0c34ef67 8560 SvOK_off(rv);
053fc874 8561 SvRV(rv) = sv;
ed6116ce 8562 SvROK_on(rv);
463ee0b2 8563
a0d0e21e
LW
8564 if (classname) {
8565 HV* stash = gv_stashpv(classname, TRUE);
8566 (void)sv_bless(rv, stash);
8567 }
8568 return sv;
8569}
8570
954c1994
GS
8571/*
8572=for apidoc sv_setref_pv
8573
8574Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
8575argument will be upgraded to an RV. That RV will be modified to point to
8576the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
8577into the SV. The C<classname> argument indicates the package for the
8578blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8579will have a reference count of 1, and the RV will be returned.
954c1994
GS
8580
8581Do not use with other Perl types such as HV, AV, SV, CV, because those
8582objects will become corrupted by the pointer copy process.
8583
8584Note that C<sv_setref_pvn> copies the string while this copies the pointer.
8585
8586=cut
8587*/
8588
a0d0e21e 8589SV*
864dbfa3 8590Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 8591{
189b2af5 8592 if (!pv) {
3280af22 8593 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
8594 SvSETMAGIC(rv);
8595 }
a0d0e21e 8596 else
56431972 8597 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
8598 return rv;
8599}
8600
954c1994
GS
8601/*
8602=for apidoc sv_setref_iv
8603
8604Copies an integer into a new SV, optionally blessing the SV. The C<rv>
8605argument will be upgraded to an RV. That RV will be modified to point to
8606the new SV. The C<classname> argument indicates the package for the
8607blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8608will have a reference count of 1, and the RV will be returned.
954c1994
GS
8609
8610=cut
8611*/
8612
a0d0e21e 8613SV*
864dbfa3 8614Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
8615{
8616 sv_setiv(newSVrv(rv,classname), iv);
8617 return rv;
8618}
8619
954c1994 8620/*
e1c57cef
JH
8621=for apidoc sv_setref_uv
8622
8623Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
8624argument will be upgraded to an RV. That RV will be modified to point to
8625the new SV. The C<classname> argument indicates the package for the
8626blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8627will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
8628
8629=cut
8630*/
8631
8632SV*
8633Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
8634{
8635 sv_setuv(newSVrv(rv,classname), uv);
8636 return rv;
8637}
8638
8639/*
954c1994
GS
8640=for apidoc sv_setref_nv
8641
8642Copies a double into a new SV, optionally blessing the SV. The C<rv>
8643argument will be upgraded to an RV. That RV will be modified to point to
8644the new SV. The C<classname> argument indicates the package for the
8645blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8646will have a reference count of 1, and the RV will be returned.
954c1994
GS
8647
8648=cut
8649*/
8650
a0d0e21e 8651SV*
65202027 8652Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
8653{
8654 sv_setnv(newSVrv(rv,classname), nv);
8655 return rv;
8656}
463ee0b2 8657
954c1994
GS
8658/*
8659=for apidoc sv_setref_pvn
8660
8661Copies a string into a new SV, optionally blessing the SV. The length of the
8662string must be specified with C<n>. The C<rv> argument will be upgraded to
8663an RV. That RV will be modified to point to the new SV. The C<classname>
8664argument indicates the package for the blessing. Set C<classname> to
7a5fa8a2 8665C<Nullch> to avoid the blessing. The new SV will have a reference count
d34c2299 8666of 1, and the RV will be returned.
954c1994
GS
8667
8668Note that C<sv_setref_pv> copies the pointer while this copies the string.
8669
8670=cut
8671*/
8672
a0d0e21e 8673SV*
864dbfa3 8674Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
8675{
8676 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
8677 return rv;
8678}
8679
954c1994
GS
8680/*
8681=for apidoc sv_bless
8682
8683Blesses an SV into a specified package. The SV must be an RV. The package
8684must be designated by its stash (see C<gv_stashpv()>). The reference count
8685of the SV is unaffected.
8686
8687=cut
8688*/
8689
a0d0e21e 8690SV*
864dbfa3 8691Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 8692{
76e3520e 8693 SV *tmpRef;
a0d0e21e 8694 if (!SvROK(sv))
cea2e8a9 8695 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
8696 tmpRef = SvRV(sv);
8697 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
8698 if (SvREADONLY(tmpRef))
cea2e8a9 8699 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
8700 if (SvOBJECT(tmpRef)) {
8701 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8702 --PL_sv_objcount;
76e3520e 8703 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 8704 }
a0d0e21e 8705 }
76e3520e
GS
8706 SvOBJECT_on(tmpRef);
8707 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8708 ++PL_sv_objcount;
76e3520e
GS
8709 (void)SvUPGRADE(tmpRef, SVt_PVMG);
8710 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
a0d0e21e 8711
2e3febc6
CS
8712 if (Gv_AMG(stash))
8713 SvAMAGIC_on(sv);
8714 else
8715 SvAMAGIC_off(sv);
a0d0e21e 8716
1edbfb88
AB
8717 if(SvSMAGICAL(tmpRef))
8718 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8719 mg_set(tmpRef);
8720
8721
ecdeb87c 8722
a0d0e21e
LW
8723 return sv;
8724}
8725
645c22ef 8726/* Downgrades a PVGV to a PVMG.
645c22ef
DM
8727 */
8728
76e3520e 8729STATIC void
cea2e8a9 8730S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 8731{
850fabdf
GS
8732 void *xpvmg;
8733
a0d0e21e
LW
8734 assert(SvTYPE(sv) == SVt_PVGV);
8735 SvFAKE_off(sv);
8736 if (GvGP(sv))
1edc1566 8737 gp_free((GV*)sv);
e826b3c7
GS
8738 if (GvSTASH(sv)) {
8739 SvREFCNT_dec(GvSTASH(sv));
8740 GvSTASH(sv) = Nullhv;
8741 }
14befaf4 8742 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 8743 Safefree(GvNAME(sv));
a5f75d66 8744 GvMULTI_off(sv);
850fabdf
GS
8745
8746 /* need to keep SvANY(sv) in the right arena */
8747 xpvmg = new_XPVMG();
8748 StructCopy(SvANY(sv), xpvmg, XPVMG);
8749 del_XPVGV(SvANY(sv));
8750 SvANY(sv) = xpvmg;
8751
a0d0e21e
LW
8752 SvFLAGS(sv) &= ~SVTYPEMASK;
8753 SvFLAGS(sv) |= SVt_PVMG;
8754}
8755
954c1994 8756/*
840a7b70 8757=for apidoc sv_unref_flags
954c1994
GS
8758
8759Unsets the RV status of the SV, and decrements the reference count of
8760whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
8761as a reversal of C<newSVrv>. The C<cflags> argument can contain
8762C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8763(otherwise the decrementing is conditional on the reference count being
8764different from one or the reference being a readonly SV).
7889fe52 8765See C<SvROK_off>.
954c1994
GS
8766
8767=cut
8768*/
8769
ed6116ce 8770void
840a7b70 8771Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 8772{
a0d0e21e 8773 SV* rv = SvRV(sv);
810b8aa5
GS
8774
8775 if (SvWEAKREF(sv)) {
8776 sv_del_backref(sv);
8777 SvWEAKREF_off(sv);
8778 SvRV(sv) = 0;
8779 return;
8780 }
ed6116ce
LW
8781 SvRV(sv) = 0;
8782 SvROK_off(sv);
04ca4930
NC
8783 /* You can't have a || SvREADONLY(rv) here, as $a = $$a, where $a was
8784 assigned to as BEGIN {$a = \"Foo"} will fail. */
8785 if (SvREFCNT(rv) != 1 || (flags & SV_IMMEDIATE_UNREF))
4633a7c4 8786 SvREFCNT_dec(rv);
840a7b70 8787 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 8788 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 8789}
8990e307 8790
840a7b70
IZ
8791/*
8792=for apidoc sv_unref
8793
8794Unsets the RV status of the SV, and decrements the reference count of
8795whatever was being referenced by the RV. This can almost be thought of
8796as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 8797being zero. See C<SvROK_off>.
840a7b70
IZ
8798
8799=cut
8800*/
8801
8802void
8803Perl_sv_unref(pTHX_ SV *sv)
8804{
8805 sv_unref_flags(sv, 0);
8806}
8807
645c22ef
DM
8808/*
8809=for apidoc sv_taint
8810
8811Taint an SV. Use C<SvTAINTED_on> instead.
8812=cut
8813*/
8814
bbce6d69 8815void
864dbfa3 8816Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 8817{
14befaf4 8818 sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
bbce6d69 8819}
8820
645c22ef
DM
8821/*
8822=for apidoc sv_untaint
8823
8824Untaint an SV. Use C<SvTAINTED_off> instead.
8825=cut
8826*/
8827
bbce6d69 8828void
864dbfa3 8829Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 8830{
13f57bf8 8831 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8832 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 8833 if (mg)
565764a8 8834 mg->mg_len &= ~1;
36477c24 8835 }
bbce6d69 8836}
8837
645c22ef
DM
8838/*
8839=for apidoc sv_tainted
8840
8841Test an SV for taintedness. Use C<SvTAINTED> instead.
8842=cut
8843*/
8844
bbce6d69 8845bool
864dbfa3 8846Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 8847{
13f57bf8 8848 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8849 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
155aba94 8850 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 8851 return TRUE;
8852 }
8853 return FALSE;
bbce6d69 8854}
8855
09540bc3
JH
8856/*
8857=for apidoc sv_setpviv
8858
8859Copies an integer into the given SV, also updating its string value.
8860Does not handle 'set' magic. See C<sv_setpviv_mg>.
8861
8862=cut
8863*/
8864
8865void
8866Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
8867{
8868 char buf[TYPE_CHARS(UV)];
8869 char *ebuf;
8870 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8871
8872 sv_setpvn(sv, ptr, ebuf - ptr);
8873}
8874
8875/*
8876=for apidoc sv_setpviv_mg
8877
8878Like C<sv_setpviv>, but also handles 'set' magic.
8879
8880=cut
8881*/
8882
8883void
8884Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
8885{
8886 char buf[TYPE_CHARS(UV)];
8887 char *ebuf;
8888 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8889
8890 sv_setpvn(sv, ptr, ebuf - ptr);
8891 SvSETMAGIC(sv);
8892}
8893
cea2e8a9 8894#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8895
8896/* pTHX_ magic can't cope with varargs, so this is a no-context
8897 * version of the main function, (which may itself be aliased to us).
8898 * Don't access this version directly.
8899 */
8900
cea2e8a9
GS
8901void
8902Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
8903{
8904 dTHX;
8905 va_list args;
8906 va_start(args, pat);
c5be433b 8907 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
8908 va_end(args);
8909}
8910
645c22ef
DM
8911/* pTHX_ magic can't cope with varargs, so this is a no-context
8912 * version of the main function, (which may itself be aliased to us).
8913 * Don't access this version directly.
8914 */
cea2e8a9
GS
8915
8916void
8917Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
8918{
8919 dTHX;
8920 va_list args;
8921 va_start(args, pat);
c5be433b 8922 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 8923 va_end(args);
cea2e8a9
GS
8924}
8925#endif
8926
954c1994
GS
8927/*
8928=for apidoc sv_setpvf
8929
bffc3d17
SH
8930Works like C<sv_catpvf> but copies the text into the SV instead of
8931appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
8932
8933=cut
8934*/
8935
46fc3d4c 8936void
864dbfa3 8937Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8938{
8939 va_list args;
46fc3d4c 8940 va_start(args, pat);
c5be433b 8941 sv_vsetpvf(sv, pat, &args);
46fc3d4c 8942 va_end(args);
8943}
8944
bffc3d17
SH
8945/*
8946=for apidoc sv_vsetpvf
8947
8948Works like C<sv_vcatpvf> but copies the text into the SV instead of
8949appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
8950
8951Usually used via its frontend C<sv_setpvf>.
8952
8953=cut
8954*/
645c22ef 8955
c5be433b
GS
8956void
8957Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8958{
8959 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8960}
ef50df4b 8961
954c1994
GS
8962/*
8963=for apidoc sv_setpvf_mg
8964
8965Like C<sv_setpvf>, but also handles 'set' magic.
8966
8967=cut
8968*/
8969
ef50df4b 8970void
864dbfa3 8971Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8972{
8973 va_list args;
ef50df4b 8974 va_start(args, pat);
c5be433b 8975 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 8976 va_end(args);
c5be433b
GS
8977}
8978
bffc3d17
SH
8979/*
8980=for apidoc sv_vsetpvf_mg
8981
8982Like C<sv_vsetpvf>, but also handles 'set' magic.
8983
8984Usually used via its frontend C<sv_setpvf_mg>.
8985
8986=cut
8987*/
645c22ef 8988
c5be433b
GS
8989void
8990Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8991{
8992 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
8993 SvSETMAGIC(sv);
8994}
8995
cea2e8a9 8996#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8997
8998/* pTHX_ magic can't cope with varargs, so this is a no-context
8999 * version of the main function, (which may itself be aliased to us).
9000 * Don't access this version directly.
9001 */
9002
cea2e8a9
GS
9003void
9004Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
9005{
9006 dTHX;
9007 va_list args;
9008 va_start(args, pat);
c5be433b 9009 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
9010 va_end(args);
9011}
9012
645c22ef
DM
9013/* pTHX_ magic can't cope with varargs, so this is a no-context
9014 * version of the main function, (which may itself be aliased to us).
9015 * Don't access this version directly.
9016 */
9017
cea2e8a9
GS
9018void
9019Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
9020{
9021 dTHX;
9022 va_list args;
9023 va_start(args, pat);
c5be433b 9024 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 9025 va_end(args);
cea2e8a9
GS
9026}
9027#endif
9028
954c1994
GS
9029/*
9030=for apidoc sv_catpvf
9031
d5ce4a7c
GA
9032Processes its arguments like C<sprintf> and appends the formatted
9033output to an SV. If the appended data contains "wide" characters
9034(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
9035and characters >255 formatted with %c), the original SV might get
bffc3d17 9036upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
9037C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
9038valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 9039
d5ce4a7c 9040=cut */
954c1994 9041
46fc3d4c 9042void
864dbfa3 9043Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 9044{
9045 va_list args;
46fc3d4c 9046 va_start(args, pat);
c5be433b 9047 sv_vcatpvf(sv, pat, &args);
46fc3d4c 9048 va_end(args);
9049}
9050
bffc3d17
SH
9051/*
9052=for apidoc sv_vcatpvf
9053
9054Processes its arguments like C<vsprintf> and appends the formatted output
9055to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
9056
9057Usually used via its frontend C<sv_catpvf>.
9058
9059=cut
9060*/
645c22ef 9061
ef50df4b 9062void
c5be433b
GS
9063Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
9064{
9065 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
9066}
9067
954c1994
GS
9068/*
9069=for apidoc sv_catpvf_mg
9070
9071Like C<sv_catpvf>, but also handles 'set' magic.
9072
9073=cut
9074*/
9075
c5be433b 9076void
864dbfa3 9077Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
9078{
9079 va_list args;
ef50df4b 9080 va_start(args, pat);
c5be433b 9081 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 9082 va_end(args);
c5be433b
GS
9083}
9084
bffc3d17
SH
9085/*
9086=for apidoc sv_vcatpvf_mg
9087
9088Like C<sv_vcatpvf>, but also handles 'set' magic.
9089
9090Usually used via its frontend C<sv_catpvf_mg>.
9091
9092=cut
9093*/
645c22ef 9094
c5be433b
GS
9095void
9096Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
9097{
9098 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
9099 SvSETMAGIC(sv);
9100}
9101
954c1994
GS
9102/*
9103=for apidoc sv_vsetpvfn
9104
bffc3d17 9105Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
9106appending it.
9107
bffc3d17 9108Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 9109
954c1994
GS
9110=cut
9111*/
9112
46fc3d4c 9113void
7d5ea4e7 9114Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 9115{
9116 sv_setpvn(sv, "", 0);
7d5ea4e7 9117 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 9118}
9119
645c22ef
DM
9120/* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
9121
2d00ba3b 9122STATIC I32
9dd79c3f 9123S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
9124{
9125 I32 var = 0;
9126 switch (**pattern) {
9127 case '1': case '2': case '3':
9128 case '4': case '5': case '6':
9129 case '7': case '8': case '9':
9130 while (isDIGIT(**pattern))
9131 var = var * 10 + (*(*pattern)++ - '0');
9132 }
9133 return var;
9134}
9dd79c3f 9135#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 9136
4151a5fe
IZ
9137static char *
9138F0convert(NV nv, char *endbuf, STRLEN *len)
9139{
9140 int neg = nv < 0;
9141 UV uv;
9142 char *p = endbuf;
9143
9144 if (neg)
9145 nv = -nv;
9146 if (nv < UV_MAX) {
9147 nv += 0.5;
028f8eaa 9148 uv = (UV)nv;
4151a5fe
IZ
9149 if (uv & 1 && uv == nv)
9150 uv--; /* Round to even */
9151 do {
9152 unsigned dig = uv % 10;
9153 *--p = '0' + dig;
9154 } while (uv /= 10);
9155 if (neg)
9156 *--p = '-';
9157 *len = endbuf - p;
9158 return p;
9159 }
9160 return Nullch;
9161}
9162
9163
954c1994
GS
9164/*
9165=for apidoc sv_vcatpvfn
9166
9167Processes its arguments like C<vsprintf> and appends the formatted output
9168to an SV. Uses an array of SVs if the C style variable argument list is
9169missing (NULL). When running with taint checks enabled, indicates via
9170C<maybe_tainted> if results are untrustworthy (often due to the use of
9171locales).
9172
bffc3d17 9173Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 9174
954c1994
GS
9175=cut
9176*/
9177
1ef29b0e
RGS
9178/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
9179
46fc3d4c 9180void
7d5ea4e7 9181Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 9182{
9183 char *p;
9184 char *q;
9185 char *patend;
fc36a67e 9186 STRLEN origlen;
46fc3d4c 9187 I32 svix = 0;
c635e13b 9188 static char nullstr[] = "(null)";
9c5ffd7c 9189 SV *argsv = Nullsv;
db79b45b
JH
9190 bool has_utf8; /* has the result utf8? */
9191 bool pat_utf8; /* the pattern is in utf8? */
9192 SV *nsv = Nullsv;
4151a5fe
IZ
9193 /* Times 4: a decimal digit takes more than 3 binary digits.
9194 * NV_DIG: mantissa takes than many decimal digits.
9195 * Plus 32: Playing safe. */
9196 char ebuf[IV_DIG * 4 + NV_DIG + 32];
9197 /* large enough for "%#.#f" --chip */
9198 /* what about long double NVs? --jhi */
db79b45b
JH
9199
9200 has_utf8 = pat_utf8 = DO_UTF8(sv);
46fc3d4c 9201
9202 /* no matter what, this is a string now */
fc36a67e 9203 (void)SvPV_force(sv, origlen);
46fc3d4c 9204
fc36a67e 9205 /* special-case "", "%s", and "%_" */
46fc3d4c 9206 if (patlen == 0)
9207 return;
fc36a67e 9208 if (patlen == 2 && pat[0] == '%') {
9209 switch (pat[1]) {
9210 case 's':
c635e13b 9211 if (args) {
73d840c0 9212 const char *s = va_arg(*args, char*);
c635e13b 9213 sv_catpv(sv, s ? s : nullstr);
9214 }
7e2040f0 9215 else if (svix < svmax) {
fc36a67e 9216 sv_catsv(sv, *svargs);
7e2040f0
GS
9217 if (DO_UTF8(*svargs))
9218 SvUTF8_on(sv);
9219 }
fc36a67e 9220 return;
9221 case '_':
9222 if (args) {
7e2040f0
GS
9223 argsv = va_arg(*args, SV*);
9224 sv_catsv(sv, argsv);
9225 if (DO_UTF8(argsv))
9226 SvUTF8_on(sv);
fc36a67e 9227 return;
9228 }
9229 /* See comment on '_' below */
9230 break;
9231 }
46fc3d4c 9232 }
9233
1d917b39 9234#ifndef USE_LONG_DOUBLE
4151a5fe
IZ
9235 /* special-case "%.<number>[gf]" */
9236 if ( patlen <= 5 && pat[0] == '%' && pat[1] == '.'
9237 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
9238 unsigned digits = 0;
9239 const char *pp;
9240
9241 pp = pat + 2;
9242 while (*pp >= '0' && *pp <= '9')
9243 digits = 10 * digits + (*pp++ - '0');
028f8eaa 9244 if (pp - pat == (int)patlen - 1) {
4151a5fe
IZ
9245 NV nv;
9246
9247 if (args)
9248 nv = (NV)va_arg(*args, double);
9249 else if (svix < svmax)
9250 nv = SvNV(*svargs);
9251 else
9252 return;
9253 if (*pp == 'g') {
2873255c
NC
9254 /* Add check for digits != 0 because it seems that some
9255 gconverts are buggy in this case, and we don't yet have
9256 a Configure test for this. */
9257 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
9258 /* 0, point, slack */
2e59c212 9259 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
9260 sv_catpv(sv, ebuf);
9261 if (*ebuf) /* May return an empty string for digits==0 */
9262 return;
9263 }
9264 } else if (!digits) {
9265 STRLEN l;
9266
9267 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
9268 sv_catpvn(sv, p, l);
9269 return;
9270 }
9271 }
9272 }
9273 }
1d917b39 9274#endif /* !USE_LONG_DOUBLE */
4151a5fe 9275
2cf2cfc6 9276 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 9277 has_utf8 = TRUE;
2cf2cfc6 9278
46fc3d4c 9279 patend = (char*)pat + patlen;
9280 for (p = (char*)pat; p < patend; p = q) {
9281 bool alt = FALSE;
9282 bool left = FALSE;
b22c7a20 9283 bool vectorize = FALSE;
211dfcf1 9284 bool vectorarg = FALSE;
2cf2cfc6 9285 bool vec_utf8 = FALSE;
46fc3d4c 9286 char fill = ' ';
9287 char plus = 0;
9288 char intsize = 0;
9289 STRLEN width = 0;
fc36a67e 9290 STRLEN zeros = 0;
46fc3d4c 9291 bool has_precis = FALSE;
9292 STRLEN precis = 0;
58e33a90 9293 I32 osvix = svix;
2cf2cfc6 9294 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
9295#ifdef HAS_LDBL_SPRINTF_BUG
9296 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 9297 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
9298 bool fix_ldbl_sprintf_bug = FALSE;
9299#endif
205f51d8 9300
46fc3d4c 9301 char esignbuf[4];
89ebb4a3 9302 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 9303 STRLEN esignlen = 0;
9304
9305 char *eptr = Nullch;
fc36a67e 9306 STRLEN elen = 0;
81f715da 9307 SV *vecsv = Nullsv;
a05b299f 9308 U8 *vecstr = Null(U8*);
b22c7a20 9309 STRLEN veclen = 0;
934abaf1 9310 char c = 0;
46fc3d4c 9311 int i;
9c5ffd7c 9312 unsigned base = 0;
8c8eb53c
RB
9313 IV iv = 0;
9314 UV uv = 0;
9e5b023a
JH
9315 /* we need a long double target in case HAS_LONG_DOUBLE but
9316 not USE_LONG_DOUBLE
9317 */
35fff930 9318#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
9319 long double nv;
9320#else
65202027 9321 NV nv;
9e5b023a 9322#endif
46fc3d4c 9323 STRLEN have;
9324 STRLEN need;
9325 STRLEN gap;
e1ec3a88 9326 const char *dotstr = ".";
b22c7a20 9327 STRLEN dotstrlen = 1;
211dfcf1 9328 I32 efix = 0; /* explicit format parameter index */
eb3fce90 9329 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
9330 I32 epix = 0; /* explicit precision index */
9331 I32 evix = 0; /* explicit vector index */
eb3fce90 9332 bool asterisk = FALSE;
46fc3d4c 9333
211dfcf1 9334 /* echo everything up to the next format specification */
46fc3d4c 9335 for (q = p; q < patend && *q != '%'; ++q) ;
9336 if (q > p) {
db79b45b
JH
9337 if (has_utf8 && !pat_utf8)
9338 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
9339 else
9340 sv_catpvn(sv, p, q - p);
46fc3d4c 9341 p = q;
9342 }
9343 if (q++ >= patend)
9344 break;
9345
211dfcf1
HS
9346/*
9347 We allow format specification elements in this order:
9348 \d+\$ explicit format parameter index
9349 [-+ 0#]+ flags
a472f209 9350 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 9351 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
9352 \d+|\*(\d+\$)? width using optional (optionally specified) arg
9353 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
9354 [hlqLV] size
9355 [%bcdefginopsux_DFOUX] format (mandatory)
9356*/
9357 if (EXPECT_NUMBER(q, width)) {
9358 if (*q == '$') {
9359 ++q;
9360 efix = width;
9361 } else {
9362 goto gotwidth;
9363 }
9364 }
9365
fc36a67e 9366 /* FLAGS */
9367
46fc3d4c 9368 while (*q) {
9369 switch (*q) {
9370 case ' ':
9371 case '+':
9372 plus = *q++;
9373 continue;
9374
9375 case '-':
9376 left = TRUE;
9377 q++;
9378 continue;
9379
9380 case '0':
9381 fill = *q++;
9382 continue;
9383
9384 case '#':
9385 alt = TRUE;
9386 q++;
9387 continue;
9388
fc36a67e 9389 default:
9390 break;
9391 }
9392 break;
9393 }
46fc3d4c 9394
211dfcf1 9395 tryasterisk:
eb3fce90 9396 if (*q == '*') {
211dfcf1
HS
9397 q++;
9398 if (EXPECT_NUMBER(q, ewix))
9399 if (*q++ != '$')
9400 goto unknown;
eb3fce90 9401 asterisk = TRUE;
211dfcf1
HS
9402 }
9403 if (*q == 'v') {
eb3fce90 9404 q++;
211dfcf1
HS
9405 if (vectorize)
9406 goto unknown;
9cbac4c7 9407 if ((vectorarg = asterisk)) {
211dfcf1
HS
9408 evix = ewix;
9409 ewix = 0;
9410 asterisk = FALSE;
9411 }
9412 vectorize = TRUE;
9413 goto tryasterisk;
eb3fce90
JH
9414 }
9415
211dfcf1 9416 if (!asterisk)
7a5fa8a2 9417 if( *q == '0' )
f3583277 9418 fill = *q++;
211dfcf1
HS
9419 EXPECT_NUMBER(q, width);
9420
9421 if (vectorize) {
9422 if (vectorarg) {
9423 if (args)
9424 vecsv = va_arg(*args, SV*);
9425 else
9426 vecsv = (evix ? evix <= svmax : svix < svmax) ?
3a7a539e 9427 svargs[evix ? evix-1 : svix++] : &PL_sv_undef;
4459522c 9428 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1 9429 if (DO_UTF8(vecsv))
2cf2cfc6 9430 is_utf8 = TRUE;
211dfcf1
HS
9431 }
9432 if (args) {
9433 vecsv = va_arg(*args, SV*);
9434 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 9435 vec_utf8 = DO_UTF8(vecsv);
eb3fce90 9436 }
211dfcf1
HS
9437 else if (efix ? efix <= svmax : svix < svmax) {
9438 vecsv = svargs[efix ? efix-1 : svix++];
9439 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 9440 vec_utf8 = DO_UTF8(vecsv);
d7aa5382
JP
9441 /* if this is a version object, we need to return the
9442 * stringified representation (which the SvPVX has
9443 * already done for us), but not vectorize the args
9444 */
9445 if ( *q == 'd' && sv_derived_from(vecsv,"version") )
9446 {
9447 q++; /* skip past the rest of the %vd format */
da6068d9 9448 eptr = (char *) vecstr;
d7aa5382
JP
9449 elen = strlen(eptr);
9450 vectorize=FALSE;
9451 goto string;
9452 }
211dfcf1
HS
9453 }
9454 else {
9455 vecstr = (U8*)"";
9456 veclen = 0;
9457 }
eb3fce90 9458 }
fc36a67e 9459
eb3fce90 9460 if (asterisk) {
fc36a67e 9461 if (args)
9462 i = va_arg(*args, int);
9463 else
eb3fce90
JH
9464 i = (ewix ? ewix <= svmax : svix < svmax) ?
9465 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 9466 left |= (i < 0);
9467 width = (i < 0) ? -i : i;
fc36a67e 9468 }
211dfcf1 9469 gotwidth:
fc36a67e 9470
9471 /* PRECISION */
46fc3d4c 9472
fc36a67e 9473 if (*q == '.') {
9474 q++;
9475 if (*q == '*') {
211dfcf1 9476 q++;
7b8dd722
HS
9477 if (EXPECT_NUMBER(q, epix) && *q++ != '$')
9478 goto unknown;
9479 /* XXX: todo, support specified precision parameter */
9480 if (epix)
211dfcf1 9481 goto unknown;
46fc3d4c 9482 if (args)
9483 i = va_arg(*args, int);
9484 else
eb3fce90
JH
9485 i = (ewix ? ewix <= svmax : svix < svmax)
9486 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 9487 precis = (i < 0) ? 0 : i;
fc36a67e 9488 }
9489 else {
9490 precis = 0;
9491 while (isDIGIT(*q))
9492 precis = precis * 10 + (*q++ - '0');
9493 }
9494 has_precis = TRUE;
9495 }
46fc3d4c 9496
fc36a67e 9497 /* SIZE */
46fc3d4c 9498
fc36a67e 9499 switch (*q) {
c623ac67
GS
9500#ifdef WIN32
9501 case 'I': /* Ix, I32x, and I64x */
9502# ifdef WIN64
9503 if (q[1] == '6' && q[2] == '4') {
9504 q += 3;
9505 intsize = 'q';
9506 break;
9507 }
9508# endif
9509 if (q[1] == '3' && q[2] == '2') {
9510 q += 3;
9511 break;
9512 }
9513# ifdef WIN64
9514 intsize = 'q';
9515# endif
9516 q++;
9517 break;
9518#endif
9e5b023a 9519#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 9520 case 'L': /* Ld */
e5c81feb 9521 /* FALL THROUGH */
e5c81feb 9522#ifdef HAS_QUAD
6f9bb7fd 9523 case 'q': /* qd */
9e5b023a 9524#endif
6f9bb7fd
GS
9525 intsize = 'q';
9526 q++;
9527 break;
9528#endif
fc36a67e 9529 case 'l':
9e5b023a 9530#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 9531 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 9532 intsize = 'q';
9533 q += 2;
46fc3d4c 9534 break;
cf2093f6 9535 }
fc36a67e 9536#endif
6f9bb7fd 9537 /* FALL THROUGH */
fc36a67e 9538 case 'h':
cf2093f6 9539 /* FALL THROUGH */
fc36a67e 9540 case 'V':
9541 intsize = *q++;
46fc3d4c 9542 break;
9543 }
9544
fc36a67e 9545 /* CONVERSION */
9546
211dfcf1
HS
9547 if (*q == '%') {
9548 eptr = q++;
9549 elen = 1;
9550 goto string;
9551 }
9552
be75b157
HS
9553 if (vectorize)
9554 argsv = vecsv;
9555 else if (!args)
211dfcf1
HS
9556 argsv = (efix ? efix <= svmax : svix < svmax) ?
9557 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
9558
46fc3d4c 9559 switch (c = *q++) {
9560
9561 /* STRINGS */
9562
46fc3d4c 9563 case 'c':
be75b157 9564 uv = (args && !vectorize) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
9565 if ((uv > 255 ||
9566 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 9567 && !IN_BYTES) {
dfe13c55 9568 eptr = (char*)utf8buf;
9041c2e3 9569 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 9570 is_utf8 = TRUE;
7e2040f0
GS
9571 }
9572 else {
9573 c = (char)uv;
9574 eptr = &c;
9575 elen = 1;
a0ed51b3 9576 }
46fc3d4c 9577 goto string;
9578
46fc3d4c 9579 case 's':
be75b157 9580 if (args && !vectorize) {
fc36a67e 9581 eptr = va_arg(*args, char*);
c635e13b 9582 if (eptr)
1d7c1841
GS
9583#ifdef MACOS_TRADITIONAL
9584 /* On MacOS, %#s format is used for Pascal strings */
9585 if (alt)
9586 elen = *eptr++;
9587 else
9588#endif
c635e13b 9589 elen = strlen(eptr);
9590 else {
9591 eptr = nullstr;
9592 elen = sizeof nullstr - 1;
9593 }
46fc3d4c 9594 }
211dfcf1 9595 else {
7e2040f0
GS
9596 eptr = SvPVx(argsv, elen);
9597 if (DO_UTF8(argsv)) {
a0ed51b3
LW
9598 if (has_precis && precis < elen) {
9599 I32 p = precis;
7e2040f0 9600 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
9601 precis = p;
9602 }
9603 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 9604 width += elen - sv_len_utf8(argsv);
a0ed51b3 9605 }
2cf2cfc6 9606 is_utf8 = TRUE;
a0ed51b3
LW
9607 }
9608 }
46fc3d4c 9609 goto string;
9610
fc36a67e 9611 case '_':
5df617be
RB
9612#ifdef CHECK_FORMAT
9613 format_sv:
9614#endif
fc36a67e 9615 /*
9616 * The "%_" hack might have to be changed someday,
9617 * if ISO or ANSI decide to use '_' for something.
9618 * So we keep it hidden from users' code.
9619 */
be75b157 9620 if (!args || vectorize)
fc36a67e 9621 goto unknown;
211dfcf1 9622 argsv = va_arg(*args, SV*);
7e2040f0
GS
9623 eptr = SvPVx(argsv, elen);
9624 if (DO_UTF8(argsv))
2cf2cfc6 9625 is_utf8 = TRUE;
fc36a67e 9626
46fc3d4c 9627 string:
b22c7a20 9628 vectorize = FALSE;
46fc3d4c 9629 if (has_precis && elen > precis)
9630 elen = precis;
9631 break;
9632
9633 /* INTEGERS */
9634
fc36a67e 9635 case 'p':
5df617be
RB
9636#ifdef CHECK_FORMAT
9637 if (left) {
9638 left = FALSE;
57f5baf2
RB
9639 if (!width)
9640 goto format_sv; /* %-p -> %_ */
57f5baf2
RB
9641 precis = width;
9642 has_precis = TRUE;
9643 width = 0;
9644 goto format_sv; /* %-Np -> %.N_ */
5df617be
RB
9645 }
9646#endif
be75b157 9647 if (alt || vectorize)
c2e66d9e 9648 goto unknown;
211dfcf1 9649 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 9650 base = 16;
9651 goto integer;
9652
46fc3d4c 9653 case 'D':
29fe7a80 9654#ifdef IV_IS_QUAD
22f3ae8c 9655 intsize = 'q';
29fe7a80 9656#else
46fc3d4c 9657 intsize = 'l';
29fe7a80 9658#endif
46fc3d4c 9659 /* FALL THROUGH */
9660 case 'd':
9661 case 'i':
b22c7a20 9662 if (vectorize) {
ba210ebe 9663 STRLEN ulen;
211dfcf1
HS
9664 if (!veclen)
9665 continue;
2cf2cfc6
A
9666 if (vec_utf8)
9667 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9668 UTF8_ALLOW_ANYUV);
b22c7a20 9669 else {
e83d50c9 9670 uv = *vecstr;
b22c7a20
GS
9671 ulen = 1;
9672 }
9673 vecstr += ulen;
9674 veclen -= ulen;
e83d50c9
JP
9675 if (plus)
9676 esignbuf[esignlen++] = plus;
b22c7a20
GS
9677 }
9678 else if (args) {
46fc3d4c 9679 switch (intsize) {
9680 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 9681 case 'l': iv = va_arg(*args, long); break;
fc36a67e 9682 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 9683 default: iv = va_arg(*args, int); break;
cf2093f6
JH
9684#ifdef HAS_QUAD
9685 case 'q': iv = va_arg(*args, Quad_t); break;
9686#endif
46fc3d4c 9687 }
9688 }
9689 else {
b10c0dba 9690 IV tiv = SvIVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 9691 switch (intsize) {
b10c0dba
MHM
9692 case 'h': iv = (short)tiv; break;
9693 case 'l': iv = (long)tiv; break;
9694 case 'V':
9695 default: iv = tiv; break;
cf2093f6 9696#ifdef HAS_QUAD
b10c0dba 9697 case 'q': iv = (Quad_t)tiv; break;
cf2093f6 9698#endif
46fc3d4c 9699 }
9700 }
e83d50c9
JP
9701 if ( !vectorize ) /* we already set uv above */
9702 {
9703 if (iv >= 0) {
9704 uv = iv;
9705 if (plus)
9706 esignbuf[esignlen++] = plus;
9707 }
9708 else {
9709 uv = -iv;
9710 esignbuf[esignlen++] = '-';
9711 }
46fc3d4c 9712 }
9713 base = 10;
9714 goto integer;
9715
fc36a67e 9716 case 'U':
29fe7a80 9717#ifdef IV_IS_QUAD
22f3ae8c 9718 intsize = 'q';
29fe7a80 9719#else
fc36a67e 9720 intsize = 'l';
29fe7a80 9721#endif
fc36a67e 9722 /* FALL THROUGH */
9723 case 'u':
9724 base = 10;
9725 goto uns_integer;
9726
4f19785b
WSI
9727 case 'b':
9728 base = 2;
9729 goto uns_integer;
9730
46fc3d4c 9731 case 'O':
29fe7a80 9732#ifdef IV_IS_QUAD
22f3ae8c 9733 intsize = 'q';
29fe7a80 9734#else
46fc3d4c 9735 intsize = 'l';
29fe7a80 9736#endif
46fc3d4c 9737 /* FALL THROUGH */
9738 case 'o':
9739 base = 8;
9740 goto uns_integer;
9741
9742 case 'X':
46fc3d4c 9743 case 'x':
9744 base = 16;
46fc3d4c 9745
9746 uns_integer:
b22c7a20 9747 if (vectorize) {
ba210ebe 9748 STRLEN ulen;
b22c7a20 9749 vector:
211dfcf1
HS
9750 if (!veclen)
9751 continue;
2cf2cfc6
A
9752 if (vec_utf8)
9753 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9754 UTF8_ALLOW_ANYUV);
b22c7a20 9755 else {
a05b299f 9756 uv = *vecstr;
b22c7a20
GS
9757 ulen = 1;
9758 }
9759 vecstr += ulen;
9760 veclen -= ulen;
9761 }
9762 else if (args) {
46fc3d4c 9763 switch (intsize) {
9764 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 9765 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 9766 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 9767 default: uv = va_arg(*args, unsigned); break;
cf2093f6 9768#ifdef HAS_QUAD
9e3321a5 9769 case 'q': uv = va_arg(*args, Uquad_t); break;
cf2093f6 9770#endif
46fc3d4c 9771 }
9772 }
9773 else {
b10c0dba 9774 UV tuv = SvUVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 9775 switch (intsize) {
b10c0dba
MHM
9776 case 'h': uv = (unsigned short)tuv; break;
9777 case 'l': uv = (unsigned long)tuv; break;
9778 case 'V':
9779 default: uv = tuv; break;
cf2093f6 9780#ifdef HAS_QUAD
b10c0dba 9781 case 'q': uv = (Uquad_t)tuv; break;
cf2093f6 9782#endif
46fc3d4c 9783 }
9784 }
9785
9786 integer:
46fc3d4c 9787 eptr = ebuf + sizeof ebuf;
fc36a67e 9788 switch (base) {
9789 unsigned dig;
9790 case 16:
c10ed8b9
HS
9791 if (!uv)
9792 alt = FALSE;
1d7c1841
GS
9793 p = (char*)((c == 'X')
9794 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 9795 do {
9796 dig = uv & 15;
9797 *--eptr = p[dig];
9798 } while (uv >>= 4);
9799 if (alt) {
46fc3d4c 9800 esignbuf[esignlen++] = '0';
fc36a67e 9801 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 9802 }
fc36a67e 9803 break;
9804 case 8:
9805 do {
9806 dig = uv & 7;
9807 *--eptr = '0' + dig;
9808 } while (uv >>= 3);
9809 if (alt && *eptr != '0')
9810 *--eptr = '0';
9811 break;
4f19785b
WSI
9812 case 2:
9813 do {
9814 dig = uv & 1;
9815 *--eptr = '0' + dig;
9816 } while (uv >>= 1);
eda88b6d
JH
9817 if (alt) {
9818 esignbuf[esignlen++] = '0';
7481bb52 9819 esignbuf[esignlen++] = 'b';
eda88b6d 9820 }
4f19785b 9821 break;
fc36a67e 9822 default: /* it had better be ten or less */
6bc102ca 9823#if defined(PERL_Y2KWARN)
e476b1b5 9824 if (ckWARN(WARN_Y2K)) {
6bc102ca
GS
9825 STRLEN n;
9826 char *s = SvPV(sv,n);
9827 if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
9828 && (n == 2 || !isDIGIT(s[n-3])))
9829 {
9014280d 9830 Perl_warner(aTHX_ packWARN(WARN_Y2K),
6bc102ca
GS
9831 "Possible Y2K bug: %%%c %s",
9832 c, "format string following '19'");
9833 }
9834 }
9835#endif
fc36a67e 9836 do {
9837 dig = uv % base;
9838 *--eptr = '0' + dig;
9839 } while (uv /= base);
9840 break;
46fc3d4c 9841 }
9842 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
9843 if (has_precis) {
9844 if (precis > elen)
9845 zeros = precis - elen;
9846 else if (precis == 0 && elen == 1 && *eptr == '0')
9847 elen = 0;
9848 }
46fc3d4c 9849 break;
9850
9851 /* FLOATING POINT */
9852
fc36a67e 9853 case 'F':
9854 c = 'f'; /* maybe %F isn't supported here */
9855 /* FALL THROUGH */
46fc3d4c 9856 case 'e': case 'E':
fc36a67e 9857 case 'f':
46fc3d4c 9858 case 'g': case 'G':
9859
9860 /* This is evil, but floating point is even more evil */
9861
9e5b023a
JH
9862 /* for SV-style calling, we can only get NV
9863 for C-style calling, we assume %f is double;
9864 for simplicity we allow any of %Lf, %llf, %qf for long double
9865 */
9866 switch (intsize) {
9867 case 'V':
9868#if defined(USE_LONG_DOUBLE)
9869 intsize = 'q';
9870#endif
9871 break;
8a2e3f14 9872/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364
HS
9873 case 'l':
9874 /* FALL THROUGH */
9e5b023a
JH
9875 default:
9876#if defined(USE_LONG_DOUBLE)
9877 intsize = args ? 0 : 'q';
9878#endif
9879 break;
9880 case 'q':
9881#if defined(HAS_LONG_DOUBLE)
9882 break;
9883#else
9884 /* FALL THROUGH */
9885#endif
9886 case 'h':
9e5b023a
JH
9887 goto unknown;
9888 }
9889
9890 /* now we need (long double) if intsize == 'q', else (double) */
be75b157 9891 nv = (args && !vectorize) ?
35fff930
JH
9892#if LONG_DOUBLESIZE > DOUBLESIZE
9893 intsize == 'q' ?
205f51d8
AS
9894 va_arg(*args, long double) :
9895 va_arg(*args, double)
35fff930 9896#else
205f51d8 9897 va_arg(*args, double)
35fff930 9898#endif
9e5b023a 9899 : SvNVx(argsv);
fc36a67e 9900
9901 need = 0;
be75b157 9902 vectorize = FALSE;
fc36a67e 9903 if (c != 'e' && c != 'E') {
9904 i = PERL_INT_MIN;
9e5b023a
JH
9905 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9906 will cast our (long double) to (double) */
73b309ea 9907 (void)Perl_frexp(nv, &i);
fc36a67e 9908 if (i == PERL_INT_MIN)
cea2e8a9 9909 Perl_die(aTHX_ "panic: frexp");
c635e13b 9910 if (i > 0)
fc36a67e 9911 need = BIT_DIGITS(i);
9912 }
9913 need += has_precis ? precis : 6; /* known default */
20f6aaab 9914
fc36a67e 9915 if (need < width)
9916 need = width;
9917
20f6aaab
AS
9918#ifdef HAS_LDBL_SPRINTF_BUG
9919 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9920 with sfio - Allen <allens@cpan.org> */
9921
9922# ifdef DBL_MAX
9923# define MY_DBL_MAX DBL_MAX
9924# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9925# if DOUBLESIZE >= 8
9926# define MY_DBL_MAX 1.7976931348623157E+308L
9927# else
9928# define MY_DBL_MAX 3.40282347E+38L
9929# endif
9930# endif
9931
9932# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9933# define MY_DBL_MAX_BUG 1L
20f6aaab 9934# else
205f51d8 9935# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9936# endif
20f6aaab 9937
205f51d8
AS
9938# ifdef DBL_MIN
9939# define MY_DBL_MIN DBL_MIN
9940# else /* XXX guessing! -Allen */
9941# if DOUBLESIZE >= 8
9942# define MY_DBL_MIN 2.2250738585072014E-308L
9943# else
9944# define MY_DBL_MIN 1.17549435E-38L
9945# endif
9946# endif
20f6aaab 9947
205f51d8
AS
9948 if ((intsize == 'q') && (c == 'f') &&
9949 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9950 (need < DBL_DIG)) {
9951 /* it's going to be short enough that
9952 * long double precision is not needed */
9953
9954 if ((nv <= 0L) && (nv >= -0L))
9955 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9956 else {
9957 /* would use Perl_fp_class as a double-check but not
9958 * functional on IRIX - see perl.h comments */
9959
9960 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9961 /* It's within the range that a double can represent */
9962#if defined(DBL_MAX) && !defined(DBL_MIN)
9963 if ((nv >= ((long double)1/DBL_MAX)) ||
9964 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9965#endif
205f51d8 9966 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9967 }
205f51d8
AS
9968 }
9969 if (fix_ldbl_sprintf_bug == TRUE) {
9970 double temp;
9971
9972 intsize = 0;
9973 temp = (double)nv;
9974 nv = (NV)temp;
9975 }
20f6aaab 9976 }
205f51d8
AS
9977
9978# undef MY_DBL_MAX
9979# undef MY_DBL_MAX_BUG
9980# undef MY_DBL_MIN
9981
20f6aaab
AS
9982#endif /* HAS_LDBL_SPRINTF_BUG */
9983
46fc3d4c 9984 need += 20; /* fudge factor */
80252599
GS
9985 if (PL_efloatsize < need) {
9986 Safefree(PL_efloatbuf);
9987 PL_efloatsize = need + 20; /* more fudge */
9988 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9989 PL_efloatbuf[0] = '\0';
46fc3d4c 9990 }
9991
4151a5fe
IZ
9992 if ( !(width || left || plus || alt) && fill != '0'
9993 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
9994 /* See earlier comment about buggy Gconvert when digits,
9995 aka precis is 0 */
9996 if ( c == 'g' && precis) {
2e59c212 9997 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4151a5fe
IZ
9998 if (*PL_efloatbuf) /* May return an empty string for digits==0 */
9999 goto float_converted;
10000 } else if ( c == 'f' && !precis) {
10001 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
10002 break;
10003 }
10004 }
46fc3d4c 10005 eptr = ebuf + sizeof ebuf;
10006 *--eptr = '\0';
10007 *--eptr = c;
9e5b023a
JH
10008 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
10009#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
10010 if (intsize == 'q') {
e5c81feb
JH
10011 /* Copy the one or more characters in a long double
10012 * format before the 'base' ([efgEFG]) character to
10013 * the format string. */
10014 static char const prifldbl[] = PERL_PRIfldbl;
10015 char const *p = prifldbl + sizeof(prifldbl) - 3;
10016 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 10017 }
65202027 10018#endif
46fc3d4c 10019 if (has_precis) {
10020 base = precis;
10021 do { *--eptr = '0' + (base % 10); } while (base /= 10);
10022 *--eptr = '.';
10023 }
10024 if (width) {
10025 base = width;
10026 do { *--eptr = '0' + (base % 10); } while (base /= 10);
10027 }
10028 if (fill == '0')
10029 *--eptr = fill;
84902520
TB
10030 if (left)
10031 *--eptr = '-';
46fc3d4c 10032 if (plus)
10033 *--eptr = plus;
10034 if (alt)
10035 *--eptr = '#';
10036 *--eptr = '%';
10037
ff9121f8
JH
10038 /* No taint. Otherwise we are in the strange situation
10039 * where printf() taints but print($float) doesn't.
bda0f7a5 10040 * --jhi */
9e5b023a
JH
10041#if defined(HAS_LONG_DOUBLE)
10042 if (intsize == 'q')
10043 (void)sprintf(PL_efloatbuf, eptr, nv);
10044 else
10045 (void)sprintf(PL_efloatbuf, eptr, (double)nv);
10046#else
dd8482fc 10047 (void)sprintf(PL_efloatbuf, eptr, nv);
9e5b023a 10048#endif
4151a5fe 10049 float_converted:
80252599
GS
10050 eptr = PL_efloatbuf;
10051 elen = strlen(PL_efloatbuf);
46fc3d4c 10052 break;
10053
fc36a67e 10054 /* SPECIAL */
10055
10056 case 'n':
10057 i = SvCUR(sv) - origlen;
be75b157 10058 if (args && !vectorize) {
c635e13b 10059 switch (intsize) {
10060 case 'h': *(va_arg(*args, short*)) = i; break;
10061 default: *(va_arg(*args, int*)) = i; break;
10062 case 'l': *(va_arg(*args, long*)) = i; break;
10063 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
10064#ifdef HAS_QUAD
10065 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
10066#endif
c635e13b 10067 }
fc36a67e 10068 }
9dd79c3f 10069 else
211dfcf1 10070 sv_setuv_mg(argsv, (UV)i);
be75b157 10071 vectorize = FALSE;
fc36a67e 10072 continue; /* not "break" */
10073
10074 /* UNKNOWN */
10075
46fc3d4c 10076 default:
fc36a67e 10077 unknown:
599cee73 10078 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 10079 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 10080 SV *msg = sv_newmortal();
35c1215d
NC
10081 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
10082 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 10083 if (c) {
0f4b6630 10084 if (isPRINT(c))
1c846c1f 10085 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
10086 "\"%%%c\"", c & 0xFF);
10087 else
10088 Perl_sv_catpvf(aTHX_ msg,
57def98f 10089 "\"%%\\%03"UVof"\"",
0f4b6630 10090 (UV)c & 0xFF);
0f4b6630 10091 } else
c635e13b 10092 sv_catpv(msg, "end of string");
9014280d 10093 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 10094 }
fb73857a 10095
10096 /* output mangled stuff ... */
10097 if (c == '\0')
10098 --q;
46fc3d4c 10099 eptr = p;
10100 elen = q - p;
fb73857a 10101
10102 /* ... right here, because formatting flags should not apply */
10103 SvGROW(sv, SvCUR(sv) + elen + 1);
10104 p = SvEND(sv);
4459522c 10105 Copy(eptr, p, elen, char);
fb73857a 10106 p += elen;
10107 *p = '\0';
10108 SvCUR(sv) = p - SvPVX(sv);
58e33a90 10109 svix = osvix;
fb73857a 10110 continue; /* not "break" */
46fc3d4c 10111 }
10112
6c94ec8b
HS
10113 /* calculate width before utf8_upgrade changes it */
10114 have = esignlen + zeros + elen;
10115
d2876be5
JH
10116 if (is_utf8 != has_utf8) {
10117 if (is_utf8) {
10118 if (SvCUR(sv))
10119 sv_utf8_upgrade(sv);
10120 }
10121 else {
10122 SV *nsv = sv_2mortal(newSVpvn(eptr, elen));
10123 sv_utf8_upgrade(nsv);
10124 eptr = SvPVX(nsv);
10125 elen = SvCUR(nsv);
10126 }
10127 SvGROW(sv, SvCUR(sv) + elen + 1);
10128 p = SvEND(sv);
10129 *p = '\0';
10130 }
6af65485 10131
46fc3d4c 10132 need = (have > width ? have : width);
10133 gap = need - have;
10134
b22c7a20 10135 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 10136 p = SvEND(sv);
10137 if (esignlen && fill == '0') {
eb160463 10138 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10139 *p++ = esignbuf[i];
10140 }
10141 if (gap && !left) {
10142 memset(p, fill, gap);
10143 p += gap;
10144 }
10145 if (esignlen && fill != '0') {
eb160463 10146 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10147 *p++ = esignbuf[i];
10148 }
fc36a67e 10149 if (zeros) {
10150 for (i = zeros; i; i--)
10151 *p++ = '0';
10152 }
46fc3d4c 10153 if (elen) {
4459522c 10154 Copy(eptr, p, elen, char);
46fc3d4c 10155 p += elen;
10156 }
10157 if (gap && left) {
10158 memset(p, ' ', gap);
10159 p += gap;
10160 }
b22c7a20
GS
10161 if (vectorize) {
10162 if (veclen) {
4459522c 10163 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
10164 p += dotstrlen;
10165 }
10166 else
10167 vectorize = FALSE; /* done iterating over vecstr */
10168 }
2cf2cfc6
A
10169 if (is_utf8)
10170 has_utf8 = TRUE;
10171 if (has_utf8)
7e2040f0 10172 SvUTF8_on(sv);
46fc3d4c 10173 *p = '\0';
10174 SvCUR(sv) = p - SvPVX(sv);
b22c7a20
GS
10175 if (vectorize) {
10176 esignlen = 0;
10177 goto vector;
10178 }
46fc3d4c 10179 }
10180}
51371543 10181
645c22ef
DM
10182/* =========================================================================
10183
10184=head1 Cloning an interpreter
10185
10186All the macros and functions in this section are for the private use of
10187the main function, perl_clone().
10188
10189The foo_dup() functions make an exact copy of an existing foo thinngy.
10190During the course of a cloning, a hash table is used to map old addresses
10191to new addresses. The table is created and manipulated with the
10192ptr_table_* functions.
10193
10194=cut
10195
10196============================================================================*/
10197
10198
1d7c1841
GS
10199#if defined(USE_ITHREADS)
10200
1d7c1841
GS
10201#ifndef GpREFCNT_inc
10202# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
10203#endif
10204
10205
d2d73c3e
AB
10206#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
10207#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
10208#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10209#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
10210#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10211#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
10212#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10213#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
10214#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
10215#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
10216#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
10217#define SAVEPV(p) (p ? savepv(p) : Nullch)
10218#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 10219
d2d73c3e 10220
d2f185dc
AMS
10221/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
10222 regcomp.c. AMS 20010712 */
645c22ef 10223
1d7c1841 10224REGEXP *
a8fc9800 10225Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
1d7c1841 10226{
d2f185dc
AMS
10227 REGEXP *ret;
10228 int i, len, npar;
10229 struct reg_substr_datum *s;
10230
10231 if (!r)
10232 return (REGEXP *)NULL;
10233
10234 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
10235 return ret;
10236
10237 len = r->offsets[0];
10238 npar = r->nparens+1;
10239
10240 Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
10241 Copy(r->program, ret->program, len+1, regnode);
10242
10243 New(0, ret->startp, npar, I32);
10244 Copy(r->startp, ret->startp, npar, I32);
10245 New(0, ret->endp, npar, I32);
10246 Copy(r->startp, ret->startp, npar, I32);
10247
d2f185dc
AMS
10248 New(0, ret->substrs, 1, struct reg_substr_data);
10249 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
10250 s->min_offset = r->substrs->data[i].min_offset;
10251 s->max_offset = r->substrs->data[i].max_offset;
10252 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 10253 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
10254 }
10255
70612e96 10256 ret->regstclass = NULL;
d2f185dc
AMS
10257 if (r->data) {
10258 struct reg_data *d;
e1ec3a88 10259 const int count = r->data->count;
d2f185dc
AMS
10260
10261 Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
10262 char, struct reg_data);
10263 New(0, d->what, count, U8);
10264
10265 d->count = count;
10266 for (i = 0; i < count; i++) {
10267 d->what[i] = r->data->what[i];
10268 switch (d->what[i]) {
a3621e74
YO
10269 /* legal options are one of: sfpont
10270 see also regcomp.h and pregfree() */
d2f185dc
AMS
10271 case 's':
10272 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
10273 break;
10274 case 'p':
10275 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
10276 break;
10277 case 'f':
10278 /* This is cheating. */
10279 New(0, d->data[i], 1, struct regnode_charclass_class);
10280 StructCopy(r->data->data[i], d->data[i],
10281 struct regnode_charclass_class);
70612e96 10282 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
10283 break;
10284 case 'o':
33773810
AMS
10285 /* Compiled op trees are readonly, and can thus be
10286 shared without duplication. */
b34c0dd4 10287 OP_REFCNT_LOCK;
9b978d73 10288 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
b34c0dd4 10289 OP_REFCNT_UNLOCK;
9b978d73 10290 break;
d2f185dc
AMS
10291 case 'n':
10292 d->data[i] = r->data->data[i];
10293 break;
a3621e74
YO
10294 case 't':
10295 d->data[i] = r->data->data[i];
10296 OP_REFCNT_LOCK;
10297 ((reg_trie_data*)d->data[i])->refcount++;
10298 OP_REFCNT_UNLOCK;
10299 break;
10300 default:
10301 Perl_croak(aTHX_ "panic: re_dup unknown data code '%c'", r->data->what[i]);
d2f185dc
AMS
10302 }
10303 }
10304
10305 ret->data = d;
10306 }
10307 else
10308 ret->data = NULL;
10309
10310 New(0, ret->offsets, 2*len+1, U32);
10311 Copy(r->offsets, ret->offsets, 2*len+1, U32);
10312
e01c5899 10313 ret->precomp = SAVEPVN(r->precomp, r->prelen);
d2f185dc
AMS
10314 ret->refcnt = r->refcnt;
10315 ret->minlen = r->minlen;
10316 ret->prelen = r->prelen;
10317 ret->nparens = r->nparens;
10318 ret->lastparen = r->lastparen;
10319 ret->lastcloseparen = r->lastcloseparen;
10320 ret->reganch = r->reganch;
10321
70612e96
RG
10322 ret->sublen = r->sublen;
10323
10324 if (RX_MATCH_COPIED(ret))
e01c5899 10325 ret->subbeg = SAVEPVN(r->subbeg, r->sublen);
70612e96
RG
10326 else
10327 ret->subbeg = Nullch;
9a26048b
NC
10328#ifdef PERL_COPY_ON_WRITE
10329 ret->saved_copy = Nullsv;
10330#endif
70612e96 10331
d2f185dc
AMS
10332 ptr_table_store(PL_ptr_table, r, ret);
10333 return ret;
1d7c1841
GS
10334}
10335
d2d73c3e 10336/* duplicate a file handle */
645c22ef 10337
1d7c1841 10338PerlIO *
a8fc9800 10339Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
10340{
10341 PerlIO *ret;
73d840c0
AL
10342 (void)type;
10343
1d7c1841
GS
10344 if (!fp)
10345 return (PerlIO*)NULL;
10346
10347 /* look for it in the table first */
10348 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
10349 if (ret)
10350 return ret;
10351
10352 /* create anew and remember what it is */
ecdeb87c 10353 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
10354 ptr_table_store(PL_ptr_table, fp, ret);
10355 return ret;
10356}
10357
645c22ef
DM
10358/* duplicate a directory handle */
10359
1d7c1841
GS
10360DIR *
10361Perl_dirp_dup(pTHX_ DIR *dp)
10362{
10363 if (!dp)
10364 return (DIR*)NULL;
10365 /* XXX TODO */
10366 return dp;
10367}
10368
ff276b08 10369/* duplicate a typeglob */
645c22ef 10370
1d7c1841 10371GP *
a8fc9800 10372Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
10373{
10374 GP *ret;
10375 if (!gp)
10376 return (GP*)NULL;
10377 /* look for it in the table first */
10378 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
10379 if (ret)
10380 return ret;
10381
10382 /* create anew and remember what it is */
10383 Newz(0, ret, 1, GP);
10384 ptr_table_store(PL_ptr_table, gp, ret);
10385
10386 /* clone */
10387 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
10388 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
10389 ret->gp_io = io_dup_inc(gp->gp_io, param);
10390 ret->gp_form = cv_dup_inc(gp->gp_form, param);
10391 ret->gp_av = av_dup_inc(gp->gp_av, param);
10392 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
10393 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
10394 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
10395 ret->gp_cvgen = gp->gp_cvgen;
10396 ret->gp_flags = gp->gp_flags;
10397 ret->gp_line = gp->gp_line;
10398 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
10399 return ret;
10400}
10401
645c22ef
DM
10402/* duplicate a chain of magic */
10403
1d7c1841 10404MAGIC *
a8fc9800 10405Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 10406{
cb359b41
JH
10407 MAGIC *mgprev = (MAGIC*)NULL;
10408 MAGIC *mgret;
1d7c1841
GS
10409 if (!mg)
10410 return (MAGIC*)NULL;
10411 /* look for it in the table first */
10412 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
10413 if (mgret)
10414 return mgret;
10415
10416 for (; mg; mg = mg->mg_moremagic) {
10417 MAGIC *nmg;
10418 Newz(0, nmg, 1, MAGIC);
cb359b41 10419 if (mgprev)
1d7c1841 10420 mgprev->mg_moremagic = nmg;
cb359b41
JH
10421 else
10422 mgret = nmg;
1d7c1841
GS
10423 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
10424 nmg->mg_private = mg->mg_private;
10425 nmg->mg_type = mg->mg_type;
10426 nmg->mg_flags = mg->mg_flags;
14befaf4 10427 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 10428 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 10429 }
05bd4103 10430 else if(mg->mg_type == PERL_MAGIC_backref) {
7fc63493 10431 const AV * const av = (AV*) mg->mg_obj;
fdc9a813
AE
10432 SV **svp;
10433 I32 i;
7fc63493 10434 (void)SvREFCNT_inc(nmg->mg_obj = (SV*)newAV());
fdc9a813
AE
10435 svp = AvARRAY(av);
10436 for (i = AvFILLp(av); i >= 0; i--) {
3a81978b 10437 if (!svp[i]) continue;
fdc9a813
AE
10438 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
10439 }
05bd4103 10440 }
1d7c1841
GS
10441 else {
10442 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
10443 ? sv_dup_inc(mg->mg_obj, param)
10444 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
10445 }
10446 nmg->mg_len = mg->mg_len;
10447 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 10448 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 10449 if (mg->mg_len > 0) {
1d7c1841 10450 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
10451 if (mg->mg_type == PERL_MAGIC_overload_table &&
10452 AMT_AMAGIC((AMT*)mg->mg_ptr))
10453 {
1d7c1841
GS
10454 AMT *amtp = (AMT*)mg->mg_ptr;
10455 AMT *namtp = (AMT*)nmg->mg_ptr;
10456 I32 i;
10457 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 10458 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
10459 }
10460 }
10461 }
10462 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 10463 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 10464 }
68795e93
NIS
10465 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
10466 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
10467 }
1d7c1841
GS
10468 mgprev = nmg;
10469 }
10470 return mgret;
10471}
10472
645c22ef
DM
10473/* create a new pointer-mapping table */
10474
1d7c1841
GS
10475PTR_TBL_t *
10476Perl_ptr_table_new(pTHX)
10477{
10478 PTR_TBL_t *tbl;
10479 Newz(0, tbl, 1, PTR_TBL_t);
10480 tbl->tbl_max = 511;
10481 tbl->tbl_items = 0;
10482 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
10483 return tbl;
10484}
10485
134ca3d6
DM
10486#if (PTRSIZE == 8)
10487# define PTR_TABLE_HASH(ptr) (PTR2UV(ptr) >> 3)
10488#else
10489# define PTR_TABLE_HASH(ptr) (PTR2UV(ptr) >> 2)
10490#endif
10491
645c22ef
DM
10492/* map an existing pointer using a table */
10493
1d7c1841
GS
10494void *
10495Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
10496{
10497 PTR_TBL_ENT_t *tblent;
134ca3d6 10498 UV hash = PTR_TABLE_HASH(sv);
1d7c1841
GS
10499 assert(tbl);
10500 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
10501 for (; tblent; tblent = tblent->next) {
10502 if (tblent->oldval == sv)
10503 return tblent->newval;
10504 }
10505 return (void*)NULL;
10506}
10507
645c22ef
DM
10508/* add a new entry to a pointer-mapping table */
10509
1d7c1841
GS
10510void
10511Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
10512{
10513 PTR_TBL_ENT_t *tblent, **otblent;
10514 /* XXX this may be pessimal on platforms where pointers aren't good
10515 * hash values e.g. if they grow faster in the most significant
10516 * bits */
134ca3d6 10517 UV hash = PTR_TABLE_HASH(oldv);
14cade97 10518 bool empty = 1;
1d7c1841
GS
10519
10520 assert(tbl);
10521 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
14cade97 10522 for (tblent = *otblent; tblent; empty=0, tblent = tblent->next) {
1d7c1841
GS
10523 if (tblent->oldval == oldv) {
10524 tblent->newval = newv;
1d7c1841
GS
10525 return;
10526 }
10527 }
10528 Newz(0, tblent, 1, PTR_TBL_ENT_t);
10529 tblent->oldval = oldv;
10530 tblent->newval = newv;
10531 tblent->next = *otblent;
10532 *otblent = tblent;
10533 tbl->tbl_items++;
14cade97 10534 if (!empty && tbl->tbl_items > tbl->tbl_max)
1d7c1841
GS
10535 ptr_table_split(tbl);
10536}
10537
645c22ef
DM
10538/* double the hash bucket size of an existing ptr table */
10539
1d7c1841
GS
10540void
10541Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
10542{
10543 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
10544 UV oldsize = tbl->tbl_max + 1;
10545 UV newsize = oldsize * 2;
10546 UV i;
10547
10548 Renew(ary, newsize, PTR_TBL_ENT_t*);
10549 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
10550 tbl->tbl_max = --newsize;
10551 tbl->tbl_ary = ary;
10552 for (i=0; i < oldsize; i++, ary++) {
10553 PTR_TBL_ENT_t **curentp, **entp, *ent;
10554 if (!*ary)
10555 continue;
10556 curentp = ary + oldsize;
10557 for (entp = ary, ent = *ary; ent; ent = *entp) {
134ca3d6 10558 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
10559 *entp = ent->next;
10560 ent->next = *curentp;
10561 *curentp = ent;
10562 continue;
10563 }
10564 else
10565 entp = &ent->next;
10566 }
10567 }
10568}
10569
645c22ef
DM
10570/* remove all the entries from a ptr table */
10571
a0739874
DM
10572void
10573Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
10574{
10575 register PTR_TBL_ENT_t **array;
10576 register PTR_TBL_ENT_t *entry;
10577 register PTR_TBL_ENT_t *oentry = Null(PTR_TBL_ENT_t*);
10578 UV riter = 0;
10579 UV max;
10580
10581 if (!tbl || !tbl->tbl_items) {
10582 return;
10583 }
10584
10585 array = tbl->tbl_ary;
10586 entry = array[0];
10587 max = tbl->tbl_max;
10588
10589 for (;;) {
10590 if (entry) {
10591 oentry = entry;
10592 entry = entry->next;
10593 Safefree(oentry);
10594 }
10595 if (!entry) {
10596 if (++riter > max) {
10597 break;
10598 }
10599 entry = array[riter];
10600 }
10601 }
10602
10603 tbl->tbl_items = 0;
10604}
10605
645c22ef
DM
10606/* clear and free a ptr table */
10607
a0739874
DM
10608void
10609Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
10610{
10611 if (!tbl) {
10612 return;
10613 }
10614 ptr_table_clear(tbl);
10615 Safefree(tbl->tbl_ary);
10616 Safefree(tbl);
10617}
10618
1d7c1841
GS
10619#ifdef DEBUGGING
10620char *PL_watch_pvx;
10621#endif
10622
645c22ef
DM
10623/* attempt to make everything in the typeglob readonly */
10624
5bd07a3d 10625STATIC SV *
59b40662 10626S_gv_share(pTHX_ SV *sstr, CLONE_PARAMS *param)
5bd07a3d
DM
10627{
10628 GV *gv = (GV*)sstr;
59b40662 10629 SV *sv = &param->proto_perl->Isv_no; /* just need SvREADONLY-ness */
5bd07a3d
DM
10630
10631 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 10632 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
10633 }
10634 else if (!GvCV(gv)) {
10635 GvCV(gv) = (CV*)sv;
10636 }
10637 else {
10638 /* CvPADLISTs cannot be shared */
37e20706 10639 if (!SvREADONLY(GvCV(gv)) && !CvXSUB(GvCV(gv))) {
7fb37951 10640 GvUNIQUE_off(gv);
5bd07a3d
DM
10641 }
10642 }
10643
7fb37951 10644 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
10645#if 0
10646 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
10647 HvNAME(GvSTASH(gv)), GvNAME(gv));
10648#endif
10649 return Nullsv;
10650 }
10651
4411f3b6 10652 /*
5bd07a3d
DM
10653 * write attempts will die with
10654 * "Modification of a read-only value attempted"
10655 */
10656 if (!GvSV(gv)) {
10657 GvSV(gv) = sv;
10658 }
10659 else {
10660 SvREADONLY_on(GvSV(gv));
10661 }
10662
10663 if (!GvAV(gv)) {
10664 GvAV(gv) = (AV*)sv;
10665 }
10666 else {
10667 SvREADONLY_on(GvAV(gv));
10668 }
10669
10670 if (!GvHV(gv)) {
10671 GvHV(gv) = (HV*)sv;
10672 }
10673 else {
53c33732 10674 SvREADONLY_on(GvHV(gv));
5bd07a3d
DM
10675 }
10676
10677 return sstr; /* he_dup() will SvREFCNT_inc() */
10678}
10679
645c22ef
DM
10680/* duplicate an SV of any type (including AV, HV etc) */
10681
83841fad
NIS
10682void
10683Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
10684{
10685 if (SvROK(sstr)) {
d3d0e6f1 10686 SvRV(dstr) = SvWEAKREF(sstr)
83841fad
NIS
10687 ? sv_dup(SvRV(sstr), param)
10688 : sv_dup_inc(SvRV(sstr), param);
10689 }
10690 else if (SvPVX(sstr)) {
10691 /* Has something there */
10692 if (SvLEN(sstr)) {
68795e93 10693 /* Normal PV - clone whole allocated space */
83841fad 10694 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
d3d0e6f1
NC
10695 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10696 /* Not that normal - actually sstr is copy on write.
10697 But we are a true, independant SV, so: */
10698 SvREADONLY_off(dstr);
10699 SvFAKE_off(dstr);
10700 }
68795e93 10701 }
83841fad
NIS
10702 else {
10703 /* Special case - not normally malloced for some reason */
10704 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10705 /* A "shared" PV - clone it as unshared string */
281b2760 10706 if(SvPADTMP(sstr)) {
5e6160dc
AB
10707 /* However, some of them live in the pad
10708 and they should not have these flags
10709 turned off */
281b2760
AB
10710
10711 SvPVX(dstr) = sharepvn(SvPVX(sstr), SvCUR(sstr),
10712 SvUVX(sstr));
10713 SvUVX(dstr) = SvUVX(sstr);
10714 } else {
10715
10716 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvCUR(sstr));
10717 SvFAKE_off(dstr);
10718 SvREADONLY_off(dstr);
5e6160dc 10719 }
83841fad
NIS
10720 }
10721 else {
10722 /* Some other special case - random pointer */
10723 SvPVX(dstr) = SvPVX(sstr);
d3d0e6f1 10724 }
83841fad
NIS
10725 }
10726 }
10727 else {
10728 /* Copy the Null */
10729 SvPVX(dstr) = SvPVX(sstr);
10730 }
10731}
10732
1d7c1841 10733SV *
a8fc9800 10734Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
1d7c1841 10735{
1d7c1841
GS
10736 SV *dstr;
10737
10738 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
10739 return Nullsv;
10740 /* look for it in the table first */
10741 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
10742 if (dstr)
10743 return dstr;
10744
0405e91e
AB
10745 if(param->flags & CLONEf_JOIN_IN) {
10746 /** We are joining here so we don't want do clone
10747 something that is bad **/
10748
10749 if(SvTYPE(sstr) == SVt_PVHV &&
10750 HvNAME(sstr)) {
10751 /** don't clone stashes if they already exist **/
10752 HV* old_stash = gv_stashpv(HvNAME(sstr),0);
10753 return (SV*) old_stash;
10754 }
10755 }
10756
1d7c1841
GS
10757 /* create anew and remember what it is */
10758 new_SV(dstr);
fd0854ff
DM
10759
10760#ifdef DEBUG_LEAKING_SCALARS
10761 dstr->sv_debug_optype = sstr->sv_debug_optype;
10762 dstr->sv_debug_line = sstr->sv_debug_line;
10763 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
10764 dstr->sv_debug_cloned = 1;
10765# ifdef NETWARE
10766 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
10767# else
10768 dstr->sv_debug_file = savesharedpv(sstr->sv_debug_file);
10769# endif
10770#endif
10771
1d7c1841
GS
10772 ptr_table_store(PL_ptr_table, sstr, dstr);
10773
10774 /* clone */
10775 SvFLAGS(dstr) = SvFLAGS(sstr);
10776 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
10777 SvREFCNT(dstr) = 0; /* must be before any other dups! */
10778
10779#ifdef DEBUGGING
10780 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
10781 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
10782 PL_watch_pvx, SvPVX(sstr));
10783#endif
10784
10785 switch (SvTYPE(sstr)) {
10786 case SVt_NULL:
10787 SvANY(dstr) = NULL;
10788 break;
10789 case SVt_IV:
10790 SvANY(dstr) = new_XIV();
10791 SvIVX(dstr) = SvIVX(sstr);
10792 break;
10793 case SVt_NV:
10794 SvANY(dstr) = new_XNV();
10795 SvNVX(dstr) = SvNVX(sstr);
10796 break;
10797 case SVt_RV:
10798 SvANY(dstr) = new_XRV();
83841fad 10799 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10800 break;
10801 case SVt_PV:
10802 SvANY(dstr) = new_XPV();
10803 SvCUR(dstr) = SvCUR(sstr);
10804 SvLEN(dstr) = SvLEN(sstr);
83841fad 10805 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10806 break;
10807 case SVt_PVIV:
10808 SvANY(dstr) = new_XPVIV();
10809 SvCUR(dstr) = SvCUR(sstr);
10810 SvLEN(dstr) = SvLEN(sstr);
10811 SvIVX(dstr) = SvIVX(sstr);
83841fad 10812 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10813 break;
10814 case SVt_PVNV:
10815 SvANY(dstr) = new_XPVNV();
10816 SvCUR(dstr) = SvCUR(sstr);
10817 SvLEN(dstr) = SvLEN(sstr);
10818 SvIVX(dstr) = SvIVX(sstr);
10819 SvNVX(dstr) = SvNVX(sstr);
83841fad 10820 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10821 break;
10822 case SVt_PVMG:
10823 SvANY(dstr) = new_XPVMG();
10824 SvCUR(dstr) = SvCUR(sstr);
10825 SvLEN(dstr) = SvLEN(sstr);
10826 SvIVX(dstr) = SvIVX(sstr);
10827 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10828 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10829 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10830 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10831 break;
10832 case SVt_PVBM:
10833 SvANY(dstr) = new_XPVBM();
10834 SvCUR(dstr) = SvCUR(sstr);
10835 SvLEN(dstr) = SvLEN(sstr);
10836 SvIVX(dstr) = SvIVX(sstr);
10837 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10838 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10839 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10840 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10841 BmRARE(dstr) = BmRARE(sstr);
10842 BmUSEFUL(dstr) = BmUSEFUL(sstr);
10843 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
10844 break;
10845 case SVt_PVLV:
10846 SvANY(dstr) = new_XPVLV();
10847 SvCUR(dstr) = SvCUR(sstr);
10848 SvLEN(dstr) = SvLEN(sstr);
10849 SvIVX(dstr) = SvIVX(sstr);
10850 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10851 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10852 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10853 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10854 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
10855 LvTARGLEN(dstr) = LvTARGLEN(sstr);
dd28f7bb
DM
10856 if (LvTYPE(sstr) == 't') /* for tie: unrefcnted fake (SV**) */
10857 LvTARG(dstr) = dstr;
10858 else if (LvTYPE(sstr) == 'T') /* for tie: fake HE */
10859 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(sstr), 0, param);
10860 else
10861 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr), param);
1d7c1841
GS
10862 LvTYPE(dstr) = LvTYPE(sstr);
10863 break;
10864 case SVt_PVGV:
7fb37951 10865 if (GvUNIQUE((GV*)sstr)) {
5bd07a3d 10866 SV *share;
59b40662 10867 if ((share = gv_share(sstr, param))) {
5bd07a3d
DM
10868 del_SV(dstr);
10869 dstr = share;
37e20706 10870 ptr_table_store(PL_ptr_table, sstr, dstr);
5bd07a3d
DM
10871#if 0
10872 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
10873 HvNAME(GvSTASH(share)), GvNAME(share));
10874#endif
10875 break;
10876 }
10877 }
1d7c1841
GS
10878 SvANY(dstr) = new_XPVGV();
10879 SvCUR(dstr) = SvCUR(sstr);
10880 SvLEN(dstr) = SvLEN(sstr);
10881 SvIVX(dstr) = SvIVX(sstr);
10882 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10883 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10884 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10885 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10886 GvNAMELEN(dstr) = GvNAMELEN(sstr);
10887 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
d2d73c3e 10888 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr), param);
1d7c1841 10889 GvFLAGS(dstr) = GvFLAGS(sstr);
d2d73c3e 10890 GvGP(dstr) = gp_dup(GvGP(sstr), param);
1d7c1841
GS
10891 (void)GpREFCNT_inc(GvGP(dstr));
10892 break;
10893 case SVt_PVIO:
10894 SvANY(dstr) = new_XPVIO();
10895 SvCUR(dstr) = SvCUR(sstr);
10896 SvLEN(dstr) = SvLEN(sstr);
10897 SvIVX(dstr) = SvIVX(sstr);
10898 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10899 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10900 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10901 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
a8fc9800 10902 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10903 if (IoOFP(sstr) == IoIFP(sstr))
10904 IoOFP(dstr) = IoIFP(dstr);
10905 else
a8fc9800 10906 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10907 /* PL_rsfp_filters entries have fake IoDIRP() */
10908 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
10909 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
10910 else
10911 IoDIRP(dstr) = IoDIRP(sstr);
10912 IoLINES(dstr) = IoLINES(sstr);
10913 IoPAGE(dstr) = IoPAGE(sstr);
10914 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
10915 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
7a5fa8a2 10916 if(IoFLAGS(sstr) & IOf_FAKE_DIRP) {
5a37521b
AB
10917 /* I have no idea why fake dirp (rsfps)
10918 should be treaded differently but otherwise
10919 we end up with leaks -- sky*/
10920 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(sstr), param);
10921 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(sstr), param);
10922 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(sstr), param);
10923 } else {
10924 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr), param);
10925 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr), param);
10926 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr), param);
10927 }
1d7c1841 10928 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
1d7c1841 10929 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
1d7c1841 10930 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
1d7c1841
GS
10931 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
10932 IoTYPE(dstr) = IoTYPE(sstr);
10933 IoFLAGS(dstr) = IoFLAGS(sstr);
10934 break;
10935 case SVt_PVAV:
10936 SvANY(dstr) = new_XPVAV();
10937 SvCUR(dstr) = SvCUR(sstr);
10938 SvLEN(dstr) = SvLEN(sstr);
10939 SvIVX(dstr) = SvIVX(sstr);
10940 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10941 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10942 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
10943 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
1d7c1841
GS
10944 AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
10945 if (AvARRAY((AV*)sstr)) {
10946 SV **dst_ary, **src_ary;
10947 SSize_t items = AvFILLp((AV*)sstr) + 1;
10948
10949 src_ary = AvARRAY((AV*)sstr);
10950 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
10951 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
10952 SvPVX(dstr) = (char*)dst_ary;
10953 AvALLOC((AV*)dstr) = dst_ary;
10954 if (AvREAL((AV*)sstr)) {
10955 while (items-- > 0)
d2d73c3e 10956 *dst_ary++ = sv_dup_inc(*src_ary++, param);
1d7c1841
GS
10957 }
10958 else {
10959 while (items-- > 0)
d2d73c3e 10960 *dst_ary++ = sv_dup(*src_ary++, param);
1d7c1841
GS
10961 }
10962 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10963 while (items-- > 0) {
10964 *dst_ary++ = &PL_sv_undef;
10965 }
10966 }
10967 else {
10968 SvPVX(dstr) = Nullch;
10969 AvALLOC((AV*)dstr) = (SV**)NULL;
10970 }
10971 break;
10972 case SVt_PVHV:
10973 SvANY(dstr) = new_XPVHV();
10974 SvCUR(dstr) = SvCUR(sstr);
10975 SvLEN(dstr) = SvLEN(sstr);
10976 SvIVX(dstr) = SvIVX(sstr);
10977 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10978 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10979 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841
GS
10980 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
10981 if (HvARRAY((HV*)sstr)) {
1d7c1841
GS
10982 STRLEN i = 0;
10983 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
10984 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
10985 Newz(0, dxhv->xhv_array,
10986 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
10987 while (i <= sxhv->xhv_max) {
10988 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
eb160463
GS
10989 (bool)!!HvSHAREKEYS(sstr),
10990 param);
1d7c1841
GS
10991 ++i;
10992 }
eb160463
GS
10993 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter,
10994 (bool)!!HvSHAREKEYS(sstr), param);
1d7c1841
GS
10995 }
10996 else {
10997 SvPVX(dstr) = Nullch;
10998 HvEITER((HV*)dstr) = (HE*)NULL;
10999 }
11000 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
11001 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
c43294b8 11002 /* Record stashes for possible cloning in Perl_clone(). */
6676db26 11003 if(HvNAME((HV*)dstr))
d2d73c3e 11004 av_push(param->stashes, dstr);
1d7c1841
GS
11005 break;
11006 case SVt_PVFM:
11007 SvANY(dstr) = new_XPVFM();
11008 FmLINES(dstr) = FmLINES(sstr);
11009 goto dup_pvcv;
11010 /* NOTREACHED */
11011 case SVt_PVCV:
11012 SvANY(dstr) = new_XPVCV();
d2d73c3e 11013 dup_pvcv:
1d7c1841
GS
11014 SvCUR(dstr) = SvCUR(sstr);
11015 SvLEN(dstr) = SvLEN(sstr);
11016 SvIVX(dstr) = SvIVX(sstr);
11017 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
11018 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
11019 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 11020 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
d2d73c3e 11021 CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
1d7c1841 11022 CvSTART(dstr) = CvSTART(sstr);
b34c0dd4 11023 OP_REFCNT_LOCK;
1d7c1841 11024 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
b34c0dd4 11025 OP_REFCNT_UNLOCK;
1d7c1841
GS
11026 CvXSUB(dstr) = CvXSUB(sstr);
11027 CvXSUBANY(dstr) = CvXSUBANY(sstr);
01485f8b
DM
11028 if (CvCONST(sstr)) {
11029 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
11030 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
11031 sv_dup_inc(CvXSUBANY(sstr).any_ptr, param);
11032 }
b23f1a86
DM
11033 /* don't dup if copying back - CvGV isn't refcounted, so the
11034 * duped GV may never be freed. A bit of a hack! DAPM */
11035 CvGV(dstr) = (param->flags & CLONEf_JOIN_IN) ?
11036 Nullgv : gv_dup(CvGV(sstr), param) ;
d2d73c3e
AB
11037 if (param->flags & CLONEf_COPY_STACKS) {
11038 CvDEPTH(dstr) = CvDEPTH(sstr);
11039 } else {
11040 CvDEPTH(dstr) = 0;
11041 }
dd2155a4 11042 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
7dafbf52
DM
11043 CvOUTSIDE_SEQ(dstr) = CvOUTSIDE_SEQ(sstr);
11044 CvOUTSIDE(dstr) =
11045 CvWEAKOUTSIDE(sstr)
11046 ? cv_dup( CvOUTSIDE(sstr), param)
11047 : cv_dup_inc(CvOUTSIDE(sstr), param);
1d7c1841 11048 CvFLAGS(dstr) = CvFLAGS(sstr);
54356c7d 11049 CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
1d7c1841
GS
11050 break;
11051 default:
c803eecc 11052 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
1d7c1841
GS
11053 break;
11054 }
11055
11056 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
11057 ++PL_sv_objcount;
11058
11059 return dstr;
d2d73c3e 11060 }
1d7c1841 11061
645c22ef
DM
11062/* duplicate a context */
11063
1d7c1841 11064PERL_CONTEXT *
a8fc9800 11065Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
11066{
11067 PERL_CONTEXT *ncxs;
11068
11069 if (!cxs)
11070 return (PERL_CONTEXT*)NULL;
11071
11072 /* look for it in the table first */
11073 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
11074 if (ncxs)
11075 return ncxs;
11076
11077 /* create anew and remember what it is */
11078 Newz(56, ncxs, max + 1, PERL_CONTEXT);
11079 ptr_table_store(PL_ptr_table, cxs, ncxs);
11080
11081 while (ix >= 0) {
11082 PERL_CONTEXT *cx = &cxs[ix];
11083 PERL_CONTEXT *ncx = &ncxs[ix];
11084 ncx->cx_type = cx->cx_type;
11085 if (CxTYPE(cx) == CXt_SUBST) {
11086 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
11087 }
11088 else {
11089 ncx->blk_oldsp = cx->blk_oldsp;
11090 ncx->blk_oldcop = cx->blk_oldcop;
1d7c1841
GS
11091 ncx->blk_oldmarksp = cx->blk_oldmarksp;
11092 ncx->blk_oldscopesp = cx->blk_oldscopesp;
11093 ncx->blk_oldpm = cx->blk_oldpm;
11094 ncx->blk_gimme = cx->blk_gimme;
11095 switch (CxTYPE(cx)) {
11096 case CXt_SUB:
11097 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
11098 ? cv_dup_inc(cx->blk_sub.cv, param)
11099 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 11100 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 11101 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 11102 : Nullav);
d2d73c3e 11103 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
11104 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
11105 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
11106 ncx->blk_sub.lval = cx->blk_sub.lval;
f39bc417 11107 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
11108 break;
11109 case CXt_EVAL:
11110 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
11111 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 11112 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 11113 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 11114 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
f39bc417 11115 ncx->blk_eval.retop = cx->blk_eval.retop;
1d7c1841
GS
11116 break;
11117 case CXt_LOOP:
11118 ncx->blk_loop.label = cx->blk_loop.label;
11119 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
11120 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
11121 ncx->blk_loop.next_op = cx->blk_loop.next_op;
11122 ncx->blk_loop.last_op = cx->blk_loop.last_op;
11123 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
11124 ? cx->blk_loop.iterdata
d2d73c3e 11125 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
11126 ncx->blk_loop.oldcomppad
11127 = (PAD*)ptr_table_fetch(PL_ptr_table,
11128 cx->blk_loop.oldcomppad);
d2d73c3e
AB
11129 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
11130 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
11131 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
11132 ncx->blk_loop.iterix = cx->blk_loop.iterix;
11133 ncx->blk_loop.itermax = cx->blk_loop.itermax;
11134 break;
11135 case CXt_FORMAT:
d2d73c3e
AB
11136 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
11137 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
11138 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841 11139 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
f39bc417 11140 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
11141 break;
11142 case CXt_BLOCK:
11143 case CXt_NULL:
11144 break;
11145 }
11146 }
11147 --ix;
11148 }
11149 return ncxs;
11150}
11151
645c22ef
DM
11152/* duplicate a stack info structure */
11153
1d7c1841 11154PERL_SI *
a8fc9800 11155Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
11156{
11157 PERL_SI *nsi;
11158
11159 if (!si)
11160 return (PERL_SI*)NULL;
11161
11162 /* look for it in the table first */
11163 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
11164 if (nsi)
11165 return nsi;
11166
11167 /* create anew and remember what it is */
11168 Newz(56, nsi, 1, PERL_SI);
11169 ptr_table_store(PL_ptr_table, si, nsi);
11170
d2d73c3e 11171 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
11172 nsi->si_cxix = si->si_cxix;
11173 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 11174 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 11175 nsi->si_type = si->si_type;
d2d73c3e
AB
11176 nsi->si_prev = si_dup(si->si_prev, param);
11177 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
11178 nsi->si_markoff = si->si_markoff;
11179
11180 return nsi;
11181}
11182
11183#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
11184#define TOPINT(ss,ix) ((ss)[ix].any_i32)
11185#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
11186#define TOPLONG(ss,ix) ((ss)[ix].any_long)
11187#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
11188#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
11189#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
11190#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
11191#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
11192#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
11193#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
11194#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
11195#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
11196#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
11197
11198/* XXXXX todo */
11199#define pv_dup_inc(p) SAVEPV(p)
11200#define pv_dup(p) SAVEPV(p)
11201#define svp_dup_inc(p,pp) any_dup(p,pp)
11202
645c22ef
DM
11203/* map any object to the new equivent - either something in the
11204 * ptr table, or something in the interpreter structure
11205 */
11206
1d7c1841
GS
11207void *
11208Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
11209{
11210 void *ret;
11211
11212 if (!v)
11213 return (void*)NULL;
11214
11215 /* look for it in the table first */
11216 ret = ptr_table_fetch(PL_ptr_table, v);
11217 if (ret)
11218 return ret;
11219
11220 /* see if it is part of the interpreter structure */
11221 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 11222 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 11223 else {
1d7c1841 11224 ret = v;
05ec9bb3 11225 }
1d7c1841
GS
11226
11227 return ret;
11228}
11229
645c22ef
DM
11230/* duplicate the save stack */
11231
1d7c1841 11232ANY *
a8fc9800 11233Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841
GS
11234{
11235 ANY *ss = proto_perl->Tsavestack;
11236 I32 ix = proto_perl->Tsavestack_ix;
11237 I32 max = proto_perl->Tsavestack_max;
11238 ANY *nss;
11239 SV *sv;
11240 GV *gv;
11241 AV *av;
11242 HV *hv;
11243 void* ptr;
11244 int intval;
11245 long longval;
11246 GP *gp;
11247 IV iv;
11248 I32 i;
c4e33207 11249 char *c = NULL;
1d7c1841 11250 void (*dptr) (void*);
acfe0abc 11251 void (*dxptr) (pTHX_ void*);
e977893f 11252 OP *o;
1d7c1841
GS
11253
11254 Newz(54, nss, max, ANY);
11255
11256 while (ix > 0) {
11257 i = POPINT(ss,ix);
11258 TOPINT(nss,ix) = i;
11259 switch (i) {
11260 case SAVEt_ITEM: /* normal string */
11261 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11262 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11263 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11264 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11265 break;
11266 case SAVEt_SV: /* scalar reference */
11267 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11268 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11269 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11270 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 11271 break;
f4dd75d9
GS
11272 case SAVEt_GENERIC_PVREF: /* generic char* */
11273 c = (char*)POPPTR(ss,ix);
11274 TOPPTR(nss,ix) = pv_dup(c);
11275 ptr = POPPTR(ss,ix);
11276 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11277 break;
05ec9bb3
NIS
11278 case SAVEt_SHARED_PVREF: /* char* in shared space */
11279 c = (char*)POPPTR(ss,ix);
11280 TOPPTR(nss,ix) = savesharedpv(c);
11281 ptr = POPPTR(ss,ix);
11282 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11283 break;
1d7c1841
GS
11284 case SAVEt_GENERIC_SVREF: /* generic sv */
11285 case SAVEt_SVREF: /* scalar reference */
11286 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11287 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11288 ptr = POPPTR(ss,ix);
11289 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
11290 break;
11291 case SAVEt_AV: /* array reference */
11292 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11293 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 11294 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11295 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11296 break;
11297 case SAVEt_HV: /* hash reference */
11298 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11299 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 11300 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11301 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11302 break;
11303 case SAVEt_INT: /* int reference */
11304 ptr = POPPTR(ss,ix);
11305 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11306 intval = (int)POPINT(ss,ix);
11307 TOPINT(nss,ix) = intval;
11308 break;
11309 case SAVEt_LONG: /* long reference */
11310 ptr = POPPTR(ss,ix);
11311 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11312 longval = (long)POPLONG(ss,ix);
11313 TOPLONG(nss,ix) = longval;
11314 break;
11315 case SAVEt_I32: /* I32 reference */
11316 case SAVEt_I16: /* I16 reference */
11317 case SAVEt_I8: /* I8 reference */
11318 ptr = POPPTR(ss,ix);
11319 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11320 i = POPINT(ss,ix);
11321 TOPINT(nss,ix) = i;
11322 break;
11323 case SAVEt_IV: /* IV reference */
11324 ptr = POPPTR(ss,ix);
11325 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11326 iv = POPIV(ss,ix);
11327 TOPIV(nss,ix) = iv;
11328 break;
11329 case SAVEt_SPTR: /* SV* reference */
11330 ptr = POPPTR(ss,ix);
11331 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11332 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11333 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
11334 break;
11335 case SAVEt_VPTR: /* random* reference */
11336 ptr = POPPTR(ss,ix);
11337 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11338 ptr = POPPTR(ss,ix);
11339 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11340 break;
11341 case SAVEt_PPTR: /* char* reference */
11342 ptr = POPPTR(ss,ix);
11343 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11344 c = (char*)POPPTR(ss,ix);
11345 TOPPTR(nss,ix) = pv_dup(c);
11346 break;
11347 case SAVEt_HPTR: /* HV* reference */
11348 ptr = POPPTR(ss,ix);
11349 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11350 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11351 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
11352 break;
11353 case SAVEt_APTR: /* AV* reference */
11354 ptr = POPPTR(ss,ix);
11355 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11356 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11357 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
11358 break;
11359 case SAVEt_NSTAB:
11360 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11361 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11362 break;
11363 case SAVEt_GP: /* scalar reference */
11364 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 11365 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
11366 (void)GpREFCNT_inc(gp);
11367 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 11368 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
11369 c = (char*)POPPTR(ss,ix);
11370 TOPPTR(nss,ix) = pv_dup(c);
11371 iv = POPIV(ss,ix);
11372 TOPIV(nss,ix) = iv;
11373 iv = POPIV(ss,ix);
11374 TOPIV(nss,ix) = iv;
11375 break;
11376 case SAVEt_FREESV:
26d9b02f 11377 case SAVEt_MORTALIZESV:
1d7c1841 11378 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11379 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11380 break;
11381 case SAVEt_FREEOP:
11382 ptr = POPPTR(ss,ix);
11383 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
11384 /* these are assumed to be refcounted properly */
11385 switch (((OP*)ptr)->op_type) {
11386 case OP_LEAVESUB:
11387 case OP_LEAVESUBLV:
11388 case OP_LEAVEEVAL:
11389 case OP_LEAVE:
11390 case OP_SCOPE:
11391 case OP_LEAVEWRITE:
e977893f
GS
11392 TOPPTR(nss,ix) = ptr;
11393 o = (OP*)ptr;
11394 OpREFCNT_inc(o);
1d7c1841
GS
11395 break;
11396 default:
11397 TOPPTR(nss,ix) = Nullop;
11398 break;
11399 }
11400 }
11401 else
11402 TOPPTR(nss,ix) = Nullop;
11403 break;
11404 case SAVEt_FREEPV:
11405 c = (char*)POPPTR(ss,ix);
11406 TOPPTR(nss,ix) = pv_dup_inc(c);
11407 break;
11408 case SAVEt_CLEARSV:
11409 longval = POPLONG(ss,ix);
11410 TOPLONG(nss,ix) = longval;
11411 break;
11412 case SAVEt_DELETE:
11413 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11414 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
11415 c = (char*)POPPTR(ss,ix);
11416 TOPPTR(nss,ix) = pv_dup_inc(c);
11417 i = POPINT(ss,ix);
11418 TOPINT(nss,ix) = i;
11419 break;
11420 case SAVEt_DESTRUCTOR:
11421 ptr = POPPTR(ss,ix);
11422 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11423 dptr = POPDPTR(ss,ix);
ef75a179 11424 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
11425 break;
11426 case SAVEt_DESTRUCTOR_X:
11427 ptr = POPPTR(ss,ix);
11428 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11429 dxptr = POPDXPTR(ss,ix);
acfe0abc 11430 TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
11431 break;
11432 case SAVEt_REGCONTEXT:
11433 case SAVEt_ALLOC:
11434 i = POPINT(ss,ix);
11435 TOPINT(nss,ix) = i;
11436 ix -= i;
11437 break;
11438 case SAVEt_STACK_POS: /* Position on Perl stack */
11439 i = POPINT(ss,ix);
11440 TOPINT(nss,ix) = i;
11441 break;
11442 case SAVEt_AELEM: /* array element */
11443 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11444 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11445 i = POPINT(ss,ix);
11446 TOPINT(nss,ix) = i;
11447 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11448 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
11449 break;
11450 case SAVEt_HELEM: /* hash element */
11451 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11452 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11453 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11454 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11455 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11456 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
11457 break;
11458 case SAVEt_OP:
11459 ptr = POPPTR(ss,ix);
11460 TOPPTR(nss,ix) = ptr;
11461 break;
11462 case SAVEt_HINTS:
11463 i = POPINT(ss,ix);
11464 TOPINT(nss,ix) = i;
11465 break;
c4410b1b
GS
11466 case SAVEt_COMPPAD:
11467 av = (AV*)POPPTR(ss,ix);
58ed4fbe 11468 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 11469 break;
c3564e5c
GS
11470 case SAVEt_PADSV:
11471 longval = (long)POPLONG(ss,ix);
11472 TOPLONG(nss,ix) = longval;
11473 ptr = POPPTR(ss,ix);
11474 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11475 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11476 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 11477 break;
a1bb4754 11478 case SAVEt_BOOL:
38d8b13e 11479 ptr = POPPTR(ss,ix);
b9609c01 11480 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 11481 longval = (long)POPBOOL(ss,ix);
b9609c01 11482 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 11483 break;
8bd2680e
MHM
11484 case SAVEt_SET_SVFLAGS:
11485 i = POPINT(ss,ix);
11486 TOPINT(nss,ix) = i;
11487 i = POPINT(ss,ix);
11488 TOPINT(nss,ix) = i;
11489 sv = (SV*)POPPTR(ss,ix);
11490 TOPPTR(nss,ix) = sv_dup(sv, param);
11491 break;
1d7c1841
GS
11492 default:
11493 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
11494 }
11495 }
11496
11497 return nss;
11498}
11499
645c22ef
DM
11500/*
11501=for apidoc perl_clone
11502
11503Create and return a new interpreter by cloning the current one.
11504
4be49ee6 11505perl_clone takes these flags as parameters:
6a78b4db 11506
7a5fa8a2
NIS
11507CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
11508without it we only clone the data and zero the stacks,
11509with it we copy the stacks and the new perl interpreter is
11510ready to run at the exact same point as the previous one.
11511The pseudo-fork code uses COPY_STACKS while the
6a78b4db
AB
11512threads->new doesn't.
11513
11514CLONEf_KEEP_PTR_TABLE
7a5fa8a2
NIS
11515perl_clone keeps a ptr_table with the pointer of the old
11516variable as a key and the new variable as a value,
11517this allows it to check if something has been cloned and not
11518clone it again but rather just use the value and increase the
11519refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
11520the ptr_table using the function
11521C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
11522reason to keep it around is if you want to dup some of your own
11523variable who are outside the graph perl scans, example of this
6a78b4db
AB
11524code is in threads.xs create
11525
11526CLONEf_CLONE_HOST
7a5fa8a2
NIS
11527This is a win32 thing, it is ignored on unix, it tells perls
11528win32host code (which is c++) to clone itself, this is needed on
11529win32 if you want to run two threads at the same time,
11530if you just want to do some stuff in a separate perl interpreter
11531and then throw it away and return to the original one,
6a78b4db
AB
11532you don't need to do anything.
11533
645c22ef
DM
11534=cut
11535*/
11536
11537/* XXX the above needs expanding by someone who actually understands it ! */
3fc56081
NK
11538EXTERN_C PerlInterpreter *
11539perl_clone_host(PerlInterpreter* proto_perl, UV flags);
645c22ef 11540
1d7c1841
GS
11541PerlInterpreter *
11542perl_clone(PerlInterpreter *proto_perl, UV flags)
11543{
1d7c1841 11544#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
11545
11546 /* perlhost.h so we need to call into it
11547 to clone the host, CPerlHost should have a c interface, sky */
11548
11549 if (flags & CLONEf_CLONE_HOST) {
11550 return perl_clone_host(proto_perl,flags);
11551 }
11552 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
11553 proto_perl->IMem,
11554 proto_perl->IMemShared,
11555 proto_perl->IMemParse,
11556 proto_perl->IEnv,
11557 proto_perl->IStdIO,
11558 proto_perl->ILIO,
11559 proto_perl->IDir,
11560 proto_perl->ISock,
11561 proto_perl->IProc);
11562}
11563
11564PerlInterpreter *
11565perl_clone_using(PerlInterpreter *proto_perl, UV flags,
11566 struct IPerlMem* ipM, struct IPerlMem* ipMS,
11567 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
11568 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
11569 struct IPerlDir* ipD, struct IPerlSock* ipS,
11570 struct IPerlProc* ipP)
11571{
11572 /* XXX many of the string copies here can be optimized if they're
11573 * constants; they need to be allocated as common memory and just
11574 * their pointers copied. */
11575
11576 IV i;
64aa0685
GS
11577 CLONE_PARAMS clone_params;
11578 CLONE_PARAMS* param = &clone_params;
d2d73c3e 11579
1d7c1841 11580 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
ba869deb 11581 PERL_SET_THX(my_perl);
1d7c1841 11582
acfe0abc 11583# ifdef DEBUGGING
a4530404 11584 Poison(my_perl, 1, PerlInterpreter);
fd0854ff 11585 PL_op = Nullop;
c008732b 11586 PL_curcop = (COP *)Nullop;
1d7c1841
GS
11587 PL_markstack = 0;
11588 PL_scopestack = 0;
11589 PL_savestack = 0;
22f7c9c9
JH
11590 PL_savestack_ix = 0;
11591 PL_savestack_max = -1;
66fe0623 11592 PL_sig_pending = 0;
25596c82 11593 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
acfe0abc 11594# else /* !DEBUGGING */
1d7c1841 11595 Zero(my_perl, 1, PerlInterpreter);
acfe0abc 11596# endif /* DEBUGGING */
1d7c1841
GS
11597
11598 /* host pointers */
11599 PL_Mem = ipM;
11600 PL_MemShared = ipMS;
11601 PL_MemParse = ipMP;
11602 PL_Env = ipE;
11603 PL_StdIO = ipStd;
11604 PL_LIO = ipLIO;
11605 PL_Dir = ipD;
11606 PL_Sock = ipS;
11607 PL_Proc = ipP;
1d7c1841
GS
11608#else /* !PERL_IMPLICIT_SYS */
11609 IV i;
64aa0685
GS
11610 CLONE_PARAMS clone_params;
11611 CLONE_PARAMS* param = &clone_params;
1d7c1841 11612 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 11613 PERL_SET_THX(my_perl);
1d7c1841 11614
d2d73c3e
AB
11615
11616
1d7c1841 11617# ifdef DEBUGGING
a4530404 11618 Poison(my_perl, 1, PerlInterpreter);
fd0854ff 11619 PL_op = Nullop;
c008732b 11620 PL_curcop = (COP *)Nullop;
1d7c1841
GS
11621 PL_markstack = 0;
11622 PL_scopestack = 0;
11623 PL_savestack = 0;
22f7c9c9
JH
11624 PL_savestack_ix = 0;
11625 PL_savestack_max = -1;
66fe0623 11626 PL_sig_pending = 0;
25596c82 11627 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
1d7c1841
GS
11628# else /* !DEBUGGING */
11629 Zero(my_perl, 1, PerlInterpreter);
11630# endif /* DEBUGGING */
11631#endif /* PERL_IMPLICIT_SYS */
83236556 11632 param->flags = flags;
59b40662 11633 param->proto_perl = proto_perl;
1d7c1841
GS
11634
11635 /* arena roots */
11636 PL_xiv_arenaroot = NULL;
11637 PL_xiv_root = NULL;
612f20c3 11638 PL_xnv_arenaroot = NULL;
1d7c1841 11639 PL_xnv_root = NULL;
612f20c3 11640 PL_xrv_arenaroot = NULL;
1d7c1841 11641 PL_xrv_root = NULL;
612f20c3 11642 PL_xpv_arenaroot = NULL;
1d7c1841 11643 PL_xpv_root = NULL;
612f20c3 11644 PL_xpviv_arenaroot = NULL;
1d7c1841 11645 PL_xpviv_root = NULL;
612f20c3 11646 PL_xpvnv_arenaroot = NULL;
1d7c1841 11647 PL_xpvnv_root = NULL;
612f20c3 11648 PL_xpvcv_arenaroot = NULL;
1d7c1841 11649 PL_xpvcv_root = NULL;
612f20c3 11650 PL_xpvav_arenaroot = NULL;
1d7c1841 11651 PL_xpvav_root = NULL;
612f20c3 11652 PL_xpvhv_arenaroot = NULL;
1d7c1841 11653 PL_xpvhv_root = NULL;
612f20c3 11654 PL_xpvmg_arenaroot = NULL;
1d7c1841 11655 PL_xpvmg_root = NULL;
612f20c3 11656 PL_xpvlv_arenaroot = NULL;
1d7c1841 11657 PL_xpvlv_root = NULL;
612f20c3 11658 PL_xpvbm_arenaroot = NULL;
1d7c1841 11659 PL_xpvbm_root = NULL;
612f20c3 11660 PL_he_arenaroot = NULL;
1d7c1841
GS
11661 PL_he_root = NULL;
11662 PL_nice_chunk = NULL;
11663 PL_nice_chunk_size = 0;
11664 PL_sv_count = 0;
11665 PL_sv_objcount = 0;
11666 PL_sv_root = Nullsv;
11667 PL_sv_arenaroot = Nullsv;
11668
11669 PL_debug = proto_perl->Idebug;
11670
e5dd39fc 11671#ifdef USE_REENTRANT_API
68853529
SB
11672 /* XXX: things like -Dm will segfault here in perlio, but doing
11673 * PERL_SET_CONTEXT(proto_perl);
11674 * breaks too many other things
11675 */
59bd0823 11676 Perl_reentrant_init(aTHX);
e5dd39fc
AB
11677#endif
11678
1d7c1841
GS
11679 /* create SV map for pointer relocation */
11680 PL_ptr_table = ptr_table_new();
11681
11682 /* initialize these special pointers as early as possible */
11683 SvANY(&PL_sv_undef) = NULL;
11684 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
11685 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
11686 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
11687
1d7c1841 11688 SvANY(&PL_sv_no) = new_XPVNV();
1d7c1841 11689 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
0309f36e
NC
11690 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11691 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
1d7c1841
GS
11692 SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
11693 SvCUR(&PL_sv_no) = 0;
11694 SvLEN(&PL_sv_no) = 1;
0309f36e 11695 SvIVX(&PL_sv_no) = 0;
1d7c1841
GS
11696 SvNVX(&PL_sv_no) = 0;
11697 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
11698
1d7c1841 11699 SvANY(&PL_sv_yes) = new_XPVNV();
1d7c1841 11700 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
0309f36e
NC
11701 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11702 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
1d7c1841
GS
11703 SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
11704 SvCUR(&PL_sv_yes) = 1;
11705 SvLEN(&PL_sv_yes) = 2;
0309f36e 11706 SvIVX(&PL_sv_yes) = 1;
1d7c1841
GS
11707 SvNVX(&PL_sv_yes) = 1;
11708 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
11709
05ec9bb3 11710 /* create (a non-shared!) shared string table */
1d7c1841
GS
11711 PL_strtab = newHV();
11712 HvSHAREKEYS_off(PL_strtab);
11713 hv_ksplit(PL_strtab, 512);
11714 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
11715
05ec9bb3
NIS
11716 PL_compiling = proto_perl->Icompiling;
11717
11718 /* These two PVs will be free'd special way so must set them same way op.c does */
11719 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
11720 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
11721
11722 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
11723 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
11724
1d7c1841
GS
11725 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
11726 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 11727 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 11728 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 11729 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
11730 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
11731
11732 /* pseudo environmental stuff */
11733 PL_origargc = proto_perl->Iorigargc;
e2975953 11734 PL_origargv = proto_perl->Iorigargv;
d2d73c3e 11735
d2d73c3e
AB
11736 param->stashes = newAV(); /* Setup array of objects to call clone on */
11737
a1ea730d 11738#ifdef PERLIO_LAYERS
3a1ee7e8
NIS
11739 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11740 PerlIO_clone(aTHX_ proto_perl, param);
a1ea730d 11741#endif
d2d73c3e
AB
11742
11743 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
11744 PL_incgv = gv_dup(proto_perl->Iincgv, param);
11745 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 11746 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
11747 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
11748 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
11749
11750 /* switches */
11751 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 11752 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
11753 PL_localpatches = proto_perl->Ilocalpatches;
11754 PL_splitstr = proto_perl->Isplitstr;
11755 PL_preprocess = proto_perl->Ipreprocess;
11756 PL_minus_n = proto_perl->Iminus_n;
11757 PL_minus_p = proto_perl->Iminus_p;
11758 PL_minus_l = proto_perl->Iminus_l;
11759 PL_minus_a = proto_perl->Iminus_a;
11760 PL_minus_F = proto_perl->Iminus_F;
11761 PL_doswitches = proto_perl->Idoswitches;
11762 PL_dowarn = proto_perl->Idowarn;
11763 PL_doextract = proto_perl->Idoextract;
11764 PL_sawampersand = proto_perl->Isawampersand;
11765 PL_unsafe = proto_perl->Iunsafe;
11766 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 11767 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
11768 PL_perldb = proto_perl->Iperldb;
11769 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
1cbb0781 11770 PL_exit_flags = proto_perl->Iexit_flags;
1d7c1841
GS
11771
11772 /* magical thingies */
11773 /* XXX time(&PL_basetime) when asked for? */
11774 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 11775 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
11776
11777 PL_maxsysfd = proto_perl->Imaxsysfd;
11778 PL_multiline = proto_perl->Imultiline;
11779 PL_statusvalue = proto_perl->Istatusvalue;
11780#ifdef VMS
11781 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
11782#endif
0a378802 11783 PL_encoding = sv_dup(proto_perl->Iencoding, param);
1d7c1841 11784
4a4c6fe3 11785 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
1f483ca1
JH
11786 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
11787 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
4a4c6fe3 11788
d2f185dc
AMS
11789 /* Clone the regex array */
11790 PL_regex_padav = newAV();
11791 {
11792 I32 len = av_len((AV*)proto_perl->Iregex_padav);
11793 SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
0f95fc41
AB
11794 av_push(PL_regex_padav,
11795 sv_dup_inc(regexen[0],param));
11796 for(i = 1; i <= len; i++) {
11797 if(SvREPADTMP(regexen[i])) {
11798 av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
8cf8f3d1 11799 } else {
0f95fc41
AB
11800 av_push(PL_regex_padav,
11801 SvREFCNT_inc(
8cf8f3d1 11802 newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
cbfa9890 11803 SvIVX(regexen[i])), param)))
0f95fc41
AB
11804 ));
11805 }
d2f185dc
AMS
11806 }
11807 }
11808 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 11809
1d7c1841 11810 /* shortcuts to various I/O objects */
d2d73c3e
AB
11811 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
11812 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
11813 PL_defgv = gv_dup(proto_perl->Idefgv, param);
11814 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
11815 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
11816 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
11817
11818 /* shortcuts to regexp stuff */
d2d73c3e 11819 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
11820
11821 /* shortcuts to misc objects */
d2d73c3e 11822 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
11823
11824 /* shortcuts to debugging objects */
d2d73c3e
AB
11825 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
11826 PL_DBline = gv_dup(proto_perl->IDBline, param);
11827 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
11828 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
11829 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
11830 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
06492da6 11831 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
d2d73c3e
AB
11832 PL_lineary = av_dup(proto_perl->Ilineary, param);
11833 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
11834
11835 /* symbol tables */
d2d73c3e
AB
11836 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
11837 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
d2d73c3e
AB
11838 PL_debstash = hv_dup(proto_perl->Idebstash, param);
11839 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
11840 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
11841
11842 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
ee1c5a4e 11843 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
ece599bd 11844 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
d2d73c3e
AB
11845 PL_endav = av_dup_inc(proto_perl->Iendav, param);
11846 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
11847 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
11848
11849 PL_sub_generation = proto_perl->Isub_generation;
11850
11851 /* funky return mechanisms */
11852 PL_forkprocess = proto_perl->Iforkprocess;
11853
11854 /* subprocess state */
d2d73c3e 11855 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
11856
11857 /* internal state */
11858 PL_tainting = proto_perl->Itainting;
7135f00b 11859 PL_taint_warn = proto_perl->Itaint_warn;
1d7c1841
GS
11860 PL_maxo = proto_perl->Imaxo;
11861 if (proto_perl->Iop_mask)
11862 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11863 else
11864 PL_op_mask = Nullch;
06492da6 11865 /* PL_asserting = proto_perl->Iasserting; */
1d7c1841
GS
11866
11867 /* current interpreter roots */
d2d73c3e 11868 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
11869 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
11870 PL_main_start = proto_perl->Imain_start;
e977893f 11871 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
11872 PL_eval_start = proto_perl->Ieval_start;
11873
11874 /* runtime control stuff */
11875 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
11876 PL_copline = proto_perl->Icopline;
11877
11878 PL_filemode = proto_perl->Ifilemode;
11879 PL_lastfd = proto_perl->Ilastfd;
11880 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
11881 PL_Argv = NULL;
11882 PL_Cmd = Nullch;
11883 PL_gensym = proto_perl->Igensym;
11884 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 11885 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
11886 PL_laststatval = proto_perl->Ilaststatval;
11887 PL_laststype = proto_perl->Ilaststype;
11888 PL_mess_sv = Nullsv;
11889
d2d73c3e 11890 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
11891 PL_ofmt = SAVEPV(proto_perl->Iofmt);
11892
11893 /* interpreter atexit processing */
11894 PL_exitlistlen = proto_perl->Iexitlistlen;
11895 if (PL_exitlistlen) {
11896 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11897 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11898 }
11899 else
11900 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 11901 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
19e8ce8e
AB
11902 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
11903 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1d7c1841
GS
11904
11905 PL_profiledata = NULL;
a8fc9800 11906 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
1d7c1841 11907 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 11908 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 11909
d2d73c3e 11910 PL_compcv = cv_dup(proto_perl->Icompcv, param);
dd2155a4
DM
11911
11912 PAD_CLONE_VARS(proto_perl, param);
1d7c1841
GS
11913
11914#ifdef HAVE_INTERP_INTERN
11915 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11916#endif
11917
11918 /* more statics moved here */
11919 PL_generation = proto_perl->Igeneration;
d2d73c3e 11920 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
11921
11922 PL_in_clean_objs = proto_perl->Iin_clean_objs;
11923 PL_in_clean_all = proto_perl->Iin_clean_all;
11924
11925 PL_uid = proto_perl->Iuid;
11926 PL_euid = proto_perl->Ieuid;
11927 PL_gid = proto_perl->Igid;
11928 PL_egid = proto_perl->Iegid;
11929 PL_nomemok = proto_perl->Inomemok;
11930 PL_an = proto_perl->Ian;
1d7c1841
GS
11931 PL_evalseq = proto_perl->Ievalseq;
11932 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
11933 PL_origalen = proto_perl->Iorigalen;
11934 PL_pidstatus = newHV(); /* XXX flag for cloning? */
11935 PL_osname = SAVEPV(proto_perl->Iosname);
5c728af0 11936 PL_sh_path_compat = proto_perl->Ish_path_compat; /* XXX never deallocated */
1d7c1841
GS
11937 PL_sighandlerp = proto_perl->Isighandlerp;
11938
11939
11940 PL_runops = proto_perl->Irunops;
11941
11942 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
11943
11944#ifdef CSH
11945 PL_cshlen = proto_perl->Icshlen;
74f1b2b8 11946 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
1d7c1841
GS
11947#endif
11948
11949 PL_lex_state = proto_perl->Ilex_state;
11950 PL_lex_defer = proto_perl->Ilex_defer;
11951 PL_lex_expect = proto_perl->Ilex_expect;
11952 PL_lex_formbrack = proto_perl->Ilex_formbrack;
11953 PL_lex_dojoin = proto_perl->Ilex_dojoin;
11954 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
11955 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
11956 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
11957 PL_lex_op = proto_perl->Ilex_op;
11958 PL_lex_inpat = proto_perl->Ilex_inpat;
11959 PL_lex_inwhat = proto_perl->Ilex_inwhat;
11960 PL_lex_brackets = proto_perl->Ilex_brackets;
11961 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
11962 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
11963 PL_lex_casemods = proto_perl->Ilex_casemods;
11964 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
11965 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
11966
11967 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
11968 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
11969 PL_nexttoke = proto_perl->Inexttoke;
11970
1d773130
TB
11971 /* XXX This is probably masking the deeper issue of why
11972 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
11973 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
11974 * (A little debugging with a watchpoint on it may help.)
11975 */
389edf32
TB
11976 if (SvANY(proto_perl->Ilinestr)) {
11977 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
11978 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
11979 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11980 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
11981 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11982 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
11983 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11984 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
11985 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11986 }
11987 else {
11988 PL_linestr = NEWSV(65,79);
11989 sv_upgrade(PL_linestr,SVt_PVIV);
11990 sv_setpvn(PL_linestr,"",0);
11991 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
11992 }
1d7c1841 11993 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1d7c1841
GS
11994 PL_pending_ident = proto_perl->Ipending_ident;
11995 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
11996
11997 PL_expect = proto_perl->Iexpect;
11998
11999 PL_multi_start = proto_perl->Imulti_start;
12000 PL_multi_end = proto_perl->Imulti_end;
12001 PL_multi_open = proto_perl->Imulti_open;
12002 PL_multi_close = proto_perl->Imulti_close;
12003
12004 PL_error_count = proto_perl->Ierror_count;
12005 PL_subline = proto_perl->Isubline;
d2d73c3e 12006 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841 12007
1d773130 12008 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
389edf32
TB
12009 if (SvANY(proto_perl->Ilinestr)) {
12010 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
12011 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
12012 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
12013 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
12014 PL_last_lop_op = proto_perl->Ilast_lop_op;
12015 }
12016 else {
12017 PL_last_uni = SvPVX(PL_linestr);
12018 PL_last_lop = SvPVX(PL_linestr);
12019 PL_last_lop_op = 0;
12020 }
1d7c1841 12021 PL_in_my = proto_perl->Iin_my;
d2d73c3e 12022 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
12023#ifdef FCRYPT
12024 PL_cryptseen = proto_perl->Icryptseen;
12025#endif
12026
12027 PL_hints = proto_perl->Ihints;
12028
12029 PL_amagic_generation = proto_perl->Iamagic_generation;
12030
12031#ifdef USE_LOCALE_COLLATE
12032 PL_collation_ix = proto_perl->Icollation_ix;
12033 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
12034 PL_collation_standard = proto_perl->Icollation_standard;
12035 PL_collxfrm_base = proto_perl->Icollxfrm_base;
12036 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
12037#endif /* USE_LOCALE_COLLATE */
12038
12039#ifdef USE_LOCALE_NUMERIC
12040 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
12041 PL_numeric_standard = proto_perl->Inumeric_standard;
12042 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 12043 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
12044#endif /* !USE_LOCALE_NUMERIC */
12045
12046 /* utf8 character classes */
d2d73c3e
AB
12047 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
12048 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
12049 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
12050 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
12051 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
12052 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
12053 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
12054 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
12055 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
12056 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
12057 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
12058 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
12059 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
12060 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
12061 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
12062 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
12063 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
b4e400f9 12064 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
82686b01
JH
12065 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
12066 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 12067
6c3182a5 12068 /* Did the locale setup indicate UTF-8? */
9769094f 12069 PL_utf8locale = proto_perl->Iutf8locale;
6c3182a5
JH
12070 /* Unicode features (see perlrun/-C) */
12071 PL_unicode = proto_perl->Iunicode;
12072
12073 /* Pre-5.8 signals control */
12074 PL_signals = proto_perl->Isignals;
12075
12076 /* times() ticks per second */
12077 PL_clocktick = proto_perl->Iclocktick;
12078
12079 /* Recursion stopper for PerlIO_find_layer */
12080 PL_in_load_module = proto_perl->Iin_load_module;
12081
12082 /* sort() routine */
12083 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
12084
57c6e6d2
JH
12085 /* Not really needed/useful since the reenrant_retint is "volatile",
12086 * but do it for consistency's sake. */
12087 PL_reentrant_retint = proto_perl->Ireentrant_retint;
12088
15a5279a
JH
12089 /* Hooks to shared SVs and locks. */
12090 PL_sharehook = proto_perl->Isharehook;
12091 PL_lockhook = proto_perl->Ilockhook;
12092 PL_unlockhook = proto_perl->Iunlockhook;
12093 PL_threadhook = proto_perl->Ithreadhook;
12094
bce260cd
JH
12095 PL_runops_std = proto_perl->Irunops_std;
12096 PL_runops_dbg = proto_perl->Irunops_dbg;
12097
12098#ifdef THREADS_HAVE_PIDS
12099 PL_ppid = proto_perl->Ippid;
12100#endif
12101
1d7c1841
GS
12102 /* swatch cache */
12103 PL_last_swash_hv = Nullhv; /* reinits on demand */
12104 PL_last_swash_klen = 0;
12105 PL_last_swash_key[0]= '\0';
12106 PL_last_swash_tmps = (U8*)NULL;
12107 PL_last_swash_slen = 0;
12108
1d7c1841
GS
12109 PL_glob_index = proto_perl->Iglob_index;
12110 PL_srand_called = proto_perl->Isrand_called;
504f80c1 12111 PL_hash_seed = proto_perl->Ihash_seed;
008fb0c0 12112 PL_rehash_seed = proto_perl->Irehash_seed;
1d7c1841
GS
12113 PL_uudmap['M'] = 0; /* reinits on demand */
12114 PL_bitcount = Nullch; /* reinits on demand */
12115
66fe0623
NIS
12116 if (proto_perl->Ipsig_pend) {
12117 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 12118 }
66fe0623
NIS
12119 else {
12120 PL_psig_pend = (int*)NULL;
12121 }
12122
1d7c1841 12123 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
12124 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
12125 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 12126 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
12127 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
12128 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
12129 }
12130 }
12131 else {
12132 PL_psig_ptr = (SV**)NULL;
12133 PL_psig_name = (SV**)NULL;
12134 }
12135
12136 /* thrdvar.h stuff */
12137
a0739874 12138 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
12139 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
12140 PL_tmps_ix = proto_perl->Ttmps_ix;
12141 PL_tmps_max = proto_perl->Ttmps_max;
12142 PL_tmps_floor = proto_perl->Ttmps_floor;
12143 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
12144 i = 0;
12145 while (i <= PL_tmps_ix) {
d2d73c3e 12146 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
12147 ++i;
12148 }
12149
12150 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
12151 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
12152 Newz(54, PL_markstack, i, I32);
12153 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
12154 - proto_perl->Tmarkstack);
12155 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
12156 - proto_perl->Tmarkstack);
12157 Copy(proto_perl->Tmarkstack, PL_markstack,
12158 PL_markstack_ptr - PL_markstack + 1, I32);
12159
12160 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
12161 * NOTE: unlike the others! */
12162 PL_scopestack_ix = proto_perl->Tscopestack_ix;
12163 PL_scopestack_max = proto_perl->Tscopestack_max;
12164 Newz(54, PL_scopestack, PL_scopestack_max, I32);
12165 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
12166
1d7c1841 12167 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 12168 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
12169
12170 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
12171 PL_curstack = av_dup(proto_perl->Tcurstack, param);
12172 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
12173
12174 /* next PUSHs() etc. set *(PL_stack_sp+1) */
12175 PL_stack_base = AvARRAY(PL_curstack);
12176 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
12177 - proto_perl->Tstack_base);
12178 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
12179
12180 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
12181 * NOTE: unlike the others! */
12182 PL_savestack_ix = proto_perl->Tsavestack_ix;
12183 PL_savestack_max = proto_perl->Tsavestack_max;
12184 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 12185 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
12186 }
12187 else {
12188 init_stacks();
985e7056 12189 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
12190 }
12191
12192 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
12193 PL_top_env = &PL_start_env;
12194
12195 PL_op = proto_perl->Top;
12196
12197 PL_Sv = Nullsv;
12198 PL_Xpv = (XPV*)NULL;
12199 PL_na = proto_perl->Tna;
12200
12201 PL_statbuf = proto_perl->Tstatbuf;
12202 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
12203 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
12204 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
12205#ifdef HAS_TIMES
12206 PL_timesbuf = proto_perl->Ttimesbuf;
12207#endif
12208
12209 PL_tainted = proto_perl->Ttainted;
12210 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
12211 PL_rs = sv_dup_inc(proto_perl->Trs, param);
12212 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
12213 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
12214 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 12215 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
12216 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
12217 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
12218 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
12219
12220 PL_restartop = proto_perl->Trestartop;
12221 PL_in_eval = proto_perl->Tin_eval;
12222 PL_delaymagic = proto_perl->Tdelaymagic;
12223 PL_dirty = proto_perl->Tdirty;
12224 PL_localizing = proto_perl->Tlocalizing;
12225
d2d73c3e 12226 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
dd28f7bb 12227 PL_hv_fetch_ent_mh = Nullhe;
1d7c1841
GS
12228 PL_modcount = proto_perl->Tmodcount;
12229 PL_lastgotoprobe = Nullop;
12230 PL_dumpindent = proto_perl->Tdumpindent;
12231
12232 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
12233 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
12234 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
12235 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
12236 PL_sortcxix = proto_perl->Tsortcxix;
12237 PL_efloatbuf = Nullch; /* reinits on demand */
12238 PL_efloatsize = 0; /* reinits on demand */
12239
12240 /* regex stuff */
12241
12242 PL_screamfirst = NULL;
12243 PL_screamnext = NULL;
12244 PL_maxscream = -1; /* reinits on demand */
12245 PL_lastscream = Nullsv;
12246
12247 PL_watchaddr = NULL;
12248 PL_watchok = Nullch;
12249
12250 PL_regdummy = proto_perl->Tregdummy;
1d7c1841
GS
12251 PL_regprecomp = Nullch;
12252 PL_regnpar = 0;
12253 PL_regsize = 0;
1d7c1841
GS
12254 PL_colorset = 0; /* reinits PL_colors[] */
12255 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841
GS
12256 PL_reginput = Nullch;
12257 PL_regbol = Nullch;
12258 PL_regeol = Nullch;
12259 PL_regstartp = (I32*)NULL;
12260 PL_regendp = (I32*)NULL;
12261 PL_reglastparen = (U32*)NULL;
2d862feb 12262 PL_reglastcloseparen = (U32*)NULL;
1d7c1841 12263 PL_regtill = Nullch;
1d7c1841
GS
12264 PL_reg_start_tmp = (char**)NULL;
12265 PL_reg_start_tmpl = 0;
12266 PL_regdata = (struct reg_data*)NULL;
12267 PL_bostr = Nullch;
12268 PL_reg_flags = 0;
12269 PL_reg_eval_set = 0;
12270 PL_regnarrate = 0;
12271 PL_regprogram = (regnode*)NULL;
12272 PL_regindent = 0;
12273 PL_regcc = (CURCUR*)NULL;
12274 PL_reg_call_cc = (struct re_cc_state*)NULL;
12275 PL_reg_re = (regexp*)NULL;
12276 PL_reg_ganch = Nullch;
12277 PL_reg_sv = Nullsv;
53c4c00c 12278 PL_reg_match_utf8 = FALSE;
1d7c1841
GS
12279 PL_reg_magic = (MAGIC*)NULL;
12280 PL_reg_oldpos = 0;
12281 PL_reg_oldcurpm = (PMOP*)NULL;
12282 PL_reg_curpm = (PMOP*)NULL;
12283 PL_reg_oldsaved = Nullch;
12284 PL_reg_oldsavedlen = 0;
ed252734 12285#ifdef PERL_COPY_ON_WRITE
504cff3b 12286 PL_nrs = Nullsv;
ed252734 12287#endif
1d7c1841
GS
12288 PL_reg_maxiter = 0;
12289 PL_reg_leftiter = 0;
12290 PL_reg_poscache = Nullch;
12291 PL_reg_poscache_size= 0;
12292
12293 /* RE engine - function pointers */
12294 PL_regcompp = proto_perl->Tregcompp;
12295 PL_regexecp = proto_perl->Tregexecp;
12296 PL_regint_start = proto_perl->Tregint_start;
12297 PL_regint_string = proto_perl->Tregint_string;
12298 PL_regfree = proto_perl->Tregfree;
12299
12300 PL_reginterp_cnt = 0;
12301 PL_reg_starttry = 0;
12302
a2efc822
SC
12303 /* Pluggable optimizer */
12304 PL_peepp = proto_perl->Tpeepp;
12305
081fc587
AB
12306 PL_stashcache = newHV();
12307
a0739874
DM
12308 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
12309 ptr_table_free(PL_ptr_table);
12310 PL_ptr_table = NULL;
12311 }
8cf8f3d1 12312
f284b03f
AMS
12313 /* Call the ->CLONE method, if it exists, for each of the stashes
12314 identified by sv_dup() above.
12315 */
d2d73c3e
AB
12316 while(av_len(param->stashes) != -1) {
12317 HV* stash = (HV*) av_shift(param->stashes);
f284b03f
AMS
12318 GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
12319 if (cloner && GvCV(cloner)) {
12320 dSP;
12321 ENTER;
12322 SAVETMPS;
12323 PUSHMARK(SP);
dc507217 12324 XPUSHs(sv_2mortal(newSVpv(HvNAME(stash), 0)));
f284b03f
AMS
12325 PUTBACK;
12326 call_sv((SV*)GvCV(cloner), G_DISCARD);
12327 FREETMPS;
12328 LEAVE;
12329 }
4a09accc 12330 }
a0739874 12331
dc507217 12332 SvREFCNT_dec(param->stashes);
dc507217 12333
1d7c1841 12334 return my_perl;
1d7c1841
GS
12335}
12336
1d7c1841 12337#endif /* USE_ITHREADS */
a0ae6670 12338
9f4817db 12339/*
ccfc67b7
JH
12340=head1 Unicode Support
12341
9f4817db
JH
12342=for apidoc sv_recode_to_utf8
12343
5d170f3a
JH
12344The encoding is assumed to be an Encode object, on entry the PV
12345of the sv is assumed to be octets in that encoding, and the sv
12346will be converted into Unicode (and UTF-8).
9f4817db 12347
5d170f3a
JH
12348If the sv already is UTF-8 (or if it is not POK), or if the encoding
12349is not a reference, nothing is done to the sv. If the encoding is not
1768d7eb
JH
12350an C<Encode::XS> Encoding object, bad things will happen.
12351(See F<lib/encoding.pm> and L<Encode>).
9f4817db 12352
5d170f3a 12353The PV of the sv is returned.
9f4817db 12354
5d170f3a
JH
12355=cut */
12356
12357char *
12358Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
12359{
220e2d4e 12360 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
d0063567
DK
12361 SV *uni;
12362 STRLEN len;
12363 char *s;
12364 dSP;
12365 ENTER;
12366 SAVETMPS;
220e2d4e 12367 save_re_context();
d0063567
DK
12368 PUSHMARK(sp);
12369 EXTEND(SP, 3);
12370 XPUSHs(encoding);
12371 XPUSHs(sv);
7a5fa8a2 12372/*
f9893866
NIS
12373 NI-S 2002/07/09
12374 Passing sv_yes is wrong - it needs to be or'ed set of constants
7a5fa8a2 12375 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
f9893866
NIS
12376 remove converted chars from source.
12377
12378 Both will default the value - let them.
7a5fa8a2 12379
d0063567 12380 XPUSHs(&PL_sv_yes);
f9893866 12381*/
d0063567
DK
12382 PUTBACK;
12383 call_method("decode", G_SCALAR);
12384 SPAGAIN;
12385 uni = POPs;
12386 PUTBACK;
12387 s = SvPV(uni, len);
d0063567
DK
12388 if (s != SvPVX(sv)) {
12389 SvGROW(sv, len + 1);
12390 Move(s, SvPVX(sv), len, char);
12391 SvCUR_set(sv, len);
12392 SvPVX(sv)[len] = 0;
12393 }
12394 FREETMPS;
12395 LEAVE;
d0063567 12396 SvUTF8_on(sv);
95899a2a 12397 return SvPVX(sv);
f9893866 12398 }
95899a2a 12399 return SvPOKp(sv) ? SvPVX(sv) : NULL;
9f4817db
JH
12400}
12401
220e2d4e
IH
12402/*
12403=for apidoc sv_cat_decode
12404
12405The encoding is assumed to be an Encode object, the PV of the ssv is
12406assumed to be octets in that encoding and decoding the input starts
12407from the position which (PV + *offset) pointed to. The dsv will be
12408concatenated the decoded UTF-8 string from ssv. Decoding will terminate
12409when the string tstr appears in decoding output or the input ends on
12410the PV of the ssv. The value which the offset points will be modified
12411to the last input position on the ssv.
68795e93 12412
220e2d4e
IH
12413Returns TRUE if the terminator was found, else returns FALSE.
12414
12415=cut */
12416
12417bool
12418Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
12419 SV *ssv, int *offset, char *tstr, int tlen)
12420{
a73e8557 12421 bool ret = FALSE;
220e2d4e 12422 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
220e2d4e
IH
12423 SV *offsv;
12424 dSP;
12425 ENTER;
12426 SAVETMPS;
12427 save_re_context();
12428 PUSHMARK(sp);
12429 EXTEND(SP, 6);
12430 XPUSHs(encoding);
12431 XPUSHs(dsv);
12432 XPUSHs(ssv);
12433 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
12434 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
12435 PUTBACK;
12436 call_method("cat_decode", G_SCALAR);
12437 SPAGAIN;
12438 ret = SvTRUE(TOPs);
12439 *offset = SvIV(offsv);
12440 PUTBACK;
12441 FREETMPS;
12442 LEAVE;
220e2d4e 12443 }
a73e8557
JH
12444 else
12445 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
12446 return ret;
220e2d4e 12447}
f9893866 12448
241d1a3b
NC
12449/*
12450 * Local variables:
12451 * c-indentation-style: bsd
12452 * c-basic-offset: 4
12453 * indent-tabs-mode: t
12454 * End:
12455 *
edf815fd 12456 * vim: shiftwidth=4:
241d1a3b 12457*/