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