This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PERL_DEBUG_COW for SvUVX and SvPVX
[perl5.git] / sv.c
CommitLineData
a0d0e21e 1/* sv.c
79072805 2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
241d1a3b 4 * 2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
79072805
LW
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
a0d0e21e 9 * "I wonder what the Entish is for 'yes' and 'no'," he thought.
645c22ef
DM
10 *
11 *
5e045b90
AMS
12 * This file contains the code that creates, manipulates and destroys
13 * scalar values (SVs). The other types (AV, HV, GV, etc.) reuse the
14 * structure of an SV, so their creation and destruction is handled
15 * here; higher-level functions are in av.c, hv.c, and so on. Opcode
16 * level functions (eg. substr, split, join) for each of the types are
17 * in the pp*.c files.
79072805
LW
18 */
19
20#include "EXTERN.h"
864dbfa3 21#define PERL_IN_SV_C
79072805 22#include "perl.h"
d2f185dc 23#include "regcomp.h"
79072805 24
51371543 25#define FCALL *f
2c5424a7 26
2f8ed50e
OS
27#ifdef __Lynx__
28/* Missing proto on LynxOS */
29 char *gconvert(double, int, int, char *);
30#endif
31
e23c8137
JH
32#ifdef PERL_UTF8_CACHE_ASSERT
33/* The cache element 0 is the Unicode offset;
34 * the cache element 1 is the byte offset of the element 0;
35 * the cache element 2 is the Unicode length of the substring;
36 * the cache element 3 is the byte length of the substring;
37 * The checking of the substring side would be good
38 * but substr() has enough code paths to make my head spin;
39 * if adding more checks watch out for the following tests:
40 * t/op/index.t t/op/length.t t/op/pat.t t/op/substr.t
41 * lib/utf8.t lib/Unicode/Collate/t/index.t
42 * --jhi
43 */
44#define ASSERT_UTF8_CACHE(cache) \
45 STMT_START { if (cache) { assert((cache)[0] <= (cache)[1]); } } STMT_END
46#else
47#define ASSERT_UTF8_CACHE(cache) NOOP
48#endif
49
765f542d
NC
50#ifdef PERL_COPY_ON_WRITE
51#define SV_COW_NEXT_SV(sv) INT2PTR(SV *,SvUVX(sv))
607fa7f2 52#define SV_COW_NEXT_SV_SET(current,next) SvUV_set(current, PTR2UV(next))
b5ccf5f2 53/* This is a pessimistic view. Scalar must be purely a read-write PV to copy-
765f542d 54 on-write. */
765f542d 55#endif
645c22ef
DM
56
57/* ============================================================================
58
59=head1 Allocation and deallocation of SVs.
60
5e045b90
AMS
61An SV (or AV, HV, etc.) is allocated in two parts: the head (struct sv,
62av, hv...) contains type and reference count information, as well as a
63pointer to the body (struct xrv, xpv, xpviv...), which contains fields
64specific to each type.
65
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();
45977657 1901 SvIV_set(sv, iv);
79072805
LW
1902 break;
1903 case SVt_NV:
1904 SvANY(sv) = new_XNV();
9d6ce603 1905 SvNV_set(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();
f880fe2f 1913 SvPV_set(sv, pv);
79072805
LW
1914 SvCUR(sv) = cur;
1915 SvLEN(sv) = len;
1916 break;
1917 case SVt_PVIV:
1918 SvANY(sv) = new_XPVIV();
f880fe2f 1919 SvPV_set(sv, pv);
79072805
LW
1920 SvCUR(sv) = cur;
1921 SvLEN(sv) = len;
45977657 1922 SvIV_set(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();
f880fe2f 1929 SvPV_set(sv, pv);
79072805
LW
1930 SvCUR(sv) = cur;
1931 SvLEN(sv) = len;
45977657 1932 SvIV_set(sv, iv);
9d6ce603 1933 SvNV_set(sv, nv);
79072805
LW
1934 break;
1935 case SVt_PVMG:
1936 SvANY(sv) = new_XPVMG();
f880fe2f 1937 SvPV_set(sv, pv);
79072805
LW
1938 SvCUR(sv) = cur;
1939 SvLEN(sv) = len;
45977657 1940 SvIV_set(sv, iv);
9d6ce603 1941 SvNV_set(sv, nv);
79072805
LW
1942 SvMAGIC(sv) = magic;
1943 SvSTASH(sv) = stash;
1944 break;
1945 case SVt_PVLV:
1946 SvANY(sv) = new_XPVLV();
f880fe2f 1947 SvPV_set(sv, pv);
79072805
LW
1948 SvCUR(sv) = cur;
1949 SvLEN(sv) = len;
45977657 1950 SvIV_set(sv, iv);
9d6ce603 1951 SvNV_set(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);
f880fe2f 1968 SvPV_set(sv, (char*)0);
d1bf51dd 1969 AvMAX(sv) = -1;
93965878 1970 AvFILLp(sv) = -1;
45977657 1971 SvIV_set(sv, 0);
9d6ce603 1972 SvNV_set(sv, 0.0);
463ee0b2
LW
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);
f880fe2f 1983 SvPV_set(sv, (char*)0);
463ee0b2
LW
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);
f880fe2f 1998 SvPV_set(sv, pv);
79072805
LW
1999 SvCUR(sv) = cur;
2000 SvLEN(sv) = len;
45977657 2001 SvIV_set(sv, iv);
9d6ce603 2002 SvNV_set(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();
f880fe2f 2008 SvPV_set(sv, pv);
79072805
LW
2009 SvCUR(sv) = cur;
2010 SvLEN(sv) = len;
45977657 2011 SvIV_set(sv, iv);
9d6ce603 2012 SvNV_set(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();
f880fe2f 2023 SvPV_set(sv, pv);
79072805
LW
2024 SvCUR(sv) = cur;
2025 SvLEN(sv) = len;
45977657 2026 SvIV_set(sv, iv);
9d6ce603 2027 SvNV_set(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);
f880fe2f 2037 SvPV_set(sv, pv);
79072805
LW
2038 SvCUR(sv) = cur;
2039 SvLEN(sv) = len;
45977657 2040 SvIV_set(sv, iv);
9d6ce603 2041 SvNV_set(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);
f880fe2f 2048 SvPV_set(sv, pv);
8990e307
LW
2049 SvCUR(sv) = cur;
2050 SvLEN(sv) = len;
45977657 2051 SvIV_set(sv, iv);
9d6ce603 2052 SvNV_set(sv, nv);
8990e307
LW
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);
f880fe2f 2077 SvPV_set(sv, 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 */
45977657 2184 SvIV_set(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);
607fa7f2 2229 SvUV_set(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 }
9d6ce603 2294 SvNV_set(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);
45977657 2505 SvIV_set(sv, IV_MIN);
28e5dec8
JH
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);
607fa7f2 2512 SvUV_set(sv, UV_MAX);
28e5dec8
JH
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) {
45977657 2520 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
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);
607fa7f2 2529 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
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) {
45977657 2628 SvIV_set(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 {
607fa7f2 2666 SvUV_set(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) {
45977657 2729 SvIV_set(sv, (IV)value);
c2988b20 2730 } else {
607fa7f2 2731 SvUV_set(sv, value);
c2988b20
NC
2732 SvIsUV_on(sv);
2733 }
2734 } else {
2735 /* 2s complement assumption */
2736 if (value <= (UV)IV_MIN) {
45977657 2737 SvIV_set(sv, -(IV)value);
c2988b20
NC
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);
9d6ce603 2746 SvNV_set(sv, -(NV)value);
45977657 2747 SvIV_set(sv, IV_MIN);
c2988b20
NC
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). */
9d6ce603 2758 SvNV_set(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) {
45977657 2776 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
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 */
607fa7f2 2787 SvUV_set(sv, UV_MAX);
c2988b20
NC
2788 SvIsUV_on(sv);
2789 } else {
607fa7f2 2790 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
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);
45977657 2816 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
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) {
45977657 2933 SvIV_set(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 2970 else {
607fa7f2 2971 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
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) {
45977657 3030 SvIV_set(sv, (IV)value);
28e5dec8
JH
3031 } else {
3032 /* it didn't overflow, and it was positive. */
607fa7f2 3033 SvUV_set(sv, value);
28e5dec8
JH
3034 SvIsUV_on(sv);
3035 }
c2988b20
NC
3036 } else {
3037 /* 2s complement assumption */
3038 if (value <= (UV)IV_MIN) {
45977657 3039 SvIV_set(sv, -(IV)value);
c2988b20
NC
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);
9d6ce603 3048 SvNV_set(sv, -(NV)value);
45977657 3049 SvIV_set(sv, IV_MIN);
c2988b20
NC
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. */
9d6ce603 3057 SvNV_set(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) {
45977657 3074 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
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 */
607fa7f2 3085 SvUV_set(sv, UV_MAX);
c2988b20
NC
3086 SvIsUV_on(sv);
3087 } else {
607fa7f2 3088 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
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);
45977657 3114 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
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)) {
9d6ce603 3229 SvNV_set(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 */
9d6ce603 3251 SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
c2988b20 3252 } else
9d6ce603 3253 SvNV_set(sv, Atof(SvPVX(sv)));
28e5dec8
JH
3254 SvNOK_on(sv);
3255#else
9d6ce603 3256 SvNV_set(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 3279 if (numtype & IS_NUMBER_NEG) {
45977657 3280 SvIV_set(sv, -(IV)value);
c2988b20 3281 } else if (value <= (UV)IV_MAX) {
45977657 3282 SvIV_set(sv, (IV)value);
c2988b20 3283 } else {
607fa7f2 3284 SvUV_set(sv, value);
c2988b20
NC
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 3997 len = SvCUR(sv) + 1; /* Plus the \0 */
f880fe2f 3998 SvPV_set(sv, (char*)bytes_to_utf8((U8*)s, &len));
0a378802
JH
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);
45977657 4212 SvIV_set(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 }
9d6ce603 4234 SvNV_set(dstr, SvNVX(sstr));
aece5585 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;
9d6ce603 4500 SvNV_set(dstr, SvNVX(sstr));
ed6116ce 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);
45977657 4508 SvIV_set(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));
607fa7f2 4613 SvUV_set(dstr, hash);
765f542d
NC
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;
9d6ce603 4643 SvNV_set(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);
45977657 4651 SvIV_set(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);
45977657 4670 SvIV_set(dstr, SvIVX(sstr));
3332b3c1
JH
4671 if (sflags & SVp_NOK) {
4672 if (sflags & SVf_NOK)
4673 (void)SvNOK_on(dstr);
4674 else
4675 (void)SvNOKp_on(dstr);
9d6ce603 4676 SvNV_set(dstr, SvNVX(sstr));
3332b3c1
JH
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 }
9d6ce603 4686 SvNV_set(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"));
607fa7f2 4755 SvUV_set(dstr, hash);
ed252734
NC
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);
f880fe2f 4909 SvPV_set(sv, ptr);
463ee0b2
LW
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: */
f880fe2f 5017 SvPV_set(sv, (char*)0);
765f542d
NC
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);
f880fe2f 5046 SvPV_set(sv, (char*)0);
5c98da1c 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 }
45977657 5111 SvIV_set(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;
f880fe2f 5120 SvPV_set(sv, SvPVX(sv) + delta);
45977657 5121 SvIV_set(sv, 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);
607fa7f2 7347 SvUV_set(sv, SvUVX(sv) + 1);
25da4f38
IZ
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);
45977657 7353 SvIV_set(sv, SvIVX(sv) + 1);
1c846c1f 7354 }
55497cff 7355 }
79072805
LW
7356 return;
7357 }
28e5dec8
JH
7358 if (flags & SVp_NOK) {
7359 (void)SvNOK_only(sv);
9d6ce603 7360 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
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);
45977657 7368 SvIV_set(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);
9d6ce603 7395 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
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);
45977657 7497 SvIV_set(sv, -1);
25da4f38
IZ
7498 }
7499 else {
7500 (void)SvIOK_only_UV(sv);
607fa7f2 7501 SvUV_set(sv, SvUVX(sv) + 1);
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);
45977657 7508 SvIV_set(sv, SvIVX(sv) - 1);
1c846c1f 7509 }
55497cff 7510 }
7511 return;
7512 }
28e5dec8 7513 if (flags & SVp_NOK) {
9d6ce603 7514 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
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);
f599b64b 7521 SvNV_set(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);
9d6ce603 7543 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
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);
f880fe2f 7712 SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
1c846c1f 7713 SvCUR(sv) = len;
607fa7f2 7714 SvUV_set(sv, hash);
1c846c1f
NIS
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{
07409e01
NC
8430 /* The fact that I don't need to downcast to char * everywhere, only in ?:
8431 inside return suggests a const propagation bug in g++. */
c86bf373 8432 if (ob && SvOBJECT(sv)) {
1cb0ed9b 8433 char *name = HvNAME(SvSTASH(sv));
07409e01 8434 return name ? name : (char *) "__ANON__";
c86bf373 8435 }
a0d0e21e
LW
8436 else {
8437 switch (SvTYPE(sv)) {
8438 case SVt_NULL:
8439 case SVt_IV:
8440 case SVt_NV:
8441 case SVt_RV:
8442 case SVt_PV:
8443 case SVt_PVIV:
8444 case SVt_PVNV:
8445 case SVt_PVMG:
8446 case SVt_PVBM:
1cb0ed9b 8447 if (SvVOK(sv))
439cb1c4 8448 return "VSTRING";
a0d0e21e
LW
8449 if (SvROK(sv))
8450 return "REF";
8451 else
8452 return "SCALAR";
1cb0ed9b 8453
07409e01 8454 case SVt_PVLV: return (char *) (SvROK(sv) ? "REF"
be65207d
DM
8455 /* tied lvalues should appear to be
8456 * scalars for backwards compatitbility */
8457 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
07409e01 8458 ? "SCALAR" : "LVALUE");
a0d0e21e
LW
8459 case SVt_PVAV: return "ARRAY";
8460 case SVt_PVHV: return "HASH";
8461 case SVt_PVCV: return "CODE";
8462 case SVt_PVGV: return "GLOB";
1d2dff63 8463 case SVt_PVFM: return "FORMAT";
27f9d8f3 8464 case SVt_PVIO: return "IO";
a0d0e21e
LW
8465 default: return "UNKNOWN";
8466 }
8467 }
8468}
8469
954c1994
GS
8470/*
8471=for apidoc sv_isobject
8472
8473Returns a boolean indicating whether the SV is an RV pointing to a blessed
8474object. If the SV is not an RV, or if the object is not blessed, then this
8475will return false.
8476
8477=cut
8478*/
8479
463ee0b2 8480int
864dbfa3 8481Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 8482{
68dc0745 8483 if (!sv)
8484 return 0;
8485 if (SvGMAGICAL(sv))
8486 mg_get(sv);
85e6fe83
LW
8487 if (!SvROK(sv))
8488 return 0;
8489 sv = (SV*)SvRV(sv);
8490 if (!SvOBJECT(sv))
8491 return 0;
8492 return 1;
8493}
8494
954c1994
GS
8495/*
8496=for apidoc sv_isa
8497
8498Returns a boolean indicating whether the SV is blessed into the specified
8499class. This does not check for subtypes; use C<sv_derived_from> to verify
8500an inheritance relationship.
8501
8502=cut
8503*/
8504
85e6fe83 8505int
864dbfa3 8506Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 8507{
68dc0745 8508 if (!sv)
8509 return 0;
8510 if (SvGMAGICAL(sv))
8511 mg_get(sv);
ed6116ce 8512 if (!SvROK(sv))
463ee0b2 8513 return 0;
ed6116ce
LW
8514 sv = (SV*)SvRV(sv);
8515 if (!SvOBJECT(sv))
463ee0b2 8516 return 0;
e27ad1f2
AV
8517 if (!HvNAME(SvSTASH(sv)))
8518 return 0;
463ee0b2
LW
8519
8520 return strEQ(HvNAME(SvSTASH(sv)), name);
8521}
8522
954c1994
GS
8523/*
8524=for apidoc newSVrv
8525
8526Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
8527it will be upgraded to one. If C<classname> is non-null then the new SV will
8528be blessed in the specified package. The new SV is returned and its
8529reference count is 1.
8530
8531=cut
8532*/
8533
463ee0b2 8534SV*
864dbfa3 8535Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 8536{
463ee0b2
LW
8537 SV *sv;
8538
4561caa4 8539 new_SV(sv);
51cf62d8 8540
765f542d 8541 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 8542 SvAMAGIC_off(rv);
51cf62d8 8543
0199fce9
JD
8544 if (SvTYPE(rv) >= SVt_PVMG) {
8545 U32 refcnt = SvREFCNT(rv);
8546 SvREFCNT(rv) = 0;
8547 sv_clear(rv);
8548 SvFLAGS(rv) = 0;
8549 SvREFCNT(rv) = refcnt;
8550 }
8551
51cf62d8 8552 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
8553 sv_upgrade(rv, SVt_RV);
8554 else if (SvTYPE(rv) > SVt_RV) {
0c34ef67 8555 SvOOK_off(rv);
0199fce9
JD
8556 if (SvPVX(rv) && SvLEN(rv))
8557 Safefree(SvPVX(rv));
8558 SvCUR_set(rv, 0);
8559 SvLEN_set(rv, 0);
8560 }
51cf62d8 8561
0c34ef67 8562 SvOK_off(rv);
053fc874 8563 SvRV(rv) = sv;
ed6116ce 8564 SvROK_on(rv);
463ee0b2 8565
a0d0e21e
LW
8566 if (classname) {
8567 HV* stash = gv_stashpv(classname, TRUE);
8568 (void)sv_bless(rv, stash);
8569 }
8570 return sv;
8571}
8572
954c1994
GS
8573/*
8574=for apidoc sv_setref_pv
8575
8576Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
8577argument will be upgraded to an RV. That RV will be modified to point to
8578the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
8579into the SV. The C<classname> argument indicates the package for the
8580blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8581will have a reference count of 1, and the RV will be returned.
954c1994
GS
8582
8583Do not use with other Perl types such as HV, AV, SV, CV, because those
8584objects will become corrupted by the pointer copy process.
8585
8586Note that C<sv_setref_pvn> copies the string while this copies the pointer.
8587
8588=cut
8589*/
8590
a0d0e21e 8591SV*
864dbfa3 8592Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 8593{
189b2af5 8594 if (!pv) {
3280af22 8595 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
8596 SvSETMAGIC(rv);
8597 }
a0d0e21e 8598 else
56431972 8599 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
8600 return rv;
8601}
8602
954c1994
GS
8603/*
8604=for apidoc sv_setref_iv
8605
8606Copies an integer into a new SV, optionally blessing the SV. The C<rv>
8607argument will be upgraded to an RV. That RV will be modified to point to
8608the new SV. The C<classname> argument indicates the package for the
8609blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8610will have a reference count of 1, and the RV will be returned.
954c1994
GS
8611
8612=cut
8613*/
8614
a0d0e21e 8615SV*
864dbfa3 8616Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
8617{
8618 sv_setiv(newSVrv(rv,classname), iv);
8619 return rv;
8620}
8621
954c1994 8622/*
e1c57cef
JH
8623=for apidoc sv_setref_uv
8624
8625Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
8626argument will be upgraded to an RV. That RV will be modified to point to
8627the new SV. The C<classname> argument indicates the package for the
8628blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8629will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
8630
8631=cut
8632*/
8633
8634SV*
8635Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
8636{
8637 sv_setuv(newSVrv(rv,classname), uv);
8638 return rv;
8639}
8640
8641/*
954c1994
GS
8642=for apidoc sv_setref_nv
8643
8644Copies a double into a new SV, optionally blessing the SV. The C<rv>
8645argument will be upgraded to an RV. That RV will be modified to point to
8646the new SV. The C<classname> argument indicates the package for the
8647blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8648will have a reference count of 1, and the RV will be returned.
954c1994
GS
8649
8650=cut
8651*/
8652
a0d0e21e 8653SV*
65202027 8654Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
8655{
8656 sv_setnv(newSVrv(rv,classname), nv);
8657 return rv;
8658}
463ee0b2 8659
954c1994
GS
8660/*
8661=for apidoc sv_setref_pvn
8662
8663Copies a string into a new SV, optionally blessing the SV. The length of the
8664string must be specified with C<n>. The C<rv> argument will be upgraded to
8665an RV. That RV will be modified to point to the new SV. The C<classname>
8666argument indicates the package for the blessing. Set C<classname> to
7a5fa8a2 8667C<Nullch> to avoid the blessing. The new SV will have a reference count
d34c2299 8668of 1, and the RV will be returned.
954c1994
GS
8669
8670Note that C<sv_setref_pv> copies the pointer while this copies the string.
8671
8672=cut
8673*/
8674
a0d0e21e 8675SV*
864dbfa3 8676Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
8677{
8678 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
8679 return rv;
8680}
8681
954c1994
GS
8682/*
8683=for apidoc sv_bless
8684
8685Blesses an SV into a specified package. The SV must be an RV. The package
8686must be designated by its stash (see C<gv_stashpv()>). The reference count
8687of the SV is unaffected.
8688
8689=cut
8690*/
8691
a0d0e21e 8692SV*
864dbfa3 8693Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 8694{
76e3520e 8695 SV *tmpRef;
a0d0e21e 8696 if (!SvROK(sv))
cea2e8a9 8697 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
8698 tmpRef = SvRV(sv);
8699 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
8700 if (SvREADONLY(tmpRef))
cea2e8a9 8701 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
8702 if (SvOBJECT(tmpRef)) {
8703 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8704 --PL_sv_objcount;
76e3520e 8705 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 8706 }
a0d0e21e 8707 }
76e3520e
GS
8708 SvOBJECT_on(tmpRef);
8709 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8710 ++PL_sv_objcount;
76e3520e
GS
8711 (void)SvUPGRADE(tmpRef, SVt_PVMG);
8712 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
a0d0e21e 8713
2e3febc6
CS
8714 if (Gv_AMG(stash))
8715 SvAMAGIC_on(sv);
8716 else
8717 SvAMAGIC_off(sv);
a0d0e21e 8718
1edbfb88
AB
8719 if(SvSMAGICAL(tmpRef))
8720 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8721 mg_set(tmpRef);
8722
8723
ecdeb87c 8724
a0d0e21e
LW
8725 return sv;
8726}
8727
645c22ef 8728/* Downgrades a PVGV to a PVMG.
645c22ef
DM
8729 */
8730
76e3520e 8731STATIC void
cea2e8a9 8732S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 8733{
850fabdf
GS
8734 void *xpvmg;
8735
a0d0e21e
LW
8736 assert(SvTYPE(sv) == SVt_PVGV);
8737 SvFAKE_off(sv);
8738 if (GvGP(sv))
1edc1566 8739 gp_free((GV*)sv);
e826b3c7
GS
8740 if (GvSTASH(sv)) {
8741 SvREFCNT_dec(GvSTASH(sv));
8742 GvSTASH(sv) = Nullhv;
8743 }
14befaf4 8744 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 8745 Safefree(GvNAME(sv));
a5f75d66 8746 GvMULTI_off(sv);
850fabdf
GS
8747
8748 /* need to keep SvANY(sv) in the right arena */
8749 xpvmg = new_XPVMG();
8750 StructCopy(SvANY(sv), xpvmg, XPVMG);
8751 del_XPVGV(SvANY(sv));
8752 SvANY(sv) = xpvmg;
8753
a0d0e21e
LW
8754 SvFLAGS(sv) &= ~SVTYPEMASK;
8755 SvFLAGS(sv) |= SVt_PVMG;
8756}
8757
954c1994 8758/*
840a7b70 8759=for apidoc sv_unref_flags
954c1994
GS
8760
8761Unsets the RV status of the SV, and decrements the reference count of
8762whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
8763as a reversal of C<newSVrv>. The C<cflags> argument can contain
8764C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8765(otherwise the decrementing is conditional on the reference count being
8766different from one or the reference being a readonly SV).
7889fe52 8767See C<SvROK_off>.
954c1994
GS
8768
8769=cut
8770*/
8771
ed6116ce 8772void
840a7b70 8773Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 8774{
a0d0e21e 8775 SV* rv = SvRV(sv);
810b8aa5
GS
8776
8777 if (SvWEAKREF(sv)) {
8778 sv_del_backref(sv);
8779 SvWEAKREF_off(sv);
8780 SvRV(sv) = 0;
8781 return;
8782 }
ed6116ce
LW
8783 SvRV(sv) = 0;
8784 SvROK_off(sv);
04ca4930
NC
8785 /* You can't have a || SvREADONLY(rv) here, as $a = $$a, where $a was
8786 assigned to as BEGIN {$a = \"Foo"} will fail. */
8787 if (SvREFCNT(rv) != 1 || (flags & SV_IMMEDIATE_UNREF))
4633a7c4 8788 SvREFCNT_dec(rv);
840a7b70 8789 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 8790 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 8791}
8990e307 8792
840a7b70
IZ
8793/*
8794=for apidoc sv_unref
8795
8796Unsets the RV status of the SV, and decrements the reference count of
8797whatever was being referenced by the RV. This can almost be thought of
8798as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 8799being zero. See C<SvROK_off>.
840a7b70
IZ
8800
8801=cut
8802*/
8803
8804void
8805Perl_sv_unref(pTHX_ SV *sv)
8806{
8807 sv_unref_flags(sv, 0);
8808}
8809
645c22ef
DM
8810/*
8811=for apidoc sv_taint
8812
8813Taint an SV. Use C<SvTAINTED_on> instead.
8814=cut
8815*/
8816
bbce6d69 8817void
864dbfa3 8818Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 8819{
14befaf4 8820 sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
bbce6d69 8821}
8822
645c22ef
DM
8823/*
8824=for apidoc sv_untaint
8825
8826Untaint an SV. Use C<SvTAINTED_off> instead.
8827=cut
8828*/
8829
bbce6d69 8830void
864dbfa3 8831Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 8832{
13f57bf8 8833 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8834 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 8835 if (mg)
565764a8 8836 mg->mg_len &= ~1;
36477c24 8837 }
bbce6d69 8838}
8839
645c22ef
DM
8840/*
8841=for apidoc sv_tainted
8842
8843Test an SV for taintedness. Use C<SvTAINTED> instead.
8844=cut
8845*/
8846
bbce6d69 8847bool
864dbfa3 8848Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 8849{
13f57bf8 8850 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8851 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
155aba94 8852 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 8853 return TRUE;
8854 }
8855 return FALSE;
bbce6d69 8856}
8857
09540bc3
JH
8858/*
8859=for apidoc sv_setpviv
8860
8861Copies an integer into the given SV, also updating its string value.
8862Does not handle 'set' magic. See C<sv_setpviv_mg>.
8863
8864=cut
8865*/
8866
8867void
8868Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
8869{
8870 char buf[TYPE_CHARS(UV)];
8871 char *ebuf;
8872 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8873
8874 sv_setpvn(sv, ptr, ebuf - ptr);
8875}
8876
8877/*
8878=for apidoc sv_setpviv_mg
8879
8880Like C<sv_setpviv>, but also handles 'set' magic.
8881
8882=cut
8883*/
8884
8885void
8886Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
8887{
8888 char buf[TYPE_CHARS(UV)];
8889 char *ebuf;
8890 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8891
8892 sv_setpvn(sv, ptr, ebuf - ptr);
8893 SvSETMAGIC(sv);
8894}
8895
cea2e8a9 8896#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8897
8898/* pTHX_ magic can't cope with varargs, so this is a no-context
8899 * version of the main function, (which may itself be aliased to us).
8900 * Don't access this version directly.
8901 */
8902
cea2e8a9
GS
8903void
8904Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
8905{
8906 dTHX;
8907 va_list args;
8908 va_start(args, pat);
c5be433b 8909 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
8910 va_end(args);
8911}
8912
645c22ef
DM
8913/* pTHX_ magic can't cope with varargs, so this is a no-context
8914 * version of the main function, (which may itself be aliased to us).
8915 * Don't access this version directly.
8916 */
cea2e8a9
GS
8917
8918void
8919Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
8920{
8921 dTHX;
8922 va_list args;
8923 va_start(args, pat);
c5be433b 8924 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 8925 va_end(args);
cea2e8a9
GS
8926}
8927#endif
8928
954c1994
GS
8929/*
8930=for apidoc sv_setpvf
8931
bffc3d17
SH
8932Works like C<sv_catpvf> but copies the text into the SV instead of
8933appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
8934
8935=cut
8936*/
8937
46fc3d4c 8938void
864dbfa3 8939Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8940{
8941 va_list args;
46fc3d4c 8942 va_start(args, pat);
c5be433b 8943 sv_vsetpvf(sv, pat, &args);
46fc3d4c 8944 va_end(args);
8945}
8946
bffc3d17
SH
8947/*
8948=for apidoc sv_vsetpvf
8949
8950Works like C<sv_vcatpvf> but copies the text into the SV instead of
8951appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
8952
8953Usually used via its frontend C<sv_setpvf>.
8954
8955=cut
8956*/
645c22ef 8957
c5be433b
GS
8958void
8959Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8960{
8961 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8962}
ef50df4b 8963
954c1994
GS
8964/*
8965=for apidoc sv_setpvf_mg
8966
8967Like C<sv_setpvf>, but also handles 'set' magic.
8968
8969=cut
8970*/
8971
ef50df4b 8972void
864dbfa3 8973Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8974{
8975 va_list args;
ef50df4b 8976 va_start(args, pat);
c5be433b 8977 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 8978 va_end(args);
c5be433b
GS
8979}
8980
bffc3d17
SH
8981/*
8982=for apidoc sv_vsetpvf_mg
8983
8984Like C<sv_vsetpvf>, but also handles 'set' magic.
8985
8986Usually used via its frontend C<sv_setpvf_mg>.
8987
8988=cut
8989*/
645c22ef 8990
c5be433b
GS
8991void
8992Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8993{
8994 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
8995 SvSETMAGIC(sv);
8996}
8997
cea2e8a9 8998#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8999
9000/* pTHX_ magic can't cope with varargs, so this is a no-context
9001 * version of the main function, (which may itself be aliased to us).
9002 * Don't access this version directly.
9003 */
9004
cea2e8a9
GS
9005void
9006Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
9007{
9008 dTHX;
9009 va_list args;
9010 va_start(args, pat);
c5be433b 9011 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
9012 va_end(args);
9013}
9014
645c22ef
DM
9015/* pTHX_ magic can't cope with varargs, so this is a no-context
9016 * version of the main function, (which may itself be aliased to us).
9017 * Don't access this version directly.
9018 */
9019
cea2e8a9
GS
9020void
9021Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
9022{
9023 dTHX;
9024 va_list args;
9025 va_start(args, pat);
c5be433b 9026 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 9027 va_end(args);
cea2e8a9
GS
9028}
9029#endif
9030
954c1994
GS
9031/*
9032=for apidoc sv_catpvf
9033
d5ce4a7c
GA
9034Processes its arguments like C<sprintf> and appends the formatted
9035output to an SV. If the appended data contains "wide" characters
9036(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
9037and characters >255 formatted with %c), the original SV might get
bffc3d17 9038upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
9039C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
9040valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 9041
d5ce4a7c 9042=cut */
954c1994 9043
46fc3d4c 9044void
864dbfa3 9045Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 9046{
9047 va_list args;
46fc3d4c 9048 va_start(args, pat);
c5be433b 9049 sv_vcatpvf(sv, pat, &args);
46fc3d4c 9050 va_end(args);
9051}
9052
bffc3d17
SH
9053/*
9054=for apidoc sv_vcatpvf
9055
9056Processes its arguments like C<vsprintf> and appends the formatted output
9057to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
9058
9059Usually used via its frontend C<sv_catpvf>.
9060
9061=cut
9062*/
645c22ef 9063
ef50df4b 9064void
c5be433b
GS
9065Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
9066{
9067 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
9068}
9069
954c1994
GS
9070/*
9071=for apidoc sv_catpvf_mg
9072
9073Like C<sv_catpvf>, but also handles 'set' magic.
9074
9075=cut
9076*/
9077
c5be433b 9078void
864dbfa3 9079Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
9080{
9081 va_list args;
ef50df4b 9082 va_start(args, pat);
c5be433b 9083 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 9084 va_end(args);
c5be433b
GS
9085}
9086
bffc3d17
SH
9087/*
9088=for apidoc sv_vcatpvf_mg
9089
9090Like C<sv_vcatpvf>, but also handles 'set' magic.
9091
9092Usually used via its frontend C<sv_catpvf_mg>.
9093
9094=cut
9095*/
645c22ef 9096
c5be433b
GS
9097void
9098Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
9099{
9100 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
9101 SvSETMAGIC(sv);
9102}
9103
954c1994
GS
9104/*
9105=for apidoc sv_vsetpvfn
9106
bffc3d17 9107Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
9108appending it.
9109
bffc3d17 9110Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 9111
954c1994
GS
9112=cut
9113*/
9114
46fc3d4c 9115void
7d5ea4e7 9116Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 9117{
9118 sv_setpvn(sv, "", 0);
7d5ea4e7 9119 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 9120}
9121
645c22ef
DM
9122/* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
9123
2d00ba3b 9124STATIC I32
9dd79c3f 9125S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
9126{
9127 I32 var = 0;
9128 switch (**pattern) {
9129 case '1': case '2': case '3':
9130 case '4': case '5': case '6':
9131 case '7': case '8': case '9':
9132 while (isDIGIT(**pattern))
9133 var = var * 10 + (*(*pattern)++ - '0');
9134 }
9135 return var;
9136}
9dd79c3f 9137#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 9138
4151a5fe
IZ
9139static char *
9140F0convert(NV nv, char *endbuf, STRLEN *len)
9141{
9142 int neg = nv < 0;
9143 UV uv;
9144 char *p = endbuf;
9145
9146 if (neg)
9147 nv = -nv;
9148 if (nv < UV_MAX) {
9149 nv += 0.5;
028f8eaa 9150 uv = (UV)nv;
4151a5fe
IZ
9151 if (uv & 1 && uv == nv)
9152 uv--; /* Round to even */
9153 do {
9154 unsigned dig = uv % 10;
9155 *--p = '0' + dig;
9156 } while (uv /= 10);
9157 if (neg)
9158 *--p = '-';
9159 *len = endbuf - p;
9160 return p;
9161 }
9162 return Nullch;
9163}
9164
9165
954c1994
GS
9166/*
9167=for apidoc sv_vcatpvfn
9168
9169Processes its arguments like C<vsprintf> and appends the formatted output
9170to an SV. Uses an array of SVs if the C style variable argument list is
9171missing (NULL). When running with taint checks enabled, indicates via
9172C<maybe_tainted> if results are untrustworthy (often due to the use of
9173locales).
9174
bffc3d17 9175Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 9176
954c1994
GS
9177=cut
9178*/
9179
1ef29b0e
RGS
9180/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
9181
46fc3d4c 9182void
7d5ea4e7 9183Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 9184{
9185 char *p;
9186 char *q;
9187 char *patend;
fc36a67e 9188 STRLEN origlen;
46fc3d4c 9189 I32 svix = 0;
c635e13b 9190 static char nullstr[] = "(null)";
9c5ffd7c 9191 SV *argsv = Nullsv;
db79b45b
JH
9192 bool has_utf8; /* has the result utf8? */
9193 bool pat_utf8; /* the pattern is in utf8? */
9194 SV *nsv = Nullsv;
4151a5fe
IZ
9195 /* Times 4: a decimal digit takes more than 3 binary digits.
9196 * NV_DIG: mantissa takes than many decimal digits.
9197 * Plus 32: Playing safe. */
9198 char ebuf[IV_DIG * 4 + NV_DIG + 32];
9199 /* large enough for "%#.#f" --chip */
9200 /* what about long double NVs? --jhi */
db79b45b
JH
9201
9202 has_utf8 = pat_utf8 = DO_UTF8(sv);
46fc3d4c 9203
9204 /* no matter what, this is a string now */
fc36a67e 9205 (void)SvPV_force(sv, origlen);
46fc3d4c 9206
fc36a67e 9207 /* special-case "", "%s", and "%_" */
46fc3d4c 9208 if (patlen == 0)
9209 return;
fc36a67e 9210 if (patlen == 2 && pat[0] == '%') {
9211 switch (pat[1]) {
9212 case 's':
c635e13b 9213 if (args) {
73d840c0 9214 const char *s = va_arg(*args, char*);
c635e13b 9215 sv_catpv(sv, s ? s : nullstr);
9216 }
7e2040f0 9217 else if (svix < svmax) {
fc36a67e 9218 sv_catsv(sv, *svargs);
7e2040f0
GS
9219 if (DO_UTF8(*svargs))
9220 SvUTF8_on(sv);
9221 }
fc36a67e 9222 return;
9223 case '_':
9224 if (args) {
7e2040f0
GS
9225 argsv = va_arg(*args, SV*);
9226 sv_catsv(sv, argsv);
9227 if (DO_UTF8(argsv))
9228 SvUTF8_on(sv);
fc36a67e 9229 return;
9230 }
9231 /* See comment on '_' below */
9232 break;
9233 }
46fc3d4c 9234 }
9235
1d917b39 9236#ifndef USE_LONG_DOUBLE
4151a5fe
IZ
9237 /* special-case "%.<number>[gf]" */
9238 if ( patlen <= 5 && pat[0] == '%' && pat[1] == '.'
9239 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
9240 unsigned digits = 0;
9241 const char *pp;
9242
9243 pp = pat + 2;
9244 while (*pp >= '0' && *pp <= '9')
9245 digits = 10 * digits + (*pp++ - '0');
028f8eaa 9246 if (pp - pat == (int)patlen - 1) {
4151a5fe
IZ
9247 NV nv;
9248
9249 if (args)
9250 nv = (NV)va_arg(*args, double);
9251 else if (svix < svmax)
9252 nv = SvNV(*svargs);
9253 else
9254 return;
9255 if (*pp == 'g') {
2873255c
NC
9256 /* Add check for digits != 0 because it seems that some
9257 gconverts are buggy in this case, and we don't yet have
9258 a Configure test for this. */
9259 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
9260 /* 0, point, slack */
2e59c212 9261 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
9262 sv_catpv(sv, ebuf);
9263 if (*ebuf) /* May return an empty string for digits==0 */
9264 return;
9265 }
9266 } else if (!digits) {
9267 STRLEN l;
9268
9269 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
9270 sv_catpvn(sv, p, l);
9271 return;
9272 }
9273 }
9274 }
9275 }
1d917b39 9276#endif /* !USE_LONG_DOUBLE */
4151a5fe 9277
2cf2cfc6 9278 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 9279 has_utf8 = TRUE;
2cf2cfc6 9280
46fc3d4c 9281 patend = (char*)pat + patlen;
9282 for (p = (char*)pat; p < patend; p = q) {
9283 bool alt = FALSE;
9284 bool left = FALSE;
b22c7a20 9285 bool vectorize = FALSE;
211dfcf1 9286 bool vectorarg = FALSE;
2cf2cfc6 9287 bool vec_utf8 = FALSE;
46fc3d4c 9288 char fill = ' ';
9289 char plus = 0;
9290 char intsize = 0;
9291 STRLEN width = 0;
fc36a67e 9292 STRLEN zeros = 0;
46fc3d4c 9293 bool has_precis = FALSE;
9294 STRLEN precis = 0;
58e33a90 9295 I32 osvix = svix;
2cf2cfc6 9296 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
9297#ifdef HAS_LDBL_SPRINTF_BUG
9298 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 9299 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
9300 bool fix_ldbl_sprintf_bug = FALSE;
9301#endif
205f51d8 9302
46fc3d4c 9303 char esignbuf[4];
89ebb4a3 9304 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 9305 STRLEN esignlen = 0;
9306
9307 char *eptr = Nullch;
fc36a67e 9308 STRLEN elen = 0;
81f715da 9309 SV *vecsv = Nullsv;
a05b299f 9310 U8 *vecstr = Null(U8*);
b22c7a20 9311 STRLEN veclen = 0;
934abaf1 9312 char c = 0;
46fc3d4c 9313 int i;
9c5ffd7c 9314 unsigned base = 0;
8c8eb53c
RB
9315 IV iv = 0;
9316 UV uv = 0;
9e5b023a
JH
9317 /* we need a long double target in case HAS_LONG_DOUBLE but
9318 not USE_LONG_DOUBLE
9319 */
35fff930 9320#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
9321 long double nv;
9322#else
65202027 9323 NV nv;
9e5b023a 9324#endif
46fc3d4c 9325 STRLEN have;
9326 STRLEN need;
9327 STRLEN gap;
e1ec3a88 9328 const char *dotstr = ".";
b22c7a20 9329 STRLEN dotstrlen = 1;
211dfcf1 9330 I32 efix = 0; /* explicit format parameter index */
eb3fce90 9331 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
9332 I32 epix = 0; /* explicit precision index */
9333 I32 evix = 0; /* explicit vector index */
eb3fce90 9334 bool asterisk = FALSE;
46fc3d4c 9335
211dfcf1 9336 /* echo everything up to the next format specification */
46fc3d4c 9337 for (q = p; q < patend && *q != '%'; ++q) ;
9338 if (q > p) {
db79b45b
JH
9339 if (has_utf8 && !pat_utf8)
9340 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
9341 else
9342 sv_catpvn(sv, p, q - p);
46fc3d4c 9343 p = q;
9344 }
9345 if (q++ >= patend)
9346 break;
9347
211dfcf1
HS
9348/*
9349 We allow format specification elements in this order:
9350 \d+\$ explicit format parameter index
9351 [-+ 0#]+ flags
a472f209 9352 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 9353 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
9354 \d+|\*(\d+\$)? width using optional (optionally specified) arg
9355 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
9356 [hlqLV] size
9357 [%bcdefginopsux_DFOUX] format (mandatory)
9358*/
9359 if (EXPECT_NUMBER(q, width)) {
9360 if (*q == '$') {
9361 ++q;
9362 efix = width;
9363 } else {
9364 goto gotwidth;
9365 }
9366 }
9367
fc36a67e 9368 /* FLAGS */
9369
46fc3d4c 9370 while (*q) {
9371 switch (*q) {
9372 case ' ':
9373 case '+':
9374 plus = *q++;
9375 continue;
9376
9377 case '-':
9378 left = TRUE;
9379 q++;
9380 continue;
9381
9382 case '0':
9383 fill = *q++;
9384 continue;
9385
9386 case '#':
9387 alt = TRUE;
9388 q++;
9389 continue;
9390
fc36a67e 9391 default:
9392 break;
9393 }
9394 break;
9395 }
46fc3d4c 9396
211dfcf1 9397 tryasterisk:
eb3fce90 9398 if (*q == '*') {
211dfcf1
HS
9399 q++;
9400 if (EXPECT_NUMBER(q, ewix))
9401 if (*q++ != '$')
9402 goto unknown;
eb3fce90 9403 asterisk = TRUE;
211dfcf1
HS
9404 }
9405 if (*q == 'v') {
eb3fce90 9406 q++;
211dfcf1
HS
9407 if (vectorize)
9408 goto unknown;
9cbac4c7 9409 if ((vectorarg = asterisk)) {
211dfcf1
HS
9410 evix = ewix;
9411 ewix = 0;
9412 asterisk = FALSE;
9413 }
9414 vectorize = TRUE;
9415 goto tryasterisk;
eb3fce90
JH
9416 }
9417
211dfcf1 9418 if (!asterisk)
7a5fa8a2 9419 if( *q == '0' )
f3583277 9420 fill = *q++;
211dfcf1
HS
9421 EXPECT_NUMBER(q, width);
9422
9423 if (vectorize) {
9424 if (vectorarg) {
9425 if (args)
9426 vecsv = va_arg(*args, SV*);
9427 else
9428 vecsv = (evix ? evix <= svmax : svix < svmax) ?
3a7a539e 9429 svargs[evix ? evix-1 : svix++] : &PL_sv_undef;
4459522c 9430 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1 9431 if (DO_UTF8(vecsv))
2cf2cfc6 9432 is_utf8 = TRUE;
211dfcf1
HS
9433 }
9434 if (args) {
9435 vecsv = va_arg(*args, SV*);
9436 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 9437 vec_utf8 = DO_UTF8(vecsv);
eb3fce90 9438 }
211dfcf1
HS
9439 else if (efix ? efix <= svmax : svix < svmax) {
9440 vecsv = svargs[efix ? efix-1 : svix++];
9441 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 9442 vec_utf8 = DO_UTF8(vecsv);
d7aa5382
JP
9443 /* if this is a version object, we need to return the
9444 * stringified representation (which the SvPVX has
9445 * already done for us), but not vectorize the args
9446 */
9447 if ( *q == 'd' && sv_derived_from(vecsv,"version") )
9448 {
9449 q++; /* skip past the rest of the %vd format */
da6068d9 9450 eptr = (char *) vecstr;
d7aa5382
JP
9451 elen = strlen(eptr);
9452 vectorize=FALSE;
9453 goto string;
9454 }
211dfcf1
HS
9455 }
9456 else {
9457 vecstr = (U8*)"";
9458 veclen = 0;
9459 }
eb3fce90 9460 }
fc36a67e 9461
eb3fce90 9462 if (asterisk) {
fc36a67e 9463 if (args)
9464 i = va_arg(*args, int);
9465 else
eb3fce90
JH
9466 i = (ewix ? ewix <= svmax : svix < svmax) ?
9467 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 9468 left |= (i < 0);
9469 width = (i < 0) ? -i : i;
fc36a67e 9470 }
211dfcf1 9471 gotwidth:
fc36a67e 9472
9473 /* PRECISION */
46fc3d4c 9474
fc36a67e 9475 if (*q == '.') {
9476 q++;
9477 if (*q == '*') {
211dfcf1 9478 q++;
7b8dd722
HS
9479 if (EXPECT_NUMBER(q, epix) && *q++ != '$')
9480 goto unknown;
9481 /* XXX: todo, support specified precision parameter */
9482 if (epix)
211dfcf1 9483 goto unknown;
46fc3d4c 9484 if (args)
9485 i = va_arg(*args, int);
9486 else
eb3fce90
JH
9487 i = (ewix ? ewix <= svmax : svix < svmax)
9488 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 9489 precis = (i < 0) ? 0 : i;
fc36a67e 9490 }
9491 else {
9492 precis = 0;
9493 while (isDIGIT(*q))
9494 precis = precis * 10 + (*q++ - '0');
9495 }
9496 has_precis = TRUE;
9497 }
46fc3d4c 9498
fc36a67e 9499 /* SIZE */
46fc3d4c 9500
fc36a67e 9501 switch (*q) {
c623ac67
GS
9502#ifdef WIN32
9503 case 'I': /* Ix, I32x, and I64x */
9504# ifdef WIN64
9505 if (q[1] == '6' && q[2] == '4') {
9506 q += 3;
9507 intsize = 'q';
9508 break;
9509 }
9510# endif
9511 if (q[1] == '3' && q[2] == '2') {
9512 q += 3;
9513 break;
9514 }
9515# ifdef WIN64
9516 intsize = 'q';
9517# endif
9518 q++;
9519 break;
9520#endif
9e5b023a 9521#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 9522 case 'L': /* Ld */
e5c81feb 9523 /* FALL THROUGH */
e5c81feb 9524#ifdef HAS_QUAD
6f9bb7fd 9525 case 'q': /* qd */
9e5b023a 9526#endif
6f9bb7fd
GS
9527 intsize = 'q';
9528 q++;
9529 break;
9530#endif
fc36a67e 9531 case 'l':
9e5b023a 9532#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 9533 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 9534 intsize = 'q';
9535 q += 2;
46fc3d4c 9536 break;
cf2093f6 9537 }
fc36a67e 9538#endif
6f9bb7fd 9539 /* FALL THROUGH */
fc36a67e 9540 case 'h':
cf2093f6 9541 /* FALL THROUGH */
fc36a67e 9542 case 'V':
9543 intsize = *q++;
46fc3d4c 9544 break;
9545 }
9546
fc36a67e 9547 /* CONVERSION */
9548
211dfcf1
HS
9549 if (*q == '%') {
9550 eptr = q++;
9551 elen = 1;
9552 goto string;
9553 }
9554
be75b157
HS
9555 if (vectorize)
9556 argsv = vecsv;
9557 else if (!args)
211dfcf1
HS
9558 argsv = (efix ? efix <= svmax : svix < svmax) ?
9559 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
9560
46fc3d4c 9561 switch (c = *q++) {
9562
9563 /* STRINGS */
9564
46fc3d4c 9565 case 'c':
be75b157 9566 uv = (args && !vectorize) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
9567 if ((uv > 255 ||
9568 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 9569 && !IN_BYTES) {
dfe13c55 9570 eptr = (char*)utf8buf;
9041c2e3 9571 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 9572 is_utf8 = TRUE;
7e2040f0
GS
9573 }
9574 else {
9575 c = (char)uv;
9576 eptr = &c;
9577 elen = 1;
a0ed51b3 9578 }
46fc3d4c 9579 goto string;
9580
46fc3d4c 9581 case 's':
be75b157 9582 if (args && !vectorize) {
fc36a67e 9583 eptr = va_arg(*args, char*);
c635e13b 9584 if (eptr)
1d7c1841
GS
9585#ifdef MACOS_TRADITIONAL
9586 /* On MacOS, %#s format is used for Pascal strings */
9587 if (alt)
9588 elen = *eptr++;
9589 else
9590#endif
c635e13b 9591 elen = strlen(eptr);
9592 else {
9593 eptr = nullstr;
9594 elen = sizeof nullstr - 1;
9595 }
46fc3d4c 9596 }
211dfcf1 9597 else {
7e2040f0
GS
9598 eptr = SvPVx(argsv, elen);
9599 if (DO_UTF8(argsv)) {
a0ed51b3
LW
9600 if (has_precis && precis < elen) {
9601 I32 p = precis;
7e2040f0 9602 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
9603 precis = p;
9604 }
9605 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 9606 width += elen - sv_len_utf8(argsv);
a0ed51b3 9607 }
2cf2cfc6 9608 is_utf8 = TRUE;
a0ed51b3
LW
9609 }
9610 }
46fc3d4c 9611 goto string;
9612
fc36a67e 9613 case '_':
5df617be
RB
9614#ifdef CHECK_FORMAT
9615 format_sv:
9616#endif
fc36a67e 9617 /*
9618 * The "%_" hack might have to be changed someday,
9619 * if ISO or ANSI decide to use '_' for something.
9620 * So we keep it hidden from users' code.
9621 */
be75b157 9622 if (!args || vectorize)
fc36a67e 9623 goto unknown;
211dfcf1 9624 argsv = va_arg(*args, SV*);
7e2040f0
GS
9625 eptr = SvPVx(argsv, elen);
9626 if (DO_UTF8(argsv))
2cf2cfc6 9627 is_utf8 = TRUE;
fc36a67e 9628
46fc3d4c 9629 string:
b22c7a20 9630 vectorize = FALSE;
46fc3d4c 9631 if (has_precis && elen > precis)
9632 elen = precis;
9633 break;
9634
9635 /* INTEGERS */
9636
fc36a67e 9637 case 'p':
5df617be
RB
9638#ifdef CHECK_FORMAT
9639 if (left) {
9640 left = FALSE;
57f5baf2
RB
9641 if (!width)
9642 goto format_sv; /* %-p -> %_ */
57f5baf2
RB
9643 precis = width;
9644 has_precis = TRUE;
9645 width = 0;
9646 goto format_sv; /* %-Np -> %.N_ */
5df617be
RB
9647 }
9648#endif
be75b157 9649 if (alt || vectorize)
c2e66d9e 9650 goto unknown;
211dfcf1 9651 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 9652 base = 16;
9653 goto integer;
9654
46fc3d4c 9655 case 'D':
29fe7a80 9656#ifdef IV_IS_QUAD
22f3ae8c 9657 intsize = 'q';
29fe7a80 9658#else
46fc3d4c 9659 intsize = 'l';
29fe7a80 9660#endif
46fc3d4c 9661 /* FALL THROUGH */
9662 case 'd':
9663 case 'i':
b22c7a20 9664 if (vectorize) {
ba210ebe 9665 STRLEN ulen;
211dfcf1
HS
9666 if (!veclen)
9667 continue;
2cf2cfc6
A
9668 if (vec_utf8)
9669 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9670 UTF8_ALLOW_ANYUV);
b22c7a20 9671 else {
e83d50c9 9672 uv = *vecstr;
b22c7a20
GS
9673 ulen = 1;
9674 }
9675 vecstr += ulen;
9676 veclen -= ulen;
e83d50c9
JP
9677 if (plus)
9678 esignbuf[esignlen++] = plus;
b22c7a20
GS
9679 }
9680 else if (args) {
46fc3d4c 9681 switch (intsize) {
9682 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 9683 case 'l': iv = va_arg(*args, long); break;
fc36a67e 9684 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 9685 default: iv = va_arg(*args, int); break;
cf2093f6
JH
9686#ifdef HAS_QUAD
9687 case 'q': iv = va_arg(*args, Quad_t); break;
9688#endif
46fc3d4c 9689 }
9690 }
9691 else {
b10c0dba 9692 IV tiv = SvIVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 9693 switch (intsize) {
b10c0dba
MHM
9694 case 'h': iv = (short)tiv; break;
9695 case 'l': iv = (long)tiv; break;
9696 case 'V':
9697 default: iv = tiv; break;
cf2093f6 9698#ifdef HAS_QUAD
b10c0dba 9699 case 'q': iv = (Quad_t)tiv; break;
cf2093f6 9700#endif
46fc3d4c 9701 }
9702 }
e83d50c9
JP
9703 if ( !vectorize ) /* we already set uv above */
9704 {
9705 if (iv >= 0) {
9706 uv = iv;
9707 if (plus)
9708 esignbuf[esignlen++] = plus;
9709 }
9710 else {
9711 uv = -iv;
9712 esignbuf[esignlen++] = '-';
9713 }
46fc3d4c 9714 }
9715 base = 10;
9716 goto integer;
9717
fc36a67e 9718 case 'U':
29fe7a80 9719#ifdef IV_IS_QUAD
22f3ae8c 9720 intsize = 'q';
29fe7a80 9721#else
fc36a67e 9722 intsize = 'l';
29fe7a80 9723#endif
fc36a67e 9724 /* FALL THROUGH */
9725 case 'u':
9726 base = 10;
9727 goto uns_integer;
9728
4f19785b
WSI
9729 case 'b':
9730 base = 2;
9731 goto uns_integer;
9732
46fc3d4c 9733 case 'O':
29fe7a80 9734#ifdef IV_IS_QUAD
22f3ae8c 9735 intsize = 'q';
29fe7a80 9736#else
46fc3d4c 9737 intsize = 'l';
29fe7a80 9738#endif
46fc3d4c 9739 /* FALL THROUGH */
9740 case 'o':
9741 base = 8;
9742 goto uns_integer;
9743
9744 case 'X':
46fc3d4c 9745 case 'x':
9746 base = 16;
46fc3d4c 9747
9748 uns_integer:
b22c7a20 9749 if (vectorize) {
ba210ebe 9750 STRLEN ulen;
b22c7a20 9751 vector:
211dfcf1
HS
9752 if (!veclen)
9753 continue;
2cf2cfc6
A
9754 if (vec_utf8)
9755 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9756 UTF8_ALLOW_ANYUV);
b22c7a20 9757 else {
a05b299f 9758 uv = *vecstr;
b22c7a20
GS
9759 ulen = 1;
9760 }
9761 vecstr += ulen;
9762 veclen -= ulen;
9763 }
9764 else if (args) {
46fc3d4c 9765 switch (intsize) {
9766 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 9767 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 9768 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 9769 default: uv = va_arg(*args, unsigned); break;
cf2093f6 9770#ifdef HAS_QUAD
9e3321a5 9771 case 'q': uv = va_arg(*args, Uquad_t); break;
cf2093f6 9772#endif
46fc3d4c 9773 }
9774 }
9775 else {
b10c0dba 9776 UV tuv = SvUVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 9777 switch (intsize) {
b10c0dba
MHM
9778 case 'h': uv = (unsigned short)tuv; break;
9779 case 'l': uv = (unsigned long)tuv; break;
9780 case 'V':
9781 default: uv = tuv; break;
cf2093f6 9782#ifdef HAS_QUAD
b10c0dba 9783 case 'q': uv = (Uquad_t)tuv; break;
cf2093f6 9784#endif
46fc3d4c 9785 }
9786 }
9787
9788 integer:
46fc3d4c 9789 eptr = ebuf + sizeof ebuf;
fc36a67e 9790 switch (base) {
9791 unsigned dig;
9792 case 16:
c10ed8b9
HS
9793 if (!uv)
9794 alt = FALSE;
1d7c1841
GS
9795 p = (char*)((c == 'X')
9796 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 9797 do {
9798 dig = uv & 15;
9799 *--eptr = p[dig];
9800 } while (uv >>= 4);
9801 if (alt) {
46fc3d4c 9802 esignbuf[esignlen++] = '0';
fc36a67e 9803 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 9804 }
fc36a67e 9805 break;
9806 case 8:
9807 do {
9808 dig = uv & 7;
9809 *--eptr = '0' + dig;
9810 } while (uv >>= 3);
9811 if (alt && *eptr != '0')
9812 *--eptr = '0';
9813 break;
4f19785b
WSI
9814 case 2:
9815 do {
9816 dig = uv & 1;
9817 *--eptr = '0' + dig;
9818 } while (uv >>= 1);
eda88b6d
JH
9819 if (alt) {
9820 esignbuf[esignlen++] = '0';
7481bb52 9821 esignbuf[esignlen++] = 'b';
eda88b6d 9822 }
4f19785b 9823 break;
fc36a67e 9824 default: /* it had better be ten or less */
9825 do {
9826 dig = uv % base;
9827 *--eptr = '0' + dig;
9828 } while (uv /= base);
9829 break;
46fc3d4c 9830 }
9831 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
9832 if (has_precis) {
9833 if (precis > elen)
9834 zeros = precis - elen;
9835 else if (precis == 0 && elen == 1 && *eptr == '0')
9836 elen = 0;
9837 }
46fc3d4c 9838 break;
9839
9840 /* FLOATING POINT */
9841
fc36a67e 9842 case 'F':
9843 c = 'f'; /* maybe %F isn't supported here */
9844 /* FALL THROUGH */
46fc3d4c 9845 case 'e': case 'E':
fc36a67e 9846 case 'f':
46fc3d4c 9847 case 'g': case 'G':
9848
9849 /* This is evil, but floating point is even more evil */
9850
9e5b023a
JH
9851 /* for SV-style calling, we can only get NV
9852 for C-style calling, we assume %f is double;
9853 for simplicity we allow any of %Lf, %llf, %qf for long double
9854 */
9855 switch (intsize) {
9856 case 'V':
9857#if defined(USE_LONG_DOUBLE)
9858 intsize = 'q';
9859#endif
9860 break;
8a2e3f14 9861/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364
HS
9862 case 'l':
9863 /* FALL THROUGH */
9e5b023a
JH
9864 default:
9865#if defined(USE_LONG_DOUBLE)
9866 intsize = args ? 0 : 'q';
9867#endif
9868 break;
9869 case 'q':
9870#if defined(HAS_LONG_DOUBLE)
9871 break;
9872#else
9873 /* FALL THROUGH */
9874#endif
9875 case 'h':
9e5b023a
JH
9876 goto unknown;
9877 }
9878
9879 /* now we need (long double) if intsize == 'q', else (double) */
be75b157 9880 nv = (args && !vectorize) ?
35fff930
JH
9881#if LONG_DOUBLESIZE > DOUBLESIZE
9882 intsize == 'q' ?
205f51d8
AS
9883 va_arg(*args, long double) :
9884 va_arg(*args, double)
35fff930 9885#else
205f51d8 9886 va_arg(*args, double)
35fff930 9887#endif
9e5b023a 9888 : SvNVx(argsv);
fc36a67e 9889
9890 need = 0;
be75b157 9891 vectorize = FALSE;
fc36a67e 9892 if (c != 'e' && c != 'E') {
9893 i = PERL_INT_MIN;
9e5b023a
JH
9894 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9895 will cast our (long double) to (double) */
73b309ea 9896 (void)Perl_frexp(nv, &i);
fc36a67e 9897 if (i == PERL_INT_MIN)
cea2e8a9 9898 Perl_die(aTHX_ "panic: frexp");
c635e13b 9899 if (i > 0)
fc36a67e 9900 need = BIT_DIGITS(i);
9901 }
9902 need += has_precis ? precis : 6; /* known default */
20f6aaab 9903
fc36a67e 9904 if (need < width)
9905 need = width;
9906
20f6aaab
AS
9907#ifdef HAS_LDBL_SPRINTF_BUG
9908 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9909 with sfio - Allen <allens@cpan.org> */
9910
9911# ifdef DBL_MAX
9912# define MY_DBL_MAX DBL_MAX
9913# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9914# if DOUBLESIZE >= 8
9915# define MY_DBL_MAX 1.7976931348623157E+308L
9916# else
9917# define MY_DBL_MAX 3.40282347E+38L
9918# endif
9919# endif
9920
9921# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9922# define MY_DBL_MAX_BUG 1L
20f6aaab 9923# else
205f51d8 9924# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9925# endif
20f6aaab 9926
205f51d8
AS
9927# ifdef DBL_MIN
9928# define MY_DBL_MIN DBL_MIN
9929# else /* XXX guessing! -Allen */
9930# if DOUBLESIZE >= 8
9931# define MY_DBL_MIN 2.2250738585072014E-308L
9932# else
9933# define MY_DBL_MIN 1.17549435E-38L
9934# endif
9935# endif
20f6aaab 9936
205f51d8
AS
9937 if ((intsize == 'q') && (c == 'f') &&
9938 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9939 (need < DBL_DIG)) {
9940 /* it's going to be short enough that
9941 * long double precision is not needed */
9942
9943 if ((nv <= 0L) && (nv >= -0L))
9944 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9945 else {
9946 /* would use Perl_fp_class as a double-check but not
9947 * functional on IRIX - see perl.h comments */
9948
9949 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9950 /* It's within the range that a double can represent */
9951#if defined(DBL_MAX) && !defined(DBL_MIN)
9952 if ((nv >= ((long double)1/DBL_MAX)) ||
9953 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9954#endif
205f51d8 9955 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9956 }
205f51d8
AS
9957 }
9958 if (fix_ldbl_sprintf_bug == TRUE) {
9959 double temp;
9960
9961 intsize = 0;
9962 temp = (double)nv;
9963 nv = (NV)temp;
9964 }
20f6aaab 9965 }
205f51d8
AS
9966
9967# undef MY_DBL_MAX
9968# undef MY_DBL_MAX_BUG
9969# undef MY_DBL_MIN
9970
20f6aaab
AS
9971#endif /* HAS_LDBL_SPRINTF_BUG */
9972
46fc3d4c 9973 need += 20; /* fudge factor */
80252599
GS
9974 if (PL_efloatsize < need) {
9975 Safefree(PL_efloatbuf);
9976 PL_efloatsize = need + 20; /* more fudge */
9977 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9978 PL_efloatbuf[0] = '\0';
46fc3d4c 9979 }
9980
4151a5fe
IZ
9981 if ( !(width || left || plus || alt) && fill != '0'
9982 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
9983 /* See earlier comment about buggy Gconvert when digits,
9984 aka precis is 0 */
9985 if ( c == 'g' && precis) {
2e59c212 9986 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4151a5fe
IZ
9987 if (*PL_efloatbuf) /* May return an empty string for digits==0 */
9988 goto float_converted;
9989 } else if ( c == 'f' && !precis) {
9990 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9991 break;
9992 }
9993 }
46fc3d4c 9994 eptr = ebuf + sizeof ebuf;
9995 *--eptr = '\0';
9996 *--eptr = c;
9e5b023a
JH
9997 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9998#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
9999 if (intsize == 'q') {
e5c81feb
JH
10000 /* Copy the one or more characters in a long double
10001 * format before the 'base' ([efgEFG]) character to
10002 * the format string. */
10003 static char const prifldbl[] = PERL_PRIfldbl;
10004 char const *p = prifldbl + sizeof(prifldbl) - 3;
10005 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 10006 }
65202027 10007#endif
46fc3d4c 10008 if (has_precis) {
10009 base = precis;
10010 do { *--eptr = '0' + (base % 10); } while (base /= 10);
10011 *--eptr = '.';
10012 }
10013 if (width) {
10014 base = width;
10015 do { *--eptr = '0' + (base % 10); } while (base /= 10);
10016 }
10017 if (fill == '0')
10018 *--eptr = fill;
84902520
TB
10019 if (left)
10020 *--eptr = '-';
46fc3d4c 10021 if (plus)
10022 *--eptr = plus;
10023 if (alt)
10024 *--eptr = '#';
10025 *--eptr = '%';
10026
ff9121f8
JH
10027 /* No taint. Otherwise we are in the strange situation
10028 * where printf() taints but print($float) doesn't.
bda0f7a5 10029 * --jhi */
9e5b023a
JH
10030#if defined(HAS_LONG_DOUBLE)
10031 if (intsize == 'q')
10032 (void)sprintf(PL_efloatbuf, eptr, nv);
10033 else
10034 (void)sprintf(PL_efloatbuf, eptr, (double)nv);
10035#else
dd8482fc 10036 (void)sprintf(PL_efloatbuf, eptr, nv);
9e5b023a 10037#endif
4151a5fe 10038 float_converted:
80252599
GS
10039 eptr = PL_efloatbuf;
10040 elen = strlen(PL_efloatbuf);
46fc3d4c 10041 break;
10042
fc36a67e 10043 /* SPECIAL */
10044
10045 case 'n':
10046 i = SvCUR(sv) - origlen;
be75b157 10047 if (args && !vectorize) {
c635e13b 10048 switch (intsize) {
10049 case 'h': *(va_arg(*args, short*)) = i; break;
10050 default: *(va_arg(*args, int*)) = i; break;
10051 case 'l': *(va_arg(*args, long*)) = i; break;
10052 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
10053#ifdef HAS_QUAD
10054 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
10055#endif
c635e13b 10056 }
fc36a67e 10057 }
9dd79c3f 10058 else
211dfcf1 10059 sv_setuv_mg(argsv, (UV)i);
be75b157 10060 vectorize = FALSE;
fc36a67e 10061 continue; /* not "break" */
10062
10063 /* UNKNOWN */
10064
46fc3d4c 10065 default:
fc36a67e 10066 unknown:
599cee73 10067 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 10068 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 10069 SV *msg = sv_newmortal();
35c1215d
NC
10070 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
10071 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 10072 if (c) {
0f4b6630 10073 if (isPRINT(c))
1c846c1f 10074 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
10075 "\"%%%c\"", c & 0xFF);
10076 else
10077 Perl_sv_catpvf(aTHX_ msg,
57def98f 10078 "\"%%\\%03"UVof"\"",
0f4b6630 10079 (UV)c & 0xFF);
0f4b6630 10080 } else
c635e13b 10081 sv_catpv(msg, "end of string");
9014280d 10082 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 10083 }
fb73857a 10084
10085 /* output mangled stuff ... */
10086 if (c == '\0')
10087 --q;
46fc3d4c 10088 eptr = p;
10089 elen = q - p;
fb73857a 10090
10091 /* ... right here, because formatting flags should not apply */
10092 SvGROW(sv, SvCUR(sv) + elen + 1);
10093 p = SvEND(sv);
4459522c 10094 Copy(eptr, p, elen, char);
fb73857a 10095 p += elen;
10096 *p = '\0';
10097 SvCUR(sv) = p - SvPVX(sv);
58e33a90 10098 svix = osvix;
fb73857a 10099 continue; /* not "break" */
46fc3d4c 10100 }
10101
6c94ec8b
HS
10102 /* calculate width before utf8_upgrade changes it */
10103 have = esignlen + zeros + elen;
10104
d2876be5
JH
10105 if (is_utf8 != has_utf8) {
10106 if (is_utf8) {
10107 if (SvCUR(sv))
10108 sv_utf8_upgrade(sv);
10109 }
10110 else {
10111 SV *nsv = sv_2mortal(newSVpvn(eptr, elen));
10112 sv_utf8_upgrade(nsv);
10113 eptr = SvPVX(nsv);
10114 elen = SvCUR(nsv);
10115 }
10116 SvGROW(sv, SvCUR(sv) + elen + 1);
10117 p = SvEND(sv);
10118 *p = '\0';
10119 }
6af65485 10120
46fc3d4c 10121 need = (have > width ? have : width);
10122 gap = need - have;
10123
b22c7a20 10124 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 10125 p = SvEND(sv);
10126 if (esignlen && fill == '0') {
eb160463 10127 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10128 *p++ = esignbuf[i];
10129 }
10130 if (gap && !left) {
10131 memset(p, fill, gap);
10132 p += gap;
10133 }
10134 if (esignlen && fill != '0') {
eb160463 10135 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10136 *p++ = esignbuf[i];
10137 }
fc36a67e 10138 if (zeros) {
10139 for (i = zeros; i; i--)
10140 *p++ = '0';
10141 }
46fc3d4c 10142 if (elen) {
4459522c 10143 Copy(eptr, p, elen, char);
46fc3d4c 10144 p += elen;
10145 }
10146 if (gap && left) {
10147 memset(p, ' ', gap);
10148 p += gap;
10149 }
b22c7a20
GS
10150 if (vectorize) {
10151 if (veclen) {
4459522c 10152 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
10153 p += dotstrlen;
10154 }
10155 else
10156 vectorize = FALSE; /* done iterating over vecstr */
10157 }
2cf2cfc6
A
10158 if (is_utf8)
10159 has_utf8 = TRUE;
10160 if (has_utf8)
7e2040f0 10161 SvUTF8_on(sv);
46fc3d4c 10162 *p = '\0';
10163 SvCUR(sv) = p - SvPVX(sv);
b22c7a20
GS
10164 if (vectorize) {
10165 esignlen = 0;
10166 goto vector;
10167 }
46fc3d4c 10168 }
10169}
51371543 10170
645c22ef
DM
10171/* =========================================================================
10172
10173=head1 Cloning an interpreter
10174
10175All the macros and functions in this section are for the private use of
10176the main function, perl_clone().
10177
10178The foo_dup() functions make an exact copy of an existing foo thinngy.
10179During the course of a cloning, a hash table is used to map old addresses
10180to new addresses. The table is created and manipulated with the
10181ptr_table_* functions.
10182
10183=cut
10184
10185============================================================================*/
10186
10187
1d7c1841
GS
10188#if defined(USE_ITHREADS)
10189
1d7c1841
GS
10190#ifndef GpREFCNT_inc
10191# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
10192#endif
10193
10194
d2d73c3e
AB
10195#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
10196#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
10197#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10198#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
10199#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10200#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
10201#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10202#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
10203#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
10204#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
10205#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
10206#define SAVEPV(p) (p ? savepv(p) : Nullch)
10207#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 10208
d2d73c3e 10209
d2f185dc
AMS
10210/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
10211 regcomp.c. AMS 20010712 */
645c22ef 10212
1d7c1841 10213REGEXP *
a8fc9800 10214Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
1d7c1841 10215{
d2f185dc
AMS
10216 REGEXP *ret;
10217 int i, len, npar;
10218 struct reg_substr_datum *s;
10219
10220 if (!r)
10221 return (REGEXP *)NULL;
10222
10223 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
10224 return ret;
10225
10226 len = r->offsets[0];
10227 npar = r->nparens+1;
10228
10229 Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
10230 Copy(r->program, ret->program, len+1, regnode);
10231
10232 New(0, ret->startp, npar, I32);
10233 Copy(r->startp, ret->startp, npar, I32);
10234 New(0, ret->endp, npar, I32);
10235 Copy(r->startp, ret->startp, npar, I32);
10236
d2f185dc
AMS
10237 New(0, ret->substrs, 1, struct reg_substr_data);
10238 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
10239 s->min_offset = r->substrs->data[i].min_offset;
10240 s->max_offset = r->substrs->data[i].max_offset;
10241 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 10242 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
10243 }
10244
70612e96 10245 ret->regstclass = NULL;
d2f185dc
AMS
10246 if (r->data) {
10247 struct reg_data *d;
e1ec3a88 10248 const int count = r->data->count;
d2f185dc
AMS
10249
10250 Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
10251 char, struct reg_data);
10252 New(0, d->what, count, U8);
10253
10254 d->count = count;
10255 for (i = 0; i < count; i++) {
10256 d->what[i] = r->data->what[i];
10257 switch (d->what[i]) {
a3621e74
YO
10258 /* legal options are one of: sfpont
10259 see also regcomp.h and pregfree() */
d2f185dc
AMS
10260 case 's':
10261 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
10262 break;
10263 case 'p':
10264 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
10265 break;
10266 case 'f':
10267 /* This is cheating. */
10268 New(0, d->data[i], 1, struct regnode_charclass_class);
10269 StructCopy(r->data->data[i], d->data[i],
10270 struct regnode_charclass_class);
70612e96 10271 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
10272 break;
10273 case 'o':
33773810
AMS
10274 /* Compiled op trees are readonly, and can thus be
10275 shared without duplication. */
b34c0dd4 10276 OP_REFCNT_LOCK;
9b978d73 10277 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
b34c0dd4 10278 OP_REFCNT_UNLOCK;
9b978d73 10279 break;
d2f185dc
AMS
10280 case 'n':
10281 d->data[i] = r->data->data[i];
10282 break;
a3621e74
YO
10283 case 't':
10284 d->data[i] = r->data->data[i];
10285 OP_REFCNT_LOCK;
10286 ((reg_trie_data*)d->data[i])->refcount++;
10287 OP_REFCNT_UNLOCK;
10288 break;
10289 default:
10290 Perl_croak(aTHX_ "panic: re_dup unknown data code '%c'", r->data->what[i]);
d2f185dc
AMS
10291 }
10292 }
10293
10294 ret->data = d;
10295 }
10296 else
10297 ret->data = NULL;
10298
10299 New(0, ret->offsets, 2*len+1, U32);
10300 Copy(r->offsets, ret->offsets, 2*len+1, U32);
10301
e01c5899 10302 ret->precomp = SAVEPVN(r->precomp, r->prelen);
d2f185dc
AMS
10303 ret->refcnt = r->refcnt;
10304 ret->minlen = r->minlen;
10305 ret->prelen = r->prelen;
10306 ret->nparens = r->nparens;
10307 ret->lastparen = r->lastparen;
10308 ret->lastcloseparen = r->lastcloseparen;
10309 ret->reganch = r->reganch;
10310
70612e96
RG
10311 ret->sublen = r->sublen;
10312
10313 if (RX_MATCH_COPIED(ret))
e01c5899 10314 ret->subbeg = SAVEPVN(r->subbeg, r->sublen);
70612e96
RG
10315 else
10316 ret->subbeg = Nullch;
9a26048b
NC
10317#ifdef PERL_COPY_ON_WRITE
10318 ret->saved_copy = Nullsv;
10319#endif
70612e96 10320
d2f185dc
AMS
10321 ptr_table_store(PL_ptr_table, r, ret);
10322 return ret;
1d7c1841
GS
10323}
10324
d2d73c3e 10325/* duplicate a file handle */
645c22ef 10326
1d7c1841 10327PerlIO *
a8fc9800 10328Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
10329{
10330 PerlIO *ret;
73d840c0
AL
10331 (void)type;
10332
1d7c1841
GS
10333 if (!fp)
10334 return (PerlIO*)NULL;
10335
10336 /* look for it in the table first */
10337 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
10338 if (ret)
10339 return ret;
10340
10341 /* create anew and remember what it is */
ecdeb87c 10342 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
10343 ptr_table_store(PL_ptr_table, fp, ret);
10344 return ret;
10345}
10346
645c22ef
DM
10347/* duplicate a directory handle */
10348
1d7c1841
GS
10349DIR *
10350Perl_dirp_dup(pTHX_ DIR *dp)
10351{
10352 if (!dp)
10353 return (DIR*)NULL;
10354 /* XXX TODO */
10355 return dp;
10356}
10357
ff276b08 10358/* duplicate a typeglob */
645c22ef 10359
1d7c1841 10360GP *
a8fc9800 10361Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
10362{
10363 GP *ret;
10364 if (!gp)
10365 return (GP*)NULL;
10366 /* look for it in the table first */
10367 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
10368 if (ret)
10369 return ret;
10370
10371 /* create anew and remember what it is */
10372 Newz(0, ret, 1, GP);
10373 ptr_table_store(PL_ptr_table, gp, ret);
10374
10375 /* clone */
10376 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
10377 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
10378 ret->gp_io = io_dup_inc(gp->gp_io, param);
10379 ret->gp_form = cv_dup_inc(gp->gp_form, param);
10380 ret->gp_av = av_dup_inc(gp->gp_av, param);
10381 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
10382 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
10383 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
10384 ret->gp_cvgen = gp->gp_cvgen;
10385 ret->gp_flags = gp->gp_flags;
10386 ret->gp_line = gp->gp_line;
10387 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
10388 return ret;
10389}
10390
645c22ef
DM
10391/* duplicate a chain of magic */
10392
1d7c1841 10393MAGIC *
a8fc9800 10394Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 10395{
cb359b41
JH
10396 MAGIC *mgprev = (MAGIC*)NULL;
10397 MAGIC *mgret;
1d7c1841
GS
10398 if (!mg)
10399 return (MAGIC*)NULL;
10400 /* look for it in the table first */
10401 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
10402 if (mgret)
10403 return mgret;
10404
10405 for (; mg; mg = mg->mg_moremagic) {
10406 MAGIC *nmg;
10407 Newz(0, nmg, 1, MAGIC);
cb359b41 10408 if (mgprev)
1d7c1841 10409 mgprev->mg_moremagic = nmg;
cb359b41
JH
10410 else
10411 mgret = nmg;
1d7c1841
GS
10412 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
10413 nmg->mg_private = mg->mg_private;
10414 nmg->mg_type = mg->mg_type;
10415 nmg->mg_flags = mg->mg_flags;
14befaf4 10416 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 10417 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 10418 }
05bd4103 10419 else if(mg->mg_type == PERL_MAGIC_backref) {
7fc63493 10420 const AV * const av = (AV*) mg->mg_obj;
fdc9a813
AE
10421 SV **svp;
10422 I32 i;
7fc63493 10423 (void)SvREFCNT_inc(nmg->mg_obj = (SV*)newAV());
fdc9a813
AE
10424 svp = AvARRAY(av);
10425 for (i = AvFILLp(av); i >= 0; i--) {
3a81978b 10426 if (!svp[i]) continue;
fdc9a813
AE
10427 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
10428 }
05bd4103 10429 }
1d7c1841
GS
10430 else {
10431 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
10432 ? sv_dup_inc(mg->mg_obj, param)
10433 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
10434 }
10435 nmg->mg_len = mg->mg_len;
10436 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 10437 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 10438 if (mg->mg_len > 0) {
1d7c1841 10439 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
10440 if (mg->mg_type == PERL_MAGIC_overload_table &&
10441 AMT_AMAGIC((AMT*)mg->mg_ptr))
10442 {
1d7c1841
GS
10443 AMT *amtp = (AMT*)mg->mg_ptr;
10444 AMT *namtp = (AMT*)nmg->mg_ptr;
10445 I32 i;
10446 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 10447 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
10448 }
10449 }
10450 }
10451 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 10452 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 10453 }
68795e93
NIS
10454 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
10455 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
10456 }
1d7c1841
GS
10457 mgprev = nmg;
10458 }
10459 return mgret;
10460}
10461
645c22ef
DM
10462/* create a new pointer-mapping table */
10463
1d7c1841
GS
10464PTR_TBL_t *
10465Perl_ptr_table_new(pTHX)
10466{
10467 PTR_TBL_t *tbl;
10468 Newz(0, tbl, 1, PTR_TBL_t);
10469 tbl->tbl_max = 511;
10470 tbl->tbl_items = 0;
10471 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
10472 return tbl;
10473}
10474
134ca3d6
DM
10475#if (PTRSIZE == 8)
10476# define PTR_TABLE_HASH(ptr) (PTR2UV(ptr) >> 3)
10477#else
10478# define PTR_TABLE_HASH(ptr) (PTR2UV(ptr) >> 2)
10479#endif
10480
645c22ef
DM
10481/* map an existing pointer using a table */
10482
1d7c1841
GS
10483void *
10484Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
10485{
10486 PTR_TBL_ENT_t *tblent;
134ca3d6 10487 UV hash = PTR_TABLE_HASH(sv);
1d7c1841
GS
10488 assert(tbl);
10489 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
10490 for (; tblent; tblent = tblent->next) {
10491 if (tblent->oldval == sv)
10492 return tblent->newval;
10493 }
10494 return (void*)NULL;
10495}
10496
645c22ef
DM
10497/* add a new entry to a pointer-mapping table */
10498
1d7c1841
GS
10499void
10500Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
10501{
10502 PTR_TBL_ENT_t *tblent, **otblent;
10503 /* XXX this may be pessimal on platforms where pointers aren't good
10504 * hash values e.g. if they grow faster in the most significant
10505 * bits */
134ca3d6 10506 UV hash = PTR_TABLE_HASH(oldv);
14cade97 10507 bool empty = 1;
1d7c1841
GS
10508
10509 assert(tbl);
10510 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
14cade97 10511 for (tblent = *otblent; tblent; empty=0, tblent = tblent->next) {
1d7c1841
GS
10512 if (tblent->oldval == oldv) {
10513 tblent->newval = newv;
1d7c1841
GS
10514 return;
10515 }
10516 }
10517 Newz(0, tblent, 1, PTR_TBL_ENT_t);
10518 tblent->oldval = oldv;
10519 tblent->newval = newv;
10520 tblent->next = *otblent;
10521 *otblent = tblent;
10522 tbl->tbl_items++;
14cade97 10523 if (!empty && tbl->tbl_items > tbl->tbl_max)
1d7c1841
GS
10524 ptr_table_split(tbl);
10525}
10526
645c22ef
DM
10527/* double the hash bucket size of an existing ptr table */
10528
1d7c1841
GS
10529void
10530Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
10531{
10532 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
10533 UV oldsize = tbl->tbl_max + 1;
10534 UV newsize = oldsize * 2;
10535 UV i;
10536
10537 Renew(ary, newsize, PTR_TBL_ENT_t*);
10538 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
10539 tbl->tbl_max = --newsize;
10540 tbl->tbl_ary = ary;
10541 for (i=0; i < oldsize; i++, ary++) {
10542 PTR_TBL_ENT_t **curentp, **entp, *ent;
10543 if (!*ary)
10544 continue;
10545 curentp = ary + oldsize;
10546 for (entp = ary, ent = *ary; ent; ent = *entp) {
134ca3d6 10547 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
10548 *entp = ent->next;
10549 ent->next = *curentp;
10550 *curentp = ent;
10551 continue;
10552 }
10553 else
10554 entp = &ent->next;
10555 }
10556 }
10557}
10558
645c22ef
DM
10559/* remove all the entries from a ptr table */
10560
a0739874
DM
10561void
10562Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
10563{
10564 register PTR_TBL_ENT_t **array;
10565 register PTR_TBL_ENT_t *entry;
10566 register PTR_TBL_ENT_t *oentry = Null(PTR_TBL_ENT_t*);
10567 UV riter = 0;
10568 UV max;
10569
10570 if (!tbl || !tbl->tbl_items) {
10571 return;
10572 }
10573
10574 array = tbl->tbl_ary;
10575 entry = array[0];
10576 max = tbl->tbl_max;
10577
10578 for (;;) {
10579 if (entry) {
10580 oentry = entry;
10581 entry = entry->next;
10582 Safefree(oentry);
10583 }
10584 if (!entry) {
10585 if (++riter > max) {
10586 break;
10587 }
10588 entry = array[riter];
10589 }
10590 }
10591
10592 tbl->tbl_items = 0;
10593}
10594
645c22ef
DM
10595/* clear and free a ptr table */
10596
a0739874
DM
10597void
10598Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
10599{
10600 if (!tbl) {
10601 return;
10602 }
10603 ptr_table_clear(tbl);
10604 Safefree(tbl->tbl_ary);
10605 Safefree(tbl);
10606}
10607
1d7c1841
GS
10608#ifdef DEBUGGING
10609char *PL_watch_pvx;
10610#endif
10611
645c22ef
DM
10612/* attempt to make everything in the typeglob readonly */
10613
5bd07a3d 10614STATIC SV *
59b40662 10615S_gv_share(pTHX_ SV *sstr, CLONE_PARAMS *param)
5bd07a3d
DM
10616{
10617 GV *gv = (GV*)sstr;
59b40662 10618 SV *sv = &param->proto_perl->Isv_no; /* just need SvREADONLY-ness */
5bd07a3d
DM
10619
10620 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 10621 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
10622 }
10623 else if (!GvCV(gv)) {
10624 GvCV(gv) = (CV*)sv;
10625 }
10626 else {
10627 /* CvPADLISTs cannot be shared */
37e20706 10628 if (!SvREADONLY(GvCV(gv)) && !CvXSUB(GvCV(gv))) {
7fb37951 10629 GvUNIQUE_off(gv);
5bd07a3d
DM
10630 }
10631 }
10632
7fb37951 10633 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
10634#if 0
10635 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
10636 HvNAME(GvSTASH(gv)), GvNAME(gv));
10637#endif
10638 return Nullsv;
10639 }
10640
4411f3b6 10641 /*
5bd07a3d
DM
10642 * write attempts will die with
10643 * "Modification of a read-only value attempted"
10644 */
10645 if (!GvSV(gv)) {
10646 GvSV(gv) = sv;
10647 }
10648 else {
10649 SvREADONLY_on(GvSV(gv));
10650 }
10651
10652 if (!GvAV(gv)) {
10653 GvAV(gv) = (AV*)sv;
10654 }
10655 else {
10656 SvREADONLY_on(GvAV(gv));
10657 }
10658
10659 if (!GvHV(gv)) {
10660 GvHV(gv) = (HV*)sv;
10661 }
10662 else {
53c33732 10663 SvREADONLY_on(GvHV(gv));
5bd07a3d
DM
10664 }
10665
10666 return sstr; /* he_dup() will SvREFCNT_inc() */
10667}
10668
645c22ef
DM
10669/* duplicate an SV of any type (including AV, HV etc) */
10670
83841fad
NIS
10671void
10672Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
10673{
10674 if (SvROK(sstr)) {
d3d0e6f1 10675 SvRV(dstr) = SvWEAKREF(sstr)
83841fad
NIS
10676 ? sv_dup(SvRV(sstr), param)
10677 : sv_dup_inc(SvRV(sstr), param);
f880fe2f 10678
83841fad
NIS
10679 }
10680 else if (SvPVX(sstr)) {
10681 /* Has something there */
10682 if (SvLEN(sstr)) {
68795e93 10683 /* Normal PV - clone whole allocated space */
f880fe2f 10684 SvPV_set(dstr, SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1));
d3d0e6f1
NC
10685 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10686 /* Not that normal - actually sstr is copy on write.
10687 But we are a true, independant SV, so: */
10688 SvREADONLY_off(dstr);
10689 SvFAKE_off(dstr);
10690 }
68795e93 10691 }
83841fad
NIS
10692 else {
10693 /* Special case - not normally malloced for some reason */
10694 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10695 /* A "shared" PV - clone it as unshared string */
281b2760 10696 if(SvPADTMP(sstr)) {
5e6160dc
AB
10697 /* However, some of them live in the pad
10698 and they should not have these flags
10699 turned off */
281b2760 10700
f880fe2f
SP
10701 SvPV_set(dstr, sharepvn(SvPVX(sstr), SvCUR(sstr),
10702 SvUVX(sstr)));
607fa7f2 10703 SvUV_set(dstr, SvUVX(sstr));
281b2760
AB
10704 } else {
10705
f880fe2f 10706 SvPV_set(dstr, SAVEPVN(SvPVX(sstr), SvCUR(sstr)));
281b2760
AB
10707 SvFAKE_off(dstr);
10708 SvREADONLY_off(dstr);
5e6160dc 10709 }
83841fad
NIS
10710 }
10711 else {
10712 /* Some other special case - random pointer */
f880fe2f 10713 SvPV_set(dstr, SvPVX(sstr));
d3d0e6f1 10714 }
83841fad
NIS
10715 }
10716 }
10717 else {
10718 /* Copy the Null */
f880fe2f
SP
10719 if (SvTYPE(dstr) == SVt_RV)
10720 SvRV(dstr) = 0;
10721 else
10722 SvPV_set(dstr, 0);
83841fad
NIS
10723 }
10724}
10725
1d7c1841 10726SV *
a8fc9800 10727Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
1d7c1841 10728{
1d7c1841
GS
10729 SV *dstr;
10730
10731 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
10732 return Nullsv;
10733 /* look for it in the table first */
10734 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
10735 if (dstr)
10736 return dstr;
10737
0405e91e
AB
10738 if(param->flags & CLONEf_JOIN_IN) {
10739 /** We are joining here so we don't want do clone
10740 something that is bad **/
10741
10742 if(SvTYPE(sstr) == SVt_PVHV &&
10743 HvNAME(sstr)) {
10744 /** don't clone stashes if they already exist **/
10745 HV* old_stash = gv_stashpv(HvNAME(sstr),0);
10746 return (SV*) old_stash;
10747 }
10748 }
10749
1d7c1841
GS
10750 /* create anew and remember what it is */
10751 new_SV(dstr);
fd0854ff
DM
10752
10753#ifdef DEBUG_LEAKING_SCALARS
10754 dstr->sv_debug_optype = sstr->sv_debug_optype;
10755 dstr->sv_debug_line = sstr->sv_debug_line;
10756 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
10757 dstr->sv_debug_cloned = 1;
10758# ifdef NETWARE
10759 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
10760# else
10761 dstr->sv_debug_file = savesharedpv(sstr->sv_debug_file);
10762# endif
10763#endif
10764
1d7c1841
GS
10765 ptr_table_store(PL_ptr_table, sstr, dstr);
10766
10767 /* clone */
10768 SvFLAGS(dstr) = SvFLAGS(sstr);
10769 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
10770 SvREFCNT(dstr) = 0; /* must be before any other dups! */
10771
10772#ifdef DEBUGGING
10773 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
10774 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
10775 PL_watch_pvx, SvPVX(sstr));
10776#endif
10777
10778 switch (SvTYPE(sstr)) {
10779 case SVt_NULL:
10780 SvANY(dstr) = NULL;
10781 break;
10782 case SVt_IV:
10783 SvANY(dstr) = new_XIV();
45977657 10784 SvIV_set(dstr, SvIVX(sstr));
1d7c1841
GS
10785 break;
10786 case SVt_NV:
10787 SvANY(dstr) = new_XNV();
9d6ce603 10788 SvNV_set(dstr, SvNVX(sstr));
1d7c1841
GS
10789 break;
10790 case SVt_RV:
10791 SvANY(dstr) = new_XRV();
83841fad 10792 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10793 break;
10794 case SVt_PV:
10795 SvANY(dstr) = new_XPV();
10796 SvCUR(dstr) = SvCUR(sstr);
10797 SvLEN(dstr) = SvLEN(sstr);
83841fad 10798 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10799 break;
10800 case SVt_PVIV:
10801 SvANY(dstr) = new_XPVIV();
10802 SvCUR(dstr) = SvCUR(sstr);
10803 SvLEN(dstr) = SvLEN(sstr);
45977657 10804 SvIV_set(dstr, SvIVX(sstr));
83841fad 10805 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10806 break;
10807 case SVt_PVNV:
10808 SvANY(dstr) = new_XPVNV();
10809 SvCUR(dstr) = SvCUR(sstr);
10810 SvLEN(dstr) = SvLEN(sstr);
45977657 10811 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10812 SvNV_set(dstr, SvNVX(sstr));
83841fad 10813 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10814 break;
10815 case SVt_PVMG:
10816 SvANY(dstr) = new_XPVMG();
10817 SvCUR(dstr) = SvCUR(sstr);
10818 SvLEN(dstr) = SvLEN(sstr);
45977657 10819 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10820 SvNV_set(dstr, SvNVX(sstr));
d2d73c3e
AB
10821 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10822 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10823 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10824 break;
10825 case SVt_PVBM:
10826 SvANY(dstr) = new_XPVBM();
10827 SvCUR(dstr) = SvCUR(sstr);
10828 SvLEN(dstr) = SvLEN(sstr);
45977657 10829 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10830 SvNV_set(dstr, SvNVX(sstr));
d2d73c3e
AB
10831 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10832 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10833 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10834 BmRARE(dstr) = BmRARE(sstr);
10835 BmUSEFUL(dstr) = BmUSEFUL(sstr);
10836 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
10837 break;
10838 case SVt_PVLV:
10839 SvANY(dstr) = new_XPVLV();
10840 SvCUR(dstr) = SvCUR(sstr);
10841 SvLEN(dstr) = SvLEN(sstr);
45977657 10842 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10843 SvNV_set(dstr, SvNVX(sstr));
d2d73c3e
AB
10844 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10845 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10846 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10847 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
10848 LvTARGLEN(dstr) = LvTARGLEN(sstr);
dd28f7bb
DM
10849 if (LvTYPE(sstr) == 't') /* for tie: unrefcnted fake (SV**) */
10850 LvTARG(dstr) = dstr;
10851 else if (LvTYPE(sstr) == 'T') /* for tie: fake HE */
10852 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(sstr), 0, param);
10853 else
10854 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr), param);
1d7c1841
GS
10855 LvTYPE(dstr) = LvTYPE(sstr);
10856 break;
10857 case SVt_PVGV:
7fb37951 10858 if (GvUNIQUE((GV*)sstr)) {
5bd07a3d 10859 SV *share;
59b40662 10860 if ((share = gv_share(sstr, param))) {
5bd07a3d
DM
10861 del_SV(dstr);
10862 dstr = share;
37e20706 10863 ptr_table_store(PL_ptr_table, sstr, dstr);
5bd07a3d
DM
10864#if 0
10865 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
10866 HvNAME(GvSTASH(share)), GvNAME(share));
10867#endif
10868 break;
10869 }
10870 }
1d7c1841
GS
10871 SvANY(dstr) = new_XPVGV();
10872 SvCUR(dstr) = SvCUR(sstr);
10873 SvLEN(dstr) = SvLEN(sstr);
45977657 10874 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10875 SvNV_set(dstr, SvNVX(sstr));
d2d73c3e
AB
10876 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10877 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10878 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10879 GvNAMELEN(dstr) = GvNAMELEN(sstr);
10880 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
d2d73c3e 10881 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr), param);
1d7c1841 10882 GvFLAGS(dstr) = GvFLAGS(sstr);
d2d73c3e 10883 GvGP(dstr) = gp_dup(GvGP(sstr), param);
1d7c1841
GS
10884 (void)GpREFCNT_inc(GvGP(dstr));
10885 break;
10886 case SVt_PVIO:
10887 SvANY(dstr) = new_XPVIO();
10888 SvCUR(dstr) = SvCUR(sstr);
10889 SvLEN(dstr) = SvLEN(sstr);
45977657 10890 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10891 SvNV_set(dstr, SvNVX(sstr));
d2d73c3e
AB
10892 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10893 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10894 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
a8fc9800 10895 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10896 if (IoOFP(sstr) == IoIFP(sstr))
10897 IoOFP(dstr) = IoIFP(dstr);
10898 else
a8fc9800 10899 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10900 /* PL_rsfp_filters entries have fake IoDIRP() */
10901 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
10902 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
10903 else
10904 IoDIRP(dstr) = IoDIRP(sstr);
10905 IoLINES(dstr) = IoLINES(sstr);
10906 IoPAGE(dstr) = IoPAGE(sstr);
10907 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
10908 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
7a5fa8a2 10909 if(IoFLAGS(sstr) & IOf_FAKE_DIRP) {
5a37521b
AB
10910 /* I have no idea why fake dirp (rsfps)
10911 should be treaded differently but otherwise
10912 we end up with leaks -- sky*/
10913 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(sstr), param);
10914 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(sstr), param);
10915 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(sstr), param);
10916 } else {
10917 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr), param);
10918 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr), param);
10919 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr), param);
10920 }
1d7c1841 10921 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
1d7c1841 10922 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
1d7c1841 10923 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
1d7c1841
GS
10924 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
10925 IoTYPE(dstr) = IoTYPE(sstr);
10926 IoFLAGS(dstr) = IoFLAGS(sstr);
10927 break;
10928 case SVt_PVAV:
10929 SvANY(dstr) = new_XPVAV();
10930 SvCUR(dstr) = SvCUR(sstr);
10931 SvLEN(dstr) = SvLEN(sstr);
45977657 10932 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10933 SvNV_set(dstr, SvNVX(sstr));
d2d73c3e
AB
10934 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10935 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
10936 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
1d7c1841
GS
10937 AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
10938 if (AvARRAY((AV*)sstr)) {
10939 SV **dst_ary, **src_ary;
10940 SSize_t items = AvFILLp((AV*)sstr) + 1;
10941
10942 src_ary = AvARRAY((AV*)sstr);
10943 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
10944 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
f880fe2f 10945 SvPV_set(dstr, (char*)dst_ary);
1d7c1841
GS
10946 AvALLOC((AV*)dstr) = dst_ary;
10947 if (AvREAL((AV*)sstr)) {
10948 while (items-- > 0)
d2d73c3e 10949 *dst_ary++ = sv_dup_inc(*src_ary++, param);
1d7c1841
GS
10950 }
10951 else {
10952 while (items-- > 0)
d2d73c3e 10953 *dst_ary++ = sv_dup(*src_ary++, param);
1d7c1841
GS
10954 }
10955 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10956 while (items-- > 0) {
10957 *dst_ary++ = &PL_sv_undef;
10958 }
10959 }
10960 else {
f880fe2f 10961 SvPV_set(dstr, Nullch);
1d7c1841
GS
10962 AvALLOC((AV*)dstr) = (SV**)NULL;
10963 }
10964 break;
10965 case SVt_PVHV:
10966 SvANY(dstr) = new_XPVHV();
10967 SvCUR(dstr) = SvCUR(sstr);
10968 SvLEN(dstr) = SvLEN(sstr);
45977657 10969 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 10970 SvNV_set(dstr, SvNVX(sstr));
d2d73c3e
AB
10971 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10972 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841
GS
10973 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
10974 if (HvARRAY((HV*)sstr)) {
1d7c1841
GS
10975 STRLEN i = 0;
10976 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
10977 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
10978 Newz(0, dxhv->xhv_array,
10979 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
10980 while (i <= sxhv->xhv_max) {
10981 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
eb160463
GS
10982 (bool)!!HvSHAREKEYS(sstr),
10983 param);
1d7c1841
GS
10984 ++i;
10985 }
eb160463
GS
10986 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter,
10987 (bool)!!HvSHAREKEYS(sstr), param);
1d7c1841
GS
10988 }
10989 else {
f880fe2f 10990 SvPV_set(dstr, Nullch);
1d7c1841
GS
10991 HvEITER((HV*)dstr) = (HE*)NULL;
10992 }
10993 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
10994 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
c43294b8 10995 /* Record stashes for possible cloning in Perl_clone(). */
6676db26 10996 if(HvNAME((HV*)dstr))
d2d73c3e 10997 av_push(param->stashes, dstr);
1d7c1841
GS
10998 break;
10999 case SVt_PVFM:
11000 SvANY(dstr) = new_XPVFM();
11001 FmLINES(dstr) = FmLINES(sstr);
11002 goto dup_pvcv;
11003 /* NOTREACHED */
11004 case SVt_PVCV:
11005 SvANY(dstr) = new_XPVCV();
d2d73c3e 11006 dup_pvcv:
1d7c1841
GS
11007 SvCUR(dstr) = SvCUR(sstr);
11008 SvLEN(dstr) = SvLEN(sstr);
45977657 11009 SvIV_set(dstr, SvIVX(sstr));
9d6ce603 11010 SvNV_set(dstr, SvNVX(sstr));
d2d73c3e
AB
11011 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
11012 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 11013 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
d2d73c3e 11014 CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
1d7c1841 11015 CvSTART(dstr) = CvSTART(sstr);
b34c0dd4 11016 OP_REFCNT_LOCK;
1d7c1841 11017 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
b34c0dd4 11018 OP_REFCNT_UNLOCK;
1d7c1841
GS
11019 CvXSUB(dstr) = CvXSUB(sstr);
11020 CvXSUBANY(dstr) = CvXSUBANY(sstr);
01485f8b
DM
11021 if (CvCONST(sstr)) {
11022 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
11023 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
8f77bfdb 11024 sv_dup_inc((SV *)CvXSUBANY(sstr).any_ptr, param);
01485f8b 11025 }
b23f1a86
DM
11026 /* don't dup if copying back - CvGV isn't refcounted, so the
11027 * duped GV may never be freed. A bit of a hack! DAPM */
11028 CvGV(dstr) = (param->flags & CLONEf_JOIN_IN) ?
11029 Nullgv : gv_dup(CvGV(sstr), param) ;
d2d73c3e
AB
11030 if (param->flags & CLONEf_COPY_STACKS) {
11031 CvDEPTH(dstr) = CvDEPTH(sstr);
11032 } else {
11033 CvDEPTH(dstr) = 0;
11034 }
dd2155a4 11035 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
7dafbf52
DM
11036 CvOUTSIDE_SEQ(dstr) = CvOUTSIDE_SEQ(sstr);
11037 CvOUTSIDE(dstr) =
11038 CvWEAKOUTSIDE(sstr)
11039 ? cv_dup( CvOUTSIDE(sstr), param)
11040 : cv_dup_inc(CvOUTSIDE(sstr), param);
1d7c1841 11041 CvFLAGS(dstr) = CvFLAGS(sstr);
54356c7d 11042 CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
1d7c1841
GS
11043 break;
11044 default:
c803eecc 11045 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
1d7c1841
GS
11046 break;
11047 }
11048
11049 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
11050 ++PL_sv_objcount;
11051
11052 return dstr;
d2d73c3e 11053 }
1d7c1841 11054
645c22ef
DM
11055/* duplicate a context */
11056
1d7c1841 11057PERL_CONTEXT *
a8fc9800 11058Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
11059{
11060 PERL_CONTEXT *ncxs;
11061
11062 if (!cxs)
11063 return (PERL_CONTEXT*)NULL;
11064
11065 /* look for it in the table first */
11066 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
11067 if (ncxs)
11068 return ncxs;
11069
11070 /* create anew and remember what it is */
11071 Newz(56, ncxs, max + 1, PERL_CONTEXT);
11072 ptr_table_store(PL_ptr_table, cxs, ncxs);
11073
11074 while (ix >= 0) {
11075 PERL_CONTEXT *cx = &cxs[ix];
11076 PERL_CONTEXT *ncx = &ncxs[ix];
11077 ncx->cx_type = cx->cx_type;
11078 if (CxTYPE(cx) == CXt_SUBST) {
11079 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
11080 }
11081 else {
11082 ncx->blk_oldsp = cx->blk_oldsp;
11083 ncx->blk_oldcop = cx->blk_oldcop;
1d7c1841
GS
11084 ncx->blk_oldmarksp = cx->blk_oldmarksp;
11085 ncx->blk_oldscopesp = cx->blk_oldscopesp;
11086 ncx->blk_oldpm = cx->blk_oldpm;
11087 ncx->blk_gimme = cx->blk_gimme;
11088 switch (CxTYPE(cx)) {
11089 case CXt_SUB:
11090 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
11091 ? cv_dup_inc(cx->blk_sub.cv, param)
11092 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 11093 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 11094 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 11095 : Nullav);
d2d73c3e 11096 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
11097 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
11098 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
11099 ncx->blk_sub.lval = cx->blk_sub.lval;
f39bc417 11100 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
11101 break;
11102 case CXt_EVAL:
11103 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
11104 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 11105 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 11106 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 11107 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
f39bc417 11108 ncx->blk_eval.retop = cx->blk_eval.retop;
1d7c1841
GS
11109 break;
11110 case CXt_LOOP:
11111 ncx->blk_loop.label = cx->blk_loop.label;
11112 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
11113 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
11114 ncx->blk_loop.next_op = cx->blk_loop.next_op;
11115 ncx->blk_loop.last_op = cx->blk_loop.last_op;
11116 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
11117 ? cx->blk_loop.iterdata
d2d73c3e 11118 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
11119 ncx->blk_loop.oldcomppad
11120 = (PAD*)ptr_table_fetch(PL_ptr_table,
11121 cx->blk_loop.oldcomppad);
d2d73c3e
AB
11122 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
11123 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
11124 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
11125 ncx->blk_loop.iterix = cx->blk_loop.iterix;
11126 ncx->blk_loop.itermax = cx->blk_loop.itermax;
11127 break;
11128 case CXt_FORMAT:
d2d73c3e
AB
11129 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
11130 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
11131 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841 11132 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
f39bc417 11133 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
11134 break;
11135 case CXt_BLOCK:
11136 case CXt_NULL:
11137 break;
11138 }
11139 }
11140 --ix;
11141 }
11142 return ncxs;
11143}
11144
645c22ef
DM
11145/* duplicate a stack info structure */
11146
1d7c1841 11147PERL_SI *
a8fc9800 11148Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
11149{
11150 PERL_SI *nsi;
11151
11152 if (!si)
11153 return (PERL_SI*)NULL;
11154
11155 /* look for it in the table first */
11156 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
11157 if (nsi)
11158 return nsi;
11159
11160 /* create anew and remember what it is */
11161 Newz(56, nsi, 1, PERL_SI);
11162 ptr_table_store(PL_ptr_table, si, nsi);
11163
d2d73c3e 11164 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
11165 nsi->si_cxix = si->si_cxix;
11166 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 11167 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 11168 nsi->si_type = si->si_type;
d2d73c3e
AB
11169 nsi->si_prev = si_dup(si->si_prev, param);
11170 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
11171 nsi->si_markoff = si->si_markoff;
11172
11173 return nsi;
11174}
11175
11176#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
11177#define TOPINT(ss,ix) ((ss)[ix].any_i32)
11178#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
11179#define TOPLONG(ss,ix) ((ss)[ix].any_long)
11180#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
11181#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
11182#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
11183#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
11184#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
11185#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
11186#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
11187#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
11188#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
11189#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
11190
11191/* XXXXX todo */
11192#define pv_dup_inc(p) SAVEPV(p)
11193#define pv_dup(p) SAVEPV(p)
11194#define svp_dup_inc(p,pp) any_dup(p,pp)
11195
645c22ef
DM
11196/* map any object to the new equivent - either something in the
11197 * ptr table, or something in the interpreter structure
11198 */
11199
1d7c1841
GS
11200void *
11201Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
11202{
11203 void *ret;
11204
11205 if (!v)
11206 return (void*)NULL;
11207
11208 /* look for it in the table first */
11209 ret = ptr_table_fetch(PL_ptr_table, v);
11210 if (ret)
11211 return ret;
11212
11213 /* see if it is part of the interpreter structure */
11214 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 11215 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 11216 else {
1d7c1841 11217 ret = v;
05ec9bb3 11218 }
1d7c1841
GS
11219
11220 return ret;
11221}
11222
645c22ef
DM
11223/* duplicate the save stack */
11224
1d7c1841 11225ANY *
a8fc9800 11226Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841
GS
11227{
11228 ANY *ss = proto_perl->Tsavestack;
11229 I32 ix = proto_perl->Tsavestack_ix;
11230 I32 max = proto_perl->Tsavestack_max;
11231 ANY *nss;
11232 SV *sv;
11233 GV *gv;
11234 AV *av;
11235 HV *hv;
11236 void* ptr;
11237 int intval;
11238 long longval;
11239 GP *gp;
11240 IV iv;
11241 I32 i;
c4e33207 11242 char *c = NULL;
1d7c1841 11243 void (*dptr) (void*);
acfe0abc 11244 void (*dxptr) (pTHX_ void*);
e977893f 11245 OP *o;
1d7c1841
GS
11246
11247 Newz(54, nss, max, ANY);
11248
11249 while (ix > 0) {
11250 i = POPINT(ss,ix);
11251 TOPINT(nss,ix) = i;
11252 switch (i) {
11253 case SAVEt_ITEM: /* normal string */
11254 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11255 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11256 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11257 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11258 break;
11259 case SAVEt_SV: /* scalar reference */
11260 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11261 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11262 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11263 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 11264 break;
f4dd75d9
GS
11265 case SAVEt_GENERIC_PVREF: /* generic char* */
11266 c = (char*)POPPTR(ss,ix);
11267 TOPPTR(nss,ix) = pv_dup(c);
11268 ptr = POPPTR(ss,ix);
11269 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11270 break;
05ec9bb3
NIS
11271 case SAVEt_SHARED_PVREF: /* char* in shared space */
11272 c = (char*)POPPTR(ss,ix);
11273 TOPPTR(nss,ix) = savesharedpv(c);
11274 ptr = POPPTR(ss,ix);
11275 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11276 break;
1d7c1841
GS
11277 case SAVEt_GENERIC_SVREF: /* generic sv */
11278 case SAVEt_SVREF: /* scalar reference */
11279 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11280 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11281 ptr = POPPTR(ss,ix);
11282 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
11283 break;
11284 case SAVEt_AV: /* array reference */
11285 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11286 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 11287 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11288 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11289 break;
11290 case SAVEt_HV: /* hash reference */
11291 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11292 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 11293 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11294 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11295 break;
11296 case SAVEt_INT: /* int reference */
11297 ptr = POPPTR(ss,ix);
11298 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11299 intval = (int)POPINT(ss,ix);
11300 TOPINT(nss,ix) = intval;
11301 break;
11302 case SAVEt_LONG: /* long reference */
11303 ptr = POPPTR(ss,ix);
11304 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11305 longval = (long)POPLONG(ss,ix);
11306 TOPLONG(nss,ix) = longval;
11307 break;
11308 case SAVEt_I32: /* I32 reference */
11309 case SAVEt_I16: /* I16 reference */
11310 case SAVEt_I8: /* I8 reference */
11311 ptr = POPPTR(ss,ix);
11312 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11313 i = POPINT(ss,ix);
11314 TOPINT(nss,ix) = i;
11315 break;
11316 case SAVEt_IV: /* IV reference */
11317 ptr = POPPTR(ss,ix);
11318 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11319 iv = POPIV(ss,ix);
11320 TOPIV(nss,ix) = iv;
11321 break;
11322 case SAVEt_SPTR: /* SV* reference */
11323 ptr = POPPTR(ss,ix);
11324 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11325 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11326 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
11327 break;
11328 case SAVEt_VPTR: /* random* reference */
11329 ptr = POPPTR(ss,ix);
11330 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11331 ptr = POPPTR(ss,ix);
11332 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11333 break;
11334 case SAVEt_PPTR: /* char* reference */
11335 ptr = POPPTR(ss,ix);
11336 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11337 c = (char*)POPPTR(ss,ix);
11338 TOPPTR(nss,ix) = pv_dup(c);
11339 break;
11340 case SAVEt_HPTR: /* HV* reference */
11341 ptr = POPPTR(ss,ix);
11342 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11343 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11344 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
11345 break;
11346 case SAVEt_APTR: /* AV* reference */
11347 ptr = POPPTR(ss,ix);
11348 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11349 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11350 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
11351 break;
11352 case SAVEt_NSTAB:
11353 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11354 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11355 break;
11356 case SAVEt_GP: /* scalar reference */
11357 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 11358 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
11359 (void)GpREFCNT_inc(gp);
11360 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 11361 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
11362 c = (char*)POPPTR(ss,ix);
11363 TOPPTR(nss,ix) = pv_dup(c);
11364 iv = POPIV(ss,ix);
11365 TOPIV(nss,ix) = iv;
11366 iv = POPIV(ss,ix);
11367 TOPIV(nss,ix) = iv;
11368 break;
11369 case SAVEt_FREESV:
26d9b02f 11370 case SAVEt_MORTALIZESV:
1d7c1841 11371 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11372 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11373 break;
11374 case SAVEt_FREEOP:
11375 ptr = POPPTR(ss,ix);
11376 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
11377 /* these are assumed to be refcounted properly */
11378 switch (((OP*)ptr)->op_type) {
11379 case OP_LEAVESUB:
11380 case OP_LEAVESUBLV:
11381 case OP_LEAVEEVAL:
11382 case OP_LEAVE:
11383 case OP_SCOPE:
11384 case OP_LEAVEWRITE:
e977893f
GS
11385 TOPPTR(nss,ix) = ptr;
11386 o = (OP*)ptr;
11387 OpREFCNT_inc(o);
1d7c1841
GS
11388 break;
11389 default:
11390 TOPPTR(nss,ix) = Nullop;
11391 break;
11392 }
11393 }
11394 else
11395 TOPPTR(nss,ix) = Nullop;
11396 break;
11397 case SAVEt_FREEPV:
11398 c = (char*)POPPTR(ss,ix);
11399 TOPPTR(nss,ix) = pv_dup_inc(c);
11400 break;
11401 case SAVEt_CLEARSV:
11402 longval = POPLONG(ss,ix);
11403 TOPLONG(nss,ix) = longval;
11404 break;
11405 case SAVEt_DELETE:
11406 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11407 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
11408 c = (char*)POPPTR(ss,ix);
11409 TOPPTR(nss,ix) = pv_dup_inc(c);
11410 i = POPINT(ss,ix);
11411 TOPINT(nss,ix) = i;
11412 break;
11413 case SAVEt_DESTRUCTOR:
11414 ptr = POPPTR(ss,ix);
11415 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11416 dptr = POPDPTR(ss,ix);
ef75a179 11417 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
11418 break;
11419 case SAVEt_DESTRUCTOR_X:
11420 ptr = POPPTR(ss,ix);
11421 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11422 dxptr = POPDXPTR(ss,ix);
acfe0abc 11423 TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
11424 break;
11425 case SAVEt_REGCONTEXT:
11426 case SAVEt_ALLOC:
11427 i = POPINT(ss,ix);
11428 TOPINT(nss,ix) = i;
11429 ix -= i;
11430 break;
11431 case SAVEt_STACK_POS: /* Position on Perl stack */
11432 i = POPINT(ss,ix);
11433 TOPINT(nss,ix) = i;
11434 break;
11435 case SAVEt_AELEM: /* array element */
11436 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11437 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11438 i = POPINT(ss,ix);
11439 TOPINT(nss,ix) = i;
11440 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11441 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
11442 break;
11443 case SAVEt_HELEM: /* hash element */
11444 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11445 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11446 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11447 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11448 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11449 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
11450 break;
11451 case SAVEt_OP:
11452 ptr = POPPTR(ss,ix);
11453 TOPPTR(nss,ix) = ptr;
11454 break;
11455 case SAVEt_HINTS:
11456 i = POPINT(ss,ix);
11457 TOPINT(nss,ix) = i;
11458 break;
c4410b1b
GS
11459 case SAVEt_COMPPAD:
11460 av = (AV*)POPPTR(ss,ix);
58ed4fbe 11461 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 11462 break;
c3564e5c
GS
11463 case SAVEt_PADSV:
11464 longval = (long)POPLONG(ss,ix);
11465 TOPLONG(nss,ix) = longval;
11466 ptr = POPPTR(ss,ix);
11467 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11468 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11469 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 11470 break;
a1bb4754 11471 case SAVEt_BOOL:
38d8b13e 11472 ptr = POPPTR(ss,ix);
b9609c01 11473 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 11474 longval = (long)POPBOOL(ss,ix);
b9609c01 11475 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 11476 break;
8bd2680e
MHM
11477 case SAVEt_SET_SVFLAGS:
11478 i = POPINT(ss,ix);
11479 TOPINT(nss,ix) = i;
11480 i = POPINT(ss,ix);
11481 TOPINT(nss,ix) = i;
11482 sv = (SV*)POPPTR(ss,ix);
11483 TOPPTR(nss,ix) = sv_dup(sv, param);
11484 break;
1d7c1841
GS
11485 default:
11486 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
11487 }
11488 }
11489
11490 return nss;
11491}
11492
645c22ef
DM
11493/*
11494=for apidoc perl_clone
11495
11496Create and return a new interpreter by cloning the current one.
11497
4be49ee6 11498perl_clone takes these flags as parameters:
6a78b4db 11499
7a5fa8a2
NIS
11500CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
11501without it we only clone the data and zero the stacks,
11502with it we copy the stacks and the new perl interpreter is
11503ready to run at the exact same point as the previous one.
11504The pseudo-fork code uses COPY_STACKS while the
6a78b4db
AB
11505threads->new doesn't.
11506
11507CLONEf_KEEP_PTR_TABLE
7a5fa8a2
NIS
11508perl_clone keeps a ptr_table with the pointer of the old
11509variable as a key and the new variable as a value,
11510this allows it to check if something has been cloned and not
11511clone it again but rather just use the value and increase the
11512refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
11513the ptr_table using the function
11514C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
11515reason to keep it around is if you want to dup some of your own
11516variable who are outside the graph perl scans, example of this
6a78b4db
AB
11517code is in threads.xs create
11518
11519CLONEf_CLONE_HOST
7a5fa8a2
NIS
11520This is a win32 thing, it is ignored on unix, it tells perls
11521win32host code (which is c++) to clone itself, this is needed on
11522win32 if you want to run two threads at the same time,
11523if you just want to do some stuff in a separate perl interpreter
11524and then throw it away and return to the original one,
6a78b4db
AB
11525you don't need to do anything.
11526
645c22ef
DM
11527=cut
11528*/
11529
11530/* XXX the above needs expanding by someone who actually understands it ! */
3fc56081
NK
11531EXTERN_C PerlInterpreter *
11532perl_clone_host(PerlInterpreter* proto_perl, UV flags);
645c22ef 11533
1d7c1841
GS
11534PerlInterpreter *
11535perl_clone(PerlInterpreter *proto_perl, UV flags)
11536{
1d7c1841 11537#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
11538
11539 /* perlhost.h so we need to call into it
11540 to clone the host, CPerlHost should have a c interface, sky */
11541
11542 if (flags & CLONEf_CLONE_HOST) {
11543 return perl_clone_host(proto_perl,flags);
11544 }
11545 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
11546 proto_perl->IMem,
11547 proto_perl->IMemShared,
11548 proto_perl->IMemParse,
11549 proto_perl->IEnv,
11550 proto_perl->IStdIO,
11551 proto_perl->ILIO,
11552 proto_perl->IDir,
11553 proto_perl->ISock,
11554 proto_perl->IProc);
11555}
11556
11557PerlInterpreter *
11558perl_clone_using(PerlInterpreter *proto_perl, UV flags,
11559 struct IPerlMem* ipM, struct IPerlMem* ipMS,
11560 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
11561 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
11562 struct IPerlDir* ipD, struct IPerlSock* ipS,
11563 struct IPerlProc* ipP)
11564{
11565 /* XXX many of the string copies here can be optimized if they're
11566 * constants; they need to be allocated as common memory and just
11567 * their pointers copied. */
11568
11569 IV i;
64aa0685
GS
11570 CLONE_PARAMS clone_params;
11571 CLONE_PARAMS* param = &clone_params;
d2d73c3e 11572
1d7c1841 11573 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
ba869deb 11574 PERL_SET_THX(my_perl);
1d7c1841 11575
acfe0abc 11576# ifdef DEBUGGING
a4530404 11577 Poison(my_perl, 1, PerlInterpreter);
fd0854ff 11578 PL_op = Nullop;
c008732b 11579 PL_curcop = (COP *)Nullop;
1d7c1841
GS
11580 PL_markstack = 0;
11581 PL_scopestack = 0;
11582 PL_savestack = 0;
22f7c9c9
JH
11583 PL_savestack_ix = 0;
11584 PL_savestack_max = -1;
66fe0623 11585 PL_sig_pending = 0;
25596c82 11586 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
acfe0abc 11587# else /* !DEBUGGING */
1d7c1841 11588 Zero(my_perl, 1, PerlInterpreter);
acfe0abc 11589# endif /* DEBUGGING */
1d7c1841
GS
11590
11591 /* host pointers */
11592 PL_Mem = ipM;
11593 PL_MemShared = ipMS;
11594 PL_MemParse = ipMP;
11595 PL_Env = ipE;
11596 PL_StdIO = ipStd;
11597 PL_LIO = ipLIO;
11598 PL_Dir = ipD;
11599 PL_Sock = ipS;
11600 PL_Proc = ipP;
1d7c1841
GS
11601#else /* !PERL_IMPLICIT_SYS */
11602 IV i;
64aa0685
GS
11603 CLONE_PARAMS clone_params;
11604 CLONE_PARAMS* param = &clone_params;
1d7c1841 11605 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 11606 PERL_SET_THX(my_perl);
1d7c1841 11607
d2d73c3e
AB
11608
11609
1d7c1841 11610# ifdef DEBUGGING
a4530404 11611 Poison(my_perl, 1, PerlInterpreter);
fd0854ff 11612 PL_op = Nullop;
c008732b 11613 PL_curcop = (COP *)Nullop;
1d7c1841
GS
11614 PL_markstack = 0;
11615 PL_scopestack = 0;
11616 PL_savestack = 0;
22f7c9c9
JH
11617 PL_savestack_ix = 0;
11618 PL_savestack_max = -1;
66fe0623 11619 PL_sig_pending = 0;
25596c82 11620 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
1d7c1841
GS
11621# else /* !DEBUGGING */
11622 Zero(my_perl, 1, PerlInterpreter);
11623# endif /* DEBUGGING */
11624#endif /* PERL_IMPLICIT_SYS */
83236556 11625 param->flags = flags;
59b40662 11626 param->proto_perl = proto_perl;
1d7c1841
GS
11627
11628 /* arena roots */
11629 PL_xiv_arenaroot = NULL;
11630 PL_xiv_root = NULL;
612f20c3 11631 PL_xnv_arenaroot = NULL;
1d7c1841 11632 PL_xnv_root = NULL;
612f20c3 11633 PL_xrv_arenaroot = NULL;
1d7c1841 11634 PL_xrv_root = NULL;
612f20c3 11635 PL_xpv_arenaroot = NULL;
1d7c1841 11636 PL_xpv_root = NULL;
612f20c3 11637 PL_xpviv_arenaroot = NULL;
1d7c1841 11638 PL_xpviv_root = NULL;
612f20c3 11639 PL_xpvnv_arenaroot = NULL;
1d7c1841 11640 PL_xpvnv_root = NULL;
612f20c3 11641 PL_xpvcv_arenaroot = NULL;
1d7c1841 11642 PL_xpvcv_root = NULL;
612f20c3 11643 PL_xpvav_arenaroot = NULL;
1d7c1841 11644 PL_xpvav_root = NULL;
612f20c3 11645 PL_xpvhv_arenaroot = NULL;
1d7c1841 11646 PL_xpvhv_root = NULL;
612f20c3 11647 PL_xpvmg_arenaroot = NULL;
1d7c1841 11648 PL_xpvmg_root = NULL;
612f20c3 11649 PL_xpvlv_arenaroot = NULL;
1d7c1841 11650 PL_xpvlv_root = NULL;
612f20c3 11651 PL_xpvbm_arenaroot = NULL;
1d7c1841 11652 PL_xpvbm_root = NULL;
612f20c3 11653 PL_he_arenaroot = NULL;
1d7c1841
GS
11654 PL_he_root = NULL;
11655 PL_nice_chunk = NULL;
11656 PL_nice_chunk_size = 0;
11657 PL_sv_count = 0;
11658 PL_sv_objcount = 0;
11659 PL_sv_root = Nullsv;
11660 PL_sv_arenaroot = Nullsv;
11661
11662 PL_debug = proto_perl->Idebug;
11663
e5dd39fc 11664#ifdef USE_REENTRANT_API
68853529
SB
11665 /* XXX: things like -Dm will segfault here in perlio, but doing
11666 * PERL_SET_CONTEXT(proto_perl);
11667 * breaks too many other things
11668 */
59bd0823 11669 Perl_reentrant_init(aTHX);
e5dd39fc
AB
11670#endif
11671
1d7c1841
GS
11672 /* create SV map for pointer relocation */
11673 PL_ptr_table = ptr_table_new();
11674
11675 /* initialize these special pointers as early as possible */
11676 SvANY(&PL_sv_undef) = NULL;
11677 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
11678 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
11679 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
11680
1d7c1841 11681 SvANY(&PL_sv_no) = new_XPVNV();
1d7c1841 11682 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
0309f36e
NC
11683 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11684 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
f880fe2f 11685 SvPV_set(&PL_sv_no, SAVEPVN(PL_No, 0));
1d7c1841
GS
11686 SvCUR(&PL_sv_no) = 0;
11687 SvLEN(&PL_sv_no) = 1;
45977657 11688 SvIV_set(&PL_sv_no, 0);
9d6ce603 11689 SvNV_set(&PL_sv_no, 0);
1d7c1841
GS
11690 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
11691
1d7c1841 11692 SvANY(&PL_sv_yes) = new_XPVNV();
1d7c1841 11693 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
0309f36e
NC
11694 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11695 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
f880fe2f 11696 SvPV_set(&PL_sv_yes, SAVEPVN(PL_Yes, 1));
1d7c1841
GS
11697 SvCUR(&PL_sv_yes) = 1;
11698 SvLEN(&PL_sv_yes) = 2;
45977657 11699 SvIV_set(&PL_sv_yes, 1);
9d6ce603 11700 SvNV_set(&PL_sv_yes, 1);
1d7c1841
GS
11701 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
11702
05ec9bb3 11703 /* create (a non-shared!) shared string table */
1d7c1841
GS
11704 PL_strtab = newHV();
11705 HvSHAREKEYS_off(PL_strtab);
11706 hv_ksplit(PL_strtab, 512);
11707 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
11708
05ec9bb3
NIS
11709 PL_compiling = proto_perl->Icompiling;
11710
11711 /* These two PVs will be free'd special way so must set them same way op.c does */
11712 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
11713 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
11714
11715 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
11716 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
11717
1d7c1841
GS
11718 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
11719 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 11720 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 11721 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 11722 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
11723 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
11724
11725 /* pseudo environmental stuff */
11726 PL_origargc = proto_perl->Iorigargc;
e2975953 11727 PL_origargv = proto_perl->Iorigargv;
d2d73c3e 11728
d2d73c3e
AB
11729 param->stashes = newAV(); /* Setup array of objects to call clone on */
11730
a1ea730d 11731#ifdef PERLIO_LAYERS
3a1ee7e8
NIS
11732 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11733 PerlIO_clone(aTHX_ proto_perl, param);
a1ea730d 11734#endif
d2d73c3e
AB
11735
11736 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
11737 PL_incgv = gv_dup(proto_perl->Iincgv, param);
11738 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 11739 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
11740 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
11741 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
11742
11743 /* switches */
11744 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 11745 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
11746 PL_localpatches = proto_perl->Ilocalpatches;
11747 PL_splitstr = proto_perl->Isplitstr;
11748 PL_preprocess = proto_perl->Ipreprocess;
11749 PL_minus_n = proto_perl->Iminus_n;
11750 PL_minus_p = proto_perl->Iminus_p;
11751 PL_minus_l = proto_perl->Iminus_l;
11752 PL_minus_a = proto_perl->Iminus_a;
11753 PL_minus_F = proto_perl->Iminus_F;
11754 PL_doswitches = proto_perl->Idoswitches;
11755 PL_dowarn = proto_perl->Idowarn;
11756 PL_doextract = proto_perl->Idoextract;
11757 PL_sawampersand = proto_perl->Isawampersand;
11758 PL_unsafe = proto_perl->Iunsafe;
11759 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 11760 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
11761 PL_perldb = proto_perl->Iperldb;
11762 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
1cbb0781 11763 PL_exit_flags = proto_perl->Iexit_flags;
1d7c1841
GS
11764
11765 /* magical thingies */
11766 /* XXX time(&PL_basetime) when asked for? */
11767 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 11768 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
11769
11770 PL_maxsysfd = proto_perl->Imaxsysfd;
11771 PL_multiline = proto_perl->Imultiline;
11772 PL_statusvalue = proto_perl->Istatusvalue;
11773#ifdef VMS
11774 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
11775#endif
0a378802 11776 PL_encoding = sv_dup(proto_perl->Iencoding, param);
1d7c1841 11777
4a4c6fe3 11778 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
1f483ca1
JH
11779 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
11780 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
4a4c6fe3 11781
d2f185dc
AMS
11782 /* Clone the regex array */
11783 PL_regex_padav = newAV();
11784 {
11785 I32 len = av_len((AV*)proto_perl->Iregex_padav);
11786 SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
0f95fc41
AB
11787 av_push(PL_regex_padav,
11788 sv_dup_inc(regexen[0],param));
11789 for(i = 1; i <= len; i++) {
11790 if(SvREPADTMP(regexen[i])) {
11791 av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
8cf8f3d1 11792 } else {
0f95fc41
AB
11793 av_push(PL_regex_padav,
11794 SvREFCNT_inc(
8cf8f3d1 11795 newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
cbfa9890 11796 SvIVX(regexen[i])), param)))
0f95fc41
AB
11797 ));
11798 }
d2f185dc
AMS
11799 }
11800 }
11801 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 11802
1d7c1841 11803 /* shortcuts to various I/O objects */
d2d73c3e
AB
11804 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
11805 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
11806 PL_defgv = gv_dup(proto_perl->Idefgv, param);
11807 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
11808 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
11809 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
11810
11811 /* shortcuts to regexp stuff */
d2d73c3e 11812 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
11813
11814 /* shortcuts to misc objects */
d2d73c3e 11815 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
11816
11817 /* shortcuts to debugging objects */
d2d73c3e
AB
11818 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
11819 PL_DBline = gv_dup(proto_perl->IDBline, param);
11820 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
11821 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
11822 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
11823 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
06492da6 11824 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
d2d73c3e
AB
11825 PL_lineary = av_dup(proto_perl->Ilineary, param);
11826 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
11827
11828 /* symbol tables */
d2d73c3e
AB
11829 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
11830 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
d2d73c3e
AB
11831 PL_debstash = hv_dup(proto_perl->Idebstash, param);
11832 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
11833 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
11834
11835 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
ee1c5a4e 11836 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
ece599bd 11837 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
d2d73c3e
AB
11838 PL_endav = av_dup_inc(proto_perl->Iendav, param);
11839 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
11840 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
11841
11842 PL_sub_generation = proto_perl->Isub_generation;
11843
11844 /* funky return mechanisms */
11845 PL_forkprocess = proto_perl->Iforkprocess;
11846
11847 /* subprocess state */
d2d73c3e 11848 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
11849
11850 /* internal state */
11851 PL_tainting = proto_perl->Itainting;
7135f00b 11852 PL_taint_warn = proto_perl->Itaint_warn;
1d7c1841
GS
11853 PL_maxo = proto_perl->Imaxo;
11854 if (proto_perl->Iop_mask)
11855 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11856 else
11857 PL_op_mask = Nullch;
06492da6 11858 /* PL_asserting = proto_perl->Iasserting; */
1d7c1841
GS
11859
11860 /* current interpreter roots */
d2d73c3e 11861 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
11862 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
11863 PL_main_start = proto_perl->Imain_start;
e977893f 11864 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
11865 PL_eval_start = proto_perl->Ieval_start;
11866
11867 /* runtime control stuff */
11868 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
11869 PL_copline = proto_perl->Icopline;
11870
11871 PL_filemode = proto_perl->Ifilemode;
11872 PL_lastfd = proto_perl->Ilastfd;
11873 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
11874 PL_Argv = NULL;
11875 PL_Cmd = Nullch;
11876 PL_gensym = proto_perl->Igensym;
11877 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 11878 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
11879 PL_laststatval = proto_perl->Ilaststatval;
11880 PL_laststype = proto_perl->Ilaststype;
11881 PL_mess_sv = Nullsv;
11882
d2d73c3e 11883 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
11884 PL_ofmt = SAVEPV(proto_perl->Iofmt);
11885
11886 /* interpreter atexit processing */
11887 PL_exitlistlen = proto_perl->Iexitlistlen;
11888 if (PL_exitlistlen) {
11889 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11890 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11891 }
11892 else
11893 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 11894 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
19e8ce8e
AB
11895 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
11896 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1d7c1841
GS
11897
11898 PL_profiledata = NULL;
a8fc9800 11899 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
1d7c1841 11900 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 11901 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 11902
d2d73c3e 11903 PL_compcv = cv_dup(proto_perl->Icompcv, param);
dd2155a4
DM
11904
11905 PAD_CLONE_VARS(proto_perl, param);
1d7c1841
GS
11906
11907#ifdef HAVE_INTERP_INTERN
11908 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11909#endif
11910
11911 /* more statics moved here */
11912 PL_generation = proto_perl->Igeneration;
d2d73c3e 11913 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
11914
11915 PL_in_clean_objs = proto_perl->Iin_clean_objs;
11916 PL_in_clean_all = proto_perl->Iin_clean_all;
11917
11918 PL_uid = proto_perl->Iuid;
11919 PL_euid = proto_perl->Ieuid;
11920 PL_gid = proto_perl->Igid;
11921 PL_egid = proto_perl->Iegid;
11922 PL_nomemok = proto_perl->Inomemok;
11923 PL_an = proto_perl->Ian;
1d7c1841
GS
11924 PL_evalseq = proto_perl->Ievalseq;
11925 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
11926 PL_origalen = proto_perl->Iorigalen;
11927 PL_pidstatus = newHV(); /* XXX flag for cloning? */
11928 PL_osname = SAVEPV(proto_perl->Iosname);
5c728af0 11929 PL_sh_path_compat = proto_perl->Ish_path_compat; /* XXX never deallocated */
1d7c1841
GS
11930 PL_sighandlerp = proto_perl->Isighandlerp;
11931
11932
11933 PL_runops = proto_perl->Irunops;
11934
11935 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
11936
11937#ifdef CSH
11938 PL_cshlen = proto_perl->Icshlen;
74f1b2b8 11939 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
1d7c1841
GS
11940#endif
11941
11942 PL_lex_state = proto_perl->Ilex_state;
11943 PL_lex_defer = proto_perl->Ilex_defer;
11944 PL_lex_expect = proto_perl->Ilex_expect;
11945 PL_lex_formbrack = proto_perl->Ilex_formbrack;
11946 PL_lex_dojoin = proto_perl->Ilex_dojoin;
11947 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
11948 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
11949 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
11950 PL_lex_op = proto_perl->Ilex_op;
11951 PL_lex_inpat = proto_perl->Ilex_inpat;
11952 PL_lex_inwhat = proto_perl->Ilex_inwhat;
11953 PL_lex_brackets = proto_perl->Ilex_brackets;
11954 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
11955 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
11956 PL_lex_casemods = proto_perl->Ilex_casemods;
11957 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
11958 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
11959
11960 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
11961 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
11962 PL_nexttoke = proto_perl->Inexttoke;
11963
1d773130
TB
11964 /* XXX This is probably masking the deeper issue of why
11965 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
11966 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
11967 * (A little debugging with a watchpoint on it may help.)
11968 */
389edf32
TB
11969 if (SvANY(proto_perl->Ilinestr)) {
11970 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
11971 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
11972 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11973 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
11974 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11975 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
11976 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11977 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
11978 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11979 }
11980 else {
11981 PL_linestr = NEWSV(65,79);
11982 sv_upgrade(PL_linestr,SVt_PVIV);
11983 sv_setpvn(PL_linestr,"",0);
11984 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
11985 }
1d7c1841 11986 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1d7c1841
GS
11987 PL_pending_ident = proto_perl->Ipending_ident;
11988 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
11989
11990 PL_expect = proto_perl->Iexpect;
11991
11992 PL_multi_start = proto_perl->Imulti_start;
11993 PL_multi_end = proto_perl->Imulti_end;
11994 PL_multi_open = proto_perl->Imulti_open;
11995 PL_multi_close = proto_perl->Imulti_close;
11996
11997 PL_error_count = proto_perl->Ierror_count;
11998 PL_subline = proto_perl->Isubline;
d2d73c3e 11999 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841 12000
1d773130 12001 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
389edf32
TB
12002 if (SvANY(proto_perl->Ilinestr)) {
12003 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
12004 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
12005 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
12006 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
12007 PL_last_lop_op = proto_perl->Ilast_lop_op;
12008 }
12009 else {
12010 PL_last_uni = SvPVX(PL_linestr);
12011 PL_last_lop = SvPVX(PL_linestr);
12012 PL_last_lop_op = 0;
12013 }
1d7c1841 12014 PL_in_my = proto_perl->Iin_my;
d2d73c3e 12015 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
12016#ifdef FCRYPT
12017 PL_cryptseen = proto_perl->Icryptseen;
12018#endif
12019
12020 PL_hints = proto_perl->Ihints;
12021
12022 PL_amagic_generation = proto_perl->Iamagic_generation;
12023
12024#ifdef USE_LOCALE_COLLATE
12025 PL_collation_ix = proto_perl->Icollation_ix;
12026 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
12027 PL_collation_standard = proto_perl->Icollation_standard;
12028 PL_collxfrm_base = proto_perl->Icollxfrm_base;
12029 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
12030#endif /* USE_LOCALE_COLLATE */
12031
12032#ifdef USE_LOCALE_NUMERIC
12033 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
12034 PL_numeric_standard = proto_perl->Inumeric_standard;
12035 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 12036 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
12037#endif /* !USE_LOCALE_NUMERIC */
12038
12039 /* utf8 character classes */
d2d73c3e
AB
12040 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
12041 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
12042 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
12043 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
12044 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
12045 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
12046 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
12047 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
12048 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
12049 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
12050 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
12051 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
12052 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
12053 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
12054 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
12055 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
12056 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
b4e400f9 12057 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
82686b01
JH
12058 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
12059 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 12060
6c3182a5 12061 /* Did the locale setup indicate UTF-8? */
9769094f 12062 PL_utf8locale = proto_perl->Iutf8locale;
6c3182a5
JH
12063 /* Unicode features (see perlrun/-C) */
12064 PL_unicode = proto_perl->Iunicode;
12065
12066 /* Pre-5.8 signals control */
12067 PL_signals = proto_perl->Isignals;
12068
12069 /* times() ticks per second */
12070 PL_clocktick = proto_perl->Iclocktick;
12071
12072 /* Recursion stopper for PerlIO_find_layer */
12073 PL_in_load_module = proto_perl->Iin_load_module;
12074
12075 /* sort() routine */
12076 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
12077
57c6e6d2
JH
12078 /* Not really needed/useful since the reenrant_retint is "volatile",
12079 * but do it for consistency's sake. */
12080 PL_reentrant_retint = proto_perl->Ireentrant_retint;
12081
15a5279a
JH
12082 /* Hooks to shared SVs and locks. */
12083 PL_sharehook = proto_perl->Isharehook;
12084 PL_lockhook = proto_perl->Ilockhook;
12085 PL_unlockhook = proto_perl->Iunlockhook;
12086 PL_threadhook = proto_perl->Ithreadhook;
12087
bce260cd
JH
12088 PL_runops_std = proto_perl->Irunops_std;
12089 PL_runops_dbg = proto_perl->Irunops_dbg;
12090
12091#ifdef THREADS_HAVE_PIDS
12092 PL_ppid = proto_perl->Ippid;
12093#endif
12094
1d7c1841
GS
12095 /* swatch cache */
12096 PL_last_swash_hv = Nullhv; /* reinits on demand */
12097 PL_last_swash_klen = 0;
12098 PL_last_swash_key[0]= '\0';
12099 PL_last_swash_tmps = (U8*)NULL;
12100 PL_last_swash_slen = 0;
12101
1d7c1841
GS
12102 PL_glob_index = proto_perl->Iglob_index;
12103 PL_srand_called = proto_perl->Isrand_called;
504f80c1 12104 PL_hash_seed = proto_perl->Ihash_seed;
008fb0c0 12105 PL_rehash_seed = proto_perl->Irehash_seed;
1d7c1841
GS
12106 PL_uudmap['M'] = 0; /* reinits on demand */
12107 PL_bitcount = Nullch; /* reinits on demand */
12108
66fe0623
NIS
12109 if (proto_perl->Ipsig_pend) {
12110 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 12111 }
66fe0623
NIS
12112 else {
12113 PL_psig_pend = (int*)NULL;
12114 }
12115
1d7c1841 12116 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
12117 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
12118 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 12119 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
12120 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
12121 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
12122 }
12123 }
12124 else {
12125 PL_psig_ptr = (SV**)NULL;
12126 PL_psig_name = (SV**)NULL;
12127 }
12128
12129 /* thrdvar.h stuff */
12130
a0739874 12131 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
12132 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
12133 PL_tmps_ix = proto_perl->Ttmps_ix;
12134 PL_tmps_max = proto_perl->Ttmps_max;
12135 PL_tmps_floor = proto_perl->Ttmps_floor;
12136 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
12137 i = 0;
12138 while (i <= PL_tmps_ix) {
d2d73c3e 12139 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
12140 ++i;
12141 }
12142
12143 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
12144 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
12145 Newz(54, PL_markstack, i, I32);
12146 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
12147 - proto_perl->Tmarkstack);
12148 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
12149 - proto_perl->Tmarkstack);
12150 Copy(proto_perl->Tmarkstack, PL_markstack,
12151 PL_markstack_ptr - PL_markstack + 1, I32);
12152
12153 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
12154 * NOTE: unlike the others! */
12155 PL_scopestack_ix = proto_perl->Tscopestack_ix;
12156 PL_scopestack_max = proto_perl->Tscopestack_max;
12157 Newz(54, PL_scopestack, PL_scopestack_max, I32);
12158 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
12159
1d7c1841 12160 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 12161 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
12162
12163 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
12164 PL_curstack = av_dup(proto_perl->Tcurstack, param);
12165 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
12166
12167 /* next PUSHs() etc. set *(PL_stack_sp+1) */
12168 PL_stack_base = AvARRAY(PL_curstack);
12169 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
12170 - proto_perl->Tstack_base);
12171 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
12172
12173 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
12174 * NOTE: unlike the others! */
12175 PL_savestack_ix = proto_perl->Tsavestack_ix;
12176 PL_savestack_max = proto_perl->Tsavestack_max;
12177 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 12178 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
12179 }
12180 else {
12181 init_stacks();
985e7056 12182 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
12183 }
12184
12185 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
12186 PL_top_env = &PL_start_env;
12187
12188 PL_op = proto_perl->Top;
12189
12190 PL_Sv = Nullsv;
12191 PL_Xpv = (XPV*)NULL;
12192 PL_na = proto_perl->Tna;
12193
12194 PL_statbuf = proto_perl->Tstatbuf;
12195 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
12196 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
12197 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
12198#ifdef HAS_TIMES
12199 PL_timesbuf = proto_perl->Ttimesbuf;
12200#endif
12201
12202 PL_tainted = proto_perl->Ttainted;
12203 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
12204 PL_rs = sv_dup_inc(proto_perl->Trs, param);
12205 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
12206 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
12207 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 12208 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
12209 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
12210 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
12211 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
12212
12213 PL_restartop = proto_perl->Trestartop;
12214 PL_in_eval = proto_perl->Tin_eval;
12215 PL_delaymagic = proto_perl->Tdelaymagic;
12216 PL_dirty = proto_perl->Tdirty;
12217 PL_localizing = proto_perl->Tlocalizing;
12218
d2d73c3e 12219 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
dd28f7bb 12220 PL_hv_fetch_ent_mh = Nullhe;
1d7c1841
GS
12221 PL_modcount = proto_perl->Tmodcount;
12222 PL_lastgotoprobe = Nullop;
12223 PL_dumpindent = proto_perl->Tdumpindent;
12224
12225 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
12226 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
12227 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
12228 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
12229 PL_sortcxix = proto_perl->Tsortcxix;
12230 PL_efloatbuf = Nullch; /* reinits on demand */
12231 PL_efloatsize = 0; /* reinits on demand */
12232
12233 /* regex stuff */
12234
12235 PL_screamfirst = NULL;
12236 PL_screamnext = NULL;
12237 PL_maxscream = -1; /* reinits on demand */
12238 PL_lastscream = Nullsv;
12239
12240 PL_watchaddr = NULL;
12241 PL_watchok = Nullch;
12242
12243 PL_regdummy = proto_perl->Tregdummy;
1d7c1841
GS
12244 PL_regprecomp = Nullch;
12245 PL_regnpar = 0;
12246 PL_regsize = 0;
1d7c1841
GS
12247 PL_colorset = 0; /* reinits PL_colors[] */
12248 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841
GS
12249 PL_reginput = Nullch;
12250 PL_regbol = Nullch;
12251 PL_regeol = Nullch;
12252 PL_regstartp = (I32*)NULL;
12253 PL_regendp = (I32*)NULL;
12254 PL_reglastparen = (U32*)NULL;
2d862feb 12255 PL_reglastcloseparen = (U32*)NULL;
1d7c1841 12256 PL_regtill = Nullch;
1d7c1841
GS
12257 PL_reg_start_tmp = (char**)NULL;
12258 PL_reg_start_tmpl = 0;
12259 PL_regdata = (struct reg_data*)NULL;
12260 PL_bostr = Nullch;
12261 PL_reg_flags = 0;
12262 PL_reg_eval_set = 0;
12263 PL_regnarrate = 0;
12264 PL_regprogram = (regnode*)NULL;
12265 PL_regindent = 0;
12266 PL_regcc = (CURCUR*)NULL;
12267 PL_reg_call_cc = (struct re_cc_state*)NULL;
12268 PL_reg_re = (regexp*)NULL;
12269 PL_reg_ganch = Nullch;
12270 PL_reg_sv = Nullsv;
53c4c00c 12271 PL_reg_match_utf8 = FALSE;
1d7c1841
GS
12272 PL_reg_magic = (MAGIC*)NULL;
12273 PL_reg_oldpos = 0;
12274 PL_reg_oldcurpm = (PMOP*)NULL;
12275 PL_reg_curpm = (PMOP*)NULL;
12276 PL_reg_oldsaved = Nullch;
12277 PL_reg_oldsavedlen = 0;
ed252734 12278#ifdef PERL_COPY_ON_WRITE
504cff3b 12279 PL_nrs = Nullsv;
ed252734 12280#endif
1d7c1841
GS
12281 PL_reg_maxiter = 0;
12282 PL_reg_leftiter = 0;
12283 PL_reg_poscache = Nullch;
12284 PL_reg_poscache_size= 0;
12285
12286 /* RE engine - function pointers */
12287 PL_regcompp = proto_perl->Tregcompp;
12288 PL_regexecp = proto_perl->Tregexecp;
12289 PL_regint_start = proto_perl->Tregint_start;
12290 PL_regint_string = proto_perl->Tregint_string;
12291 PL_regfree = proto_perl->Tregfree;
12292
12293 PL_reginterp_cnt = 0;
12294 PL_reg_starttry = 0;
12295
a2efc822
SC
12296 /* Pluggable optimizer */
12297 PL_peepp = proto_perl->Tpeepp;
12298
081fc587
AB
12299 PL_stashcache = newHV();
12300
a0739874
DM
12301 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
12302 ptr_table_free(PL_ptr_table);
12303 PL_ptr_table = NULL;
12304 }
8cf8f3d1 12305
f284b03f
AMS
12306 /* Call the ->CLONE method, if it exists, for each of the stashes
12307 identified by sv_dup() above.
12308 */
d2d73c3e
AB
12309 while(av_len(param->stashes) != -1) {
12310 HV* stash = (HV*) av_shift(param->stashes);
f284b03f
AMS
12311 GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
12312 if (cloner && GvCV(cloner)) {
12313 dSP;
12314 ENTER;
12315 SAVETMPS;
12316 PUSHMARK(SP);
dc507217 12317 XPUSHs(sv_2mortal(newSVpv(HvNAME(stash), 0)));
f284b03f
AMS
12318 PUTBACK;
12319 call_sv((SV*)GvCV(cloner), G_DISCARD);
12320 FREETMPS;
12321 LEAVE;
12322 }
4a09accc 12323 }
a0739874 12324
dc507217 12325 SvREFCNT_dec(param->stashes);
dc507217 12326
1d7c1841 12327 return my_perl;
1d7c1841
GS
12328}
12329
1d7c1841 12330#endif /* USE_ITHREADS */
a0ae6670 12331
9f4817db 12332/*
ccfc67b7
JH
12333=head1 Unicode Support
12334
9f4817db
JH
12335=for apidoc sv_recode_to_utf8
12336
5d170f3a
JH
12337The encoding is assumed to be an Encode object, on entry the PV
12338of the sv is assumed to be octets in that encoding, and the sv
12339will be converted into Unicode (and UTF-8).
9f4817db 12340
5d170f3a
JH
12341If the sv already is UTF-8 (or if it is not POK), or if the encoding
12342is not a reference, nothing is done to the sv. If the encoding is not
1768d7eb
JH
12343an C<Encode::XS> Encoding object, bad things will happen.
12344(See F<lib/encoding.pm> and L<Encode>).
9f4817db 12345
5d170f3a 12346The PV of the sv is returned.
9f4817db 12347
5d170f3a
JH
12348=cut */
12349
12350char *
12351Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
12352{
220e2d4e 12353 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
d0063567
DK
12354 SV *uni;
12355 STRLEN len;
12356 char *s;
12357 dSP;
12358 ENTER;
12359 SAVETMPS;
220e2d4e 12360 save_re_context();
d0063567
DK
12361 PUSHMARK(sp);
12362 EXTEND(SP, 3);
12363 XPUSHs(encoding);
12364 XPUSHs(sv);
7a5fa8a2 12365/*
f9893866
NIS
12366 NI-S 2002/07/09
12367 Passing sv_yes is wrong - it needs to be or'ed set of constants
7a5fa8a2 12368 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
f9893866
NIS
12369 remove converted chars from source.
12370
12371 Both will default the value - let them.
7a5fa8a2 12372
d0063567 12373 XPUSHs(&PL_sv_yes);
f9893866 12374*/
d0063567
DK
12375 PUTBACK;
12376 call_method("decode", G_SCALAR);
12377 SPAGAIN;
12378 uni = POPs;
12379 PUTBACK;
12380 s = SvPV(uni, len);
d0063567
DK
12381 if (s != SvPVX(sv)) {
12382 SvGROW(sv, len + 1);
12383 Move(s, SvPVX(sv), len, char);
12384 SvCUR_set(sv, len);
12385 SvPVX(sv)[len] = 0;
12386 }
12387 FREETMPS;
12388 LEAVE;
d0063567 12389 SvUTF8_on(sv);
95899a2a 12390 return SvPVX(sv);
f9893866 12391 }
95899a2a 12392 return SvPOKp(sv) ? SvPVX(sv) : NULL;
9f4817db
JH
12393}
12394
220e2d4e
IH
12395/*
12396=for apidoc sv_cat_decode
12397
12398The encoding is assumed to be an Encode object, the PV of the ssv is
12399assumed to be octets in that encoding and decoding the input starts
12400from the position which (PV + *offset) pointed to. The dsv will be
12401concatenated the decoded UTF-8 string from ssv. Decoding will terminate
12402when the string tstr appears in decoding output or the input ends on
12403the PV of the ssv. The value which the offset points will be modified
12404to the last input position on the ssv.
68795e93 12405
220e2d4e
IH
12406Returns TRUE if the terminator was found, else returns FALSE.
12407
12408=cut */
12409
12410bool
12411Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
12412 SV *ssv, int *offset, char *tstr, int tlen)
12413{
a73e8557 12414 bool ret = FALSE;
220e2d4e 12415 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
220e2d4e
IH
12416 SV *offsv;
12417 dSP;
12418 ENTER;
12419 SAVETMPS;
12420 save_re_context();
12421 PUSHMARK(sp);
12422 EXTEND(SP, 6);
12423 XPUSHs(encoding);
12424 XPUSHs(dsv);
12425 XPUSHs(ssv);
12426 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
12427 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
12428 PUTBACK;
12429 call_method("cat_decode", G_SCALAR);
12430 SPAGAIN;
12431 ret = SvTRUE(TOPs);
12432 *offset = SvIV(offsv);
12433 PUTBACK;
12434 FREETMPS;
12435 LEAVE;
220e2d4e 12436 }
a73e8557
JH
12437 else
12438 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
12439 return ret;
220e2d4e 12440}
f9893866 12441
241d1a3b
NC
12442/*
12443 * Local variables:
12444 * c-indentation-style: bsd
12445 * c-basic-offset: 4
12446 * indent-tabs-mode: t
12447 * End:
12448 *
edf815fd 12449 * vim: shiftwidth=4:
241d1a3b 12450*/