This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
more on #18312: sv.c:ss_dup()
[perl5.git] / sv.c
CommitLineData
a0d0e21e 1/* sv.c
79072805 2 *
eb1102fc 3 * Copyright (c) 1991-2002, Larry Wall
79072805
LW
4 *
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
7 *
a0d0e21e 8 * "I wonder what the Entish is for 'yes' and 'no'," he thought.
645c22ef
DM
9 *
10 *
5e045b90
AMS
11 * This file contains the code that creates, manipulates and destroys
12 * scalar values (SVs). The other types (AV, HV, GV, etc.) reuse the
13 * structure of an SV, so their creation and destruction is handled
14 * here; higher-level functions are in av.c, hv.c, and so on. Opcode
15 * level functions (eg. substr, split, join) for each of the types are
16 * in the pp*.c files.
79072805
LW
17 */
18
19#include "EXTERN.h"
864dbfa3 20#define PERL_IN_SV_C
79072805 21#include "perl.h"
d2f185dc 22#include "regcomp.h"
79072805 23
51371543 24#define FCALL *f
2c5424a7 25
765f542d
NC
26#ifdef PERL_COPY_ON_WRITE
27#define SV_COW_NEXT_SV(sv) INT2PTR(SV *,SvUVX(sv))
a29f6d03 28#define SV_COW_NEXT_SV_SET(current,next) SvUVX(current) = PTR2UV(next)
b5ccf5f2 29/* This is a pessimistic view. Scalar must be purely a read-write PV to copy-
765f542d 30 on-write. */
e419cbc5
NC
31#define CAN_COW_MASK (SVs_OBJECT|SVs_GMG|SVs_SMG|SVs_RMG|SVf_IOK|SVf_NOK| \
32 SVf_POK|SVf_ROK|SVp_IOK|SVp_NOK|SVp_POK|SVf_FAKE| \
33 SVf_OOK|SVf_BREAK|SVf_READONLY|SVf_AMAGIC)
765f542d
NC
34#define CAN_COW_FLAGS (SVp_POK|SVf_POK)
35#endif
645c22ef
DM
36
37/* ============================================================================
38
39=head1 Allocation and deallocation of SVs.
40
5e045b90
AMS
41An SV (or AV, HV, etc.) is allocated in two parts: the head (struct sv,
42av, hv...) contains type and reference count information, as well as a
43pointer to the body (struct xrv, xpv, xpviv...), which contains fields
44specific to each type.
45
46Normally, this allocation is done using arenas, which are approximately
471K chunks of memory parcelled up into N heads or bodies. The first slot
48in each arena is reserved, and is used to hold a link to the next arena.
49In the case of heads, the unused first slot also contains some flags and
50a note of the number of slots. Snaked through each arena chain is a
51linked list of free items; when this becomes empty, an extra arena is
52allocated and divided up into N items which are threaded into the free
53list.
645c22ef
DM
54
55The following global variables are associated with arenas:
56
57 PL_sv_arenaroot pointer to list of SV arenas
58 PL_sv_root pointer to list of free SV structures
59
60 PL_foo_arenaroot pointer to list of foo arenas,
61 PL_foo_root pointer to list of free foo bodies
62 ... for foo in xiv, xnv, xrv, xpv etc.
63
64Note that some of the larger and more rarely used body types (eg xpvio)
65are not allocated using arenas, but are instead just malloc()/free()ed as
66required. Also, if PURIFY is defined, arenas are abandoned altogether,
67with all items individually malloc()ed. In addition, a few SV heads are
68not allocated from an arena, but are instead directly created as static
69or auto variables, eg PL_sv_undef.
70
71The SV arena serves the secondary purpose of allowing still-live SVs
72to be located and destroyed during final cleanup.
73
74At the lowest level, the macros new_SV() and del_SV() grab and free
75an SV head. (If debugging with -DD, del_SV() calls the function S_del_sv()
76to return the SV to the free list with error checking.) new_SV() calls
77more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
78SVs in the free list have their SvTYPE field set to all ones.
79
80Similarly, there are macros new_XIV()/del_XIV(), new_XNV()/del_XNV() etc
81that allocate and return individual body types. Normally these are mapped
ff276b08
RG
82to the arena-manipulating functions new_xiv()/del_xiv() etc, but may be
83instead mapped directly to malloc()/free() if PURIFY is defined. The
645c22ef
DM
84new/del functions remove from, or add to, the appropriate PL_foo_root
85list, and call more_xiv() etc to add a new arena if the list is empty.
86
ff276b08 87At the time of very final cleanup, sv_free_arenas() is called from
645c22ef
DM
88perl_destruct() to physically free all the arenas allocated since the
89start of the interpreter. Note that this also clears PL_he_arenaroot,
90which is otherwise dealt with in hv.c.
91
92Manipulation of any of the PL_*root pointers is protected by enclosing
93LOCK_SV_MUTEX; ... UNLOCK_SV_MUTEX calls which should Do the Right Thing
94if threads are enabled.
95
96The function visit() scans the SV arenas list, and calls a specified
97function for each SV it finds which is still live - ie which has an SvTYPE
98other than all 1's, and a non-zero SvREFCNT. visit() is used by the
99following functions (specified as [function that calls visit()] / [function
100called by visit() for each SV]):
101
102 sv_report_used() / do_report_used()
103 dump all remaining SVs (debugging aid)
104
105 sv_clean_objs() / do_clean_objs(),do_clean_named_objs()
106 Attempt to free all objects pointed to by RVs,
107 and, unless DISABLE_DESTRUCTOR_KLUDGE is defined,
108 try to do the same for all objects indirectly
109 referenced by typeglobs too. Called once from
110 perl_destruct(), prior to calling sv_clean_all()
111 below.
112
113 sv_clean_all() / do_clean_all()
114 SvREFCNT_dec(sv) each remaining SV, possibly
115 triggering an sv_free(). It also sets the
116 SVf_BREAK flag on the SV to indicate that the
117 refcnt has been artificially lowered, and thus
118 stopping sv_free() from giving spurious warnings
119 about SVs which unexpectedly have a refcnt
120 of zero. called repeatedly from perl_destruct()
121 until there are no SVs left.
122
123=head2 Summary
124
125Private API to rest of sv.c
126
127 new_SV(), del_SV(),
128
129 new_XIV(), del_XIV(),
130 new_XNV(), del_XNV(),
131 etc
132
133Public API:
134
8cf8f3d1 135 sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
645c22ef
DM
136
137
138=cut
139
140============================================================================ */
141
142
51371543 143
4561caa4
CS
144/*
145 * "A time to plant, and a time to uproot what was planted..."
146 */
147
053fc874
GS
148#define plant_SV(p) \
149 STMT_START { \
150 SvANY(p) = (void *)PL_sv_root; \
151 SvFLAGS(p) = SVTYPEMASK; \
152 PL_sv_root = (p); \
153 --PL_sv_count; \
154 } STMT_END
a0d0e21e 155
fba3b22e 156/* sv_mutex must be held while calling uproot_SV() */
053fc874
GS
157#define uproot_SV(p) \
158 STMT_START { \
159 (p) = PL_sv_root; \
160 PL_sv_root = (SV*)SvANY(p); \
161 ++PL_sv_count; \
162 } STMT_END
163
645c22ef
DM
164
165/* new_SV(): return a new, empty SV head */
166
eba0f806
DM
167#ifdef DEBUG_LEAKING_SCALARS
168/* provide a real function for a debugger to play with */
169STATIC SV*
170S_new_SV(pTHX)
171{
172 SV* sv;
173
174 LOCK_SV_MUTEX;
175 if (PL_sv_root)
176 uproot_SV(sv);
177 else
178 sv = more_sv();
179 UNLOCK_SV_MUTEX;
180 SvANY(sv) = 0;
181 SvREFCNT(sv) = 1;
182 SvFLAGS(sv) = 0;
183 return sv;
184}
185# define new_SV(p) (p)=S_new_SV(aTHX)
186
187#else
188# define new_SV(p) \
053fc874
GS
189 STMT_START { \
190 LOCK_SV_MUTEX; \
191 if (PL_sv_root) \
192 uproot_SV(p); \
193 else \
194 (p) = more_sv(); \
195 UNLOCK_SV_MUTEX; \
196 SvANY(p) = 0; \
197 SvREFCNT(p) = 1; \
198 SvFLAGS(p) = 0; \
199 } STMT_END
eba0f806 200#endif
463ee0b2 201
645c22ef
DM
202
203/* del_SV(): return an empty SV head to the free list */
204
a0d0e21e 205#ifdef DEBUGGING
4561caa4 206
053fc874
GS
207#define del_SV(p) \
208 STMT_START { \
209 LOCK_SV_MUTEX; \
aea4f609 210 if (DEBUG_D_TEST) \
053fc874
GS
211 del_sv(p); \
212 else \
213 plant_SV(p); \
214 UNLOCK_SV_MUTEX; \
215 } STMT_END
a0d0e21e 216
76e3520e 217STATIC void
cea2e8a9 218S_del_sv(pTHX_ SV *p)
463ee0b2 219{
aea4f609 220 if (DEBUG_D_TEST) {
4633a7c4 221 SV* sva;
a0d0e21e
LW
222 SV* sv;
223 SV* svend;
224 int ok = 0;
3280af22 225 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
4633a7c4
LW
226 sv = sva + 1;
227 svend = &sva[SvREFCNT(sva)];
a0d0e21e
LW
228 if (p >= sv && p < svend)
229 ok = 1;
230 }
231 if (!ok) {
0453d815 232 if (ckWARN_d(WARN_INTERNAL))
9014280d 233 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
1d7c1841
GS
234 "Attempt to free non-arena SV: 0x%"UVxf,
235 PTR2UV(p));
a0d0e21e
LW
236 return;
237 }
238 }
4561caa4 239 plant_SV(p);
463ee0b2 240}
a0d0e21e 241
4561caa4
CS
242#else /* ! DEBUGGING */
243
244#define del_SV(p) plant_SV(p)
245
246#endif /* DEBUGGING */
463ee0b2 247
645c22ef
DM
248
249/*
ccfc67b7
JH
250=head1 SV Manipulation Functions
251
645c22ef
DM
252=for apidoc sv_add_arena
253
254Given a chunk of memory, link it to the head of the list of arenas,
255and split it into a list of free SVs.
256
257=cut
258*/
259
4633a7c4 260void
864dbfa3 261Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
463ee0b2 262{
4633a7c4 263 SV* sva = (SV*)ptr;
463ee0b2
LW
264 register SV* sv;
265 register SV* svend;
14dd3ad8 266 Zero(ptr, size, char);
4633a7c4
LW
267
268 /* The first SV in an arena isn't an SV. */
3280af22 269 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
270 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
271 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
272
3280af22
NIS
273 PL_sv_arenaroot = sva;
274 PL_sv_root = sva + 1;
4633a7c4
LW
275
276 svend = &sva[SvREFCNT(sva) - 1];
277 sv = sva + 1;
463ee0b2 278 while (sv < svend) {
a0d0e21e 279 SvANY(sv) = (void *)(SV*)(sv + 1);
8990e307 280 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
281 sv++;
282 }
283 SvANY(sv) = 0;
4633a7c4
LW
284 SvFLAGS(sv) = SVTYPEMASK;
285}
286
645c22ef
DM
287/* make some more SVs by adding another arena */
288
fba3b22e 289/* sv_mutex must be held while calling more_sv() */
76e3520e 290STATIC SV*
cea2e8a9 291S_more_sv(pTHX)
4633a7c4 292{
4561caa4
CS
293 register SV* sv;
294
3280af22
NIS
295 if (PL_nice_chunk) {
296 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
297 PL_nice_chunk = Nullch;
30ad99e7 298 PL_nice_chunk_size = 0;
c07a80fd 299 }
1edc1566 300 else {
301 char *chunk; /* must use New here to match call to */
302 New(704,chunk,1008,char); /* Safefree() in sv_free_arenas() */
303 sv_add_arena(chunk, 1008, 0);
304 }
4561caa4
CS
305 uproot_SV(sv);
306 return sv;
463ee0b2
LW
307}
308
ff276b08 309/* visit(): call the named function for each non-free SV in the arenas. */
645c22ef 310
5226ed68 311STATIC I32
cea2e8a9 312S_visit(pTHX_ SVFUNC_t f)
8990e307 313{
4633a7c4 314 SV* sva;
8990e307
LW
315 SV* sv;
316 register SV* svend;
5226ed68 317 I32 visited = 0;
8990e307 318
3280af22 319 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
4633a7c4 320 svend = &sva[SvREFCNT(sva)];
4561caa4 321 for (sv = sva + 1; sv < svend; ++sv) {
f25c30a3 322 if (SvTYPE(sv) != SVTYPEMASK && SvREFCNT(sv)) {
acfe0abc 323 (FCALL)(aTHX_ sv);
5226ed68
JH
324 ++visited;
325 }
8990e307
LW
326 }
327 }
5226ed68 328 return visited;
8990e307
LW
329}
330
758a08c3
JH
331#ifdef DEBUGGING
332
645c22ef
DM
333/* called by sv_report_used() for each live SV */
334
335static void
acfe0abc 336do_report_used(pTHX_ SV *sv)
645c22ef
DM
337{
338 if (SvTYPE(sv) != SVTYPEMASK) {
339 PerlIO_printf(Perl_debug_log, "****\n");
340 sv_dump(sv);
341 }
342}
758a08c3 343#endif
645c22ef
DM
344
345/*
346=for apidoc sv_report_used
347
348Dump the contents of all SVs not yet freed. (Debugging aid).
349
350=cut
351*/
352
8990e307 353void
864dbfa3 354Perl_sv_report_used(pTHX)
4561caa4 355{
ff270d3a 356#ifdef DEBUGGING
0b94c7bb 357 visit(do_report_used);
ff270d3a 358#endif
4561caa4
CS
359}
360
645c22ef
DM
361/* called by sv_clean_objs() for each live SV */
362
363static void
acfe0abc 364do_clean_objs(pTHX_ SV *sv)
645c22ef
DM
365{
366 SV* rv;
367
368 if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
369 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv)));
370 if (SvWEAKREF(sv)) {
371 sv_del_backref(sv);
372 SvWEAKREF_off(sv);
373 SvRV(sv) = 0;
374 } else {
375 SvROK_off(sv);
376 SvRV(sv) = 0;
377 SvREFCNT_dec(rv);
378 }
379 }
380
381 /* XXX Might want to check arrays, etc. */
382}
383
384/* called by sv_clean_objs() for each live SV */
385
386#ifndef DISABLE_DESTRUCTOR_KLUDGE
387static void
acfe0abc 388do_clean_named_objs(pTHX_ SV *sv)
645c22ef
DM
389{
390 if (SvTYPE(sv) == SVt_PVGV && GvGP(sv)) {
391 if ( SvOBJECT(GvSV(sv)) ||
392 (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
393 (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
394 (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
395 (GvCV(sv) && SvOBJECT(GvCV(sv))) )
396 {
397 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
398 SvREFCNT_dec(sv);
399 }
400 }
401}
402#endif
403
404/*
405=for apidoc sv_clean_objs
406
407Attempt to destroy all objects not yet freed
408
409=cut
410*/
411
4561caa4 412void
864dbfa3 413Perl_sv_clean_objs(pTHX)
4561caa4 414{
3280af22 415 PL_in_clean_objs = TRUE;
0b94c7bb 416 visit(do_clean_objs);
4561caa4 417#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 418 /* some barnacles may yet remain, clinging to typeglobs */
0b94c7bb 419 visit(do_clean_named_objs);
4561caa4 420#endif
3280af22 421 PL_in_clean_objs = FALSE;
4561caa4
CS
422}
423
645c22ef
DM
424/* called by sv_clean_all() for each live SV */
425
426static void
acfe0abc 427do_clean_all(pTHX_ SV *sv)
645c22ef
DM
428{
429 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
430 SvFLAGS(sv) |= SVf_BREAK;
431 SvREFCNT_dec(sv);
432}
433
434/*
435=for apidoc sv_clean_all
436
437Decrement the refcnt of each remaining SV, possibly triggering a
438cleanup. This function may have to be called multiple times to free
ff276b08 439SVs which are in complex self-referential hierarchies.
645c22ef
DM
440
441=cut
442*/
443
5226ed68 444I32
864dbfa3 445Perl_sv_clean_all(pTHX)
8990e307 446{
5226ed68 447 I32 cleaned;
3280af22 448 PL_in_clean_all = TRUE;
5226ed68 449 cleaned = visit(do_clean_all);
3280af22 450 PL_in_clean_all = FALSE;
5226ed68 451 return cleaned;
8990e307 452}
463ee0b2 453
645c22ef
DM
454/*
455=for apidoc sv_free_arenas
456
457Deallocate the memory used by all arenas. Note that all the individual SV
458heads and bodies within the arenas must already have been freed.
459
460=cut
461*/
462
4633a7c4 463void
864dbfa3 464Perl_sv_free_arenas(pTHX)
4633a7c4
LW
465{
466 SV* sva;
467 SV* svanext;
612f20c3 468 XPV *arena, *arenanext;
4633a7c4
LW
469
470 /* Free arenas here, but be careful about fake ones. (We assume
471 contiguity of the fake ones with the corresponding real ones.) */
472
3280af22 473 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
474 svanext = (SV*) SvANY(sva);
475 while (svanext && SvFAKE(svanext))
476 svanext = (SV*) SvANY(svanext);
477
478 if (!SvFAKE(sva))
1edc1566 479 Safefree((void *)sva);
4633a7c4 480 }
5f05dabc 481
612f20c3
GS
482 for (arena = PL_xiv_arenaroot; arena; arena = arenanext) {
483 arenanext = (XPV*)arena->xpv_pv;
484 Safefree(arena);
485 }
486 PL_xiv_arenaroot = 0;
487
488 for (arena = PL_xnv_arenaroot; arena; arena = arenanext) {
489 arenanext = (XPV*)arena->xpv_pv;
490 Safefree(arena);
491 }
492 PL_xnv_arenaroot = 0;
493
494 for (arena = PL_xrv_arenaroot; arena; arena = arenanext) {
495 arenanext = (XPV*)arena->xpv_pv;
496 Safefree(arena);
497 }
498 PL_xrv_arenaroot = 0;
499
500 for (arena = PL_xpv_arenaroot; arena; arena = arenanext) {
501 arenanext = (XPV*)arena->xpv_pv;
502 Safefree(arena);
503 }
504 PL_xpv_arenaroot = 0;
505
506 for (arena = (XPV*)PL_xpviv_arenaroot; arena; arena = arenanext) {
507 arenanext = (XPV*)arena->xpv_pv;
508 Safefree(arena);
509 }
510 PL_xpviv_arenaroot = 0;
511
512 for (arena = (XPV*)PL_xpvnv_arenaroot; arena; arena = arenanext) {
513 arenanext = (XPV*)arena->xpv_pv;
514 Safefree(arena);
515 }
516 PL_xpvnv_arenaroot = 0;
517
518 for (arena = (XPV*)PL_xpvcv_arenaroot; arena; arena = arenanext) {
519 arenanext = (XPV*)arena->xpv_pv;
520 Safefree(arena);
521 }
522 PL_xpvcv_arenaroot = 0;
523
524 for (arena = (XPV*)PL_xpvav_arenaroot; arena; arena = arenanext) {
525 arenanext = (XPV*)arena->xpv_pv;
526 Safefree(arena);
527 }
528 PL_xpvav_arenaroot = 0;
529
530 for (arena = (XPV*)PL_xpvhv_arenaroot; arena; arena = arenanext) {
531 arenanext = (XPV*)arena->xpv_pv;
532 Safefree(arena);
533 }
534 PL_xpvhv_arenaroot = 0;
535
536 for (arena = (XPV*)PL_xpvmg_arenaroot; arena; arena = arenanext) {
537 arenanext = (XPV*)arena->xpv_pv;
538 Safefree(arena);
539 }
540 PL_xpvmg_arenaroot = 0;
541
542 for (arena = (XPV*)PL_xpvlv_arenaroot; arena; arena = arenanext) {
543 arenanext = (XPV*)arena->xpv_pv;
544 Safefree(arena);
545 }
546 PL_xpvlv_arenaroot = 0;
547
548 for (arena = (XPV*)PL_xpvbm_arenaroot; arena; arena = arenanext) {
549 arenanext = (XPV*)arena->xpv_pv;
550 Safefree(arena);
551 }
552 PL_xpvbm_arenaroot = 0;
553
554 for (arena = (XPV*)PL_he_arenaroot; arena; arena = arenanext) {
555 arenanext = (XPV*)arena->xpv_pv;
556 Safefree(arena);
557 }
558 PL_he_arenaroot = 0;
559
3280af22
NIS
560 if (PL_nice_chunk)
561 Safefree(PL_nice_chunk);
562 PL_nice_chunk = Nullch;
563 PL_nice_chunk_size = 0;
564 PL_sv_arenaroot = 0;
565 PL_sv_root = 0;
4633a7c4
LW
566}
567
645c22ef
DM
568/*
569=for apidoc report_uninit
570
571Print appropriate "Use of uninitialized variable" warning
572
573=cut
574*/
575
1d7c1841
GS
576void
577Perl_report_uninit(pTHX)
578{
579 if (PL_op)
9014280d 580 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
53e06cf0 581 " in ", OP_DESC(PL_op));
1d7c1841 582 else
9014280d 583 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit, "", "");
1d7c1841
GS
584}
585
645c22ef
DM
586/* grab a new IV body from the free list, allocating more if necessary */
587
76e3520e 588STATIC XPVIV*
cea2e8a9 589S_new_xiv(pTHX)
463ee0b2 590{
ea7c11a3 591 IV* xiv;
cbe51380
GS
592 LOCK_SV_MUTEX;
593 if (!PL_xiv_root)
594 more_xiv();
595 xiv = PL_xiv_root;
596 /*
597 * See comment in more_xiv() -- RAM.
598 */
599 PL_xiv_root = *(IV**)xiv;
600 UNLOCK_SV_MUTEX;
601 return (XPVIV*)((char*)xiv - STRUCT_OFFSET(XPVIV, xiv_iv));
463ee0b2
LW
602}
603
645c22ef
DM
604/* return an IV body to the free list */
605
76e3520e 606STATIC void
cea2e8a9 607S_del_xiv(pTHX_ XPVIV *p)
463ee0b2 608{
23e6a22f 609 IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
cbe51380 610 LOCK_SV_MUTEX;
3280af22
NIS
611 *(IV**)xiv = PL_xiv_root;
612 PL_xiv_root = xiv;
cbe51380 613 UNLOCK_SV_MUTEX;
463ee0b2
LW
614}
615
645c22ef
DM
616/* allocate another arena's worth of IV bodies */
617
cbe51380 618STATIC void
cea2e8a9 619S_more_xiv(pTHX)
463ee0b2 620{
ea7c11a3
SM
621 register IV* xiv;
622 register IV* xivend;
8c52afec
IZ
623 XPV* ptr;
624 New(705, ptr, 1008/sizeof(XPV), XPV);
645c22ef 625 ptr->xpv_pv = (char*)PL_xiv_arenaroot; /* linked list of xiv arenas */
3280af22 626 PL_xiv_arenaroot = ptr; /* to keep Purify happy */
a0d0e21e 627
ea7c11a3
SM
628 xiv = (IV*) ptr;
629 xivend = &xiv[1008 / sizeof(IV) - 1];
645c22ef 630 xiv += (sizeof(XPV) - 1) / sizeof(IV) + 1; /* fudge by size of XPV */
3280af22 631 PL_xiv_root = xiv;
463ee0b2 632 while (xiv < xivend) {
ea7c11a3 633 *(IV**)xiv = (IV *)(xiv + 1);
463ee0b2
LW
634 xiv++;
635 }
ea7c11a3 636 *(IV**)xiv = 0;
463ee0b2
LW
637}
638
645c22ef
DM
639/* grab a new NV body from the free list, allocating more if necessary */
640
76e3520e 641STATIC XPVNV*
cea2e8a9 642S_new_xnv(pTHX)
463ee0b2 643{
65202027 644 NV* xnv;
cbe51380
GS
645 LOCK_SV_MUTEX;
646 if (!PL_xnv_root)
647 more_xnv();
648 xnv = PL_xnv_root;
65202027 649 PL_xnv_root = *(NV**)xnv;
cbe51380
GS
650 UNLOCK_SV_MUTEX;
651 return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
463ee0b2
LW
652}
653
645c22ef
DM
654/* return an NV body to the free list */
655
76e3520e 656STATIC void
cea2e8a9 657S_del_xnv(pTHX_ XPVNV *p)
463ee0b2 658{
65202027 659 NV* xnv = (NV*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
cbe51380 660 LOCK_SV_MUTEX;
65202027 661 *(NV**)xnv = PL_xnv_root;
3280af22 662 PL_xnv_root = xnv;
cbe51380 663 UNLOCK_SV_MUTEX;
463ee0b2
LW
664}
665
645c22ef
DM
666/* allocate another arena's worth of NV bodies */
667
cbe51380 668STATIC void
cea2e8a9 669S_more_xnv(pTHX)
463ee0b2 670{
65202027
DS
671 register NV* xnv;
672 register NV* xnvend;
612f20c3
GS
673 XPV *ptr;
674 New(711, ptr, 1008/sizeof(XPV), XPV);
675 ptr->xpv_pv = (char*)PL_xnv_arenaroot;
676 PL_xnv_arenaroot = ptr;
677
678 xnv = (NV*) ptr;
65202027
DS
679 xnvend = &xnv[1008 / sizeof(NV) - 1];
680 xnv += (sizeof(XPVIV) - 1) / sizeof(NV) + 1; /* fudge by sizeof XPVIV */
3280af22 681 PL_xnv_root = xnv;
463ee0b2 682 while (xnv < xnvend) {
65202027 683 *(NV**)xnv = (NV*)(xnv + 1);
463ee0b2
LW
684 xnv++;
685 }
65202027 686 *(NV**)xnv = 0;
463ee0b2
LW
687}
688
645c22ef
DM
689/* grab a new struct xrv from the free list, allocating more if necessary */
690
76e3520e 691STATIC XRV*
cea2e8a9 692S_new_xrv(pTHX)
ed6116ce
LW
693{
694 XRV* xrv;
cbe51380
GS
695 LOCK_SV_MUTEX;
696 if (!PL_xrv_root)
697 more_xrv();
698 xrv = PL_xrv_root;
699 PL_xrv_root = (XRV*)xrv->xrv_rv;
700 UNLOCK_SV_MUTEX;
701 return xrv;
ed6116ce
LW
702}
703
645c22ef
DM
704/* return a struct xrv to the free list */
705
76e3520e 706STATIC void
cea2e8a9 707S_del_xrv(pTHX_ XRV *p)
ed6116ce 708{
cbe51380 709 LOCK_SV_MUTEX;
3280af22
NIS
710 p->xrv_rv = (SV*)PL_xrv_root;
711 PL_xrv_root = p;
cbe51380 712 UNLOCK_SV_MUTEX;
ed6116ce
LW
713}
714
645c22ef
DM
715/* allocate another arena's worth of struct xrv */
716
cbe51380 717STATIC void
cea2e8a9 718S_more_xrv(pTHX)
ed6116ce 719{
ed6116ce
LW
720 register XRV* xrv;
721 register XRV* xrvend;
612f20c3
GS
722 XPV *ptr;
723 New(712, ptr, 1008/sizeof(XPV), XPV);
724 ptr->xpv_pv = (char*)PL_xrv_arenaroot;
725 PL_xrv_arenaroot = ptr;
726
727 xrv = (XRV*) ptr;
ed6116ce 728 xrvend = &xrv[1008 / sizeof(XRV) - 1];
612f20c3
GS
729 xrv += (sizeof(XPV) - 1) / sizeof(XRV) + 1;
730 PL_xrv_root = xrv;
ed6116ce
LW
731 while (xrv < xrvend) {
732 xrv->xrv_rv = (SV*)(xrv + 1);
733 xrv++;
734 }
735 xrv->xrv_rv = 0;
ed6116ce
LW
736}
737
645c22ef
DM
738/* grab a new struct xpv from the free list, allocating more if necessary */
739
76e3520e 740STATIC XPV*
cea2e8a9 741S_new_xpv(pTHX)
463ee0b2
LW
742{
743 XPV* xpv;
cbe51380
GS
744 LOCK_SV_MUTEX;
745 if (!PL_xpv_root)
746 more_xpv();
747 xpv = PL_xpv_root;
748 PL_xpv_root = (XPV*)xpv->xpv_pv;
749 UNLOCK_SV_MUTEX;
750 return xpv;
463ee0b2
LW
751}
752
645c22ef
DM
753/* return a struct xpv to the free list */
754
76e3520e 755STATIC void
cea2e8a9 756S_del_xpv(pTHX_ XPV *p)
463ee0b2 757{
cbe51380 758 LOCK_SV_MUTEX;
3280af22
NIS
759 p->xpv_pv = (char*)PL_xpv_root;
760 PL_xpv_root = p;
cbe51380 761 UNLOCK_SV_MUTEX;
463ee0b2
LW
762}
763
645c22ef
DM
764/* allocate another arena's worth of struct xpv */
765
cbe51380 766STATIC void
cea2e8a9 767S_more_xpv(pTHX)
463ee0b2 768{
463ee0b2
LW
769 register XPV* xpv;
770 register XPV* xpvend;
612f20c3
GS
771 New(713, xpv, 1008/sizeof(XPV), XPV);
772 xpv->xpv_pv = (char*)PL_xpv_arenaroot;
773 PL_xpv_arenaroot = xpv;
774
463ee0b2 775 xpvend = &xpv[1008 / sizeof(XPV) - 1];
612f20c3 776 PL_xpv_root = ++xpv;
463ee0b2
LW
777 while (xpv < xpvend) {
778 xpv->xpv_pv = (char*)(xpv + 1);
779 xpv++;
780 }
781 xpv->xpv_pv = 0;
463ee0b2
LW
782}
783
645c22ef
DM
784/* grab a new struct xpviv from the free list, allocating more if necessary */
785
932e9ff9
VB
786STATIC XPVIV*
787S_new_xpviv(pTHX)
788{
789 XPVIV* xpviv;
790 LOCK_SV_MUTEX;
791 if (!PL_xpviv_root)
792 more_xpviv();
793 xpviv = PL_xpviv_root;
794 PL_xpviv_root = (XPVIV*)xpviv->xpv_pv;
795 UNLOCK_SV_MUTEX;
796 return xpviv;
797}
798
645c22ef
DM
799/* return a struct xpviv to the free list */
800
932e9ff9
VB
801STATIC void
802S_del_xpviv(pTHX_ XPVIV *p)
803{
804 LOCK_SV_MUTEX;
805 p->xpv_pv = (char*)PL_xpviv_root;
806 PL_xpviv_root = p;
807 UNLOCK_SV_MUTEX;
808}
809
645c22ef
DM
810/* allocate another arena's worth of struct xpviv */
811
932e9ff9
VB
812STATIC void
813S_more_xpviv(pTHX)
814{
815 register XPVIV* xpviv;
816 register XPVIV* xpvivend;
612f20c3
GS
817 New(714, xpviv, 1008/sizeof(XPVIV), XPVIV);
818 xpviv->xpv_pv = (char*)PL_xpviv_arenaroot;
819 PL_xpviv_arenaroot = xpviv;
820
932e9ff9 821 xpvivend = &xpviv[1008 / sizeof(XPVIV) - 1];
612f20c3 822 PL_xpviv_root = ++xpviv;
932e9ff9
VB
823 while (xpviv < xpvivend) {
824 xpviv->xpv_pv = (char*)(xpviv + 1);
825 xpviv++;
826 }
827 xpviv->xpv_pv = 0;
828}
829
645c22ef
DM
830/* grab a new struct xpvnv from the free list, allocating more if necessary */
831
932e9ff9
VB
832STATIC XPVNV*
833S_new_xpvnv(pTHX)
834{
835 XPVNV* xpvnv;
836 LOCK_SV_MUTEX;
837 if (!PL_xpvnv_root)
838 more_xpvnv();
839 xpvnv = PL_xpvnv_root;
840 PL_xpvnv_root = (XPVNV*)xpvnv->xpv_pv;
841 UNLOCK_SV_MUTEX;
842 return xpvnv;
843}
844
645c22ef
DM
845/* return a struct xpvnv to the free list */
846
932e9ff9
VB
847STATIC void
848S_del_xpvnv(pTHX_ XPVNV *p)
849{
850 LOCK_SV_MUTEX;
851 p->xpv_pv = (char*)PL_xpvnv_root;
852 PL_xpvnv_root = p;
853 UNLOCK_SV_MUTEX;
854}
855
645c22ef
DM
856/* allocate another arena's worth of struct xpvnv */
857
932e9ff9
VB
858STATIC void
859S_more_xpvnv(pTHX)
860{
861 register XPVNV* xpvnv;
862 register XPVNV* xpvnvend;
612f20c3
GS
863 New(715, xpvnv, 1008/sizeof(XPVNV), XPVNV);
864 xpvnv->xpv_pv = (char*)PL_xpvnv_arenaroot;
865 PL_xpvnv_arenaroot = xpvnv;
866
932e9ff9 867 xpvnvend = &xpvnv[1008 / sizeof(XPVNV) - 1];
612f20c3 868 PL_xpvnv_root = ++xpvnv;
932e9ff9
VB
869 while (xpvnv < xpvnvend) {
870 xpvnv->xpv_pv = (char*)(xpvnv + 1);
871 xpvnv++;
872 }
873 xpvnv->xpv_pv = 0;
874}
875
645c22ef
DM
876/* grab a new struct xpvcv from the free list, allocating more if necessary */
877
932e9ff9
VB
878STATIC XPVCV*
879S_new_xpvcv(pTHX)
880{
881 XPVCV* xpvcv;
882 LOCK_SV_MUTEX;
883 if (!PL_xpvcv_root)
884 more_xpvcv();
885 xpvcv = PL_xpvcv_root;
886 PL_xpvcv_root = (XPVCV*)xpvcv->xpv_pv;
887 UNLOCK_SV_MUTEX;
888 return xpvcv;
889}
890
645c22ef
DM
891/* return a struct xpvcv to the free list */
892
932e9ff9
VB
893STATIC void
894S_del_xpvcv(pTHX_ XPVCV *p)
895{
896 LOCK_SV_MUTEX;
897 p->xpv_pv = (char*)PL_xpvcv_root;
898 PL_xpvcv_root = p;
899 UNLOCK_SV_MUTEX;
900}
901
645c22ef
DM
902/* allocate another arena's worth of struct xpvcv */
903
932e9ff9
VB
904STATIC void
905S_more_xpvcv(pTHX)
906{
907 register XPVCV* xpvcv;
908 register XPVCV* xpvcvend;
612f20c3
GS
909 New(716, xpvcv, 1008/sizeof(XPVCV), XPVCV);
910 xpvcv->xpv_pv = (char*)PL_xpvcv_arenaroot;
911 PL_xpvcv_arenaroot = xpvcv;
912
932e9ff9 913 xpvcvend = &xpvcv[1008 / sizeof(XPVCV) - 1];
612f20c3 914 PL_xpvcv_root = ++xpvcv;
932e9ff9
VB
915 while (xpvcv < xpvcvend) {
916 xpvcv->xpv_pv = (char*)(xpvcv + 1);
917 xpvcv++;
918 }
919 xpvcv->xpv_pv = 0;
920}
921
645c22ef
DM
922/* grab a new struct xpvav from the free list, allocating more if necessary */
923
932e9ff9
VB
924STATIC XPVAV*
925S_new_xpvav(pTHX)
926{
927 XPVAV* xpvav;
928 LOCK_SV_MUTEX;
929 if (!PL_xpvav_root)
930 more_xpvav();
931 xpvav = PL_xpvav_root;
932 PL_xpvav_root = (XPVAV*)xpvav->xav_array;
933 UNLOCK_SV_MUTEX;
934 return xpvav;
935}
936
645c22ef
DM
937/* return a struct xpvav to the free list */
938
932e9ff9
VB
939STATIC void
940S_del_xpvav(pTHX_ XPVAV *p)
941{
942 LOCK_SV_MUTEX;
943 p->xav_array = (char*)PL_xpvav_root;
944 PL_xpvav_root = p;
945 UNLOCK_SV_MUTEX;
946}
947
645c22ef
DM
948/* allocate another arena's worth of struct xpvav */
949
932e9ff9
VB
950STATIC void
951S_more_xpvav(pTHX)
952{
953 register XPVAV* xpvav;
954 register XPVAV* xpvavend;
612f20c3
GS
955 New(717, xpvav, 1008/sizeof(XPVAV), XPVAV);
956 xpvav->xav_array = (char*)PL_xpvav_arenaroot;
957 PL_xpvav_arenaroot = xpvav;
958
932e9ff9 959 xpvavend = &xpvav[1008 / sizeof(XPVAV) - 1];
612f20c3 960 PL_xpvav_root = ++xpvav;
932e9ff9
VB
961 while (xpvav < xpvavend) {
962 xpvav->xav_array = (char*)(xpvav + 1);
963 xpvav++;
964 }
965 xpvav->xav_array = 0;
966}
967
645c22ef
DM
968/* grab a new struct xpvhv from the free list, allocating more if necessary */
969
932e9ff9
VB
970STATIC XPVHV*
971S_new_xpvhv(pTHX)
972{
973 XPVHV* xpvhv;
974 LOCK_SV_MUTEX;
975 if (!PL_xpvhv_root)
976 more_xpvhv();
977 xpvhv = PL_xpvhv_root;
978 PL_xpvhv_root = (XPVHV*)xpvhv->xhv_array;
979 UNLOCK_SV_MUTEX;
980 return xpvhv;
981}
982
645c22ef
DM
983/* return a struct xpvhv to the free list */
984
932e9ff9
VB
985STATIC void
986S_del_xpvhv(pTHX_ XPVHV *p)
987{
988 LOCK_SV_MUTEX;
989 p->xhv_array = (char*)PL_xpvhv_root;
990 PL_xpvhv_root = p;
991 UNLOCK_SV_MUTEX;
992}
993
645c22ef
DM
994/* allocate another arena's worth of struct xpvhv */
995
932e9ff9
VB
996STATIC void
997S_more_xpvhv(pTHX)
998{
999 register XPVHV* xpvhv;
1000 register XPVHV* xpvhvend;
612f20c3
GS
1001 New(718, xpvhv, 1008/sizeof(XPVHV), XPVHV);
1002 xpvhv->xhv_array = (char*)PL_xpvhv_arenaroot;
1003 PL_xpvhv_arenaroot = xpvhv;
1004
932e9ff9 1005 xpvhvend = &xpvhv[1008 / sizeof(XPVHV) - 1];
612f20c3 1006 PL_xpvhv_root = ++xpvhv;
932e9ff9
VB
1007 while (xpvhv < xpvhvend) {
1008 xpvhv->xhv_array = (char*)(xpvhv + 1);
1009 xpvhv++;
1010 }
1011 xpvhv->xhv_array = 0;
1012}
1013
645c22ef
DM
1014/* grab a new struct xpvmg from the free list, allocating more if necessary */
1015
932e9ff9
VB
1016STATIC XPVMG*
1017S_new_xpvmg(pTHX)
1018{
1019 XPVMG* xpvmg;
1020 LOCK_SV_MUTEX;
1021 if (!PL_xpvmg_root)
1022 more_xpvmg();
1023 xpvmg = PL_xpvmg_root;
1024 PL_xpvmg_root = (XPVMG*)xpvmg->xpv_pv;
1025 UNLOCK_SV_MUTEX;
1026 return xpvmg;
1027}
1028
645c22ef
DM
1029/* return a struct xpvmg to the free list */
1030
932e9ff9
VB
1031STATIC void
1032S_del_xpvmg(pTHX_ XPVMG *p)
1033{
1034 LOCK_SV_MUTEX;
1035 p->xpv_pv = (char*)PL_xpvmg_root;
1036 PL_xpvmg_root = p;
1037 UNLOCK_SV_MUTEX;
1038}
1039
645c22ef
DM
1040/* allocate another arena's worth of struct xpvmg */
1041
932e9ff9
VB
1042STATIC void
1043S_more_xpvmg(pTHX)
1044{
1045 register XPVMG* xpvmg;
1046 register XPVMG* xpvmgend;
612f20c3
GS
1047 New(719, xpvmg, 1008/sizeof(XPVMG), XPVMG);
1048 xpvmg->xpv_pv = (char*)PL_xpvmg_arenaroot;
1049 PL_xpvmg_arenaroot = xpvmg;
1050
932e9ff9 1051 xpvmgend = &xpvmg[1008 / sizeof(XPVMG) - 1];
612f20c3 1052 PL_xpvmg_root = ++xpvmg;
932e9ff9
VB
1053 while (xpvmg < xpvmgend) {
1054 xpvmg->xpv_pv = (char*)(xpvmg + 1);
1055 xpvmg++;
1056 }
1057 xpvmg->xpv_pv = 0;
1058}
1059
645c22ef
DM
1060/* grab a new struct xpvlv from the free list, allocating more if necessary */
1061
932e9ff9
VB
1062STATIC XPVLV*
1063S_new_xpvlv(pTHX)
1064{
1065 XPVLV* xpvlv;
1066 LOCK_SV_MUTEX;
1067 if (!PL_xpvlv_root)
1068 more_xpvlv();
1069 xpvlv = PL_xpvlv_root;
1070 PL_xpvlv_root = (XPVLV*)xpvlv->xpv_pv;
1071 UNLOCK_SV_MUTEX;
1072 return xpvlv;
1073}
1074
645c22ef
DM
1075/* return a struct xpvlv to the free list */
1076
932e9ff9
VB
1077STATIC void
1078S_del_xpvlv(pTHX_ XPVLV *p)
1079{
1080 LOCK_SV_MUTEX;
1081 p->xpv_pv = (char*)PL_xpvlv_root;
1082 PL_xpvlv_root = p;
1083 UNLOCK_SV_MUTEX;
1084}
1085
645c22ef
DM
1086/* allocate another arena's worth of struct xpvlv */
1087
932e9ff9
VB
1088STATIC void
1089S_more_xpvlv(pTHX)
1090{
1091 register XPVLV* xpvlv;
1092 register XPVLV* xpvlvend;
612f20c3
GS
1093 New(720, xpvlv, 1008/sizeof(XPVLV), XPVLV);
1094 xpvlv->xpv_pv = (char*)PL_xpvlv_arenaroot;
1095 PL_xpvlv_arenaroot = xpvlv;
1096
932e9ff9 1097 xpvlvend = &xpvlv[1008 / sizeof(XPVLV) - 1];
612f20c3 1098 PL_xpvlv_root = ++xpvlv;
932e9ff9
VB
1099 while (xpvlv < xpvlvend) {
1100 xpvlv->xpv_pv = (char*)(xpvlv + 1);
1101 xpvlv++;
1102 }
1103 xpvlv->xpv_pv = 0;
1104}
1105
645c22ef
DM
1106/* grab a new struct xpvbm from the free list, allocating more if necessary */
1107
932e9ff9
VB
1108STATIC XPVBM*
1109S_new_xpvbm(pTHX)
1110{
1111 XPVBM* xpvbm;
1112 LOCK_SV_MUTEX;
1113 if (!PL_xpvbm_root)
1114 more_xpvbm();
1115 xpvbm = PL_xpvbm_root;
1116 PL_xpvbm_root = (XPVBM*)xpvbm->xpv_pv;
1117 UNLOCK_SV_MUTEX;
1118 return xpvbm;
1119}
1120
645c22ef
DM
1121/* return a struct xpvbm to the free list */
1122
932e9ff9
VB
1123STATIC void
1124S_del_xpvbm(pTHX_ XPVBM *p)
1125{
1126 LOCK_SV_MUTEX;
1127 p->xpv_pv = (char*)PL_xpvbm_root;
1128 PL_xpvbm_root = p;
1129 UNLOCK_SV_MUTEX;
1130}
1131
645c22ef
DM
1132/* allocate another arena's worth of struct xpvbm */
1133
932e9ff9
VB
1134STATIC void
1135S_more_xpvbm(pTHX)
1136{
1137 register XPVBM* xpvbm;
1138 register XPVBM* xpvbmend;
612f20c3
GS
1139 New(721, xpvbm, 1008/sizeof(XPVBM), XPVBM);
1140 xpvbm->xpv_pv = (char*)PL_xpvbm_arenaroot;
1141 PL_xpvbm_arenaroot = xpvbm;
1142
932e9ff9 1143 xpvbmend = &xpvbm[1008 / sizeof(XPVBM) - 1];
612f20c3 1144 PL_xpvbm_root = ++xpvbm;
932e9ff9
VB
1145 while (xpvbm < xpvbmend) {
1146 xpvbm->xpv_pv = (char*)(xpvbm + 1);
1147 xpvbm++;
1148 }
1149 xpvbm->xpv_pv = 0;
1150}
1151
7bab3ede
MB
1152#define my_safemalloc(s) (void*)safemalloc(s)
1153#define my_safefree(p) safefree((char*)p)
463ee0b2 1154
d33b2eba 1155#ifdef PURIFY
463ee0b2 1156
d33b2eba
GS
1157#define new_XIV() my_safemalloc(sizeof(XPVIV))
1158#define del_XIV(p) my_safefree(p)
ed6116ce 1159
d33b2eba
GS
1160#define new_XNV() my_safemalloc(sizeof(XPVNV))
1161#define del_XNV(p) my_safefree(p)
463ee0b2 1162
d33b2eba
GS
1163#define new_XRV() my_safemalloc(sizeof(XRV))
1164#define del_XRV(p) my_safefree(p)
8c52afec 1165
d33b2eba
GS
1166#define new_XPV() my_safemalloc(sizeof(XPV))
1167#define del_XPV(p) my_safefree(p)
9b94d1dd 1168
d33b2eba
GS
1169#define new_XPVIV() my_safemalloc(sizeof(XPVIV))
1170#define del_XPVIV(p) my_safefree(p)
932e9ff9 1171
d33b2eba
GS
1172#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
1173#define del_XPVNV(p) my_safefree(p)
932e9ff9 1174
d33b2eba
GS
1175#define new_XPVCV() my_safemalloc(sizeof(XPVCV))
1176#define del_XPVCV(p) my_safefree(p)
932e9ff9 1177
d33b2eba
GS
1178#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
1179#define del_XPVAV(p) my_safefree(p)
1180
1181#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
1182#define del_XPVHV(p) my_safefree(p)
1c846c1f 1183
d33b2eba
GS
1184#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
1185#define del_XPVMG(p) my_safefree(p)
1186
1187#define new_XPVLV() my_safemalloc(sizeof(XPVLV))
1188#define del_XPVLV(p) my_safefree(p)
1189
1190#define new_XPVBM() my_safemalloc(sizeof(XPVBM))
1191#define del_XPVBM(p) my_safefree(p)
1192
1193#else /* !PURIFY */
1194
1195#define new_XIV() (void*)new_xiv()
1196#define del_XIV(p) del_xiv((XPVIV*) p)
1197
1198#define new_XNV() (void*)new_xnv()
1199#define del_XNV(p) del_xnv((XPVNV*) p)
9b94d1dd 1200
d33b2eba
GS
1201#define new_XRV() (void*)new_xrv()
1202#define del_XRV(p) del_xrv((XRV*) p)
9b94d1dd 1203
d33b2eba
GS
1204#define new_XPV() (void*)new_xpv()
1205#define del_XPV(p) del_xpv((XPV *)p)
1206
1207#define new_XPVIV() (void*)new_xpviv()
1208#define del_XPVIV(p) del_xpviv((XPVIV *)p)
1209
1210#define new_XPVNV() (void*)new_xpvnv()
1211#define del_XPVNV(p) del_xpvnv((XPVNV *)p)
1212
1213#define new_XPVCV() (void*)new_xpvcv()
1214#define del_XPVCV(p) del_xpvcv((XPVCV *)p)
1215
1216#define new_XPVAV() (void*)new_xpvav()
1217#define del_XPVAV(p) del_xpvav((XPVAV *)p)
1218
1219#define new_XPVHV() (void*)new_xpvhv()
1220#define del_XPVHV(p) del_xpvhv((XPVHV *)p)
1c846c1f 1221
d33b2eba
GS
1222#define new_XPVMG() (void*)new_xpvmg()
1223#define del_XPVMG(p) del_xpvmg((XPVMG *)p)
1224
1225#define new_XPVLV() (void*)new_xpvlv()
1226#define del_XPVLV(p) del_xpvlv((XPVLV *)p)
1227
1228#define new_XPVBM() (void*)new_xpvbm()
1229#define del_XPVBM(p) del_xpvbm((XPVBM *)p)
1230
1231#endif /* PURIFY */
9b94d1dd 1232
d33b2eba
GS
1233#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
1234#define del_XPVGV(p) my_safefree(p)
1c846c1f 1235
d33b2eba
GS
1236#define new_XPVFM() my_safemalloc(sizeof(XPVFM))
1237#define del_XPVFM(p) my_safefree(p)
1c846c1f 1238
d33b2eba
GS
1239#define new_XPVIO() my_safemalloc(sizeof(XPVIO))
1240#define del_XPVIO(p) my_safefree(p)
8990e307 1241
954c1994
GS
1242/*
1243=for apidoc sv_upgrade
1244
ff276b08 1245Upgrade an SV to a more complex form. Generally adds a new body type to the
645c22ef 1246SV, then copies across as much information as possible from the old body.
ff276b08 1247You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
954c1994
GS
1248
1249=cut
1250*/
1251
79072805 1252bool
864dbfa3 1253Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
79072805 1254{
c04a4dfe
JH
1255 char* pv = NULL;
1256 U32 cur = 0;
1257 U32 len = 0;
1258 IV iv = 0;
1259 NV nv = 0.0;
1260 MAGIC* magic = NULL;
1261 HV* stash = Nullhv;
79072805 1262
765f542d
NC
1263 if (mt != SVt_PV && SvIsCOW(sv)) {
1264 sv_force_normal_flags(sv, 0);
f130fd45
NIS
1265 }
1266
79072805
LW
1267 if (SvTYPE(sv) == mt)
1268 return TRUE;
1269
a5f75d66
AD
1270 if (mt < SVt_PVIV)
1271 (void)SvOOK_off(sv);
1272
79072805
LW
1273 switch (SvTYPE(sv)) {
1274 case SVt_NULL:
1275 pv = 0;
1276 cur = 0;
1277 len = 0;
1278 iv = 0;
1279 nv = 0.0;
1280 magic = 0;
1281 stash = 0;
1282 break;
79072805
LW
1283 case SVt_IV:
1284 pv = 0;
1285 cur = 0;
1286 len = 0;
463ee0b2 1287 iv = SvIVX(sv);
65202027 1288 nv = (NV)SvIVX(sv);
79072805
LW
1289 del_XIV(SvANY(sv));
1290 magic = 0;
1291 stash = 0;
ed6116ce 1292 if (mt == SVt_NV)
463ee0b2 1293 mt = SVt_PVNV;
ed6116ce
LW
1294 else if (mt < SVt_PVIV)
1295 mt = SVt_PVIV;
79072805
LW
1296 break;
1297 case SVt_NV:
1298 pv = 0;
1299 cur = 0;
1300 len = 0;
463ee0b2 1301 nv = SvNVX(sv);
1bd302c3 1302 iv = I_V(nv);
79072805
LW
1303 magic = 0;
1304 stash = 0;
1305 del_XNV(SvANY(sv));
1306 SvANY(sv) = 0;
ed6116ce 1307 if (mt < SVt_PVNV)
79072805
LW
1308 mt = SVt_PVNV;
1309 break;
ed6116ce
LW
1310 case SVt_RV:
1311 pv = (char*)SvRV(sv);
1312 cur = 0;
1313 len = 0;
56431972
RB
1314 iv = PTR2IV(pv);
1315 nv = PTR2NV(pv);
ed6116ce
LW
1316 del_XRV(SvANY(sv));
1317 magic = 0;
1318 stash = 0;
1319 break;
79072805 1320 case SVt_PV:
463ee0b2 1321 pv = SvPVX(sv);
79072805
LW
1322 cur = SvCUR(sv);
1323 len = SvLEN(sv);
1324 iv = 0;
1325 nv = 0.0;
1326 magic = 0;
1327 stash = 0;
1328 del_XPV(SvANY(sv));
748a9306
LW
1329 if (mt <= SVt_IV)
1330 mt = SVt_PVIV;
1331 else if (mt == SVt_NV)
1332 mt = SVt_PVNV;
79072805
LW
1333 break;
1334 case SVt_PVIV:
463ee0b2 1335 pv = SvPVX(sv);
79072805
LW
1336 cur = SvCUR(sv);
1337 len = SvLEN(sv);
463ee0b2 1338 iv = SvIVX(sv);
79072805
LW
1339 nv = 0.0;
1340 magic = 0;
1341 stash = 0;
1342 del_XPVIV(SvANY(sv));
1343 break;
1344 case SVt_PVNV:
463ee0b2 1345 pv = SvPVX(sv);
79072805
LW
1346 cur = SvCUR(sv);
1347 len = SvLEN(sv);
463ee0b2
LW
1348 iv = SvIVX(sv);
1349 nv = SvNVX(sv);
79072805
LW
1350 magic = 0;
1351 stash = 0;
1352 del_XPVNV(SvANY(sv));
1353 break;
1354 case SVt_PVMG:
463ee0b2 1355 pv = SvPVX(sv);
79072805
LW
1356 cur = SvCUR(sv);
1357 len = SvLEN(sv);
463ee0b2
LW
1358 iv = SvIVX(sv);
1359 nv = SvNVX(sv);
79072805
LW
1360 magic = SvMAGIC(sv);
1361 stash = SvSTASH(sv);
1362 del_XPVMG(SvANY(sv));
1363 break;
1364 default:
cea2e8a9 1365 Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
79072805
LW
1366 }
1367
1368 switch (mt) {
1369 case SVt_NULL:
cea2e8a9 1370 Perl_croak(aTHX_ "Can't upgrade to undef");
79072805
LW
1371 case SVt_IV:
1372 SvANY(sv) = new_XIV();
463ee0b2 1373 SvIVX(sv) = iv;
79072805
LW
1374 break;
1375 case SVt_NV:
1376 SvANY(sv) = new_XNV();
463ee0b2 1377 SvNVX(sv) = nv;
79072805 1378 break;
ed6116ce
LW
1379 case SVt_RV:
1380 SvANY(sv) = new_XRV();
1381 SvRV(sv) = (SV*)pv;
ed6116ce 1382 break;
79072805
LW
1383 case SVt_PV:
1384 SvANY(sv) = new_XPV();
463ee0b2 1385 SvPVX(sv) = pv;
79072805
LW
1386 SvCUR(sv) = cur;
1387 SvLEN(sv) = len;
1388 break;
1389 case SVt_PVIV:
1390 SvANY(sv) = new_XPVIV();
463ee0b2 1391 SvPVX(sv) = pv;
79072805
LW
1392 SvCUR(sv) = cur;
1393 SvLEN(sv) = len;
463ee0b2 1394 SvIVX(sv) = iv;
79072805 1395 if (SvNIOK(sv))
a0d0e21e 1396 (void)SvIOK_on(sv);
79072805
LW
1397 SvNOK_off(sv);
1398 break;
1399 case SVt_PVNV:
1400 SvANY(sv) = new_XPVNV();
463ee0b2 1401 SvPVX(sv) = pv;
79072805
LW
1402 SvCUR(sv) = cur;
1403 SvLEN(sv) = len;
463ee0b2
LW
1404 SvIVX(sv) = iv;
1405 SvNVX(sv) = nv;
79072805
LW
1406 break;
1407 case SVt_PVMG:
1408 SvANY(sv) = new_XPVMG();
463ee0b2 1409 SvPVX(sv) = pv;
79072805
LW
1410 SvCUR(sv) = cur;
1411 SvLEN(sv) = len;
463ee0b2
LW
1412 SvIVX(sv) = iv;
1413 SvNVX(sv) = nv;
79072805
LW
1414 SvMAGIC(sv) = magic;
1415 SvSTASH(sv) = stash;
1416 break;
1417 case SVt_PVLV:
1418 SvANY(sv) = new_XPVLV();
463ee0b2 1419 SvPVX(sv) = pv;
79072805
LW
1420 SvCUR(sv) = cur;
1421 SvLEN(sv) = len;
463ee0b2
LW
1422 SvIVX(sv) = iv;
1423 SvNVX(sv) = nv;
79072805
LW
1424 SvMAGIC(sv) = magic;
1425 SvSTASH(sv) = stash;
1426 LvTARGOFF(sv) = 0;
1427 LvTARGLEN(sv) = 0;
1428 LvTARG(sv) = 0;
1429 LvTYPE(sv) = 0;
1430 break;
1431 case SVt_PVAV:
1432 SvANY(sv) = new_XPVAV();
463ee0b2
LW
1433 if (pv)
1434 Safefree(pv);
2304df62 1435 SvPVX(sv) = 0;
d1bf51dd 1436 AvMAX(sv) = -1;
93965878 1437 AvFILLp(sv) = -1;
463ee0b2
LW
1438 SvIVX(sv) = 0;
1439 SvNVX(sv) = 0.0;
1440 SvMAGIC(sv) = magic;
1441 SvSTASH(sv) = stash;
1442 AvALLOC(sv) = 0;
79072805
LW
1443 AvARYLEN(sv) = 0;
1444 AvFLAGS(sv) = 0;
1445 break;
1446 case SVt_PVHV:
1447 SvANY(sv) = new_XPVHV();
463ee0b2
LW
1448 if (pv)
1449 Safefree(pv);
1450 SvPVX(sv) = 0;
1451 HvFILL(sv) = 0;
1452 HvMAX(sv) = 0;
8aacddc1
NIS
1453 HvTOTALKEYS(sv) = 0;
1454 HvPLACEHOLDERS(sv) = 0;
79072805
LW
1455 SvMAGIC(sv) = magic;
1456 SvSTASH(sv) = stash;
79072805
LW
1457 HvRITER(sv) = 0;
1458 HvEITER(sv) = 0;
1459 HvPMROOT(sv) = 0;
1460 HvNAME(sv) = 0;
79072805
LW
1461 break;
1462 case SVt_PVCV:
1463 SvANY(sv) = new_XPVCV();
748a9306 1464 Zero(SvANY(sv), 1, XPVCV);
463ee0b2 1465 SvPVX(sv) = pv;
79072805
LW
1466 SvCUR(sv) = cur;
1467 SvLEN(sv) = len;
463ee0b2
LW
1468 SvIVX(sv) = iv;
1469 SvNVX(sv) = nv;
79072805
LW
1470 SvMAGIC(sv) = magic;
1471 SvSTASH(sv) = stash;
79072805
LW
1472 break;
1473 case SVt_PVGV:
1474 SvANY(sv) = new_XPVGV();
463ee0b2 1475 SvPVX(sv) = pv;
79072805
LW
1476 SvCUR(sv) = cur;
1477 SvLEN(sv) = len;
463ee0b2
LW
1478 SvIVX(sv) = iv;
1479 SvNVX(sv) = nv;
79072805
LW
1480 SvMAGIC(sv) = magic;
1481 SvSTASH(sv) = stash;
93a17b20 1482 GvGP(sv) = 0;
79072805
LW
1483 GvNAME(sv) = 0;
1484 GvNAMELEN(sv) = 0;
1485 GvSTASH(sv) = 0;
a5f75d66 1486 GvFLAGS(sv) = 0;
79072805
LW
1487 break;
1488 case SVt_PVBM:
1489 SvANY(sv) = new_XPVBM();
463ee0b2 1490 SvPVX(sv) = pv;
79072805
LW
1491 SvCUR(sv) = cur;
1492 SvLEN(sv) = len;
463ee0b2
LW
1493 SvIVX(sv) = iv;
1494 SvNVX(sv) = nv;
79072805
LW
1495 SvMAGIC(sv) = magic;
1496 SvSTASH(sv) = stash;
1497 BmRARE(sv) = 0;
1498 BmUSEFUL(sv) = 0;
1499 BmPREVIOUS(sv) = 0;
1500 break;
1501 case SVt_PVFM:
1502 SvANY(sv) = new_XPVFM();
748a9306 1503 Zero(SvANY(sv), 1, XPVFM);
463ee0b2 1504 SvPVX(sv) = pv;
79072805
LW
1505 SvCUR(sv) = cur;
1506 SvLEN(sv) = len;
463ee0b2
LW
1507 SvIVX(sv) = iv;
1508 SvNVX(sv) = nv;
79072805
LW
1509 SvMAGIC(sv) = magic;
1510 SvSTASH(sv) = stash;
79072805 1511 break;
8990e307
LW
1512 case SVt_PVIO:
1513 SvANY(sv) = new_XPVIO();
748a9306 1514 Zero(SvANY(sv), 1, XPVIO);
8990e307
LW
1515 SvPVX(sv) = pv;
1516 SvCUR(sv) = cur;
1517 SvLEN(sv) = len;
1518 SvIVX(sv) = iv;
1519 SvNVX(sv) = nv;
1520 SvMAGIC(sv) = magic;
1521 SvSTASH(sv) = stash;
85e6fe83 1522 IoPAGE_LEN(sv) = 60;
8990e307
LW
1523 break;
1524 }
1525 SvFLAGS(sv) &= ~SVTYPEMASK;
1526 SvFLAGS(sv) |= mt;
79072805
LW
1527 return TRUE;
1528}
1529
645c22ef
DM
1530/*
1531=for apidoc sv_backoff
1532
1533Remove any string offset. You should normally use the C<SvOOK_off> macro
1534wrapper instead.
1535
1536=cut
1537*/
1538
79072805 1539int
864dbfa3 1540Perl_sv_backoff(pTHX_ register SV *sv)
79072805
LW
1541{
1542 assert(SvOOK(sv));
463ee0b2
LW
1543 if (SvIVX(sv)) {
1544 char *s = SvPVX(sv);
1545 SvLEN(sv) += SvIVX(sv);
1546 SvPVX(sv) -= SvIVX(sv);
79072805 1547 SvIV_set(sv, 0);
463ee0b2 1548 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
79072805
LW
1549 }
1550 SvFLAGS(sv) &= ~SVf_OOK;
a0d0e21e 1551 return 0;
79072805
LW
1552}
1553
954c1994
GS
1554/*
1555=for apidoc sv_grow
1556
645c22ef
DM
1557Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
1558upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
1559Use the C<SvGROW> wrapper instead.
954c1994
GS
1560
1561=cut
1562*/
1563
79072805 1564char *
864dbfa3 1565Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
79072805
LW
1566{
1567 register char *s;
1568
54f0641b
NIS
1569
1570
55497cff 1571#ifdef HAS_64K_LIMIT
79072805 1572 if (newlen >= 0x10000) {
1d7c1841
GS
1573 PerlIO_printf(Perl_debug_log,
1574 "Allocation too large: %"UVxf"\n", (UV)newlen);
79072805
LW
1575 my_exit(1);
1576 }
55497cff 1577#endif /* HAS_64K_LIMIT */
a0d0e21e
LW
1578 if (SvROK(sv))
1579 sv_unref(sv);
79072805
LW
1580 if (SvTYPE(sv) < SVt_PV) {
1581 sv_upgrade(sv, SVt_PV);
463ee0b2 1582 s = SvPVX(sv);
79072805
LW
1583 }
1584 else if (SvOOK(sv)) { /* pv is offset? */
1585 sv_backoff(sv);
463ee0b2 1586 s = SvPVX(sv);
79072805
LW
1587 if (newlen > SvLEN(sv))
1588 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
c6f8c383
GA
1589#ifdef HAS_64K_LIMIT
1590 if (newlen >= 0x10000)
1591 newlen = 0xFFFF;
1592#endif
79072805
LW
1593 }
1594 else
463ee0b2 1595 s = SvPVX(sv);
54f0641b 1596
79072805 1597 if (newlen > SvLEN(sv)) { /* need more room? */
8d6dde3e 1598 if (SvLEN(sv) && s) {
7bab3ede 1599#ifdef MYMALLOC
8d6dde3e
IZ
1600 STRLEN l = malloced_size((void*)SvPVX(sv));
1601 if (newlen <= l) {
1602 SvLEN_set(sv, l);
1603 return s;
1604 } else
c70c8a0a 1605#endif
79072805 1606 Renew(s,newlen,char);
8d6dde3e 1607 }
4e83176d 1608 else {
4e83176d 1609 New(703, s, newlen, char);
40565179 1610 if (SvPVX(sv) && SvCUR(sv)) {
54f0641b 1611 Move(SvPVX(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
40565179 1612 }
4e83176d 1613 }
79072805
LW
1614 SvPV_set(sv, s);
1615 SvLEN_set(sv, newlen);
1616 }
1617 return s;
1618}
1619
954c1994
GS
1620/*
1621=for apidoc sv_setiv
1622
645c22ef
DM
1623Copies an integer into the given SV, upgrading first if necessary.
1624Does not handle 'set' magic. See also C<sv_setiv_mg>.
954c1994
GS
1625
1626=cut
1627*/
1628
79072805 1629void
864dbfa3 1630Perl_sv_setiv(pTHX_ register SV *sv, IV i)
79072805 1631{
765f542d 1632 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2
LW
1633 switch (SvTYPE(sv)) {
1634 case SVt_NULL:
79072805 1635 sv_upgrade(sv, SVt_IV);
463ee0b2
LW
1636 break;
1637 case SVt_NV:
1638 sv_upgrade(sv, SVt_PVNV);
1639 break;
ed6116ce 1640 case SVt_RV:
463ee0b2 1641 case SVt_PV:
79072805 1642 sv_upgrade(sv, SVt_PVIV);
463ee0b2 1643 break;
a0d0e21e
LW
1644
1645 case SVt_PVGV:
a0d0e21e
LW
1646 case SVt_PVAV:
1647 case SVt_PVHV:
1648 case SVt_PVCV:
1649 case SVt_PVFM:
1650 case SVt_PVIO:
411caa50 1651 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
53e06cf0 1652 OP_DESC(PL_op));
463ee0b2 1653 }
a0d0e21e 1654 (void)SvIOK_only(sv); /* validate number */
a5f75d66 1655 SvIVX(sv) = i;
463ee0b2 1656 SvTAINT(sv);
79072805
LW
1657}
1658
954c1994
GS
1659/*
1660=for apidoc sv_setiv_mg
1661
1662Like C<sv_setiv>, but also handles 'set' magic.
1663
1664=cut
1665*/
1666
79072805 1667void
864dbfa3 1668Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
ef50df4b
GS
1669{
1670 sv_setiv(sv,i);
1671 SvSETMAGIC(sv);
1672}
1673
954c1994
GS
1674/*
1675=for apidoc sv_setuv
1676
645c22ef
DM
1677Copies an unsigned integer into the given SV, upgrading first if necessary.
1678Does not handle 'set' magic. See also C<sv_setuv_mg>.
954c1994
GS
1679
1680=cut
1681*/
1682
ef50df4b 1683void
864dbfa3 1684Perl_sv_setuv(pTHX_ register SV *sv, UV u)
55497cff 1685{
55ada374
NC
1686 /* With these two if statements:
1687 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 1688
55ada374
NC
1689 without
1690 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 1691
55ada374
NC
1692 If you wish to remove them, please benchmark to see what the effect is
1693 */
28e5dec8
JH
1694 if (u <= (UV)IV_MAX) {
1695 sv_setiv(sv, (IV)u);
1696 return;
1697 }
25da4f38
IZ
1698 sv_setiv(sv, 0);
1699 SvIsUV_on(sv);
1700 SvUVX(sv) = u;
55497cff 1701}
1702
954c1994
GS
1703/*
1704=for apidoc sv_setuv_mg
1705
1706Like C<sv_setuv>, but also handles 'set' magic.
1707
1708=cut
1709*/
1710
55497cff 1711void
864dbfa3 1712Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
ef50df4b 1713{
55ada374
NC
1714 /* With these two if statements:
1715 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 1716
55ada374
NC
1717 without
1718 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 1719
55ada374
NC
1720 If you wish to remove them, please benchmark to see what the effect is
1721 */
28e5dec8
JH
1722 if (u <= (UV)IV_MAX) {
1723 sv_setiv(sv, (IV)u);
1724 } else {
1725 sv_setiv(sv, 0);
1726 SvIsUV_on(sv);
1727 sv_setuv(sv,u);
1728 }
ef50df4b
GS
1729 SvSETMAGIC(sv);
1730}
1731
954c1994
GS
1732/*
1733=for apidoc sv_setnv
1734
645c22ef
DM
1735Copies a double into the given SV, upgrading first if necessary.
1736Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
1737
1738=cut
1739*/
1740
ef50df4b 1741void
65202027 1742Perl_sv_setnv(pTHX_ register SV *sv, NV num)
79072805 1743{
765f542d 1744 SV_CHECK_THINKFIRST_COW_DROP(sv);
a0d0e21e
LW
1745 switch (SvTYPE(sv)) {
1746 case SVt_NULL:
1747 case SVt_IV:
79072805 1748 sv_upgrade(sv, SVt_NV);
a0d0e21e 1749 break;
a0d0e21e
LW
1750 case SVt_RV:
1751 case SVt_PV:
1752 case SVt_PVIV:
79072805 1753 sv_upgrade(sv, SVt_PVNV);
a0d0e21e 1754 break;
827b7e14 1755
a0d0e21e 1756 case SVt_PVGV:
a0d0e21e
LW
1757 case SVt_PVAV:
1758 case SVt_PVHV:
1759 case SVt_PVCV:
1760 case SVt_PVFM:
1761 case SVt_PVIO:
411caa50 1762 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
53e06cf0 1763 OP_NAME(PL_op));
79072805 1764 }
463ee0b2 1765 SvNVX(sv) = num;
a0d0e21e 1766 (void)SvNOK_only(sv); /* validate number */
463ee0b2 1767 SvTAINT(sv);
79072805
LW
1768}
1769
954c1994
GS
1770/*
1771=for apidoc sv_setnv_mg
1772
1773Like C<sv_setnv>, but also handles 'set' magic.
1774
1775=cut
1776*/
1777
ef50df4b 1778void
65202027 1779Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
ef50df4b
GS
1780{
1781 sv_setnv(sv,num);
1782 SvSETMAGIC(sv);
1783}
1784
645c22ef
DM
1785/* Print an "isn't numeric" warning, using a cleaned-up,
1786 * printable version of the offending string
1787 */
1788
76e3520e 1789STATIC void
cea2e8a9 1790S_not_a_number(pTHX_ SV *sv)
a0d0e21e 1791{
94463019
JH
1792 SV *dsv;
1793 char tmpbuf[64];
1794 char *pv;
1795
1796 if (DO_UTF8(sv)) {
1797 dsv = sv_2mortal(newSVpv("", 0));
1798 pv = sv_uni_display(dsv, sv, 10, 0);
1799 } else {
1800 char *d = tmpbuf;
1801 char *limit = tmpbuf + sizeof(tmpbuf) - 8;
1802 /* each *s can expand to 4 chars + "...\0",
1803 i.e. need room for 8 chars */
ecdeb87c 1804
94463019
JH
1805 char *s, *end;
1806 for (s = SvPVX(sv), end = s + SvCUR(sv); s < end && d < limit; s++) {
1807 int ch = *s & 0xFF;
1808 if (ch & 128 && !isPRINT_LC(ch)) {
1809 *d++ = 'M';
1810 *d++ = '-';
1811 ch &= 127;
1812 }
1813 if (ch == '\n') {
1814 *d++ = '\\';
1815 *d++ = 'n';
1816 }
1817 else if (ch == '\r') {
1818 *d++ = '\\';
1819 *d++ = 'r';
1820 }
1821 else if (ch == '\f') {
1822 *d++ = '\\';
1823 *d++ = 'f';
1824 }
1825 else if (ch == '\\') {
1826 *d++ = '\\';
1827 *d++ = '\\';
1828 }
1829 else if (ch == '\0') {
1830 *d++ = '\\';
1831 *d++ = '0';
1832 }
1833 else if (isPRINT_LC(ch))
1834 *d++ = ch;
1835 else {
1836 *d++ = '^';
1837 *d++ = toCTRL(ch);
1838 }
1839 }
1840 if (s < end) {
1841 *d++ = '.';
1842 *d++ = '.';
1843 *d++ = '.';
1844 }
1845 *d = '\0';
1846 pv = tmpbuf;
a0d0e21e 1847 }
a0d0e21e 1848
533c011a 1849 if (PL_op)
9014280d 1850 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
1851 "Argument \"%s\" isn't numeric in %s", pv,
1852 OP_DESC(PL_op));
a0d0e21e 1853 else
9014280d 1854 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 1855 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
1856}
1857
c2988b20
NC
1858/*
1859=for apidoc looks_like_number
1860
645c22ef
DM
1861Test if the content of an SV looks like a number (or is a number).
1862C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1863non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
1864
1865=cut
1866*/
1867
1868I32
1869Perl_looks_like_number(pTHX_ SV *sv)
1870{
1871 register char *sbegin;
1872 STRLEN len;
1873
1874 if (SvPOK(sv)) {
1875 sbegin = SvPVX(sv);
1876 len = SvCUR(sv);
1877 }
1878 else if (SvPOKp(sv))
1879 sbegin = SvPV(sv, len);
1880 else
1881 return 1; /* Historic. Wrong? */
1882 return grok_number(sbegin, len, NULL);
1883}
25da4f38
IZ
1884
1885/* Actually, ISO C leaves conversion of UV to IV undefined, but
1886 until proven guilty, assume that things are not that bad... */
1887
645c22ef
DM
1888/*
1889 NV_PRESERVES_UV:
1890
1891 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
1892 an IV (an assumption perl has been based on to date) it becomes necessary
1893 to remove the assumption that the NV always carries enough precision to
1894 recreate the IV whenever needed, and that the NV is the canonical form.
1895 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 1896 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
1897 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1898 1) to distinguish between IV/UV/NV slots that have cached a valid
1899 conversion where precision was lost and IV/UV/NV slots that have a
1900 valid conversion which has lost no precision
645c22ef 1901 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
1902 would lose precision, the precise conversion (or differently
1903 imprecise conversion) is also performed and cached, to prevent
1904 requests for different numeric formats on the same SV causing
1905 lossy conversion chains. (lossless conversion chains are perfectly
1906 acceptable (still))
1907
1908
1909 flags are used:
1910 SvIOKp is true if the IV slot contains a valid value
1911 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
1912 SvNOKp is true if the NV slot contains a valid value
1913 SvNOK is true only if the NV value is accurate
1914
1915 so
645c22ef 1916 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
1917 IV(or UV) would lose accuracy over a direct conversion from PV to
1918 IV(or UV). If it would, cache both conversions, return NV, but mark
1919 SV as IOK NOKp (ie not NOK).
1920
645c22ef 1921 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
1922 NV would lose accuracy over a direct conversion from PV to NV. If it
1923 would, cache both conversions, flag similarly.
1924
1925 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1926 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
1927 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1928 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 1929 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 1930
645c22ef
DM
1931 The benefit of this is that operations such as pp_add know that if
1932 SvIOK is true for both left and right operands, then integer addition
1933 can be used instead of floating point (for cases where the result won't
1934 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
1935 loss of precision compared with integer addition.
1936
1937 * making IV and NV equal status should make maths accurate on 64 bit
1938 platforms
1939 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 1940 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
1941 looking for SvIOK and checking for overflow will not outweigh the
1942 fp to integer speedup)
1943 * will slow down integer operations (callers of SvIV) on "inaccurate"
1944 values, as the change from SvIOK to SvIOKp will cause a call into
1945 sv_2iv each time rather than a macro access direct to the IV slot
1946 * should speed up number->string conversion on integers as IV is
645c22ef 1947 favoured when IV and NV are equally accurate
28e5dec8
JH
1948
1949 ####################################################################
645c22ef
DM
1950 You had better be using SvIOK_notUV if you want an IV for arithmetic:
1951 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1952 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
1953 ####################################################################
1954
645c22ef 1955 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
1956 performance ratio.
1957*/
1958
1959#ifndef NV_PRESERVES_UV
645c22ef
DM
1960# define IS_NUMBER_UNDERFLOW_IV 1
1961# define IS_NUMBER_UNDERFLOW_UV 2
1962# define IS_NUMBER_IV_AND_UV 2
1963# define IS_NUMBER_OVERFLOW_IV 4
1964# define IS_NUMBER_OVERFLOW_UV 5
1965
1966/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
1967
1968/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
1969STATIC int
645c22ef 1970S_sv_2iuv_non_preserve(pTHX_ register SV *sv, I32 numtype)
28e5dec8 1971{
1779d84d 1972 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
1973 if (SvNVX(sv) < (NV)IV_MIN) {
1974 (void)SvIOKp_on(sv);
1975 (void)SvNOK_on(sv);
1976 SvIVX(sv) = IV_MIN;
1977 return IS_NUMBER_UNDERFLOW_IV;
1978 }
1979 if (SvNVX(sv) > (NV)UV_MAX) {
1980 (void)SvIOKp_on(sv);
1981 (void)SvNOK_on(sv);
1982 SvIsUV_on(sv);
1983 SvUVX(sv) = UV_MAX;
1984 return IS_NUMBER_OVERFLOW_UV;
1985 }
c2988b20
NC
1986 (void)SvIOKp_on(sv);
1987 (void)SvNOK_on(sv);
1988 /* Can't use strtol etc to convert this string. (See truth table in
1989 sv_2iv */
1990 if (SvNVX(sv) <= (UV)IV_MAX) {
1991 SvIVX(sv) = I_V(SvNVX(sv));
1992 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1993 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
1994 } else {
1995 /* Integer is imprecise. NOK, IOKp */
1996 }
1997 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1998 }
1999 SvIsUV_on(sv);
2000 SvUVX(sv) = U_V(SvNVX(sv));
2001 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2002 if (SvUVX(sv) == UV_MAX) {
2003 /* As we know that NVs don't preserve UVs, UV_MAX cannot
2004 possibly be preserved by NV. Hence, it must be overflow.
2005 NOK, IOKp */
2006 return IS_NUMBER_OVERFLOW_UV;
2007 }
2008 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
2009 } else {
2010 /* Integer is imprecise. NOK, IOKp */
28e5dec8 2011 }
c2988b20 2012 return IS_NUMBER_OVERFLOW_IV;
28e5dec8 2013}
645c22ef
DM
2014#endif /* !NV_PRESERVES_UV*/
2015
2016/*
2017=for apidoc sv_2iv
2018
2019Return the integer value of an SV, doing any necessary string conversion,
2020magic etc. Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2021
2022=cut
2023*/
28e5dec8 2024
a0d0e21e 2025IV
864dbfa3 2026Perl_sv_2iv(pTHX_ register SV *sv)
79072805
LW
2027{
2028 if (!sv)
2029 return 0;
8990e307 2030 if (SvGMAGICAL(sv)) {
463ee0b2
LW
2031 mg_get(sv);
2032 if (SvIOKp(sv))
2033 return SvIVX(sv);
748a9306 2034 if (SvNOKp(sv)) {
25da4f38 2035 return I_V(SvNVX(sv));
748a9306 2036 }
36477c24 2037 if (SvPOKp(sv) && SvLEN(sv))
2038 return asIV(sv);
3fe9a6f1 2039 if (!SvROK(sv)) {
d008e5eb 2040 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2041 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1d7c1841 2042 report_uninit();
c6ee37c5 2043 }
36477c24 2044 return 0;
3fe9a6f1 2045 }
463ee0b2 2046 }
ed6116ce 2047 if (SvTHINKFIRST(sv)) {
a0d0e21e 2048 if (SvROK(sv)) {
a0d0e21e 2049 SV* tmpstr;
1554e226 2050 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2051 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2052 return SvIV(tmpstr);
56431972 2053 return PTR2IV(SvRV(sv));
a0d0e21e 2054 }
765f542d
NC
2055 if (SvIsCOW(sv)) {
2056 sv_force_normal_flags(sv, 0);
47deb5e7 2057 }
0336b60e 2058 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2059 if (ckWARN(WARN_UNINITIALIZED))
1d7c1841 2060 report_uninit();
ed6116ce
LW
2061 return 0;
2062 }
79072805 2063 }
25da4f38
IZ
2064 if (SvIOKp(sv)) {
2065 if (SvIsUV(sv)) {
2066 return (IV)(SvUVX(sv));
2067 }
2068 else {
2069 return SvIVX(sv);
2070 }
463ee0b2 2071 }
748a9306 2072 if (SvNOKp(sv)) {
28e5dec8
JH
2073 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2074 * without also getting a cached IV/UV from it at the same time
2075 * (ie PV->NV conversion should detect loss of accuracy and cache
2076 * IV or UV at same time to avoid this. NWC */
25da4f38
IZ
2077
2078 if (SvTYPE(sv) == SVt_NV)
2079 sv_upgrade(sv, SVt_PVNV);
2080
28e5dec8
JH
2081 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2082 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
2083 certainly cast into the IV range at IV_MAX, whereas the correct
2084 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
2085 cases go to UV */
2086 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
748a9306 2087 SvIVX(sv) = I_V(SvNVX(sv));
28e5dec8
JH
2088 if (SvNVX(sv) == (NV) SvIVX(sv)
2089#ifndef NV_PRESERVES_UV
2090 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2091 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2092 /* Don't flag it as "accurately an integer" if the number
2093 came from a (by definition imprecise) NV operation, and
2094 we're outside the range of NV integer precision */
2095#endif
2096 ) {
2097 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2098 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2099 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2100 PTR2UV(sv),
2101 SvNVX(sv),
2102 SvIVX(sv)));
2103
2104 } else {
2105 /* IV not precise. No need to convert from PV, as NV
2106 conversion would already have cached IV if it detected
2107 that PV->IV would be better than PV->NV->IV
2108 flags already correct - don't set public IOK. */
2109 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2110 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2111 PTR2UV(sv),
2112 SvNVX(sv),
2113 SvIVX(sv)));
2114 }
2115 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2116 but the cast (NV)IV_MIN rounds to a the value less (more
2117 negative) than IV_MIN which happens to be equal to SvNVX ??
2118 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2119 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2120 (NV)UVX == NVX are both true, but the values differ. :-(
2121 Hopefully for 2s complement IV_MIN is something like
2122 0x8000000000000000 which will be exact. NWC */
d460ef45 2123 }
25da4f38 2124 else {
ff68c719 2125 SvUVX(sv) = U_V(SvNVX(sv));
28e5dec8
JH
2126 if (
2127 (SvNVX(sv) == (NV) SvUVX(sv))
2128#ifndef NV_PRESERVES_UV
2129 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2130 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2131 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2132 /* Don't flag it as "accurately an integer" if the number
2133 came from a (by definition imprecise) NV operation, and
2134 we're outside the range of NV integer precision */
2135#endif
2136 )
2137 SvIOK_on(sv);
25da4f38
IZ
2138 SvIsUV_on(sv);
2139 ret_iv_max:
1c846c1f 2140 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 2141 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 2142 PTR2UV(sv),
57def98f
JH
2143 SvUVX(sv),
2144 SvUVX(sv)));
25da4f38
IZ
2145 return (IV)SvUVX(sv);
2146 }
748a9306
LW
2147 }
2148 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20
NC
2149 UV value;
2150 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
25da4f38
IZ
2151 /* We want to avoid a possible problem when we cache an IV which
2152 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
2153 the same as the direct translation of the initial string
2154 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2155 be careful to ensure that the value with the .456 is around if the
2156 NV value is requested in the future).
1c846c1f 2157
25da4f38
IZ
2158 This means that if we cache such an IV, we need to cache the
2159 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 2160 cache the NV if we are sure it's not needed.
25da4f38 2161 */
16b7a9a4 2162
c2988b20
NC
2163 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2164 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2165 == IS_NUMBER_IN_UV) {
5e045b90 2166 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
2167 if (SvTYPE(sv) < SVt_PVIV)
2168 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 2169 (void)SvIOK_on(sv);
c2988b20
NC
2170 } else if (SvTYPE(sv) < SVt_PVNV)
2171 sv_upgrade(sv, SVt_PVNV);
28e5dec8 2172
c2988b20
NC
2173 /* If NV preserves UV then we only use the UV value if we know that
2174 we aren't going to call atof() below. If NVs don't preserve UVs
2175 then the value returned may have more precision than atof() will
2176 return, even though value isn't perfectly accurate. */
2177 if ((numtype & (IS_NUMBER_IN_UV
2178#ifdef NV_PRESERVES_UV
2179 | IS_NUMBER_NOT_INT
2180#endif
2181 )) == IS_NUMBER_IN_UV) {
2182 /* This won't turn off the public IOK flag if it was set above */
2183 (void)SvIOKp_on(sv);
2184
2185 if (!(numtype & IS_NUMBER_NEG)) {
2186 /* positive */;
2187 if (value <= (UV)IV_MAX) {
2188 SvIVX(sv) = (IV)value;
2189 } else {
2190 SvUVX(sv) = value;
2191 SvIsUV_on(sv);
2192 }
2193 } else {
2194 /* 2s complement assumption */
2195 if (value <= (UV)IV_MIN) {
2196 SvIVX(sv) = -(IV)value;
2197 } else {
2198 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2199 I'm assuming it will be rare. */
c2988b20
NC
2200 if (SvTYPE(sv) < SVt_PVNV)
2201 sv_upgrade(sv, SVt_PVNV);
2202 SvNOK_on(sv);
2203 SvIOK_off(sv);
2204 SvIOKp_on(sv);
2205 SvNVX(sv) = -(NV)value;
2206 SvIVX(sv) = IV_MIN;
2207 }
2208 }
2209 }
2210 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2211 will be in the previous block to set the IV slot, and the next
2212 block to set the NV slot. So no else here. */
2213
2214 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2215 != IS_NUMBER_IN_UV) {
2216 /* It wasn't an (integer that doesn't overflow the UV). */
2217 SvNVX(sv) = Atof(SvPVX(sv));
28e5dec8 2218
c2988b20
NC
2219 if (! numtype && ckWARN(WARN_NUMERIC))
2220 not_a_number(sv);
28e5dec8 2221
65202027 2222#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2223 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2224 PTR2UV(sv), SvNVX(sv)));
65202027 2225#else
1779d84d 2226 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 2227 PTR2UV(sv), SvNVX(sv)));
65202027 2228#endif
28e5dec8
JH
2229
2230
2231#ifdef NV_PRESERVES_UV
c2988b20
NC
2232 (void)SvIOKp_on(sv);
2233 (void)SvNOK_on(sv);
2234 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2235 SvIVX(sv) = I_V(SvNVX(sv));
2236 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2237 SvIOK_on(sv);
28e5dec8 2238 } else {
c2988b20
NC
2239 /* Integer is imprecise. NOK, IOKp */
2240 }
2241 /* UV will not work better than IV */
2242 } else {
2243 if (SvNVX(sv) > (NV)UV_MAX) {
2244 SvIsUV_on(sv);
2245 /* Integer is inaccurate. NOK, IOKp, is UV */
2246 SvUVX(sv) = UV_MAX;
2247 SvIsUV_on(sv);
2248 } else {
2249 SvUVX(sv) = U_V(SvNVX(sv));
2250 /* 0xFFFFFFFFFFFFFFFF not an issue in here */
2251 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2252 SvIOK_on(sv);
28e5dec8
JH
2253 SvIsUV_on(sv);
2254 } else {
c2988b20
NC
2255 /* Integer is imprecise. NOK, IOKp, is UV */
2256 SvIsUV_on(sv);
28e5dec8 2257 }
28e5dec8 2258 }
c2988b20
NC
2259 goto ret_iv_max;
2260 }
28e5dec8 2261#else /* NV_PRESERVES_UV */
c2988b20
NC
2262 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2263 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2264 /* The IV slot will have been set from value returned by
2265 grok_number above. The NV slot has just been set using
2266 Atof. */
560b0c46 2267 SvNOK_on(sv);
c2988b20
NC
2268 assert (SvIOKp(sv));
2269 } else {
2270 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2271 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2272 /* Small enough to preserve all bits. */
2273 (void)SvIOKp_on(sv);
2274 SvNOK_on(sv);
2275 SvIVX(sv) = I_V(SvNVX(sv));
2276 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2277 SvIOK_on(sv);
2278 /* Assumption: first non-preserved integer is < IV_MAX,
2279 this NV is in the preserved range, therefore: */
2280 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2281 < (UV)IV_MAX)) {
1779d84d 2282 Perl_croak(aTHX_ "sv_2iv assumed (U_V(fabs(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
2283 }
2284 } else {
2285 /* IN_UV NOT_INT
2286 0 0 already failed to read UV.
2287 0 1 already failed to read UV.
2288 1 0 you won't get here in this case. IV/UV
2289 slot set, public IOK, Atof() unneeded.
2290 1 1 already read UV.
2291 so there's no point in sv_2iuv_non_preserve() attempting
2292 to use atol, strtol, strtoul etc. */
2293 if (sv_2iuv_non_preserve (sv, numtype)
2294 >= IS_NUMBER_OVERFLOW_IV)
2295 goto ret_iv_max;
2296 }
2297 }
28e5dec8 2298#endif /* NV_PRESERVES_UV */
25da4f38 2299 }
28e5dec8 2300 } else {
599cee73 2301 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1d7c1841 2302 report_uninit();
25da4f38
IZ
2303 if (SvTYPE(sv) < SVt_IV)
2304 /* Typically the caller expects that sv_any is not NULL now. */
2305 sv_upgrade(sv, SVt_IV);
a0d0e21e 2306 return 0;
79072805 2307 }
1d7c1841
GS
2308 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2309 PTR2UV(sv),SvIVX(sv)));
25da4f38 2310 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
2311}
2312
645c22ef
DM
2313/*
2314=for apidoc sv_2uv
2315
2316Return the unsigned integer value of an SV, doing any necessary string
2317conversion, magic etc. Normally used via the C<SvUV(sv)> and C<SvUVx(sv)>
2318macros.
2319
2320=cut
2321*/
2322
ff68c719 2323UV
864dbfa3 2324Perl_sv_2uv(pTHX_ register SV *sv)
ff68c719 2325{
2326 if (!sv)
2327 return 0;
2328 if (SvGMAGICAL(sv)) {
2329 mg_get(sv);
2330 if (SvIOKp(sv))
2331 return SvUVX(sv);
2332 if (SvNOKp(sv))
2333 return U_V(SvNVX(sv));
36477c24 2334 if (SvPOKp(sv) && SvLEN(sv))
2335 return asUV(sv);
3fe9a6f1 2336 if (!SvROK(sv)) {
d008e5eb 2337 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2338 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1d7c1841 2339 report_uninit();
c6ee37c5 2340 }
36477c24 2341 return 0;
3fe9a6f1 2342 }
ff68c719 2343 }
2344 if (SvTHINKFIRST(sv)) {
2345 if (SvROK(sv)) {
ff68c719 2346 SV* tmpstr;
1554e226 2347 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2348 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2349 return SvUV(tmpstr);
56431972 2350 return PTR2UV(SvRV(sv));
ff68c719 2351 }
765f542d
NC
2352 if (SvIsCOW(sv)) {
2353 sv_force_normal_flags(sv, 0);
8a818333 2354 }
0336b60e 2355 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2356 if (ckWARN(WARN_UNINITIALIZED))
1d7c1841 2357 report_uninit();
ff68c719 2358 return 0;
2359 }
2360 }
25da4f38
IZ
2361 if (SvIOKp(sv)) {
2362 if (SvIsUV(sv)) {
2363 return SvUVX(sv);
2364 }
2365 else {
2366 return (UV)SvIVX(sv);
2367 }
ff68c719 2368 }
2369 if (SvNOKp(sv)) {
28e5dec8
JH
2370 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2371 * without also getting a cached IV/UV from it at the same time
2372 * (ie PV->NV conversion should detect loss of accuracy and cache
2373 * IV or UV at same time to avoid this. */
2374 /* IV-over-UV optimisation - choose to cache IV if possible */
2375
25da4f38
IZ
2376 if (SvTYPE(sv) == SVt_NV)
2377 sv_upgrade(sv, SVt_PVNV);
28e5dec8
JH
2378
2379 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2380 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
f7bbb42a 2381 SvIVX(sv) = I_V(SvNVX(sv));
28e5dec8
JH
2382 if (SvNVX(sv) == (NV) SvIVX(sv)
2383#ifndef NV_PRESERVES_UV
2384 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2385 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2386 /* Don't flag it as "accurately an integer" if the number
2387 came from a (by definition imprecise) NV operation, and
2388 we're outside the range of NV integer precision */
2389#endif
2390 ) {
2391 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2392 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2393 "0x%"UVxf" uv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2394 PTR2UV(sv),
2395 SvNVX(sv),
2396 SvIVX(sv)));
2397
2398 } else {
2399 /* IV not precise. No need to convert from PV, as NV
2400 conversion would already have cached IV if it detected
2401 that PV->IV would be better than PV->NV->IV
2402 flags already correct - don't set public IOK. */
2403 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2404 "0x%"UVxf" uv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2405 PTR2UV(sv),
2406 SvNVX(sv),
2407 SvIVX(sv)));
2408 }
2409 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2410 but the cast (NV)IV_MIN rounds to a the value less (more
2411 negative) than IV_MIN which happens to be equal to SvNVX ??
2412 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2413 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2414 (NV)UVX == NVX are both true, but the values differ. :-(
2415 Hopefully for 2s complement IV_MIN is something like
2416 0x8000000000000000 which will be exact. NWC */
d460ef45 2417 }
28e5dec8
JH
2418 else {
2419 SvUVX(sv) = U_V(SvNVX(sv));
2420 if (
2421 (SvNVX(sv) == (NV) SvUVX(sv))
2422#ifndef NV_PRESERVES_UV
2423 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2424 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2425 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2426 /* Don't flag it as "accurately an integer" if the number
2427 came from a (by definition imprecise) NV operation, and
2428 we're outside the range of NV integer precision */
2429#endif
2430 )
2431 SvIOK_on(sv);
2432 SvIsUV_on(sv);
1c846c1f 2433 DEBUG_c(PerlIO_printf(Perl_debug_log,
28e5dec8 2434 "0x%"UVxf" 2uv(%"UVuf" => %"IVdf") (as unsigned)\n",
57def98f 2435 PTR2UV(sv),
28e5dec8
JH
2436 SvUVX(sv),
2437 SvUVX(sv)));
25da4f38 2438 }
ff68c719 2439 }
2440 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20
NC
2441 UV value;
2442 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
25da4f38
IZ
2443
2444 /* We want to avoid a possible problem when we cache a UV which
2445 may be later translated to an NV, and the resulting NV is not
2446 the translation of the initial data.
1c846c1f 2447
25da4f38
IZ
2448 This means that if we cache such a UV, we need to cache the
2449 NV as well. Moreover, we trade speed for space, and do not
2450 cache the NV if not needed.
2451 */
16b7a9a4 2452
c2988b20
NC
2453 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2454 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2455 == IS_NUMBER_IN_UV) {
5e045b90 2456 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8 2457 if (SvTYPE(sv) < SVt_PVIV)
f7bbb42a
JH
2458 sv_upgrade(sv, SVt_PVIV);
2459 (void)SvIOK_on(sv);
c2988b20
NC
2460 } else if (SvTYPE(sv) < SVt_PVNV)
2461 sv_upgrade(sv, SVt_PVNV);
d460ef45 2462
c2988b20
NC
2463 /* If NV preserves UV then we only use the UV value if we know that
2464 we aren't going to call atof() below. If NVs don't preserve UVs
2465 then the value returned may have more precision than atof() will
2466 return, even though it isn't accurate. */
2467 if ((numtype & (IS_NUMBER_IN_UV
2468#ifdef NV_PRESERVES_UV
2469 | IS_NUMBER_NOT_INT
2470#endif
2471 )) == IS_NUMBER_IN_UV) {
2472 /* This won't turn off the public IOK flag if it was set above */
2473 (void)SvIOKp_on(sv);
2474
2475 if (!(numtype & IS_NUMBER_NEG)) {
2476 /* positive */;
2477 if (value <= (UV)IV_MAX) {
2478 SvIVX(sv) = (IV)value;
28e5dec8
JH
2479 } else {
2480 /* it didn't overflow, and it was positive. */
c2988b20 2481 SvUVX(sv) = value;
28e5dec8
JH
2482 SvIsUV_on(sv);
2483 }
c2988b20
NC
2484 } else {
2485 /* 2s complement assumption */
2486 if (value <= (UV)IV_MIN) {
2487 SvIVX(sv) = -(IV)value;
2488 } else {
2489 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2490 I'm assuming it will be rare. */
c2988b20
NC
2491 if (SvTYPE(sv) < SVt_PVNV)
2492 sv_upgrade(sv, SVt_PVNV);
2493 SvNOK_on(sv);
2494 SvIOK_off(sv);
2495 SvIOKp_on(sv);
2496 SvNVX(sv) = -(NV)value;
2497 SvIVX(sv) = IV_MIN;
2498 }
2499 }
2500 }
2501
2502 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2503 != IS_NUMBER_IN_UV) {
2504 /* It wasn't an integer, or it overflowed the UV. */
2505 SvNVX(sv) = Atof(SvPVX(sv));
28e5dec8 2506
c2988b20 2507 if (! numtype && ckWARN(WARN_NUMERIC))
28e5dec8
JH
2508 not_a_number(sv);
2509
2510#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2511 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%" PERL_PRIgldbl ")\n",
2512 PTR2UV(sv), SvNVX(sv)));
28e5dec8 2513#else
1779d84d 2514 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"NVgf")\n",
c2988b20 2515 PTR2UV(sv), SvNVX(sv)));
28e5dec8
JH
2516#endif
2517
2518#ifdef NV_PRESERVES_UV
c2988b20
NC
2519 (void)SvIOKp_on(sv);
2520 (void)SvNOK_on(sv);
2521 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2522 SvIVX(sv) = I_V(SvNVX(sv));
2523 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2524 SvIOK_on(sv);
2525 } else {
2526 /* Integer is imprecise. NOK, IOKp */
2527 }
2528 /* UV will not work better than IV */
2529 } else {
2530 if (SvNVX(sv) > (NV)UV_MAX) {
2531 SvIsUV_on(sv);
2532 /* Integer is inaccurate. NOK, IOKp, is UV */
2533 SvUVX(sv) = UV_MAX;
2534 SvIsUV_on(sv);
2535 } else {
2536 SvUVX(sv) = U_V(SvNVX(sv));
2537 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2538 NV preservse UV so can do correct comparison. */
2539 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2540 SvIOK_on(sv);
2541 SvIsUV_on(sv);
2542 } else {
2543 /* Integer is imprecise. NOK, IOKp, is UV */
2544 SvIsUV_on(sv);
2545 }
2546 }
2547 }
28e5dec8 2548#else /* NV_PRESERVES_UV */
c2988b20
NC
2549 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2550 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2551 /* The UV slot will have been set from value returned by
2552 grok_number above. The NV slot has just been set using
2553 Atof. */
560b0c46 2554 SvNOK_on(sv);
c2988b20
NC
2555 assert (SvIOKp(sv));
2556 } else {
2557 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2558 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2559 /* Small enough to preserve all bits. */
2560 (void)SvIOKp_on(sv);
2561 SvNOK_on(sv);
2562 SvIVX(sv) = I_V(SvNVX(sv));
2563 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2564 SvIOK_on(sv);
2565 /* Assumption: first non-preserved integer is < IV_MAX,
2566 this NV is in the preserved range, therefore: */
2567 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2568 < (UV)IV_MAX)) {
1779d84d 2569 Perl_croak(aTHX_ "sv_2uv assumed (U_V(fabs(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
2570 }
2571 } else
2572 sv_2iuv_non_preserve (sv, numtype);
2573 }
28e5dec8 2574#endif /* NV_PRESERVES_UV */
f7bbb42a 2575 }
ff68c719 2576 }
2577 else {
d008e5eb 2578 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2579 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1d7c1841 2580 report_uninit();
c6ee37c5 2581 }
25da4f38
IZ
2582 if (SvTYPE(sv) < SVt_IV)
2583 /* Typically the caller expects that sv_any is not NULL now. */
2584 sv_upgrade(sv, SVt_IV);
ff68c719 2585 return 0;
2586 }
25da4f38 2587
1d7c1841
GS
2588 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2589 PTR2UV(sv),SvUVX(sv)));
25da4f38 2590 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 2591}
2592
645c22ef
DM
2593/*
2594=for apidoc sv_2nv
2595
2596Return the num value of an SV, doing any necessary string or integer
2597conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
2598macros.
2599
2600=cut
2601*/
2602
65202027 2603NV
864dbfa3 2604Perl_sv_2nv(pTHX_ register SV *sv)
79072805
LW
2605{
2606 if (!sv)
2607 return 0.0;
8990e307 2608 if (SvGMAGICAL(sv)) {
463ee0b2
LW
2609 mg_get(sv);
2610 if (SvNOKp(sv))
2611 return SvNVX(sv);
a0d0e21e 2612 if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20
NC
2613 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) &&
2614 !grok_number(SvPVX(sv), SvCUR(sv), NULL))
a0d0e21e 2615 not_a_number(sv);
097ee67d 2616 return Atof(SvPVX(sv));
a0d0e21e 2617 }
25da4f38 2618 if (SvIOKp(sv)) {
1c846c1f 2619 if (SvIsUV(sv))
65202027 2620 return (NV)SvUVX(sv);
25da4f38 2621 else
65202027 2622 return (NV)SvIVX(sv);
25da4f38 2623 }
16d20bd9 2624 if (!SvROK(sv)) {
d008e5eb 2625 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2626 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1d7c1841 2627 report_uninit();
c6ee37c5 2628 }
16d20bd9
AD
2629 return 0;
2630 }
463ee0b2 2631 }
ed6116ce 2632 if (SvTHINKFIRST(sv)) {
a0d0e21e 2633 if (SvROK(sv)) {
a0d0e21e 2634 SV* tmpstr;
1554e226 2635 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2636 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2637 return SvNV(tmpstr);
56431972 2638 return PTR2NV(SvRV(sv));
a0d0e21e 2639 }
765f542d
NC
2640 if (SvIsCOW(sv)) {
2641 sv_force_normal_flags(sv, 0);
8a818333 2642 }
0336b60e 2643 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 2644 if (ckWARN(WARN_UNINITIALIZED))
1d7c1841 2645 report_uninit();
ed6116ce
LW
2646 return 0.0;
2647 }
79072805
LW
2648 }
2649 if (SvTYPE(sv) < SVt_NV) {
463ee0b2
LW
2650 if (SvTYPE(sv) == SVt_IV)
2651 sv_upgrade(sv, SVt_PVNV);
2652 else
2653 sv_upgrade(sv, SVt_NV);
906f284f 2654#ifdef USE_LONG_DOUBLE
097ee67d 2655 DEBUG_c({
f93f4e46 2656 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2657 PerlIO_printf(Perl_debug_log,
2658 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2659 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2660 RESTORE_NUMERIC_LOCAL();
2661 });
65202027 2662#else
572bbb43 2663 DEBUG_c({
f93f4e46 2664 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2665 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 2666 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2667 RESTORE_NUMERIC_LOCAL();
2668 });
572bbb43 2669#endif
79072805
LW
2670 }
2671 else if (SvTYPE(sv) < SVt_PVNV)
2672 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
2673 if (SvNOKp(sv)) {
2674 return SvNVX(sv);
61604483 2675 }
59d8ce62 2676 if (SvIOKp(sv)) {
65202027 2677 SvNVX(sv) = SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv);
28e5dec8
JH
2678#ifdef NV_PRESERVES_UV
2679 SvNOK_on(sv);
2680#else
2681 /* Only set the public NV OK flag if this NV preserves the IV */
2682 /* Check it's not 0xFFFFFFFFFFFFFFFF */
2683 if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2684 : (SvIVX(sv) == I_V(SvNVX(sv))))
2685 SvNOK_on(sv);
2686 else
2687 SvNOKp_on(sv);
2688#endif
93a17b20 2689 }
748a9306 2690 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20
NC
2691 UV value;
2692 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
2693 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !numtype)
a0d0e21e 2694 not_a_number(sv);
28e5dec8 2695#ifdef NV_PRESERVES_UV
c2988b20
NC
2696 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2697 == IS_NUMBER_IN_UV) {
5e045b90 2698 /* It's definitely an integer */
c2988b20
NC
2699 SvNVX(sv) = (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value;
2700 } else
2701 SvNVX(sv) = Atof(SvPVX(sv));
28e5dec8
JH
2702 SvNOK_on(sv);
2703#else
c2988b20 2704 SvNVX(sv) = Atof(SvPVX(sv));
28e5dec8
JH
2705 /* Only set the public NV OK flag if this NV preserves the value in
2706 the PV at least as well as an IV/UV would.
2707 Not sure how to do this 100% reliably. */
2708 /* if that shift count is out of range then Configure's test is
2709 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2710 UV_BITS */
2711 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 2712 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 2713 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
2714 } else if (!(numtype & IS_NUMBER_IN_UV)) {
2715 /* Can't use strtol etc to convert this string, so don't try.
2716 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
2717 SvNOK_on(sv);
2718 } else {
2719 /* value has been set. It may not be precise. */
2720 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2721 /* 2s complement assumption for (UV)IV_MIN */
2722 SvNOK_on(sv); /* Integer is too negative. */
2723 } else {
2724 SvNOKp_on(sv);
2725 SvIOKp_on(sv);
6fa402ec 2726
c2988b20
NC
2727 if (numtype & IS_NUMBER_NEG) {
2728 SvIVX(sv) = -(IV)value;
2729 } else if (value <= (UV)IV_MAX) {
2730 SvIVX(sv) = (IV)value;
2731 } else {
2732 SvUVX(sv) = value;
2733 SvIsUV_on(sv);
2734 }
2735
2736 if (numtype & IS_NUMBER_NOT_INT) {
2737 /* I believe that even if the original PV had decimals,
2738 they are lost beyond the limit of the FP precision.
2739 However, neither is canonical, so both only get p
2740 flags. NWC, 2000/11/25 */
2741 /* Both already have p flags, so do nothing */
2742 } else {
2743 NV nv = SvNVX(sv);
2744 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2745 if (SvIVX(sv) == I_V(nv)) {
2746 SvNOK_on(sv);
2747 SvIOK_on(sv);
2748 } else {
2749 SvIOK_on(sv);
2750 /* It had no "." so it must be integer. */
2751 }
2752 } else {
2753 /* between IV_MAX and NV(UV_MAX).
2754 Could be slightly > UV_MAX */
6fa402ec 2755
c2988b20
NC
2756 if (numtype & IS_NUMBER_NOT_INT) {
2757 /* UV and NV both imprecise. */
2758 } else {
2759 UV nv_as_uv = U_V(nv);
2760
2761 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2762 SvNOK_on(sv);
2763 SvIOK_on(sv);
2764 } else {
2765 SvIOK_on(sv);
2766 }
2767 }
2768 }
2769 }
2770 }
2771 }
28e5dec8 2772#endif /* NV_PRESERVES_UV */
93a17b20 2773 }
79072805 2774 else {
599cee73 2775 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1d7c1841 2776 report_uninit();
25da4f38
IZ
2777 if (SvTYPE(sv) < SVt_NV)
2778 /* Typically the caller expects that sv_any is not NULL now. */
28e5dec8
JH
2779 /* XXX Ilya implies that this is a bug in callers that assume this
2780 and ideally should be fixed. */
25da4f38 2781 sv_upgrade(sv, SVt_NV);
a0d0e21e 2782 return 0.0;
79072805 2783 }
572bbb43 2784#if defined(USE_LONG_DOUBLE)
097ee67d 2785 DEBUG_c({
f93f4e46 2786 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2787 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2788 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2789 RESTORE_NUMERIC_LOCAL();
2790 });
65202027 2791#else
572bbb43 2792 DEBUG_c({
f93f4e46 2793 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2794 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 2795 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2796 RESTORE_NUMERIC_LOCAL();
2797 });
572bbb43 2798#endif
463ee0b2 2799 return SvNVX(sv);
79072805
LW
2800}
2801
645c22ef
DM
2802/* asIV(): extract an integer from the string value of an SV.
2803 * Caller must validate PVX */
2804
76e3520e 2805STATIC IV
cea2e8a9 2806S_asIV(pTHX_ SV *sv)
36477c24 2807{
c2988b20
NC
2808 UV value;
2809 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
2810
2811 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2812 == IS_NUMBER_IN_UV) {
645c22ef 2813 /* It's definitely an integer */
c2988b20
NC
2814 if (numtype & IS_NUMBER_NEG) {
2815 if (value < (UV)IV_MIN)
2816 return -(IV)value;
2817 } else {
2818 if (value < (UV)IV_MAX)
2819 return (IV)value;
2820 }
2821 }
d008e5eb 2822 if (!numtype) {
d008e5eb
GS
2823 if (ckWARN(WARN_NUMERIC))
2824 not_a_number(sv);
2825 }
c2988b20 2826 return I_V(Atof(SvPVX(sv)));
36477c24 2827}
2828
645c22ef
DM
2829/* asUV(): extract an unsigned integer from the string value of an SV
2830 * Caller must validate PVX */
2831
76e3520e 2832STATIC UV
cea2e8a9 2833S_asUV(pTHX_ SV *sv)
36477c24 2834{
c2988b20
NC
2835 UV value;
2836 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
36477c24 2837
c2988b20
NC
2838 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2839 == IS_NUMBER_IN_UV) {
645c22ef 2840 /* It's definitely an integer */
6fa402ec 2841 if (!(numtype & IS_NUMBER_NEG))
c2988b20
NC
2842 return value;
2843 }
d008e5eb 2844 if (!numtype) {
d008e5eb
GS
2845 if (ckWARN(WARN_NUMERIC))
2846 not_a_number(sv);
2847 }
097ee67d 2848 return U_V(Atof(SvPVX(sv)));
36477c24 2849}
2850
645c22ef
DM
2851/*
2852=for apidoc sv_2pv_nolen
2853
2854Like C<sv_2pv()>, but doesn't return the length too. You should usually
2855use the macro wrapper C<SvPV_nolen(sv)> instead.
2856=cut
2857*/
2858
79072805 2859char *
864dbfa3 2860Perl_sv_2pv_nolen(pTHX_ register SV *sv)
1fa8b10d
JD
2861{
2862 STRLEN n_a;
2863 return sv_2pv(sv, &n_a);
2864}
2865
645c22ef
DM
2866/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2867 * UV as a string towards the end of buf, and return pointers to start and
2868 * end of it.
2869 *
2870 * We assume that buf is at least TYPE_CHARS(UV) long.
2871 */
2872
864dbfa3 2873static char *
25da4f38
IZ
2874uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
2875{
25da4f38
IZ
2876 char *ptr = buf + TYPE_CHARS(UV);
2877 char *ebuf = ptr;
2878 int sign;
25da4f38
IZ
2879
2880 if (is_uv)
2881 sign = 0;
2882 else if (iv >= 0) {
2883 uv = iv;
2884 sign = 0;
2885 } else {
2886 uv = -iv;
2887 sign = 1;
2888 }
2889 do {
eb160463 2890 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
2891 } while (uv /= 10);
2892 if (sign)
2893 *--ptr = '-';
2894 *peob = ebuf;
2895 return ptr;
2896}
2897
645c22ef
DM
2898/*
2899=for apidoc sv_2pv_flags
2900
ff276b08 2901Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
2902If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2903if necessary.
2904Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2905usually end up here too.
2906
2907=cut
2908*/
2909
8d6d96c1
HS
2910char *
2911Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
2912{
79072805
LW
2913 register char *s;
2914 int olderrno;
cb50f42d 2915 SV *tsv, *origsv;
25da4f38
IZ
2916 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
2917 char *tmpbuf = tbuf;
79072805 2918
463ee0b2
LW
2919 if (!sv) {
2920 *lp = 0;
2921 return "";
2922 }
8990e307 2923 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
2924 if (flags & SV_GMAGIC)
2925 mg_get(sv);
463ee0b2
LW
2926 if (SvPOKp(sv)) {
2927 *lp = SvCUR(sv);
2928 return SvPVX(sv);
2929 }
cf2093f6 2930 if (SvIOKp(sv)) {
1c846c1f 2931 if (SvIsUV(sv))
57def98f 2932 (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
cf2093f6 2933 else
57def98f 2934 (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
46fc3d4c 2935 tsv = Nullsv;
a0d0e21e 2936 goto tokensave;
463ee0b2
LW
2937 }
2938 if (SvNOKp(sv)) {
2d4389e4 2939 Gconvert(SvNVX(sv), NV_DIG, 0, tmpbuf);
46fc3d4c 2940 tsv = Nullsv;
a0d0e21e 2941 goto tokensave;
463ee0b2 2942 }
16d20bd9 2943 if (!SvROK(sv)) {
d008e5eb 2944 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2945 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1d7c1841 2946 report_uninit();
c6ee37c5 2947 }
16d20bd9
AD
2948 *lp = 0;
2949 return "";
2950 }
463ee0b2 2951 }
ed6116ce
LW
2952 if (SvTHINKFIRST(sv)) {
2953 if (SvROK(sv)) {
a0d0e21e 2954 SV* tmpstr;
1554e226 2955 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)) &&
b4b9a328 2956 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
446eaa42
YST
2957 char *pv = SvPV(tmpstr, *lp);
2958 if (SvUTF8(tmpstr))
2959 SvUTF8_on(sv);
2960 else
2961 SvUTF8_off(sv);
2962 return pv;
2963 }
cb50f42d 2964 origsv = sv;
ed6116ce
LW
2965 sv = (SV*)SvRV(sv);
2966 if (!sv)
2967 s = "NULLREF";
2968 else {
f9277f47
IZ
2969 MAGIC *mg;
2970
ed6116ce 2971 switch (SvTYPE(sv)) {
f9277f47
IZ
2972 case SVt_PVMG:
2973 if ( ((SvFLAGS(sv) &
1c846c1f 2974 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
3149a8e4 2975 == (SVs_OBJECT|SVs_RMG))
14befaf4 2976 && (mg = mg_find(sv, PERL_MAGIC_qr))) {
2cd61cdb 2977 regexp *re = (regexp *)mg->mg_obj;
1bd3ad17 2978
2cd61cdb 2979 if (!mg->mg_ptr) {
8782bef2
GB
2980 char *fptr = "msix";
2981 char reflags[6];
2982 char ch;
2983 int left = 0;
2984 int right = 4;
ff385a1b 2985 char need_newline = 0;
eb160463 2986 U16 reganch = (U16)((re->reganch & PMf_COMPILETIME) >> 12);
8782bef2 2987
155aba94 2988 while((ch = *fptr++)) {
8782bef2
GB
2989 if(reganch & 1) {
2990 reflags[left++] = ch;
2991 }
2992 else {
2993 reflags[right--] = ch;
2994 }
2995 reganch >>= 1;
2996 }
2997 if(left != 4) {
2998 reflags[left] = '-';
2999 left = 5;
3000 }
3001
3002 mg->mg_len = re->prelen + 4 + left;
ff385a1b
JF
3003 /*
3004 * If /x was used, we have to worry about a regex
3005 * ending with a comment later being embedded
3006 * within another regex. If so, we don't want this
3007 * regex's "commentization" to leak out to the
3008 * right part of the enclosing regex, we must cap
3009 * it with a newline.
3010 *
3011 * So, if /x was used, we scan backwards from the
3012 * end of the regex. If we find a '#' before we
3013 * find a newline, we need to add a newline
3014 * ourself. If we find a '\n' first (or if we
3015 * don't find '#' or '\n'), we don't need to add
3016 * anything. -jfriedl
3017 */
3018 if (PMf_EXTENDED & re->reganch)
3019 {
3020 char *endptr = re->precomp + re->prelen;
3021 while (endptr >= re->precomp)
3022 {
3023 char c = *(endptr--);
3024 if (c == '\n')
3025 break; /* don't need another */
3026 if (c == '#') {
3027 /* we end while in a comment, so we
3028 need a newline */
3029 mg->mg_len++; /* save space for it */
3030 need_newline = 1; /* note to add it */
ab01544f 3031 break;
ff385a1b
JF
3032 }
3033 }
3034 }
3035
8782bef2
GB
3036 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
3037 Copy("(?", mg->mg_ptr, 2, char);
3038 Copy(reflags, mg->mg_ptr+2, left, char);
3039 Copy(":", mg->mg_ptr+left+2, 1, char);
3040 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
ff385a1b
JF
3041 if (need_newline)
3042 mg->mg_ptr[mg->mg_len - 2] = '\n';
1bd3ad17
IZ
3043 mg->mg_ptr[mg->mg_len - 1] = ')';
3044 mg->mg_ptr[mg->mg_len] = 0;
3045 }
3280af22 3046 PL_reginterp_cnt += re->program[0].next_off;
cb50f42d
YST
3047
3048 if (re->reganch & ROPT_UTF8)
3049 SvUTF8_on(origsv);
3050 else
3051 SvUTF8_off(origsv);
1bd3ad17
IZ
3052 *lp = mg->mg_len;
3053 return mg->mg_ptr;
f9277f47
IZ
3054 }
3055 /* Fall through */
ed6116ce
LW
3056 case SVt_NULL:
3057 case SVt_IV:
3058 case SVt_NV:
3059 case SVt_RV:
3060 case SVt_PV:
3061 case SVt_PVIV:
3062 case SVt_PVNV:
81689caa
HS
3063 case SVt_PVBM: if (SvROK(sv))
3064 s = "REF";
3065 else
3066 s = "SCALAR"; break;
ed6116ce
LW
3067 case SVt_PVLV: s = "LVALUE"; break;
3068 case SVt_PVAV: s = "ARRAY"; break;
3069 case SVt_PVHV: s = "HASH"; break;
3070 case SVt_PVCV: s = "CODE"; break;
3071 case SVt_PVGV: s = "GLOB"; break;
1d2dff63 3072 case SVt_PVFM: s = "FORMAT"; break;
36477c24 3073 case SVt_PVIO: s = "IO"; break;
ed6116ce
LW
3074 default: s = "UNKNOWN"; break;
3075 }
46fc3d4c 3076 tsv = NEWSV(0,0);
de11ba31
AMS
3077 if (SvOBJECT(sv))
3078 Perl_sv_setpvf(aTHX_ tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
ed6116ce 3079 else
46fc3d4c 3080 sv_setpv(tsv, s);
57def98f 3081 Perl_sv_catpvf(aTHX_ tsv, "(0x%"UVxf")", PTR2UV(sv));
a0d0e21e 3082 goto tokensaveref;
463ee0b2 3083 }
ed6116ce
LW
3084 *lp = strlen(s);
3085 return s;
79072805 3086 }
0336b60e 3087 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 3088 if (ckWARN(WARN_UNINITIALIZED))
1d7c1841 3089 report_uninit();
ed6116ce
LW
3090 *lp = 0;
3091 return "";
79072805 3092 }
79072805 3093 }
28e5dec8
JH
3094 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
3095 /* I'm assuming that if both IV and NV are equally valid then
3096 converting the IV is going to be more efficient */
3097 U32 isIOK = SvIOK(sv);
3098 U32 isUIOK = SvIsUV(sv);
3099 char buf[TYPE_CHARS(UV)];
3100 char *ebuf, *ptr;
3101
3102 if (SvTYPE(sv) < SVt_PVIV)
3103 sv_upgrade(sv, SVt_PVIV);
3104 if (isUIOK)
3105 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
3106 else
3107 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
eb160463 3108 SvGROW(sv, (STRLEN)(ebuf - ptr + 1)); /* inlined from sv_setpvn */
28e5dec8
JH
3109 Move(ptr,SvPVX(sv),ebuf - ptr,char);
3110 SvCUR_set(sv, ebuf - ptr);
3111 s = SvEND(sv);
3112 *s = '\0';
3113 if (isIOK)
3114 SvIOK_on(sv);
3115 else
3116 SvIOKp_on(sv);
3117 if (isUIOK)
3118 SvIsUV_on(sv);
3119 }
3120 else if (SvNOKp(sv)) {
79072805
LW
3121 if (SvTYPE(sv) < SVt_PVNV)
3122 sv_upgrade(sv, SVt_PVNV);
1c846c1f 3123 /* The +20 is pure guesswork. Configure test needed. --jhi */
59155cc0 3124 SvGROW(sv, NV_DIG + 20);
463ee0b2 3125 s = SvPVX(sv);
79072805 3126 olderrno = errno; /* some Xenix systems wipe out errno here */
79072805 3127#ifdef apollo
463ee0b2 3128 if (SvNVX(sv) == 0.0)
79072805
LW
3129 (void)strcpy(s,"0");
3130 else
3131#endif /*apollo*/
bbce6d69 3132 {
2d4389e4 3133 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 3134 }
79072805 3135 errno = olderrno;
a0d0e21e
LW
3136#ifdef FIXNEGATIVEZERO
3137 if (*s == '-' && s[1] == '0' && !s[2])
3138 strcpy(s,"0");
3139#endif
79072805
LW
3140 while (*s) s++;
3141#ifdef hcx
3142 if (s[-1] == '.')
46fc3d4c 3143 *--s = '\0';
79072805
LW
3144#endif
3145 }
79072805 3146 else {
0336b60e
IZ
3147 if (ckWARN(WARN_UNINITIALIZED)
3148 && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1d7c1841 3149 report_uninit();
a0d0e21e 3150 *lp = 0;
25da4f38
IZ
3151 if (SvTYPE(sv) < SVt_PV)
3152 /* Typically the caller expects that sv_any is not NULL now. */
3153 sv_upgrade(sv, SVt_PV);
a0d0e21e 3154 return "";
79072805 3155 }
463ee0b2
LW
3156 *lp = s - SvPVX(sv);
3157 SvCUR_set(sv, *lp);
79072805 3158 SvPOK_on(sv);
1d7c1841
GS
3159 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3160 PTR2UV(sv),SvPVX(sv)));
463ee0b2 3161 return SvPVX(sv);
a0d0e21e
LW
3162
3163 tokensave:
3164 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
3165 /* Sneaky stuff here */
3166
3167 tokensaveref:
46fc3d4c 3168 if (!tsv)
96827780 3169 tsv = newSVpv(tmpbuf, 0);
46fc3d4c 3170 sv_2mortal(tsv);
3171 *lp = SvCUR(tsv);
3172 return SvPVX(tsv);
a0d0e21e
LW
3173 }
3174 else {
3175 STRLEN len;
46fc3d4c 3176 char *t;
3177
3178 if (tsv) {
3179 sv_2mortal(tsv);
3180 t = SvPVX(tsv);
3181 len = SvCUR(tsv);
3182 }
3183 else {
96827780
MB
3184 t = tmpbuf;
3185 len = strlen(tmpbuf);
46fc3d4c 3186 }
a0d0e21e 3187#ifdef FIXNEGATIVEZERO
46fc3d4c 3188 if (len == 2 && t[0] == '-' && t[1] == '0') {
3189 t = "0";
3190 len = 1;
3191 }
a0d0e21e
LW
3192#endif
3193 (void)SvUPGRADE(sv, SVt_PV);
46fc3d4c 3194 *lp = len;
a0d0e21e
LW
3195 s = SvGROW(sv, len + 1);
3196 SvCUR_set(sv, len);
46fc3d4c 3197 (void)strcpy(s, t);
6bf554b4 3198 SvPOKp_on(sv);
a0d0e21e
LW
3199 return s;
3200 }
463ee0b2
LW
3201}
3202
645c22ef 3203/*
6050d10e
JP
3204=for apidoc sv_copypv
3205
3206Copies a stringified representation of the source SV into the
3207destination SV. Automatically performs any necessary mg_get and
54f0641b 3208coercion of numeric values into strings. Guaranteed to preserve
6050d10e 3209UTF-8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
3210sv_2pv[_flags] but operates directly on an SV instead of just the
3211string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
3212would lose the UTF-8'ness of the PV.
3213
3214=cut
3215*/
3216
3217void
3218Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
3219{
446eaa42
YST
3220 STRLEN len;
3221 char *s;
3222 s = SvPV(ssv,len);
cb50f42d 3223 sv_setpvn(dsv,s,len);
446eaa42 3224 if (SvUTF8(ssv))
cb50f42d 3225 SvUTF8_on(dsv);
446eaa42 3226 else
cb50f42d 3227 SvUTF8_off(dsv);
6050d10e
JP
3228}
3229
3230/*
645c22ef
DM
3231=for apidoc sv_2pvbyte_nolen
3232
3233Return a pointer to the byte-encoded representation of the SV.
3234May cause the SV to be downgraded from UTF8 as a side-effect.
3235
3236Usually accessed via the C<SvPVbyte_nolen> macro.
3237
3238=cut
3239*/
3240
7340a771
GS
3241char *
3242Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
3243{
560a288e
GS
3244 STRLEN n_a;
3245 return sv_2pvbyte(sv, &n_a);
7340a771
GS
3246}
3247
645c22ef
DM
3248/*
3249=for apidoc sv_2pvbyte
3250
3251Return a pointer to the byte-encoded representation of the SV, and set *lp
3252to its length. May cause the SV to be downgraded from UTF8 as a
3253side-effect.
3254
3255Usually accessed via the C<SvPVbyte> macro.
3256
3257=cut
3258*/
3259
7340a771
GS
3260char *
3261Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
3262{
0875d2fe
NIS
3263 sv_utf8_downgrade(sv,0);
3264 return SvPV(sv,*lp);
7340a771
GS
3265}
3266
645c22ef
DM
3267/*
3268=for apidoc sv_2pvutf8_nolen
3269
3270Return a pointer to the UTF8-encoded representation of the SV.
3271May cause the SV to be upgraded to UTF8 as a side-effect.
3272
3273Usually accessed via the C<SvPVutf8_nolen> macro.
3274
3275=cut
3276*/
3277
7340a771
GS
3278char *
3279Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
3280{
560a288e
GS
3281 STRLEN n_a;
3282 return sv_2pvutf8(sv, &n_a);
7340a771
GS
3283}
3284
645c22ef
DM
3285/*
3286=for apidoc sv_2pvutf8
3287
3288Return a pointer to the UTF8-encoded representation of the SV, and set *lp
3289to its length. May cause the SV to be upgraded to UTF8 as a side-effect.
3290
3291Usually accessed via the C<SvPVutf8> macro.
3292
3293=cut
3294*/
3295
7340a771
GS
3296char *
3297Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
3298{
560a288e 3299 sv_utf8_upgrade(sv);
7d59b7e4 3300 return SvPV(sv,*lp);
7340a771 3301}
1c846c1f 3302
645c22ef
DM
3303/*
3304=for apidoc sv_2bool
3305
3306This function is only called on magical items, and is only used by
8cf8f3d1 3307sv_true() or its macro equivalent.
645c22ef
DM
3308
3309=cut
3310*/
3311
463ee0b2 3312bool
864dbfa3 3313Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 3314{
8990e307 3315 if (SvGMAGICAL(sv))
463ee0b2
LW
3316 mg_get(sv);
3317
a0d0e21e
LW
3318 if (!SvOK(sv))
3319 return 0;
3320 if (SvROK(sv)) {
a0d0e21e 3321 SV* tmpsv;
1554e226 3322 if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
9e3013b1 3323 (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
8a31060d 3324 return (bool)SvTRUE(tmpsv);
a0d0e21e
LW
3325 return SvRV(sv) != 0;
3326 }
463ee0b2 3327 if (SvPOKp(sv)) {
11343788
MB
3328 register XPV* Xpvtmp;
3329 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
3330 (*Xpvtmp->xpv_pv > '0' ||
3331 Xpvtmp->xpv_cur > 1 ||
3332 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
463ee0b2
LW
3333 return 1;
3334 else
3335 return 0;
3336 }
3337 else {
3338 if (SvIOKp(sv))
3339 return SvIVX(sv) != 0;
3340 else {
3341 if (SvNOKp(sv))
3342 return SvNVX(sv) != 0.0;
3343 else
3344 return FALSE;
3345 }
3346 }
79072805
LW
3347}
3348
c461cf8f
JH
3349/*
3350=for apidoc sv_utf8_upgrade
3351
3352Convert the PV of an SV to its UTF8-encoded form.
645c22ef 3353Forces the SV to string form if it is not already.
4411f3b6
NIS
3354Always sets the SvUTF8 flag to avoid future validity checks even
3355if all the bytes have hibit clear.
c461cf8f 3356
13a6c0e0
JH
3357This is not as a general purpose byte encoding to Unicode interface:
3358use the Encode extension for that.
3359
8d6d96c1
HS
3360=for apidoc sv_utf8_upgrade_flags
3361
3362Convert the PV of an SV to its UTF8-encoded form.
645c22ef 3363Forces the SV to string form if it is not already.
8d6d96c1
HS
3364Always sets the SvUTF8 flag to avoid future validity checks even
3365if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
3366will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
3367C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3368
13a6c0e0
JH
3369This is not as a general purpose byte encoding to Unicode interface:
3370use the Encode extension for that.
3371
8d6d96c1
HS
3372=cut
3373*/
3374
3375STRLEN
3376Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
3377{
db42d148 3378 U8 *s, *t, *e;
511c2ff0 3379 int hibit = 0;
560a288e 3380
4411f3b6
NIS
3381 if (!sv)
3382 return 0;
3383
e0e62c2a
NIS
3384 if (!SvPOK(sv)) {
3385 STRLEN len = 0;
8d6d96c1 3386 (void) sv_2pv_flags(sv,&len, flags);
e0e62c2a
NIS
3387 if (!SvPOK(sv))
3388 return len;
3389 }
4411f3b6
NIS
3390
3391 if (SvUTF8(sv))
3392 return SvCUR(sv);
560a288e 3393
765f542d
NC
3394 if (SvIsCOW(sv)) {
3395 sv_force_normal_flags(sv, 0);
db42d148
NIS
3396 }
3397
9f4817db 3398 if (PL_encoding)
799ef3cb 3399 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 3400 else { /* Assume Latin-1/EBCDIC */
0a378802
JH
3401 /* This function could be much more efficient if we
3402 * had a FLAG in SVs to signal if there are any hibit
3403 * chars in the PV. Given that there isn't such a flag
3404 * make the loop as fast as possible. */
3405 s = (U8 *) SvPVX(sv);
3406 e = (U8 *) SvEND(sv);
3407 t = s;
3408 while (t < e) {
3409 U8 ch = *t++;
3410 if ((hibit = !NATIVE_IS_INVARIANT(ch)))
3411 break;
3412 }
3413 if (hibit) {
3414 STRLEN len;
ecdeb87c 3415
0a378802
JH
3416 len = SvCUR(sv) + 1; /* Plus the \0 */
3417 SvPVX(sv) = (char*)bytes_to_utf8((U8*)s, &len);
3418 SvCUR(sv) = len - 1;
3419 if (SvLEN(sv) != 0)
3420 Safefree(s); /* No longer using what was there before. */
3421 SvLEN(sv) = len; /* No longer know the real size. */
3422 }
9f4817db
JH
3423 /* Mark as UTF-8 even if no hibit - saves scanning loop */
3424 SvUTF8_on(sv);
560a288e 3425 }
4411f3b6 3426 return SvCUR(sv);
560a288e
GS
3427}
3428
c461cf8f
JH
3429/*
3430=for apidoc sv_utf8_downgrade
3431
3432Attempt to convert the PV of an SV from UTF8-encoded to byte encoding.
3433This may not be possible if the PV contains non-byte encoding characters;
3434if this is the case, either returns false or, if C<fail_ok> is not
3435true, croaks.
3436
13a6c0e0
JH
3437This is not as a general purpose Unicode to byte encoding interface:
3438use the Encode extension for that.
3439
c461cf8f
JH
3440=cut
3441*/
3442
560a288e
GS
3443bool
3444Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
3445{
3446 if (SvPOK(sv) && SvUTF8(sv)) {
fa301091 3447 if (SvCUR(sv)) {
03cfe0ae 3448 U8 *s;
652088fc 3449 STRLEN len;
fa301091 3450
765f542d
NC
3451 if (SvIsCOW(sv)) {
3452 sv_force_normal_flags(sv, 0);
3453 }
03cfe0ae
NIS
3454 s = (U8 *) SvPV(sv, len);
3455 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
3456 if (fail_ok)
3457 return FALSE;
3458 else {
3459 if (PL_op)
3460 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 3461 OP_DESC(PL_op));
fa301091
JH
3462 else
3463 Perl_croak(aTHX_ "Wide character");
3464 }
4b3603a4 3465 }
fa301091 3466 SvCUR(sv) = len;
67e989fb 3467 }
560a288e 3468 }
ffebcc3e 3469 SvUTF8_off(sv);
560a288e
GS
3470 return TRUE;
3471}
3472
c461cf8f
JH
3473/*
3474=for apidoc sv_utf8_encode
3475
3476Convert the PV of an SV to UTF8-encoded, but then turn off the C<SvUTF8>
4411f3b6
NIS
3477flag so that it looks like octets again. Used as a building block
3478for encode_utf8 in Encode.xs
c461cf8f
JH
3479
3480=cut
3481*/
3482
560a288e
GS
3483void
3484Perl_sv_utf8_encode(pTHX_ register SV *sv)
3485{
4411f3b6 3486 (void) sv_utf8_upgrade(sv);
560a288e
GS
3487 SvUTF8_off(sv);
3488}
3489
4411f3b6
NIS
3490/*
3491=for apidoc sv_utf8_decode
3492
3493Convert the octets in the PV from UTF-8 to chars. Scan for validity and then
645c22ef 3494turn off SvUTF8 if needed so that we see characters. Used as a building block
4411f3b6
NIS
3495for decode_utf8 in Encode.xs
3496
3497=cut
3498*/
3499
560a288e
GS
3500bool
3501Perl_sv_utf8_decode(pTHX_ register SV *sv)
3502{
3503 if (SvPOK(sv)) {
63cd0674
NIS
3504 U8 *c;
3505 U8 *e;
9cbac4c7 3506
645c22ef
DM
3507 /* The octets may have got themselves encoded - get them back as
3508 * bytes
3509 */
3510 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
3511 return FALSE;
3512
3513 /* it is actually just a matter of turning the utf8 flag on, but
3514 * we want to make sure everything inside is valid utf8 first.
3515 */
63cd0674
NIS
3516 c = (U8 *) SvPVX(sv);
3517 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 3518 return FALSE;
63cd0674 3519 e = (U8 *) SvEND(sv);
511c2ff0 3520 while (c < e) {
c4d5f83a
NIS
3521 U8 ch = *c++;
3522 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
3523 SvUTF8_on(sv);
3524 break;
3525 }
560a288e 3526 }
560a288e
GS
3527 }
3528 return TRUE;
3529}
3530
954c1994
GS
3531/*
3532=for apidoc sv_setsv
3533
645c22ef
DM
3534Copies the contents of the source SV C<ssv> into the destination SV
3535C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3536function if the source SV needs to be reused. Does not handle 'set' magic.
3537Loosely speaking, it performs a copy-by-value, obliterating any previous
3538content of the destination.
3539
3540You probably want to use one of the assortment of wrappers, such as
3541C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3542C<SvSetMagicSV_nosteal>.
3543
8d6d96c1
HS
3544=for apidoc sv_setsv_flags
3545
645c22ef
DM
3546Copies the contents of the source SV C<ssv> into the destination SV
3547C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3548function if the source SV needs to be reused. Does not handle 'set' magic.
3549Loosely speaking, it performs a copy-by-value, obliterating any previous
3550content of the destination.
3551If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
3552C<ssv> if appropriate, else not. C<sv_setsv> and C<sv_setsv_nomg> are
3553implemented in terms of this function.
3554
3555You probably want to use one of the assortment of wrappers, such as
3556C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3557C<SvSetMagicSV_nosteal>.
3558
3559This is the primary function for copying scalars, and most other
3560copy-ish functions and macros use this underneath.
8d6d96c1
HS
3561
3562=cut
3563*/
3564
3565void
3566Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
3567{
8990e307
LW
3568 register U32 sflags;
3569 register int dtype;
3570 register int stype;
463ee0b2 3571
79072805
LW
3572 if (sstr == dstr)
3573 return;
765f542d 3574 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 3575 if (!sstr)
3280af22 3576 sstr = &PL_sv_undef;
8990e307
LW
3577 stype = SvTYPE(sstr);
3578 dtype = SvTYPE(dstr);
79072805 3579
a0d0e21e 3580 SvAMAGIC_off(dstr);
ece467f9
JP
3581 if ( SvVOK(dstr) )
3582 {
3583 /* need to nuke the magic */
3584 mg_free(dstr);
3585 SvRMAGICAL_off(dstr);
3586 }
9e7bc3e8 3587
463ee0b2 3588 /* There's a lot of redundancy below but we're going for speed here */
79072805 3589
8990e307 3590 switch (stype) {
79072805 3591 case SVt_NULL:
aece5585 3592 undef_sstr:
20408e3c
GS
3593 if (dtype != SVt_PVGV) {
3594 (void)SvOK_off(dstr);
3595 return;
3596 }
3597 break;
463ee0b2 3598 case SVt_IV:
aece5585
GA
3599 if (SvIOK(sstr)) {
3600 switch (dtype) {
3601 case SVt_NULL:
8990e307 3602 sv_upgrade(dstr, SVt_IV);
aece5585
GA
3603 break;
3604 case SVt_NV:
8990e307 3605 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
3606 break;
3607 case SVt_RV:
3608 case SVt_PV:
a0d0e21e 3609 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
3610 break;
3611 }
3612 (void)SvIOK_only(dstr);
3613 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
3614 if (SvIsUV(sstr))
3615 SvIsUV_on(dstr);
27c9684d
AP
3616 if (SvTAINTED(sstr))
3617 SvTAINT(dstr);
aece5585 3618 return;
8990e307 3619 }
aece5585
GA
3620 goto undef_sstr;
3621
463ee0b2 3622 case SVt_NV:
aece5585
GA
3623 if (SvNOK(sstr)) {
3624 switch (dtype) {
3625 case SVt_NULL:
3626 case SVt_IV:
8990e307 3627 sv_upgrade(dstr, SVt_NV);
aece5585
GA
3628 break;
3629 case SVt_RV:
3630 case SVt_PV:
3631 case SVt_PVIV:
a0d0e21e 3632 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
3633 break;
3634 }
3635 SvNVX(dstr) = SvNVX(sstr);
3636 (void)SvNOK_only(dstr);
27c9684d
AP
3637 if (SvTAINTED(sstr))
3638 SvTAINT(dstr);
aece5585 3639 return;
8990e307 3640 }
aece5585
GA
3641 goto undef_sstr;
3642
ed6116ce 3643 case SVt_RV:
8990e307 3644 if (dtype < SVt_RV)
ed6116ce 3645 sv_upgrade(dstr, SVt_RV);
c07a80fd 3646 else if (dtype == SVt_PVGV &&
3647 SvTYPE(SvRV(sstr)) == SVt_PVGV) {
3648 sstr = SvRV(sstr);
a5f75d66 3649 if (sstr == dstr) {
1d7c1841
GS
3650 if (GvIMPORTED(dstr) != GVf_IMPORTED
3651 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3652 {
a5f75d66 3653 GvIMPORTED_on(dstr);
1d7c1841 3654 }
a5f75d66
AD
3655 GvMULTI_on(dstr);
3656 return;
3657 }
c07a80fd 3658 goto glob_assign;
3659 }
ed6116ce 3660 break;
463ee0b2 3661 case SVt_PV:
fc36a67e 3662 case SVt_PVFM:
8990e307 3663 if (dtype < SVt_PV)
463ee0b2 3664 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
3665 break;
3666 case SVt_PVIV:
8990e307 3667 if (dtype < SVt_PVIV)
463ee0b2 3668 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
3669 break;
3670 case SVt_PVNV:
8990e307 3671 if (dtype < SVt_PVNV)
463ee0b2 3672 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 3673 break;
4633a7c4
LW
3674 case SVt_PVAV:
3675 case SVt_PVHV:
3676 case SVt_PVCV:
4633a7c4 3677 case SVt_PVIO:
533c011a 3678 if (PL_op)
cea2e8a9 3679 Perl_croak(aTHX_ "Bizarre copy of %s in %s", sv_reftype(sstr, 0),
53e06cf0 3680 OP_NAME(PL_op));
4633a7c4 3681 else
cea2e8a9 3682 Perl_croak(aTHX_ "Bizarre copy of %s", sv_reftype(sstr, 0));
4633a7c4
LW
3683 break;
3684
79072805 3685 case SVt_PVGV:
8990e307 3686 if (dtype <= SVt_PVGV) {
c07a80fd 3687 glob_assign:
a5f75d66 3688 if (dtype != SVt_PVGV) {
a0d0e21e
LW
3689 char *name = GvNAME(sstr);
3690 STRLEN len = GvNAMELEN(sstr);
463ee0b2 3691 sv_upgrade(dstr, SVt_PVGV);
14befaf4 3692 sv_magic(dstr, dstr, PERL_MAGIC_glob, Nullch, 0);
85aff577 3693 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
3694 GvNAME(dstr) = savepvn(name, len);
3695 GvNAMELEN(dstr) = len;
3696 SvFAKE_on(dstr); /* can coerce to non-glob */
3697 }
7bac28a0 3698 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
3699 else if (PL_curstackinfo->si_type == PERLSI_SORT
3700 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
cea2e8a9 3701 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
7bac28a0 3702 GvNAME(dstr));
5bd07a3d 3703
7fb37951
AMS
3704#ifdef GV_UNIQUE_CHECK
3705 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
3706 Perl_croak(aTHX_ PL_no_modify);
3707 }
3708#endif
3709
a0d0e21e 3710 (void)SvOK_off(dstr);
a5f75d66 3711 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 3712 gp_free((GV*)dstr);
79072805 3713 GvGP(dstr) = gp_ref(GvGP(sstr));
27c9684d
AP
3714 if (SvTAINTED(sstr))
3715 SvTAINT(dstr);
1d7c1841
GS
3716 if (GvIMPORTED(dstr) != GVf_IMPORTED
3717 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3718 {
a5f75d66 3719 GvIMPORTED_on(dstr);
1d7c1841 3720 }
a5f75d66 3721 GvMULTI_on(dstr);
79072805
LW
3722 return;
3723 }
3724 /* FALL THROUGH */
3725
3726 default:
8d6d96c1 3727 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 3728 mg_get(sstr);
eb160463 3729 if ((int)SvTYPE(sstr) != stype) {
973f89ab
CS
3730 stype = SvTYPE(sstr);
3731 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
3732 goto glob_assign;
3733 }
3734 }
ded42b9f 3735 if (stype == SVt_PVLV)
6fc92669 3736 (void)SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 3737 else
eb160463 3738 (void)SvUPGRADE(dstr, (U32)stype);
79072805
LW
3739 }
3740
8990e307
LW
3741 sflags = SvFLAGS(sstr);
3742
3743 if (sflags & SVf_ROK) {
3744 if (dtype >= SVt_PV) {
3745 if (dtype == SVt_PVGV) {
3746 SV *sref = SvREFCNT_inc(SvRV(sstr));
3747 SV *dref = 0;
a5f75d66 3748 int intro = GvINTRO(dstr);
a0d0e21e 3749
7fb37951
AMS
3750#ifdef GV_UNIQUE_CHECK
3751 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
3752 Perl_croak(aTHX_ PL_no_modify);
3753 }
3754#endif
3755
a0d0e21e 3756 if (intro) {
a5f75d66 3757 GvINTRO_off(dstr); /* one-shot flag */
1d7c1841 3758 GvLINE(dstr) = CopLINE(PL_curcop);
1edc1566 3759 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 3760 }
a5f75d66 3761 GvMULTI_on(dstr);
8990e307
LW
3762 switch (SvTYPE(sref)) {
3763 case SVt_PVAV:
a0d0e21e
LW
3764 if (intro)
3765 SAVESPTR(GvAV(dstr));
3766 else
3767 dref = (SV*)GvAV(dstr);
8990e307 3768 GvAV(dstr) = (AV*)sref;
39bac7f7 3769 if (!GvIMPORTED_AV(dstr)
1d7c1841
GS
3770 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3771 {
a5f75d66 3772 GvIMPORTED_AV_on(dstr);
1d7c1841 3773 }
8990e307
LW
3774 break;
3775 case SVt_PVHV:
a0d0e21e
LW
3776 if (intro)
3777 SAVESPTR(GvHV(dstr));
3778 else
3779 dref = (SV*)GvHV(dstr);
8990e307 3780 GvHV(dstr) = (HV*)sref;
39bac7f7 3781 if (!GvIMPORTED_HV(dstr)
1d7c1841
GS
3782 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3783 {
a5f75d66 3784 GvIMPORTED_HV_on(dstr);
1d7c1841 3785 }
8990e307
LW
3786 break;
3787 case SVt_PVCV:
8ebc5c01 3788 if (intro) {
3789 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
3790 SvREFCNT_dec(GvCV(dstr));
3791 GvCV(dstr) = Nullcv;
68dc0745 3792 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 3793 PL_sub_generation++;
8ebc5c01 3794 }
a0d0e21e 3795 SAVESPTR(GvCV(dstr));
8ebc5c01 3796 }
68dc0745 3797 else
3798 dref = (SV*)GvCV(dstr);
3799 if (GvCV(dstr) != (CV*)sref) {
748a9306 3800 CV* cv = GvCV(dstr);
4633a7c4 3801 if (cv) {
68dc0745 3802 if (!GvCVGEN((GV*)dstr) &&
3803 (CvROOT(cv) || CvXSUB(cv)))
3804 {
7bac28a0 3805 /* ahem, death to those who redefine
3806 * active sort subs */
3280af22
NIS
3807 if (PL_curstackinfo->si_type == PERLSI_SORT &&
3808 PL_sortcop == CvSTART(cv))
1c846c1f 3809 Perl_croak(aTHX_
7bac28a0 3810 "Can't redefine active sort subroutine %s",
3811 GvENAME((GV*)dstr));
beab0874
JT
3812 /* Redefining a sub - warning is mandatory if
3813 it was a const and its value changed. */
3814 if (ckWARN(WARN_REDEFINE)
3815 || (CvCONST(cv)
3816 && (!CvCONST((CV*)sref)
3817 || sv_cmp(cv_const_sv(cv),
3818 cv_const_sv((CV*)sref)))))
3819 {
9014280d 3820 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
beab0874 3821 CvCONST(cv)
910764e6
RGS
3822 ? "Constant subroutine %s::%s redefined"
3823 : "Subroutine %s::%s redefined",
3824 HvNAME(GvSTASH((GV*)dstr)),
beab0874
JT
3825 GvENAME((GV*)dstr));
3826 }
9607fc9c 3827 }
fb24441d
RGS
3828 if (!intro)
3829 cv_ckproto(cv, (GV*)dstr,
3830 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 3831 }
a5f75d66 3832 GvCV(dstr) = (CV*)sref;
7a4c00b4 3833 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 3834 GvASSUMECV_on(dstr);
3280af22 3835 PL_sub_generation++;
a5f75d66 3836 }
39bac7f7 3837 if (!GvIMPORTED_CV(dstr)
1d7c1841
GS
3838 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3839 {
a5f75d66 3840 GvIMPORTED_CV_on(dstr);
1d7c1841 3841 }
8990e307 3842 break;
91bba347
LW
3843 case SVt_PVIO:
3844 if (intro)
3845 SAVESPTR(GvIOp(dstr));
3846 else
3847 dref = (SV*)GvIOp(dstr);
3848 GvIOp(dstr) = (IO*)sref;
3849 break;
f4d13ee9
JH
3850 case SVt_PVFM:
3851 if (intro)
3852 SAVESPTR(GvFORM(dstr));
3853 else
3854 dref = (SV*)GvFORM(dstr);
3855 GvFORM(dstr) = (CV*)sref;
3856 break;
8990e307 3857 default:
a0d0e21e
LW
3858 if (intro)
3859 SAVESPTR(GvSV(dstr));
3860 else
3861 dref = (SV*)GvSV(dstr);
8990e307 3862 GvSV(dstr) = sref;
39bac7f7 3863 if (!GvIMPORTED_SV(dstr)
1d7c1841
GS
3864 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3865 {
a5f75d66 3866 GvIMPORTED_SV_on(dstr);
1d7c1841 3867 }
8990e307
LW
3868 break;
3869 }
3870 if (dref)
3871 SvREFCNT_dec(dref);
a0d0e21e
LW
3872 if (intro)
3873 SAVEFREESV(sref);
27c9684d
AP
3874 if (SvTAINTED(sstr))
3875 SvTAINT(dstr);
8990e307
LW
3876 return;
3877 }
a0d0e21e 3878 if (SvPVX(dstr)) {
760ac839 3879 (void)SvOOK_off(dstr); /* backoff */
50483b2c
JD
3880 if (SvLEN(dstr))
3881 Safefree(SvPVX(dstr));
a0d0e21e
LW
3882 SvLEN(dstr)=SvCUR(dstr)=0;
3883 }
8990e307 3884 }
a0d0e21e 3885 (void)SvOK_off(dstr);
8990e307 3886 SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
ed6116ce 3887 SvROK_on(dstr);
8990e307 3888 if (sflags & SVp_NOK) {
3332b3c1
JH
3889 SvNOKp_on(dstr);
3890 /* Only set the public OK flag if the source has public OK. */
3891 if (sflags & SVf_NOK)
3892 SvFLAGS(dstr) |= SVf_NOK;
ed6116ce
LW
3893 SvNVX(dstr) = SvNVX(sstr);
3894 }
8990e307 3895 if (sflags & SVp_IOK) {
3332b3c1
JH
3896 (void)SvIOKp_on(dstr);
3897 if (sflags & SVf_IOK)
3898 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 3899 if (sflags & SVf_IVisUV)
25da4f38 3900 SvIsUV_on(dstr);
3332b3c1 3901 SvIVX(dstr) = SvIVX(sstr);
ed6116ce 3902 }
a0d0e21e
LW
3903 if (SvAMAGIC(sstr)) {
3904 SvAMAGIC_on(dstr);
3905 }
ed6116ce 3906 }
8990e307 3907 else if (sflags & SVp_POK) {
765f542d 3908 bool isSwipe = 0;
79072805
LW
3909
3910 /*
3911 * Check to see if we can just swipe the string. If so, it's a
3912 * possible small lose on short strings, but a big win on long ones.
463ee0b2
LW
3913 * It might even be a win on short strings if SvPVX(dstr)
3914 * has to be allocated and SvPVX(sstr) has to be freed.
79072805
LW
3915 */
3916
765f542d
NC
3917 if (
3918#ifdef PERL_COPY_ON_WRITE
3919 (sflags & (SVf_FAKE | SVf_READONLY)) != (SVf_FAKE | SVf_READONLY)
3920 &&
3921#endif
3922 !(isSwipe =
3923 (sflags & SVs_TEMP) && /* slated for free anyway? */
3924 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
3925 SvREFCNT(sstr) == 1 && /* and no other references to it? */
3926 SvLEN(sstr) && /* and really is a string */
645c22ef 3927 /* and won't be needed again, potentially */
765f542d
NC
3928 !(PL_op && PL_op->op_type == OP_AASSIGN))
3929#ifdef PERL_COPY_ON_WRITE
3930 && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
3931 && SvTYPE(sstr) >= SVt_PVIV)
3932#endif
3933 ) {
3934 /* Failed the swipe test, and it's not a shared hash key either.
3935 Have to copy the string. */
3936 STRLEN len = SvCUR(sstr);
3937 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3938 Move(SvPVX(sstr),SvPVX(dstr),len,char);
3939 SvCUR_set(dstr, len);
3940 *SvEND(dstr) = '\0';
3941 (void)SvPOK_only(dstr);
3942 } else {
3943 /* If PERL_COPY_ON_WRITE is not defined, then isSwipe will always
3944 be true in here. */
3945#ifdef PERL_COPY_ON_WRITE
3946 /* Either it's a shared hash key, or it's suitable for
3947 copy-on-write or we can swipe the string. */
46187eeb
NC
3948 if (DEBUG_C_TEST) {
3949 PerlIO_printf(Perl_debug_log,
3950 "Copy on write: sstr --> dstr\n");
e419cbc5
NC
3951 sv_dump(sstr);
3952 sv_dump(dstr);
46187eeb 3953 }
765f542d
NC
3954 if (!isSwipe) {
3955 /* I believe I should acquire a global SV mutex if
3956 it's a COW sv (not a shared hash key) to stop
3957 it going un copy-on-write.
3958 If the source SV has gone un copy on write between up there
3959 and down here, then (assert() that) it is of the correct
3960 form to make it copy on write again */
3961 if ((sflags & (SVf_FAKE | SVf_READONLY))
3962 != (SVf_FAKE | SVf_READONLY)) {
3963 SvREADONLY_on(sstr);
3964 SvFAKE_on(sstr);
3965 /* Make the source SV into a loop of 1.
3966 (about to become 2) */
a29f6d03 3967 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
3968 }
3969 }
3970#endif
3971 /* Initial code is common. */
adbc6bb1 3972 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
3973 if (SvOOK(dstr)) {
3974 SvFLAGS(dstr) &= ~SVf_OOK;
3975 Safefree(SvPVX(dstr) - SvIVX(dstr));
3976 }
50483b2c 3977 else if (SvLEN(dstr))
a5f75d66 3978 Safefree(SvPVX(dstr));
79072805 3979 }
a5f75d66 3980 (void)SvPOK_only(dstr);
765f542d
NC
3981
3982#ifdef PERL_COPY_ON_WRITE
3983 if (!isSwipe) {
3984 /* making another shared SV. */
3985 STRLEN cur = SvCUR(sstr);
3986 STRLEN len = SvLEN(sstr);
3987 if (len) {
3988 /* SvIsCOW_normal */
3989 /* splice us in between source and next-after-source. */
a29f6d03
NC
3990 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3991 SV_COW_NEXT_SV_SET(sstr, dstr);
765f542d
NC
3992 SvPV_set(dstr, SvPVX(sstr));
3993 } else {
3994 /* SvIsCOW_shared_hash */
3995 UV hash = SvUVX(sstr);
46187eeb
NC
3996 DEBUG_C(PerlIO_printf(Perl_debug_log,
3997 "Copy on write: Sharing hash\n"));
765f542d
NC
3998 SvPV_set(dstr,
3999 sharepvn(SvPVX(sstr),
4000 (sflags & SVf_UTF8?-cur:cur), hash));
4001 SvUVX(dstr) = hash;
4002 }
4003 SvLEN(dstr) = len;
4004 SvCUR(dstr) = cur;
4005 SvREADONLY_on(dstr);
4006 SvFAKE_on(dstr);
4007 /* Relesase a global SV mutex. */
4008 }
4009 else
4010#endif
4011 { /* Passes the swipe test. */
4012 SvPV_set(dstr, SvPVX(sstr));
4013 SvLEN_set(dstr, SvLEN(sstr));
4014 SvCUR_set(dstr, SvCUR(sstr));
4015
4016 SvTEMP_off(dstr);
4017 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
4018 SvPV_set(sstr, Nullch);
4019 SvLEN_set(sstr, 0);
4020 SvCUR_set(sstr, 0);
4021 SvTEMP_off(sstr);
4022 }
4023 }
9aa983d2 4024 if (sflags & SVf_UTF8)
a7cb1f99 4025 SvUTF8_on(dstr);
79072805 4026 /*SUPPRESS 560*/
8990e307 4027 if (sflags & SVp_NOK) {
3332b3c1
JH
4028 SvNOKp_on(dstr);
4029 if (sflags & SVf_NOK)
4030 SvFLAGS(dstr) |= SVf_NOK;
463ee0b2 4031 SvNVX(dstr) = SvNVX(sstr);
79072805 4032 }
8990e307 4033 if (sflags & SVp_IOK) {
3332b3c1
JH
4034 (void)SvIOKp_on(dstr);
4035 if (sflags & SVf_IOK)
4036 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4037 if (sflags & SVf_IVisUV)
25da4f38 4038 SvIsUV_on(dstr);
463ee0b2 4039 SvIVX(dstr) = SvIVX(sstr);
79072805 4040 }
92f0c265 4041 if (SvVOK(sstr)) {
ece467f9
JP
4042 MAGIC *smg = mg_find(sstr,PERL_MAGIC_vstring);
4043 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4044 smg->mg_ptr, smg->mg_len);
439cb1c4 4045 SvRMAGICAL_on(dstr);
92f0c265 4046 }
79072805 4047 }
8990e307 4048 else if (sflags & SVp_IOK) {
3332b3c1
JH
4049 if (sflags & SVf_IOK)
4050 (void)SvIOK_only(dstr);
4051 else {
9cbac4c7
DM
4052 (void)SvOK_off(dstr);
4053 (void)SvIOKp_on(dstr);
3332b3c1
JH
4054 }
4055 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2b1c7e3e 4056 if (sflags & SVf_IVisUV)
25da4f38 4057 SvIsUV_on(dstr);
3332b3c1
JH
4058 SvIVX(dstr) = SvIVX(sstr);
4059 if (sflags & SVp_NOK) {
4060 if (sflags & SVf_NOK)
4061 (void)SvNOK_on(dstr);
4062 else
4063 (void)SvNOKp_on(dstr);
4064 SvNVX(dstr) = SvNVX(sstr);
4065 }
4066 }
4067 else if (sflags & SVp_NOK) {
4068 if (sflags & SVf_NOK)
4069 (void)SvNOK_only(dstr);
4070 else {
9cbac4c7 4071 (void)SvOK_off(dstr);
3332b3c1
JH
4072 SvNOKp_on(dstr);
4073 }
4074 SvNVX(dstr) = SvNVX(sstr);
79072805
LW
4075 }
4076 else {
20408e3c 4077 if (dtype == SVt_PVGV) {
e476b1b5 4078 if (ckWARN(WARN_MISC))
9014280d 4079 Perl_warner(aTHX_ packWARN(WARN_MISC), "Undefined value assigned to typeglob");
20408e3c
GS
4080 }
4081 else
4082 (void)SvOK_off(dstr);
a0d0e21e 4083 }
27c9684d
AP
4084 if (SvTAINTED(sstr))
4085 SvTAINT(dstr);
79072805
LW
4086}
4087
954c1994
GS
4088/*
4089=for apidoc sv_setsv_mg
4090
4091Like C<sv_setsv>, but also handles 'set' magic.
4092
4093=cut
4094*/
4095
79072805 4096void
864dbfa3 4097Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
4098{
4099 sv_setsv(dstr,sstr);
4100 SvSETMAGIC(dstr);
4101}
4102
954c1994
GS
4103/*
4104=for apidoc sv_setpvn
4105
4106Copies a string into an SV. The C<len> parameter indicates the number of
4107bytes to be copied. Does not handle 'set' magic. See C<sv_setpvn_mg>.
4108
4109=cut
4110*/
4111
ef50df4b 4112void
864dbfa3 4113Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 4114{
c6f8c383 4115 register char *dptr;
22c522df 4116
765f542d 4117 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4118 if (!ptr) {
a0d0e21e 4119 (void)SvOK_off(sv);
463ee0b2
LW
4120 return;
4121 }
22c522df
JH
4122 else {
4123 /* len is STRLEN which is unsigned, need to copy to signed */
4124 IV iv = len;
9c5ffd7c
JH
4125 if (iv < 0)
4126 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 4127 }
6fc92669 4128 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4129
79072805 4130 SvGROW(sv, len + 1);
c6f8c383
GA
4131 dptr = SvPVX(sv);
4132 Move(ptr,dptr,len,char);
4133 dptr[len] = '\0';
79072805 4134 SvCUR_set(sv, len);
1aa99e6b 4135 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4136 SvTAINT(sv);
79072805
LW
4137}
4138
954c1994
GS
4139/*
4140=for apidoc sv_setpvn_mg
4141
4142Like C<sv_setpvn>, but also handles 'set' magic.
4143
4144=cut
4145*/
4146
79072805 4147void
864dbfa3 4148Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4149{
4150 sv_setpvn(sv,ptr,len);
4151 SvSETMAGIC(sv);
4152}
4153
954c1994
GS
4154/*
4155=for apidoc sv_setpv
4156
4157Copies a string into an SV. The string must be null-terminated. Does not
4158handle 'set' magic. See C<sv_setpv_mg>.
4159
4160=cut
4161*/
4162
ef50df4b 4163void
864dbfa3 4164Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4165{
4166 register STRLEN len;
4167
765f542d 4168 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4169 if (!ptr) {
a0d0e21e 4170 (void)SvOK_off(sv);
463ee0b2
LW
4171 return;
4172 }
79072805 4173 len = strlen(ptr);
6fc92669 4174 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4175
79072805 4176 SvGROW(sv, len + 1);
463ee0b2 4177 Move(ptr,SvPVX(sv),len+1,char);
79072805 4178 SvCUR_set(sv, len);
1aa99e6b 4179 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
4180 SvTAINT(sv);
4181}
4182
954c1994
GS
4183/*
4184=for apidoc sv_setpv_mg
4185
4186Like C<sv_setpv>, but also handles 'set' magic.
4187
4188=cut
4189*/
4190
463ee0b2 4191void
864dbfa3 4192Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
4193{
4194 sv_setpv(sv,ptr);
4195 SvSETMAGIC(sv);
4196}
4197
954c1994
GS
4198/*
4199=for apidoc sv_usepvn
4200
4201Tells an SV to use C<ptr> to find its string value. Normally the string is
1c846c1f 4202stored inside the SV but sv_usepvn allows the SV to use an outside string.
954c1994
GS
4203The C<ptr> should point to memory that was allocated by C<malloc>. The
4204string length, C<len>, must be supplied. This function will realloc the
4205memory pointed to by C<ptr>, so that pointer should not be freed or used by
4206the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
4207See C<sv_usepvn_mg>.
4208
4209=cut
4210*/
4211
ef50df4b 4212void
864dbfa3 4213Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 4214{
765f542d 4215 SV_CHECK_THINKFIRST_COW_DROP(sv);
c6f8c383 4216 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 4217 if (!ptr) {
a0d0e21e 4218 (void)SvOK_off(sv);
463ee0b2
LW
4219 return;
4220 }
a0ed51b3 4221 (void)SvOOK_off(sv);
50483b2c 4222 if (SvPVX(sv) && SvLEN(sv))
463ee0b2
LW
4223 Safefree(SvPVX(sv));
4224 Renew(ptr, len+1, char);
4225 SvPVX(sv) = ptr;
4226 SvCUR_set(sv, len);
4227 SvLEN_set(sv, len+1);
4228 *SvEND(sv) = '\0';
1aa99e6b 4229 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4230 SvTAINT(sv);
79072805
LW
4231}
4232
954c1994
GS
4233/*
4234=for apidoc sv_usepvn_mg
4235
4236Like C<sv_usepvn>, but also handles 'set' magic.
4237
4238=cut
4239*/
4240
ef50df4b 4241void
864dbfa3 4242Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 4243{
51c1089b 4244 sv_usepvn(sv,ptr,len);
ef50df4b
GS
4245 SvSETMAGIC(sv);
4246}
4247
765f542d
NC
4248#ifdef PERL_COPY_ON_WRITE
4249/* Need to do this *after* making the SV normal, as we need the buffer
4250 pointer to remain valid until after we've copied it. If we let go too early,
4251 another thread could invalidate it by unsharing last of the same hash key
4252 (which it can do by means other than releasing copy-on-write Svs)
4253 or by changing the other copy-on-write SVs in the loop. */
4254STATIC void
4255S_sv_release_COW(pTHX_ register SV *sv, char *pvx, STRLEN cur, STRLEN len,
4256 U32 hash, SV *after)
4257{
4258 if (len) { /* this SV was SvIsCOW_normal(sv) */
4259 /* we need to find the SV pointing to us. */
4260 SV *current = SV_COW_NEXT_SV(after);
4261
4262 if (current == sv) {
4263 /* The SV we point to points back to us (there were only two of us
4264 in the loop.)
4265 Hence other SV is no longer copy on write either. */
4266 SvFAKE_off(after);
4267 SvREADONLY_off(after);
4268 } else {
4269 /* We need to follow the pointers around the loop. */
4270 SV *next;
4271 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4272 assert (next);
4273 current = next;
4274 /* don't loop forever if the structure is bust, and we have
4275 a pointer into a closed loop. */
4276 assert (current != after);
e419cbc5 4277 assert (SvPVX(current) == pvx);
765f542d
NC
4278 }
4279 /* Make the SV before us point to the SV after us. */
a29f6d03 4280 SV_COW_NEXT_SV_SET(current, after);
765f542d
NC
4281 }
4282 } else {
4283 unsharepvn(pvx, SvUTF8(sv) ? -(I32)cur : cur, hash);
4284 }
4285}
4286
4287int
4288Perl_sv_release_IVX(pTHX_ register SV *sv)
4289{
4290 if (SvIsCOW(sv))
4291 sv_force_normal_flags(sv, 0);
4292 return SvOOK_off(sv);
4293}
4294#endif
645c22ef
DM
4295/*
4296=for apidoc sv_force_normal_flags
4297
4298Undo various types of fakery on an SV: if the PV is a shared string, make
4299a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4300an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4301we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4302then a copy-on-write scalar drops its PV buffer (if any) and becomes
4303SvPOK_off rather than making a copy. (Used where this scalar is about to be
4304set to some other value. In addtion, the C<flags> parameter gets passed to
4305C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4306with flags set to 0.
645c22ef
DM
4307
4308=cut
4309*/
4310
6fc92669 4311void
840a7b70 4312Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 4313{
765f542d
NC
4314#ifdef PERL_COPY_ON_WRITE
4315 if (SvREADONLY(sv)) {
4316 /* At this point I believe I should acquire a global SV mutex. */
4317 if (SvFAKE(sv)) {
4318 char *pvx = SvPVX(sv);
4319 STRLEN len = SvLEN(sv);
4320 STRLEN cur = SvCUR(sv);
4321 U32 hash = SvUVX(sv);
4322 SV *next = SV_COW_NEXT_SV(sv); /* next COW sv in the loop. */
46187eeb
NC
4323 if (DEBUG_C_TEST) {
4324 PerlIO_printf(Perl_debug_log,
4325 "Copy on write: Force normal %ld\n",
4326 (long) flags);
e419cbc5 4327 sv_dump(sv);
46187eeb 4328 }
765f542d
NC
4329 SvFAKE_off(sv);
4330 SvREADONLY_off(sv);
4331 /* This SV doesn't own the buffer, so need to New() a new one: */
4332 SvPVX(sv) = 0;
4333 SvLEN(sv) = 0;
4334 if (flags & SV_COW_DROP_PV) {
4335 /* OK, so we don't need to copy our buffer. */
4336 SvPOK_off(sv);
4337 } else {
4338 SvGROW(sv, cur + 1);
4339 Move(pvx,SvPVX(sv),cur,char);
4340 SvCUR(sv) = cur;
4341 *SvEND(sv) = '\0';
4342 }
e419cbc5 4343 sv_release_COW(sv, pvx, cur, len, hash, next);
46187eeb 4344 if (DEBUG_C_TEST) {
e419cbc5 4345 sv_dump(sv);
46187eeb 4346 }
765f542d
NC
4347 }
4348 else if (PL_curcop != &PL_compiling)
4349 Perl_croak(aTHX_ PL_no_modify);
4350 /* At this point I believe that I can drop the global SV mutex. */
4351 }
4352#else
2213622d 4353 if (SvREADONLY(sv)) {
1c846c1f
NIS
4354 if (SvFAKE(sv)) {
4355 char *pvx = SvPVX(sv);
4356 STRLEN len = SvCUR(sv);
4357 U32 hash = SvUVX(sv);
4358 SvGROW(sv, len + 1);
4359 Move(pvx,SvPVX(sv),len,char);
4360 *SvEND(sv) = '\0';
4361 SvFAKE_off(sv);
4362 SvREADONLY_off(sv);
25716404 4363 unsharepvn(pvx, SvUTF8(sv) ? -(I32)len : len, hash);
1c846c1f
NIS
4364 }
4365 else if (PL_curcop != &PL_compiling)
cea2e8a9 4366 Perl_croak(aTHX_ PL_no_modify);
0f15f207 4367 }
765f542d 4368#endif
2213622d 4369 if (SvROK(sv))
840a7b70 4370 sv_unref_flags(sv, flags);
6fc92669
GS
4371 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4372 sv_unglob(sv);
0f15f207 4373}
1c846c1f 4374
645c22ef
DM
4375/*
4376=for apidoc sv_force_normal
4377
4378Undo various types of fakery on an SV: if the PV is a shared string, make
4379a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4380an xpvmg. See also C<sv_force_normal_flags>.
4381
4382=cut
4383*/
4384
840a7b70
IZ
4385void
4386Perl_sv_force_normal(pTHX_ register SV *sv)
4387{
4388 sv_force_normal_flags(sv, 0);
4389}
4390
954c1994
GS
4391/*
4392=for apidoc sv_chop
4393
1c846c1f 4394Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4395SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4396the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4397string. Uses the "OOK hack".
954c1994
GS
4398
4399=cut
4400*/
4401
79072805 4402void
645c22ef 4403Perl_sv_chop(pTHX_ register SV *sv, register char *ptr)
79072805
LW
4404{
4405 register STRLEN delta;
4406
a0d0e21e 4407 if (!ptr || !SvPOKp(sv))
79072805 4408 return;
2213622d 4409 SV_CHECK_THINKFIRST(sv);
79072805
LW
4410 if (SvTYPE(sv) < SVt_PVIV)
4411 sv_upgrade(sv,SVt_PVIV);
4412
4413 if (!SvOOK(sv)) {
50483b2c
JD
4414 if (!SvLEN(sv)) { /* make copy of shared string */
4415 char *pvx = SvPVX(sv);
4416 STRLEN len = SvCUR(sv);
4417 SvGROW(sv, len + 1);
4418 Move(pvx,SvPVX(sv),len,char);
4419 *SvEND(sv) = '\0';
4420 }
463ee0b2 4421 SvIVX(sv) = 0;
79072805
LW
4422 SvFLAGS(sv) |= SVf_OOK;
4423 }
25da4f38 4424 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK|SVf_IVisUV);
463ee0b2 4425 delta = ptr - SvPVX(sv);
79072805
LW
4426 SvLEN(sv) -= delta;
4427 SvCUR(sv) -= delta;
463ee0b2
LW
4428 SvPVX(sv) += delta;
4429 SvIVX(sv) += delta;
79072805
LW
4430}
4431
954c1994
GS
4432/*
4433=for apidoc sv_catpvn
4434
4435Concatenates the string onto the end of the string which is in the SV. The
d5ce4a7c
GA
4436C<len> indicates number of bytes to copy. If the SV has the UTF8
4437status set, then the bytes appended should be valid UTF8.
4438Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 4439
8d6d96c1
HS
4440=for apidoc sv_catpvn_flags
4441
4442Concatenates the string onto the end of the string which is in the SV. The
4443C<len> indicates number of bytes to copy. If the SV has the UTF8
4444status set, then the bytes appended should be valid UTF8.
4445If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4446appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4447in terms of this function.
4448
4449=cut
4450*/
4451
4452void
4453Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
4454{
4455 STRLEN dlen;
4456 char *dstr;
4457
4458 dstr = SvPV_force_flags(dsv, dlen, flags);
4459 SvGROW(dsv, dlen + slen + 1);
4460 if (sstr == dstr)
4461 sstr = SvPVX(dsv);
4462 Move(sstr, SvPVX(dsv) + dlen, slen, char);
4463 SvCUR(dsv) += slen;
4464 *SvEND(dsv) = '\0';
4465 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
4466 SvTAINT(dsv);
79072805
LW
4467}
4468
954c1994
GS
4469/*
4470=for apidoc sv_catpvn_mg
4471
4472Like C<sv_catpvn>, but also handles 'set' magic.
4473
4474=cut
4475*/
4476
79072805 4477void
864dbfa3 4478Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4479{
4480 sv_catpvn(sv,ptr,len);
4481 SvSETMAGIC(sv);
4482}
4483
954c1994
GS
4484/*
4485=for apidoc sv_catsv
4486
13e8c8e3
JH
4487Concatenates the string from SV C<ssv> onto the end of the string in
4488SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
4489not 'set' magic. See C<sv_catsv_mg>.
954c1994 4490
8d6d96c1
HS
4491=for apidoc sv_catsv_flags
4492
4493Concatenates the string from SV C<ssv> onto the end of the string in
4494SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
4495bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4496and C<sv_catsv_nomg> are implemented in terms of this function.
4497
4498=cut */
4499
ef50df4b 4500void
8d6d96c1 4501Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 4502{
13e8c8e3
JH
4503 char *spv;
4504 STRLEN slen;
46199a12 4505 if (!ssv)
79072805 4506 return;
46199a12 4507 if ((spv = SvPV(ssv, slen))) {
4fd84b44
AD
4508 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4509 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
8cf8f3d1
NIS
4510 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4511 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4fd84b44
AD
4512 dsv->sv_flags doesn't have that bit set.
4513 Andy Dougherty 12 Oct 2001
4514 */
4515 I32 sutf8 = DO_UTF8(ssv);
4516 I32 dutf8;
13e8c8e3 4517
8d6d96c1
HS
4518 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4519 mg_get(dsv);
4520 dutf8 = DO_UTF8(dsv);
4521
4522 if (dutf8 != sutf8) {
13e8c8e3 4523 if (dutf8) {
46199a12 4524 /* Not modifying source SV, so taking a temporary copy. */
8d6d96c1 4525 SV* csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 4526
46199a12 4527 sv_utf8_upgrade(csv);
8d6d96c1 4528 spv = SvPV(csv, slen);
13e8c8e3 4529 }
8d6d96c1
HS
4530 else
4531 sv_utf8_upgrade_nomg(dsv);
e84ff256 4532 }
8d6d96c1 4533 sv_catpvn_nomg(dsv, spv, slen);
560a288e 4534 }
79072805
LW
4535}
4536
954c1994
GS
4537/*
4538=for apidoc sv_catsv_mg
4539
4540Like C<sv_catsv>, but also handles 'set' magic.
4541
4542=cut
4543*/
4544
79072805 4545void
46199a12 4546Perl_sv_catsv_mg(pTHX_ SV *dsv, register SV *ssv)
ef50df4b 4547{
46199a12
JH
4548 sv_catsv(dsv,ssv);
4549 SvSETMAGIC(dsv);
ef50df4b
GS
4550}
4551
954c1994
GS
4552/*
4553=for apidoc sv_catpv
4554
4555Concatenates the string onto the end of the string which is in the SV.
d5ce4a7c
GA
4556If the SV has the UTF8 status set, then the bytes appended should be
4557valid UTF8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 4558
d5ce4a7c 4559=cut */
954c1994 4560
ef50df4b 4561void
0c981600 4562Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4563{
4564 register STRLEN len;
463ee0b2 4565 STRLEN tlen;
748a9306 4566 char *junk;
79072805 4567
0c981600 4568 if (!ptr)
79072805 4569 return;
748a9306 4570 junk = SvPV_force(sv, tlen);
0c981600 4571 len = strlen(ptr);
463ee0b2 4572 SvGROW(sv, tlen + len + 1);
0c981600
JH
4573 if (ptr == junk)
4574 ptr = SvPVX(sv);
4575 Move(ptr,SvPVX(sv)+tlen,len+1,char);
79072805 4576 SvCUR(sv) += len;
d41ff1b8 4577 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4578 SvTAINT(sv);
79072805
LW
4579}
4580
954c1994
GS
4581/*
4582=for apidoc sv_catpv_mg
4583
4584Like C<sv_catpv>, but also handles 'set' magic.
4585
4586=cut
4587*/
4588
ef50df4b 4589void
0c981600 4590Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 4591{
0c981600 4592 sv_catpv(sv,ptr);
ef50df4b
GS
4593 SvSETMAGIC(sv);
4594}
4595
645c22ef
DM
4596/*
4597=for apidoc newSV
4598
4599Create a new null SV, or if len > 0, create a new empty SVt_PV type SV
4600with an initial PV allocation of len+1. Normally accessed via the C<NEWSV>
4601macro.
4602
4603=cut
4604*/
4605
79072805 4606SV *
864dbfa3 4607Perl_newSV(pTHX_ STRLEN len)
79072805
LW
4608{
4609 register SV *sv;
1c846c1f 4610
4561caa4 4611 new_SV(sv);
79072805
LW
4612 if (len) {
4613 sv_upgrade(sv, SVt_PV);
4614 SvGROW(sv, len + 1);
4615 }
4616 return sv;
4617}
954c1994 4618/*
92110913 4619=for apidoc sv_magicext
954c1994 4620
68795e93 4621Adds magic to an SV, upgrading it if necessary. Applies the
92110913
NIS
4622supplied vtable and returns pointer to the magic added.
4623
4624Note that sv_magicext will allow things that sv_magic will not.
68795e93 4625In particular you can add magic to SvREADONLY SVs and and more than
92110913 4626one instance of the same 'how'
645c22ef 4627
92110913 4628I C<namelen> is greater then zero then a savepvn() I<copy> of C<name> is stored,
68795e93
NIS
4629if C<namelen> is zero then C<name> is stored as-is and - as another special
4630case - if C<(name && namelen == HEf_SVKEY)> then C<name> is assumed to contain
92110913
NIS
4631an C<SV*> and has its REFCNT incremented
4632
4633(This is now used as a subroutine by sv_magic.)
954c1994
GS
4634
4635=cut
4636*/
92110913
NIS
4637MAGIC *
4638Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, MGVTBL *vtable,
4639 const char* name, I32 namlen)
79072805
LW
4640{
4641 MAGIC* mg;
68795e93 4642
92110913
NIS
4643 if (SvTYPE(sv) < SVt_PVMG) {
4644 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 4645 }
79072805
LW
4646 Newz(702,mg, 1, MAGIC);
4647 mg->mg_moremagic = SvMAGIC(sv);
79072805 4648 SvMAGIC(sv) = mg;
75f9d97a 4649
18808301 4650 /* Some magic sontains a reference loop, where the sv and object refer to
bb03859b
RS
4651 each other. To prevent a reference loop that would prevent such
4652 objects being freed, we look for such loops and if we find one we
87f0b213
JH
4653 avoid incrementing the object refcount.
4654
4655 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 4656 have its REFCNT incremented to keep it in existence.
87f0b213
JH
4657
4658 */
14befaf4
DM
4659 if (!obj || obj == sv ||
4660 how == PERL_MAGIC_arylen ||
4661 how == PERL_MAGIC_qr ||
75f9d97a
JH
4662 (SvTYPE(obj) == SVt_PVGV &&
4663 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4664 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 4665 GvFORM(obj) == (CV*)sv)))
75f9d97a 4666 {
8990e307 4667 mg->mg_obj = obj;
75f9d97a 4668 }
85e6fe83 4669 else {
8990e307 4670 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
4671 mg->mg_flags |= MGf_REFCOUNTED;
4672 }
b5ccf5f2
YST
4673
4674 /* Normal self-ties simply pass a null object, and instead of
4675 using mg_obj directly, use the SvTIED_obj macro to produce a
4676 new RV as needed. For glob "self-ties", we are tieing the PVIO
4677 with an RV obj pointing to the glob containing the PVIO. In
4678 this case, to avoid a reference loop, we need to weaken the
4679 reference.
4680 */
4681
4682 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4683 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
4684 {
4685 sv_rvweaken(obj);
4686 }
4687
79072805 4688 mg->mg_type = how;
565764a8 4689 mg->mg_len = namlen;
9cbac4c7 4690 if (name) {
92110913 4691 if (namlen > 0)
1edc1566 4692 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 4693 else if (namlen == HEf_SVKEY)
1edc1566 4694 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
68795e93 4695 else
92110913 4696 mg->mg_ptr = (char *) name;
9cbac4c7 4697 }
92110913 4698 mg->mg_virtual = vtable;
68795e93 4699
92110913
NIS
4700 mg_magical(sv);
4701 if (SvGMAGICAL(sv))
4702 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4703 return mg;
4704}
4705
4706/*
4707=for apidoc sv_magic
1c846c1f 4708
92110913
NIS
4709Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4710then adds a new magic item of type C<how> to the head of the magic list.
4711
4712=cut
4713*/
4714
4715void
4716Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 4717{
92110913
NIS
4718 MAGIC* mg;
4719 MGVTBL *vtable = 0;
4720
765f542d
NC
4721#ifdef PERL_COPY_ON_WRITE
4722 if (SvIsCOW(sv))
4723 sv_force_normal_flags(sv, 0);
4724#endif
92110913
NIS
4725 if (SvREADONLY(sv)) {
4726 if (PL_curcop != &PL_compiling
4727 && how != PERL_MAGIC_regex_global
4728 && how != PERL_MAGIC_bm
4729 && how != PERL_MAGIC_fm
4730 && how != PERL_MAGIC_sv
4731 )
4732 {
4733 Perl_croak(aTHX_ PL_no_modify);
4734 }
4735 }
4736 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4737 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
4738 /* sv_magic() refuses to add a magic of the same 'how' as an
4739 existing one
92110913
NIS
4740 */
4741 if (how == PERL_MAGIC_taint)
4742 mg->mg_len |= 1;
4743 return;
4744 }
4745 }
68795e93 4746
79072805 4747 switch (how) {
14befaf4 4748 case PERL_MAGIC_sv:
92110913 4749 vtable = &PL_vtbl_sv;
79072805 4750 break;
14befaf4 4751 case PERL_MAGIC_overload:
92110913 4752 vtable = &PL_vtbl_amagic;
a0d0e21e 4753 break;
14befaf4 4754 case PERL_MAGIC_overload_elem:
92110913 4755 vtable = &PL_vtbl_amagicelem;
a0d0e21e 4756 break;
14befaf4 4757 case PERL_MAGIC_overload_table:
92110913 4758 vtable = &PL_vtbl_ovrld;
a0d0e21e 4759 break;
14befaf4 4760 case PERL_MAGIC_bm:
92110913 4761 vtable = &PL_vtbl_bm;
79072805 4762 break;
14befaf4 4763 case PERL_MAGIC_regdata:
92110913 4764 vtable = &PL_vtbl_regdata;
6cef1e77 4765 break;
14befaf4 4766 case PERL_MAGIC_regdatum:
92110913 4767 vtable = &PL_vtbl_regdatum;
6cef1e77 4768 break;
14befaf4 4769 case PERL_MAGIC_env:
92110913 4770 vtable = &PL_vtbl_env;
79072805 4771 break;
14befaf4 4772 case PERL_MAGIC_fm:
92110913 4773 vtable = &PL_vtbl_fm;
55497cff 4774 break;
14befaf4 4775 case PERL_MAGIC_envelem:
92110913 4776 vtable = &PL_vtbl_envelem;
79072805 4777 break;
14befaf4 4778 case PERL_MAGIC_regex_global:
92110913 4779 vtable = &PL_vtbl_mglob;
93a17b20 4780 break;
14befaf4 4781 case PERL_MAGIC_isa:
92110913 4782 vtable = &PL_vtbl_isa;
463ee0b2 4783 break;
14befaf4 4784 case PERL_MAGIC_isaelem:
92110913 4785 vtable = &PL_vtbl_isaelem;
463ee0b2 4786 break;
14befaf4 4787 case PERL_MAGIC_nkeys:
92110913 4788 vtable = &PL_vtbl_nkeys;
16660edb 4789 break;
14befaf4 4790 case PERL_MAGIC_dbfile:
92110913 4791 vtable = 0;
93a17b20 4792 break;
14befaf4 4793 case PERL_MAGIC_dbline:
92110913 4794 vtable = &PL_vtbl_dbline;
79072805 4795 break;
36477c24 4796#ifdef USE_LOCALE_COLLATE
14befaf4 4797 case PERL_MAGIC_collxfrm:
92110913 4798 vtable = &PL_vtbl_collxfrm;
bbce6d69 4799 break;
36477c24 4800#endif /* USE_LOCALE_COLLATE */
14befaf4 4801 case PERL_MAGIC_tied:
92110913 4802 vtable = &PL_vtbl_pack;
463ee0b2 4803 break;
14befaf4
DM
4804 case PERL_MAGIC_tiedelem:
4805 case PERL_MAGIC_tiedscalar:
92110913 4806 vtable = &PL_vtbl_packelem;
463ee0b2 4807 break;
14befaf4 4808 case PERL_MAGIC_qr:
92110913 4809 vtable = &PL_vtbl_regexp;
c277df42 4810 break;
14befaf4 4811 case PERL_MAGIC_sig:
92110913 4812 vtable = &PL_vtbl_sig;
79072805 4813 break;
14befaf4 4814 case PERL_MAGIC_sigelem:
92110913 4815 vtable = &PL_vtbl_sigelem;
79072805 4816 break;
14befaf4 4817 case PERL_MAGIC_taint:
92110913 4818 vtable = &PL_vtbl_taint;
463ee0b2 4819 break;
14befaf4 4820 case PERL_MAGIC_uvar:
92110913 4821 vtable = &PL_vtbl_uvar;
79072805 4822 break;
14befaf4 4823 case PERL_MAGIC_vec:
92110913 4824 vtable = &PL_vtbl_vec;
79072805 4825 break;
ece467f9
JP
4826 case PERL_MAGIC_vstring:
4827 vtable = 0;
4828 break;
14befaf4 4829 case PERL_MAGIC_substr:
92110913 4830 vtable = &PL_vtbl_substr;
79072805 4831 break;
14befaf4 4832 case PERL_MAGIC_defelem:
92110913 4833 vtable = &PL_vtbl_defelem;
5f05dabc 4834 break;
14befaf4 4835 case PERL_MAGIC_glob:
92110913 4836 vtable = &PL_vtbl_glob;
79072805 4837 break;
14befaf4 4838 case PERL_MAGIC_arylen:
92110913 4839 vtable = &PL_vtbl_arylen;
79072805 4840 break;
14befaf4 4841 case PERL_MAGIC_pos:
92110913 4842 vtable = &PL_vtbl_pos;
a0d0e21e 4843 break;
14befaf4 4844 case PERL_MAGIC_backref:
92110913 4845 vtable = &PL_vtbl_backref;
810b8aa5 4846 break;
14befaf4
DM
4847 case PERL_MAGIC_ext:
4848 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
4849 /* Useful for attaching extension internal data to perl vars. */
4850 /* Note that multiple extensions may clash if magical scalars */
4851 /* etc holding private data from one are passed to another. */
a0d0e21e 4852 break;
79072805 4853 default:
14befaf4 4854 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 4855 }
68795e93 4856
92110913
NIS
4857 /* Rest of work is done else where */
4858 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 4859
92110913
NIS
4860 switch (how) {
4861 case PERL_MAGIC_taint:
4862 mg->mg_len = 1;
4863 break;
4864 case PERL_MAGIC_ext:
4865 case PERL_MAGIC_dbfile:
4866 SvRMAGICAL_on(sv);
4867 break;
4868 }
463ee0b2
LW
4869}
4870
c461cf8f
JH
4871/*
4872=for apidoc sv_unmagic
4873
645c22ef 4874Removes all magic of type C<type> from an SV.
c461cf8f
JH
4875
4876=cut
4877*/
4878
463ee0b2 4879int
864dbfa3 4880Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
4881{
4882 MAGIC* mg;
4883 MAGIC** mgp;
91bba347 4884 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
4885 return 0;
4886 mgp = &SvMAGIC(sv);
4887 for (mg = *mgp; mg; mg = *mgp) {
4888 if (mg->mg_type == type) {
4889 MGVTBL* vtbl = mg->mg_virtual;
4890 *mgp = mg->mg_moremagic;
1d7c1841 4891 if (vtbl && vtbl->svt_free)
fc0dc3b3 4892 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 4893 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 4894 if (mg->mg_len > 0)
1edc1566 4895 Safefree(mg->mg_ptr);
565764a8 4896 else if (mg->mg_len == HEf_SVKEY)
1edc1566 4897 SvREFCNT_dec((SV*)mg->mg_ptr);
9cbac4c7 4898 }
a0d0e21e
LW
4899 if (mg->mg_flags & MGf_REFCOUNTED)
4900 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
4901 Safefree(mg);
4902 }
4903 else
4904 mgp = &mg->mg_moremagic;
79072805 4905 }
91bba347 4906 if (!SvMAGIC(sv)) {
463ee0b2 4907 SvMAGICAL_off(sv);
06759ea0 4908 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
4909 }
4910
4911 return 0;
79072805
LW
4912}
4913
c461cf8f
JH
4914/*
4915=for apidoc sv_rvweaken
4916
645c22ef
DM
4917Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
4918referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
4919push a back-reference to this RV onto the array of backreferences
4920associated with that magic.
c461cf8f
JH
4921
4922=cut
4923*/
4924
810b8aa5 4925SV *
864dbfa3 4926Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
4927{
4928 SV *tsv;
4929 if (!SvOK(sv)) /* let undefs pass */
4930 return sv;
4931 if (!SvROK(sv))
cea2e8a9 4932 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 4933 else if (SvWEAKREF(sv)) {
810b8aa5 4934 if (ckWARN(WARN_MISC))
9014280d 4935 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
4936 return sv;
4937 }
4938 tsv = SvRV(sv);
4939 sv_add_backref(tsv, sv);
4940 SvWEAKREF_on(sv);
1c846c1f 4941 SvREFCNT_dec(tsv);
810b8aa5
GS
4942 return sv;
4943}
4944
645c22ef
DM
4945/* Give tsv backref magic if it hasn't already got it, then push a
4946 * back-reference to sv onto the array associated with the backref magic.
4947 */
4948
810b8aa5 4949STATIC void
cea2e8a9 4950S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
4951{
4952 AV *av;
4953 MAGIC *mg;
14befaf4 4954 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, PERL_MAGIC_backref)))
810b8aa5
GS
4955 av = (AV*)mg->mg_obj;
4956 else {
4957 av = newAV();
14befaf4 4958 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
810b8aa5
GS
4959 SvREFCNT_dec(av); /* for sv_magic */
4960 }
4961 av_push(av,sv);
4962}
4963
645c22ef
DM
4964/* delete a back-reference to ourselves from the backref magic associated
4965 * with the SV we point to.
4966 */
4967
1c846c1f 4968STATIC void
cea2e8a9 4969S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
4970{
4971 AV *av;
4972 SV **svp;
4973 I32 i;
4974 SV *tsv = SvRV(sv);
c04a4dfe 4975 MAGIC *mg = NULL;
14befaf4 4976 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, PERL_MAGIC_backref)))
cea2e8a9 4977 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
4978 av = (AV *)mg->mg_obj;
4979 svp = AvARRAY(av);
4980 i = AvFILLp(av);
4981 while (i >= 0) {
4982 if (svp[i] == sv) {
4983 svp[i] = &PL_sv_undef; /* XXX */
4984 }
4985 i--;
4986 }
4987}
4988
954c1994
GS
4989/*
4990=for apidoc sv_insert
4991
4992Inserts a string at the specified offset/length within the SV. Similar to
4993the Perl substr() function.
4994
4995=cut
4996*/
4997
79072805 4998void
864dbfa3 4999Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
79072805
LW
5000{
5001 register char *big;
5002 register char *mid;
5003 register char *midend;
5004 register char *bigend;
5005 register I32 i;
6ff81951 5006 STRLEN curlen;
1c846c1f 5007
79072805 5008
8990e307 5009 if (!bigstr)
cea2e8a9 5010 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 5011 SvPV_force(bigstr, curlen);
60fa28ff 5012 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
5013 if (offset + len > curlen) {
5014 SvGROW(bigstr, offset+len+1);
5015 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
5016 SvCUR_set(bigstr, offset+len);
5017 }
79072805 5018
69b47968 5019 SvTAINT(bigstr);
79072805
LW
5020 i = littlelen - len;
5021 if (i > 0) { /* string might grow */
a0d0e21e 5022 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
5023 mid = big + offset + len;
5024 midend = bigend = big + SvCUR(bigstr);
5025 bigend += i;
5026 *bigend = '\0';
5027 while (midend > mid) /* shove everything down */
5028 *--bigend = *--midend;
5029 Move(little,big+offset,littlelen,char);
5030 SvCUR(bigstr) += i;
5031 SvSETMAGIC(bigstr);
5032 return;
5033 }
5034 else if (i == 0) {
463ee0b2 5035 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
5036 SvSETMAGIC(bigstr);
5037 return;
5038 }
5039
463ee0b2 5040 big = SvPVX(bigstr);
79072805
LW
5041 mid = big + offset;
5042 midend = mid + len;
5043 bigend = big + SvCUR(bigstr);
5044
5045 if (midend > bigend)
cea2e8a9 5046 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5047
5048 if (mid - big > bigend - midend) { /* faster to shorten from end */
5049 if (littlelen) {
5050 Move(little, mid, littlelen,char);
5051 mid += littlelen;
5052 }
5053 i = bigend - midend;
5054 if (i > 0) {
5055 Move(midend, mid, i,char);
5056 mid += i;
5057 }
5058 *mid = '\0';
5059 SvCUR_set(bigstr, mid - big);
5060 }
5061 /*SUPPRESS 560*/
155aba94 5062 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5063 midend -= littlelen;
5064 mid = midend;
5065 sv_chop(bigstr,midend-i);
5066 big += i;
5067 while (i--)
5068 *--midend = *--big;
5069 if (littlelen)
5070 Move(little, mid, littlelen,char);
5071 }
5072 else if (littlelen) {
5073 midend -= littlelen;
5074 sv_chop(bigstr,midend);
5075 Move(little,midend,littlelen,char);
5076 }
5077 else {
5078 sv_chop(bigstr,midend);
5079 }
5080 SvSETMAGIC(bigstr);
5081}
5082
c461cf8f
JH
5083/*
5084=for apidoc sv_replace
5085
5086Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5087The target SV physically takes over ownership of the body of the source SV
5088and inherits its flags; however, the target keeps any magic it owns,
5089and any magic in the source is discarded.
ff276b08 5090Note that this is a rather specialist SV copying operation; most of the
645c22ef 5091time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5092
5093=cut
5094*/
79072805
LW
5095
5096void
864dbfa3 5097Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805
LW
5098{
5099 U32 refcnt = SvREFCNT(sv);
765f542d 5100 SV_CHECK_THINKFIRST_COW_DROP(sv);
0453d815 5101 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
9014280d 5102 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
93a17b20 5103 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5104 if (SvMAGICAL(nsv))
5105 mg_free(nsv);
5106 else
5107 sv_upgrade(nsv, SVt_PVMG);
93a17b20 5108 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 5109 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
5110 SvMAGICAL_off(sv);
5111 SvMAGIC(sv) = 0;
5112 }
79072805
LW
5113 SvREFCNT(sv) = 0;
5114 sv_clear(sv);
477f5d66 5115 assert(!SvREFCNT(sv));
79072805 5116 StructCopy(nsv,sv,SV);
d3d0e6f1
NC
5117#ifdef PERL_COPY_ON_WRITE
5118 if (SvIsCOW_normal(nsv)) {
5119 /* We need to follow the pointers around the loop to make the
5120 previous SV point to sv, rather than nsv. */
5121 SV *next;
5122 SV *current = nsv;
5123 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5124 assert(next);
5125 current = next;
5126 assert(SvPVX(current) == SvPVX(nsv));
5127 }
5128 /* Make the SV before us point to the SV after us. */
5129 if (DEBUG_C_TEST) {
5130 PerlIO_printf(Perl_debug_log, "previous is\n");
5131 sv_dump(current);
a29f6d03
NC
5132 PerlIO_printf(Perl_debug_log,
5133 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5134 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5135 }
a29f6d03 5136 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5137 }
5138#endif
79072805 5139 SvREFCNT(sv) = refcnt;
1edc1566 5140 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
463ee0b2 5141 del_SV(nsv);
79072805
LW
5142}
5143
c461cf8f
JH
5144/*
5145=for apidoc sv_clear
5146
645c22ef
DM
5147Clear an SV: call any destructors, free up any memory used by the body,
5148and free the body itself. The SV's head is I<not> freed, although
5149its type is set to all 1's so that it won't inadvertently be assumed
5150to be live during global destruction etc.
5151This function should only be called when REFCNT is zero. Most of the time
5152you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5153instead.
c461cf8f
JH
5154
5155=cut
5156*/
5157
79072805 5158void
864dbfa3 5159Perl_sv_clear(pTHX_ register SV *sv)
79072805 5160{
ec12f114 5161 HV* stash;
79072805
LW
5162 assert(sv);
5163 assert(SvREFCNT(sv) == 0);
5164
ed6116ce 5165 if (SvOBJECT(sv)) {
3280af22 5166 if (PL_defstash) { /* Still have a symbol table? */
39644a26 5167 dSP;
32251b26 5168 CV* destructor;
837485b6 5169 SV tmpref;
a0d0e21e 5170
837485b6
GS
5171 Zero(&tmpref, 1, SV);
5172 sv_upgrade(&tmpref, SVt_RV);
5173 SvROK_on(&tmpref);
5174 SvREADONLY_on(&tmpref); /* DESTROY() could be naughty */
5175 SvREFCNT(&tmpref) = 1;
8ebc5c01 5176
d460ef45 5177 do {
4e8e7886 5178 stash = SvSTASH(sv);
32251b26 5179 destructor = StashHANDLER(stash,DESTROY);
4e8e7886
GS
5180 if (destructor) {
5181 ENTER;
e788e7d3 5182 PUSHSTACKi(PERLSI_DESTROY);
837485b6 5183 SvRV(&tmpref) = SvREFCNT_inc(sv);
4e8e7886
GS
5184 EXTEND(SP, 2);
5185 PUSHMARK(SP);
837485b6 5186 PUSHs(&tmpref);
4e8e7886 5187 PUTBACK;
44389ee9 5188 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
4e8e7886 5189 SvREFCNT(sv)--;
d3acc0f7 5190 POPSTACK;
3095d977 5191 SPAGAIN;
4e8e7886
GS
5192 LEAVE;
5193 }
5194 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5195
837485b6 5196 del_XRV(SvANY(&tmpref));
6f44e0a4
JP
5197
5198 if (SvREFCNT(sv)) {
5199 if (PL_in_clean_objs)
cea2e8a9 5200 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
6f44e0a4
JP
5201 HvNAME(stash));
5202 /* DESTROY gave object new lease on life */
5203 return;
5204 }
a0d0e21e 5205 }
4e8e7886 5206
a0d0e21e 5207 if (SvOBJECT(sv)) {
4e8e7886 5208 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
5209 SvOBJECT_off(sv); /* Curse the object. */
5210 if (SvTYPE(sv) != SVt_PVIO)
3280af22 5211 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5212 }
463ee0b2 5213 }
524189f1
JH
5214 if (SvTYPE(sv) >= SVt_PVMG) {
5215 if (SvMAGIC(sv))
5216 mg_free(sv);
5217 if (SvFLAGS(sv) & SVpad_TYPED)
5218 SvREFCNT_dec(SvSTASH(sv));
5219 }
ec12f114 5220 stash = NULL;
79072805 5221 switch (SvTYPE(sv)) {
8990e307 5222 case SVt_PVIO:
df0bd2f4
GS
5223 if (IoIFP(sv) &&
5224 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5225 IoIFP(sv) != PerlIO_stdout() &&
5226 IoIFP(sv) != PerlIO_stderr())
93578b34 5227 {
f2b5be74 5228 io_close((IO*)sv, FALSE);
93578b34 5229 }
1d7c1841 5230 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5231 PerlDir_close(IoDIRP(sv));
1d7c1841 5232 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5233 Safefree(IoTOP_NAME(sv));
5234 Safefree(IoFMT_NAME(sv));
5235 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 5236 /* FALL THROUGH */
79072805 5237 case SVt_PVBM:
a0d0e21e 5238 goto freescalar;
79072805 5239 case SVt_PVCV:
748a9306 5240 case SVt_PVFM:
85e6fe83 5241 cv_undef((CV*)sv);
a0d0e21e 5242 goto freescalar;
79072805 5243 case SVt_PVHV:
85e6fe83 5244 hv_undef((HV*)sv);
a0d0e21e 5245 break;
79072805 5246 case SVt_PVAV:
85e6fe83 5247 av_undef((AV*)sv);
a0d0e21e 5248 break;
02270b4e
GS
5249 case SVt_PVLV:
5250 SvREFCNT_dec(LvTARG(sv));
5251 goto freescalar;
a0d0e21e 5252 case SVt_PVGV:
1edc1566 5253 gp_free((GV*)sv);
a0d0e21e 5254 Safefree(GvNAME(sv));
ec12f114
JPC
5255 /* cannot decrease stash refcount yet, as we might recursively delete
5256 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
5257 of stash until current sv is completely gone.
5258 -- JohnPC, 27 Mar 1998 */
5259 stash = GvSTASH(sv);
a0d0e21e 5260 /* FALL THROUGH */
79072805 5261 case SVt_PVMG:
79072805
LW
5262 case SVt_PVNV:
5263 case SVt_PVIV:
a0d0e21e
LW
5264 freescalar:
5265 (void)SvOOK_off(sv);
79072805
LW
5266 /* FALL THROUGH */
5267 case SVt_PV:
a0d0e21e 5268 case SVt_RV:
810b8aa5
GS
5269 if (SvROK(sv)) {
5270 if (SvWEAKREF(sv))
5271 sv_del_backref(sv);
5272 else
5273 SvREFCNT_dec(SvRV(sv));
5274 }
765f542d
NC
5275#ifdef PERL_COPY_ON_WRITE
5276 else if (SvPVX(sv)) {
5277 if (SvIsCOW(sv)) {
5278 /* I believe I need to grab the global SV mutex here and
5279 then recheck the COW status. */
46187eeb
NC
5280 if (DEBUG_C_TEST) {
5281 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5282 sv_dump(sv);
46187eeb 5283 }
e419cbc5 5284 sv_release_COW(sv, SvPVX(sv), SvCUR(sv), SvLEN(sv),
765f542d
NC
5285 SvUVX(sv), SV_COW_NEXT_SV(sv));
5286 /* And drop it here. */
5287 SvFAKE_off(sv);
5288 } else if (SvLEN(sv)) {
5289 Safefree(SvPVX(sv));
5290 }
5291 }
5292#else
1edc1566 5293 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 5294 Safefree(SvPVX(sv));
1c846c1f 5295 else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
25716404
GS
5296 unsharepvn(SvPVX(sv),
5297 SvUTF8(sv) ? -(I32)SvCUR(sv) : SvCUR(sv),
5298 SvUVX(sv));
1c846c1f
NIS
5299 SvFAKE_off(sv);
5300 }
765f542d 5301#endif
79072805 5302 break;
a0d0e21e 5303/*
79072805 5304 case SVt_NV:
79072805 5305 case SVt_IV:
79072805
LW
5306 case SVt_NULL:
5307 break;
a0d0e21e 5308*/
79072805
LW
5309 }
5310
5311 switch (SvTYPE(sv)) {
5312 case SVt_NULL:
5313 break;
79072805
LW
5314 case SVt_IV:
5315 del_XIV(SvANY(sv));
5316 break;
5317 case SVt_NV:
5318 del_XNV(SvANY(sv));
5319 break;
ed6116ce
LW
5320 case SVt_RV:
5321 del_XRV(SvANY(sv));
5322 break;
79072805
LW
5323 case SVt_PV:
5324 del_XPV(SvANY(sv));
5325 break;
5326 case SVt_PVIV:
5327 del_XPVIV(SvANY(sv));
5328 break;
5329 case SVt_PVNV:
5330 del_XPVNV(SvANY(sv));
5331 break;
5332 case SVt_PVMG:
5333 del_XPVMG(SvANY(sv));
5334 break;
5335 case SVt_PVLV:
5336 del_XPVLV(SvANY(sv));
5337 break;
5338 case SVt_PVAV:
5339 del_XPVAV(SvANY(sv));
5340 break;
5341 case SVt_PVHV:
5342 del_XPVHV(SvANY(sv));
5343 break;
5344 case SVt_PVCV:
5345 del_XPVCV(SvANY(sv));
5346 break;
5347 case SVt_PVGV:
5348 del_XPVGV(SvANY(sv));
ec12f114
JPC
5349 /* code duplication for increased performance. */
5350 SvFLAGS(sv) &= SVf_BREAK;
5351 SvFLAGS(sv) |= SVTYPEMASK;
5352 /* decrease refcount of the stash that owns this GV, if any */
5353 if (stash)
5354 SvREFCNT_dec(stash);
5355 return; /* not break, SvFLAGS reset already happened */
79072805
LW
5356 case SVt_PVBM:
5357 del_XPVBM(SvANY(sv));
5358 break;
5359 case SVt_PVFM:
5360 del_XPVFM(SvANY(sv));
5361 break;
8990e307
LW
5362 case SVt_PVIO:
5363 del_XPVIO(SvANY(sv));
5364 break;
79072805 5365 }
a0d0e21e 5366 SvFLAGS(sv) &= SVf_BREAK;
8990e307 5367 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
5368}
5369
645c22ef
DM
5370/*
5371=for apidoc sv_newref
5372
5373Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5374instead.
5375
5376=cut
5377*/
5378
79072805 5379SV *
864dbfa3 5380Perl_sv_newref(pTHX_ SV *sv)
79072805 5381{
463ee0b2 5382 if (sv)
dce16143 5383 ATOMIC_INC(SvREFCNT(sv));
79072805
LW
5384 return sv;
5385}
5386
c461cf8f
JH
5387/*
5388=for apidoc sv_free
5389
645c22ef
DM
5390Decrement an SV's reference count, and if it drops to zero, call
5391C<sv_clear> to invoke destructors and free up any memory used by
5392the body; finally, deallocate the SV's head itself.
5393Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5394
5395=cut
5396*/
5397
79072805 5398void
864dbfa3 5399Perl_sv_free(pTHX_ SV *sv)
79072805 5400{
dce16143
MB
5401 int refcount_is_zero;
5402
79072805
LW
5403 if (!sv)
5404 return;
a0d0e21e
LW
5405 if (SvREFCNT(sv) == 0) {
5406 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5407 /* this SV's refcnt has been artificially decremented to
5408 * trigger cleanup */
a0d0e21e 5409 return;
3280af22 5410 if (PL_in_clean_all) /* All is fair */
1edc1566 5411 return;
d689ffdd
JP
5412 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5413 /* make sure SvREFCNT(sv)==0 happens very seldom */
5414 SvREFCNT(sv) = (~(U32)0)/2;
5415 return;
5416 }
0453d815 5417 if (ckWARN_d(WARN_INTERNAL))
9014280d 5418 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Attempt to free unreferenced scalar");
79072805
LW
5419 return;
5420 }
dce16143 5421 ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
b881518d 5422 if (!refcount_is_zero)
8990e307 5423 return;
463ee0b2
LW
5424#ifdef DEBUGGING
5425 if (SvTEMP(sv)) {
0453d815 5426 if (ckWARN_d(WARN_DEBUGGING))
9014280d 5427 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
1d7c1841
GS
5428 "Attempt to free temp prematurely: SV 0x%"UVxf,
5429 PTR2UV(sv));
79072805 5430 return;
79072805 5431 }
463ee0b2 5432#endif
d689ffdd
JP
5433 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5434 /* make sure SvREFCNT(sv)==0 happens very seldom */
5435 SvREFCNT(sv) = (~(U32)0)/2;
5436 return;
5437 }
79072805 5438 sv_clear(sv);
477f5d66
CS
5439 if (! SvREFCNT(sv))
5440 del_SV(sv);
79072805
LW
5441}
5442
954c1994
GS
5443/*
5444=for apidoc sv_len
5445
645c22ef
DM
5446Returns the length of the string in the SV. Handles magic and type
5447coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5448
5449=cut
5450*/
5451
79072805 5452STRLEN
864dbfa3 5453Perl_sv_len(pTHX_ register SV *sv)
79072805 5454{
463ee0b2 5455 STRLEN len;
79072805
LW
5456
5457 if (!sv)
5458 return 0;
5459
8990e307 5460 if (SvGMAGICAL(sv))
565764a8 5461 len = mg_length(sv);
8990e307 5462 else
497b47a8 5463 (void)SvPV(sv, len);
463ee0b2 5464 return len;
79072805
LW
5465}
5466
c461cf8f
JH
5467/*
5468=for apidoc sv_len_utf8
5469
5470Returns the number of characters in the string in an SV, counting wide
645c22ef 5471UTF8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5472
5473=cut
5474*/
5475
a0ed51b3 5476STRLEN
864dbfa3 5477Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 5478{
a0ed51b3
LW
5479 if (!sv)
5480 return 0;
5481
a0ed51b3 5482 if (SvGMAGICAL(sv))
b76347f2 5483 return mg_length(sv);
a0ed51b3 5484 else
b76347f2
JH
5485 {
5486 STRLEN len;
5487 U8 *s = (U8*)SvPV(sv, len);
5488
d6efbbad 5489 return Perl_utf8_length(aTHX_ s, s + len);
a0ed51b3 5490 }
a0ed51b3
LW
5491}
5492
645c22ef
DM
5493/*
5494=for apidoc sv_pos_u2b
5495
5496Converts the value pointed to by offsetp from a count of UTF8 chars from
5497the start of the string, to a count of the equivalent number of bytes; if
5498lenp is non-zero, it does the same to lenp, but this time starting from
5499the offset, rather than from the start of the string. Handles magic and
5500type coercion.
5501
5502=cut
5503*/
5504
a0ed51b3 5505void
864dbfa3 5506Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 5507{
dfe13c55
GS
5508 U8 *start;
5509 U8 *s;
5510 U8 *send;
a0ed51b3
LW
5511 I32 uoffset = *offsetp;
5512 STRLEN len;
5513
5514 if (!sv)
5515 return;
5516
dfe13c55 5517 start = s = (U8*)SvPV(sv, len);
a0ed51b3
LW
5518 send = s + len;
5519 while (s < send && uoffset--)
5520 s += UTF8SKIP(s);
bb40f870
GA
5521 if (s >= send)
5522 s = send;
a0ed51b3
LW
5523 *offsetp = s - start;
5524 if (lenp) {
5525 I32 ulen = *lenp;
5526 start = s;
5527 while (s < send && ulen--)
5528 s += UTF8SKIP(s);
bb40f870
GA
5529 if (s >= send)
5530 s = send;
a0ed51b3
LW
5531 *lenp = s - start;
5532 }
5533 return;
5534}
5535
645c22ef
DM
5536/*
5537=for apidoc sv_pos_b2u
5538
5539Converts the value pointed to by offsetp from a count of bytes from the
5540start of the string, to a count of the equivalent number of UTF8 chars.
5541Handles magic and type coercion.
5542
5543=cut
5544*/
5545
a0ed51b3 5546void
864dbfa3 5547Perl_sv_pos_b2u(pTHX_ register SV *sv, I32* offsetp)
a0ed51b3 5548{
dfe13c55
GS
5549 U8 *s;
5550 U8 *send;
a0ed51b3
LW
5551 STRLEN len;
5552
5553 if (!sv)
5554 return;
5555
dfe13c55 5556 s = (U8*)SvPV(sv, len);
eb160463 5557 if ((I32)len < *offsetp)
a0dbb045 5558 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
a0ed51b3
LW
5559 send = s + *offsetp;
5560 len = 0;
5561 while (s < send) {
cc07378b
JH
5562 STRLEN n = 1;
5563 /* Call utf8n_to_uvchr() to validate the sequence
5564 * (unless a simple non-UTF character) */
5565 if (!UTF8_IS_INVARIANT(*s))
5566 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
2b9d42f0 5567 if (n > 0) {
a0dbb045
JH
5568 s += n;
5569 len++;
5570 }
5571 else
5572 break;
a0ed51b3
LW
5573 }
5574 *offsetp = len;
5575 return;
5576}
5577
954c1994
GS
5578/*
5579=for apidoc sv_eq
5580
5581Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
5582identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5583coerce its args to strings if necessary.
954c1994
GS
5584
5585=cut
5586*/
5587
79072805 5588I32
e01b9e88 5589Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805
LW
5590{
5591 char *pv1;
463ee0b2 5592 STRLEN cur1;
79072805 5593 char *pv2;
463ee0b2 5594 STRLEN cur2;
e01b9e88 5595 I32 eq = 0;
553e1bcc
AT
5596 char *tpv = Nullch;
5597 SV* svrecode = Nullsv;
79072805 5598
e01b9e88 5599 if (!sv1) {
79072805
LW
5600 pv1 = "";
5601 cur1 = 0;
5602 }
463ee0b2 5603 else
e01b9e88 5604 pv1 = SvPV(sv1, cur1);
79072805 5605
e01b9e88
SC
5606 if (!sv2){
5607 pv2 = "";
5608 cur2 = 0;
92d29cee 5609 }
e01b9e88
SC
5610 else
5611 pv2 = SvPV(sv2, cur2);
79072805 5612
cf48d248 5613 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
5614 /* Differing utf8ness.
5615 * Do not UTF8size the comparands as a side-effect. */
5616 if (PL_encoding) {
5617 if (SvUTF8(sv1)) {
553e1bcc
AT
5618 svrecode = newSVpvn(pv2, cur2);
5619 sv_recode_to_utf8(svrecode, PL_encoding);
5620 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
5621 }
5622 else {
553e1bcc
AT
5623 svrecode = newSVpvn(pv1, cur1);
5624 sv_recode_to_utf8(svrecode, PL_encoding);
5625 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
5626 }
5627 /* Now both are in UTF-8. */
5628 if (cur1 != cur2)
5629 return FALSE;
5630 }
5631 else {
5632 bool is_utf8 = TRUE;
5633
5634 if (SvUTF8(sv1)) {
5635 /* sv1 is the UTF-8 one,
5636 * if is equal it must be downgrade-able */
5637 char *pv = (char*)bytes_from_utf8((U8*)pv1,
5638 &cur1, &is_utf8);
5639 if (pv != pv1)
553e1bcc 5640 pv1 = tpv = pv;
799ef3cb
JH
5641 }
5642 else {
5643 /* sv2 is the UTF-8 one,
5644 * if is equal it must be downgrade-able */
5645 char *pv = (char *)bytes_from_utf8((U8*)pv2,
5646 &cur2, &is_utf8);
5647 if (pv != pv2)
553e1bcc 5648 pv2 = tpv = pv;
799ef3cb
JH
5649 }
5650 if (is_utf8) {
5651 /* Downgrade not possible - cannot be eq */
5652 return FALSE;
5653 }
5654 }
cf48d248
JH
5655 }
5656
5657 if (cur1 == cur2)
765f542d 5658 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 5659
553e1bcc
AT
5660 if (svrecode)
5661 SvREFCNT_dec(svrecode);
799ef3cb 5662
553e1bcc
AT
5663 if (tpv)
5664 Safefree(tpv);
cf48d248 5665
e01b9e88 5666 return eq;
79072805
LW
5667}
5668
954c1994
GS
5669/*
5670=for apidoc sv_cmp
5671
5672Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
5673string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
5674C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5675coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
5676
5677=cut
5678*/
5679
79072805 5680I32
e01b9e88 5681Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 5682{
560a288e 5683 STRLEN cur1, cur2;
553e1bcc 5684 char *pv1, *pv2, *tpv = Nullch;
cf48d248 5685 I32 cmp;
553e1bcc 5686 SV *svrecode = Nullsv;
560a288e 5687
e01b9e88
SC
5688 if (!sv1) {
5689 pv1 = "";
560a288e
GS
5690 cur1 = 0;
5691 }
e01b9e88
SC
5692 else
5693 pv1 = SvPV(sv1, cur1);
560a288e 5694
553e1bcc 5695 if (!sv2) {
e01b9e88 5696 pv2 = "";
560a288e
GS
5697 cur2 = 0;
5698 }
e01b9e88
SC
5699 else
5700 pv2 = SvPV(sv2, cur2);
79072805 5701
cf48d248 5702 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
5703 /* Differing utf8ness.
5704 * Do not UTF8size the comparands as a side-effect. */
cf48d248 5705 if (SvUTF8(sv1)) {
799ef3cb 5706 if (PL_encoding) {
553e1bcc
AT
5707 svrecode = newSVpvn(pv2, cur2);
5708 sv_recode_to_utf8(svrecode, PL_encoding);
5709 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
5710 }
5711 else {
553e1bcc 5712 pv2 = tpv = (char*)bytes_to_utf8((U8*)pv2, &cur2);
799ef3cb 5713 }
cf48d248
JH
5714 }
5715 else {
799ef3cb 5716 if (PL_encoding) {
553e1bcc
AT
5717 svrecode = newSVpvn(pv1, cur1);
5718 sv_recode_to_utf8(svrecode, PL_encoding);
5719 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
5720 }
5721 else {
553e1bcc 5722 pv1 = tpv = (char*)bytes_to_utf8((U8*)pv1, &cur1);
799ef3cb 5723 }
cf48d248
JH
5724 }
5725 }
5726
e01b9e88 5727 if (!cur1) {
cf48d248 5728 cmp = cur2 ? -1 : 0;
e01b9e88 5729 } else if (!cur2) {
cf48d248
JH
5730 cmp = 1;
5731 } else {
5732 I32 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
5733
5734 if (retval) {
cf48d248 5735 cmp = retval < 0 ? -1 : 1;
e01b9e88 5736 } else if (cur1 == cur2) {
cf48d248
JH
5737 cmp = 0;
5738 } else {
5739 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 5740 }
cf48d248 5741 }
16660edb 5742
553e1bcc
AT
5743 if (svrecode)
5744 SvREFCNT_dec(svrecode);
799ef3cb 5745
553e1bcc
AT
5746 if (tpv)
5747 Safefree(tpv);
cf48d248
JH
5748
5749 return cmp;
bbce6d69 5750}
16660edb 5751
c461cf8f
JH
5752/*
5753=for apidoc sv_cmp_locale
5754
645c22ef
DM
5755Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
5756'use bytes' aware, handles get magic, and will coerce its args to strings
5757if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
5758
5759=cut
5760*/
5761
bbce6d69 5762I32
864dbfa3 5763Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 5764{
36477c24 5765#ifdef USE_LOCALE_COLLATE
16660edb 5766
bbce6d69 5767 char *pv1, *pv2;
5768 STRLEN len1, len2;
5769 I32 retval;
16660edb 5770
3280af22 5771 if (PL_collation_standard)
bbce6d69 5772 goto raw_compare;
16660edb 5773
bbce6d69 5774 len1 = 0;
8ac85365 5775 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 5776 len2 = 0;
8ac85365 5777 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 5778
bbce6d69 5779 if (!pv1 || !len1) {
5780 if (pv2 && len2)
5781 return -1;
5782 else
5783 goto raw_compare;
5784 }
5785 else {
5786 if (!pv2 || !len2)
5787 return 1;
5788 }
16660edb 5789
bbce6d69 5790 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 5791
bbce6d69 5792 if (retval)
16660edb 5793 return retval < 0 ? -1 : 1;
5794
bbce6d69 5795 /*
5796 * When the result of collation is equality, that doesn't mean
5797 * that there are no differences -- some locales exclude some
5798 * characters from consideration. So to avoid false equalities,
5799 * we use the raw string as a tiebreaker.
5800 */
16660edb 5801
bbce6d69 5802 raw_compare:
5803 /* FALL THROUGH */
16660edb 5804
36477c24 5805#endif /* USE_LOCALE_COLLATE */
16660edb 5806
bbce6d69 5807 return sv_cmp(sv1, sv2);
5808}
79072805 5809
645c22ef 5810
36477c24 5811#ifdef USE_LOCALE_COLLATE
645c22ef 5812
7a4c00b4 5813/*
645c22ef
DM
5814=for apidoc sv_collxfrm
5815
5816Add Collate Transform magic to an SV if it doesn't already have it.
5817
5818Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
5819scalar data of the variable, but transformed to such a format that a normal
5820memory comparison can be used to compare the data according to the locale
5821settings.
5822
5823=cut
5824*/
5825
bbce6d69 5826char *
864dbfa3 5827Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 5828{
7a4c00b4 5829 MAGIC *mg;
16660edb 5830
14befaf4 5831 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 5832 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 5833 char *s, *xf;
5834 STRLEN len, xlen;
5835
7a4c00b4 5836 if (mg)
5837 Safefree(mg->mg_ptr);
bbce6d69 5838 s = SvPV(sv, len);
5839 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 5840 if (SvREADONLY(sv)) {
5841 SAVEFREEPV(xf);
5842 *nxp = xlen;
3280af22 5843 return xf + sizeof(PL_collation_ix);
ff0cee69 5844 }
7a4c00b4 5845 if (! mg) {
14befaf4
DM
5846 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
5847 mg = mg_find(sv, PERL_MAGIC_collxfrm);
7a4c00b4 5848 assert(mg);
bbce6d69 5849 }
7a4c00b4 5850 mg->mg_ptr = xf;
565764a8 5851 mg->mg_len = xlen;
7a4c00b4 5852 }
5853 else {
ff0cee69 5854 if (mg) {
5855 mg->mg_ptr = NULL;
565764a8 5856 mg->mg_len = -1;
ff0cee69 5857 }
bbce6d69 5858 }
5859 }
7a4c00b4 5860 if (mg && mg->mg_ptr) {
565764a8 5861 *nxp = mg->mg_len;
3280af22 5862 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 5863 }
5864 else {
5865 *nxp = 0;
5866 return NULL;
16660edb 5867 }
79072805
LW
5868}
5869
36477c24 5870#endif /* USE_LOCALE_COLLATE */
bbce6d69 5871
c461cf8f
JH
5872/*
5873=for apidoc sv_gets
5874
5875Get a line from the filehandle and store it into the SV, optionally
5876appending to the currently-stored string.
5877
5878=cut
5879*/
5880
79072805 5881char *
864dbfa3 5882Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 5883{
c07a80fd 5884 char *rsptr;
5885 STRLEN rslen;
5886 register STDCHAR rslast;
5887 register STDCHAR *bp;
5888 register I32 cnt;
9c5ffd7c 5889 I32 i = 0;
8bfdd7d9 5890 I32 rspara = 0;
c07a80fd 5891
765f542d
NC
5892 SV_CHECK_THINKFIRST_COW_DROP(sv);
5893 /* XXX. If you make this PVIV, then copy on write can copy scalars read
5894 from <>.
5895 However, perlbench says it's slower, because the existing swipe code
5896 is faster than copy on write.
5897 Swings and roundabouts. */
6fc92669 5898 (void)SvUPGRADE(sv, SVt_PV);
99491443 5899
ff68c719 5900 SvSCREAM_off(sv);
c07a80fd 5901
8bfdd7d9
HS
5902 if (PL_curcop == &PL_compiling) {
5903 /* we always read code in line mode */
5904 rsptr = "\n";
5905 rslen = 1;
5906 }
5907 else if (RsSNARF(PL_rs)) {
c07a80fd 5908 rsptr = NULL;
5909 rslen = 0;
5910 }
3280af22 5911 else if (RsRECORD(PL_rs)) {
5b2b9c68
HM
5912 I32 recsize, bytesread;
5913 char *buffer;
5914
5915 /* Grab the size of the record we're getting */
3280af22 5916 recsize = SvIV(SvRV(PL_rs));
5b2b9c68 5917 (void)SvPOK_only(sv); /* Validate pointer */
eb160463 5918 buffer = SvGROW(sv, (STRLEN)(recsize + 1));
5b2b9c68
HM
5919 /* Go yank in */
5920#ifdef VMS
5921 /* VMS wants read instead of fread, because fread doesn't respect */
5922 /* RMS record boundaries. This is not necessarily a good thing to be */
5923 /* doing, but we've got no other real choice */
5924 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
5925#else
5926 bytesread = PerlIO_read(fp, buffer, recsize);
5927#endif
5928 SvCUR_set(sv, bytesread);
e670df4e 5929 buffer[bytesread] = '\0';
7d59b7e4
NIS
5930 if (PerlIO_isutf8(fp))
5931 SvUTF8_on(sv);
5932 else
5933 SvUTF8_off(sv);
5b2b9c68
HM
5934 return(SvCUR(sv) ? SvPVX(sv) : Nullch);
5935 }
3280af22 5936 else if (RsPARA(PL_rs)) {
c07a80fd 5937 rsptr = "\n\n";
5938 rslen = 2;
8bfdd7d9 5939 rspara = 1;
c07a80fd 5940 }
7d59b7e4
NIS
5941 else {
5942 /* Get $/ i.e. PL_rs into same encoding as stream wants */
5943 if (PerlIO_isutf8(fp)) {
5944 rsptr = SvPVutf8(PL_rs, rslen);
5945 }
5946 else {
5947 if (SvUTF8(PL_rs)) {
5948 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
5949 Perl_croak(aTHX_ "Wide character in $/");
5950 }
5951 }
5952 rsptr = SvPV(PL_rs, rslen);
5953 }
5954 }
5955
c07a80fd 5956 rslast = rslen ? rsptr[rslen - 1] : '\0';
5957
8bfdd7d9 5958 if (rspara) { /* have to do this both before and after */
79072805 5959 do { /* to make sure file boundaries work right */
760ac839 5960 if (PerlIO_eof(fp))
a0d0e21e 5961 return 0;
760ac839 5962 i = PerlIO_getc(fp);
79072805 5963 if (i != '\n') {
a0d0e21e
LW
5964 if (i == -1)
5965 return 0;
760ac839 5966 PerlIO_ungetc(fp,i);
79072805
LW
5967 break;
5968 }
5969 } while (i != EOF);
5970 }
c07a80fd 5971
760ac839
LW
5972 /* See if we know enough about I/O mechanism to cheat it ! */
5973
5974 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 5975 of abstracting out stdio interface. One call should be cheap
760ac839
LW
5976 enough here - and may even be a macro allowing compile
5977 time optimization.
5978 */
5979
5980 if (PerlIO_fast_gets(fp)) {
5981
5982 /*
5983 * We're going to steal some values from the stdio struct
5984 * and put EVERYTHING in the innermost loop into registers.
5985 */
5986 register STDCHAR *ptr;
5987 STRLEN bpx;
5988 I32 shortbuffered;
5989
16660edb 5990#if defined(VMS) && defined(PERLIO_IS_STDIO)
5991 /* An ungetc()d char is handled separately from the regular
5992 * buffer, so we getc() it back out and stuff it in the buffer.
5993 */
5994 i = PerlIO_getc(fp);
5995 if (i == EOF) return 0;
5996 *(--((*fp)->_ptr)) = (unsigned char) i;
5997 (*fp)->_cnt++;
5998#endif
c07a80fd 5999
c2960299 6000 /* Here is some breathtakingly efficient cheating */
c07a80fd 6001
a20bf0c3 6002 cnt = PerlIO_get_cnt(fp); /* get count into register */
a0d0e21e 6003 (void)SvPOK_only(sv); /* validate pointer */
eb160463
GS
6004 if ((I32)(SvLEN(sv) - append) <= cnt + 1) { /* make sure we have the room */
6005 if (cnt > 80 && (I32)SvLEN(sv) > append) {
79072805
LW
6006 shortbuffered = cnt - SvLEN(sv) + append + 1;
6007 cnt -= shortbuffered;
6008 }
6009 else {
6010 shortbuffered = 0;
bbce6d69 6011 /* remember that cnt can be negative */
eb160463 6012 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
6013 }
6014 }
6015 else
6016 shortbuffered = 0;
c07a80fd 6017 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
a20bf0c3 6018 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 6019 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6020 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 6021 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 6022 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6023 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6024 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
6025 for (;;) {
6026 screamer:
93a17b20 6027 if (cnt > 0) {
c07a80fd 6028 if (rslen) {
760ac839
LW
6029 while (cnt > 0) { /* this | eat */
6030 cnt--;
c07a80fd 6031 if ((*bp++ = *ptr++) == rslast) /* really | dust */
6032 goto thats_all_folks; /* screams | sed :-) */
6033 }
6034 }
6035 else {
1c846c1f
NIS
6036 Copy(ptr, bp, cnt, char); /* this | eat */
6037 bp += cnt; /* screams | dust */
c07a80fd 6038 ptr += cnt; /* louder | sed :-) */
a5f75d66 6039 cnt = 0;
93a17b20 6040 }
79072805
LW
6041 }
6042
748a9306 6043 if (shortbuffered) { /* oh well, must extend */
79072805
LW
6044 cnt = shortbuffered;
6045 shortbuffered = 0;
c07a80fd 6046 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
6047 SvCUR_set(sv, bpx);
6048 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 6049 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
6050 continue;
6051 }
6052
16660edb 6053 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
6054 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
6055 PTR2UV(ptr),(long)cnt));
cc00df79 6056 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 6057#if 0
16660edb 6058 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6059 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6060 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6061 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6062#endif
1c846c1f 6063 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 6064 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
6065 another abstraction. */
760ac839 6066 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 6067#if 0
16660edb 6068 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6069 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6070 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6071 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6072#endif
a20bf0c3
JH
6073 cnt = PerlIO_get_cnt(fp);
6074 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 6075 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6076 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 6077
748a9306
LW
6078 if (i == EOF) /* all done for ever? */
6079 goto thats_really_all_folks;
6080
c07a80fd 6081 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
6082 SvCUR_set(sv, bpx);
6083 SvGROW(sv, bpx + cnt + 2);
c07a80fd 6084 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
6085
eb160463 6086 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 6087
c07a80fd 6088 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 6089 goto thats_all_folks;
79072805
LW
6090 }
6091
6092thats_all_folks:
eb160463 6093 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX(sv)) < rslen) ||
36477c24 6094 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 6095 goto screamer; /* go back to the fray */
79072805
LW
6096thats_really_all_folks:
6097 if (shortbuffered)
6098 cnt += shortbuffered;
16660edb 6099 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6100 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 6101 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 6102 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6103 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6104 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6105 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 6106 *bp = '\0';
760ac839 6107 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 6108 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 6109 "Screamer: done, len=%ld, string=|%.*s|\n",
6110 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
6111 }
6112 else
79072805 6113 {
4d2c4e07 6114#ifndef EPOC
760ac839 6115 /*The big, slow, and stupid way */
c07a80fd 6116 STDCHAR buf[8192];
4d2c4e07
OF
6117#else
6118 /* Need to work around EPOC SDK features */
6119 /* On WINS: MS VC5 generates calls to _chkstk, */
6120 /* if a `large' stack frame is allocated */
6121 /* gcc on MARM does not generate calls like these */
6122 STDCHAR buf[1024];
6123#endif
79072805 6124
760ac839 6125screamer2:
c07a80fd 6126 if (rslen) {
760ac839
LW
6127 register STDCHAR *bpe = buf + sizeof(buf);
6128 bp = buf;
eb160463 6129 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
6130 ; /* keep reading */
6131 cnt = bp - buf;
c07a80fd 6132 }
6133 else {
760ac839 6134 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 6135 /* Accomodate broken VAXC compiler, which applies U8 cast to
6136 * both args of ?: operator, causing EOF to change into 255
6137 */
37be0adf 6138 if (cnt > 0)
cbe9e203
JH
6139 i = (U8)buf[cnt - 1];
6140 else
37be0adf 6141 i = EOF;
c07a80fd 6142 }
79072805 6143
cbe9e203
JH
6144 if (cnt < 0)
6145 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
6146 if (append)
6147 sv_catpvn(sv, (char *) buf, cnt);
6148 else
6149 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 6150
6151 if (i != EOF && /* joy */
6152 (!rslen ||
6153 SvCUR(sv) < rslen ||
36477c24 6154 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
6155 {
6156 append = -1;
63e4d877
CS
6157 /*
6158 * If we're reading from a TTY and we get a short read,
6159 * indicating that the user hit his EOF character, we need
6160 * to notice it now, because if we try to read from the TTY
6161 * again, the EOF condition will disappear.
6162 *
6163 * The comparison of cnt to sizeof(buf) is an optimization
6164 * that prevents unnecessary calls to feof().
6165 *
6166 * - jik 9/25/96
6167 */
6168 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
6169 goto screamer2;
79072805
LW
6170 }
6171 }
6172
8bfdd7d9 6173 if (rspara) { /* have to do this both before and after */
c07a80fd 6174 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 6175 i = PerlIO_getc(fp);
79072805 6176 if (i != '\n') {
760ac839 6177 PerlIO_ungetc(fp,i);
79072805
LW
6178 break;
6179 }
6180 }
6181 }
c07a80fd 6182
7d59b7e4
NIS
6183 if (PerlIO_isutf8(fp))
6184 SvUTF8_on(sv);
6185 else
6186 SvUTF8_off(sv);
6187
c07a80fd 6188 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
6189}
6190
954c1994
GS
6191/*
6192=for apidoc sv_inc
6193
645c22ef
DM
6194Auto-increment of the value in the SV, doing string to numeric conversion
6195if necessary. Handles 'get' magic.
954c1994
GS
6196
6197=cut
6198*/
6199
79072805 6200void
864dbfa3 6201Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
6202{
6203 register char *d;
463ee0b2 6204 int flags;
79072805
LW
6205
6206 if (!sv)
6207 return;
b23a5f78
GB
6208 if (SvGMAGICAL(sv))
6209 mg_get(sv);
ed6116ce 6210 if (SvTHINKFIRST(sv)) {
765f542d
NC
6211 if (SvIsCOW(sv))
6212 sv_force_normal_flags(sv, 0);
0f15f207 6213 if (SvREADONLY(sv)) {
3280af22 6214 if (PL_curcop != &PL_compiling)
cea2e8a9 6215 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6216 }
a0d0e21e 6217 if (SvROK(sv)) {
b5be31e9 6218 IV i;
9e7bc3e8
JD
6219 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
6220 return;
56431972 6221 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6222 sv_unref(sv);
6223 sv_setiv(sv, i);
a0d0e21e 6224 }
ed6116ce 6225 }
8990e307 6226 flags = SvFLAGS(sv);
28e5dec8
JH
6227 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
6228 /* It's (privately or publicly) a float, but not tested as an
6229 integer, so test it to see. */
d460ef45 6230 (void) SvIV(sv);
28e5dec8
JH
6231 flags = SvFLAGS(sv);
6232 }
6233 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6234 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6235#ifdef PERL_PRESERVE_IVUV
28e5dec8 6236 oops_its_int:
59d8ce62 6237#endif
25da4f38
IZ
6238 if (SvIsUV(sv)) {
6239 if (SvUVX(sv) == UV_MAX)
a1e868e7 6240 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
6241 else
6242 (void)SvIOK_only_UV(sv);
6243 ++SvUVX(sv);
6244 } else {
6245 if (SvIVX(sv) == IV_MAX)
28e5dec8 6246 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
6247 else {
6248 (void)SvIOK_only(sv);
6249 ++SvIVX(sv);
1c846c1f 6250 }
55497cff 6251 }
79072805
LW
6252 return;
6253 }
28e5dec8
JH
6254 if (flags & SVp_NOK) {
6255 (void)SvNOK_only(sv);
6256 SvNVX(sv) += 1.0;
6257 return;
6258 }
6259
8990e307 6260 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
28e5dec8
JH
6261 if ((flags & SVTYPEMASK) < SVt_PVIV)
6262 sv_upgrade(sv, SVt_IV);
6263 (void)SvIOK_only(sv);
6264 SvIVX(sv) = 1;
79072805
LW
6265 return;
6266 }
463ee0b2 6267 d = SvPVX(sv);
79072805
LW
6268 while (isALPHA(*d)) d++;
6269 while (isDIGIT(*d)) d++;
6270 if (*d) {
28e5dec8 6271#ifdef PERL_PRESERVE_IVUV
d1be9408 6272 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
6273 warnings. Probably ought to make the sv_iv_please() that does
6274 the conversion if possible, and silently. */
c2988b20 6275 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
6276 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6277 /* Need to try really hard to see if it's an integer.
6278 9.22337203685478e+18 is an integer.
6279 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6280 so $a="9.22337203685478e+18"; $a+0; $a++
6281 needs to be the same as $a="9.22337203685478e+18"; $a++
6282 or we go insane. */
d460ef45 6283
28e5dec8
JH
6284 (void) sv_2iv(sv);
6285 if (SvIOK(sv))
6286 goto oops_its_int;
6287
6288 /* sv_2iv *should* have made this an NV */
6289 if (flags & SVp_NOK) {
6290 (void)SvNOK_only(sv);
6291 SvNVX(sv) += 1.0;
6292 return;
6293 }
6294 /* I don't think we can get here. Maybe I should assert this
6295 And if we do get here I suspect that sv_setnv will croak. NWC
6296 Fall through. */
6297#if defined(USE_LONG_DOUBLE)
6298 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",
6299 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6300#else
1779d84d 6301 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
6302 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6303#endif
6304 }
6305#endif /* PERL_PRESERVE_IVUV */
6306 sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
79072805
LW
6307 return;
6308 }
6309 d--;
463ee0b2 6310 while (d >= SvPVX(sv)) {
79072805
LW
6311 if (isDIGIT(*d)) {
6312 if (++*d <= '9')
6313 return;
6314 *(d--) = '0';
6315 }
6316 else {
9d116dd7
JH
6317#ifdef EBCDIC
6318 /* MKS: The original code here died if letters weren't consecutive.
6319 * at least it didn't have to worry about non-C locales. The
6320 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 6321 * arranged in order (although not consecutively) and that only
9d116dd7
JH
6322 * [A-Za-z] are accepted by isALPHA in the C locale.
6323 */
6324 if (*d != 'z' && *d != 'Z') {
6325 do { ++*d; } while (!isALPHA(*d));
6326 return;
6327 }
6328 *(d--) -= 'z' - 'a';
6329#else
79072805
LW
6330 ++*d;
6331 if (isALPHA(*d))
6332 return;
6333 *(d--) -= 'z' - 'a' + 1;
9d116dd7 6334#endif
79072805
LW
6335 }
6336 }
6337 /* oh,oh, the number grew */
6338 SvGROW(sv, SvCUR(sv) + 2);
6339 SvCUR(sv)++;
463ee0b2 6340 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
6341 *d = d[-1];
6342 if (isDIGIT(d[1]))
6343 *d = '1';
6344 else
6345 *d = d[1];
6346}
6347
954c1994
GS
6348/*
6349=for apidoc sv_dec
6350
645c22ef
DM
6351Auto-decrement of the value in the SV, doing string to numeric conversion
6352if necessary. Handles 'get' magic.
954c1994
GS
6353
6354=cut
6355*/
6356
79072805 6357void
864dbfa3 6358Perl_sv_dec(pTHX_ register SV *sv)
79072805 6359{
463ee0b2
LW
6360 int flags;
6361
79072805
LW
6362 if (!sv)
6363 return;
b23a5f78
GB
6364 if (SvGMAGICAL(sv))
6365 mg_get(sv);
ed6116ce 6366 if (SvTHINKFIRST(sv)) {
765f542d
NC
6367 if (SvIsCOW(sv))
6368 sv_force_normal_flags(sv, 0);
0f15f207 6369 if (SvREADONLY(sv)) {
3280af22 6370 if (PL_curcop != &PL_compiling)
cea2e8a9 6371 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6372 }
a0d0e21e 6373 if (SvROK(sv)) {
b5be31e9 6374 IV i;
9e7bc3e8
JD
6375 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6376 return;
56431972 6377 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6378 sv_unref(sv);
6379 sv_setiv(sv, i);
a0d0e21e 6380 }
ed6116ce 6381 }
28e5dec8
JH
6382 /* Unlike sv_inc we don't have to worry about string-never-numbers
6383 and keeping them magic. But we mustn't warn on punting */
8990e307 6384 flags = SvFLAGS(sv);
28e5dec8
JH
6385 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6386 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6387#ifdef PERL_PRESERVE_IVUV
28e5dec8 6388 oops_its_int:
59d8ce62 6389#endif
25da4f38
IZ
6390 if (SvIsUV(sv)) {
6391 if (SvUVX(sv) == 0) {
6392 (void)SvIOK_only(sv);
6393 SvIVX(sv) = -1;
6394 }
6395 else {
6396 (void)SvIOK_only_UV(sv);
6397 --SvUVX(sv);
1c846c1f 6398 }
25da4f38
IZ
6399 } else {
6400 if (SvIVX(sv) == IV_MIN)
65202027 6401 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
6402 else {
6403 (void)SvIOK_only(sv);
6404 --SvIVX(sv);
1c846c1f 6405 }
55497cff 6406 }
6407 return;
6408 }
28e5dec8
JH
6409 if (flags & SVp_NOK) {
6410 SvNVX(sv) -= 1.0;
6411 (void)SvNOK_only(sv);
6412 return;
6413 }
8990e307 6414 if (!(flags & SVp_POK)) {
4633a7c4
LW
6415 if ((flags & SVTYPEMASK) < SVt_PVNV)
6416 sv_upgrade(sv, SVt_NV);
463ee0b2 6417 SvNVX(sv) = -1.0;
a0d0e21e 6418 (void)SvNOK_only(sv);
79072805
LW
6419 return;
6420 }
28e5dec8
JH
6421#ifdef PERL_PRESERVE_IVUV
6422 {
c2988b20 6423 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
6424 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6425 /* Need to try really hard to see if it's an integer.
6426 9.22337203685478e+18 is an integer.
6427 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6428 so $a="9.22337203685478e+18"; $a+0; $a--
6429 needs to be the same as $a="9.22337203685478e+18"; $a--
6430 or we go insane. */
d460ef45 6431
28e5dec8
JH
6432 (void) sv_2iv(sv);
6433 if (SvIOK(sv))
6434 goto oops_its_int;
6435
6436 /* sv_2iv *should* have made this an NV */
6437 if (flags & SVp_NOK) {
6438 (void)SvNOK_only(sv);
6439 SvNVX(sv) -= 1.0;
6440 return;
6441 }
6442 /* I don't think we can get here. Maybe I should assert this
6443 And if we do get here I suspect that sv_setnv will croak. NWC
6444 Fall through. */
6445#if defined(USE_LONG_DOUBLE)
6446 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",
6447 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6448#else
1779d84d 6449 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
6450 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6451#endif
6452 }
6453 }
6454#endif /* PERL_PRESERVE_IVUV */
097ee67d 6455 sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
6456}
6457
954c1994
GS
6458/*
6459=for apidoc sv_mortalcopy
6460
645c22ef 6461Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
6462The new SV is marked as mortal. It will be destroyed "soon", either by an
6463explicit call to FREETMPS, or by an implicit call at places such as
6464statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
6465
6466=cut
6467*/
6468
79072805
LW
6469/* Make a string that will exist for the duration of the expression
6470 * evaluation. Actually, it may have to last longer than that, but
6471 * hopefully we won't free it until it has been assigned to a
6472 * permanent location. */
6473
6474SV *
864dbfa3 6475Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 6476{
463ee0b2 6477 register SV *sv;
b881518d 6478
4561caa4 6479 new_SV(sv);
79072805 6480 sv_setsv(sv,oldstr);
677b06e3
GS
6481 EXTEND_MORTAL(1);
6482 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
6483 SvTEMP_on(sv);
6484 return sv;
6485}
6486
954c1994
GS
6487/*
6488=for apidoc sv_newmortal
6489
645c22ef 6490Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
6491set to 1. It will be destroyed "soon", either by an explicit call to
6492FREETMPS, or by an implicit call at places such as statement boundaries.
6493See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
6494
6495=cut
6496*/
6497
8990e307 6498SV *
864dbfa3 6499Perl_sv_newmortal(pTHX)
8990e307
LW
6500{
6501 register SV *sv;
6502
4561caa4 6503 new_SV(sv);
8990e307 6504 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
6505 EXTEND_MORTAL(1);
6506 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
6507 return sv;
6508}
6509
954c1994
GS
6510/*
6511=for apidoc sv_2mortal
6512
d4236ebc
DM
6513Marks an existing SV as mortal. The SV will be destroyed "soon", either
6514by an explicit call to FREETMPS, or by an implicit call at places such as
6515statement boundaries. See also C<sv_newmortal> and C<sv_mortalcopy>.
954c1994
GS
6516
6517=cut
6518*/
6519
79072805 6520SV *
864dbfa3 6521Perl_sv_2mortal(pTHX_ register SV *sv)
79072805
LW
6522{
6523 if (!sv)
6524 return sv;
d689ffdd 6525 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 6526 return sv;
677b06e3
GS
6527 EXTEND_MORTAL(1);
6528 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 6529 SvTEMP_on(sv);
79072805
LW
6530 return sv;
6531}
6532
954c1994
GS
6533/*
6534=for apidoc newSVpv
6535
6536Creates a new SV and copies a string into it. The reference count for the
6537SV is set to 1. If C<len> is zero, Perl will compute the length using
6538strlen(). For efficiency, consider using C<newSVpvn> instead.
6539
6540=cut
6541*/
6542
79072805 6543SV *
864dbfa3 6544Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 6545{
463ee0b2 6546 register SV *sv;
79072805 6547
4561caa4 6548 new_SV(sv);
79072805
LW
6549 if (!len)
6550 len = strlen(s);
6551 sv_setpvn(sv,s,len);
6552 return sv;
6553}
6554
954c1994
GS
6555/*
6556=for apidoc newSVpvn
6557
6558Creates a new SV and copies a string into it. The reference count for the
1c846c1f 6559SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994
GS
6560string. You are responsible for ensuring that the source string is at least
6561C<len> bytes long.
6562
6563=cut
6564*/
6565
9da1e3b5 6566SV *
864dbfa3 6567Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
6568{
6569 register SV *sv;
6570
6571 new_SV(sv);
9da1e3b5
MUN
6572 sv_setpvn(sv,s,len);
6573 return sv;
6574}
6575
1c846c1f
NIS
6576/*
6577=for apidoc newSVpvn_share
6578
645c22ef
DM
6579Creates a new SV with its SvPVX pointing to a shared string in the string
6580table. If the string does not already exist in the table, it is created
6581first. Turns on READONLY and FAKE. The string's hash is stored in the UV
6582slot of the SV; if the C<hash> parameter is non-zero, that value is used;
6583otherwise the hash is computed. The idea here is that as the string table
6584is used for shared hash keys these strings will have SvPVX == HeKEY and
6585hash lookup will avoid string compare.
1c846c1f
NIS
6586
6587=cut
6588*/
6589
6590SV *
c3654f1a 6591Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
6592{
6593 register SV *sv;
c3654f1a
IH
6594 bool is_utf8 = FALSE;
6595 if (len < 0) {
77caf834 6596 STRLEN tmplen = -len;
c3654f1a 6597 is_utf8 = TRUE;
75a54232
JH
6598 /* See the note in hv.c:hv_fetch() --jhi */
6599 src = (char*)bytes_from_utf8((U8*)src, &tmplen, &is_utf8);
6600 len = tmplen;
6601 }
1c846c1f 6602 if (!hash)
5afd6d42 6603 PERL_HASH(hash, src, len);
1c846c1f
NIS
6604 new_SV(sv);
6605 sv_upgrade(sv, SVt_PVIV);
c3654f1a 6606 SvPVX(sv) = sharepvn(src, is_utf8?-len:len, hash);
1c846c1f
NIS
6607 SvCUR(sv) = len;
6608 SvUVX(sv) = hash;
6609 SvLEN(sv) = 0;
6610 SvREADONLY_on(sv);
6611 SvFAKE_on(sv);
6612 SvPOK_on(sv);
c3654f1a
IH
6613 if (is_utf8)
6614 SvUTF8_on(sv);
1c846c1f
NIS
6615 return sv;
6616}
6617
645c22ef 6618
cea2e8a9 6619#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
6620
6621/* pTHX_ magic can't cope with varargs, so this is a no-context
6622 * version of the main function, (which may itself be aliased to us).
6623 * Don't access this version directly.
6624 */
6625
46fc3d4c 6626SV *
cea2e8a9 6627Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 6628{
cea2e8a9 6629 dTHX;
46fc3d4c 6630 register SV *sv;
6631 va_list args;
46fc3d4c 6632 va_start(args, pat);
c5be433b 6633 sv = vnewSVpvf(pat, &args);
46fc3d4c 6634 va_end(args);
6635 return sv;
6636}
cea2e8a9 6637#endif
46fc3d4c 6638
954c1994
GS
6639/*
6640=for apidoc newSVpvf
6641
645c22ef 6642Creates a new SV and initializes it with the string formatted like
954c1994
GS
6643C<sprintf>.
6644
6645=cut
6646*/
6647
cea2e8a9
GS
6648SV *
6649Perl_newSVpvf(pTHX_ const char* pat, ...)
6650{
6651 register SV *sv;
6652 va_list args;
cea2e8a9 6653 va_start(args, pat);
c5be433b 6654 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
6655 va_end(args);
6656 return sv;
6657}
46fc3d4c 6658
645c22ef
DM
6659/* backend for newSVpvf() and newSVpvf_nocontext() */
6660
79072805 6661SV *
c5be433b
GS
6662Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
6663{
6664 register SV *sv;
6665 new_SV(sv);
6666 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
6667 return sv;
6668}
6669
954c1994
GS
6670/*
6671=for apidoc newSVnv
6672
6673Creates a new SV and copies a floating point value into it.
6674The reference count for the SV is set to 1.
6675
6676=cut
6677*/
6678
c5be433b 6679SV *
65202027 6680Perl_newSVnv(pTHX_ NV n)
79072805 6681{
463ee0b2 6682 register SV *sv;
79072805 6683
4561caa4 6684 new_SV(sv);
79072805
LW
6685 sv_setnv(sv,n);
6686 return sv;
6687}
6688
954c1994
GS
6689/*
6690=for apidoc newSViv
6691
6692Creates a new SV and copies an integer into it. The reference count for the
6693SV is set to 1.
6694
6695=cut
6696*/
6697
79072805 6698SV *
864dbfa3 6699Perl_newSViv(pTHX_ IV i)
79072805 6700{
463ee0b2 6701 register SV *sv;
79072805 6702
4561caa4 6703 new_SV(sv);
79072805
LW
6704 sv_setiv(sv,i);
6705 return sv;
6706}
6707
954c1994 6708/*
1a3327fb
JH
6709=for apidoc newSVuv
6710
6711Creates a new SV and copies an unsigned integer into it.
6712The reference count for the SV is set to 1.
6713
6714=cut
6715*/
6716
6717SV *
6718Perl_newSVuv(pTHX_ UV u)
6719{
6720 register SV *sv;
6721
6722 new_SV(sv);
6723 sv_setuv(sv,u);
6724 return sv;
6725}
6726
6727/*
954c1994
GS
6728=for apidoc newRV_noinc
6729
6730Creates an RV wrapper for an SV. The reference count for the original
6731SV is B<not> incremented.
6732
6733=cut
6734*/
6735
2304df62 6736SV *
864dbfa3 6737Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
6738{
6739 register SV *sv;
6740
4561caa4 6741 new_SV(sv);
2304df62 6742 sv_upgrade(sv, SVt_RV);
76e3520e 6743 SvTEMP_off(tmpRef);
d689ffdd 6744 SvRV(sv) = tmpRef;
2304df62 6745 SvROK_on(sv);
2304df62
AD
6746 return sv;
6747}
6748
ff276b08 6749/* newRV_inc is the official function name to use now.
645c22ef
DM
6750 * newRV_inc is in fact #defined to newRV in sv.h
6751 */
6752
5f05dabc 6753SV *
864dbfa3 6754Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 6755{
5f6447b6 6756 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 6757}
5f05dabc 6758
954c1994
GS
6759/*
6760=for apidoc newSVsv
6761
6762Creates a new SV which is an exact duplicate of the original SV.
645c22ef 6763(Uses C<sv_setsv>).
954c1994
GS
6764
6765=cut
6766*/
6767
79072805 6768SV *
864dbfa3 6769Perl_newSVsv(pTHX_ register SV *old)
79072805 6770{
463ee0b2 6771 register SV *sv;
79072805
LW
6772
6773 if (!old)
6774 return Nullsv;
8990e307 6775 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 6776 if (ckWARN_d(WARN_INTERNAL))
9014280d 6777 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
79072805
LW
6778 return Nullsv;
6779 }
4561caa4 6780 new_SV(sv);
ff68c719 6781 if (SvTEMP(old)) {
6782 SvTEMP_off(old);
463ee0b2 6783 sv_setsv(sv,old);
ff68c719 6784 SvTEMP_on(old);
79072805
LW
6785 }
6786 else
463ee0b2
LW
6787 sv_setsv(sv,old);
6788 return sv;
79072805
LW
6789}
6790
645c22ef
DM
6791/*
6792=for apidoc sv_reset
6793
6794Underlying implementation for the C<reset> Perl function.
6795Note that the perl-level function is vaguely deprecated.
6796
6797=cut
6798*/
6799
79072805 6800void
864dbfa3 6801Perl_sv_reset(pTHX_ register char *s, HV *stash)
79072805
LW
6802{
6803 register HE *entry;
6804 register GV *gv;
6805 register SV *sv;
6806 register I32 i;
6807 register PMOP *pm;
6808 register I32 max;
4802d5d7 6809 char todo[PERL_UCHAR_MAX+1];
79072805 6810
49d8d3a1
MB
6811 if (!stash)
6812 return;
6813
79072805
LW
6814 if (!*s) { /* reset ?? searches */
6815 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
48c036b1 6816 pm->op_pmdynflags &= ~PMdf_USED;
79072805
LW
6817 }
6818 return;
6819 }
6820
6821 /* reset variables */
6822
6823 if (!HvARRAY(stash))
6824 return;
463ee0b2
LW
6825
6826 Zero(todo, 256, char);
79072805 6827 while (*s) {
4802d5d7 6828 i = (unsigned char)*s;
79072805
LW
6829 if (s[1] == '-') {
6830 s += 2;
6831 }
4802d5d7 6832 max = (unsigned char)*s++;
79072805 6833 for ( ; i <= max; i++) {
463ee0b2
LW
6834 todo[i] = 1;
6835 }
a0d0e21e 6836 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 6837 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
6838 entry;
6839 entry = HeNEXT(entry))
6840 {
1edc1566 6841 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 6842 continue;
1edc1566 6843 gv = (GV*)HeVAL(entry);
79072805 6844 sv = GvSV(gv);
9e35f4b3
GS
6845 if (SvTHINKFIRST(sv)) {
6846 if (!SvREADONLY(sv) && SvROK(sv))
6847 sv_unref(sv);
6848 continue;
6849 }
a0d0e21e 6850 (void)SvOK_off(sv);
79072805
LW
6851 if (SvTYPE(sv) >= SVt_PV) {
6852 SvCUR_set(sv, 0);
463ee0b2
LW
6853 if (SvPVX(sv) != Nullch)
6854 *SvPVX(sv) = '\0';
44a8e56a 6855 SvTAINT(sv);
79072805
LW
6856 }
6857 if (GvAV(gv)) {
6858 av_clear(GvAV(gv));
6859 }
44a8e56a 6860 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
463ee0b2 6861 hv_clear(GvHV(gv));
fa6a1c44 6862#ifdef USE_ENVIRON_ARRAY
4efc5df6
GS
6863 if (gv == PL_envgv
6864# ifdef USE_ITHREADS
6865 && PL_curinterp == aTHX
6866# endif
6867 )
6868 {
79072805 6869 environ[0] = Nullch;
4efc5df6 6870 }
a0d0e21e 6871#endif
79072805
LW
6872 }
6873 }
6874 }
6875 }
6876}
6877
645c22ef
DM
6878/*
6879=for apidoc sv_2io
6880
6881Using various gambits, try to get an IO from an SV: the IO slot if its a
6882GV; or the recursive result if we're an RV; or the IO slot of the symbol
6883named after the PV if we're a string.
6884
6885=cut
6886*/
6887
46fc3d4c 6888IO*
864dbfa3 6889Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 6890{
6891 IO* io;
6892 GV* gv;
2d8e6c8d 6893 STRLEN n_a;
46fc3d4c 6894
6895 switch (SvTYPE(sv)) {
6896 case SVt_PVIO:
6897 io = (IO*)sv;
6898 break;
6899 case SVt_PVGV:
6900 gv = (GV*)sv;
6901 io = GvIO(gv);
6902 if (!io)
cea2e8a9 6903 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 6904 break;
6905 default:
6906 if (!SvOK(sv))
cea2e8a9 6907 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 6908 if (SvROK(sv))
6909 return sv_2io(SvRV(sv));
2d8e6c8d 6910 gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
46fc3d4c 6911 if (gv)
6912 io = GvIO(gv);
6913 else
6914 io = 0;
6915 if (!io)
cea2e8a9 6916 Perl_croak(aTHX_ "Bad filehandle: %s", SvPV(sv,n_a));
46fc3d4c 6917 break;
6918 }
6919 return io;
6920}
6921
645c22ef
DM
6922/*
6923=for apidoc sv_2cv
6924
6925Using various gambits, try to get a CV from an SV; in addition, try if
6926possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
6927
6928=cut
6929*/
6930
79072805 6931CV *
864dbfa3 6932Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 6933{
c04a4dfe
JH
6934 GV *gv = Nullgv;
6935 CV *cv = Nullcv;
2d8e6c8d 6936 STRLEN n_a;
79072805
LW
6937
6938 if (!sv)
93a17b20 6939 return *gvp = Nullgv, Nullcv;
79072805 6940 switch (SvTYPE(sv)) {
79072805
LW
6941 case SVt_PVCV:
6942 *st = CvSTASH(sv);
6943 *gvp = Nullgv;
6944 return (CV*)sv;
6945 case SVt_PVHV:
6946 case SVt_PVAV:
6947 *gvp = Nullgv;
6948 return Nullcv;
8990e307
LW
6949 case SVt_PVGV:
6950 gv = (GV*)sv;
a0d0e21e 6951 *gvp = gv;
8990e307
LW
6952 *st = GvESTASH(gv);
6953 goto fix_gv;
6954
79072805 6955 default:
a0d0e21e
LW
6956 if (SvGMAGICAL(sv))
6957 mg_get(sv);
6958 if (SvROK(sv)) {
f5284f61
IZ
6959 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
6960 tryAMAGICunDEREF(to_cv);
6961
62f274bf
GS
6962 sv = SvRV(sv);
6963 if (SvTYPE(sv) == SVt_PVCV) {
6964 cv = (CV*)sv;
6965 *gvp = Nullgv;
6966 *st = CvSTASH(cv);
6967 return cv;
6968 }
6969 else if(isGV(sv))
6970 gv = (GV*)sv;
6971 else
cea2e8a9 6972 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 6973 }
62f274bf 6974 else if (isGV(sv))
79072805
LW
6975 gv = (GV*)sv;
6976 else
2d8e6c8d 6977 gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
79072805
LW
6978 *gvp = gv;
6979 if (!gv)
6980 return Nullcv;
6981 *st = GvESTASH(gv);
8990e307 6982 fix_gv:
8ebc5c01 6983 if (lref && !GvCVu(gv)) {
4633a7c4 6984 SV *tmpsv;
748a9306 6985 ENTER;
4633a7c4 6986 tmpsv = NEWSV(704,0);
16660edb 6987 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
6988 /* XXX this is probably not what they think they're getting.
6989 * It has the same effect as "sub name;", i.e. just a forward
6990 * declaration! */
774d564b 6991 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
6992 newSVOP(OP_CONST, 0, tmpsv),
6993 Nullop,
8990e307 6994 Nullop);
748a9306 6995 LEAVE;
8ebc5c01 6996 if (!GvCVu(gv))
cea2e8a9 6997 Perl_croak(aTHX_ "Unable to create sub named \"%s\"", SvPV(sv,n_a));
8990e307 6998 }
8ebc5c01 6999 return GvCVu(gv);
79072805
LW
7000 }
7001}
7002
c461cf8f
JH
7003/*
7004=for apidoc sv_true
7005
7006Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
7007Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
7008instead use an in-line version.
c461cf8f
JH
7009
7010=cut
7011*/
7012
79072805 7013I32
864dbfa3 7014Perl_sv_true(pTHX_ register SV *sv)
79072805 7015{
8990e307
LW
7016 if (!sv)
7017 return 0;
79072805 7018 if (SvPOK(sv)) {
4e35701f
NIS
7019 register XPV* tXpv;
7020 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 7021 (tXpv->xpv_cur > 1 ||
4e35701f 7022 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
79072805
LW
7023 return 1;
7024 else
7025 return 0;
7026 }
7027 else {
7028 if (SvIOK(sv))
463ee0b2 7029 return SvIVX(sv) != 0;
79072805
LW
7030 else {
7031 if (SvNOK(sv))
463ee0b2 7032 return SvNVX(sv) != 0.0;
79072805 7033 else
463ee0b2 7034 return sv_2bool(sv);
79072805
LW
7035 }
7036 }
7037}
79072805 7038
645c22ef
DM
7039/*
7040=for apidoc sv_iv
7041
7042A private implementation of the C<SvIVx> macro for compilers which can't
7043cope with complex macro expressions. Always use the macro instead.
7044
7045=cut
7046*/
7047
ff68c719 7048IV
864dbfa3 7049Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 7050{
25da4f38
IZ
7051 if (SvIOK(sv)) {
7052 if (SvIsUV(sv))
7053 return (IV)SvUVX(sv);
ff68c719 7054 return SvIVX(sv);
25da4f38 7055 }
ff68c719 7056 return sv_2iv(sv);
85e6fe83 7057}
85e6fe83 7058
645c22ef
DM
7059/*
7060=for apidoc sv_uv
7061
7062A private implementation of the C<SvUVx> macro for compilers which can't
7063cope with complex macro expressions. Always use the macro instead.
7064
7065=cut
7066*/
7067
ff68c719 7068UV
864dbfa3 7069Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 7070{
25da4f38
IZ
7071 if (SvIOK(sv)) {
7072 if (SvIsUV(sv))
7073 return SvUVX(sv);
7074 return (UV)SvIVX(sv);
7075 }
ff68c719 7076 return sv_2uv(sv);
7077}
85e6fe83 7078
645c22ef
DM
7079/*
7080=for apidoc sv_nv
7081
7082A private implementation of the C<SvNVx> macro for compilers which can't
7083cope with complex macro expressions. Always use the macro instead.
7084
7085=cut
7086*/
7087
65202027 7088NV
864dbfa3 7089Perl_sv_nv(pTHX_ register SV *sv)
79072805 7090{
ff68c719 7091 if (SvNOK(sv))
7092 return SvNVX(sv);
7093 return sv_2nv(sv);
79072805 7094}
79072805 7095
645c22ef
DM
7096/*
7097=for apidoc sv_pv
7098
baca2b92 7099Use the C<SvPV_nolen> macro instead
645c22ef 7100
645c22ef
DM
7101=for apidoc sv_pvn
7102
7103A private implementation of the C<SvPV> macro for compilers which can't
7104cope with complex macro expressions. Always use the macro instead.
7105
7106=cut
7107*/
7108
1fa8b10d 7109char *
864dbfa3 7110Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 7111{
85e6fe83
LW
7112 if (SvPOK(sv)) {
7113 *lp = SvCUR(sv);
a0d0e21e 7114 return SvPVX(sv);
85e6fe83 7115 }
463ee0b2 7116 return sv_2pv(sv, lp);
79072805 7117}
79072805 7118
6e9d1081
NC
7119
7120char *
7121Perl_sv_pvn_nomg(pTHX_ register SV *sv, STRLEN *lp)
7122{
7123 if (SvPOK(sv)) {
7124 *lp = SvCUR(sv);
7125 return SvPVX(sv);
7126 }
7127 return sv_2pv_flags(sv, lp, 0);
7128}
7129
c461cf8f
JH
7130/*
7131=for apidoc sv_pvn_force
7132
7133Get a sensible string out of the SV somehow.
645c22ef
DM
7134A private implementation of the C<SvPV_force> macro for compilers which
7135can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 7136
8d6d96c1
HS
7137=for apidoc sv_pvn_force_flags
7138
7139Get a sensible string out of the SV somehow.
7140If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
7141appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
7142implemented in terms of this function.
645c22ef
DM
7143You normally want to use the various wrapper macros instead: see
7144C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
7145
7146=cut
7147*/
7148
7149char *
7150Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
7151{
c04a4dfe 7152 char *s = NULL;
a0d0e21e 7153
6fc92669 7154 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 7155 sv_force_normal_flags(sv, 0);
1c846c1f 7156
a0d0e21e
LW
7157 if (SvPOK(sv)) {
7158 *lp = SvCUR(sv);
7159 }
7160 else {
748a9306 7161 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 7162 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 7163 OP_NAME(PL_op));
a0d0e21e 7164 }
4633a7c4 7165 else
8d6d96c1 7166 s = sv_2pv_flags(sv, lp, flags);
a0d0e21e
LW
7167 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
7168 STRLEN len = *lp;
1c846c1f 7169
a0d0e21e
LW
7170 if (SvROK(sv))
7171 sv_unref(sv);
7172 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
7173 SvGROW(sv, len + 1);
7174 Move(s,SvPVX(sv),len,char);
7175 SvCUR_set(sv, len);
7176 *SvEND(sv) = '\0';
7177 }
7178 if (!SvPOK(sv)) {
7179 SvPOK_on(sv); /* validate pointer */
7180 SvTAINT(sv);
1d7c1841
GS
7181 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
7182 PTR2UV(sv),SvPVX(sv)));
a0d0e21e
LW
7183 }
7184 }
7185 return SvPVX(sv);
7186}
7187
645c22ef
DM
7188/*
7189=for apidoc sv_pvbyte
7190
baca2b92 7191Use C<SvPVbyte_nolen> instead.
645c22ef 7192
645c22ef
DM
7193=for apidoc sv_pvbyten
7194
7195A private implementation of the C<SvPVbyte> macro for compilers
7196which can't cope with complex macro expressions. Always use the macro
7197instead.
7198
7199=cut
7200*/
7201
7340a771
GS
7202char *
7203Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
7204{
ffebcc3e 7205 sv_utf8_downgrade(sv,0);
7340a771
GS
7206 return sv_pvn(sv,lp);
7207}
7208
645c22ef
DM
7209/*
7210=for apidoc sv_pvbyten_force
7211
7212A private implementation of the C<SvPVbytex_force> macro for compilers
7213which can't cope with complex macro expressions. Always use the macro
7214instead.
7215
7216=cut
7217*/
7218
7340a771
GS
7219char *
7220Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
7221{
ffebcc3e 7222 sv_utf8_downgrade(sv,0);
7340a771
GS
7223 return sv_pvn_force(sv,lp);
7224}
7225
645c22ef
DM
7226/*
7227=for apidoc sv_pvutf8
7228
baca2b92 7229Use the C<SvPVutf8_nolen> macro instead
645c22ef 7230
645c22ef
DM
7231=for apidoc sv_pvutf8n
7232
7233A private implementation of the C<SvPVutf8> macro for compilers
7234which can't cope with complex macro expressions. Always use the macro
7235instead.
7236
7237=cut
7238*/
7239
7340a771
GS
7240char *
7241Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
7242{
560a288e 7243 sv_utf8_upgrade(sv);
7340a771
GS
7244 return sv_pvn(sv,lp);
7245}
7246
c461cf8f
JH
7247/*
7248=for apidoc sv_pvutf8n_force
7249
645c22ef
DM
7250A private implementation of the C<SvPVutf8_force> macro for compilers
7251which can't cope with complex macro expressions. Always use the macro
7252instead.
c461cf8f
JH
7253
7254=cut
7255*/
7256
7340a771
GS
7257char *
7258Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
7259{
560a288e 7260 sv_utf8_upgrade(sv);
7340a771
GS
7261 return sv_pvn_force(sv,lp);
7262}
7263
c461cf8f
JH
7264/*
7265=for apidoc sv_reftype
7266
7267Returns a string describing what the SV is a reference to.
7268
7269=cut
7270*/
7271
7340a771 7272char *
864dbfa3 7273Perl_sv_reftype(pTHX_ SV *sv, int ob)
a0d0e21e 7274{
c86bf373 7275 if (ob && SvOBJECT(sv)) {
de11ba31 7276 return HvNAME(SvSTASH(sv));
c86bf373 7277 }
a0d0e21e
LW
7278 else {
7279 switch (SvTYPE(sv)) {
7280 case SVt_NULL:
7281 case SVt_IV:
7282 case SVt_NV:
7283 case SVt_RV:
7284 case SVt_PV:
7285 case SVt_PVIV:
7286 case SVt_PVNV:
7287 case SVt_PVMG:
7288 case SVt_PVBM:
439cb1c4
JP
7289 if (SvVOK(sv))
7290 return "VSTRING";
a0d0e21e
LW
7291 if (SvROK(sv))
7292 return "REF";
7293 else
7294 return "SCALAR";
7295 case SVt_PVLV: return "LVALUE";
7296 case SVt_PVAV: return "ARRAY";
7297 case SVt_PVHV: return "HASH";
7298 case SVt_PVCV: return "CODE";
7299 case SVt_PVGV: return "GLOB";
1d2dff63 7300 case SVt_PVFM: return "FORMAT";
27f9d8f3 7301 case SVt_PVIO: return "IO";
a0d0e21e
LW
7302 default: return "UNKNOWN";
7303 }
7304 }
7305}
7306
954c1994
GS
7307/*
7308=for apidoc sv_isobject
7309
7310Returns a boolean indicating whether the SV is an RV pointing to a blessed
7311object. If the SV is not an RV, or if the object is not blessed, then this
7312will return false.
7313
7314=cut
7315*/
7316
463ee0b2 7317int
864dbfa3 7318Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 7319{
68dc0745 7320 if (!sv)
7321 return 0;
7322 if (SvGMAGICAL(sv))
7323 mg_get(sv);
85e6fe83
LW
7324 if (!SvROK(sv))
7325 return 0;
7326 sv = (SV*)SvRV(sv);
7327 if (!SvOBJECT(sv))
7328 return 0;
7329 return 1;
7330}
7331
954c1994
GS
7332/*
7333=for apidoc sv_isa
7334
7335Returns a boolean indicating whether the SV is blessed into the specified
7336class. This does not check for subtypes; use C<sv_derived_from> to verify
7337an inheritance relationship.
7338
7339=cut
7340*/
7341
85e6fe83 7342int
864dbfa3 7343Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 7344{
68dc0745 7345 if (!sv)
7346 return 0;
7347 if (SvGMAGICAL(sv))
7348 mg_get(sv);
ed6116ce 7349 if (!SvROK(sv))
463ee0b2 7350 return 0;
ed6116ce
LW
7351 sv = (SV*)SvRV(sv);
7352 if (!SvOBJECT(sv))
463ee0b2
LW
7353 return 0;
7354
7355 return strEQ(HvNAME(SvSTASH(sv)), name);
7356}
7357
954c1994
GS
7358/*
7359=for apidoc newSVrv
7360
7361Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
7362it will be upgraded to one. If C<classname> is non-null then the new SV will
7363be blessed in the specified package. The new SV is returned and its
7364reference count is 1.
7365
7366=cut
7367*/
7368
463ee0b2 7369SV*
864dbfa3 7370Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 7371{
463ee0b2
LW
7372 SV *sv;
7373
4561caa4 7374 new_SV(sv);
51cf62d8 7375
765f542d 7376 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 7377 SvAMAGIC_off(rv);
51cf62d8 7378
0199fce9
JD
7379 if (SvTYPE(rv) >= SVt_PVMG) {
7380 U32 refcnt = SvREFCNT(rv);
7381 SvREFCNT(rv) = 0;
7382 sv_clear(rv);
7383 SvFLAGS(rv) = 0;
7384 SvREFCNT(rv) = refcnt;
7385 }
7386
51cf62d8 7387 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
7388 sv_upgrade(rv, SVt_RV);
7389 else if (SvTYPE(rv) > SVt_RV) {
7390 (void)SvOOK_off(rv);
7391 if (SvPVX(rv) && SvLEN(rv))
7392 Safefree(SvPVX(rv));
7393 SvCUR_set(rv, 0);
7394 SvLEN_set(rv, 0);
7395 }
51cf62d8
OT
7396
7397 (void)SvOK_off(rv);
053fc874 7398 SvRV(rv) = sv;
ed6116ce 7399 SvROK_on(rv);
463ee0b2 7400
a0d0e21e
LW
7401 if (classname) {
7402 HV* stash = gv_stashpv(classname, TRUE);
7403 (void)sv_bless(rv, stash);
7404 }
7405 return sv;
7406}
7407
954c1994
GS
7408/*
7409=for apidoc sv_setref_pv
7410
7411Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
7412argument will be upgraded to an RV. That RV will be modified to point to
7413the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7414into the SV. The C<classname> argument indicates the package for the
7415blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7416will be returned and will have a reference count of 1.
7417
7418Do not use with other Perl types such as HV, AV, SV, CV, because those
7419objects will become corrupted by the pointer copy process.
7420
7421Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7422
7423=cut
7424*/
7425
a0d0e21e 7426SV*
864dbfa3 7427Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 7428{
189b2af5 7429 if (!pv) {
3280af22 7430 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
7431 SvSETMAGIC(rv);
7432 }
a0d0e21e 7433 else
56431972 7434 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
7435 return rv;
7436}
7437
954c1994
GS
7438/*
7439=for apidoc sv_setref_iv
7440
7441Copies an integer into a new SV, optionally blessing the SV. The C<rv>
7442argument will be upgraded to an RV. That RV will be modified to point to
7443the new SV. The C<classname> argument indicates the package for the
7444blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7445will be returned and will have a reference count of 1.
7446
7447=cut
7448*/
7449
a0d0e21e 7450SV*
864dbfa3 7451Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
7452{
7453 sv_setiv(newSVrv(rv,classname), iv);
7454 return rv;
7455}
7456
954c1994 7457/*
e1c57cef
JH
7458=for apidoc sv_setref_uv
7459
7460Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
7461argument will be upgraded to an RV. That RV will be modified to point to
7462the new SV. The C<classname> argument indicates the package for the
7463blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7464will be returned and will have a reference count of 1.
7465
7466=cut
7467*/
7468
7469SV*
7470Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
7471{
7472 sv_setuv(newSVrv(rv,classname), uv);
7473 return rv;
7474}
7475
7476/*
954c1994
GS
7477=for apidoc sv_setref_nv
7478
7479Copies a double into a new SV, optionally blessing the SV. The C<rv>
7480argument will be upgraded to an RV. That RV will be modified to point to
7481the new SV. The C<classname> argument indicates the package for the
7482blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7483will be returned and will have a reference count of 1.
7484
7485=cut
7486*/
7487
a0d0e21e 7488SV*
65202027 7489Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
7490{
7491 sv_setnv(newSVrv(rv,classname), nv);
7492 return rv;
7493}
463ee0b2 7494
954c1994
GS
7495/*
7496=for apidoc sv_setref_pvn
7497
7498Copies a string into a new SV, optionally blessing the SV. The length of the
7499string must be specified with C<n>. The C<rv> argument will be upgraded to
7500an RV. That RV will be modified to point to the new SV. The C<classname>
7501argument indicates the package for the blessing. Set C<classname> to
7502C<Nullch> to avoid the blessing. The new SV will be returned and will have
7503a reference count of 1.
7504
7505Note that C<sv_setref_pv> copies the pointer while this copies the string.
7506
7507=cut
7508*/
7509
a0d0e21e 7510SV*
864dbfa3 7511Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
7512{
7513 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
7514 return rv;
7515}
7516
954c1994
GS
7517/*
7518=for apidoc sv_bless
7519
7520Blesses an SV into a specified package. The SV must be an RV. The package
7521must be designated by its stash (see C<gv_stashpv()>). The reference count
7522of the SV is unaffected.
7523
7524=cut
7525*/
7526
a0d0e21e 7527SV*
864dbfa3 7528Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 7529{
76e3520e 7530 SV *tmpRef;
a0d0e21e 7531 if (!SvROK(sv))
cea2e8a9 7532 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
7533 tmpRef = SvRV(sv);
7534 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
7535 if (SvREADONLY(tmpRef))
cea2e8a9 7536 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
7537 if (SvOBJECT(tmpRef)) {
7538 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7539 --PL_sv_objcount;
76e3520e 7540 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 7541 }
a0d0e21e 7542 }
76e3520e
GS
7543 SvOBJECT_on(tmpRef);
7544 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7545 ++PL_sv_objcount;
76e3520e
GS
7546 (void)SvUPGRADE(tmpRef, SVt_PVMG);
7547 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
a0d0e21e 7548
2e3febc6
CS
7549 if (Gv_AMG(stash))
7550 SvAMAGIC_on(sv);
7551 else
7552 SvAMAGIC_off(sv);
a0d0e21e 7553
1edbfb88
AB
7554 if(SvSMAGICAL(tmpRef))
7555 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
7556 mg_set(tmpRef);
7557
7558
ecdeb87c 7559
a0d0e21e
LW
7560 return sv;
7561}
7562
645c22ef 7563/* Downgrades a PVGV to a PVMG.
645c22ef
DM
7564 */
7565
76e3520e 7566STATIC void
cea2e8a9 7567S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 7568{
850fabdf
GS
7569 void *xpvmg;
7570
a0d0e21e
LW
7571 assert(SvTYPE(sv) == SVt_PVGV);
7572 SvFAKE_off(sv);
7573 if (GvGP(sv))
1edc1566 7574 gp_free((GV*)sv);
e826b3c7
GS
7575 if (GvSTASH(sv)) {
7576 SvREFCNT_dec(GvSTASH(sv));
7577 GvSTASH(sv) = Nullhv;
7578 }
14befaf4 7579 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 7580 Safefree(GvNAME(sv));
a5f75d66 7581 GvMULTI_off(sv);
850fabdf
GS
7582
7583 /* need to keep SvANY(sv) in the right arena */
7584 xpvmg = new_XPVMG();
7585 StructCopy(SvANY(sv), xpvmg, XPVMG);
7586 del_XPVGV(SvANY(sv));
7587 SvANY(sv) = xpvmg;
7588
a0d0e21e
LW
7589 SvFLAGS(sv) &= ~SVTYPEMASK;
7590 SvFLAGS(sv) |= SVt_PVMG;
7591}
7592
954c1994 7593/*
840a7b70 7594=for apidoc sv_unref_flags
954c1994
GS
7595
7596Unsets the RV status of the SV, and decrements the reference count of
7597whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
7598as a reversal of C<newSVrv>. The C<cflags> argument can contain
7599C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
7600(otherwise the decrementing is conditional on the reference count being
7601different from one or the reference being a readonly SV).
7889fe52 7602See C<SvROK_off>.
954c1994
GS
7603
7604=cut
7605*/
7606
ed6116ce 7607void
840a7b70 7608Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 7609{
a0d0e21e 7610 SV* rv = SvRV(sv);
810b8aa5
GS
7611
7612 if (SvWEAKREF(sv)) {
7613 sv_del_backref(sv);
7614 SvWEAKREF_off(sv);
7615 SvRV(sv) = 0;
7616 return;
7617 }
ed6116ce
LW
7618 SvRV(sv) = 0;
7619 SvROK_off(sv);
765f542d 7620 if (SvREFCNT(rv) != 1 || SvREADONLY(rv) || (flags & SV_IMMEDIATE_UNREF))
4633a7c4 7621 SvREFCNT_dec(rv);
840a7b70 7622 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 7623 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 7624}
8990e307 7625
840a7b70
IZ
7626/*
7627=for apidoc sv_unref
7628
7629Unsets the RV status of the SV, and decrements the reference count of
7630whatever was being referenced by the RV. This can almost be thought of
7631as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 7632being zero. See C<SvROK_off>.
840a7b70
IZ
7633
7634=cut
7635*/
7636
7637void
7638Perl_sv_unref(pTHX_ SV *sv)
7639{
7640 sv_unref_flags(sv, 0);
7641}
7642
645c22ef
DM
7643/*
7644=for apidoc sv_taint
7645
7646Taint an SV. Use C<SvTAINTED_on> instead.
7647=cut
7648*/
7649
bbce6d69 7650void
864dbfa3 7651Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 7652{
14befaf4 7653 sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
bbce6d69 7654}
7655
645c22ef
DM
7656/*
7657=for apidoc sv_untaint
7658
7659Untaint an SV. Use C<SvTAINTED_off> instead.
7660=cut
7661*/
7662
bbce6d69 7663void
864dbfa3 7664Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 7665{
13f57bf8 7666 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 7667 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 7668 if (mg)
565764a8 7669 mg->mg_len &= ~1;
36477c24 7670 }
bbce6d69 7671}
7672
645c22ef
DM
7673/*
7674=for apidoc sv_tainted
7675
7676Test an SV for taintedness. Use C<SvTAINTED> instead.
7677=cut
7678*/
7679
bbce6d69 7680bool
864dbfa3 7681Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 7682{
13f57bf8 7683 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 7684 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
155aba94 7685 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 7686 return TRUE;
7687 }
7688 return FALSE;
bbce6d69 7689}
7690
cea2e8a9 7691#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7692
7693/* pTHX_ magic can't cope with varargs, so this is a no-context
7694 * version of the main function, (which may itself be aliased to us).
7695 * Don't access this version directly.
7696 */
7697
cea2e8a9
GS
7698void
7699Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
7700{
7701 dTHX;
7702 va_list args;
7703 va_start(args, pat);
c5be433b 7704 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
7705 va_end(args);
7706}
7707
645c22ef
DM
7708/* pTHX_ magic can't cope with varargs, so this is a no-context
7709 * version of the main function, (which may itself be aliased to us).
7710 * Don't access this version directly.
7711 */
cea2e8a9
GS
7712
7713void
7714Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
7715{
7716 dTHX;
7717 va_list args;
7718 va_start(args, pat);
c5be433b 7719 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 7720 va_end(args);
cea2e8a9
GS
7721}
7722#endif
7723
954c1994
GS
7724/*
7725=for apidoc sv_setpvf
7726
7727Processes its arguments like C<sprintf> and sets an SV to the formatted
7728output. Does not handle 'set' magic. See C<sv_setpvf_mg>.
7729
7730=cut
7731*/
7732
46fc3d4c 7733void
864dbfa3 7734Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 7735{
7736 va_list args;
46fc3d4c 7737 va_start(args, pat);
c5be433b 7738 sv_vsetpvf(sv, pat, &args);
46fc3d4c 7739 va_end(args);
7740}
7741
645c22ef
DM
7742/* backend for C<sv_setpvf> and C<sv_setpvf_nocontext> */
7743
c5be433b
GS
7744void
7745Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7746{
7747 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7748}
ef50df4b 7749
954c1994
GS
7750/*
7751=for apidoc sv_setpvf_mg
7752
7753Like C<sv_setpvf>, but also handles 'set' magic.
7754
7755=cut
7756*/
7757
ef50df4b 7758void
864dbfa3 7759Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
7760{
7761 va_list args;
ef50df4b 7762 va_start(args, pat);
c5be433b 7763 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 7764 va_end(args);
c5be433b
GS
7765}
7766
645c22ef
DM
7767/* backend for C<sv_setpvf_mg> C<setpvf_mg_nocontext> */
7768
c5be433b
GS
7769void
7770Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7771{
7772 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
7773 SvSETMAGIC(sv);
7774}
7775
cea2e8a9 7776#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7777
7778/* pTHX_ magic can't cope with varargs, so this is a no-context
7779 * version of the main function, (which may itself be aliased to us).
7780 * Don't access this version directly.
7781 */
7782
cea2e8a9
GS
7783void
7784Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
7785{
7786 dTHX;
7787 va_list args;
7788 va_start(args, pat);
c5be433b 7789 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
7790 va_end(args);
7791}
7792
645c22ef
DM
7793/* pTHX_ magic can't cope with varargs, so this is a no-context
7794 * version of the main function, (which may itself be aliased to us).
7795 * Don't access this version directly.
7796 */
7797
cea2e8a9
GS
7798void
7799Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
7800{
7801 dTHX;
7802 va_list args;
7803 va_start(args, pat);
c5be433b 7804 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 7805 va_end(args);
cea2e8a9
GS
7806}
7807#endif
7808
954c1994
GS
7809/*
7810=for apidoc sv_catpvf
7811
d5ce4a7c
GA
7812Processes its arguments like C<sprintf> and appends the formatted
7813output to an SV. If the appended data contains "wide" characters
7814(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
7815and characters >255 formatted with %c), the original SV might get
7816upgraded to UTF-8. Handles 'get' magic, but not 'set' magic.
7817C<SvSETMAGIC()> must typically be called after calling this function
7818to handle 'set' magic.
954c1994 7819
d5ce4a7c 7820=cut */
954c1994 7821
46fc3d4c 7822void
864dbfa3 7823Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 7824{
7825 va_list args;
46fc3d4c 7826 va_start(args, pat);
c5be433b 7827 sv_vcatpvf(sv, pat, &args);
46fc3d4c 7828 va_end(args);
7829}
7830
645c22ef
DM
7831/* backend for C<sv_catpvf> and C<catpvf_mg_nocontext> */
7832
ef50df4b 7833void
c5be433b
GS
7834Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7835{
7836 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7837}
7838
954c1994
GS
7839/*
7840=for apidoc sv_catpvf_mg
7841
7842Like C<sv_catpvf>, but also handles 'set' magic.
7843
7844=cut
7845*/
7846
c5be433b 7847void
864dbfa3 7848Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
7849{
7850 va_list args;
ef50df4b 7851 va_start(args, pat);
c5be433b 7852 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 7853 va_end(args);
c5be433b
GS
7854}
7855
645c22ef
DM
7856/* backend for C<catpvf_mg> and C<catpvf_mg_nocontext> */
7857
c5be433b
GS
7858void
7859Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7860{
7861 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
7862 SvSETMAGIC(sv);
7863}
7864
954c1994
GS
7865/*
7866=for apidoc sv_vsetpvfn
7867
7868Works like C<vcatpvfn> but copies the text into the SV instead of
7869appending it.
7870
645c22ef
DM
7871Usually used via one of its frontends C<sv_setpvf> and C<sv_setpvf_mg>.
7872
954c1994
GS
7873=cut
7874*/
7875
46fc3d4c 7876void
7d5ea4e7 7877Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 7878{
7879 sv_setpvn(sv, "", 0);
7d5ea4e7 7880 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 7881}
7882
645c22ef
DM
7883/* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
7884
2d00ba3b 7885STATIC I32
9dd79c3f 7886S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
7887{
7888 I32 var = 0;
7889 switch (**pattern) {
7890 case '1': case '2': case '3':
7891 case '4': case '5': case '6':
7892 case '7': case '8': case '9':
7893 while (isDIGIT(**pattern))
7894 var = var * 10 + (*(*pattern)++ - '0');
7895 }
7896 return var;
7897}
9dd79c3f 7898#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 7899
954c1994
GS
7900/*
7901=for apidoc sv_vcatpvfn
7902
7903Processes its arguments like C<vsprintf> and appends the formatted output
7904to an SV. Uses an array of SVs if the C style variable argument list is
7905missing (NULL). When running with taint checks enabled, indicates via
7906C<maybe_tainted> if results are untrustworthy (often due to the use of
7907locales).
7908
645c22ef
DM
7909Usually used via one of its frontends C<sv_catpvf> and C<sv_catpvf_mg>.
7910
954c1994
GS
7911=cut
7912*/
7913
46fc3d4c 7914void
7d5ea4e7 7915Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 7916{
7917 char *p;
7918 char *q;
7919 char *patend;
fc36a67e 7920 STRLEN origlen;
46fc3d4c 7921 I32 svix = 0;
c635e13b 7922 static char nullstr[] = "(null)";
9c5ffd7c 7923 SV *argsv = Nullsv;
2cf2cfc6 7924 bool has_utf8 = FALSE; /* has the result utf8? */
46fc3d4c 7925
7926 /* no matter what, this is a string now */
fc36a67e 7927 (void)SvPV_force(sv, origlen);
46fc3d4c 7928
fc36a67e 7929 /* special-case "", "%s", and "%_" */
46fc3d4c 7930 if (patlen == 0)
7931 return;
fc36a67e 7932 if (patlen == 2 && pat[0] == '%') {
7933 switch (pat[1]) {
7934 case 's':
c635e13b 7935 if (args) {
7936 char *s = va_arg(*args, char*);
7937 sv_catpv(sv, s ? s : nullstr);
7938 }
7e2040f0 7939 else if (svix < svmax) {
fc36a67e 7940 sv_catsv(sv, *svargs);
7e2040f0
GS
7941 if (DO_UTF8(*svargs))
7942 SvUTF8_on(sv);
7943 }
fc36a67e 7944 return;
7945 case '_':
7946 if (args) {
7e2040f0
GS
7947 argsv = va_arg(*args, SV*);
7948 sv_catsv(sv, argsv);
7949 if (DO_UTF8(argsv))
7950 SvUTF8_on(sv);
fc36a67e 7951 return;
7952 }
7953 /* See comment on '_' below */
7954 break;
7955 }
46fc3d4c 7956 }
7957
2cf2cfc6 7958 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 7959 has_utf8 = TRUE;
2cf2cfc6 7960
46fc3d4c 7961 patend = (char*)pat + patlen;
7962 for (p = (char*)pat; p < patend; p = q) {
7963 bool alt = FALSE;
7964 bool left = FALSE;
b22c7a20 7965 bool vectorize = FALSE;
211dfcf1 7966 bool vectorarg = FALSE;
2cf2cfc6 7967 bool vec_utf8 = FALSE;
46fc3d4c 7968 char fill = ' ';
7969 char plus = 0;
7970 char intsize = 0;
7971 STRLEN width = 0;
fc36a67e 7972 STRLEN zeros = 0;
46fc3d4c 7973 bool has_precis = FALSE;
7974 STRLEN precis = 0;
2cf2cfc6 7975 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
7976#ifdef HAS_LDBL_SPRINTF_BUG
7977 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 7978 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
7979 bool fix_ldbl_sprintf_bug = FALSE;
7980#endif
205f51d8 7981
46fc3d4c 7982 char esignbuf[4];
ad391ad9 7983 U8 utf8buf[UTF8_MAXLEN+1];
46fc3d4c 7984 STRLEN esignlen = 0;
7985
7986 char *eptr = Nullch;
fc36a67e 7987 STRLEN elen = 0;
089c015b
JH
7988 /* Times 4: a decimal digit takes more than 3 binary digits.
7989 * NV_DIG: mantissa takes than many decimal digits.
7990 * Plus 32: Playing safe. */
7991 char ebuf[IV_DIG * 4 + NV_DIG + 32];
205f51d8 7992 /* large enough for "%#.#f" --chip */
2d4389e4 7993 /* what about long double NVs? --jhi */
b22c7a20 7994
81f715da 7995 SV *vecsv = Nullsv;
a05b299f 7996 U8 *vecstr = Null(U8*);
b22c7a20 7997 STRLEN veclen = 0;
934abaf1 7998 char c = 0;
46fc3d4c 7999 int i;
9c5ffd7c 8000 unsigned base = 0;
8c8eb53c
RB
8001 IV iv = 0;
8002 UV uv = 0;
9e5b023a
JH
8003 /* we need a long double target in case HAS_LONG_DOUBLE but
8004 not USE_LONG_DOUBLE
8005 */
35fff930 8006#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
8007 long double nv;
8008#else
65202027 8009 NV nv;
9e5b023a 8010#endif
46fc3d4c 8011 STRLEN have;
8012 STRLEN need;
8013 STRLEN gap;
b22c7a20
GS
8014 char *dotstr = ".";
8015 STRLEN dotstrlen = 1;
211dfcf1 8016 I32 efix = 0; /* explicit format parameter index */
eb3fce90 8017 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
8018 I32 epix = 0; /* explicit precision index */
8019 I32 evix = 0; /* explicit vector index */
eb3fce90 8020 bool asterisk = FALSE;
46fc3d4c 8021
211dfcf1 8022 /* echo everything up to the next format specification */
46fc3d4c 8023 for (q = p; q < patend && *q != '%'; ++q) ;
8024 if (q > p) {
8025 sv_catpvn(sv, p, q - p);
8026 p = q;
8027 }
8028 if (q++ >= patend)
8029 break;
8030
211dfcf1
HS
8031/*
8032 We allow format specification elements in this order:
8033 \d+\$ explicit format parameter index
8034 [-+ 0#]+ flags
a472f209 8035 v|\*(\d+\$)?v vector with optional (optionally specified) arg
211dfcf1
HS
8036 \d+|\*(\d+\$)? width using optional (optionally specified) arg
8037 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
8038 [hlqLV] size
8039 [%bcdefginopsux_DFOUX] format (mandatory)
8040*/
8041 if (EXPECT_NUMBER(q, width)) {
8042 if (*q == '$') {
8043 ++q;
8044 efix = width;
8045 } else {
8046 goto gotwidth;
8047 }
8048 }
8049
fc36a67e 8050 /* FLAGS */
8051
46fc3d4c 8052 while (*q) {
8053 switch (*q) {
8054 case ' ':
8055 case '+':
8056 plus = *q++;
8057 continue;
8058
8059 case '-':
8060 left = TRUE;
8061 q++;
8062 continue;
8063
8064 case '0':
8065 fill = *q++;
8066 continue;
8067
8068 case '#':
8069 alt = TRUE;
8070 q++;
8071 continue;
8072
fc36a67e 8073 default:
8074 break;
8075 }
8076 break;
8077 }
46fc3d4c 8078
211dfcf1 8079 tryasterisk:
eb3fce90 8080 if (*q == '*') {
211dfcf1
HS
8081 q++;
8082 if (EXPECT_NUMBER(q, ewix))
8083 if (*q++ != '$')
8084 goto unknown;
eb3fce90 8085 asterisk = TRUE;
211dfcf1
HS
8086 }
8087 if (*q == 'v') {
eb3fce90 8088 q++;
211dfcf1
HS
8089 if (vectorize)
8090 goto unknown;
9cbac4c7 8091 if ((vectorarg = asterisk)) {
211dfcf1
HS
8092 evix = ewix;
8093 ewix = 0;
8094 asterisk = FALSE;
8095 }
8096 vectorize = TRUE;
8097 goto tryasterisk;
eb3fce90
JH
8098 }
8099
211dfcf1
HS
8100 if (!asterisk)
8101 EXPECT_NUMBER(q, width);
8102
8103 if (vectorize) {
8104 if (vectorarg) {
8105 if (args)
8106 vecsv = va_arg(*args, SV*);
8107 else
8108 vecsv = (evix ? evix <= svmax : svix < svmax) ?
8109 svargs[ewix ? ewix-1 : svix++] : &PL_sv_undef;
4459522c 8110 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1 8111 if (DO_UTF8(vecsv))
2cf2cfc6 8112 is_utf8 = TRUE;
211dfcf1
HS
8113 }
8114 if (args) {
8115 vecsv = va_arg(*args, SV*);
8116 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 8117 vec_utf8 = DO_UTF8(vecsv);
eb3fce90 8118 }
211dfcf1
HS
8119 else if (efix ? efix <= svmax : svix < svmax) {
8120 vecsv = svargs[efix ? efix-1 : svix++];
8121 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 8122 vec_utf8 = DO_UTF8(vecsv);
211dfcf1
HS
8123 }
8124 else {
8125 vecstr = (U8*)"";
8126 veclen = 0;
8127 }
eb3fce90 8128 }
fc36a67e 8129
eb3fce90 8130 if (asterisk) {
fc36a67e 8131 if (args)
8132 i = va_arg(*args, int);
8133 else
eb3fce90
JH
8134 i = (ewix ? ewix <= svmax : svix < svmax) ?
8135 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8136 left |= (i < 0);
8137 width = (i < 0) ? -i : i;
fc36a67e 8138 }
211dfcf1 8139 gotwidth:
fc36a67e 8140
8141 /* PRECISION */
46fc3d4c 8142
fc36a67e 8143 if (*q == '.') {
8144 q++;
8145 if (*q == '*') {
211dfcf1 8146 q++;
7b8dd722
HS
8147 if (EXPECT_NUMBER(q, epix) && *q++ != '$')
8148 goto unknown;
8149 /* XXX: todo, support specified precision parameter */
8150 if (epix)
211dfcf1 8151 goto unknown;
46fc3d4c 8152 if (args)
8153 i = va_arg(*args, int);
8154 else
eb3fce90
JH
8155 i = (ewix ? ewix <= svmax : svix < svmax)
8156 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8157 precis = (i < 0) ? 0 : i;
fc36a67e 8158 }
8159 else {
8160 precis = 0;
8161 while (isDIGIT(*q))
8162 precis = precis * 10 + (*q++ - '0');
8163 }
8164 has_precis = TRUE;
8165 }
46fc3d4c 8166
fc36a67e 8167 /* SIZE */
46fc3d4c 8168
fc36a67e 8169 switch (*q) {
c623ac67
GS
8170#ifdef WIN32
8171 case 'I': /* Ix, I32x, and I64x */
8172# ifdef WIN64
8173 if (q[1] == '6' && q[2] == '4') {
8174 q += 3;
8175 intsize = 'q';
8176 break;
8177 }
8178# endif
8179 if (q[1] == '3' && q[2] == '2') {
8180 q += 3;
8181 break;
8182 }
8183# ifdef WIN64
8184 intsize = 'q';
8185# endif
8186 q++;
8187 break;
8188#endif
9e5b023a 8189#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 8190 case 'L': /* Ld */
e5c81feb 8191 /* FALL THROUGH */
e5c81feb 8192#ifdef HAS_QUAD
6f9bb7fd 8193 case 'q': /* qd */
9e5b023a 8194#endif
6f9bb7fd
GS
8195 intsize = 'q';
8196 q++;
8197 break;
8198#endif
fc36a67e 8199 case 'l':
9e5b023a 8200#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 8201 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 8202 intsize = 'q';
8203 q += 2;
46fc3d4c 8204 break;
cf2093f6 8205 }
fc36a67e 8206#endif
6f9bb7fd 8207 /* FALL THROUGH */
fc36a67e 8208 case 'h':
cf2093f6 8209 /* FALL THROUGH */
fc36a67e 8210 case 'V':
8211 intsize = *q++;
46fc3d4c 8212 break;
8213 }
8214
fc36a67e 8215 /* CONVERSION */
8216
211dfcf1
HS
8217 if (*q == '%') {
8218 eptr = q++;
8219 elen = 1;
8220 goto string;
8221 }
8222
be75b157
HS
8223 if (vectorize)
8224 argsv = vecsv;
8225 else if (!args)
211dfcf1
HS
8226 argsv = (efix ? efix <= svmax : svix < svmax) ?
8227 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
8228
46fc3d4c 8229 switch (c = *q++) {
8230
8231 /* STRINGS */
8232
46fc3d4c 8233 case 'c':
be75b157 8234 uv = (args && !vectorize) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
8235 if ((uv > 255 ||
8236 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 8237 && !IN_BYTES) {
dfe13c55 8238 eptr = (char*)utf8buf;
9041c2e3 8239 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 8240 is_utf8 = TRUE;
7e2040f0
GS
8241 }
8242 else {
8243 c = (char)uv;
8244 eptr = &c;
8245 elen = 1;
a0ed51b3 8246 }
46fc3d4c 8247 goto string;
8248
46fc3d4c 8249 case 's':
be75b157 8250 if (args && !vectorize) {
fc36a67e 8251 eptr = va_arg(*args, char*);
c635e13b 8252 if (eptr)
1d7c1841
GS
8253#ifdef MACOS_TRADITIONAL
8254 /* On MacOS, %#s format is used for Pascal strings */
8255 if (alt)
8256 elen = *eptr++;
8257 else
8258#endif
c635e13b 8259 elen = strlen(eptr);
8260 else {
8261 eptr = nullstr;
8262 elen = sizeof nullstr - 1;
8263 }
46fc3d4c 8264 }
211dfcf1 8265 else {
7e2040f0
GS
8266 eptr = SvPVx(argsv, elen);
8267 if (DO_UTF8(argsv)) {
a0ed51b3
LW
8268 if (has_precis && precis < elen) {
8269 I32 p = precis;
7e2040f0 8270 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
8271 precis = p;
8272 }
8273 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 8274 width += elen - sv_len_utf8(argsv);
a0ed51b3 8275 }
2cf2cfc6 8276 is_utf8 = TRUE;
a0ed51b3
LW
8277 }
8278 }
46fc3d4c 8279 goto string;
8280
fc36a67e 8281 case '_':
8282 /*
8283 * The "%_" hack might have to be changed someday,
8284 * if ISO or ANSI decide to use '_' for something.
8285 * So we keep it hidden from users' code.
8286 */
be75b157 8287 if (!args || vectorize)
fc36a67e 8288 goto unknown;
211dfcf1 8289 argsv = va_arg(*args, SV*);
7e2040f0
GS
8290 eptr = SvPVx(argsv, elen);
8291 if (DO_UTF8(argsv))
2cf2cfc6 8292 is_utf8 = TRUE;
fc36a67e 8293
46fc3d4c 8294 string:
b22c7a20 8295 vectorize = FALSE;
46fc3d4c 8296 if (has_precis && elen > precis)
8297 elen = precis;
8298 break;
8299
8300 /* INTEGERS */
8301
fc36a67e 8302 case 'p':
be75b157 8303 if (alt || vectorize)
c2e66d9e 8304 goto unknown;
211dfcf1 8305 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 8306 base = 16;
8307 goto integer;
8308
46fc3d4c 8309 case 'D':
29fe7a80 8310#ifdef IV_IS_QUAD
22f3ae8c 8311 intsize = 'q';
29fe7a80 8312#else
46fc3d4c 8313 intsize = 'l';
29fe7a80 8314#endif
46fc3d4c 8315 /* FALL THROUGH */
8316 case 'd':
8317 case 'i':
b22c7a20 8318 if (vectorize) {
ba210ebe 8319 STRLEN ulen;
211dfcf1
HS
8320 if (!veclen)
8321 continue;
2cf2cfc6
A
8322 if (vec_utf8)
8323 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8324 UTF8_ALLOW_ANYUV);
b22c7a20 8325 else {
e83d50c9 8326 uv = *vecstr;
b22c7a20
GS
8327 ulen = 1;
8328 }
8329 vecstr += ulen;
8330 veclen -= ulen;
e83d50c9
JP
8331 if (plus)
8332 esignbuf[esignlen++] = plus;
b22c7a20
GS
8333 }
8334 else if (args) {
46fc3d4c 8335 switch (intsize) {
8336 case 'h': iv = (short)va_arg(*args, int); break;
8337 default: iv = va_arg(*args, int); break;
8338 case 'l': iv = va_arg(*args, long); break;
fc36a67e 8339 case 'V': iv = va_arg(*args, IV); break;
cf2093f6
JH
8340#ifdef HAS_QUAD
8341 case 'q': iv = va_arg(*args, Quad_t); break;
8342#endif
46fc3d4c 8343 }
8344 }
8345 else {
211dfcf1 8346 iv = SvIVx(argsv);
46fc3d4c 8347 switch (intsize) {
8348 case 'h': iv = (short)iv; break;
be28567c 8349 default: break;
46fc3d4c 8350 case 'l': iv = (long)iv; break;
fc36a67e 8351 case 'V': break;
cf2093f6
JH
8352#ifdef HAS_QUAD
8353 case 'q': iv = (Quad_t)iv; break;
8354#endif
46fc3d4c 8355 }
8356 }
e83d50c9
JP
8357 if ( !vectorize ) /* we already set uv above */
8358 {
8359 if (iv >= 0) {
8360 uv = iv;
8361 if (plus)
8362 esignbuf[esignlen++] = plus;
8363 }
8364 else {
8365 uv = -iv;
8366 esignbuf[esignlen++] = '-';
8367 }
46fc3d4c 8368 }
8369 base = 10;
8370 goto integer;
8371
fc36a67e 8372 case 'U':
29fe7a80 8373#ifdef IV_IS_QUAD
22f3ae8c 8374 intsize = 'q';
29fe7a80 8375#else
fc36a67e 8376 intsize = 'l';
29fe7a80 8377#endif
fc36a67e 8378 /* FALL THROUGH */
8379 case 'u':
8380 base = 10;
8381 goto uns_integer;
8382
4f19785b
WSI
8383 case 'b':
8384 base = 2;
8385 goto uns_integer;
8386
46fc3d4c 8387 case 'O':
29fe7a80 8388#ifdef IV_IS_QUAD
22f3ae8c 8389 intsize = 'q';
29fe7a80 8390#else
46fc3d4c 8391 intsize = 'l';
29fe7a80 8392#endif
46fc3d4c 8393 /* FALL THROUGH */
8394 case 'o':
8395 base = 8;
8396 goto uns_integer;
8397
8398 case 'X':
46fc3d4c 8399 case 'x':
8400 base = 16;
46fc3d4c 8401
8402 uns_integer:
b22c7a20 8403 if (vectorize) {
ba210ebe 8404 STRLEN ulen;
b22c7a20 8405 vector:
211dfcf1
HS
8406 if (!veclen)
8407 continue;
2cf2cfc6
A
8408 if (vec_utf8)
8409 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8410 UTF8_ALLOW_ANYUV);
b22c7a20 8411 else {
a05b299f 8412 uv = *vecstr;
b22c7a20
GS
8413 ulen = 1;
8414 }
8415 vecstr += ulen;
8416 veclen -= ulen;
8417 }
8418 else if (args) {
46fc3d4c 8419 switch (intsize) {
8420 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
8421 default: uv = va_arg(*args, unsigned); break;
8422 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 8423 case 'V': uv = va_arg(*args, UV); break;
cf2093f6
JH
8424#ifdef HAS_QUAD
8425 case 'q': uv = va_arg(*args, Quad_t); break;
8426#endif
46fc3d4c 8427 }
8428 }
8429 else {
211dfcf1 8430 uv = SvUVx(argsv);
46fc3d4c 8431 switch (intsize) {
8432 case 'h': uv = (unsigned short)uv; break;
be28567c 8433 default: break;
46fc3d4c 8434 case 'l': uv = (unsigned long)uv; break;
fc36a67e 8435 case 'V': break;
cf2093f6
JH
8436#ifdef HAS_QUAD
8437 case 'q': uv = (Quad_t)uv; break;
8438#endif
46fc3d4c 8439 }
8440 }
8441
8442 integer:
46fc3d4c 8443 eptr = ebuf + sizeof ebuf;
fc36a67e 8444 switch (base) {
8445 unsigned dig;
8446 case 16:
c10ed8b9
HS
8447 if (!uv)
8448 alt = FALSE;
1d7c1841
GS
8449 p = (char*)((c == 'X')
8450 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 8451 do {
8452 dig = uv & 15;
8453 *--eptr = p[dig];
8454 } while (uv >>= 4);
8455 if (alt) {
46fc3d4c 8456 esignbuf[esignlen++] = '0';
fc36a67e 8457 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 8458 }
fc36a67e 8459 break;
8460 case 8:
8461 do {
8462 dig = uv & 7;
8463 *--eptr = '0' + dig;
8464 } while (uv >>= 3);
8465 if (alt && *eptr != '0')
8466 *--eptr = '0';
8467 break;
4f19785b
WSI
8468 case 2:
8469 do {
8470 dig = uv & 1;
8471 *--eptr = '0' + dig;
8472 } while (uv >>= 1);
eda88b6d
JH
8473 if (alt) {
8474 esignbuf[esignlen++] = '0';
7481bb52 8475 esignbuf[esignlen++] = 'b';
eda88b6d 8476 }
4f19785b 8477 break;
fc36a67e 8478 default: /* it had better be ten or less */
6bc102ca 8479#if defined(PERL_Y2KWARN)
e476b1b5 8480 if (ckWARN(WARN_Y2K)) {
6bc102ca
GS
8481 STRLEN n;
8482 char *s = SvPV(sv,n);
8483 if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
8484 && (n == 2 || !isDIGIT(s[n-3])))
8485 {
9014280d 8486 Perl_warner(aTHX_ packWARN(WARN_Y2K),
6bc102ca
GS
8487 "Possible Y2K bug: %%%c %s",
8488 c, "format string following '19'");
8489 }
8490 }
8491#endif
fc36a67e 8492 do {
8493 dig = uv % base;
8494 *--eptr = '0' + dig;
8495 } while (uv /= base);
8496 break;
46fc3d4c 8497 }
8498 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
8499 if (has_precis) {
8500 if (precis > elen)
8501 zeros = precis - elen;
8502 else if (precis == 0 && elen == 1 && *eptr == '0')
8503 elen = 0;
8504 }
46fc3d4c 8505 break;
8506
8507 /* FLOATING POINT */
8508
fc36a67e 8509 case 'F':
8510 c = 'f'; /* maybe %F isn't supported here */
8511 /* FALL THROUGH */
46fc3d4c 8512 case 'e': case 'E':
fc36a67e 8513 case 'f':
46fc3d4c 8514 case 'g': case 'G':
8515
8516 /* This is evil, but floating point is even more evil */
8517
9e5b023a
JH
8518 /* for SV-style calling, we can only get NV
8519 for C-style calling, we assume %f is double;
8520 for simplicity we allow any of %Lf, %llf, %qf for long double
8521 */
8522 switch (intsize) {
8523 case 'V':
8524#if defined(USE_LONG_DOUBLE)
8525 intsize = 'q';
8526#endif
8527 break;
8528 default:
8529#if defined(USE_LONG_DOUBLE)
8530 intsize = args ? 0 : 'q';
8531#endif
8532 break;
8533 case 'q':
8534#if defined(HAS_LONG_DOUBLE)
8535 break;
8536#else
8537 /* FALL THROUGH */
8538#endif
8539 case 'h':
8540 /* FALL THROUGH */
8541 case 'l':
8542 goto unknown;
8543 }
8544
8545 /* now we need (long double) if intsize == 'q', else (double) */
be75b157 8546 nv = (args && !vectorize) ?
35fff930
JH
8547#if LONG_DOUBLESIZE > DOUBLESIZE
8548 intsize == 'q' ?
205f51d8
AS
8549 va_arg(*args, long double) :
8550 va_arg(*args, double)
35fff930 8551#else
205f51d8 8552 va_arg(*args, double)
35fff930 8553#endif
9e5b023a 8554 : SvNVx(argsv);
fc36a67e 8555
8556 need = 0;
be75b157 8557 vectorize = FALSE;
fc36a67e 8558 if (c != 'e' && c != 'E') {
8559 i = PERL_INT_MIN;
9e5b023a
JH
8560 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
8561 will cast our (long double) to (double) */
73b309ea 8562 (void)Perl_frexp(nv, &i);
fc36a67e 8563 if (i == PERL_INT_MIN)
cea2e8a9 8564 Perl_die(aTHX_ "panic: frexp");
c635e13b 8565 if (i > 0)
fc36a67e 8566 need = BIT_DIGITS(i);
8567 }
8568 need += has_precis ? precis : 6; /* known default */
20f6aaab 8569
fc36a67e 8570 if (need < width)
8571 need = width;
8572
20f6aaab
AS
8573#ifdef HAS_LDBL_SPRINTF_BUG
8574 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
8575 with sfio - Allen <allens@cpan.org> */
8576
8577# ifdef DBL_MAX
8578# define MY_DBL_MAX DBL_MAX
8579# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
8580# if DOUBLESIZE >= 8
8581# define MY_DBL_MAX 1.7976931348623157E+308L
8582# else
8583# define MY_DBL_MAX 3.40282347E+38L
8584# endif
8585# endif
8586
8587# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
8588# define MY_DBL_MAX_BUG 1L
20f6aaab 8589# else
205f51d8 8590# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 8591# endif
20f6aaab 8592
205f51d8
AS
8593# ifdef DBL_MIN
8594# define MY_DBL_MIN DBL_MIN
8595# else /* XXX guessing! -Allen */
8596# if DOUBLESIZE >= 8
8597# define MY_DBL_MIN 2.2250738585072014E-308L
8598# else
8599# define MY_DBL_MIN 1.17549435E-38L
8600# endif
8601# endif
20f6aaab 8602
205f51d8
AS
8603 if ((intsize == 'q') && (c == 'f') &&
8604 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
8605 (need < DBL_DIG)) {
8606 /* it's going to be short enough that
8607 * long double precision is not needed */
8608
8609 if ((nv <= 0L) && (nv >= -0L))
8610 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
8611 else {
8612 /* would use Perl_fp_class as a double-check but not
8613 * functional on IRIX - see perl.h comments */
8614
8615 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
8616 /* It's within the range that a double can represent */
8617#if defined(DBL_MAX) && !defined(DBL_MIN)
8618 if ((nv >= ((long double)1/DBL_MAX)) ||
8619 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 8620#endif
205f51d8 8621 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 8622 }
205f51d8
AS
8623 }
8624 if (fix_ldbl_sprintf_bug == TRUE) {
8625 double temp;
8626
8627 intsize = 0;
8628 temp = (double)nv;
8629 nv = (NV)temp;
8630 }
20f6aaab 8631 }
205f51d8
AS
8632
8633# undef MY_DBL_MAX
8634# undef MY_DBL_MAX_BUG
8635# undef MY_DBL_MIN
8636
20f6aaab
AS
8637#endif /* HAS_LDBL_SPRINTF_BUG */
8638
46fc3d4c 8639 need += 20; /* fudge factor */
80252599
GS
8640 if (PL_efloatsize < need) {
8641 Safefree(PL_efloatbuf);
8642 PL_efloatsize = need + 20; /* more fudge */
8643 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 8644 PL_efloatbuf[0] = '\0';
46fc3d4c 8645 }
8646
8647 eptr = ebuf + sizeof ebuf;
8648 *--eptr = '\0';
8649 *--eptr = c;
9e5b023a
JH
8650 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
8651#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
8652 if (intsize == 'q') {
e5c81feb
JH
8653 /* Copy the one or more characters in a long double
8654 * format before the 'base' ([efgEFG]) character to
8655 * the format string. */
8656 static char const prifldbl[] = PERL_PRIfldbl;
8657 char const *p = prifldbl + sizeof(prifldbl) - 3;
8658 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 8659 }
65202027 8660#endif
46fc3d4c 8661 if (has_precis) {
8662 base = precis;
8663 do { *--eptr = '0' + (base % 10); } while (base /= 10);
8664 *--eptr = '.';
8665 }
8666 if (width) {
8667 base = width;
8668 do { *--eptr = '0' + (base % 10); } while (base /= 10);
8669 }
8670 if (fill == '0')
8671 *--eptr = fill;
84902520
TB
8672 if (left)
8673 *--eptr = '-';
46fc3d4c 8674 if (plus)
8675 *--eptr = plus;
8676 if (alt)
8677 *--eptr = '#';
8678 *--eptr = '%';
8679
ff9121f8
JH
8680 /* No taint. Otherwise we are in the strange situation
8681 * where printf() taints but print($float) doesn't.
bda0f7a5 8682 * --jhi */
9e5b023a
JH
8683#if defined(HAS_LONG_DOUBLE)
8684 if (intsize == 'q')
8685 (void)sprintf(PL_efloatbuf, eptr, nv);
8686 else
8687 (void)sprintf(PL_efloatbuf, eptr, (double)nv);
8688#else
dd8482fc 8689 (void)sprintf(PL_efloatbuf, eptr, nv);
9e5b023a 8690#endif
80252599
GS
8691 eptr = PL_efloatbuf;
8692 elen = strlen(PL_efloatbuf);
46fc3d4c 8693 break;
8694
fc36a67e 8695 /* SPECIAL */
8696
8697 case 'n':
8698 i = SvCUR(sv) - origlen;
be75b157 8699 if (args && !vectorize) {
c635e13b 8700 switch (intsize) {
8701 case 'h': *(va_arg(*args, short*)) = i; break;
8702 default: *(va_arg(*args, int*)) = i; break;
8703 case 'l': *(va_arg(*args, long*)) = i; break;
8704 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
8705#ifdef HAS_QUAD
8706 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
8707#endif
c635e13b 8708 }
fc36a67e 8709 }
9dd79c3f 8710 else
211dfcf1 8711 sv_setuv_mg(argsv, (UV)i);
be75b157 8712 vectorize = FALSE;
fc36a67e 8713 continue; /* not "break" */
8714
8715 /* UNKNOWN */
8716
46fc3d4c 8717 default:
fc36a67e 8718 unknown:
b22c7a20 8719 vectorize = FALSE;
599cee73 8720 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 8721 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 8722 SV *msg = sv_newmortal();
cea2e8a9 8723 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %s: ",
533c011a 8724 (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
0f4b6630 8725 if (c) {
0f4b6630 8726 if (isPRINT(c))
1c846c1f 8727 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
8728 "\"%%%c\"", c & 0xFF);
8729 else
8730 Perl_sv_catpvf(aTHX_ msg,
57def98f 8731 "\"%%\\%03"UVof"\"",
0f4b6630 8732 (UV)c & 0xFF);
0f4b6630 8733 } else
c635e13b 8734 sv_catpv(msg, "end of string");
9014280d 8735 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 8736 }
fb73857a 8737
8738 /* output mangled stuff ... */
8739 if (c == '\0')
8740 --q;
46fc3d4c 8741 eptr = p;
8742 elen = q - p;
fb73857a 8743
8744 /* ... right here, because formatting flags should not apply */
8745 SvGROW(sv, SvCUR(sv) + elen + 1);
8746 p = SvEND(sv);
4459522c 8747 Copy(eptr, p, elen, char);
fb73857a 8748 p += elen;
8749 *p = '\0';
8750 SvCUR(sv) = p - SvPVX(sv);
8751 continue; /* not "break" */
46fc3d4c 8752 }
8753
d2876be5
JH
8754 if (is_utf8 != has_utf8) {
8755 if (is_utf8) {
8756 if (SvCUR(sv))
8757 sv_utf8_upgrade(sv);
8758 }
8759 else {
8760 SV *nsv = sv_2mortal(newSVpvn(eptr, elen));
8761 sv_utf8_upgrade(nsv);
8762 eptr = SvPVX(nsv);
8763 elen = SvCUR(nsv);
8764 }
8765 SvGROW(sv, SvCUR(sv) + elen + 1);
8766 p = SvEND(sv);
8767 *p = '\0';
8768 }
8769
fc36a67e 8770 have = esignlen + zeros + elen;
46fc3d4c 8771 need = (have > width ? have : width);
8772 gap = need - have;
8773
b22c7a20 8774 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 8775 p = SvEND(sv);
8776 if (esignlen && fill == '0') {
eb160463 8777 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 8778 *p++ = esignbuf[i];
8779 }
8780 if (gap && !left) {
8781 memset(p, fill, gap);
8782 p += gap;
8783 }
8784 if (esignlen && fill != '0') {
eb160463 8785 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 8786 *p++ = esignbuf[i];
8787 }
fc36a67e 8788 if (zeros) {
8789 for (i = zeros; i; i--)
8790 *p++ = '0';
8791 }
46fc3d4c 8792 if (elen) {
4459522c 8793 Copy(eptr, p, elen, char);
46fc3d4c 8794 p += elen;
8795 }
8796 if (gap && left) {
8797 memset(p, ' ', gap);
8798 p += gap;
8799 }
b22c7a20
GS
8800 if (vectorize) {
8801 if (veclen) {
4459522c 8802 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
8803 p += dotstrlen;
8804 }
8805 else
8806 vectorize = FALSE; /* done iterating over vecstr */
8807 }
2cf2cfc6
A
8808 if (is_utf8)
8809 has_utf8 = TRUE;
8810 if (has_utf8)
7e2040f0 8811 SvUTF8_on(sv);
46fc3d4c 8812 *p = '\0';
8813 SvCUR(sv) = p - SvPVX(sv);
b22c7a20
GS
8814 if (vectorize) {
8815 esignlen = 0;
8816 goto vector;
8817 }
46fc3d4c 8818 }
8819}
51371543 8820
645c22ef
DM
8821/* =========================================================================
8822
8823=head1 Cloning an interpreter
8824
8825All the macros and functions in this section are for the private use of
8826the main function, perl_clone().
8827
8828The foo_dup() functions make an exact copy of an existing foo thinngy.
8829During the course of a cloning, a hash table is used to map old addresses
8830to new addresses. The table is created and manipulated with the
8831ptr_table_* functions.
8832
8833=cut
8834
8835============================================================================*/
8836
8837
1d7c1841
GS
8838#if defined(USE_ITHREADS)
8839
1d7c1841
GS
8840#ifndef GpREFCNT_inc
8841# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
8842#endif
8843
8844
d2d73c3e
AB
8845#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
8846#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
8847#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8848#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
8849#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8850#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
8851#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8852#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
8853#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
8854#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
8855#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
8856#define SAVEPV(p) (p ? savepv(p) : Nullch)
8857#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 8858
d2d73c3e 8859
d2f185dc
AMS
8860/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
8861 regcomp.c. AMS 20010712 */
645c22ef 8862
1d7c1841 8863REGEXP *
a8fc9800 8864Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
1d7c1841 8865{
d2f185dc
AMS
8866 REGEXP *ret;
8867 int i, len, npar;
8868 struct reg_substr_datum *s;
8869
8870 if (!r)
8871 return (REGEXP *)NULL;
8872
8873 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
8874 return ret;
8875
8876 len = r->offsets[0];
8877 npar = r->nparens+1;
8878
8879 Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
8880 Copy(r->program, ret->program, len+1, regnode);
8881
8882 New(0, ret->startp, npar, I32);
8883 Copy(r->startp, ret->startp, npar, I32);
8884 New(0, ret->endp, npar, I32);
8885 Copy(r->startp, ret->startp, npar, I32);
8886
d2f185dc
AMS
8887 New(0, ret->substrs, 1, struct reg_substr_data);
8888 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
8889 s->min_offset = r->substrs->data[i].min_offset;
8890 s->max_offset = r->substrs->data[i].max_offset;
8891 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 8892 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
8893 }
8894
70612e96 8895 ret->regstclass = NULL;
d2f185dc
AMS
8896 if (r->data) {
8897 struct reg_data *d;
8898 int count = r->data->count;
8899
8900 Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
8901 char, struct reg_data);
8902 New(0, d->what, count, U8);
8903
8904 d->count = count;
8905 for (i = 0; i < count; i++) {
8906 d->what[i] = r->data->what[i];
8907 switch (d->what[i]) {
8908 case 's':
8909 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
8910 break;
8911 case 'p':
8912 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
8913 break;
8914 case 'f':
8915 /* This is cheating. */
8916 New(0, d->data[i], 1, struct regnode_charclass_class);
8917 StructCopy(r->data->data[i], d->data[i],
8918 struct regnode_charclass_class);
70612e96 8919 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
8920 break;
8921 case 'o':
33773810
AMS
8922 /* Compiled op trees are readonly, and can thus be
8923 shared without duplication. */
9b978d73
DM
8924 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
8925 break;
d2f185dc
AMS
8926 case 'n':
8927 d->data[i] = r->data->data[i];
8928 break;
8929 }
8930 }
8931
8932 ret->data = d;
8933 }
8934 else
8935 ret->data = NULL;
8936
8937 New(0, ret->offsets, 2*len+1, U32);
8938 Copy(r->offsets, ret->offsets, 2*len+1, U32);
8939
8940 ret->precomp = SAVEPV(r->precomp);
d2f185dc
AMS
8941 ret->refcnt = r->refcnt;
8942 ret->minlen = r->minlen;
8943 ret->prelen = r->prelen;
8944 ret->nparens = r->nparens;
8945 ret->lastparen = r->lastparen;
8946 ret->lastcloseparen = r->lastcloseparen;
8947 ret->reganch = r->reganch;
8948
70612e96
RG
8949 ret->sublen = r->sublen;
8950
8951 if (RX_MATCH_COPIED(ret))
8952 ret->subbeg = SAVEPV(r->subbeg);
8953 else
8954 ret->subbeg = Nullch;
8955
d2f185dc
AMS
8956 ptr_table_store(PL_ptr_table, r, ret);
8957 return ret;
1d7c1841
GS
8958}
8959
d2d73c3e 8960/* duplicate a file handle */
645c22ef 8961
1d7c1841 8962PerlIO *
a8fc9800 8963Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
8964{
8965 PerlIO *ret;
8966 if (!fp)
8967 return (PerlIO*)NULL;
8968
8969 /* look for it in the table first */
8970 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
8971 if (ret)
8972 return ret;
8973
8974 /* create anew and remember what it is */
ecdeb87c 8975 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
8976 ptr_table_store(PL_ptr_table, fp, ret);
8977 return ret;
8978}
8979
645c22ef
DM
8980/* duplicate a directory handle */
8981
1d7c1841
GS
8982DIR *
8983Perl_dirp_dup(pTHX_ DIR *dp)
8984{
8985 if (!dp)
8986 return (DIR*)NULL;
8987 /* XXX TODO */
8988 return dp;
8989}
8990
ff276b08 8991/* duplicate a typeglob */
645c22ef 8992
1d7c1841 8993GP *
a8fc9800 8994Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
8995{
8996 GP *ret;
8997 if (!gp)
8998 return (GP*)NULL;
8999 /* look for it in the table first */
9000 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
9001 if (ret)
9002 return ret;
9003
9004 /* create anew and remember what it is */
9005 Newz(0, ret, 1, GP);
9006 ptr_table_store(PL_ptr_table, gp, ret);
9007
9008 /* clone */
9009 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
9010 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
9011 ret->gp_io = io_dup_inc(gp->gp_io, param);
9012 ret->gp_form = cv_dup_inc(gp->gp_form, param);
9013 ret->gp_av = av_dup_inc(gp->gp_av, param);
9014 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
9015 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
9016 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
9017 ret->gp_cvgen = gp->gp_cvgen;
9018 ret->gp_flags = gp->gp_flags;
9019 ret->gp_line = gp->gp_line;
9020 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
9021 return ret;
9022}
9023
645c22ef
DM
9024/* duplicate a chain of magic */
9025
1d7c1841 9026MAGIC *
a8fc9800 9027Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 9028{
cb359b41
JH
9029 MAGIC *mgprev = (MAGIC*)NULL;
9030 MAGIC *mgret;
1d7c1841
GS
9031 if (!mg)
9032 return (MAGIC*)NULL;
9033 /* look for it in the table first */
9034 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
9035 if (mgret)
9036 return mgret;
9037
9038 for (; mg; mg = mg->mg_moremagic) {
9039 MAGIC *nmg;
9040 Newz(0, nmg, 1, MAGIC);
cb359b41 9041 if (mgprev)
1d7c1841 9042 mgprev->mg_moremagic = nmg;
cb359b41
JH
9043 else
9044 mgret = nmg;
1d7c1841
GS
9045 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
9046 nmg->mg_private = mg->mg_private;
9047 nmg->mg_type = mg->mg_type;
9048 nmg->mg_flags = mg->mg_flags;
14befaf4 9049 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 9050 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 9051 }
05bd4103
JH
9052 else if(mg->mg_type == PERL_MAGIC_backref) {
9053 AV *av = (AV*) mg->mg_obj;
9054 SV **svp;
9055 I32 i;
9056 nmg->mg_obj = (SV*)newAV();
9057 svp = AvARRAY(av);
9058 i = AvFILLp(av);
9059 while (i >= 0) {
9060 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
9061 i--;
9062 }
9063 }
1d7c1841
GS
9064 else {
9065 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
9066 ? sv_dup_inc(mg->mg_obj, param)
9067 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
9068 }
9069 nmg->mg_len = mg->mg_len;
9070 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 9071 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 9072 if (mg->mg_len > 0) {
1d7c1841 9073 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
9074 if (mg->mg_type == PERL_MAGIC_overload_table &&
9075 AMT_AMAGIC((AMT*)mg->mg_ptr))
9076 {
1d7c1841
GS
9077 AMT *amtp = (AMT*)mg->mg_ptr;
9078 AMT *namtp = (AMT*)nmg->mg_ptr;
9079 I32 i;
9080 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 9081 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
9082 }
9083 }
9084 }
9085 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 9086 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 9087 }
68795e93
NIS
9088 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
9089 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
9090 }
1d7c1841
GS
9091 mgprev = nmg;
9092 }
9093 return mgret;
9094}
9095
645c22ef
DM
9096/* create a new pointer-mapping table */
9097
1d7c1841
GS
9098PTR_TBL_t *
9099Perl_ptr_table_new(pTHX)
9100{
9101 PTR_TBL_t *tbl;
9102 Newz(0, tbl, 1, PTR_TBL_t);
9103 tbl->tbl_max = 511;
9104 tbl->tbl_items = 0;
9105 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
9106 return tbl;
9107}
9108
645c22ef
DM
9109/* map an existing pointer using a table */
9110
1d7c1841
GS
9111void *
9112Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
9113{
9114 PTR_TBL_ENT_t *tblent;
d2a79402 9115 UV hash = PTR2UV(sv);
1d7c1841
GS
9116 assert(tbl);
9117 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
9118 for (; tblent; tblent = tblent->next) {
9119 if (tblent->oldval == sv)
9120 return tblent->newval;
9121 }
9122 return (void*)NULL;
9123}
9124
645c22ef
DM
9125/* add a new entry to a pointer-mapping table */
9126
1d7c1841
GS
9127void
9128Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
9129{
9130 PTR_TBL_ENT_t *tblent, **otblent;
9131 /* XXX this may be pessimal on platforms where pointers aren't good
9132 * hash values e.g. if they grow faster in the most significant
9133 * bits */
d2a79402 9134 UV hash = PTR2UV(oldv);
1d7c1841
GS
9135 bool i = 1;
9136
9137 assert(tbl);
9138 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
9139 for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
9140 if (tblent->oldval == oldv) {
9141 tblent->newval = newv;
1d7c1841
GS
9142 return;
9143 }
9144 }
9145 Newz(0, tblent, 1, PTR_TBL_ENT_t);
9146 tblent->oldval = oldv;
9147 tblent->newval = newv;
9148 tblent->next = *otblent;
9149 *otblent = tblent;
9150 tbl->tbl_items++;
9151 if (i && tbl->tbl_items > tbl->tbl_max)
9152 ptr_table_split(tbl);
9153}
9154
645c22ef
DM
9155/* double the hash bucket size of an existing ptr table */
9156
1d7c1841
GS
9157void
9158Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
9159{
9160 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
9161 UV oldsize = tbl->tbl_max + 1;
9162 UV newsize = oldsize * 2;
9163 UV i;
9164
9165 Renew(ary, newsize, PTR_TBL_ENT_t*);
9166 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
9167 tbl->tbl_max = --newsize;
9168 tbl->tbl_ary = ary;
9169 for (i=0; i < oldsize; i++, ary++) {
9170 PTR_TBL_ENT_t **curentp, **entp, *ent;
9171 if (!*ary)
9172 continue;
9173 curentp = ary + oldsize;
9174 for (entp = ary, ent = *ary; ent; ent = *entp) {
d2a79402 9175 if ((newsize & PTR2UV(ent->oldval)) != i) {
1d7c1841
GS
9176 *entp = ent->next;
9177 ent->next = *curentp;
9178 *curentp = ent;
9179 continue;
9180 }
9181 else
9182 entp = &ent->next;
9183 }
9184 }
9185}
9186
645c22ef
DM
9187/* remove all the entries from a ptr table */
9188
a0739874
DM
9189void
9190Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
9191{
9192 register PTR_TBL_ENT_t **array;
9193 register PTR_TBL_ENT_t *entry;
9194 register PTR_TBL_ENT_t *oentry = Null(PTR_TBL_ENT_t*);
9195 UV riter = 0;
9196 UV max;
9197
9198 if (!tbl || !tbl->tbl_items) {
9199 return;
9200 }
9201
9202 array = tbl->tbl_ary;
9203 entry = array[0];
9204 max = tbl->tbl_max;
9205
9206 for (;;) {
9207 if (entry) {
9208 oentry = entry;
9209 entry = entry->next;
9210 Safefree(oentry);
9211 }
9212 if (!entry) {
9213 if (++riter > max) {
9214 break;
9215 }
9216 entry = array[riter];
9217 }
9218 }
9219
9220 tbl->tbl_items = 0;
9221}
9222
645c22ef
DM
9223/* clear and free a ptr table */
9224
a0739874
DM
9225void
9226Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
9227{
9228 if (!tbl) {
9229 return;
9230 }
9231 ptr_table_clear(tbl);
9232 Safefree(tbl->tbl_ary);
9233 Safefree(tbl);
9234}
9235
1d7c1841
GS
9236#ifdef DEBUGGING
9237char *PL_watch_pvx;
9238#endif
9239
645c22ef
DM
9240/* attempt to make everything in the typeglob readonly */
9241
5bd07a3d 9242STATIC SV *
59b40662 9243S_gv_share(pTHX_ SV *sstr, CLONE_PARAMS *param)
5bd07a3d
DM
9244{
9245 GV *gv = (GV*)sstr;
59b40662 9246 SV *sv = &param->proto_perl->Isv_no; /* just need SvREADONLY-ness */
5bd07a3d
DM
9247
9248 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 9249 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
9250 }
9251 else if (!GvCV(gv)) {
9252 GvCV(gv) = (CV*)sv;
9253 }
9254 else {
9255 /* CvPADLISTs cannot be shared */
37e20706 9256 if (!SvREADONLY(GvCV(gv)) && !CvXSUB(GvCV(gv))) {
7fb37951 9257 GvUNIQUE_off(gv);
5bd07a3d
DM
9258 }
9259 }
9260
7fb37951 9261 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
9262#if 0
9263 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
9264 HvNAME(GvSTASH(gv)), GvNAME(gv));
9265#endif
9266 return Nullsv;
9267 }
9268
4411f3b6 9269 /*
5bd07a3d
DM
9270 * write attempts will die with
9271 * "Modification of a read-only value attempted"
9272 */
9273 if (!GvSV(gv)) {
9274 GvSV(gv) = sv;
9275 }
9276 else {
9277 SvREADONLY_on(GvSV(gv));
9278 }
9279
9280 if (!GvAV(gv)) {
9281 GvAV(gv) = (AV*)sv;
9282 }
9283 else {
9284 SvREADONLY_on(GvAV(gv));
9285 }
9286
9287 if (!GvHV(gv)) {
9288 GvHV(gv) = (HV*)sv;
9289 }
9290 else {
9291 SvREADONLY_on(GvAV(gv));
9292 }
9293
9294 return sstr; /* he_dup() will SvREFCNT_inc() */
9295}
9296
645c22ef
DM
9297/* duplicate an SV of any type (including AV, HV etc) */
9298
83841fad
NIS
9299void
9300Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
9301{
9302 if (SvROK(sstr)) {
d3d0e6f1 9303 SvRV(dstr) = SvWEAKREF(sstr)
83841fad
NIS
9304 ? sv_dup(SvRV(sstr), param)
9305 : sv_dup_inc(SvRV(sstr), param);
9306 }
9307 else if (SvPVX(sstr)) {
9308 /* Has something there */
9309 if (SvLEN(sstr)) {
68795e93 9310 /* Normal PV - clone whole allocated space */
83841fad 9311 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
d3d0e6f1
NC
9312 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
9313 /* Not that normal - actually sstr is copy on write.
9314 But we are a true, independant SV, so: */
9315 SvREADONLY_off(dstr);
9316 SvFAKE_off(dstr);
9317 }
68795e93 9318 }
83841fad
NIS
9319 else {
9320 /* Special case - not normally malloced for some reason */
9321 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
9322 /* A "shared" PV - clone it as unshared string */
9323 SvFAKE_off(dstr);
9324 SvREADONLY_off(dstr);
9325 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvCUR(sstr));
9326 }
9327 else {
9328 /* Some other special case - random pointer */
9329 SvPVX(dstr) = SvPVX(sstr);
d3d0e6f1 9330 }
83841fad
NIS
9331 }
9332 }
9333 else {
9334 /* Copy the Null */
9335 SvPVX(dstr) = SvPVX(sstr);
9336 }
9337}
9338
1d7c1841 9339SV *
a8fc9800 9340Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
1d7c1841 9341{
1d7c1841
GS
9342 SV *dstr;
9343
9344 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
9345 return Nullsv;
9346 /* look for it in the table first */
9347 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
9348 if (dstr)
9349 return dstr;
9350
9351 /* create anew and remember what it is */
9352 new_SV(dstr);
9353 ptr_table_store(PL_ptr_table, sstr, dstr);
9354
9355 /* clone */
9356 SvFLAGS(dstr) = SvFLAGS(sstr);
9357 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
9358 SvREFCNT(dstr) = 0; /* must be before any other dups! */
9359
9360#ifdef DEBUGGING
9361 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
9362 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
9363 PL_watch_pvx, SvPVX(sstr));
9364#endif
9365
9366 switch (SvTYPE(sstr)) {
9367 case SVt_NULL:
9368 SvANY(dstr) = NULL;
9369 break;
9370 case SVt_IV:
9371 SvANY(dstr) = new_XIV();
9372 SvIVX(dstr) = SvIVX(sstr);
9373 break;
9374 case SVt_NV:
9375 SvANY(dstr) = new_XNV();
9376 SvNVX(dstr) = SvNVX(sstr);
9377 break;
9378 case SVt_RV:
9379 SvANY(dstr) = new_XRV();
83841fad 9380 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9381 break;
9382 case SVt_PV:
9383 SvANY(dstr) = new_XPV();
9384 SvCUR(dstr) = SvCUR(sstr);
9385 SvLEN(dstr) = SvLEN(sstr);
83841fad 9386 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9387 break;
9388 case SVt_PVIV:
9389 SvANY(dstr) = new_XPVIV();
9390 SvCUR(dstr) = SvCUR(sstr);
9391 SvLEN(dstr) = SvLEN(sstr);
9392 SvIVX(dstr) = SvIVX(sstr);
83841fad 9393 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9394 break;
9395 case SVt_PVNV:
9396 SvANY(dstr) = new_XPVNV();
9397 SvCUR(dstr) = SvCUR(sstr);
9398 SvLEN(dstr) = SvLEN(sstr);
9399 SvIVX(dstr) = SvIVX(sstr);
9400 SvNVX(dstr) = SvNVX(sstr);
83841fad 9401 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9402 break;
9403 case SVt_PVMG:
9404 SvANY(dstr) = new_XPVMG();
9405 SvCUR(dstr) = SvCUR(sstr);
9406 SvLEN(dstr) = SvLEN(sstr);
9407 SvIVX(dstr) = SvIVX(sstr);
9408 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9409 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9410 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9411 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9412 break;
9413 case SVt_PVBM:
9414 SvANY(dstr) = new_XPVBM();
9415 SvCUR(dstr) = SvCUR(sstr);
9416 SvLEN(dstr) = SvLEN(sstr);
9417 SvIVX(dstr) = SvIVX(sstr);
9418 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9419 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9420 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9421 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9422 BmRARE(dstr) = BmRARE(sstr);
9423 BmUSEFUL(dstr) = BmUSEFUL(sstr);
9424 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
9425 break;
9426 case SVt_PVLV:
9427 SvANY(dstr) = new_XPVLV();
9428 SvCUR(dstr) = SvCUR(sstr);
9429 SvLEN(dstr) = SvLEN(sstr);
9430 SvIVX(dstr) = SvIVX(sstr);
9431 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9432 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9433 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9434 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9435 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
9436 LvTARGLEN(dstr) = LvTARGLEN(sstr);
d2d73c3e 9437 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr), param);
1d7c1841
GS
9438 LvTYPE(dstr) = LvTYPE(sstr);
9439 break;
9440 case SVt_PVGV:
7fb37951 9441 if (GvUNIQUE((GV*)sstr)) {
5bd07a3d 9442 SV *share;
59b40662 9443 if ((share = gv_share(sstr, param))) {
5bd07a3d
DM
9444 del_SV(dstr);
9445 dstr = share;
37e20706 9446 ptr_table_store(PL_ptr_table, sstr, dstr);
5bd07a3d
DM
9447#if 0
9448 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
9449 HvNAME(GvSTASH(share)), GvNAME(share));
9450#endif
9451 break;
9452 }
9453 }
1d7c1841
GS
9454 SvANY(dstr) = new_XPVGV();
9455 SvCUR(dstr) = SvCUR(sstr);
9456 SvLEN(dstr) = SvLEN(sstr);
9457 SvIVX(dstr) = SvIVX(sstr);
9458 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9459 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9460 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9461 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9462 GvNAMELEN(dstr) = GvNAMELEN(sstr);
9463 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
d2d73c3e 9464 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr), param);
1d7c1841 9465 GvFLAGS(dstr) = GvFLAGS(sstr);
d2d73c3e 9466 GvGP(dstr) = gp_dup(GvGP(sstr), param);
1d7c1841
GS
9467 (void)GpREFCNT_inc(GvGP(dstr));
9468 break;
9469 case SVt_PVIO:
9470 SvANY(dstr) = new_XPVIO();
9471 SvCUR(dstr) = SvCUR(sstr);
9472 SvLEN(dstr) = SvLEN(sstr);
9473 SvIVX(dstr) = SvIVX(sstr);
9474 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9475 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9476 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9477 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
a8fc9800 9478 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
9479 if (IoOFP(sstr) == IoIFP(sstr))
9480 IoOFP(dstr) = IoIFP(dstr);
9481 else
a8fc9800 9482 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
9483 /* PL_rsfp_filters entries have fake IoDIRP() */
9484 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
9485 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
9486 else
9487 IoDIRP(dstr) = IoDIRP(sstr);
9488 IoLINES(dstr) = IoLINES(sstr);
9489 IoPAGE(dstr) = IoPAGE(sstr);
9490 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
9491 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
9492 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
d2d73c3e 9493 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr), param);
1d7c1841 9494 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
d2d73c3e 9495 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr), param);
1d7c1841 9496 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
d2d73c3e 9497 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr), param);
1d7c1841
GS
9498 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
9499 IoTYPE(dstr) = IoTYPE(sstr);
9500 IoFLAGS(dstr) = IoFLAGS(sstr);
9501 break;
9502 case SVt_PVAV:
9503 SvANY(dstr) = new_XPVAV();
9504 SvCUR(dstr) = SvCUR(sstr);
9505 SvLEN(dstr) = SvLEN(sstr);
9506 SvIVX(dstr) = SvIVX(sstr);
9507 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9508 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9509 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
9510 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
1d7c1841
GS
9511 AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
9512 if (AvARRAY((AV*)sstr)) {
9513 SV **dst_ary, **src_ary;
9514 SSize_t items = AvFILLp((AV*)sstr) + 1;
9515
9516 src_ary = AvARRAY((AV*)sstr);
9517 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
9518 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
9519 SvPVX(dstr) = (char*)dst_ary;
9520 AvALLOC((AV*)dstr) = dst_ary;
9521 if (AvREAL((AV*)sstr)) {
9522 while (items-- > 0)
d2d73c3e 9523 *dst_ary++ = sv_dup_inc(*src_ary++, param);
1d7c1841
GS
9524 }
9525 else {
9526 while (items-- > 0)
d2d73c3e 9527 *dst_ary++ = sv_dup(*src_ary++, param);
1d7c1841
GS
9528 }
9529 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
9530 while (items-- > 0) {
9531 *dst_ary++ = &PL_sv_undef;
9532 }
9533 }
9534 else {
9535 SvPVX(dstr) = Nullch;
9536 AvALLOC((AV*)dstr) = (SV**)NULL;
9537 }
9538 break;
9539 case SVt_PVHV:
9540 SvANY(dstr) = new_XPVHV();
9541 SvCUR(dstr) = SvCUR(sstr);
9542 SvLEN(dstr) = SvLEN(sstr);
9543 SvIVX(dstr) = SvIVX(sstr);
9544 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9545 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9546 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841
GS
9547 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
9548 if (HvARRAY((HV*)sstr)) {
1d7c1841
GS
9549 STRLEN i = 0;
9550 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
9551 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
9552 Newz(0, dxhv->xhv_array,
9553 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
9554 while (i <= sxhv->xhv_max) {
9555 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
eb160463
GS
9556 (bool)!!HvSHAREKEYS(sstr),
9557 param);
1d7c1841
GS
9558 ++i;
9559 }
eb160463
GS
9560 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter,
9561 (bool)!!HvSHAREKEYS(sstr), param);
1d7c1841
GS
9562 }
9563 else {
9564 SvPVX(dstr) = Nullch;
9565 HvEITER((HV*)dstr) = (HE*)NULL;
9566 }
9567 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
9568 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
c43294b8 9569 /* Record stashes for possible cloning in Perl_clone(). */
6676db26 9570 if(HvNAME((HV*)dstr))
d2d73c3e 9571 av_push(param->stashes, dstr);
1d7c1841
GS
9572 break;
9573 case SVt_PVFM:
9574 SvANY(dstr) = new_XPVFM();
9575 FmLINES(dstr) = FmLINES(sstr);
9576 goto dup_pvcv;
9577 /* NOTREACHED */
9578 case SVt_PVCV:
9579 SvANY(dstr) = new_XPVCV();
d2d73c3e 9580 dup_pvcv:
1d7c1841
GS
9581 SvCUR(dstr) = SvCUR(sstr);
9582 SvLEN(dstr) = SvLEN(sstr);
9583 SvIVX(dstr) = SvIVX(sstr);
9584 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9585 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9586 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9587 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
d2d73c3e 9588 CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
1d7c1841
GS
9589 CvSTART(dstr) = CvSTART(sstr);
9590 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
9591 CvXSUB(dstr) = CvXSUB(sstr);
9592 CvXSUBANY(dstr) = CvXSUBANY(sstr);
01485f8b
DM
9593 if (CvCONST(sstr)) {
9594 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
9595 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
9596 sv_dup_inc(CvXSUBANY(sstr).any_ptr, param);
9597 }
d2d73c3e
AB
9598 CvGV(dstr) = gv_dup(CvGV(sstr), param);
9599 if (param->flags & CLONEf_COPY_STACKS) {
9600 CvDEPTH(dstr) = CvDEPTH(sstr);
9601 } else {
9602 CvDEPTH(dstr) = 0;
9603 }
dd2155a4 9604 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
7dafbf52
DM
9605 CvOUTSIDE_SEQ(dstr) = CvOUTSIDE_SEQ(sstr);
9606 CvOUTSIDE(dstr) =
9607 CvWEAKOUTSIDE(sstr)
9608 ? cv_dup( CvOUTSIDE(sstr), param)
9609 : cv_dup_inc(CvOUTSIDE(sstr), param);
1d7c1841 9610 CvFLAGS(dstr) = CvFLAGS(sstr);
54356c7d 9611 CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
1d7c1841
GS
9612 break;
9613 default:
c803eecc 9614 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
1d7c1841
GS
9615 break;
9616 }
9617
9618 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
9619 ++PL_sv_objcount;
9620
9621 return dstr;
d2d73c3e 9622 }
1d7c1841 9623
645c22ef
DM
9624/* duplicate a context */
9625
1d7c1841 9626PERL_CONTEXT *
a8fc9800 9627Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
9628{
9629 PERL_CONTEXT *ncxs;
9630
9631 if (!cxs)
9632 return (PERL_CONTEXT*)NULL;
9633
9634 /* look for it in the table first */
9635 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
9636 if (ncxs)
9637 return ncxs;
9638
9639 /* create anew and remember what it is */
9640 Newz(56, ncxs, max + 1, PERL_CONTEXT);
9641 ptr_table_store(PL_ptr_table, cxs, ncxs);
9642
9643 while (ix >= 0) {
9644 PERL_CONTEXT *cx = &cxs[ix];
9645 PERL_CONTEXT *ncx = &ncxs[ix];
9646 ncx->cx_type = cx->cx_type;
9647 if (CxTYPE(cx) == CXt_SUBST) {
9648 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
9649 }
9650 else {
9651 ncx->blk_oldsp = cx->blk_oldsp;
9652 ncx->blk_oldcop = cx->blk_oldcop;
9653 ncx->blk_oldretsp = cx->blk_oldretsp;
9654 ncx->blk_oldmarksp = cx->blk_oldmarksp;
9655 ncx->blk_oldscopesp = cx->blk_oldscopesp;
9656 ncx->blk_oldpm = cx->blk_oldpm;
9657 ncx->blk_gimme = cx->blk_gimme;
9658 switch (CxTYPE(cx)) {
9659 case CXt_SUB:
9660 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
9661 ? cv_dup_inc(cx->blk_sub.cv, param)
9662 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 9663 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 9664 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 9665 : Nullav);
d2d73c3e 9666 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
9667 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
9668 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
9669 ncx->blk_sub.lval = cx->blk_sub.lval;
9670 break;
9671 case CXt_EVAL:
9672 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
9673 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 9674 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 9675 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 9676 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
1d7c1841
GS
9677 break;
9678 case CXt_LOOP:
9679 ncx->blk_loop.label = cx->blk_loop.label;
9680 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
9681 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
9682 ncx->blk_loop.next_op = cx->blk_loop.next_op;
9683 ncx->blk_loop.last_op = cx->blk_loop.last_op;
9684 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
9685 ? cx->blk_loop.iterdata
d2d73c3e 9686 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
9687 ncx->blk_loop.oldcomppad
9688 = (PAD*)ptr_table_fetch(PL_ptr_table,
9689 cx->blk_loop.oldcomppad);
d2d73c3e
AB
9690 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
9691 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
9692 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
9693 ncx->blk_loop.iterix = cx->blk_loop.iterix;
9694 ncx->blk_loop.itermax = cx->blk_loop.itermax;
9695 break;
9696 case CXt_FORMAT:
d2d73c3e
AB
9697 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
9698 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
9699 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841
GS
9700 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
9701 break;
9702 case CXt_BLOCK:
9703 case CXt_NULL:
9704 break;
9705 }
9706 }
9707 --ix;
9708 }
9709 return ncxs;
9710}
9711
645c22ef
DM
9712/* duplicate a stack info structure */
9713
1d7c1841 9714PERL_SI *
a8fc9800 9715Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
9716{
9717 PERL_SI *nsi;
9718
9719 if (!si)
9720 return (PERL_SI*)NULL;
9721
9722 /* look for it in the table first */
9723 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
9724 if (nsi)
9725 return nsi;
9726
9727 /* create anew and remember what it is */
9728 Newz(56, nsi, 1, PERL_SI);
9729 ptr_table_store(PL_ptr_table, si, nsi);
9730
d2d73c3e 9731 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
9732 nsi->si_cxix = si->si_cxix;
9733 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 9734 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 9735 nsi->si_type = si->si_type;
d2d73c3e
AB
9736 nsi->si_prev = si_dup(si->si_prev, param);
9737 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
9738 nsi->si_markoff = si->si_markoff;
9739
9740 return nsi;
9741}
9742
9743#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
9744#define TOPINT(ss,ix) ((ss)[ix].any_i32)
9745#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
9746#define TOPLONG(ss,ix) ((ss)[ix].any_long)
9747#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
9748#define TOPIV(ss,ix) ((ss)[ix].any_iv)
9749#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
9750#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
9751#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
9752#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
9753#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
9754#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
9755
9756/* XXXXX todo */
9757#define pv_dup_inc(p) SAVEPV(p)
9758#define pv_dup(p) SAVEPV(p)
9759#define svp_dup_inc(p,pp) any_dup(p,pp)
9760
645c22ef
DM
9761/* map any object to the new equivent - either something in the
9762 * ptr table, or something in the interpreter structure
9763 */
9764
1d7c1841
GS
9765void *
9766Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
9767{
9768 void *ret;
9769
9770 if (!v)
9771 return (void*)NULL;
9772
9773 /* look for it in the table first */
9774 ret = ptr_table_fetch(PL_ptr_table, v);
9775 if (ret)
9776 return ret;
9777
9778 /* see if it is part of the interpreter structure */
9779 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 9780 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 9781 else {
1d7c1841 9782 ret = v;
05ec9bb3 9783 }
1d7c1841
GS
9784
9785 return ret;
9786}
9787
645c22ef
DM
9788/* duplicate the save stack */
9789
1d7c1841 9790ANY *
a8fc9800 9791Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841
GS
9792{
9793 ANY *ss = proto_perl->Tsavestack;
9794 I32 ix = proto_perl->Tsavestack_ix;
9795 I32 max = proto_perl->Tsavestack_max;
9796 ANY *nss;
9797 SV *sv;
9798 GV *gv;
9799 AV *av;
9800 HV *hv;
9801 void* ptr;
9802 int intval;
9803 long longval;
9804 GP *gp;
9805 IV iv;
9806 I32 i;
c4e33207 9807 char *c = NULL;
1d7c1841 9808 void (*dptr) (void*);
acfe0abc 9809 void (*dxptr) (pTHX_ void*);
e977893f 9810 OP *o;
1d7c1841
GS
9811
9812 Newz(54, nss, max, ANY);
9813
9814 while (ix > 0) {
9815 i = POPINT(ss,ix);
9816 TOPINT(nss,ix) = i;
9817 switch (i) {
9818 case SAVEt_ITEM: /* normal string */
9819 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9820 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9821 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9822 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9823 break;
9824 case SAVEt_SV: /* scalar reference */
9825 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9826 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9827 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9828 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 9829 break;
f4dd75d9
GS
9830 case SAVEt_GENERIC_PVREF: /* generic char* */
9831 c = (char*)POPPTR(ss,ix);
9832 TOPPTR(nss,ix) = pv_dup(c);
9833 ptr = POPPTR(ss,ix);
9834 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9835 break;
05ec9bb3
NIS
9836 case SAVEt_SHARED_PVREF: /* char* in shared space */
9837 c = (char*)POPPTR(ss,ix);
9838 TOPPTR(nss,ix) = savesharedpv(c);
9839 ptr = POPPTR(ss,ix);
9840 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9841 break;
1d7c1841
GS
9842 case SAVEt_GENERIC_SVREF: /* generic sv */
9843 case SAVEt_SVREF: /* scalar reference */
9844 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9845 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9846 ptr = POPPTR(ss,ix);
9847 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
9848 break;
9849 case SAVEt_AV: /* array reference */
9850 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9851 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 9852 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9853 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9854 break;
9855 case SAVEt_HV: /* hash reference */
9856 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9857 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 9858 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9859 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9860 break;
9861 case SAVEt_INT: /* int reference */
9862 ptr = POPPTR(ss,ix);
9863 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9864 intval = (int)POPINT(ss,ix);
9865 TOPINT(nss,ix) = intval;
9866 break;
9867 case SAVEt_LONG: /* long reference */
9868 ptr = POPPTR(ss,ix);
9869 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9870 longval = (long)POPLONG(ss,ix);
9871 TOPLONG(nss,ix) = longval;
9872 break;
9873 case SAVEt_I32: /* I32 reference */
9874 case SAVEt_I16: /* I16 reference */
9875 case SAVEt_I8: /* I8 reference */
9876 ptr = POPPTR(ss,ix);
9877 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9878 i = POPINT(ss,ix);
9879 TOPINT(nss,ix) = i;
9880 break;
9881 case SAVEt_IV: /* IV reference */
9882 ptr = POPPTR(ss,ix);
9883 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9884 iv = POPIV(ss,ix);
9885 TOPIV(nss,ix) = iv;
9886 break;
9887 case SAVEt_SPTR: /* SV* reference */
9888 ptr = POPPTR(ss,ix);
9889 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9890 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9891 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
9892 break;
9893 case SAVEt_VPTR: /* random* reference */
9894 ptr = POPPTR(ss,ix);
9895 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9896 ptr = POPPTR(ss,ix);
9897 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9898 break;
9899 case SAVEt_PPTR: /* char* reference */
9900 ptr = POPPTR(ss,ix);
9901 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9902 c = (char*)POPPTR(ss,ix);
9903 TOPPTR(nss,ix) = pv_dup(c);
9904 break;
9905 case SAVEt_HPTR: /* HV* reference */
9906 ptr = POPPTR(ss,ix);
9907 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9908 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9909 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
9910 break;
9911 case SAVEt_APTR: /* AV* reference */
9912 ptr = POPPTR(ss,ix);
9913 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9914 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9915 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
9916 break;
9917 case SAVEt_NSTAB:
9918 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9919 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9920 break;
9921 case SAVEt_GP: /* scalar reference */
9922 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 9923 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
9924 (void)GpREFCNT_inc(gp);
9925 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 9926 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
9927 c = (char*)POPPTR(ss,ix);
9928 TOPPTR(nss,ix) = pv_dup(c);
9929 iv = POPIV(ss,ix);
9930 TOPIV(nss,ix) = iv;
9931 iv = POPIV(ss,ix);
9932 TOPIV(nss,ix) = iv;
9933 break;
9934 case SAVEt_FREESV:
26d9b02f 9935 case SAVEt_MORTALIZESV:
1d7c1841 9936 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9937 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9938 break;
9939 case SAVEt_FREEOP:
9940 ptr = POPPTR(ss,ix);
9941 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
9942 /* these are assumed to be refcounted properly */
9943 switch (((OP*)ptr)->op_type) {
9944 case OP_LEAVESUB:
9945 case OP_LEAVESUBLV:
9946 case OP_LEAVEEVAL:
9947 case OP_LEAVE:
9948 case OP_SCOPE:
9949 case OP_LEAVEWRITE:
e977893f
GS
9950 TOPPTR(nss,ix) = ptr;
9951 o = (OP*)ptr;
9952 OpREFCNT_inc(o);
1d7c1841
GS
9953 break;
9954 default:
9955 TOPPTR(nss,ix) = Nullop;
9956 break;
9957 }
9958 }
9959 else
9960 TOPPTR(nss,ix) = Nullop;
9961 break;
9962 case SAVEt_FREEPV:
9963 c = (char*)POPPTR(ss,ix);
9964 TOPPTR(nss,ix) = pv_dup_inc(c);
9965 break;
9966 case SAVEt_CLEARSV:
9967 longval = POPLONG(ss,ix);
9968 TOPLONG(nss,ix) = longval;
9969 break;
9970 case SAVEt_DELETE:
9971 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9972 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
9973 c = (char*)POPPTR(ss,ix);
9974 TOPPTR(nss,ix) = pv_dup_inc(c);
9975 i = POPINT(ss,ix);
9976 TOPINT(nss,ix) = i;
9977 break;
9978 case SAVEt_DESTRUCTOR:
9979 ptr = POPPTR(ss,ix);
9980 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
9981 dptr = POPDPTR(ss,ix);
ef75a179 9982 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
9983 break;
9984 case SAVEt_DESTRUCTOR_X:
9985 ptr = POPPTR(ss,ix);
9986 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
9987 dxptr = POPDXPTR(ss,ix);
acfe0abc 9988 TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
9989 break;
9990 case SAVEt_REGCONTEXT:
9991 case SAVEt_ALLOC:
9992 i = POPINT(ss,ix);
9993 TOPINT(nss,ix) = i;
9994 ix -= i;
9995 break;
9996 case SAVEt_STACK_POS: /* Position on Perl stack */
9997 i = POPINT(ss,ix);
9998 TOPINT(nss,ix) = i;
9999 break;
10000 case SAVEt_AELEM: /* array element */
10001 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10002 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10003 i = POPINT(ss,ix);
10004 TOPINT(nss,ix) = i;
10005 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10006 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
10007 break;
10008 case SAVEt_HELEM: /* hash element */
10009 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10010 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10011 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10012 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10013 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10014 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10015 break;
10016 case SAVEt_OP:
10017 ptr = POPPTR(ss,ix);
10018 TOPPTR(nss,ix) = ptr;
10019 break;
10020 case SAVEt_HINTS:
10021 i = POPINT(ss,ix);
10022 TOPINT(nss,ix) = i;
10023 break;
c4410b1b
GS
10024 case SAVEt_COMPPAD:
10025 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10026 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 10027 break;
c3564e5c
GS
10028 case SAVEt_PADSV:
10029 longval = (long)POPLONG(ss,ix);
10030 TOPLONG(nss,ix) = longval;
10031 ptr = POPPTR(ss,ix);
10032 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10033 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10034 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 10035 break;
a1bb4754
HS
10036 case SAVEt_BOOL:
10037 ptr = POPPTR;
10038 *(bool*)ptr = (bool)POPBOOL;
10039 break;
1d7c1841
GS
10040 default:
10041 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
10042 }
10043 }
10044
10045 return nss;
10046}
10047
645c22ef
DM
10048/*
10049=for apidoc perl_clone
10050
10051Create and return a new interpreter by cloning the current one.
10052
6a78b4db
AB
10053perl_clone takes these flags as paramters:
10054
10055CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
10056without it we only clone the data and zero the stacks,
10057with it we copy the stacks and the new perl interpreter is
10058ready to run at the exact same point as the previous one.
10059The pseudo-fork code uses COPY_STACKS while the
10060threads->new doesn't.
10061
10062CLONEf_KEEP_PTR_TABLE
10063perl_clone keeps a ptr_table with the pointer of the old
10064variable as a key and the new variable as a value,
10065this allows it to check if something has been cloned and not
10066clone it again but rather just use the value and increase the
10067refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
10068the ptr_table using the function
10069C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
10070reason to keep it around is if you want to dup some of your own
10071variable who are outside the graph perl scans, example of this
10072code is in threads.xs create
10073
10074CLONEf_CLONE_HOST
10075This is a win32 thing, it is ignored on unix, it tells perls
10076win32host code (which is c++) to clone itself, this is needed on
10077win32 if you want to run two threads at the same time,
10078if you just want to do some stuff in a separate perl interpreter
10079and then throw it away and return to the original one,
10080you don't need to do anything.
10081
645c22ef
DM
10082=cut
10083*/
10084
10085/* XXX the above needs expanding by someone who actually understands it ! */
3fc56081
NK
10086EXTERN_C PerlInterpreter *
10087perl_clone_host(PerlInterpreter* proto_perl, UV flags);
645c22ef 10088
1d7c1841
GS
10089PerlInterpreter *
10090perl_clone(PerlInterpreter *proto_perl, UV flags)
10091{
1d7c1841 10092#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
10093
10094 /* perlhost.h so we need to call into it
10095 to clone the host, CPerlHost should have a c interface, sky */
10096
10097 if (flags & CLONEf_CLONE_HOST) {
10098 return perl_clone_host(proto_perl,flags);
10099 }
10100 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
10101 proto_perl->IMem,
10102 proto_perl->IMemShared,
10103 proto_perl->IMemParse,
10104 proto_perl->IEnv,
10105 proto_perl->IStdIO,
10106 proto_perl->ILIO,
10107 proto_perl->IDir,
10108 proto_perl->ISock,
10109 proto_perl->IProc);
10110}
10111
10112PerlInterpreter *
10113perl_clone_using(PerlInterpreter *proto_perl, UV flags,
10114 struct IPerlMem* ipM, struct IPerlMem* ipMS,
10115 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
10116 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
10117 struct IPerlDir* ipD, struct IPerlSock* ipS,
10118 struct IPerlProc* ipP)
10119{
10120 /* XXX many of the string copies here can be optimized if they're
10121 * constants; they need to be allocated as common memory and just
10122 * their pointers copied. */
10123
10124 IV i;
64aa0685
GS
10125 CLONE_PARAMS clone_params;
10126 CLONE_PARAMS* param = &clone_params;
d2d73c3e 10127
1d7c1841 10128 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
ba869deb 10129 PERL_SET_THX(my_perl);
1d7c1841 10130
acfe0abc 10131# ifdef DEBUGGING
a4530404 10132 Poison(my_perl, 1, PerlInterpreter);
1d7c1841
GS
10133 PL_markstack = 0;
10134 PL_scopestack = 0;
10135 PL_savestack = 0;
10136 PL_retstack = 0;
66fe0623 10137 PL_sig_pending = 0;
25596c82 10138 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
acfe0abc 10139# else /* !DEBUGGING */
1d7c1841 10140 Zero(my_perl, 1, PerlInterpreter);
acfe0abc 10141# endif /* DEBUGGING */
1d7c1841
GS
10142
10143 /* host pointers */
10144 PL_Mem = ipM;
10145 PL_MemShared = ipMS;
10146 PL_MemParse = ipMP;
10147 PL_Env = ipE;
10148 PL_StdIO = ipStd;
10149 PL_LIO = ipLIO;
10150 PL_Dir = ipD;
10151 PL_Sock = ipS;
10152 PL_Proc = ipP;
1d7c1841
GS
10153#else /* !PERL_IMPLICIT_SYS */
10154 IV i;
64aa0685
GS
10155 CLONE_PARAMS clone_params;
10156 CLONE_PARAMS* param = &clone_params;
1d7c1841 10157 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 10158 PERL_SET_THX(my_perl);
1d7c1841 10159
d2d73c3e
AB
10160
10161
1d7c1841 10162# ifdef DEBUGGING
a4530404 10163 Poison(my_perl, 1, PerlInterpreter);
1d7c1841
GS
10164 PL_markstack = 0;
10165 PL_scopestack = 0;
10166 PL_savestack = 0;
10167 PL_retstack = 0;
66fe0623 10168 PL_sig_pending = 0;
25596c82 10169 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
1d7c1841
GS
10170# else /* !DEBUGGING */
10171 Zero(my_perl, 1, PerlInterpreter);
10172# endif /* DEBUGGING */
10173#endif /* PERL_IMPLICIT_SYS */
83236556 10174 param->flags = flags;
59b40662 10175 param->proto_perl = proto_perl;
1d7c1841
GS
10176
10177 /* arena roots */
10178 PL_xiv_arenaroot = NULL;
10179 PL_xiv_root = NULL;
612f20c3 10180 PL_xnv_arenaroot = NULL;
1d7c1841 10181 PL_xnv_root = NULL;
612f20c3 10182 PL_xrv_arenaroot = NULL;
1d7c1841 10183 PL_xrv_root = NULL;
612f20c3 10184 PL_xpv_arenaroot = NULL;
1d7c1841 10185 PL_xpv_root = NULL;
612f20c3 10186 PL_xpviv_arenaroot = NULL;
1d7c1841 10187 PL_xpviv_root = NULL;
612f20c3 10188 PL_xpvnv_arenaroot = NULL;
1d7c1841 10189 PL_xpvnv_root = NULL;
612f20c3 10190 PL_xpvcv_arenaroot = NULL;
1d7c1841 10191 PL_xpvcv_root = NULL;
612f20c3 10192 PL_xpvav_arenaroot = NULL;
1d7c1841 10193 PL_xpvav_root = NULL;
612f20c3 10194 PL_xpvhv_arenaroot = NULL;
1d7c1841 10195 PL_xpvhv_root = NULL;
612f20c3 10196 PL_xpvmg_arenaroot = NULL;
1d7c1841 10197 PL_xpvmg_root = NULL;
612f20c3 10198 PL_xpvlv_arenaroot = NULL;
1d7c1841 10199 PL_xpvlv_root = NULL;
612f20c3 10200 PL_xpvbm_arenaroot = NULL;
1d7c1841 10201 PL_xpvbm_root = NULL;
612f20c3 10202 PL_he_arenaroot = NULL;
1d7c1841
GS
10203 PL_he_root = NULL;
10204 PL_nice_chunk = NULL;
10205 PL_nice_chunk_size = 0;
10206 PL_sv_count = 0;
10207 PL_sv_objcount = 0;
10208 PL_sv_root = Nullsv;
10209 PL_sv_arenaroot = Nullsv;
10210
10211 PL_debug = proto_perl->Idebug;
10212
e5dd39fc 10213#ifdef USE_REENTRANT_API
59bd0823 10214 Perl_reentrant_init(aTHX);
e5dd39fc
AB
10215#endif
10216
1d7c1841
GS
10217 /* create SV map for pointer relocation */
10218 PL_ptr_table = ptr_table_new();
10219
10220 /* initialize these special pointers as early as possible */
10221 SvANY(&PL_sv_undef) = NULL;
10222 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
10223 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
10224 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
10225
1d7c1841 10226 SvANY(&PL_sv_no) = new_XPVNV();
1d7c1841
GS
10227 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
10228 SvFLAGS(&PL_sv_no) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
10229 SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
10230 SvCUR(&PL_sv_no) = 0;
10231 SvLEN(&PL_sv_no) = 1;
10232 SvNVX(&PL_sv_no) = 0;
10233 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
10234
1d7c1841 10235 SvANY(&PL_sv_yes) = new_XPVNV();
1d7c1841
GS
10236 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
10237 SvFLAGS(&PL_sv_yes) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
10238 SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
10239 SvCUR(&PL_sv_yes) = 1;
10240 SvLEN(&PL_sv_yes) = 2;
10241 SvNVX(&PL_sv_yes) = 1;
10242 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
10243
05ec9bb3 10244 /* create (a non-shared!) shared string table */
1d7c1841
GS
10245 PL_strtab = newHV();
10246 HvSHAREKEYS_off(PL_strtab);
10247 hv_ksplit(PL_strtab, 512);
10248 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
10249
05ec9bb3
NIS
10250 PL_compiling = proto_perl->Icompiling;
10251
10252 /* These two PVs will be free'd special way so must set them same way op.c does */
10253 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
10254 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
10255
10256 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
10257 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
10258
1d7c1841
GS
10259 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
10260 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 10261 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 10262 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 10263 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
10264 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
10265
10266 /* pseudo environmental stuff */
10267 PL_origargc = proto_perl->Iorigargc;
e2975953 10268 PL_origargv = proto_perl->Iorigargv;
d2d73c3e 10269
d2d73c3e
AB
10270 param->stashes = newAV(); /* Setup array of objects to call clone on */
10271
a1ea730d 10272#ifdef PERLIO_LAYERS
3a1ee7e8
NIS
10273 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
10274 PerlIO_clone(aTHX_ proto_perl, param);
a1ea730d 10275#endif
d2d73c3e
AB
10276
10277 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
10278 PL_incgv = gv_dup(proto_perl->Iincgv, param);
10279 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 10280 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
10281 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
10282 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
10283
10284 /* switches */
10285 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 10286 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
10287 PL_localpatches = proto_perl->Ilocalpatches;
10288 PL_splitstr = proto_perl->Isplitstr;
10289 PL_preprocess = proto_perl->Ipreprocess;
10290 PL_minus_n = proto_perl->Iminus_n;
10291 PL_minus_p = proto_perl->Iminus_p;
10292 PL_minus_l = proto_perl->Iminus_l;
10293 PL_minus_a = proto_perl->Iminus_a;
10294 PL_minus_F = proto_perl->Iminus_F;
10295 PL_doswitches = proto_perl->Idoswitches;
10296 PL_dowarn = proto_perl->Idowarn;
10297 PL_doextract = proto_perl->Idoextract;
10298 PL_sawampersand = proto_perl->Isawampersand;
10299 PL_unsafe = proto_perl->Iunsafe;
10300 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 10301 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
10302 PL_perldb = proto_perl->Iperldb;
10303 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
1cbb0781 10304 PL_exit_flags = proto_perl->Iexit_flags;
1d7c1841
GS
10305
10306 /* magical thingies */
10307 /* XXX time(&PL_basetime) when asked for? */
10308 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 10309 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
10310
10311 PL_maxsysfd = proto_perl->Imaxsysfd;
10312 PL_multiline = proto_perl->Imultiline;
10313 PL_statusvalue = proto_perl->Istatusvalue;
10314#ifdef VMS
10315 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
10316#endif
0a378802 10317 PL_encoding = sv_dup(proto_perl->Iencoding, param);
1d7c1841 10318
4a4c6fe3 10319 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
1f483ca1
JH
10320 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
10321 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
4a4c6fe3 10322
d2f185dc
AMS
10323 /* Clone the regex array */
10324 PL_regex_padav = newAV();
10325 {
10326 I32 len = av_len((AV*)proto_perl->Iregex_padav);
10327 SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
0f95fc41
AB
10328 av_push(PL_regex_padav,
10329 sv_dup_inc(regexen[0],param));
10330 for(i = 1; i <= len; i++) {
10331 if(SvREPADTMP(regexen[i])) {
10332 av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
8cf8f3d1 10333 } else {
0f95fc41
AB
10334 av_push(PL_regex_padav,
10335 SvREFCNT_inc(
8cf8f3d1 10336 newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
cbfa9890 10337 SvIVX(regexen[i])), param)))
0f95fc41
AB
10338 ));
10339 }
d2f185dc
AMS
10340 }
10341 }
10342 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 10343
1d7c1841 10344 /* shortcuts to various I/O objects */
d2d73c3e
AB
10345 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
10346 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
10347 PL_defgv = gv_dup(proto_perl->Idefgv, param);
10348 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
10349 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
10350 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
10351
10352 /* shortcuts to regexp stuff */
d2d73c3e 10353 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
10354
10355 /* shortcuts to misc objects */
d2d73c3e 10356 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
10357
10358 /* shortcuts to debugging objects */
d2d73c3e
AB
10359 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
10360 PL_DBline = gv_dup(proto_perl->IDBline, param);
10361 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
10362 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
10363 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
10364 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
10365 PL_lineary = av_dup(proto_perl->Ilineary, param);
10366 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
10367
10368 /* symbol tables */
d2d73c3e
AB
10369 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
10370 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
d2d73c3e
AB
10371 PL_debstash = hv_dup(proto_perl->Idebstash, param);
10372 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
10373 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
10374
10375 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
ee1c5a4e 10376 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
ece599bd 10377 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
d2d73c3e
AB
10378 PL_endav = av_dup_inc(proto_perl->Iendav, param);
10379 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
10380 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
10381
10382 PL_sub_generation = proto_perl->Isub_generation;
10383
10384 /* funky return mechanisms */
10385 PL_forkprocess = proto_perl->Iforkprocess;
10386
10387 /* subprocess state */
d2d73c3e 10388 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
10389
10390 /* internal state */
10391 PL_tainting = proto_perl->Itainting;
10392 PL_maxo = proto_perl->Imaxo;
10393 if (proto_perl->Iop_mask)
10394 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
10395 else
10396 PL_op_mask = Nullch;
10397
10398 /* current interpreter roots */
d2d73c3e 10399 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
10400 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
10401 PL_main_start = proto_perl->Imain_start;
e977893f 10402 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
10403 PL_eval_start = proto_perl->Ieval_start;
10404
10405 /* runtime control stuff */
10406 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
10407 PL_copline = proto_perl->Icopline;
10408
10409 PL_filemode = proto_perl->Ifilemode;
10410 PL_lastfd = proto_perl->Ilastfd;
10411 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
10412 PL_Argv = NULL;
10413 PL_Cmd = Nullch;
10414 PL_gensym = proto_perl->Igensym;
10415 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 10416 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
10417 PL_laststatval = proto_perl->Ilaststatval;
10418 PL_laststype = proto_perl->Ilaststype;
10419 PL_mess_sv = Nullsv;
10420
d2d73c3e 10421 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
10422 PL_ofmt = SAVEPV(proto_perl->Iofmt);
10423
10424 /* interpreter atexit processing */
10425 PL_exitlistlen = proto_perl->Iexitlistlen;
10426 if (PL_exitlistlen) {
10427 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
10428 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
10429 }
10430 else
10431 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 10432 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
19e8ce8e
AB
10433 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
10434 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1d7c1841
GS
10435
10436 PL_profiledata = NULL;
a8fc9800 10437 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
1d7c1841 10438 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 10439 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 10440
d2d73c3e 10441 PL_compcv = cv_dup(proto_perl->Icompcv, param);
dd2155a4
DM
10442
10443 PAD_CLONE_VARS(proto_perl, param);
1d7c1841
GS
10444
10445#ifdef HAVE_INTERP_INTERN
10446 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
10447#endif
10448
10449 /* more statics moved here */
10450 PL_generation = proto_perl->Igeneration;
d2d73c3e 10451 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
10452
10453 PL_in_clean_objs = proto_perl->Iin_clean_objs;
10454 PL_in_clean_all = proto_perl->Iin_clean_all;
10455
10456 PL_uid = proto_perl->Iuid;
10457 PL_euid = proto_perl->Ieuid;
10458 PL_gid = proto_perl->Igid;
10459 PL_egid = proto_perl->Iegid;
10460 PL_nomemok = proto_perl->Inomemok;
10461 PL_an = proto_perl->Ian;
1d7c1841
GS
10462 PL_op_seqmax = proto_perl->Iop_seqmax;
10463 PL_evalseq = proto_perl->Ievalseq;
10464 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
10465 PL_origalen = proto_perl->Iorigalen;
10466 PL_pidstatus = newHV(); /* XXX flag for cloning? */
10467 PL_osname = SAVEPV(proto_perl->Iosname);
0bb09c15 10468 PL_sh_path = proto_perl->Ish_path; /* XXX never deallocated */
1d7c1841
GS
10469 PL_sighandlerp = proto_perl->Isighandlerp;
10470
10471
10472 PL_runops = proto_perl->Irunops;
10473
10474 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
10475
10476#ifdef CSH
10477 PL_cshlen = proto_perl->Icshlen;
74f1b2b8 10478 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
1d7c1841
GS
10479#endif
10480
10481 PL_lex_state = proto_perl->Ilex_state;
10482 PL_lex_defer = proto_perl->Ilex_defer;
10483 PL_lex_expect = proto_perl->Ilex_expect;
10484 PL_lex_formbrack = proto_perl->Ilex_formbrack;
10485 PL_lex_dojoin = proto_perl->Ilex_dojoin;
10486 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
10487 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
10488 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
10489 PL_lex_op = proto_perl->Ilex_op;
10490 PL_lex_inpat = proto_perl->Ilex_inpat;
10491 PL_lex_inwhat = proto_perl->Ilex_inwhat;
10492 PL_lex_brackets = proto_perl->Ilex_brackets;
10493 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
10494 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
10495 PL_lex_casemods = proto_perl->Ilex_casemods;
10496 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
10497 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
10498
10499 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
10500 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
10501 PL_nexttoke = proto_perl->Inexttoke;
10502
1d773130
TB
10503 /* XXX This is probably masking the deeper issue of why
10504 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
10505 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
10506 * (A little debugging with a watchpoint on it may help.)
10507 */
389edf32
TB
10508 if (SvANY(proto_perl->Ilinestr)) {
10509 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
10510 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
10511 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10512 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
10513 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10514 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
10515 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10516 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
10517 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10518 }
10519 else {
10520 PL_linestr = NEWSV(65,79);
10521 sv_upgrade(PL_linestr,SVt_PVIV);
10522 sv_setpvn(PL_linestr,"",0);
10523 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
10524 }
1d7c1841 10525 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1d7c1841
GS
10526 PL_pending_ident = proto_perl->Ipending_ident;
10527 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
10528
10529 PL_expect = proto_perl->Iexpect;
10530
10531 PL_multi_start = proto_perl->Imulti_start;
10532 PL_multi_end = proto_perl->Imulti_end;
10533 PL_multi_open = proto_perl->Imulti_open;
10534 PL_multi_close = proto_perl->Imulti_close;
10535
10536 PL_error_count = proto_perl->Ierror_count;
10537 PL_subline = proto_perl->Isubline;
d2d73c3e 10538 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841 10539
1d773130 10540 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
389edf32
TB
10541 if (SvANY(proto_perl->Ilinestr)) {
10542 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
10543 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10544 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
10545 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10546 PL_last_lop_op = proto_perl->Ilast_lop_op;
10547 }
10548 else {
10549 PL_last_uni = SvPVX(PL_linestr);
10550 PL_last_lop = SvPVX(PL_linestr);
10551 PL_last_lop_op = 0;
10552 }
1d7c1841 10553 PL_in_my = proto_perl->Iin_my;
d2d73c3e 10554 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
10555#ifdef FCRYPT
10556 PL_cryptseen = proto_perl->Icryptseen;
10557#endif
10558
10559 PL_hints = proto_perl->Ihints;
10560
10561 PL_amagic_generation = proto_perl->Iamagic_generation;
10562
10563#ifdef USE_LOCALE_COLLATE
10564 PL_collation_ix = proto_perl->Icollation_ix;
10565 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
10566 PL_collation_standard = proto_perl->Icollation_standard;
10567 PL_collxfrm_base = proto_perl->Icollxfrm_base;
10568 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
10569#endif /* USE_LOCALE_COLLATE */
10570
10571#ifdef USE_LOCALE_NUMERIC
10572 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
10573 PL_numeric_standard = proto_perl->Inumeric_standard;
10574 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 10575 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
10576#endif /* !USE_LOCALE_NUMERIC */
10577
10578 /* utf8 character classes */
d2d73c3e
AB
10579 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
10580 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
10581 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
10582 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
10583 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
10584 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
10585 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
10586 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
10587 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
10588 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
10589 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
10590 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
10591 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
10592 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
10593 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
10594 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
10595 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
b4e400f9 10596 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
82686b01
JH
10597 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
10598 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841
GS
10599
10600 /* swatch cache */
10601 PL_last_swash_hv = Nullhv; /* reinits on demand */
10602 PL_last_swash_klen = 0;
10603 PL_last_swash_key[0]= '\0';
10604 PL_last_swash_tmps = (U8*)NULL;
10605 PL_last_swash_slen = 0;
10606
10607 /* perly.c globals */
10608 PL_yydebug = proto_perl->Iyydebug;
10609 PL_yynerrs = proto_perl->Iyynerrs;
10610 PL_yyerrflag = proto_perl->Iyyerrflag;
10611 PL_yychar = proto_perl->Iyychar;
10612 PL_yyval = proto_perl->Iyyval;
10613 PL_yylval = proto_perl->Iyylval;
10614
10615 PL_glob_index = proto_perl->Iglob_index;
10616 PL_srand_called = proto_perl->Isrand_called;
10617 PL_uudmap['M'] = 0; /* reinits on demand */
10618 PL_bitcount = Nullch; /* reinits on demand */
10619
66fe0623
NIS
10620 if (proto_perl->Ipsig_pend) {
10621 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 10622 }
66fe0623
NIS
10623 else {
10624 PL_psig_pend = (int*)NULL;
10625 }
10626
1d7c1841 10627 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
10628 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
10629 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 10630 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
10631 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
10632 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
10633 }
10634 }
10635 else {
10636 PL_psig_ptr = (SV**)NULL;
10637 PL_psig_name = (SV**)NULL;
10638 }
10639
10640 /* thrdvar.h stuff */
10641
a0739874 10642 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
10643 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
10644 PL_tmps_ix = proto_perl->Ttmps_ix;
10645 PL_tmps_max = proto_perl->Ttmps_max;
10646 PL_tmps_floor = proto_perl->Ttmps_floor;
10647 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
10648 i = 0;
10649 while (i <= PL_tmps_ix) {
d2d73c3e 10650 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
10651 ++i;
10652 }
10653
10654 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
10655 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
10656 Newz(54, PL_markstack, i, I32);
10657 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
10658 - proto_perl->Tmarkstack);
10659 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
10660 - proto_perl->Tmarkstack);
10661 Copy(proto_perl->Tmarkstack, PL_markstack,
10662 PL_markstack_ptr - PL_markstack + 1, I32);
10663
10664 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
10665 * NOTE: unlike the others! */
10666 PL_scopestack_ix = proto_perl->Tscopestack_ix;
10667 PL_scopestack_max = proto_perl->Tscopestack_max;
10668 Newz(54, PL_scopestack, PL_scopestack_max, I32);
10669 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
10670
10671 /* next push_return() sets PL_retstack[PL_retstack_ix]
10672 * NOTE: unlike the others! */
10673 PL_retstack_ix = proto_perl->Tretstack_ix;
10674 PL_retstack_max = proto_perl->Tretstack_max;
10675 Newz(54, PL_retstack, PL_retstack_max, OP*);
ce0a1ae0 10676 Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, OP*);
1d7c1841
GS
10677
10678 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 10679 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
10680
10681 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
10682 PL_curstack = av_dup(proto_perl->Tcurstack, param);
10683 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
10684
10685 /* next PUSHs() etc. set *(PL_stack_sp+1) */
10686 PL_stack_base = AvARRAY(PL_curstack);
10687 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
10688 - proto_perl->Tstack_base);
10689 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
10690
10691 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
10692 * NOTE: unlike the others! */
10693 PL_savestack_ix = proto_perl->Tsavestack_ix;
10694 PL_savestack_max = proto_perl->Tsavestack_max;
10695 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 10696 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
10697 }
10698 else {
10699 init_stacks();
985e7056 10700 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
10701 }
10702
10703 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
10704 PL_top_env = &PL_start_env;
10705
10706 PL_op = proto_perl->Top;
10707
10708 PL_Sv = Nullsv;
10709 PL_Xpv = (XPV*)NULL;
10710 PL_na = proto_perl->Tna;
10711
10712 PL_statbuf = proto_perl->Tstatbuf;
10713 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
10714 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
10715 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
10716#ifdef HAS_TIMES
10717 PL_timesbuf = proto_perl->Ttimesbuf;
10718#endif
10719
10720 PL_tainted = proto_perl->Ttainted;
10721 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
10722 PL_rs = sv_dup_inc(proto_perl->Trs, param);
10723 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
10724 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
10725 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 10726 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
10727 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
10728 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
10729 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
10730
10731 PL_restartop = proto_perl->Trestartop;
10732 PL_in_eval = proto_perl->Tin_eval;
10733 PL_delaymagic = proto_perl->Tdelaymagic;
10734 PL_dirty = proto_perl->Tdirty;
10735 PL_localizing = proto_perl->Tlocalizing;
10736
14dd3ad8 10737#ifdef PERL_FLEXIBLE_EXCEPTIONS
1d7c1841 10738 PL_protect = proto_perl->Tprotect;
14dd3ad8 10739#endif
d2d73c3e 10740 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
1d7c1841
GS
10741 PL_av_fetch_sv = Nullsv;
10742 PL_hv_fetch_sv = Nullsv;
10743 Zero(&PL_hv_fetch_ent_mh, 1, HE); /* XXX */
10744 PL_modcount = proto_perl->Tmodcount;
10745 PL_lastgotoprobe = Nullop;
10746 PL_dumpindent = proto_perl->Tdumpindent;
10747
10748 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
10749 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
10750 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
10751 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
10752 PL_sortcxix = proto_perl->Tsortcxix;
10753 PL_efloatbuf = Nullch; /* reinits on demand */
10754 PL_efloatsize = 0; /* reinits on demand */
10755
10756 /* regex stuff */
10757
10758 PL_screamfirst = NULL;
10759 PL_screamnext = NULL;
10760 PL_maxscream = -1; /* reinits on demand */
10761 PL_lastscream = Nullsv;
10762
10763 PL_watchaddr = NULL;
10764 PL_watchok = Nullch;
10765
10766 PL_regdummy = proto_perl->Tregdummy;
10767 PL_regcomp_parse = Nullch;
10768 PL_regxend = Nullch;
10769 PL_regcode = (regnode*)NULL;
10770 PL_regnaughty = 0;
10771 PL_regsawback = 0;
10772 PL_regprecomp = Nullch;
10773 PL_regnpar = 0;
10774 PL_regsize = 0;
10775 PL_regflags = 0;
10776 PL_regseen = 0;
10777 PL_seen_zerolen = 0;
10778 PL_seen_evals = 0;
10779 PL_regcomp_rx = (regexp*)NULL;
10780 PL_extralen = 0;
10781 PL_colorset = 0; /* reinits PL_colors[] */
10782 /*PL_colors[6] = {0,0,0,0,0,0};*/
10783 PL_reg_whilem_seen = 0;
10784 PL_reginput = Nullch;
10785 PL_regbol = Nullch;
10786 PL_regeol = Nullch;
10787 PL_regstartp = (I32*)NULL;
10788 PL_regendp = (I32*)NULL;
10789 PL_reglastparen = (U32*)NULL;
10790 PL_regtill = Nullch;
1d7c1841
GS
10791 PL_reg_start_tmp = (char**)NULL;
10792 PL_reg_start_tmpl = 0;
10793 PL_regdata = (struct reg_data*)NULL;
10794 PL_bostr = Nullch;
10795 PL_reg_flags = 0;
10796 PL_reg_eval_set = 0;
10797 PL_regnarrate = 0;
10798 PL_regprogram = (regnode*)NULL;
10799 PL_regindent = 0;
10800 PL_regcc = (CURCUR*)NULL;
10801 PL_reg_call_cc = (struct re_cc_state*)NULL;
10802 PL_reg_re = (regexp*)NULL;
10803 PL_reg_ganch = Nullch;
10804 PL_reg_sv = Nullsv;
53c4c00c 10805 PL_reg_match_utf8 = FALSE;
1d7c1841
GS
10806 PL_reg_magic = (MAGIC*)NULL;
10807 PL_reg_oldpos = 0;
10808 PL_reg_oldcurpm = (PMOP*)NULL;
10809 PL_reg_curpm = (PMOP*)NULL;
10810 PL_reg_oldsaved = Nullch;
10811 PL_reg_oldsavedlen = 0;
10812 PL_reg_maxiter = 0;
10813 PL_reg_leftiter = 0;
10814 PL_reg_poscache = Nullch;
10815 PL_reg_poscache_size= 0;
10816
10817 /* RE engine - function pointers */
10818 PL_regcompp = proto_perl->Tregcompp;
10819 PL_regexecp = proto_perl->Tregexecp;
10820 PL_regint_start = proto_perl->Tregint_start;
10821 PL_regint_string = proto_perl->Tregint_string;
10822 PL_regfree = proto_perl->Tregfree;
10823
10824 PL_reginterp_cnt = 0;
10825 PL_reg_starttry = 0;
10826
a2efc822
SC
10827 /* Pluggable optimizer */
10828 PL_peepp = proto_perl->Tpeepp;
10829
a0739874
DM
10830 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
10831 ptr_table_free(PL_ptr_table);
10832 PL_ptr_table = NULL;
10833 }
8cf8f3d1 10834
f284b03f
AMS
10835 /* Call the ->CLONE method, if it exists, for each of the stashes
10836 identified by sv_dup() above.
10837 */
d2d73c3e
AB
10838 while(av_len(param->stashes) != -1) {
10839 HV* stash = (HV*) av_shift(param->stashes);
f284b03f
AMS
10840 GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
10841 if (cloner && GvCV(cloner)) {
10842 dSP;
10843 ENTER;
10844 SAVETMPS;
10845 PUSHMARK(SP);
dc507217 10846 XPUSHs(sv_2mortal(newSVpv(HvNAME(stash), 0)));
f284b03f
AMS
10847 PUTBACK;
10848 call_sv((SV*)GvCV(cloner), G_DISCARD);
10849 FREETMPS;
10850 LEAVE;
10851 }
4a09accc 10852 }
a0739874 10853
dc507217 10854 SvREFCNT_dec(param->stashes);
dc507217 10855
1d7c1841 10856 return my_perl;
1d7c1841
GS
10857}
10858
1d7c1841 10859#endif /* USE_ITHREADS */
a0ae6670 10860
9f4817db 10861/*
ccfc67b7
JH
10862=head1 Unicode Support
10863
9f4817db
JH
10864=for apidoc sv_recode_to_utf8
10865
5d170f3a
JH
10866The encoding is assumed to be an Encode object, on entry the PV
10867of the sv is assumed to be octets in that encoding, and the sv
10868will be converted into Unicode (and UTF-8).
9f4817db 10869
5d170f3a
JH
10870If the sv already is UTF-8 (or if it is not POK), or if the encoding
10871is not a reference, nothing is done to the sv. If the encoding is not
1768d7eb
JH
10872an C<Encode::XS> Encoding object, bad things will happen.
10873(See F<lib/encoding.pm> and L<Encode>).
9f4817db 10874
5d170f3a 10875The PV of the sv is returned.
9f4817db 10876
5d170f3a
JH
10877=cut */
10878
10879char *
10880Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
10881{
f9893866 10882 if (SvPOK(sv) && !DO_UTF8(sv) && SvROK(encoding)) {
d0063567
DK
10883 int vary = FALSE;
10884 SV *uni;
10885 STRLEN len;
10886 char *s;
10887 dSP;
10888 ENTER;
10889 SAVETMPS;
10890 PUSHMARK(sp);
10891 EXTEND(SP, 3);
10892 XPUSHs(encoding);
10893 XPUSHs(sv);
f9893866
NIS
10894/*
10895 NI-S 2002/07/09
10896 Passing sv_yes is wrong - it needs to be or'ed set of constants
10897 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
10898 remove converted chars from source.
10899
10900 Both will default the value - let them.
10901
d0063567 10902 XPUSHs(&PL_sv_yes);
f9893866 10903*/
d0063567
DK
10904 PUTBACK;
10905 call_method("decode", G_SCALAR);
10906 SPAGAIN;
10907 uni = POPs;
10908 PUTBACK;
10909 s = SvPV(uni, len);
10910 {
10911 U8 *t = (U8 *)s, *e = (U8 *)s + len;
10912 while (t < e) {
10913 if ((vary = !UTF8_IS_INVARIANT(*t++)))
10914 break;
10915 }
10916 }
10917 if (s != SvPVX(sv)) {
10918 SvGROW(sv, len + 1);
10919 Move(s, SvPVX(sv), len, char);
10920 SvCUR_set(sv, len);
10921 SvPVX(sv)[len] = 0;
10922 }
10923 FREETMPS;
10924 LEAVE;
10925 if (vary)
10926 SvUTF8_on(sv);
10927 SvUTF8_on(sv);
f9893866
NIS
10928 }
10929 return SvPVX(sv);
9f4817db
JH
10930}
10931
68795e93 10932
f9893866 10933