This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: Class::Struct, simple patch, tests
[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)) &&
b4b9a328 2029 (!SvROK(tmpstr) || (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)) &&
b4b9a328 2326 (!SvROK(tmpstr) || (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)) &&
b4b9a328 2614 (!SvROK(tmpstr) || (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)) &&
b4b9a328 2934 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
446eaa42
YST
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 */
ab01544f 3009 break;
ff385a1b
JF
3010 }
3011 }
3012 }
3013
8782bef2
GB
3014 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
3015 Copy("(?", mg->mg_ptr, 2, char);
3016 Copy(reflags, mg->mg_ptr+2, left, char);
3017 Copy(":", mg->mg_ptr+left+2, 1, char);
3018 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
ff385a1b
JF
3019 if (need_newline)
3020 mg->mg_ptr[mg->mg_len - 2] = '\n';
1bd3ad17
IZ
3021 mg->mg_ptr[mg->mg_len - 1] = ')';
3022 mg->mg_ptr[mg->mg_len] = 0;
3023 }
3280af22 3024 PL_reginterp_cnt += re->program[0].next_off;
cb50f42d
YST
3025
3026 if (re->reganch & ROPT_UTF8)
3027 SvUTF8_on(origsv);
3028 else
3029 SvUTF8_off(origsv);
1bd3ad17
IZ
3030 *lp = mg->mg_len;
3031 return mg->mg_ptr;
f9277f47
IZ
3032 }
3033 /* Fall through */
ed6116ce
LW
3034 case SVt_NULL:
3035 case SVt_IV:
3036 case SVt_NV:
3037 case SVt_RV:
3038 case SVt_PV:
3039 case SVt_PVIV:
3040 case SVt_PVNV:
81689caa
HS
3041 case SVt_PVBM: if (SvROK(sv))
3042 s = "REF";
3043 else
3044 s = "SCALAR"; break;
ed6116ce
LW
3045 case SVt_PVLV: s = "LVALUE"; break;
3046 case SVt_PVAV: s = "ARRAY"; break;
3047 case SVt_PVHV: s = "HASH"; break;
3048 case SVt_PVCV: s = "CODE"; break;
3049 case SVt_PVGV: s = "GLOB"; break;
1d2dff63 3050 case SVt_PVFM: s = "FORMAT"; break;
36477c24 3051 case SVt_PVIO: s = "IO"; break;
ed6116ce
LW
3052 default: s = "UNKNOWN"; break;
3053 }
46fc3d4c 3054 tsv = NEWSV(0,0);
de11ba31
AMS
3055 if (SvOBJECT(sv))
3056 Perl_sv_setpvf(aTHX_ tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
ed6116ce 3057 else
46fc3d4c 3058 sv_setpv(tsv, s);
57def98f 3059 Perl_sv_catpvf(aTHX_ tsv, "(0x%"UVxf")", PTR2UV(sv));
a0d0e21e 3060 goto tokensaveref;
463ee0b2 3061 }
ed6116ce
LW
3062 *lp = strlen(s);
3063 return s;
79072805 3064 }
0336b60e 3065 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 3066 if (ckWARN(WARN_UNINITIALIZED))
1d7c1841 3067 report_uninit();
ed6116ce
LW
3068 *lp = 0;
3069 return "";
79072805 3070 }
79072805 3071 }
28e5dec8
JH
3072 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
3073 /* I'm assuming that if both IV and NV are equally valid then
3074 converting the IV is going to be more efficient */
3075 U32 isIOK = SvIOK(sv);
3076 U32 isUIOK = SvIsUV(sv);
3077 char buf[TYPE_CHARS(UV)];
3078 char *ebuf, *ptr;
3079
3080 if (SvTYPE(sv) < SVt_PVIV)
3081 sv_upgrade(sv, SVt_PVIV);
3082 if (isUIOK)
3083 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
3084 else
3085 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
eb160463 3086 SvGROW(sv, (STRLEN)(ebuf - ptr + 1)); /* inlined from sv_setpvn */
28e5dec8
JH
3087 Move(ptr,SvPVX(sv),ebuf - ptr,char);
3088 SvCUR_set(sv, ebuf - ptr);
3089 s = SvEND(sv);
3090 *s = '\0';
3091 if (isIOK)
3092 SvIOK_on(sv);
3093 else
3094 SvIOKp_on(sv);
3095 if (isUIOK)
3096 SvIsUV_on(sv);
3097 }
3098 else if (SvNOKp(sv)) {
79072805
LW
3099 if (SvTYPE(sv) < SVt_PVNV)
3100 sv_upgrade(sv, SVt_PVNV);
1c846c1f 3101 /* The +20 is pure guesswork. Configure test needed. --jhi */
59155cc0 3102 SvGROW(sv, NV_DIG + 20);
463ee0b2 3103 s = SvPVX(sv);
79072805 3104 olderrno = errno; /* some Xenix systems wipe out errno here */
79072805 3105#ifdef apollo
463ee0b2 3106 if (SvNVX(sv) == 0.0)
79072805
LW
3107 (void)strcpy(s,"0");
3108 else
3109#endif /*apollo*/
bbce6d69 3110 {
2d4389e4 3111 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 3112 }
79072805 3113 errno = olderrno;
a0d0e21e
LW
3114#ifdef FIXNEGATIVEZERO
3115 if (*s == '-' && s[1] == '0' && !s[2])
3116 strcpy(s,"0");
3117#endif
79072805
LW
3118 while (*s) s++;
3119#ifdef hcx
3120 if (s[-1] == '.')
46fc3d4c 3121 *--s = '\0';
79072805
LW
3122#endif
3123 }
79072805 3124 else {
0336b60e
IZ
3125 if (ckWARN(WARN_UNINITIALIZED)
3126 && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1d7c1841 3127 report_uninit();
a0d0e21e 3128 *lp = 0;
25da4f38
IZ
3129 if (SvTYPE(sv) < SVt_PV)
3130 /* Typically the caller expects that sv_any is not NULL now. */
3131 sv_upgrade(sv, SVt_PV);
a0d0e21e 3132 return "";
79072805 3133 }
463ee0b2
LW
3134 *lp = s - SvPVX(sv);
3135 SvCUR_set(sv, *lp);
79072805 3136 SvPOK_on(sv);
1d7c1841
GS
3137 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3138 PTR2UV(sv),SvPVX(sv)));
463ee0b2 3139 return SvPVX(sv);
a0d0e21e
LW
3140
3141 tokensave:
3142 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
3143 /* Sneaky stuff here */
3144
3145 tokensaveref:
46fc3d4c 3146 if (!tsv)
96827780 3147 tsv = newSVpv(tmpbuf, 0);
46fc3d4c 3148 sv_2mortal(tsv);
3149 *lp = SvCUR(tsv);
3150 return SvPVX(tsv);
a0d0e21e
LW
3151 }
3152 else {
3153 STRLEN len;
46fc3d4c 3154 char *t;
3155
3156 if (tsv) {
3157 sv_2mortal(tsv);
3158 t = SvPVX(tsv);
3159 len = SvCUR(tsv);
3160 }
3161 else {
96827780
MB
3162 t = tmpbuf;
3163 len = strlen(tmpbuf);
46fc3d4c 3164 }
a0d0e21e 3165#ifdef FIXNEGATIVEZERO
46fc3d4c 3166 if (len == 2 && t[0] == '-' && t[1] == '0') {
3167 t = "0";
3168 len = 1;
3169 }
a0d0e21e
LW
3170#endif
3171 (void)SvUPGRADE(sv, SVt_PV);
46fc3d4c 3172 *lp = len;
a0d0e21e
LW
3173 s = SvGROW(sv, len + 1);
3174 SvCUR_set(sv, len);
46fc3d4c 3175 (void)strcpy(s, t);
6bf554b4 3176 SvPOKp_on(sv);
a0d0e21e
LW
3177 return s;
3178 }
463ee0b2
LW
3179}
3180
645c22ef 3181/*
6050d10e
JP
3182=for apidoc sv_copypv
3183
3184Copies a stringified representation of the source SV into the
3185destination SV. Automatically performs any necessary mg_get and
54f0641b 3186coercion of numeric values into strings. Guaranteed to preserve
6050d10e 3187UTF-8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
3188sv_2pv[_flags] but operates directly on an SV instead of just the
3189string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
3190would lose the UTF-8'ness of the PV.
3191
3192=cut
3193*/
3194
3195void
3196Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
3197{
446eaa42
YST
3198 STRLEN len;
3199 char *s;
3200 s = SvPV(ssv,len);
cb50f42d 3201 sv_setpvn(dsv,s,len);
446eaa42 3202 if (SvUTF8(ssv))
cb50f42d 3203 SvUTF8_on(dsv);
446eaa42 3204 else
cb50f42d 3205 SvUTF8_off(dsv);
6050d10e
JP
3206}
3207
3208/*
645c22ef
DM
3209=for apidoc sv_2pvbyte_nolen
3210
3211Return a pointer to the byte-encoded representation of the SV.
3212May cause the SV to be downgraded from UTF8 as a side-effect.
3213
3214Usually accessed via the C<SvPVbyte_nolen> macro.
3215
3216=cut
3217*/
3218
7340a771
GS
3219char *
3220Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
3221{
560a288e
GS
3222 STRLEN n_a;
3223 return sv_2pvbyte(sv, &n_a);
7340a771
GS
3224}
3225
645c22ef
DM
3226/*
3227=for apidoc sv_2pvbyte
3228
3229Return a pointer to the byte-encoded representation of the SV, and set *lp
3230to its length. May cause the SV to be downgraded from UTF8 as a
3231side-effect.
3232
3233Usually accessed via the C<SvPVbyte> macro.
3234
3235=cut
3236*/
3237
7340a771
GS
3238char *
3239Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
3240{
0875d2fe
NIS
3241 sv_utf8_downgrade(sv,0);
3242 return SvPV(sv,*lp);
7340a771
GS
3243}
3244
645c22ef
DM
3245/*
3246=for apidoc sv_2pvutf8_nolen
3247
3248Return a pointer to the UTF8-encoded representation of the SV.
3249May cause the SV to be upgraded to UTF8 as a side-effect.
3250
3251Usually accessed via the C<SvPVutf8_nolen> macro.
3252
3253=cut
3254*/
3255
7340a771
GS
3256char *
3257Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
3258{
560a288e
GS
3259 STRLEN n_a;
3260 return sv_2pvutf8(sv, &n_a);
7340a771
GS
3261}
3262
645c22ef
DM
3263/*
3264=for apidoc sv_2pvutf8
3265
3266Return a pointer to the UTF8-encoded representation of the SV, and set *lp
3267to its length. May cause the SV to be upgraded to UTF8 as a side-effect.
3268
3269Usually accessed via the C<SvPVutf8> macro.
3270
3271=cut
3272*/
3273
7340a771
GS
3274char *
3275Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
3276{
560a288e 3277 sv_utf8_upgrade(sv);
7d59b7e4 3278 return SvPV(sv,*lp);
7340a771 3279}
1c846c1f 3280
645c22ef
DM
3281/*
3282=for apidoc sv_2bool
3283
3284This function is only called on magical items, and is only used by
8cf8f3d1 3285sv_true() or its macro equivalent.
645c22ef
DM
3286
3287=cut
3288*/
3289
463ee0b2 3290bool
864dbfa3 3291Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 3292{
8990e307 3293 if (SvGMAGICAL(sv))
463ee0b2
LW
3294 mg_get(sv);
3295
a0d0e21e
LW
3296 if (!SvOK(sv))
3297 return 0;
3298 if (SvROK(sv)) {
a0d0e21e 3299 SV* tmpsv;
1554e226 3300 if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
9e3013b1 3301 (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
8a31060d 3302 return (bool)SvTRUE(tmpsv);
a0d0e21e
LW
3303 return SvRV(sv) != 0;
3304 }
463ee0b2 3305 if (SvPOKp(sv)) {
11343788
MB
3306 register XPV* Xpvtmp;
3307 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
3308 (*Xpvtmp->xpv_pv > '0' ||
3309 Xpvtmp->xpv_cur > 1 ||
3310 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
463ee0b2
LW
3311 return 1;
3312 else
3313 return 0;
3314 }
3315 else {
3316 if (SvIOKp(sv))
3317 return SvIVX(sv) != 0;
3318 else {
3319 if (SvNOKp(sv))
3320 return SvNVX(sv) != 0.0;
3321 else
3322 return FALSE;
3323 }
3324 }
79072805
LW
3325}
3326
c461cf8f
JH
3327/*
3328=for apidoc sv_utf8_upgrade
3329
3330Convert the PV of an SV to its UTF8-encoded form.
645c22ef 3331Forces the SV to string form if it is not already.
4411f3b6
NIS
3332Always sets the SvUTF8 flag to avoid future validity checks even
3333if all the bytes have hibit clear.
c461cf8f 3334
13a6c0e0
JH
3335This is not as a general purpose byte encoding to Unicode interface:
3336use the Encode extension for that.
3337
8d6d96c1
HS
3338=for apidoc sv_utf8_upgrade_flags
3339
3340Convert the PV of an SV to its UTF8-encoded form.
645c22ef 3341Forces the SV to string form if it is not already.
8d6d96c1
HS
3342Always sets the SvUTF8 flag to avoid future validity checks even
3343if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
3344will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
3345C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3346
13a6c0e0
JH
3347This is not as a general purpose byte encoding to Unicode interface:
3348use the Encode extension for that.
3349
8d6d96c1
HS
3350=cut
3351*/
3352
3353STRLEN
3354Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
3355{
db42d148 3356 U8 *s, *t, *e;
511c2ff0 3357 int hibit = 0;
560a288e 3358
4411f3b6
NIS
3359 if (!sv)
3360 return 0;
3361
e0e62c2a
NIS
3362 if (!SvPOK(sv)) {
3363 STRLEN len = 0;
8d6d96c1 3364 (void) sv_2pv_flags(sv,&len, flags);
e0e62c2a
NIS
3365 if (!SvPOK(sv))
3366 return len;
3367 }
4411f3b6
NIS
3368
3369 if (SvUTF8(sv))
3370 return SvCUR(sv);
560a288e 3371
765f542d
NC
3372 if (SvIsCOW(sv)) {
3373 sv_force_normal_flags(sv, 0);
db42d148
NIS
3374 }
3375
9f4817db 3376 if (PL_encoding)
799ef3cb 3377 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 3378 else { /* Assume Latin-1/EBCDIC */
0a378802
JH
3379 /* This function could be much more efficient if we
3380 * had a FLAG in SVs to signal if there are any hibit
3381 * chars in the PV. Given that there isn't such a flag
3382 * make the loop as fast as possible. */
3383 s = (U8 *) SvPVX(sv);
3384 e = (U8 *) SvEND(sv);
3385 t = s;
3386 while (t < e) {
3387 U8 ch = *t++;
3388 if ((hibit = !NATIVE_IS_INVARIANT(ch)))
3389 break;
3390 }
3391 if (hibit) {
3392 STRLEN len;
ecdeb87c 3393
0a378802
JH
3394 len = SvCUR(sv) + 1; /* Plus the \0 */
3395 SvPVX(sv) = (char*)bytes_to_utf8((U8*)s, &len);
3396 SvCUR(sv) = len - 1;
3397 if (SvLEN(sv) != 0)
3398 Safefree(s); /* No longer using what was there before. */
3399 SvLEN(sv) = len; /* No longer know the real size. */
3400 }
9f4817db
JH
3401 /* Mark as UTF-8 even if no hibit - saves scanning loop */
3402 SvUTF8_on(sv);
560a288e 3403 }
4411f3b6 3404 return SvCUR(sv);
560a288e
GS
3405}
3406
c461cf8f
JH
3407/*
3408=for apidoc sv_utf8_downgrade
3409
3410Attempt to convert the PV of an SV from UTF8-encoded to byte encoding.
3411This may not be possible if the PV contains non-byte encoding characters;
3412if this is the case, either returns false or, if C<fail_ok> is not
3413true, croaks.
3414
13a6c0e0
JH
3415This is not as a general purpose Unicode to byte encoding interface:
3416use the Encode extension for that.
3417
c461cf8f
JH
3418=cut
3419*/
3420
560a288e
GS
3421bool
3422Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
3423{
3424 if (SvPOK(sv) && SvUTF8(sv)) {
fa301091 3425 if (SvCUR(sv)) {
03cfe0ae 3426 U8 *s;
652088fc 3427 STRLEN len;
fa301091 3428
765f542d
NC
3429 if (SvIsCOW(sv)) {
3430 sv_force_normal_flags(sv, 0);
3431 }
03cfe0ae
NIS
3432 s = (U8 *) SvPV(sv, len);
3433 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
3434 if (fail_ok)
3435 return FALSE;
3436 else {
3437 if (PL_op)
3438 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 3439 OP_DESC(PL_op));
fa301091
JH
3440 else
3441 Perl_croak(aTHX_ "Wide character");
3442 }
4b3603a4 3443 }
fa301091 3444 SvCUR(sv) = len;
67e989fb 3445 }
560a288e 3446 }
ffebcc3e 3447 SvUTF8_off(sv);
560a288e
GS
3448 return TRUE;
3449}
3450
c461cf8f
JH
3451/*
3452=for apidoc sv_utf8_encode
3453
3454Convert the PV of an SV to UTF8-encoded, but then turn off the C<SvUTF8>
4411f3b6
NIS
3455flag so that it looks like octets again. Used as a building block
3456for encode_utf8 in Encode.xs
c461cf8f
JH
3457
3458=cut
3459*/
3460
560a288e
GS
3461void
3462Perl_sv_utf8_encode(pTHX_ register SV *sv)
3463{
4411f3b6 3464 (void) sv_utf8_upgrade(sv);
560a288e
GS
3465 SvUTF8_off(sv);
3466}
3467
4411f3b6
NIS
3468/*
3469=for apidoc sv_utf8_decode
3470
3471Convert the octets in the PV from UTF-8 to chars. Scan for validity and then
645c22ef 3472turn off SvUTF8 if needed so that we see characters. Used as a building block
4411f3b6
NIS
3473for decode_utf8 in Encode.xs
3474
3475=cut
3476*/
3477
560a288e
GS
3478bool
3479Perl_sv_utf8_decode(pTHX_ register SV *sv)
3480{
3481 if (SvPOK(sv)) {
63cd0674
NIS
3482 U8 *c;
3483 U8 *e;
9cbac4c7 3484
645c22ef
DM
3485 /* The octets may have got themselves encoded - get them back as
3486 * bytes
3487 */
3488 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
3489 return FALSE;
3490
3491 /* it is actually just a matter of turning the utf8 flag on, but
3492 * we want to make sure everything inside is valid utf8 first.
3493 */
63cd0674
NIS
3494 c = (U8 *) SvPVX(sv);
3495 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 3496 return FALSE;
63cd0674 3497 e = (U8 *) SvEND(sv);
511c2ff0 3498 while (c < e) {
c4d5f83a
NIS
3499 U8 ch = *c++;
3500 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
3501 SvUTF8_on(sv);
3502 break;
3503 }
560a288e 3504 }
560a288e
GS
3505 }
3506 return TRUE;
3507}
3508
954c1994
GS
3509/*
3510=for apidoc sv_setsv
3511
645c22ef
DM
3512Copies the contents of the source SV C<ssv> into the destination SV
3513C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3514function if the source SV needs to be reused. Does not handle 'set' magic.
3515Loosely speaking, it performs a copy-by-value, obliterating any previous
3516content of the destination.
3517
3518You probably want to use one of the assortment of wrappers, such as
3519C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3520C<SvSetMagicSV_nosteal>.
3521
8d6d96c1
HS
3522=for apidoc sv_setsv_flags
3523
645c22ef
DM
3524Copies the contents of the source SV C<ssv> into the destination SV
3525C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3526function if the source SV needs to be reused. Does not handle 'set' magic.
3527Loosely speaking, it performs a copy-by-value, obliterating any previous
3528content of the destination.
3529If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
3530C<ssv> if appropriate, else not. C<sv_setsv> and C<sv_setsv_nomg> are
3531implemented in terms of this function.
3532
3533You probably want to use one of the assortment of wrappers, such as
3534C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3535C<SvSetMagicSV_nosteal>.
3536
3537This is the primary function for copying scalars, and most other
3538copy-ish functions and macros use this underneath.
8d6d96c1
HS
3539
3540=cut
3541*/
3542
3543void
3544Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
3545{
8990e307
LW
3546 register U32 sflags;
3547 register int dtype;
3548 register int stype;
463ee0b2 3549
79072805
LW
3550 if (sstr == dstr)
3551 return;
765f542d 3552 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 3553 if (!sstr)
3280af22 3554 sstr = &PL_sv_undef;
8990e307
LW
3555 stype = SvTYPE(sstr);
3556 dtype = SvTYPE(dstr);
79072805 3557
a0d0e21e 3558 SvAMAGIC_off(dstr);
ece467f9
JP
3559 if ( SvVOK(dstr) )
3560 {
3561 /* need to nuke the magic */
3562 mg_free(dstr);
3563 SvRMAGICAL_off(dstr);
3564 }
9e7bc3e8 3565
463ee0b2 3566 /* There's a lot of redundancy below but we're going for speed here */
79072805 3567
8990e307 3568 switch (stype) {
79072805 3569 case SVt_NULL:
aece5585 3570 undef_sstr:
20408e3c
GS
3571 if (dtype != SVt_PVGV) {
3572 (void)SvOK_off(dstr);
3573 return;
3574 }
3575 break;
463ee0b2 3576 case SVt_IV:
aece5585
GA
3577 if (SvIOK(sstr)) {
3578 switch (dtype) {
3579 case SVt_NULL:
8990e307 3580 sv_upgrade(dstr, SVt_IV);
aece5585
GA
3581 break;
3582 case SVt_NV:
8990e307 3583 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
3584 break;
3585 case SVt_RV:
3586 case SVt_PV:
a0d0e21e 3587 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
3588 break;
3589 }
3590 (void)SvIOK_only(dstr);
3591 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
3592 if (SvIsUV(sstr))
3593 SvIsUV_on(dstr);
27c9684d
AP
3594 if (SvTAINTED(sstr))
3595 SvTAINT(dstr);
aece5585 3596 return;
8990e307 3597 }
aece5585
GA
3598 goto undef_sstr;
3599
463ee0b2 3600 case SVt_NV:
aece5585
GA
3601 if (SvNOK(sstr)) {
3602 switch (dtype) {
3603 case SVt_NULL:
3604 case SVt_IV:
8990e307 3605 sv_upgrade(dstr, SVt_NV);
aece5585
GA
3606 break;
3607 case SVt_RV:
3608 case SVt_PV:
3609 case SVt_PVIV:
a0d0e21e 3610 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
3611 break;
3612 }
3613 SvNVX(dstr) = SvNVX(sstr);
3614 (void)SvNOK_only(dstr);
27c9684d
AP
3615 if (SvTAINTED(sstr))
3616 SvTAINT(dstr);
aece5585 3617 return;
8990e307 3618 }
aece5585
GA
3619 goto undef_sstr;
3620
ed6116ce 3621 case SVt_RV:
8990e307 3622 if (dtype < SVt_RV)
ed6116ce 3623 sv_upgrade(dstr, SVt_RV);
c07a80fd 3624 else if (dtype == SVt_PVGV &&
3625 SvTYPE(SvRV(sstr)) == SVt_PVGV) {
3626 sstr = SvRV(sstr);
a5f75d66 3627 if (sstr == dstr) {
1d7c1841
GS
3628 if (GvIMPORTED(dstr) != GVf_IMPORTED
3629 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3630 {
a5f75d66 3631 GvIMPORTED_on(dstr);
1d7c1841 3632 }
a5f75d66
AD
3633 GvMULTI_on(dstr);
3634 return;
3635 }
c07a80fd 3636 goto glob_assign;
3637 }
ed6116ce 3638 break;
463ee0b2 3639 case SVt_PV:
fc36a67e 3640 case SVt_PVFM:
8990e307 3641 if (dtype < SVt_PV)
463ee0b2 3642 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
3643 break;
3644 case SVt_PVIV:
8990e307 3645 if (dtype < SVt_PVIV)
463ee0b2 3646 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
3647 break;
3648 case SVt_PVNV:
8990e307 3649 if (dtype < SVt_PVNV)
463ee0b2 3650 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 3651 break;
4633a7c4
LW
3652 case SVt_PVAV:
3653 case SVt_PVHV:
3654 case SVt_PVCV:
4633a7c4 3655 case SVt_PVIO:
533c011a 3656 if (PL_op)
cea2e8a9 3657 Perl_croak(aTHX_ "Bizarre copy of %s in %s", sv_reftype(sstr, 0),
53e06cf0 3658 OP_NAME(PL_op));
4633a7c4 3659 else
cea2e8a9 3660 Perl_croak(aTHX_ "Bizarre copy of %s", sv_reftype(sstr, 0));
4633a7c4
LW
3661 break;
3662
79072805 3663 case SVt_PVGV:
8990e307 3664 if (dtype <= SVt_PVGV) {
c07a80fd 3665 glob_assign:
a5f75d66 3666 if (dtype != SVt_PVGV) {
a0d0e21e
LW
3667 char *name = GvNAME(sstr);
3668 STRLEN len = GvNAMELEN(sstr);
463ee0b2 3669 sv_upgrade(dstr, SVt_PVGV);
14befaf4 3670 sv_magic(dstr, dstr, PERL_MAGIC_glob, Nullch, 0);
85aff577 3671 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
3672 GvNAME(dstr) = savepvn(name, len);
3673 GvNAMELEN(dstr) = len;
3674 SvFAKE_on(dstr); /* can coerce to non-glob */
3675 }
7bac28a0 3676 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
3677 else if (PL_curstackinfo->si_type == PERLSI_SORT
3678 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
cea2e8a9 3679 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
7bac28a0 3680 GvNAME(dstr));
5bd07a3d 3681
7fb37951
AMS
3682#ifdef GV_UNIQUE_CHECK
3683 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
3684 Perl_croak(aTHX_ PL_no_modify);
3685 }
3686#endif
3687
a0d0e21e 3688 (void)SvOK_off(dstr);
a5f75d66 3689 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 3690 gp_free((GV*)dstr);
79072805 3691 GvGP(dstr) = gp_ref(GvGP(sstr));
27c9684d
AP
3692 if (SvTAINTED(sstr))
3693 SvTAINT(dstr);
1d7c1841
GS
3694 if (GvIMPORTED(dstr) != GVf_IMPORTED
3695 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3696 {
a5f75d66 3697 GvIMPORTED_on(dstr);
1d7c1841 3698 }
a5f75d66 3699 GvMULTI_on(dstr);
79072805
LW
3700 return;
3701 }
3702 /* FALL THROUGH */
3703
3704 default:
8d6d96c1 3705 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 3706 mg_get(sstr);
eb160463 3707 if ((int)SvTYPE(sstr) != stype) {
973f89ab
CS
3708 stype = SvTYPE(sstr);
3709 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
3710 goto glob_assign;
3711 }
3712 }
ded42b9f 3713 if (stype == SVt_PVLV)
6fc92669 3714 (void)SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 3715 else
eb160463 3716 (void)SvUPGRADE(dstr, (U32)stype);
79072805
LW
3717 }
3718
8990e307
LW
3719 sflags = SvFLAGS(sstr);
3720
3721 if (sflags & SVf_ROK) {
3722 if (dtype >= SVt_PV) {
3723 if (dtype == SVt_PVGV) {
3724 SV *sref = SvREFCNT_inc(SvRV(sstr));
3725 SV *dref = 0;
a5f75d66 3726 int intro = GvINTRO(dstr);
a0d0e21e 3727
7fb37951
AMS
3728#ifdef GV_UNIQUE_CHECK
3729 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
3730 Perl_croak(aTHX_ PL_no_modify);
3731 }
3732#endif
3733
a0d0e21e 3734 if (intro) {
a5f75d66 3735 GvINTRO_off(dstr); /* one-shot flag */
1d7c1841 3736 GvLINE(dstr) = CopLINE(PL_curcop);
1edc1566 3737 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 3738 }
a5f75d66 3739 GvMULTI_on(dstr);
8990e307
LW
3740 switch (SvTYPE(sref)) {
3741 case SVt_PVAV:
a0d0e21e
LW
3742 if (intro)
3743 SAVESPTR(GvAV(dstr));
3744 else
3745 dref = (SV*)GvAV(dstr);
8990e307 3746 GvAV(dstr) = (AV*)sref;
39bac7f7 3747 if (!GvIMPORTED_AV(dstr)
1d7c1841
GS
3748 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3749 {
a5f75d66 3750 GvIMPORTED_AV_on(dstr);
1d7c1841 3751 }
8990e307
LW
3752 break;
3753 case SVt_PVHV:
a0d0e21e
LW
3754 if (intro)
3755 SAVESPTR(GvHV(dstr));
3756 else
3757 dref = (SV*)GvHV(dstr);
8990e307 3758 GvHV(dstr) = (HV*)sref;
39bac7f7 3759 if (!GvIMPORTED_HV(dstr)
1d7c1841
GS
3760 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3761 {
a5f75d66 3762 GvIMPORTED_HV_on(dstr);
1d7c1841 3763 }
8990e307
LW
3764 break;
3765 case SVt_PVCV:
8ebc5c01 3766 if (intro) {
3767 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
3768 SvREFCNT_dec(GvCV(dstr));
3769 GvCV(dstr) = Nullcv;
68dc0745 3770 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 3771 PL_sub_generation++;
8ebc5c01 3772 }
a0d0e21e 3773 SAVESPTR(GvCV(dstr));
8ebc5c01 3774 }
68dc0745 3775 else
3776 dref = (SV*)GvCV(dstr);
3777 if (GvCV(dstr) != (CV*)sref) {
748a9306 3778 CV* cv = GvCV(dstr);
4633a7c4 3779 if (cv) {
68dc0745 3780 if (!GvCVGEN((GV*)dstr) &&
3781 (CvROOT(cv) || CvXSUB(cv)))
3782 {
7bac28a0 3783 /* ahem, death to those who redefine
3784 * active sort subs */
3280af22
NIS
3785 if (PL_curstackinfo->si_type == PERLSI_SORT &&
3786 PL_sortcop == CvSTART(cv))
1c846c1f 3787 Perl_croak(aTHX_
7bac28a0 3788 "Can't redefine active sort subroutine %s",
3789 GvENAME((GV*)dstr));
beab0874
JT
3790 /* Redefining a sub - warning is mandatory if
3791 it was a const and its value changed. */
3792 if (ckWARN(WARN_REDEFINE)
3793 || (CvCONST(cv)
3794 && (!CvCONST((CV*)sref)
3795 || sv_cmp(cv_const_sv(cv),
3796 cv_const_sv((CV*)sref)))))
3797 {
9014280d 3798 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
beab0874 3799 CvCONST(cv)
910764e6
RGS
3800 ? "Constant subroutine %s::%s redefined"
3801 : "Subroutine %s::%s redefined",
3802 HvNAME(GvSTASH((GV*)dstr)),
beab0874
JT
3803 GvENAME((GV*)dstr));
3804 }
9607fc9c 3805 }
fb24441d
RGS
3806 if (!intro)
3807 cv_ckproto(cv, (GV*)dstr,
3808 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 3809 }
a5f75d66 3810 GvCV(dstr) = (CV*)sref;
7a4c00b4 3811 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 3812 GvASSUMECV_on(dstr);
3280af22 3813 PL_sub_generation++;
a5f75d66 3814 }
39bac7f7 3815 if (!GvIMPORTED_CV(dstr)
1d7c1841
GS
3816 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3817 {
a5f75d66 3818 GvIMPORTED_CV_on(dstr);
1d7c1841 3819 }
8990e307 3820 break;
91bba347
LW
3821 case SVt_PVIO:
3822 if (intro)
3823 SAVESPTR(GvIOp(dstr));
3824 else
3825 dref = (SV*)GvIOp(dstr);
3826 GvIOp(dstr) = (IO*)sref;
3827 break;
f4d13ee9
JH
3828 case SVt_PVFM:
3829 if (intro)
3830 SAVESPTR(GvFORM(dstr));
3831 else
3832 dref = (SV*)GvFORM(dstr);
3833 GvFORM(dstr) = (CV*)sref;
3834 break;
8990e307 3835 default:
a0d0e21e
LW
3836 if (intro)
3837 SAVESPTR(GvSV(dstr));
3838 else
3839 dref = (SV*)GvSV(dstr);
8990e307 3840 GvSV(dstr) = sref;
39bac7f7 3841 if (!GvIMPORTED_SV(dstr)
1d7c1841
GS
3842 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3843 {
a5f75d66 3844 GvIMPORTED_SV_on(dstr);
1d7c1841 3845 }
8990e307
LW
3846 break;
3847 }
3848 if (dref)
3849 SvREFCNT_dec(dref);
a0d0e21e
LW
3850 if (intro)
3851 SAVEFREESV(sref);
27c9684d
AP
3852 if (SvTAINTED(sstr))
3853 SvTAINT(dstr);
8990e307
LW
3854 return;
3855 }
a0d0e21e 3856 if (SvPVX(dstr)) {
760ac839 3857 (void)SvOOK_off(dstr); /* backoff */
50483b2c
JD
3858 if (SvLEN(dstr))
3859 Safefree(SvPVX(dstr));
a0d0e21e
LW
3860 SvLEN(dstr)=SvCUR(dstr)=0;
3861 }
8990e307 3862 }
a0d0e21e 3863 (void)SvOK_off(dstr);
8990e307 3864 SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
ed6116ce 3865 SvROK_on(dstr);
8990e307 3866 if (sflags & SVp_NOK) {
3332b3c1
JH
3867 SvNOKp_on(dstr);
3868 /* Only set the public OK flag if the source has public OK. */
3869 if (sflags & SVf_NOK)
3870 SvFLAGS(dstr) |= SVf_NOK;
ed6116ce
LW
3871 SvNVX(dstr) = SvNVX(sstr);
3872 }
8990e307 3873 if (sflags & SVp_IOK) {
3332b3c1
JH
3874 (void)SvIOKp_on(dstr);
3875 if (sflags & SVf_IOK)
3876 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 3877 if (sflags & SVf_IVisUV)
25da4f38 3878 SvIsUV_on(dstr);
3332b3c1 3879 SvIVX(dstr) = SvIVX(sstr);
ed6116ce 3880 }
a0d0e21e
LW
3881 if (SvAMAGIC(sstr)) {
3882 SvAMAGIC_on(dstr);
3883 }
ed6116ce 3884 }
8990e307 3885 else if (sflags & SVp_POK) {
765f542d 3886 bool isSwipe = 0;
79072805
LW
3887
3888 /*
3889 * Check to see if we can just swipe the string. If so, it's a
3890 * possible small lose on short strings, but a big win on long ones.
463ee0b2
LW
3891 * It might even be a win on short strings if SvPVX(dstr)
3892 * has to be allocated and SvPVX(sstr) has to be freed.
79072805
LW
3893 */
3894
765f542d
NC
3895 if (
3896#ifdef PERL_COPY_ON_WRITE
3897 (sflags & (SVf_FAKE | SVf_READONLY)) != (SVf_FAKE | SVf_READONLY)
3898 &&
3899#endif
3900 !(isSwipe =
3901 (sflags & SVs_TEMP) && /* slated for free anyway? */
3902 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
3903 SvREFCNT(sstr) == 1 && /* and no other references to it? */
3904 SvLEN(sstr) && /* and really is a string */
645c22ef 3905 /* and won't be needed again, potentially */
765f542d
NC
3906 !(PL_op && PL_op->op_type == OP_AASSIGN))
3907#ifdef PERL_COPY_ON_WRITE
3908 && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
3909 && SvTYPE(sstr) >= SVt_PVIV)
3910#endif
3911 ) {
3912 /* Failed the swipe test, and it's not a shared hash key either.
3913 Have to copy the string. */
3914 STRLEN len = SvCUR(sstr);
3915 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3916 Move(SvPVX(sstr),SvPVX(dstr),len,char);
3917 SvCUR_set(dstr, len);
3918 *SvEND(dstr) = '\0';
3919 (void)SvPOK_only(dstr);
3920 } else {
3921 /* If PERL_COPY_ON_WRITE is not defined, then isSwipe will always
3922 be true in here. */
3923#ifdef PERL_COPY_ON_WRITE
3924 /* Either it's a shared hash key, or it's suitable for
3925 copy-on-write or we can swipe the string. */
46187eeb
NC
3926 if (DEBUG_C_TEST) {
3927 PerlIO_printf(Perl_debug_log,
3928 "Copy on write: sstr --> dstr\n");
e419cbc5
NC
3929 sv_dump(sstr);
3930 sv_dump(dstr);
46187eeb 3931 }
765f542d
NC
3932 if (!isSwipe) {
3933 /* I believe I should acquire a global SV mutex if
3934 it's a COW sv (not a shared hash key) to stop
3935 it going un copy-on-write.
3936 If the source SV has gone un copy on write between up there
3937 and down here, then (assert() that) it is of the correct
3938 form to make it copy on write again */
3939 if ((sflags & (SVf_FAKE | SVf_READONLY))
3940 != (SVf_FAKE | SVf_READONLY)) {
3941 SvREADONLY_on(sstr);
3942 SvFAKE_on(sstr);
3943 /* Make the source SV into a loop of 1.
3944 (about to become 2) */
a29f6d03 3945 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
3946 }
3947 }
3948#endif
3949 /* Initial code is common. */
adbc6bb1 3950 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
3951 if (SvOOK(dstr)) {
3952 SvFLAGS(dstr) &= ~SVf_OOK;
3953 Safefree(SvPVX(dstr) - SvIVX(dstr));
3954 }
50483b2c 3955 else if (SvLEN(dstr))
a5f75d66 3956 Safefree(SvPVX(dstr));
79072805 3957 }
a5f75d66 3958 (void)SvPOK_only(dstr);
765f542d
NC
3959
3960#ifdef PERL_COPY_ON_WRITE
3961 if (!isSwipe) {
3962 /* making another shared SV. */
3963 STRLEN cur = SvCUR(sstr);
3964 STRLEN len = SvLEN(sstr);
3965 if (len) {
3966 /* SvIsCOW_normal */
3967 /* splice us in between source and next-after-source. */
a29f6d03
NC
3968 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3969 SV_COW_NEXT_SV_SET(sstr, dstr);
765f542d
NC
3970 SvPV_set(dstr, SvPVX(sstr));
3971 } else {
3972 /* SvIsCOW_shared_hash */
3973 UV hash = SvUVX(sstr);
46187eeb
NC
3974 DEBUG_C(PerlIO_printf(Perl_debug_log,
3975 "Copy on write: Sharing hash\n"));
765f542d
NC
3976 SvPV_set(dstr,
3977 sharepvn(SvPVX(sstr),
3978 (sflags & SVf_UTF8?-cur:cur), hash));
3979 SvUVX(dstr) = hash;
3980 }
3981 SvLEN(dstr) = len;
3982 SvCUR(dstr) = cur;
3983 SvREADONLY_on(dstr);
3984 SvFAKE_on(dstr);
3985 /* Relesase a global SV mutex. */
3986 }
3987 else
3988#endif
3989 { /* Passes the swipe test. */
3990 SvPV_set(dstr, SvPVX(sstr));
3991 SvLEN_set(dstr, SvLEN(sstr));
3992 SvCUR_set(dstr, SvCUR(sstr));
3993
3994 SvTEMP_off(dstr);
3995 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
3996 SvPV_set(sstr, Nullch);
3997 SvLEN_set(sstr, 0);
3998 SvCUR_set(sstr, 0);
3999 SvTEMP_off(sstr);
4000 }
4001 }
9aa983d2 4002 if (sflags & SVf_UTF8)
a7cb1f99 4003 SvUTF8_on(dstr);
79072805 4004 /*SUPPRESS 560*/
8990e307 4005 if (sflags & SVp_NOK) {
3332b3c1
JH
4006 SvNOKp_on(dstr);
4007 if (sflags & SVf_NOK)
4008 SvFLAGS(dstr) |= SVf_NOK;
463ee0b2 4009 SvNVX(dstr) = SvNVX(sstr);
79072805 4010 }
8990e307 4011 if (sflags & SVp_IOK) {
3332b3c1
JH
4012 (void)SvIOKp_on(dstr);
4013 if (sflags & SVf_IOK)
4014 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4015 if (sflags & SVf_IVisUV)
25da4f38 4016 SvIsUV_on(dstr);
463ee0b2 4017 SvIVX(dstr) = SvIVX(sstr);
79072805 4018 }
92f0c265 4019 if (SvVOK(sstr)) {
ece467f9
JP
4020 MAGIC *smg = mg_find(sstr,PERL_MAGIC_vstring);
4021 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4022 smg->mg_ptr, smg->mg_len);
439cb1c4 4023 SvRMAGICAL_on(dstr);
92f0c265 4024 }
79072805 4025 }
8990e307 4026 else if (sflags & SVp_IOK) {
3332b3c1
JH
4027 if (sflags & SVf_IOK)
4028 (void)SvIOK_only(dstr);
4029 else {
9cbac4c7
DM
4030 (void)SvOK_off(dstr);
4031 (void)SvIOKp_on(dstr);
3332b3c1
JH
4032 }
4033 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2b1c7e3e 4034 if (sflags & SVf_IVisUV)
25da4f38 4035 SvIsUV_on(dstr);
3332b3c1
JH
4036 SvIVX(dstr) = SvIVX(sstr);
4037 if (sflags & SVp_NOK) {
4038 if (sflags & SVf_NOK)
4039 (void)SvNOK_on(dstr);
4040 else
4041 (void)SvNOKp_on(dstr);
4042 SvNVX(dstr) = SvNVX(sstr);
4043 }
4044 }
4045 else if (sflags & SVp_NOK) {
4046 if (sflags & SVf_NOK)
4047 (void)SvNOK_only(dstr);
4048 else {
9cbac4c7 4049 (void)SvOK_off(dstr);
3332b3c1
JH
4050 SvNOKp_on(dstr);
4051 }
4052 SvNVX(dstr) = SvNVX(sstr);
79072805
LW
4053 }
4054 else {
20408e3c 4055 if (dtype == SVt_PVGV) {
e476b1b5 4056 if (ckWARN(WARN_MISC))
9014280d 4057 Perl_warner(aTHX_ packWARN(WARN_MISC), "Undefined value assigned to typeglob");
20408e3c
GS
4058 }
4059 else
4060 (void)SvOK_off(dstr);
a0d0e21e 4061 }
27c9684d
AP
4062 if (SvTAINTED(sstr))
4063 SvTAINT(dstr);
79072805
LW
4064}
4065
954c1994
GS
4066/*
4067=for apidoc sv_setsv_mg
4068
4069Like C<sv_setsv>, but also handles 'set' magic.
4070
4071=cut
4072*/
4073
79072805 4074void
864dbfa3 4075Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
4076{
4077 sv_setsv(dstr,sstr);
4078 SvSETMAGIC(dstr);
4079}
4080
954c1994
GS
4081/*
4082=for apidoc sv_setpvn
4083
4084Copies a string into an SV. The C<len> parameter indicates the number of
4085bytes to be copied. Does not handle 'set' magic. See C<sv_setpvn_mg>.
4086
4087=cut
4088*/
4089
ef50df4b 4090void
864dbfa3 4091Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 4092{
c6f8c383 4093 register char *dptr;
22c522df 4094
765f542d 4095 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4096 if (!ptr) {
a0d0e21e 4097 (void)SvOK_off(sv);
463ee0b2
LW
4098 return;
4099 }
22c522df
JH
4100 else {
4101 /* len is STRLEN which is unsigned, need to copy to signed */
4102 IV iv = len;
9c5ffd7c
JH
4103 if (iv < 0)
4104 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 4105 }
6fc92669 4106 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4107
79072805 4108 SvGROW(sv, len + 1);
c6f8c383
GA
4109 dptr = SvPVX(sv);
4110 Move(ptr,dptr,len,char);
4111 dptr[len] = '\0';
79072805 4112 SvCUR_set(sv, len);
1aa99e6b 4113 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4114 SvTAINT(sv);
79072805
LW
4115}
4116
954c1994
GS
4117/*
4118=for apidoc sv_setpvn_mg
4119
4120Like C<sv_setpvn>, but also handles 'set' magic.
4121
4122=cut
4123*/
4124
79072805 4125void
864dbfa3 4126Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4127{
4128 sv_setpvn(sv,ptr,len);
4129 SvSETMAGIC(sv);
4130}
4131
954c1994
GS
4132/*
4133=for apidoc sv_setpv
4134
4135Copies a string into an SV. The string must be null-terminated. Does not
4136handle 'set' magic. See C<sv_setpv_mg>.
4137
4138=cut
4139*/
4140
ef50df4b 4141void
864dbfa3 4142Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4143{
4144 register STRLEN len;
4145
765f542d 4146 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4147 if (!ptr) {
a0d0e21e 4148 (void)SvOK_off(sv);
463ee0b2
LW
4149 return;
4150 }
79072805 4151 len = strlen(ptr);
6fc92669 4152 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4153
79072805 4154 SvGROW(sv, len + 1);
463ee0b2 4155 Move(ptr,SvPVX(sv),len+1,char);
79072805 4156 SvCUR_set(sv, len);
1aa99e6b 4157 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
4158 SvTAINT(sv);
4159}
4160
954c1994
GS
4161/*
4162=for apidoc sv_setpv_mg
4163
4164Like C<sv_setpv>, but also handles 'set' magic.
4165
4166=cut
4167*/
4168
463ee0b2 4169void
864dbfa3 4170Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
4171{
4172 sv_setpv(sv,ptr);
4173 SvSETMAGIC(sv);
4174}
4175
954c1994
GS
4176/*
4177=for apidoc sv_usepvn
4178
4179Tells an SV to use C<ptr> to find its string value. Normally the string is
1c846c1f 4180stored inside the SV but sv_usepvn allows the SV to use an outside string.
954c1994
GS
4181The C<ptr> should point to memory that was allocated by C<malloc>. The
4182string length, C<len>, must be supplied. This function will realloc the
4183memory pointed to by C<ptr>, so that pointer should not be freed or used by
4184the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
4185See C<sv_usepvn_mg>.
4186
4187=cut
4188*/
4189
ef50df4b 4190void
864dbfa3 4191Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 4192{
765f542d 4193 SV_CHECK_THINKFIRST_COW_DROP(sv);
c6f8c383 4194 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 4195 if (!ptr) {
a0d0e21e 4196 (void)SvOK_off(sv);
463ee0b2
LW
4197 return;
4198 }
a0ed51b3 4199 (void)SvOOK_off(sv);
50483b2c 4200 if (SvPVX(sv) && SvLEN(sv))
463ee0b2
LW
4201 Safefree(SvPVX(sv));
4202 Renew(ptr, len+1, char);
4203 SvPVX(sv) = ptr;
4204 SvCUR_set(sv, len);
4205 SvLEN_set(sv, len+1);
4206 *SvEND(sv) = '\0';
1aa99e6b 4207 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4208 SvTAINT(sv);
79072805
LW
4209}
4210
954c1994
GS
4211/*
4212=for apidoc sv_usepvn_mg
4213
4214Like C<sv_usepvn>, but also handles 'set' magic.
4215
4216=cut
4217*/
4218
ef50df4b 4219void
864dbfa3 4220Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 4221{
51c1089b 4222 sv_usepvn(sv,ptr,len);
ef50df4b
GS
4223 SvSETMAGIC(sv);
4224}
4225
765f542d
NC
4226#ifdef PERL_COPY_ON_WRITE
4227/* Need to do this *after* making the SV normal, as we need the buffer
4228 pointer to remain valid until after we've copied it. If we let go too early,
4229 another thread could invalidate it by unsharing last of the same hash key
4230 (which it can do by means other than releasing copy-on-write Svs)
4231 or by changing the other copy-on-write SVs in the loop. */
4232STATIC void
4233S_sv_release_COW(pTHX_ register SV *sv, char *pvx, STRLEN cur, STRLEN len,
4234 U32 hash, SV *after)
4235{
4236 if (len) { /* this SV was SvIsCOW_normal(sv) */
4237 /* we need to find the SV pointing to us. */
4238 SV *current = SV_COW_NEXT_SV(after);
4239
4240 if (current == sv) {
4241 /* The SV we point to points back to us (there were only two of us
4242 in the loop.)
4243 Hence other SV is no longer copy on write either. */
4244 SvFAKE_off(after);
4245 SvREADONLY_off(after);
4246 } else {
4247 /* We need to follow the pointers around the loop. */
4248 SV *next;
4249 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4250 assert (next);
4251 current = next;
4252 /* don't loop forever if the structure is bust, and we have
4253 a pointer into a closed loop. */
4254 assert (current != after);
e419cbc5 4255 assert (SvPVX(current) == pvx);
765f542d
NC
4256 }
4257 /* Make the SV before us point to the SV after us. */
a29f6d03 4258 SV_COW_NEXT_SV_SET(current, after);
765f542d
NC
4259 }
4260 } else {
4261 unsharepvn(pvx, SvUTF8(sv) ? -(I32)cur : cur, hash);
4262 }
4263}
4264
4265int
4266Perl_sv_release_IVX(pTHX_ register SV *sv)
4267{
4268 if (SvIsCOW(sv))
4269 sv_force_normal_flags(sv, 0);
4270 return SvOOK_off(sv);
4271}
4272#endif
645c22ef
DM
4273/*
4274=for apidoc sv_force_normal_flags
4275
4276Undo various types of fakery on an SV: if the PV is a shared string, make
4277a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4278an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4279we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4280then a copy-on-write scalar drops its PV buffer (if any) and becomes
4281SvPOK_off rather than making a copy. (Used where this scalar is about to be
4282set to some other value. In addtion, the C<flags> parameter gets passed to
4283C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4284with flags set to 0.
645c22ef
DM
4285
4286=cut
4287*/
4288
6fc92669 4289void
840a7b70 4290Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 4291{
765f542d
NC
4292#ifdef PERL_COPY_ON_WRITE
4293 if (SvREADONLY(sv)) {
4294 /* At this point I believe I should acquire a global SV mutex. */
4295 if (SvFAKE(sv)) {
4296 char *pvx = SvPVX(sv);
4297 STRLEN len = SvLEN(sv);
4298 STRLEN cur = SvCUR(sv);
4299 U32 hash = SvUVX(sv);
4300 SV *next = SV_COW_NEXT_SV(sv); /* next COW sv in the loop. */
46187eeb
NC
4301 if (DEBUG_C_TEST) {
4302 PerlIO_printf(Perl_debug_log,
4303 "Copy on write: Force normal %ld\n",
4304 (long) flags);
e419cbc5 4305 sv_dump(sv);
46187eeb 4306 }
765f542d
NC
4307 SvFAKE_off(sv);
4308 SvREADONLY_off(sv);
4309 /* This SV doesn't own the buffer, so need to New() a new one: */
4310 SvPVX(sv) = 0;
4311 SvLEN(sv) = 0;
4312 if (flags & SV_COW_DROP_PV) {
4313 /* OK, so we don't need to copy our buffer. */
4314 SvPOK_off(sv);
4315 } else {
4316 SvGROW(sv, cur + 1);
4317 Move(pvx,SvPVX(sv),cur,char);
4318 SvCUR(sv) = cur;
4319 *SvEND(sv) = '\0';
4320 }
e419cbc5 4321 sv_release_COW(sv, pvx, cur, len, hash, next);
46187eeb 4322 if (DEBUG_C_TEST) {
e419cbc5 4323 sv_dump(sv);
46187eeb 4324 }
765f542d
NC
4325 }
4326 else if (PL_curcop != &PL_compiling)
4327 Perl_croak(aTHX_ PL_no_modify);
4328 /* At this point I believe that I can drop the global SV mutex. */
4329 }
4330#else
2213622d 4331 if (SvREADONLY(sv)) {
1c846c1f
NIS
4332 if (SvFAKE(sv)) {
4333 char *pvx = SvPVX(sv);
4334 STRLEN len = SvCUR(sv);
4335 U32 hash = SvUVX(sv);
4336 SvGROW(sv, len + 1);
4337 Move(pvx,SvPVX(sv),len,char);
4338 *SvEND(sv) = '\0';
4339 SvFAKE_off(sv);
4340 SvREADONLY_off(sv);
25716404 4341 unsharepvn(pvx, SvUTF8(sv) ? -(I32)len : len, hash);
1c846c1f
NIS
4342 }
4343 else if (PL_curcop != &PL_compiling)
cea2e8a9 4344 Perl_croak(aTHX_ PL_no_modify);
0f15f207 4345 }
765f542d 4346#endif
2213622d 4347 if (SvROK(sv))
840a7b70 4348 sv_unref_flags(sv, flags);
6fc92669
GS
4349 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4350 sv_unglob(sv);
0f15f207 4351}
1c846c1f 4352
645c22ef
DM
4353/*
4354=for apidoc sv_force_normal
4355
4356Undo various types of fakery on an SV: if the PV is a shared string, make
4357a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4358an xpvmg. See also C<sv_force_normal_flags>.
4359
4360=cut
4361*/
4362
840a7b70
IZ
4363void
4364Perl_sv_force_normal(pTHX_ register SV *sv)
4365{
4366 sv_force_normal_flags(sv, 0);
4367}
4368
954c1994
GS
4369/*
4370=for apidoc sv_chop
4371
1c846c1f 4372Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4373SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4374the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4375string. Uses the "OOK hack".
954c1994
GS
4376
4377=cut
4378*/
4379
79072805 4380void
645c22ef 4381Perl_sv_chop(pTHX_ register SV *sv, register char *ptr)
79072805
LW
4382{
4383 register STRLEN delta;
4384
a0d0e21e 4385 if (!ptr || !SvPOKp(sv))
79072805 4386 return;
2213622d 4387 SV_CHECK_THINKFIRST(sv);
79072805
LW
4388 if (SvTYPE(sv) < SVt_PVIV)
4389 sv_upgrade(sv,SVt_PVIV);
4390
4391 if (!SvOOK(sv)) {
50483b2c
JD
4392 if (!SvLEN(sv)) { /* make copy of shared string */
4393 char *pvx = SvPVX(sv);
4394 STRLEN len = SvCUR(sv);
4395 SvGROW(sv, len + 1);
4396 Move(pvx,SvPVX(sv),len,char);
4397 *SvEND(sv) = '\0';
4398 }
463ee0b2 4399 SvIVX(sv) = 0;
79072805
LW
4400 SvFLAGS(sv) |= SVf_OOK;
4401 }
25da4f38 4402 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK|SVf_IVisUV);
463ee0b2 4403 delta = ptr - SvPVX(sv);
79072805
LW
4404 SvLEN(sv) -= delta;
4405 SvCUR(sv) -= delta;
463ee0b2
LW
4406 SvPVX(sv) += delta;
4407 SvIVX(sv) += delta;
79072805
LW
4408}
4409
954c1994
GS
4410/*
4411=for apidoc sv_catpvn
4412
4413Concatenates the string onto the end of the string which is in the SV. The
d5ce4a7c
GA
4414C<len> indicates number of bytes to copy. If the SV has the UTF8
4415status set, then the bytes appended should be valid UTF8.
4416Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 4417
8d6d96c1
HS
4418=for apidoc sv_catpvn_flags
4419
4420Concatenates the string onto the end of the string which is in the SV. The
4421C<len> indicates number of bytes to copy. If the SV has the UTF8
4422status set, then the bytes appended should be valid UTF8.
4423If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4424appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4425in terms of this function.
4426
4427=cut
4428*/
4429
4430void
4431Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
4432{
4433 STRLEN dlen;
4434 char *dstr;
4435
4436 dstr = SvPV_force_flags(dsv, dlen, flags);
4437 SvGROW(dsv, dlen + slen + 1);
4438 if (sstr == dstr)
4439 sstr = SvPVX(dsv);
4440 Move(sstr, SvPVX(dsv) + dlen, slen, char);
4441 SvCUR(dsv) += slen;
4442 *SvEND(dsv) = '\0';
4443 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
4444 SvTAINT(dsv);
79072805
LW
4445}
4446
954c1994
GS
4447/*
4448=for apidoc sv_catpvn_mg
4449
4450Like C<sv_catpvn>, but also handles 'set' magic.
4451
4452=cut
4453*/
4454
79072805 4455void
864dbfa3 4456Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4457{
4458 sv_catpvn(sv,ptr,len);
4459 SvSETMAGIC(sv);
4460}
4461
954c1994
GS
4462/*
4463=for apidoc sv_catsv
4464
13e8c8e3
JH
4465Concatenates the string from SV C<ssv> onto the end of the string in
4466SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
4467not 'set' magic. See C<sv_catsv_mg>.
954c1994 4468
8d6d96c1
HS
4469=for apidoc sv_catsv_flags
4470
4471Concatenates the string from SV C<ssv> onto the end of the string in
4472SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
4473bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4474and C<sv_catsv_nomg> are implemented in terms of this function.
4475
4476=cut */
4477
ef50df4b 4478void
8d6d96c1 4479Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 4480{
13e8c8e3
JH
4481 char *spv;
4482 STRLEN slen;
46199a12 4483 if (!ssv)
79072805 4484 return;
46199a12 4485 if ((spv = SvPV(ssv, slen))) {
4fd84b44
AD
4486 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4487 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
8cf8f3d1
NIS
4488 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4489 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4fd84b44
AD
4490 dsv->sv_flags doesn't have that bit set.
4491 Andy Dougherty 12 Oct 2001
4492 */
4493 I32 sutf8 = DO_UTF8(ssv);
4494 I32 dutf8;
13e8c8e3 4495
8d6d96c1
HS
4496 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4497 mg_get(dsv);
4498 dutf8 = DO_UTF8(dsv);
4499
4500 if (dutf8 != sutf8) {
13e8c8e3 4501 if (dutf8) {
46199a12 4502 /* Not modifying source SV, so taking a temporary copy. */
8d6d96c1 4503 SV* csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 4504
46199a12 4505 sv_utf8_upgrade(csv);
8d6d96c1 4506 spv = SvPV(csv, slen);
13e8c8e3 4507 }
8d6d96c1
HS
4508 else
4509 sv_utf8_upgrade_nomg(dsv);
e84ff256 4510 }
8d6d96c1 4511 sv_catpvn_nomg(dsv, spv, slen);
560a288e 4512 }
79072805
LW
4513}
4514
954c1994
GS
4515/*
4516=for apidoc sv_catsv_mg
4517
4518Like C<sv_catsv>, but also handles 'set' magic.
4519
4520=cut
4521*/
4522
79072805 4523void
46199a12 4524Perl_sv_catsv_mg(pTHX_ SV *dsv, register SV *ssv)
ef50df4b 4525{
46199a12
JH
4526 sv_catsv(dsv,ssv);
4527 SvSETMAGIC(dsv);
ef50df4b
GS
4528}
4529
954c1994
GS
4530/*
4531=for apidoc sv_catpv
4532
4533Concatenates the string onto the end of the string which is in the SV.
d5ce4a7c
GA
4534If the SV has the UTF8 status set, then the bytes appended should be
4535valid UTF8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 4536
d5ce4a7c 4537=cut */
954c1994 4538
ef50df4b 4539void
0c981600 4540Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4541{
4542 register STRLEN len;
463ee0b2 4543 STRLEN tlen;
748a9306 4544 char *junk;
79072805 4545
0c981600 4546 if (!ptr)
79072805 4547 return;
748a9306 4548 junk = SvPV_force(sv, tlen);
0c981600 4549 len = strlen(ptr);
463ee0b2 4550 SvGROW(sv, tlen + len + 1);
0c981600
JH
4551 if (ptr == junk)
4552 ptr = SvPVX(sv);
4553 Move(ptr,SvPVX(sv)+tlen,len+1,char);
79072805 4554 SvCUR(sv) += len;
d41ff1b8 4555 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4556 SvTAINT(sv);
79072805
LW
4557}
4558
954c1994
GS
4559/*
4560=for apidoc sv_catpv_mg
4561
4562Like C<sv_catpv>, but also handles 'set' magic.
4563
4564=cut
4565*/
4566
ef50df4b 4567void
0c981600 4568Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 4569{
0c981600 4570 sv_catpv(sv,ptr);
ef50df4b
GS
4571 SvSETMAGIC(sv);
4572}
4573
645c22ef
DM
4574/*
4575=for apidoc newSV
4576
4577Create a new null SV, or if len > 0, create a new empty SVt_PV type SV
4578with an initial PV allocation of len+1. Normally accessed via the C<NEWSV>
4579macro.
4580
4581=cut
4582*/
4583
79072805 4584SV *
864dbfa3 4585Perl_newSV(pTHX_ STRLEN len)
79072805
LW
4586{
4587 register SV *sv;
1c846c1f 4588
4561caa4 4589 new_SV(sv);
79072805
LW
4590 if (len) {
4591 sv_upgrade(sv, SVt_PV);
4592 SvGROW(sv, len + 1);
4593 }
4594 return sv;
4595}
954c1994 4596/*
92110913 4597=for apidoc sv_magicext
954c1994 4598
68795e93 4599Adds magic to an SV, upgrading it if necessary. Applies the
92110913
NIS
4600supplied vtable and returns pointer to the magic added.
4601
4602Note that sv_magicext will allow things that sv_magic will not.
68795e93 4603In particular you can add magic to SvREADONLY SVs and and more than
92110913 4604one instance of the same 'how'
645c22ef 4605
92110913 4606I C<namelen> is greater then zero then a savepvn() I<copy> of C<name> is stored,
68795e93
NIS
4607if C<namelen> is zero then C<name> is stored as-is and - as another special
4608case - if C<(name && namelen == HEf_SVKEY)> then C<name> is assumed to contain
92110913
NIS
4609an C<SV*> and has its REFCNT incremented
4610
4611(This is now used as a subroutine by sv_magic.)
954c1994
GS
4612
4613=cut
4614*/
92110913
NIS
4615MAGIC *
4616Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, MGVTBL *vtable,
4617 const char* name, I32 namlen)
79072805
LW
4618{
4619 MAGIC* mg;
68795e93 4620
92110913
NIS
4621 if (SvTYPE(sv) < SVt_PVMG) {
4622 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 4623 }
79072805
LW
4624 Newz(702,mg, 1, MAGIC);
4625 mg->mg_moremagic = SvMAGIC(sv);
79072805 4626 SvMAGIC(sv) = mg;
75f9d97a 4627
18808301 4628 /* Some magic sontains a reference loop, where the sv and object refer to
bb03859b
RS
4629 each other. To prevent a reference loop that would prevent such
4630 objects being freed, we look for such loops and if we find one we
87f0b213
JH
4631 avoid incrementing the object refcount.
4632
4633 Note we cannot do this to avoid self-tie loops as intervening RV must
4634 have its REFCNT incremented to keep it in existence - instead we could
4635 special case them in sv_free() -- NI-S
4636
4637 */
14befaf4
DM
4638 if (!obj || obj == sv ||
4639 how == PERL_MAGIC_arylen ||
4640 how == PERL_MAGIC_qr ||
75f9d97a
JH
4641 (SvTYPE(obj) == SVt_PVGV &&
4642 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4643 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 4644 GvFORM(obj) == (CV*)sv)))
75f9d97a 4645 {
8990e307 4646 mg->mg_obj = obj;
75f9d97a 4647 }
85e6fe83 4648 else {
8990e307 4649 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
4650 mg->mg_flags |= MGf_REFCOUNTED;
4651 }
79072805 4652 mg->mg_type = how;
565764a8 4653 mg->mg_len = namlen;
9cbac4c7 4654 if (name) {
92110913 4655 if (namlen > 0)
1edc1566 4656 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 4657 else if (namlen == HEf_SVKEY)
1edc1566 4658 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
68795e93 4659 else
92110913 4660 mg->mg_ptr = (char *) name;
9cbac4c7 4661 }
92110913 4662 mg->mg_virtual = vtable;
68795e93 4663
92110913
NIS
4664 mg_magical(sv);
4665 if (SvGMAGICAL(sv))
4666 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4667 return mg;
4668}
4669
4670/*
4671=for apidoc sv_magic
1c846c1f 4672
92110913
NIS
4673Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4674then adds a new magic item of type C<how> to the head of the magic list.
4675
4676=cut
4677*/
4678
4679void
4680Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 4681{
92110913
NIS
4682 MAGIC* mg;
4683 MGVTBL *vtable = 0;
4684
765f542d
NC
4685#ifdef PERL_COPY_ON_WRITE
4686 if (SvIsCOW(sv))
4687 sv_force_normal_flags(sv, 0);
4688#endif
92110913
NIS
4689 if (SvREADONLY(sv)) {
4690 if (PL_curcop != &PL_compiling
4691 && how != PERL_MAGIC_regex_global
4692 && how != PERL_MAGIC_bm
4693 && how != PERL_MAGIC_fm
4694 && how != PERL_MAGIC_sv
4695 )
4696 {
4697 Perl_croak(aTHX_ PL_no_modify);
4698 }
4699 }
4700 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4701 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
4702 /* sv_magic() refuses to add a magic of the same 'how' as an
4703 existing one
92110913
NIS
4704 */
4705 if (how == PERL_MAGIC_taint)
4706 mg->mg_len |= 1;
4707 return;
4708 }
4709 }
68795e93 4710
79072805 4711 switch (how) {
14befaf4 4712 case PERL_MAGIC_sv:
92110913 4713 vtable = &PL_vtbl_sv;
79072805 4714 break;
14befaf4 4715 case PERL_MAGIC_overload:
92110913 4716 vtable = &PL_vtbl_amagic;
a0d0e21e 4717 break;
14befaf4 4718 case PERL_MAGIC_overload_elem:
92110913 4719 vtable = &PL_vtbl_amagicelem;
a0d0e21e 4720 break;
14befaf4 4721 case PERL_MAGIC_overload_table:
92110913 4722 vtable = &PL_vtbl_ovrld;
a0d0e21e 4723 break;
14befaf4 4724 case PERL_MAGIC_bm:
92110913 4725 vtable = &PL_vtbl_bm;
79072805 4726 break;
14befaf4 4727 case PERL_MAGIC_regdata:
92110913 4728 vtable = &PL_vtbl_regdata;
6cef1e77 4729 break;
14befaf4 4730 case PERL_MAGIC_regdatum:
92110913 4731 vtable = &PL_vtbl_regdatum;
6cef1e77 4732 break;
14befaf4 4733 case PERL_MAGIC_env:
92110913 4734 vtable = &PL_vtbl_env;
79072805 4735 break;
14befaf4 4736 case PERL_MAGIC_fm:
92110913 4737 vtable = &PL_vtbl_fm;
55497cff 4738 break;
14befaf4 4739 case PERL_MAGIC_envelem:
92110913 4740 vtable = &PL_vtbl_envelem;
79072805 4741 break;
14befaf4 4742 case PERL_MAGIC_regex_global:
92110913 4743 vtable = &PL_vtbl_mglob;
93a17b20 4744 break;
14befaf4 4745 case PERL_MAGIC_isa:
92110913 4746 vtable = &PL_vtbl_isa;
463ee0b2 4747 break;
14befaf4 4748 case PERL_MAGIC_isaelem:
92110913 4749 vtable = &PL_vtbl_isaelem;
463ee0b2 4750 break;
14befaf4 4751 case PERL_MAGIC_nkeys:
92110913 4752 vtable = &PL_vtbl_nkeys;
16660edb 4753 break;
14befaf4 4754 case PERL_MAGIC_dbfile:
92110913 4755 vtable = 0;
93a17b20 4756 break;
14befaf4 4757 case PERL_MAGIC_dbline:
92110913 4758 vtable = &PL_vtbl_dbline;
79072805 4759 break;
36477c24 4760#ifdef USE_LOCALE_COLLATE
14befaf4 4761 case PERL_MAGIC_collxfrm:
92110913 4762 vtable = &PL_vtbl_collxfrm;
bbce6d69 4763 break;
36477c24 4764#endif /* USE_LOCALE_COLLATE */
14befaf4 4765 case PERL_MAGIC_tied:
92110913 4766 vtable = &PL_vtbl_pack;
463ee0b2 4767 break;
14befaf4
DM
4768 case PERL_MAGIC_tiedelem:
4769 case PERL_MAGIC_tiedscalar:
92110913 4770 vtable = &PL_vtbl_packelem;
463ee0b2 4771 break;
14befaf4 4772 case PERL_MAGIC_qr:
92110913 4773 vtable = &PL_vtbl_regexp;
c277df42 4774 break;
14befaf4 4775 case PERL_MAGIC_sig:
92110913 4776 vtable = &PL_vtbl_sig;
79072805 4777 break;
14befaf4 4778 case PERL_MAGIC_sigelem:
92110913 4779 vtable = &PL_vtbl_sigelem;
79072805 4780 break;
14befaf4 4781 case PERL_MAGIC_taint:
92110913 4782 vtable = &PL_vtbl_taint;
463ee0b2 4783 break;
14befaf4 4784 case PERL_MAGIC_uvar:
92110913 4785 vtable = &PL_vtbl_uvar;
79072805 4786 break;
14befaf4 4787 case PERL_MAGIC_vec:
92110913 4788 vtable = &PL_vtbl_vec;
79072805 4789 break;
ece467f9
JP
4790 case PERL_MAGIC_vstring:
4791 vtable = 0;
4792 break;
14befaf4 4793 case PERL_MAGIC_substr:
92110913 4794 vtable = &PL_vtbl_substr;
79072805 4795 break;
14befaf4 4796 case PERL_MAGIC_defelem:
92110913 4797 vtable = &PL_vtbl_defelem;
5f05dabc 4798 break;
14befaf4 4799 case PERL_MAGIC_glob:
92110913 4800 vtable = &PL_vtbl_glob;
79072805 4801 break;
14befaf4 4802 case PERL_MAGIC_arylen:
92110913 4803 vtable = &PL_vtbl_arylen;
79072805 4804 break;
14befaf4 4805 case PERL_MAGIC_pos:
92110913 4806 vtable = &PL_vtbl_pos;
a0d0e21e 4807 break;
14befaf4 4808 case PERL_MAGIC_backref:
92110913 4809 vtable = &PL_vtbl_backref;
810b8aa5 4810 break;
14befaf4
DM
4811 case PERL_MAGIC_ext:
4812 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
4813 /* Useful for attaching extension internal data to perl vars. */
4814 /* Note that multiple extensions may clash if magical scalars */
4815 /* etc holding private data from one are passed to another. */
a0d0e21e 4816 break;
79072805 4817 default:
14befaf4 4818 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 4819 }
68795e93 4820
92110913
NIS
4821 /* Rest of work is done else where */
4822 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 4823
92110913
NIS
4824 switch (how) {
4825 case PERL_MAGIC_taint:
4826 mg->mg_len = 1;
4827 break;
4828 case PERL_MAGIC_ext:
4829 case PERL_MAGIC_dbfile:
4830 SvRMAGICAL_on(sv);
4831 break;
4832 }
463ee0b2
LW
4833}
4834
c461cf8f
JH
4835/*
4836=for apidoc sv_unmagic
4837
645c22ef 4838Removes all magic of type C<type> from an SV.
c461cf8f
JH
4839
4840=cut
4841*/
4842
463ee0b2 4843int
864dbfa3 4844Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
4845{
4846 MAGIC* mg;
4847 MAGIC** mgp;
91bba347 4848 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
4849 return 0;
4850 mgp = &SvMAGIC(sv);
4851 for (mg = *mgp; mg; mg = *mgp) {
4852 if (mg->mg_type == type) {
4853 MGVTBL* vtbl = mg->mg_virtual;
4854 *mgp = mg->mg_moremagic;
1d7c1841 4855 if (vtbl && vtbl->svt_free)
fc0dc3b3 4856 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 4857 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 4858 if (mg->mg_len > 0)
1edc1566 4859 Safefree(mg->mg_ptr);
565764a8 4860 else if (mg->mg_len == HEf_SVKEY)
1edc1566 4861 SvREFCNT_dec((SV*)mg->mg_ptr);
9cbac4c7 4862 }
a0d0e21e
LW
4863 if (mg->mg_flags & MGf_REFCOUNTED)
4864 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
4865 Safefree(mg);
4866 }
4867 else
4868 mgp = &mg->mg_moremagic;
79072805 4869 }
91bba347 4870 if (!SvMAGIC(sv)) {
463ee0b2 4871 SvMAGICAL_off(sv);
06759ea0 4872 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
4873 }
4874
4875 return 0;
79072805
LW
4876}
4877
c461cf8f
JH
4878/*
4879=for apidoc sv_rvweaken
4880
645c22ef
DM
4881Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
4882referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
4883push a back-reference to this RV onto the array of backreferences
4884associated with that magic.
c461cf8f
JH
4885
4886=cut
4887*/
4888
810b8aa5 4889SV *
864dbfa3 4890Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
4891{
4892 SV *tsv;
4893 if (!SvOK(sv)) /* let undefs pass */
4894 return sv;
4895 if (!SvROK(sv))
cea2e8a9 4896 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 4897 else if (SvWEAKREF(sv)) {
810b8aa5 4898 if (ckWARN(WARN_MISC))
9014280d 4899 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
4900 return sv;
4901 }
4902 tsv = SvRV(sv);
4903 sv_add_backref(tsv, sv);
4904 SvWEAKREF_on(sv);
1c846c1f 4905 SvREFCNT_dec(tsv);
810b8aa5
GS
4906 return sv;
4907}
4908
645c22ef
DM
4909/* Give tsv backref magic if it hasn't already got it, then push a
4910 * back-reference to sv onto the array associated with the backref magic.
4911 */
4912
810b8aa5 4913STATIC void
cea2e8a9 4914S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
4915{
4916 AV *av;
4917 MAGIC *mg;
14befaf4 4918 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, PERL_MAGIC_backref)))
810b8aa5
GS
4919 av = (AV*)mg->mg_obj;
4920 else {
4921 av = newAV();
14befaf4 4922 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
810b8aa5
GS
4923 SvREFCNT_dec(av); /* for sv_magic */
4924 }
4925 av_push(av,sv);
4926}
4927
645c22ef
DM
4928/* delete a back-reference to ourselves from the backref magic associated
4929 * with the SV we point to.
4930 */
4931
1c846c1f 4932STATIC void
cea2e8a9 4933S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
4934{
4935 AV *av;
4936 SV **svp;
4937 I32 i;
4938 SV *tsv = SvRV(sv);
c04a4dfe 4939 MAGIC *mg = NULL;
14befaf4 4940 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, PERL_MAGIC_backref)))
cea2e8a9 4941 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
4942 av = (AV *)mg->mg_obj;
4943 svp = AvARRAY(av);
4944 i = AvFILLp(av);
4945 while (i >= 0) {
4946 if (svp[i] == sv) {
4947 svp[i] = &PL_sv_undef; /* XXX */
4948 }
4949 i--;
4950 }
4951}
4952
954c1994
GS
4953/*
4954=for apidoc sv_insert
4955
4956Inserts a string at the specified offset/length within the SV. Similar to
4957the Perl substr() function.
4958
4959=cut
4960*/
4961
79072805 4962void
864dbfa3 4963Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
79072805
LW
4964{
4965 register char *big;
4966 register char *mid;
4967 register char *midend;
4968 register char *bigend;
4969 register I32 i;
6ff81951 4970 STRLEN curlen;
1c846c1f 4971
79072805 4972
8990e307 4973 if (!bigstr)
cea2e8a9 4974 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 4975 SvPV_force(bigstr, curlen);
60fa28ff 4976 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
4977 if (offset + len > curlen) {
4978 SvGROW(bigstr, offset+len+1);
4979 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
4980 SvCUR_set(bigstr, offset+len);
4981 }
79072805 4982
69b47968 4983 SvTAINT(bigstr);
79072805
LW
4984 i = littlelen - len;
4985 if (i > 0) { /* string might grow */
a0d0e21e 4986 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
4987 mid = big + offset + len;
4988 midend = bigend = big + SvCUR(bigstr);
4989 bigend += i;
4990 *bigend = '\0';
4991 while (midend > mid) /* shove everything down */
4992 *--bigend = *--midend;
4993 Move(little,big+offset,littlelen,char);
4994 SvCUR(bigstr) += i;
4995 SvSETMAGIC(bigstr);
4996 return;
4997 }
4998 else if (i == 0) {
463ee0b2 4999 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
5000 SvSETMAGIC(bigstr);
5001 return;
5002 }
5003
463ee0b2 5004 big = SvPVX(bigstr);
79072805
LW
5005 mid = big + offset;
5006 midend = mid + len;
5007 bigend = big + SvCUR(bigstr);
5008
5009 if (midend > bigend)
cea2e8a9 5010 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5011
5012 if (mid - big > bigend - midend) { /* faster to shorten from end */
5013 if (littlelen) {
5014 Move(little, mid, littlelen,char);
5015 mid += littlelen;
5016 }
5017 i = bigend - midend;
5018 if (i > 0) {
5019 Move(midend, mid, i,char);
5020 mid += i;
5021 }
5022 *mid = '\0';
5023 SvCUR_set(bigstr, mid - big);
5024 }
5025 /*SUPPRESS 560*/
155aba94 5026 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5027 midend -= littlelen;
5028 mid = midend;
5029 sv_chop(bigstr,midend-i);
5030 big += i;
5031 while (i--)
5032 *--midend = *--big;
5033 if (littlelen)
5034 Move(little, mid, littlelen,char);
5035 }
5036 else if (littlelen) {
5037 midend -= littlelen;
5038 sv_chop(bigstr,midend);
5039 Move(little,midend,littlelen,char);
5040 }
5041 else {
5042 sv_chop(bigstr,midend);
5043 }
5044 SvSETMAGIC(bigstr);
5045}
5046
c461cf8f
JH
5047/*
5048=for apidoc sv_replace
5049
5050Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5051The target SV physically takes over ownership of the body of the source SV
5052and inherits its flags; however, the target keeps any magic it owns,
5053and any magic in the source is discarded.
ff276b08 5054Note that this is a rather specialist SV copying operation; most of the
645c22ef 5055time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5056
5057=cut
5058*/
79072805
LW
5059
5060void
864dbfa3 5061Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805
LW
5062{
5063 U32 refcnt = SvREFCNT(sv);
765f542d 5064 SV_CHECK_THINKFIRST_COW_DROP(sv);
0453d815 5065 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
9014280d 5066 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
93a17b20 5067 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5068 if (SvMAGICAL(nsv))
5069 mg_free(nsv);
5070 else
5071 sv_upgrade(nsv, SVt_PVMG);
93a17b20 5072 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 5073 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
5074 SvMAGICAL_off(sv);
5075 SvMAGIC(sv) = 0;
5076 }
79072805
LW
5077 SvREFCNT(sv) = 0;
5078 sv_clear(sv);
477f5d66 5079 assert(!SvREFCNT(sv));
79072805 5080 StructCopy(nsv,sv,SV);
d3d0e6f1
NC
5081#ifdef PERL_COPY_ON_WRITE
5082 if (SvIsCOW_normal(nsv)) {
5083 /* We need to follow the pointers around the loop to make the
5084 previous SV point to sv, rather than nsv. */
5085 SV *next;
5086 SV *current = nsv;
5087 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5088 assert(next);
5089 current = next;
5090 assert(SvPVX(current) == SvPVX(nsv));
5091 }
5092 /* Make the SV before us point to the SV after us. */
5093 if (DEBUG_C_TEST) {
5094 PerlIO_printf(Perl_debug_log, "previous is\n");
5095 sv_dump(current);
a29f6d03
NC
5096 PerlIO_printf(Perl_debug_log,
5097 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5098 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5099 }
a29f6d03 5100 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5101 }
5102#endif
79072805 5103 SvREFCNT(sv) = refcnt;
1edc1566 5104 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
463ee0b2 5105 del_SV(nsv);
79072805
LW
5106}
5107
c461cf8f
JH
5108/*
5109=for apidoc sv_clear
5110
645c22ef
DM
5111Clear an SV: call any destructors, free up any memory used by the body,
5112and free the body itself. The SV's head is I<not> freed, although
5113its type is set to all 1's so that it won't inadvertently be assumed
5114to be live during global destruction etc.
5115This function should only be called when REFCNT is zero. Most of the time
5116you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5117instead.
c461cf8f
JH
5118
5119=cut
5120*/
5121
79072805 5122void
864dbfa3 5123Perl_sv_clear(pTHX_ register SV *sv)
79072805 5124{
ec12f114 5125 HV* stash;
79072805
LW
5126 assert(sv);
5127 assert(SvREFCNT(sv) == 0);
5128
ed6116ce 5129 if (SvOBJECT(sv)) {
3280af22 5130 if (PL_defstash) { /* Still have a symbol table? */
39644a26 5131 dSP;
32251b26 5132 CV* destructor;
837485b6 5133 SV tmpref;
a0d0e21e 5134
837485b6
GS
5135 Zero(&tmpref, 1, SV);
5136 sv_upgrade(&tmpref, SVt_RV);
5137 SvROK_on(&tmpref);
5138 SvREADONLY_on(&tmpref); /* DESTROY() could be naughty */
5139 SvREFCNT(&tmpref) = 1;
8ebc5c01 5140
d460ef45 5141 do {
4e8e7886 5142 stash = SvSTASH(sv);
32251b26 5143 destructor = StashHANDLER(stash,DESTROY);
4e8e7886
GS
5144 if (destructor) {
5145 ENTER;
e788e7d3 5146 PUSHSTACKi(PERLSI_DESTROY);
837485b6 5147 SvRV(&tmpref) = SvREFCNT_inc(sv);
4e8e7886
GS
5148 EXTEND(SP, 2);
5149 PUSHMARK(SP);
837485b6 5150 PUSHs(&tmpref);
4e8e7886 5151 PUTBACK;
32251b26 5152 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR);
4e8e7886 5153 SvREFCNT(sv)--;
d3acc0f7 5154 POPSTACK;
3095d977 5155 SPAGAIN;
4e8e7886
GS
5156 LEAVE;
5157 }
5158 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5159
837485b6 5160 del_XRV(SvANY(&tmpref));
6f44e0a4
JP
5161
5162 if (SvREFCNT(sv)) {
5163 if (PL_in_clean_objs)
cea2e8a9 5164 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
6f44e0a4
JP
5165 HvNAME(stash));
5166 /* DESTROY gave object new lease on life */
5167 return;
5168 }
a0d0e21e 5169 }
4e8e7886 5170
a0d0e21e 5171 if (SvOBJECT(sv)) {
4e8e7886 5172 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
5173 SvOBJECT_off(sv); /* Curse the object. */
5174 if (SvTYPE(sv) != SVt_PVIO)
3280af22 5175 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5176 }
463ee0b2 5177 }
524189f1
JH
5178 if (SvTYPE(sv) >= SVt_PVMG) {
5179 if (SvMAGIC(sv))
5180 mg_free(sv);
5181 if (SvFLAGS(sv) & SVpad_TYPED)
5182 SvREFCNT_dec(SvSTASH(sv));
5183 }
ec12f114 5184 stash = NULL;
79072805 5185 switch (SvTYPE(sv)) {
8990e307 5186 case SVt_PVIO:
df0bd2f4
GS
5187 if (IoIFP(sv) &&
5188 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5189 IoIFP(sv) != PerlIO_stdout() &&
5190 IoIFP(sv) != PerlIO_stderr())
93578b34 5191 {
f2b5be74 5192 io_close((IO*)sv, FALSE);
93578b34 5193 }
1d7c1841 5194 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5195 PerlDir_close(IoDIRP(sv));
1d7c1841 5196 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5197 Safefree(IoTOP_NAME(sv));
5198 Safefree(IoFMT_NAME(sv));
5199 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 5200 /* FALL THROUGH */
79072805 5201 case SVt_PVBM:
a0d0e21e 5202 goto freescalar;
79072805 5203 case SVt_PVCV:
748a9306 5204 case SVt_PVFM:
85e6fe83 5205 cv_undef((CV*)sv);
a0d0e21e 5206 goto freescalar;
79072805 5207 case SVt_PVHV:
85e6fe83 5208 hv_undef((HV*)sv);
a0d0e21e 5209 break;
79072805 5210 case SVt_PVAV:
85e6fe83 5211 av_undef((AV*)sv);
a0d0e21e 5212 break;
02270b4e
GS
5213 case SVt_PVLV:
5214 SvREFCNT_dec(LvTARG(sv));
5215 goto freescalar;
a0d0e21e 5216 case SVt_PVGV:
1edc1566 5217 gp_free((GV*)sv);
a0d0e21e 5218 Safefree(GvNAME(sv));
ec12f114
JPC
5219 /* cannot decrease stash refcount yet, as we might recursively delete
5220 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
5221 of stash until current sv is completely gone.
5222 -- JohnPC, 27 Mar 1998 */
5223 stash = GvSTASH(sv);
a0d0e21e 5224 /* FALL THROUGH */
79072805 5225 case SVt_PVMG:
79072805
LW
5226 case SVt_PVNV:
5227 case SVt_PVIV:
a0d0e21e
LW
5228 freescalar:
5229 (void)SvOOK_off(sv);
79072805
LW
5230 /* FALL THROUGH */
5231 case SVt_PV:
a0d0e21e 5232 case SVt_RV:
810b8aa5
GS
5233 if (SvROK(sv)) {
5234 if (SvWEAKREF(sv))
5235 sv_del_backref(sv);
5236 else
5237 SvREFCNT_dec(SvRV(sv));
5238 }
765f542d
NC
5239#ifdef PERL_COPY_ON_WRITE
5240 else if (SvPVX(sv)) {
5241 if (SvIsCOW(sv)) {
5242 /* I believe I need to grab the global SV mutex here and
5243 then recheck the COW status. */
46187eeb
NC
5244 if (DEBUG_C_TEST) {
5245 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5246 sv_dump(sv);
46187eeb 5247 }
e419cbc5 5248 sv_release_COW(sv, SvPVX(sv), SvCUR(sv), SvLEN(sv),
765f542d
NC
5249 SvUVX(sv), SV_COW_NEXT_SV(sv));
5250 /* And drop it here. */
5251 SvFAKE_off(sv);
5252 } else if (SvLEN(sv)) {
5253 Safefree(SvPVX(sv));
5254 }
5255 }
5256#else
1edc1566 5257 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 5258 Safefree(SvPVX(sv));
1c846c1f 5259 else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
25716404
GS
5260 unsharepvn(SvPVX(sv),
5261 SvUTF8(sv) ? -(I32)SvCUR(sv) : SvCUR(sv),
5262 SvUVX(sv));
1c846c1f
NIS
5263 SvFAKE_off(sv);
5264 }
765f542d 5265#endif
79072805 5266 break;
a0d0e21e 5267/*
79072805 5268 case SVt_NV:
79072805 5269 case SVt_IV:
79072805
LW
5270 case SVt_NULL:
5271 break;
a0d0e21e 5272*/
79072805
LW
5273 }
5274
5275 switch (SvTYPE(sv)) {
5276 case SVt_NULL:
5277 break;
79072805
LW
5278 case SVt_IV:
5279 del_XIV(SvANY(sv));
5280 break;
5281 case SVt_NV:
5282 del_XNV(SvANY(sv));
5283 break;
ed6116ce
LW
5284 case SVt_RV:
5285 del_XRV(SvANY(sv));
5286 break;
79072805
LW
5287 case SVt_PV:
5288 del_XPV(SvANY(sv));
5289 break;
5290 case SVt_PVIV:
5291 del_XPVIV(SvANY(sv));
5292 break;
5293 case SVt_PVNV:
5294 del_XPVNV(SvANY(sv));
5295 break;
5296 case SVt_PVMG:
5297 del_XPVMG(SvANY(sv));
5298 break;
5299 case SVt_PVLV:
5300 del_XPVLV(SvANY(sv));
5301 break;
5302 case SVt_PVAV:
5303 del_XPVAV(SvANY(sv));
5304 break;
5305 case SVt_PVHV:
5306 del_XPVHV(SvANY(sv));
5307 break;
5308 case SVt_PVCV:
5309 del_XPVCV(SvANY(sv));
5310 break;
5311 case SVt_PVGV:
5312 del_XPVGV(SvANY(sv));
ec12f114
JPC
5313 /* code duplication for increased performance. */
5314 SvFLAGS(sv) &= SVf_BREAK;
5315 SvFLAGS(sv) |= SVTYPEMASK;
5316 /* decrease refcount of the stash that owns this GV, if any */
5317 if (stash)
5318 SvREFCNT_dec(stash);
5319 return; /* not break, SvFLAGS reset already happened */
79072805
LW
5320 case SVt_PVBM:
5321 del_XPVBM(SvANY(sv));
5322 break;
5323 case SVt_PVFM:
5324 del_XPVFM(SvANY(sv));
5325 break;
8990e307
LW
5326 case SVt_PVIO:
5327 del_XPVIO(SvANY(sv));
5328 break;
79072805 5329 }
a0d0e21e 5330 SvFLAGS(sv) &= SVf_BREAK;
8990e307 5331 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
5332}
5333
645c22ef
DM
5334/*
5335=for apidoc sv_newref
5336
5337Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5338instead.
5339
5340=cut
5341*/
5342
79072805 5343SV *
864dbfa3 5344Perl_sv_newref(pTHX_ SV *sv)
79072805 5345{
463ee0b2 5346 if (sv)
dce16143 5347 ATOMIC_INC(SvREFCNT(sv));
79072805
LW
5348 return sv;
5349}
5350
c461cf8f
JH
5351/*
5352=for apidoc sv_free
5353
645c22ef
DM
5354Decrement an SV's reference count, and if it drops to zero, call
5355C<sv_clear> to invoke destructors and free up any memory used by
5356the body; finally, deallocate the SV's head itself.
5357Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5358
5359=cut
5360*/
5361
79072805 5362void
864dbfa3 5363Perl_sv_free(pTHX_ SV *sv)
79072805 5364{
dce16143
MB
5365 int refcount_is_zero;
5366
79072805
LW
5367 if (!sv)
5368 return;
a0d0e21e
LW
5369 if (SvREFCNT(sv) == 0) {
5370 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5371 /* this SV's refcnt has been artificially decremented to
5372 * trigger cleanup */
a0d0e21e 5373 return;
3280af22 5374 if (PL_in_clean_all) /* All is fair */
1edc1566 5375 return;
d689ffdd
JP
5376 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5377 /* make sure SvREFCNT(sv)==0 happens very seldom */
5378 SvREFCNT(sv) = (~(U32)0)/2;
5379 return;
5380 }
0453d815 5381 if (ckWARN_d(WARN_INTERNAL))
9014280d 5382 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Attempt to free unreferenced scalar");
79072805
LW
5383 return;
5384 }
dce16143 5385 ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
b881518d 5386 if (!refcount_is_zero)
8990e307 5387 return;
463ee0b2
LW
5388#ifdef DEBUGGING
5389 if (SvTEMP(sv)) {
0453d815 5390 if (ckWARN_d(WARN_DEBUGGING))
9014280d 5391 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
1d7c1841
GS
5392 "Attempt to free temp prematurely: SV 0x%"UVxf,
5393 PTR2UV(sv));
79072805 5394 return;
79072805 5395 }
463ee0b2 5396#endif
d689ffdd
JP
5397 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5398 /* make sure SvREFCNT(sv)==0 happens very seldom */
5399 SvREFCNT(sv) = (~(U32)0)/2;
5400 return;
5401 }
79072805 5402 sv_clear(sv);
477f5d66
CS
5403 if (! SvREFCNT(sv))
5404 del_SV(sv);
79072805
LW
5405}
5406
954c1994
GS
5407/*
5408=for apidoc sv_len
5409
645c22ef
DM
5410Returns the length of the string in the SV. Handles magic and type
5411coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5412
5413=cut
5414*/
5415
79072805 5416STRLEN
864dbfa3 5417Perl_sv_len(pTHX_ register SV *sv)
79072805 5418{
463ee0b2 5419 STRLEN len;
79072805
LW
5420
5421 if (!sv)
5422 return 0;
5423
8990e307 5424 if (SvGMAGICAL(sv))
565764a8 5425 len = mg_length(sv);
8990e307 5426 else
497b47a8 5427 (void)SvPV(sv, len);
463ee0b2 5428 return len;
79072805
LW
5429}
5430
c461cf8f
JH
5431/*
5432=for apidoc sv_len_utf8
5433
5434Returns the number of characters in the string in an SV, counting wide
645c22ef 5435UTF8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5436
5437=cut
5438*/
5439
a0ed51b3 5440STRLEN
864dbfa3 5441Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 5442{
a0ed51b3
LW
5443 if (!sv)
5444 return 0;
5445
a0ed51b3 5446 if (SvGMAGICAL(sv))
b76347f2 5447 return mg_length(sv);
a0ed51b3 5448 else
b76347f2
JH
5449 {
5450 STRLEN len;
5451 U8 *s = (U8*)SvPV(sv, len);
5452
d6efbbad 5453 return Perl_utf8_length(aTHX_ s, s + len);
a0ed51b3 5454 }
a0ed51b3
LW
5455}
5456
645c22ef
DM
5457/*
5458=for apidoc sv_pos_u2b
5459
5460Converts the value pointed to by offsetp from a count of UTF8 chars from
5461the start of the string, to a count of the equivalent number of bytes; if
5462lenp is non-zero, it does the same to lenp, but this time starting from
5463the offset, rather than from the start of the string. Handles magic and
5464type coercion.
5465
5466=cut
5467*/
5468
a0ed51b3 5469void
864dbfa3 5470Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 5471{
dfe13c55
GS
5472 U8 *start;
5473 U8 *s;
5474 U8 *send;
a0ed51b3
LW
5475 I32 uoffset = *offsetp;
5476 STRLEN len;
5477
5478 if (!sv)
5479 return;
5480
dfe13c55 5481 start = s = (U8*)SvPV(sv, len);
a0ed51b3
LW
5482 send = s + len;
5483 while (s < send && uoffset--)
5484 s += UTF8SKIP(s);
bb40f870
GA
5485 if (s >= send)
5486 s = send;
a0ed51b3
LW
5487 *offsetp = s - start;
5488 if (lenp) {
5489 I32 ulen = *lenp;
5490 start = s;
5491 while (s < send && ulen--)
5492 s += UTF8SKIP(s);
bb40f870
GA
5493 if (s >= send)
5494 s = send;
a0ed51b3
LW
5495 *lenp = s - start;
5496 }
5497 return;
5498}
5499
645c22ef
DM
5500/*
5501=for apidoc sv_pos_b2u
5502
5503Converts the value pointed to by offsetp from a count of bytes from the
5504start of the string, to a count of the equivalent number of UTF8 chars.
5505Handles magic and type coercion.
5506
5507=cut
5508*/
5509
a0ed51b3 5510void
864dbfa3 5511Perl_sv_pos_b2u(pTHX_ register SV *sv, I32* offsetp)
a0ed51b3 5512{
dfe13c55
GS
5513 U8 *s;
5514 U8 *send;
a0ed51b3
LW
5515 STRLEN len;
5516
5517 if (!sv)
5518 return;
5519
dfe13c55 5520 s = (U8*)SvPV(sv, len);
eb160463 5521 if ((I32)len < *offsetp)
a0dbb045 5522 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
a0ed51b3
LW
5523 send = s + *offsetp;
5524 len = 0;
5525 while (s < send) {
cc07378b
JH
5526 STRLEN n = 1;
5527 /* Call utf8n_to_uvchr() to validate the sequence
5528 * (unless a simple non-UTF character) */
5529 if (!UTF8_IS_INVARIANT(*s))
5530 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
2b9d42f0 5531 if (n > 0) {
a0dbb045
JH
5532 s += n;
5533 len++;
5534 }
5535 else
5536 break;
a0ed51b3
LW
5537 }
5538 *offsetp = len;
5539 return;
5540}
5541
954c1994
GS
5542/*
5543=for apidoc sv_eq
5544
5545Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
5546identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5547coerce its args to strings if necessary.
954c1994
GS
5548
5549=cut
5550*/
5551
79072805 5552I32
e01b9e88 5553Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805
LW
5554{
5555 char *pv1;
463ee0b2 5556 STRLEN cur1;
79072805 5557 char *pv2;
463ee0b2 5558 STRLEN cur2;
e01b9e88 5559 I32 eq = 0;
553e1bcc
AT
5560 char *tpv = Nullch;
5561 SV* svrecode = Nullsv;
79072805 5562
e01b9e88 5563 if (!sv1) {
79072805
LW
5564 pv1 = "";
5565 cur1 = 0;
5566 }
463ee0b2 5567 else
e01b9e88 5568 pv1 = SvPV(sv1, cur1);
79072805 5569
e01b9e88
SC
5570 if (!sv2){
5571 pv2 = "";
5572 cur2 = 0;
92d29cee 5573 }
e01b9e88
SC
5574 else
5575 pv2 = SvPV(sv2, cur2);
79072805 5576
cf48d248 5577 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
5578 /* Differing utf8ness.
5579 * Do not UTF8size the comparands as a side-effect. */
5580 if (PL_encoding) {
5581 if (SvUTF8(sv1)) {
553e1bcc
AT
5582 svrecode = newSVpvn(pv2, cur2);
5583 sv_recode_to_utf8(svrecode, PL_encoding);
5584 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
5585 }
5586 else {
553e1bcc
AT
5587 svrecode = newSVpvn(pv1, cur1);
5588 sv_recode_to_utf8(svrecode, PL_encoding);
5589 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
5590 }
5591 /* Now both are in UTF-8. */
5592 if (cur1 != cur2)
5593 return FALSE;
5594 }
5595 else {
5596 bool is_utf8 = TRUE;
5597
5598 if (SvUTF8(sv1)) {
5599 /* sv1 is the UTF-8 one,
5600 * if is equal it must be downgrade-able */
5601 char *pv = (char*)bytes_from_utf8((U8*)pv1,
5602 &cur1, &is_utf8);
5603 if (pv != pv1)
553e1bcc 5604 pv1 = tpv = pv;
799ef3cb
JH
5605 }
5606 else {
5607 /* sv2 is the UTF-8 one,
5608 * if is equal it must be downgrade-able */
5609 char *pv = (char *)bytes_from_utf8((U8*)pv2,
5610 &cur2, &is_utf8);
5611 if (pv != pv2)
553e1bcc 5612 pv2 = tpv = pv;
799ef3cb
JH
5613 }
5614 if (is_utf8) {
5615 /* Downgrade not possible - cannot be eq */
5616 return FALSE;
5617 }
5618 }
cf48d248
JH
5619 }
5620
5621 if (cur1 == cur2)
765f542d 5622 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 5623
553e1bcc
AT
5624 if (svrecode)
5625 SvREFCNT_dec(svrecode);
799ef3cb 5626
553e1bcc
AT
5627 if (tpv)
5628 Safefree(tpv);
cf48d248 5629
e01b9e88 5630 return eq;
79072805
LW
5631}
5632
954c1994
GS
5633/*
5634=for apidoc sv_cmp
5635
5636Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
5637string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
5638C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5639coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
5640
5641=cut
5642*/
5643
79072805 5644I32
e01b9e88 5645Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 5646{
560a288e 5647 STRLEN cur1, cur2;
553e1bcc 5648 char *pv1, *pv2, *tpv = Nullch;
cf48d248 5649 I32 cmp;
553e1bcc 5650 SV *svrecode = Nullsv;
560a288e 5651
e01b9e88
SC
5652 if (!sv1) {
5653 pv1 = "";
560a288e
GS
5654 cur1 = 0;
5655 }
e01b9e88
SC
5656 else
5657 pv1 = SvPV(sv1, cur1);
560a288e 5658
553e1bcc 5659 if (!sv2) {
e01b9e88 5660 pv2 = "";
560a288e
GS
5661 cur2 = 0;
5662 }
e01b9e88
SC
5663 else
5664 pv2 = SvPV(sv2, cur2);
79072805 5665
cf48d248 5666 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
5667 /* Differing utf8ness.
5668 * Do not UTF8size the comparands as a side-effect. */
cf48d248 5669 if (SvUTF8(sv1)) {
799ef3cb 5670 if (PL_encoding) {
553e1bcc
AT
5671 svrecode = newSVpvn(pv2, cur2);
5672 sv_recode_to_utf8(svrecode, PL_encoding);
5673 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
5674 }
5675 else {
553e1bcc 5676 pv2 = tpv = (char*)bytes_to_utf8((U8*)pv2, &cur2);
799ef3cb 5677 }
cf48d248
JH
5678 }
5679 else {
799ef3cb 5680 if (PL_encoding) {
553e1bcc
AT
5681 svrecode = newSVpvn(pv1, cur1);
5682 sv_recode_to_utf8(svrecode, PL_encoding);
5683 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
5684 }
5685 else {
553e1bcc 5686 pv1 = tpv = (char*)bytes_to_utf8((U8*)pv1, &cur1);
799ef3cb 5687 }
cf48d248
JH
5688 }
5689 }
5690
e01b9e88 5691 if (!cur1) {
cf48d248 5692 cmp = cur2 ? -1 : 0;
e01b9e88 5693 } else if (!cur2) {
cf48d248
JH
5694 cmp = 1;
5695 } else {
5696 I32 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
5697
5698 if (retval) {
cf48d248 5699 cmp = retval < 0 ? -1 : 1;
e01b9e88 5700 } else if (cur1 == cur2) {
cf48d248
JH
5701 cmp = 0;
5702 } else {
5703 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 5704 }
cf48d248 5705 }
16660edb 5706
553e1bcc
AT
5707 if (svrecode)
5708 SvREFCNT_dec(svrecode);
799ef3cb 5709
553e1bcc
AT
5710 if (tpv)
5711 Safefree(tpv);
cf48d248
JH
5712
5713 return cmp;
bbce6d69 5714}
16660edb 5715
c461cf8f
JH
5716/*
5717=for apidoc sv_cmp_locale
5718
645c22ef
DM
5719Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
5720'use bytes' aware, handles get magic, and will coerce its args to strings
5721if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
5722
5723=cut
5724*/
5725
bbce6d69 5726I32
864dbfa3 5727Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 5728{
36477c24 5729#ifdef USE_LOCALE_COLLATE
16660edb 5730
bbce6d69 5731 char *pv1, *pv2;
5732 STRLEN len1, len2;
5733 I32 retval;
16660edb 5734
3280af22 5735 if (PL_collation_standard)
bbce6d69 5736 goto raw_compare;
16660edb 5737
bbce6d69 5738 len1 = 0;
8ac85365 5739 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 5740 len2 = 0;
8ac85365 5741 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 5742
bbce6d69 5743 if (!pv1 || !len1) {
5744 if (pv2 && len2)
5745 return -1;
5746 else
5747 goto raw_compare;
5748 }
5749 else {
5750 if (!pv2 || !len2)
5751 return 1;
5752 }
16660edb 5753
bbce6d69 5754 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 5755
bbce6d69 5756 if (retval)
16660edb 5757 return retval < 0 ? -1 : 1;
5758
bbce6d69 5759 /*
5760 * When the result of collation is equality, that doesn't mean
5761 * that there are no differences -- some locales exclude some
5762 * characters from consideration. So to avoid false equalities,
5763 * we use the raw string as a tiebreaker.
5764 */
16660edb 5765
bbce6d69 5766 raw_compare:
5767 /* FALL THROUGH */
16660edb 5768
36477c24 5769#endif /* USE_LOCALE_COLLATE */
16660edb 5770
bbce6d69 5771 return sv_cmp(sv1, sv2);
5772}
79072805 5773
645c22ef 5774
36477c24 5775#ifdef USE_LOCALE_COLLATE
645c22ef 5776
7a4c00b4 5777/*
645c22ef
DM
5778=for apidoc sv_collxfrm
5779
5780Add Collate Transform magic to an SV if it doesn't already have it.
5781
5782Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
5783scalar data of the variable, but transformed to such a format that a normal
5784memory comparison can be used to compare the data according to the locale
5785settings.
5786
5787=cut
5788*/
5789
bbce6d69 5790char *
864dbfa3 5791Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 5792{
7a4c00b4 5793 MAGIC *mg;
16660edb 5794
14befaf4 5795 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 5796 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 5797 char *s, *xf;
5798 STRLEN len, xlen;
5799
7a4c00b4 5800 if (mg)
5801 Safefree(mg->mg_ptr);
bbce6d69 5802 s = SvPV(sv, len);
5803 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 5804 if (SvREADONLY(sv)) {
5805 SAVEFREEPV(xf);
5806 *nxp = xlen;
3280af22 5807 return xf + sizeof(PL_collation_ix);
ff0cee69 5808 }
7a4c00b4 5809 if (! mg) {
14befaf4
DM
5810 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
5811 mg = mg_find(sv, PERL_MAGIC_collxfrm);
7a4c00b4 5812 assert(mg);
bbce6d69 5813 }
7a4c00b4 5814 mg->mg_ptr = xf;
565764a8 5815 mg->mg_len = xlen;
7a4c00b4 5816 }
5817 else {
ff0cee69 5818 if (mg) {
5819 mg->mg_ptr = NULL;
565764a8 5820 mg->mg_len = -1;
ff0cee69 5821 }
bbce6d69 5822 }
5823 }
7a4c00b4 5824 if (mg && mg->mg_ptr) {
565764a8 5825 *nxp = mg->mg_len;
3280af22 5826 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 5827 }
5828 else {
5829 *nxp = 0;
5830 return NULL;
16660edb 5831 }
79072805
LW
5832}
5833
36477c24 5834#endif /* USE_LOCALE_COLLATE */
bbce6d69 5835
c461cf8f
JH
5836/*
5837=for apidoc sv_gets
5838
5839Get a line from the filehandle and store it into the SV, optionally
5840appending to the currently-stored string.
5841
5842=cut
5843*/
5844
79072805 5845char *
864dbfa3 5846Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 5847{
c07a80fd 5848 char *rsptr;
5849 STRLEN rslen;
5850 register STDCHAR rslast;
5851 register STDCHAR *bp;
5852 register I32 cnt;
9c5ffd7c 5853 I32 i = 0;
8bfdd7d9 5854 I32 rspara = 0;
c07a80fd 5855
765f542d
NC
5856 SV_CHECK_THINKFIRST_COW_DROP(sv);
5857 /* XXX. If you make this PVIV, then copy on write can copy scalars read
5858 from <>.
5859 However, perlbench says it's slower, because the existing swipe code
5860 is faster than copy on write.
5861 Swings and roundabouts. */
6fc92669 5862 (void)SvUPGRADE(sv, SVt_PV);
99491443 5863
ff68c719 5864 SvSCREAM_off(sv);
c07a80fd 5865
8bfdd7d9
HS
5866 if (PL_curcop == &PL_compiling) {
5867 /* we always read code in line mode */
5868 rsptr = "\n";
5869 rslen = 1;
5870 }
5871 else if (RsSNARF(PL_rs)) {
c07a80fd 5872 rsptr = NULL;
5873 rslen = 0;
5874 }
3280af22 5875 else if (RsRECORD(PL_rs)) {
5b2b9c68
HM
5876 I32 recsize, bytesread;
5877 char *buffer;
5878
5879 /* Grab the size of the record we're getting */
3280af22 5880 recsize = SvIV(SvRV(PL_rs));
5b2b9c68 5881 (void)SvPOK_only(sv); /* Validate pointer */
eb160463 5882 buffer = SvGROW(sv, (STRLEN)(recsize + 1));
5b2b9c68
HM
5883 /* Go yank in */
5884#ifdef VMS
5885 /* VMS wants read instead of fread, because fread doesn't respect */
5886 /* RMS record boundaries. This is not necessarily a good thing to be */
5887 /* doing, but we've got no other real choice */
5888 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
5889#else
5890 bytesread = PerlIO_read(fp, buffer, recsize);
5891#endif
5892 SvCUR_set(sv, bytesread);
e670df4e 5893 buffer[bytesread] = '\0';
7d59b7e4
NIS
5894 if (PerlIO_isutf8(fp))
5895 SvUTF8_on(sv);
5896 else
5897 SvUTF8_off(sv);
5b2b9c68
HM
5898 return(SvCUR(sv) ? SvPVX(sv) : Nullch);
5899 }
3280af22 5900 else if (RsPARA(PL_rs)) {
c07a80fd 5901 rsptr = "\n\n";
5902 rslen = 2;
8bfdd7d9 5903 rspara = 1;
c07a80fd 5904 }
7d59b7e4
NIS
5905 else {
5906 /* Get $/ i.e. PL_rs into same encoding as stream wants */
5907 if (PerlIO_isutf8(fp)) {
5908 rsptr = SvPVutf8(PL_rs, rslen);
5909 }
5910 else {
5911 if (SvUTF8(PL_rs)) {
5912 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
5913 Perl_croak(aTHX_ "Wide character in $/");
5914 }
5915 }
5916 rsptr = SvPV(PL_rs, rslen);
5917 }
5918 }
5919
c07a80fd 5920 rslast = rslen ? rsptr[rslen - 1] : '\0';
5921
8bfdd7d9 5922 if (rspara) { /* have to do this both before and after */
79072805 5923 do { /* to make sure file boundaries work right */
760ac839 5924 if (PerlIO_eof(fp))
a0d0e21e 5925 return 0;
760ac839 5926 i = PerlIO_getc(fp);
79072805 5927 if (i != '\n') {
a0d0e21e
LW
5928 if (i == -1)
5929 return 0;
760ac839 5930 PerlIO_ungetc(fp,i);
79072805
LW
5931 break;
5932 }
5933 } while (i != EOF);
5934 }
c07a80fd 5935
760ac839
LW
5936 /* See if we know enough about I/O mechanism to cheat it ! */
5937
5938 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 5939 of abstracting out stdio interface. One call should be cheap
760ac839
LW
5940 enough here - and may even be a macro allowing compile
5941 time optimization.
5942 */
5943
5944 if (PerlIO_fast_gets(fp)) {
5945
5946 /*
5947 * We're going to steal some values from the stdio struct
5948 * and put EVERYTHING in the innermost loop into registers.
5949 */
5950 register STDCHAR *ptr;
5951 STRLEN bpx;
5952 I32 shortbuffered;
5953
16660edb 5954#if defined(VMS) && defined(PERLIO_IS_STDIO)
5955 /* An ungetc()d char is handled separately from the regular
5956 * buffer, so we getc() it back out and stuff it in the buffer.
5957 */
5958 i = PerlIO_getc(fp);
5959 if (i == EOF) return 0;
5960 *(--((*fp)->_ptr)) = (unsigned char) i;
5961 (*fp)->_cnt++;
5962#endif
c07a80fd 5963
c2960299 5964 /* Here is some breathtakingly efficient cheating */
c07a80fd 5965
a20bf0c3 5966 cnt = PerlIO_get_cnt(fp); /* get count into register */
a0d0e21e 5967 (void)SvPOK_only(sv); /* validate pointer */
eb160463
GS
5968 if ((I32)(SvLEN(sv) - append) <= cnt + 1) { /* make sure we have the room */
5969 if (cnt > 80 && (I32)SvLEN(sv) > append) {
79072805
LW
5970 shortbuffered = cnt - SvLEN(sv) + append + 1;
5971 cnt -= shortbuffered;
5972 }
5973 else {
5974 shortbuffered = 0;
bbce6d69 5975 /* remember that cnt can be negative */
eb160463 5976 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
5977 }
5978 }
5979 else
5980 shortbuffered = 0;
c07a80fd 5981 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
a20bf0c3 5982 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 5983 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5984 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 5985 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 5986 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5987 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5988 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
5989 for (;;) {
5990 screamer:
93a17b20 5991 if (cnt > 0) {
c07a80fd 5992 if (rslen) {
760ac839
LW
5993 while (cnt > 0) { /* this | eat */
5994 cnt--;
c07a80fd 5995 if ((*bp++ = *ptr++) == rslast) /* really | dust */
5996 goto thats_all_folks; /* screams | sed :-) */
5997 }
5998 }
5999 else {
1c846c1f
NIS
6000 Copy(ptr, bp, cnt, char); /* this | eat */
6001 bp += cnt; /* screams | dust */
c07a80fd 6002 ptr += cnt; /* louder | sed :-) */
a5f75d66 6003 cnt = 0;
93a17b20 6004 }
79072805
LW
6005 }
6006
748a9306 6007 if (shortbuffered) { /* oh well, must extend */
79072805
LW
6008 cnt = shortbuffered;
6009 shortbuffered = 0;
c07a80fd 6010 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
6011 SvCUR_set(sv, bpx);
6012 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 6013 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
6014 continue;
6015 }
6016
16660edb 6017 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
6018 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
6019 PTR2UV(ptr),(long)cnt));
cc00df79 6020 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 6021#if 0
16660edb 6022 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6023 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6024 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6025 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6026#endif
1c846c1f 6027 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 6028 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
6029 another abstraction. */
760ac839 6030 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 6031#if 0
16660edb 6032 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6033 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6034 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6035 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6036#endif
a20bf0c3
JH
6037 cnt = PerlIO_get_cnt(fp);
6038 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 6039 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6040 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 6041
748a9306
LW
6042 if (i == EOF) /* all done for ever? */
6043 goto thats_really_all_folks;
6044
c07a80fd 6045 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
6046 SvCUR_set(sv, bpx);
6047 SvGROW(sv, bpx + cnt + 2);
c07a80fd 6048 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
6049
eb160463 6050 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 6051
c07a80fd 6052 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 6053 goto thats_all_folks;
79072805
LW
6054 }
6055
6056thats_all_folks:
eb160463 6057 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX(sv)) < rslen) ||
36477c24 6058 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 6059 goto screamer; /* go back to the fray */
79072805
LW
6060thats_really_all_folks:
6061 if (shortbuffered)
6062 cnt += shortbuffered;
16660edb 6063 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6064 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 6065 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 6066 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6067 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6068 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6069 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 6070 *bp = '\0';
760ac839 6071 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 6072 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 6073 "Screamer: done, len=%ld, string=|%.*s|\n",
6074 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
6075 }
6076 else
79072805 6077 {
4d2c4e07 6078#ifndef EPOC
760ac839 6079 /*The big, slow, and stupid way */
c07a80fd 6080 STDCHAR buf[8192];
4d2c4e07
OF
6081#else
6082 /* Need to work around EPOC SDK features */
6083 /* On WINS: MS VC5 generates calls to _chkstk, */
6084 /* if a `large' stack frame is allocated */
6085 /* gcc on MARM does not generate calls like these */
6086 STDCHAR buf[1024];
6087#endif
79072805 6088
760ac839 6089screamer2:
c07a80fd 6090 if (rslen) {
760ac839
LW
6091 register STDCHAR *bpe = buf + sizeof(buf);
6092 bp = buf;
eb160463 6093 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
6094 ; /* keep reading */
6095 cnt = bp - buf;
c07a80fd 6096 }
6097 else {
760ac839 6098 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 6099 /* Accomodate broken VAXC compiler, which applies U8 cast to
6100 * both args of ?: operator, causing EOF to change into 255
6101 */
37be0adf 6102 if (cnt > 0)
cbe9e203
JH
6103 i = (U8)buf[cnt - 1];
6104 else
37be0adf 6105 i = EOF;
c07a80fd 6106 }
79072805 6107
cbe9e203
JH
6108 if (cnt < 0)
6109 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
6110 if (append)
6111 sv_catpvn(sv, (char *) buf, cnt);
6112 else
6113 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 6114
6115 if (i != EOF && /* joy */
6116 (!rslen ||
6117 SvCUR(sv) < rslen ||
36477c24 6118 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
6119 {
6120 append = -1;
63e4d877
CS
6121 /*
6122 * If we're reading from a TTY and we get a short read,
6123 * indicating that the user hit his EOF character, we need
6124 * to notice it now, because if we try to read from the TTY
6125 * again, the EOF condition will disappear.
6126 *
6127 * The comparison of cnt to sizeof(buf) is an optimization
6128 * that prevents unnecessary calls to feof().
6129 *
6130 * - jik 9/25/96
6131 */
6132 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
6133 goto screamer2;
79072805
LW
6134 }
6135 }
6136
8bfdd7d9 6137 if (rspara) { /* have to do this both before and after */
c07a80fd 6138 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 6139 i = PerlIO_getc(fp);
79072805 6140 if (i != '\n') {
760ac839 6141 PerlIO_ungetc(fp,i);
79072805
LW
6142 break;
6143 }
6144 }
6145 }
c07a80fd 6146
7d59b7e4
NIS
6147 if (PerlIO_isutf8(fp))
6148 SvUTF8_on(sv);
6149 else
6150 SvUTF8_off(sv);
6151
c07a80fd 6152 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
6153}
6154
954c1994
GS
6155/*
6156=for apidoc sv_inc
6157
645c22ef
DM
6158Auto-increment of the value in the SV, doing string to numeric conversion
6159if necessary. Handles 'get' magic.
954c1994
GS
6160
6161=cut
6162*/
6163
79072805 6164void
864dbfa3 6165Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
6166{
6167 register char *d;
463ee0b2 6168 int flags;
79072805
LW
6169
6170 if (!sv)
6171 return;
b23a5f78
GB
6172 if (SvGMAGICAL(sv))
6173 mg_get(sv);
ed6116ce 6174 if (SvTHINKFIRST(sv)) {
765f542d
NC
6175 if (SvIsCOW(sv))
6176 sv_force_normal_flags(sv, 0);
0f15f207 6177 if (SvREADONLY(sv)) {
3280af22 6178 if (PL_curcop != &PL_compiling)
cea2e8a9 6179 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6180 }
a0d0e21e 6181 if (SvROK(sv)) {
b5be31e9 6182 IV i;
9e7bc3e8
JD
6183 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
6184 return;
56431972 6185 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6186 sv_unref(sv);
6187 sv_setiv(sv, i);
a0d0e21e 6188 }
ed6116ce 6189 }
8990e307 6190 flags = SvFLAGS(sv);
28e5dec8
JH
6191 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
6192 /* It's (privately or publicly) a float, but not tested as an
6193 integer, so test it to see. */
d460ef45 6194 (void) SvIV(sv);
28e5dec8
JH
6195 flags = SvFLAGS(sv);
6196 }
6197 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6198 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6199#ifdef PERL_PRESERVE_IVUV
28e5dec8 6200 oops_its_int:
59d8ce62 6201#endif
25da4f38
IZ
6202 if (SvIsUV(sv)) {
6203 if (SvUVX(sv) == UV_MAX)
a1e868e7 6204 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
6205 else
6206 (void)SvIOK_only_UV(sv);
6207 ++SvUVX(sv);
6208 } else {
6209 if (SvIVX(sv) == IV_MAX)
28e5dec8 6210 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
6211 else {
6212 (void)SvIOK_only(sv);
6213 ++SvIVX(sv);
1c846c1f 6214 }
55497cff 6215 }
79072805
LW
6216 return;
6217 }
28e5dec8
JH
6218 if (flags & SVp_NOK) {
6219 (void)SvNOK_only(sv);
6220 SvNVX(sv) += 1.0;
6221 return;
6222 }
6223
8990e307 6224 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
28e5dec8
JH
6225 if ((flags & SVTYPEMASK) < SVt_PVIV)
6226 sv_upgrade(sv, SVt_IV);
6227 (void)SvIOK_only(sv);
6228 SvIVX(sv) = 1;
79072805
LW
6229 return;
6230 }
463ee0b2 6231 d = SvPVX(sv);
79072805
LW
6232 while (isALPHA(*d)) d++;
6233 while (isDIGIT(*d)) d++;
6234 if (*d) {
28e5dec8 6235#ifdef PERL_PRESERVE_IVUV
d1be9408 6236 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
6237 warnings. Probably ought to make the sv_iv_please() that does
6238 the conversion if possible, and silently. */
c2988b20 6239 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
6240 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6241 /* Need to try really hard to see if it's an integer.
6242 9.22337203685478e+18 is an integer.
6243 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6244 so $a="9.22337203685478e+18"; $a+0; $a++
6245 needs to be the same as $a="9.22337203685478e+18"; $a++
6246 or we go insane. */
d460ef45 6247
28e5dec8
JH
6248 (void) sv_2iv(sv);
6249 if (SvIOK(sv))
6250 goto oops_its_int;
6251
6252 /* sv_2iv *should* have made this an NV */
6253 if (flags & SVp_NOK) {
6254 (void)SvNOK_only(sv);
6255 SvNVX(sv) += 1.0;
6256 return;
6257 }
6258 /* I don't think we can get here. Maybe I should assert this
6259 And if we do get here I suspect that sv_setnv will croak. NWC
6260 Fall through. */
6261#if defined(USE_LONG_DOUBLE)
6262 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",
6263 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6264#else
1779d84d 6265 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
6266 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6267#endif
6268 }
6269#endif /* PERL_PRESERVE_IVUV */
6270 sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
79072805
LW
6271 return;
6272 }
6273 d--;
463ee0b2 6274 while (d >= SvPVX(sv)) {
79072805
LW
6275 if (isDIGIT(*d)) {
6276 if (++*d <= '9')
6277 return;
6278 *(d--) = '0';
6279 }
6280 else {
9d116dd7
JH
6281#ifdef EBCDIC
6282 /* MKS: The original code here died if letters weren't consecutive.
6283 * at least it didn't have to worry about non-C locales. The
6284 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 6285 * arranged in order (although not consecutively) and that only
9d116dd7
JH
6286 * [A-Za-z] are accepted by isALPHA in the C locale.
6287 */
6288 if (*d != 'z' && *d != 'Z') {
6289 do { ++*d; } while (!isALPHA(*d));
6290 return;
6291 }
6292 *(d--) -= 'z' - 'a';
6293#else
79072805
LW
6294 ++*d;
6295 if (isALPHA(*d))
6296 return;
6297 *(d--) -= 'z' - 'a' + 1;
9d116dd7 6298#endif
79072805
LW
6299 }
6300 }
6301 /* oh,oh, the number grew */
6302 SvGROW(sv, SvCUR(sv) + 2);
6303 SvCUR(sv)++;
463ee0b2 6304 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
6305 *d = d[-1];
6306 if (isDIGIT(d[1]))
6307 *d = '1';
6308 else
6309 *d = d[1];
6310}
6311
954c1994
GS
6312/*
6313=for apidoc sv_dec
6314
645c22ef
DM
6315Auto-decrement of the value in the SV, doing string to numeric conversion
6316if necessary. Handles 'get' magic.
954c1994
GS
6317
6318=cut
6319*/
6320
79072805 6321void
864dbfa3 6322Perl_sv_dec(pTHX_ register SV *sv)
79072805 6323{
463ee0b2
LW
6324 int flags;
6325
79072805
LW
6326 if (!sv)
6327 return;
b23a5f78
GB
6328 if (SvGMAGICAL(sv))
6329 mg_get(sv);
ed6116ce 6330 if (SvTHINKFIRST(sv)) {
765f542d
NC
6331 if (SvIsCOW(sv))
6332 sv_force_normal_flags(sv, 0);
0f15f207 6333 if (SvREADONLY(sv)) {
3280af22 6334 if (PL_curcop != &PL_compiling)
cea2e8a9 6335 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6336 }
a0d0e21e 6337 if (SvROK(sv)) {
b5be31e9 6338 IV i;
9e7bc3e8
JD
6339 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6340 return;
56431972 6341 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6342 sv_unref(sv);
6343 sv_setiv(sv, i);
a0d0e21e 6344 }
ed6116ce 6345 }
28e5dec8
JH
6346 /* Unlike sv_inc we don't have to worry about string-never-numbers
6347 and keeping them magic. But we mustn't warn on punting */
8990e307 6348 flags = SvFLAGS(sv);
28e5dec8
JH
6349 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6350 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6351#ifdef PERL_PRESERVE_IVUV
28e5dec8 6352 oops_its_int:
59d8ce62 6353#endif
25da4f38
IZ
6354 if (SvIsUV(sv)) {
6355 if (SvUVX(sv) == 0) {
6356 (void)SvIOK_only(sv);
6357 SvIVX(sv) = -1;
6358 }
6359 else {
6360 (void)SvIOK_only_UV(sv);
6361 --SvUVX(sv);
1c846c1f 6362 }
25da4f38
IZ
6363 } else {
6364 if (SvIVX(sv) == IV_MIN)
65202027 6365 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
6366 else {
6367 (void)SvIOK_only(sv);
6368 --SvIVX(sv);
1c846c1f 6369 }
55497cff 6370 }
6371 return;
6372 }
28e5dec8
JH
6373 if (flags & SVp_NOK) {
6374 SvNVX(sv) -= 1.0;
6375 (void)SvNOK_only(sv);
6376 return;
6377 }
8990e307 6378 if (!(flags & SVp_POK)) {
4633a7c4
LW
6379 if ((flags & SVTYPEMASK) < SVt_PVNV)
6380 sv_upgrade(sv, SVt_NV);
463ee0b2 6381 SvNVX(sv) = -1.0;
a0d0e21e 6382 (void)SvNOK_only(sv);
79072805
LW
6383 return;
6384 }
28e5dec8
JH
6385#ifdef PERL_PRESERVE_IVUV
6386 {
c2988b20 6387 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
6388 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6389 /* Need to try really hard to see if it's an integer.
6390 9.22337203685478e+18 is an integer.
6391 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6392 so $a="9.22337203685478e+18"; $a+0; $a--
6393 needs to be the same as $a="9.22337203685478e+18"; $a--
6394 or we go insane. */
d460ef45 6395
28e5dec8
JH
6396 (void) sv_2iv(sv);
6397 if (SvIOK(sv))
6398 goto oops_its_int;
6399
6400 /* sv_2iv *should* have made this an NV */
6401 if (flags & SVp_NOK) {
6402 (void)SvNOK_only(sv);
6403 SvNVX(sv) -= 1.0;
6404 return;
6405 }
6406 /* I don't think we can get here. Maybe I should assert this
6407 And if we do get here I suspect that sv_setnv will croak. NWC
6408 Fall through. */
6409#if defined(USE_LONG_DOUBLE)
6410 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",
6411 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6412#else
1779d84d 6413 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
6414 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6415#endif
6416 }
6417 }
6418#endif /* PERL_PRESERVE_IVUV */
097ee67d 6419 sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
6420}
6421
954c1994
GS
6422/*
6423=for apidoc sv_mortalcopy
6424
645c22ef 6425Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
6426The new SV is marked as mortal. It will be destroyed "soon", either by an
6427explicit call to FREETMPS, or by an implicit call at places such as
6428statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
6429
6430=cut
6431*/
6432
79072805
LW
6433/* Make a string that will exist for the duration of the expression
6434 * evaluation. Actually, it may have to last longer than that, but
6435 * hopefully we won't free it until it has been assigned to a
6436 * permanent location. */
6437
6438SV *
864dbfa3 6439Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 6440{
463ee0b2 6441 register SV *sv;
b881518d 6442
4561caa4 6443 new_SV(sv);
79072805 6444 sv_setsv(sv,oldstr);
677b06e3
GS
6445 EXTEND_MORTAL(1);
6446 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
6447 SvTEMP_on(sv);
6448 return sv;
6449}
6450
954c1994
GS
6451/*
6452=for apidoc sv_newmortal
6453
645c22ef 6454Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
6455set to 1. It will be destroyed "soon", either by an explicit call to
6456FREETMPS, or by an implicit call at places such as statement boundaries.
6457See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
6458
6459=cut
6460*/
6461
8990e307 6462SV *
864dbfa3 6463Perl_sv_newmortal(pTHX)
8990e307
LW
6464{
6465 register SV *sv;
6466
4561caa4 6467 new_SV(sv);
8990e307 6468 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
6469 EXTEND_MORTAL(1);
6470 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
6471 return sv;
6472}
6473
954c1994
GS
6474/*
6475=for apidoc sv_2mortal
6476
d4236ebc
DM
6477Marks an existing SV as mortal. The SV will be destroyed "soon", either
6478by an explicit call to FREETMPS, or by an implicit call at places such as
6479statement boundaries. See also C<sv_newmortal> and C<sv_mortalcopy>.
954c1994
GS
6480
6481=cut
6482*/
6483
79072805 6484SV *
864dbfa3 6485Perl_sv_2mortal(pTHX_ register SV *sv)
79072805
LW
6486{
6487 if (!sv)
6488 return sv;
d689ffdd 6489 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 6490 return sv;
677b06e3
GS
6491 EXTEND_MORTAL(1);
6492 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 6493 SvTEMP_on(sv);
79072805
LW
6494 return sv;
6495}
6496
954c1994
GS
6497/*
6498=for apidoc newSVpv
6499
6500Creates a new SV and copies a string into it. The reference count for the
6501SV is set to 1. If C<len> is zero, Perl will compute the length using
6502strlen(). For efficiency, consider using C<newSVpvn> instead.
6503
6504=cut
6505*/
6506
79072805 6507SV *
864dbfa3 6508Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 6509{
463ee0b2 6510 register SV *sv;
79072805 6511
4561caa4 6512 new_SV(sv);
79072805
LW
6513 if (!len)
6514 len = strlen(s);
6515 sv_setpvn(sv,s,len);
6516 return sv;
6517}
6518
954c1994
GS
6519/*
6520=for apidoc newSVpvn
6521
6522Creates a new SV and copies a string into it. The reference count for the
1c846c1f 6523SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994
GS
6524string. You are responsible for ensuring that the source string is at least
6525C<len> bytes long.
6526
6527=cut
6528*/
6529
9da1e3b5 6530SV *
864dbfa3 6531Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
6532{
6533 register SV *sv;
6534
6535 new_SV(sv);
9da1e3b5
MUN
6536 sv_setpvn(sv,s,len);
6537 return sv;
6538}
6539
1c846c1f
NIS
6540/*
6541=for apidoc newSVpvn_share
6542
645c22ef
DM
6543Creates a new SV with its SvPVX pointing to a shared string in the string
6544table. If the string does not already exist in the table, it is created
6545first. Turns on READONLY and FAKE. The string's hash is stored in the UV
6546slot of the SV; if the C<hash> parameter is non-zero, that value is used;
6547otherwise the hash is computed. The idea here is that as the string table
6548is used for shared hash keys these strings will have SvPVX == HeKEY and
6549hash lookup will avoid string compare.
1c846c1f
NIS
6550
6551=cut
6552*/
6553
6554SV *
c3654f1a 6555Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
6556{
6557 register SV *sv;
c3654f1a
IH
6558 bool is_utf8 = FALSE;
6559 if (len < 0) {
77caf834 6560 STRLEN tmplen = -len;
c3654f1a 6561 is_utf8 = TRUE;
75a54232
JH
6562 /* See the note in hv.c:hv_fetch() --jhi */
6563 src = (char*)bytes_from_utf8((U8*)src, &tmplen, &is_utf8);
6564 len = tmplen;
6565 }
1c846c1f 6566 if (!hash)
5afd6d42 6567 PERL_HASH(hash, src, len);
1c846c1f
NIS
6568 new_SV(sv);
6569 sv_upgrade(sv, SVt_PVIV);
c3654f1a 6570 SvPVX(sv) = sharepvn(src, is_utf8?-len:len, hash);
1c846c1f
NIS
6571 SvCUR(sv) = len;
6572 SvUVX(sv) = hash;
6573 SvLEN(sv) = 0;
6574 SvREADONLY_on(sv);
6575 SvFAKE_on(sv);
6576 SvPOK_on(sv);
c3654f1a
IH
6577 if (is_utf8)
6578 SvUTF8_on(sv);
1c846c1f
NIS
6579 return sv;
6580}
6581
645c22ef 6582
cea2e8a9 6583#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
6584
6585/* pTHX_ magic can't cope with varargs, so this is a no-context
6586 * version of the main function, (which may itself be aliased to us).
6587 * Don't access this version directly.
6588 */
6589
46fc3d4c 6590SV *
cea2e8a9 6591Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 6592{
cea2e8a9 6593 dTHX;
46fc3d4c 6594 register SV *sv;
6595 va_list args;
46fc3d4c 6596 va_start(args, pat);
c5be433b 6597 sv = vnewSVpvf(pat, &args);
46fc3d4c 6598 va_end(args);
6599 return sv;
6600}
cea2e8a9 6601#endif
46fc3d4c 6602
954c1994
GS
6603/*
6604=for apidoc newSVpvf
6605
645c22ef 6606Creates a new SV and initializes it with the string formatted like
954c1994
GS
6607C<sprintf>.
6608
6609=cut
6610*/
6611
cea2e8a9
GS
6612SV *
6613Perl_newSVpvf(pTHX_ const char* pat, ...)
6614{
6615 register SV *sv;
6616 va_list args;
cea2e8a9 6617 va_start(args, pat);
c5be433b 6618 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
6619 va_end(args);
6620 return sv;
6621}
46fc3d4c 6622
645c22ef
DM
6623/* backend for newSVpvf() and newSVpvf_nocontext() */
6624
79072805 6625SV *
c5be433b
GS
6626Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
6627{
6628 register SV *sv;
6629 new_SV(sv);
6630 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
6631 return sv;
6632}
6633
954c1994
GS
6634/*
6635=for apidoc newSVnv
6636
6637Creates a new SV and copies a floating point value into it.
6638The reference count for the SV is set to 1.
6639
6640=cut
6641*/
6642
c5be433b 6643SV *
65202027 6644Perl_newSVnv(pTHX_ NV n)
79072805 6645{
463ee0b2 6646 register SV *sv;
79072805 6647
4561caa4 6648 new_SV(sv);
79072805
LW
6649 sv_setnv(sv,n);
6650 return sv;
6651}
6652
954c1994
GS
6653/*
6654=for apidoc newSViv
6655
6656Creates a new SV and copies an integer into it. The reference count for the
6657SV is set to 1.
6658
6659=cut
6660*/
6661
79072805 6662SV *
864dbfa3 6663Perl_newSViv(pTHX_ IV i)
79072805 6664{
463ee0b2 6665 register SV *sv;
79072805 6666
4561caa4 6667 new_SV(sv);
79072805
LW
6668 sv_setiv(sv,i);
6669 return sv;
6670}
6671
954c1994 6672/*
1a3327fb
JH
6673=for apidoc newSVuv
6674
6675Creates a new SV and copies an unsigned integer into it.
6676The reference count for the SV is set to 1.
6677
6678=cut
6679*/
6680
6681SV *
6682Perl_newSVuv(pTHX_ UV u)
6683{
6684 register SV *sv;
6685
6686 new_SV(sv);
6687 sv_setuv(sv,u);
6688 return sv;
6689}
6690
6691/*
954c1994
GS
6692=for apidoc newRV_noinc
6693
6694Creates an RV wrapper for an SV. The reference count for the original
6695SV is B<not> incremented.
6696
6697=cut
6698*/
6699
2304df62 6700SV *
864dbfa3 6701Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
6702{
6703 register SV *sv;
6704
4561caa4 6705 new_SV(sv);
2304df62 6706 sv_upgrade(sv, SVt_RV);
76e3520e 6707 SvTEMP_off(tmpRef);
d689ffdd 6708 SvRV(sv) = tmpRef;
2304df62 6709 SvROK_on(sv);
2304df62
AD
6710 return sv;
6711}
6712
ff276b08 6713/* newRV_inc is the official function name to use now.
645c22ef
DM
6714 * newRV_inc is in fact #defined to newRV in sv.h
6715 */
6716
5f05dabc 6717SV *
864dbfa3 6718Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 6719{
5f6447b6 6720 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 6721}
5f05dabc 6722
954c1994
GS
6723/*
6724=for apidoc newSVsv
6725
6726Creates a new SV which is an exact duplicate of the original SV.
645c22ef 6727(Uses C<sv_setsv>).
954c1994
GS
6728
6729=cut
6730*/
6731
79072805 6732SV *
864dbfa3 6733Perl_newSVsv(pTHX_ register SV *old)
79072805 6734{
463ee0b2 6735 register SV *sv;
79072805
LW
6736
6737 if (!old)
6738 return Nullsv;
8990e307 6739 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 6740 if (ckWARN_d(WARN_INTERNAL))
9014280d 6741 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
79072805
LW
6742 return Nullsv;
6743 }
4561caa4 6744 new_SV(sv);
ff68c719 6745 if (SvTEMP(old)) {
6746 SvTEMP_off(old);
463ee0b2 6747 sv_setsv(sv,old);
ff68c719 6748 SvTEMP_on(old);
79072805
LW
6749 }
6750 else
463ee0b2
LW
6751 sv_setsv(sv,old);
6752 return sv;
79072805
LW
6753}
6754
645c22ef
DM
6755/*
6756=for apidoc sv_reset
6757
6758Underlying implementation for the C<reset> Perl function.
6759Note that the perl-level function is vaguely deprecated.
6760
6761=cut
6762*/
6763
79072805 6764void
864dbfa3 6765Perl_sv_reset(pTHX_ register char *s, HV *stash)
79072805
LW
6766{
6767 register HE *entry;
6768 register GV *gv;
6769 register SV *sv;
6770 register I32 i;
6771 register PMOP *pm;
6772 register I32 max;
4802d5d7 6773 char todo[PERL_UCHAR_MAX+1];
79072805 6774
49d8d3a1
MB
6775 if (!stash)
6776 return;
6777
79072805
LW
6778 if (!*s) { /* reset ?? searches */
6779 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
48c036b1 6780 pm->op_pmdynflags &= ~PMdf_USED;
79072805
LW
6781 }
6782 return;
6783 }
6784
6785 /* reset variables */
6786
6787 if (!HvARRAY(stash))
6788 return;
463ee0b2
LW
6789
6790 Zero(todo, 256, char);
79072805 6791 while (*s) {
4802d5d7 6792 i = (unsigned char)*s;
79072805
LW
6793 if (s[1] == '-') {
6794 s += 2;
6795 }
4802d5d7 6796 max = (unsigned char)*s++;
79072805 6797 for ( ; i <= max; i++) {
463ee0b2
LW
6798 todo[i] = 1;
6799 }
a0d0e21e 6800 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 6801 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
6802 entry;
6803 entry = HeNEXT(entry))
6804 {
1edc1566 6805 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 6806 continue;
1edc1566 6807 gv = (GV*)HeVAL(entry);
79072805 6808 sv = GvSV(gv);
9e35f4b3
GS
6809 if (SvTHINKFIRST(sv)) {
6810 if (!SvREADONLY(sv) && SvROK(sv))
6811 sv_unref(sv);
6812 continue;
6813 }
a0d0e21e 6814 (void)SvOK_off(sv);
79072805
LW
6815 if (SvTYPE(sv) >= SVt_PV) {
6816 SvCUR_set(sv, 0);
463ee0b2
LW
6817 if (SvPVX(sv) != Nullch)
6818 *SvPVX(sv) = '\0';
44a8e56a 6819 SvTAINT(sv);
79072805
LW
6820 }
6821 if (GvAV(gv)) {
6822 av_clear(GvAV(gv));
6823 }
44a8e56a 6824 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
463ee0b2 6825 hv_clear(GvHV(gv));
fa6a1c44 6826#ifdef USE_ENVIRON_ARRAY
4efc5df6
GS
6827 if (gv == PL_envgv
6828# ifdef USE_ITHREADS
6829 && PL_curinterp == aTHX
6830# endif
6831 )
6832 {
79072805 6833 environ[0] = Nullch;
4efc5df6 6834 }
a0d0e21e 6835#endif
79072805
LW
6836 }
6837 }
6838 }
6839 }
6840}
6841
645c22ef
DM
6842/*
6843=for apidoc sv_2io
6844
6845Using various gambits, try to get an IO from an SV: the IO slot if its a
6846GV; or the recursive result if we're an RV; or the IO slot of the symbol
6847named after the PV if we're a string.
6848
6849=cut
6850*/
6851
46fc3d4c 6852IO*
864dbfa3 6853Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 6854{
6855 IO* io;
6856 GV* gv;
2d8e6c8d 6857 STRLEN n_a;
46fc3d4c 6858
6859 switch (SvTYPE(sv)) {
6860 case SVt_PVIO:
6861 io = (IO*)sv;
6862 break;
6863 case SVt_PVGV:
6864 gv = (GV*)sv;
6865 io = GvIO(gv);
6866 if (!io)
cea2e8a9 6867 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 6868 break;
6869 default:
6870 if (!SvOK(sv))
cea2e8a9 6871 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 6872 if (SvROK(sv))
6873 return sv_2io(SvRV(sv));
2d8e6c8d 6874 gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
46fc3d4c 6875 if (gv)
6876 io = GvIO(gv);
6877 else
6878 io = 0;
6879 if (!io)
cea2e8a9 6880 Perl_croak(aTHX_ "Bad filehandle: %s", SvPV(sv,n_a));
46fc3d4c 6881 break;
6882 }
6883 return io;
6884}
6885
645c22ef
DM
6886/*
6887=for apidoc sv_2cv
6888
6889Using various gambits, try to get a CV from an SV; in addition, try if
6890possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
6891
6892=cut
6893*/
6894
79072805 6895CV *
864dbfa3 6896Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 6897{
c04a4dfe
JH
6898 GV *gv = Nullgv;
6899 CV *cv = Nullcv;
2d8e6c8d 6900 STRLEN n_a;
79072805
LW
6901
6902 if (!sv)
93a17b20 6903 return *gvp = Nullgv, Nullcv;
79072805 6904 switch (SvTYPE(sv)) {
79072805
LW
6905 case SVt_PVCV:
6906 *st = CvSTASH(sv);
6907 *gvp = Nullgv;
6908 return (CV*)sv;
6909 case SVt_PVHV:
6910 case SVt_PVAV:
6911 *gvp = Nullgv;
6912 return Nullcv;
8990e307
LW
6913 case SVt_PVGV:
6914 gv = (GV*)sv;
a0d0e21e 6915 *gvp = gv;
8990e307
LW
6916 *st = GvESTASH(gv);
6917 goto fix_gv;
6918
79072805 6919 default:
a0d0e21e
LW
6920 if (SvGMAGICAL(sv))
6921 mg_get(sv);
6922 if (SvROK(sv)) {
f5284f61
IZ
6923 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
6924 tryAMAGICunDEREF(to_cv);
6925
62f274bf
GS
6926 sv = SvRV(sv);
6927 if (SvTYPE(sv) == SVt_PVCV) {
6928 cv = (CV*)sv;
6929 *gvp = Nullgv;
6930 *st = CvSTASH(cv);
6931 return cv;
6932 }
6933 else if(isGV(sv))
6934 gv = (GV*)sv;
6935 else
cea2e8a9 6936 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 6937 }
62f274bf 6938 else if (isGV(sv))
79072805
LW
6939 gv = (GV*)sv;
6940 else
2d8e6c8d 6941 gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
79072805
LW
6942 *gvp = gv;
6943 if (!gv)
6944 return Nullcv;
6945 *st = GvESTASH(gv);
8990e307 6946 fix_gv:
8ebc5c01 6947 if (lref && !GvCVu(gv)) {
4633a7c4 6948 SV *tmpsv;
748a9306 6949 ENTER;
4633a7c4 6950 tmpsv = NEWSV(704,0);
16660edb 6951 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
6952 /* XXX this is probably not what they think they're getting.
6953 * It has the same effect as "sub name;", i.e. just a forward
6954 * declaration! */
774d564b 6955 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
6956 newSVOP(OP_CONST, 0, tmpsv),
6957 Nullop,
8990e307 6958 Nullop);
748a9306 6959 LEAVE;
8ebc5c01 6960 if (!GvCVu(gv))
cea2e8a9 6961 Perl_croak(aTHX_ "Unable to create sub named \"%s\"", SvPV(sv,n_a));
8990e307 6962 }
8ebc5c01 6963 return GvCVu(gv);
79072805
LW
6964 }
6965}
6966
c461cf8f
JH
6967/*
6968=for apidoc sv_true
6969
6970Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
6971Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
6972instead use an in-line version.
c461cf8f
JH
6973
6974=cut
6975*/
6976
79072805 6977I32
864dbfa3 6978Perl_sv_true(pTHX_ register SV *sv)
79072805 6979{
8990e307
LW
6980 if (!sv)
6981 return 0;
79072805 6982 if (SvPOK(sv)) {
4e35701f
NIS
6983 register XPV* tXpv;
6984 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 6985 (tXpv->xpv_cur > 1 ||
4e35701f 6986 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
79072805
LW
6987 return 1;
6988 else
6989 return 0;
6990 }
6991 else {
6992 if (SvIOK(sv))
463ee0b2 6993 return SvIVX(sv) != 0;
79072805
LW
6994 else {
6995 if (SvNOK(sv))
463ee0b2 6996 return SvNVX(sv) != 0.0;
79072805 6997 else
463ee0b2 6998 return sv_2bool(sv);
79072805
LW
6999 }
7000 }
7001}
79072805 7002
645c22ef
DM
7003/*
7004=for apidoc sv_iv
7005
7006A private implementation of the C<SvIVx> macro for compilers which can't
7007cope with complex macro expressions. Always use the macro instead.
7008
7009=cut
7010*/
7011
ff68c719 7012IV
864dbfa3 7013Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 7014{
25da4f38
IZ
7015 if (SvIOK(sv)) {
7016 if (SvIsUV(sv))
7017 return (IV)SvUVX(sv);
ff68c719 7018 return SvIVX(sv);
25da4f38 7019 }
ff68c719 7020 return sv_2iv(sv);
85e6fe83 7021}
85e6fe83 7022
645c22ef
DM
7023/*
7024=for apidoc sv_uv
7025
7026A private implementation of the C<SvUVx> macro for compilers which can't
7027cope with complex macro expressions. Always use the macro instead.
7028
7029=cut
7030*/
7031
ff68c719 7032UV
864dbfa3 7033Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 7034{
25da4f38
IZ
7035 if (SvIOK(sv)) {
7036 if (SvIsUV(sv))
7037 return SvUVX(sv);
7038 return (UV)SvIVX(sv);
7039 }
ff68c719 7040 return sv_2uv(sv);
7041}
85e6fe83 7042
645c22ef
DM
7043/*
7044=for apidoc sv_nv
7045
7046A private implementation of the C<SvNVx> macro for compilers which can't
7047cope with complex macro expressions. Always use the macro instead.
7048
7049=cut
7050*/
7051
65202027 7052NV
864dbfa3 7053Perl_sv_nv(pTHX_ register SV *sv)
79072805 7054{
ff68c719 7055 if (SvNOK(sv))
7056 return SvNVX(sv);
7057 return sv_2nv(sv);
79072805 7058}
79072805 7059
645c22ef
DM
7060/*
7061=for apidoc sv_pv
7062
baca2b92 7063Use the C<SvPV_nolen> macro instead
645c22ef 7064
645c22ef
DM
7065=for apidoc sv_pvn
7066
7067A private implementation of the C<SvPV> macro for compilers which can't
7068cope with complex macro expressions. Always use the macro instead.
7069
7070=cut
7071*/
7072
1fa8b10d 7073char *
864dbfa3 7074Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 7075{
85e6fe83
LW
7076 if (SvPOK(sv)) {
7077 *lp = SvCUR(sv);
a0d0e21e 7078 return SvPVX(sv);
85e6fe83 7079 }
463ee0b2 7080 return sv_2pv(sv, lp);
79072805 7081}
79072805 7082
6e9d1081
NC
7083
7084char *
7085Perl_sv_pvn_nomg(pTHX_ register SV *sv, STRLEN *lp)
7086{
7087 if (SvPOK(sv)) {
7088 *lp = SvCUR(sv);
7089 return SvPVX(sv);
7090 }
7091 return sv_2pv_flags(sv, lp, 0);
7092}
7093
c461cf8f
JH
7094/*
7095=for apidoc sv_pvn_force
7096
7097Get a sensible string out of the SV somehow.
645c22ef
DM
7098A private implementation of the C<SvPV_force> macro for compilers which
7099can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 7100
8d6d96c1
HS
7101=for apidoc sv_pvn_force_flags
7102
7103Get a sensible string out of the SV somehow.
7104If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
7105appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
7106implemented in terms of this function.
645c22ef
DM
7107You normally want to use the various wrapper macros instead: see
7108C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
7109
7110=cut
7111*/
7112
7113char *
7114Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
7115{
c04a4dfe 7116 char *s = NULL;
a0d0e21e 7117
6fc92669 7118 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 7119 sv_force_normal_flags(sv, 0);
1c846c1f 7120
a0d0e21e
LW
7121 if (SvPOK(sv)) {
7122 *lp = SvCUR(sv);
7123 }
7124 else {
748a9306 7125 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 7126 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 7127 OP_NAME(PL_op));
a0d0e21e 7128 }
4633a7c4 7129 else
8d6d96c1 7130 s = sv_2pv_flags(sv, lp, flags);
a0d0e21e
LW
7131 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
7132 STRLEN len = *lp;
1c846c1f 7133
a0d0e21e
LW
7134 if (SvROK(sv))
7135 sv_unref(sv);
7136 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
7137 SvGROW(sv, len + 1);
7138 Move(s,SvPVX(sv),len,char);
7139 SvCUR_set(sv, len);
7140 *SvEND(sv) = '\0';
7141 }
7142 if (!SvPOK(sv)) {
7143 SvPOK_on(sv); /* validate pointer */
7144 SvTAINT(sv);
1d7c1841
GS
7145 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
7146 PTR2UV(sv),SvPVX(sv)));
a0d0e21e
LW
7147 }
7148 }
7149 return SvPVX(sv);
7150}
7151
645c22ef
DM
7152/*
7153=for apidoc sv_pvbyte
7154
baca2b92 7155Use C<SvPVbyte_nolen> instead.
645c22ef 7156
645c22ef
DM
7157=for apidoc sv_pvbyten
7158
7159A private implementation of the C<SvPVbyte> macro for compilers
7160which can't cope with complex macro expressions. Always use the macro
7161instead.
7162
7163=cut
7164*/
7165
7340a771
GS
7166char *
7167Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
7168{
ffebcc3e 7169 sv_utf8_downgrade(sv,0);
7340a771
GS
7170 return sv_pvn(sv,lp);
7171}
7172
645c22ef
DM
7173/*
7174=for apidoc sv_pvbyten_force
7175
7176A private implementation of the C<SvPVbytex_force> macro for compilers
7177which can't cope with complex macro expressions. Always use the macro
7178instead.
7179
7180=cut
7181*/
7182
7340a771
GS
7183char *
7184Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
7185{
ffebcc3e 7186 sv_utf8_downgrade(sv,0);
7340a771
GS
7187 return sv_pvn_force(sv,lp);
7188}
7189
645c22ef
DM
7190/*
7191=for apidoc sv_pvutf8
7192
baca2b92 7193Use the C<SvPVutf8_nolen> macro instead
645c22ef 7194
645c22ef
DM
7195=for apidoc sv_pvutf8n
7196
7197A private implementation of the C<SvPVutf8> macro for compilers
7198which can't cope with complex macro expressions. Always use the macro
7199instead.
7200
7201=cut
7202*/
7203
7340a771
GS
7204char *
7205Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
7206{
560a288e 7207 sv_utf8_upgrade(sv);
7340a771
GS
7208 return sv_pvn(sv,lp);
7209}
7210
c461cf8f
JH
7211/*
7212=for apidoc sv_pvutf8n_force
7213
645c22ef
DM
7214A private implementation of the C<SvPVutf8_force> macro for compilers
7215which can't cope with complex macro expressions. Always use the macro
7216instead.
c461cf8f
JH
7217
7218=cut
7219*/
7220
7340a771
GS
7221char *
7222Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
7223{
560a288e 7224 sv_utf8_upgrade(sv);
7340a771
GS
7225 return sv_pvn_force(sv,lp);
7226}
7227
c461cf8f
JH
7228/*
7229=for apidoc sv_reftype
7230
7231Returns a string describing what the SV is a reference to.
7232
7233=cut
7234*/
7235
7340a771 7236char *
864dbfa3 7237Perl_sv_reftype(pTHX_ SV *sv, int ob)
a0d0e21e 7238{
c86bf373 7239 if (ob && SvOBJECT(sv)) {
de11ba31 7240 return HvNAME(SvSTASH(sv));
c86bf373 7241 }
a0d0e21e
LW
7242 else {
7243 switch (SvTYPE(sv)) {
7244 case SVt_NULL:
7245 case SVt_IV:
7246 case SVt_NV:
7247 case SVt_RV:
7248 case SVt_PV:
7249 case SVt_PVIV:
7250 case SVt_PVNV:
7251 case SVt_PVMG:
7252 case SVt_PVBM:
439cb1c4
JP
7253 if (SvVOK(sv))
7254 return "VSTRING";
a0d0e21e
LW
7255 if (SvROK(sv))
7256 return "REF";
7257 else
7258 return "SCALAR";
7259 case SVt_PVLV: return "LVALUE";
7260 case SVt_PVAV: return "ARRAY";
7261 case SVt_PVHV: return "HASH";
7262 case SVt_PVCV: return "CODE";
7263 case SVt_PVGV: return "GLOB";
1d2dff63 7264 case SVt_PVFM: return "FORMAT";
27f9d8f3 7265 case SVt_PVIO: return "IO";
a0d0e21e
LW
7266 default: return "UNKNOWN";
7267 }
7268 }
7269}
7270
954c1994
GS
7271/*
7272=for apidoc sv_isobject
7273
7274Returns a boolean indicating whether the SV is an RV pointing to a blessed
7275object. If the SV is not an RV, or if the object is not blessed, then this
7276will return false.
7277
7278=cut
7279*/
7280
463ee0b2 7281int
864dbfa3 7282Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 7283{
68dc0745 7284 if (!sv)
7285 return 0;
7286 if (SvGMAGICAL(sv))
7287 mg_get(sv);
85e6fe83
LW
7288 if (!SvROK(sv))
7289 return 0;
7290 sv = (SV*)SvRV(sv);
7291 if (!SvOBJECT(sv))
7292 return 0;
7293 return 1;
7294}
7295
954c1994
GS
7296/*
7297=for apidoc sv_isa
7298
7299Returns a boolean indicating whether the SV is blessed into the specified
7300class. This does not check for subtypes; use C<sv_derived_from> to verify
7301an inheritance relationship.
7302
7303=cut
7304*/
7305
85e6fe83 7306int
864dbfa3 7307Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 7308{
68dc0745 7309 if (!sv)
7310 return 0;
7311 if (SvGMAGICAL(sv))
7312 mg_get(sv);
ed6116ce 7313 if (!SvROK(sv))
463ee0b2 7314 return 0;
ed6116ce
LW
7315 sv = (SV*)SvRV(sv);
7316 if (!SvOBJECT(sv))
463ee0b2
LW
7317 return 0;
7318
7319 return strEQ(HvNAME(SvSTASH(sv)), name);
7320}
7321
954c1994
GS
7322/*
7323=for apidoc newSVrv
7324
7325Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
7326it will be upgraded to one. If C<classname> is non-null then the new SV will
7327be blessed in the specified package. The new SV is returned and its
7328reference count is 1.
7329
7330=cut
7331*/
7332
463ee0b2 7333SV*
864dbfa3 7334Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 7335{
463ee0b2
LW
7336 SV *sv;
7337
4561caa4 7338 new_SV(sv);
51cf62d8 7339
765f542d 7340 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 7341 SvAMAGIC_off(rv);
51cf62d8 7342
0199fce9
JD
7343 if (SvTYPE(rv) >= SVt_PVMG) {
7344 U32 refcnt = SvREFCNT(rv);
7345 SvREFCNT(rv) = 0;
7346 sv_clear(rv);
7347 SvFLAGS(rv) = 0;
7348 SvREFCNT(rv) = refcnt;
7349 }
7350
51cf62d8 7351 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
7352 sv_upgrade(rv, SVt_RV);
7353 else if (SvTYPE(rv) > SVt_RV) {
7354 (void)SvOOK_off(rv);
7355 if (SvPVX(rv) && SvLEN(rv))
7356 Safefree(SvPVX(rv));
7357 SvCUR_set(rv, 0);
7358 SvLEN_set(rv, 0);
7359 }
51cf62d8
OT
7360
7361 (void)SvOK_off(rv);
053fc874 7362 SvRV(rv) = sv;
ed6116ce 7363 SvROK_on(rv);
463ee0b2 7364
a0d0e21e
LW
7365 if (classname) {
7366 HV* stash = gv_stashpv(classname, TRUE);
7367 (void)sv_bless(rv, stash);
7368 }
7369 return sv;
7370}
7371
954c1994
GS
7372/*
7373=for apidoc sv_setref_pv
7374
7375Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
7376argument will be upgraded to an RV. That RV will be modified to point to
7377the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7378into the SV. The C<classname> argument indicates the package for the
7379blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7380will be returned and will have a reference count of 1.
7381
7382Do not use with other Perl types such as HV, AV, SV, CV, because those
7383objects will become corrupted by the pointer copy process.
7384
7385Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7386
7387=cut
7388*/
7389
a0d0e21e 7390SV*
864dbfa3 7391Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 7392{
189b2af5 7393 if (!pv) {
3280af22 7394 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
7395 SvSETMAGIC(rv);
7396 }
a0d0e21e 7397 else
56431972 7398 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
7399 return rv;
7400}
7401
954c1994
GS
7402/*
7403=for apidoc sv_setref_iv
7404
7405Copies an integer into a new SV, optionally blessing the SV. The C<rv>
7406argument will be upgraded to an RV. That RV will be modified to point to
7407the new SV. The C<classname> argument indicates the package for the
7408blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7409will be returned and will have a reference count of 1.
7410
7411=cut
7412*/
7413
a0d0e21e 7414SV*
864dbfa3 7415Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
7416{
7417 sv_setiv(newSVrv(rv,classname), iv);
7418 return rv;
7419}
7420
954c1994 7421/*
e1c57cef
JH
7422=for apidoc sv_setref_uv
7423
7424Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
7425argument will be upgraded to an RV. That RV will be modified to point to
7426the new SV. The C<classname> argument indicates the package for the
7427blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7428will be returned and will have a reference count of 1.
7429
7430=cut
7431*/
7432
7433SV*
7434Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
7435{
7436 sv_setuv(newSVrv(rv,classname), uv);
7437 return rv;
7438}
7439
7440/*
954c1994
GS
7441=for apidoc sv_setref_nv
7442
7443Copies a double into a new SV, optionally blessing the SV. The C<rv>
7444argument will be upgraded to an RV. That RV will be modified to point to
7445the new SV. The C<classname> argument indicates the package for the
7446blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7447will be returned and will have a reference count of 1.
7448
7449=cut
7450*/
7451
a0d0e21e 7452SV*
65202027 7453Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
7454{
7455 sv_setnv(newSVrv(rv,classname), nv);
7456 return rv;
7457}
463ee0b2 7458
954c1994
GS
7459/*
7460=for apidoc sv_setref_pvn
7461
7462Copies a string into a new SV, optionally blessing the SV. The length of the
7463string must be specified with C<n>. The C<rv> argument will be upgraded to
7464an RV. That RV will be modified to point to the new SV. The C<classname>
7465argument indicates the package for the blessing. Set C<classname> to
7466C<Nullch> to avoid the blessing. The new SV will be returned and will have
7467a reference count of 1.
7468
7469Note that C<sv_setref_pv> copies the pointer while this copies the string.
7470
7471=cut
7472*/
7473
a0d0e21e 7474SV*
864dbfa3 7475Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
7476{
7477 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
7478 return rv;
7479}
7480
954c1994
GS
7481/*
7482=for apidoc sv_bless
7483
7484Blesses an SV into a specified package. The SV must be an RV. The package
7485must be designated by its stash (see C<gv_stashpv()>). The reference count
7486of the SV is unaffected.
7487
7488=cut
7489*/
7490
a0d0e21e 7491SV*
864dbfa3 7492Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 7493{
76e3520e 7494 SV *tmpRef;
a0d0e21e 7495 if (!SvROK(sv))
cea2e8a9 7496 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
7497 tmpRef = SvRV(sv);
7498 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
7499 if (SvREADONLY(tmpRef))
cea2e8a9 7500 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
7501 if (SvOBJECT(tmpRef)) {
7502 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7503 --PL_sv_objcount;
76e3520e 7504 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 7505 }
a0d0e21e 7506 }
76e3520e
GS
7507 SvOBJECT_on(tmpRef);
7508 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7509 ++PL_sv_objcount;
76e3520e
GS
7510 (void)SvUPGRADE(tmpRef, SVt_PVMG);
7511 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
a0d0e21e 7512
2e3febc6
CS
7513 if (Gv_AMG(stash))
7514 SvAMAGIC_on(sv);
7515 else
7516 SvAMAGIC_off(sv);
a0d0e21e 7517
1edbfb88
AB
7518 if(SvSMAGICAL(tmpRef))
7519 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
7520 mg_set(tmpRef);
7521
7522
ecdeb87c 7523
a0d0e21e
LW
7524 return sv;
7525}
7526
645c22ef 7527/* Downgrades a PVGV to a PVMG.
645c22ef
DM
7528 */
7529
76e3520e 7530STATIC void
cea2e8a9 7531S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 7532{
850fabdf
GS
7533 void *xpvmg;
7534
a0d0e21e
LW
7535 assert(SvTYPE(sv) == SVt_PVGV);
7536 SvFAKE_off(sv);
7537 if (GvGP(sv))
1edc1566 7538 gp_free((GV*)sv);
e826b3c7
GS
7539 if (GvSTASH(sv)) {
7540 SvREFCNT_dec(GvSTASH(sv));
7541 GvSTASH(sv) = Nullhv;
7542 }
14befaf4 7543 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 7544 Safefree(GvNAME(sv));
a5f75d66 7545 GvMULTI_off(sv);
850fabdf
GS
7546
7547 /* need to keep SvANY(sv) in the right arena */
7548 xpvmg = new_XPVMG();
7549 StructCopy(SvANY(sv), xpvmg, XPVMG);
7550 del_XPVGV(SvANY(sv));
7551 SvANY(sv) = xpvmg;
7552
a0d0e21e
LW
7553 SvFLAGS(sv) &= ~SVTYPEMASK;
7554 SvFLAGS(sv) |= SVt_PVMG;
7555}
7556
954c1994 7557/*
840a7b70 7558=for apidoc sv_unref_flags
954c1994
GS
7559
7560Unsets the RV status of the SV, and decrements the reference count of
7561whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
7562as a reversal of C<newSVrv>. The C<cflags> argument can contain
7563C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
7564(otherwise the decrementing is conditional on the reference count being
7565different from one or the reference being a readonly SV).
7889fe52 7566See C<SvROK_off>.
954c1994
GS
7567
7568=cut
7569*/
7570
ed6116ce 7571void
840a7b70 7572Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 7573{
a0d0e21e 7574 SV* rv = SvRV(sv);
810b8aa5
GS
7575
7576 if (SvWEAKREF(sv)) {
7577 sv_del_backref(sv);
7578 SvWEAKREF_off(sv);
7579 SvRV(sv) = 0;
7580 return;
7581 }
ed6116ce
LW
7582 SvRV(sv) = 0;
7583 SvROK_off(sv);
765f542d 7584 if (SvREFCNT(rv) != 1 || SvREADONLY(rv) || (flags & SV_IMMEDIATE_UNREF))
4633a7c4 7585 SvREFCNT_dec(rv);
840a7b70 7586 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 7587 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 7588}
8990e307 7589
840a7b70
IZ
7590/*
7591=for apidoc sv_unref
7592
7593Unsets the RV status of the SV, and decrements the reference count of
7594whatever was being referenced by the RV. This can almost be thought of
7595as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 7596being zero. See C<SvROK_off>.
840a7b70
IZ
7597
7598=cut
7599*/
7600
7601void
7602Perl_sv_unref(pTHX_ SV *sv)
7603{
7604 sv_unref_flags(sv, 0);
7605}
7606
645c22ef
DM
7607/*
7608=for apidoc sv_taint
7609
7610Taint an SV. Use C<SvTAINTED_on> instead.
7611=cut
7612*/
7613
bbce6d69 7614void
864dbfa3 7615Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 7616{
14befaf4 7617 sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
bbce6d69 7618}
7619
645c22ef
DM
7620/*
7621=for apidoc sv_untaint
7622
7623Untaint an SV. Use C<SvTAINTED_off> instead.
7624=cut
7625*/
7626
bbce6d69 7627void
864dbfa3 7628Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 7629{
13f57bf8 7630 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 7631 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 7632 if (mg)
565764a8 7633 mg->mg_len &= ~1;
36477c24 7634 }
bbce6d69 7635}
7636
645c22ef
DM
7637/*
7638=for apidoc sv_tainted
7639
7640Test an SV for taintedness. Use C<SvTAINTED> instead.
7641=cut
7642*/
7643
bbce6d69 7644bool
864dbfa3 7645Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 7646{
13f57bf8 7647 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 7648 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
155aba94 7649 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 7650 return TRUE;
7651 }
7652 return FALSE;
bbce6d69 7653}
7654
cea2e8a9 7655#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7656
7657/* pTHX_ magic can't cope with varargs, so this is a no-context
7658 * version of the main function, (which may itself be aliased to us).
7659 * Don't access this version directly.
7660 */
7661
cea2e8a9
GS
7662void
7663Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
7664{
7665 dTHX;
7666 va_list args;
7667 va_start(args, pat);
c5be433b 7668 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
7669 va_end(args);
7670}
7671
645c22ef
DM
7672/* pTHX_ magic can't cope with varargs, so this is a no-context
7673 * version of the main function, (which may itself be aliased to us).
7674 * Don't access this version directly.
7675 */
cea2e8a9
GS
7676
7677void
7678Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
7679{
7680 dTHX;
7681 va_list args;
7682 va_start(args, pat);
c5be433b 7683 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 7684 va_end(args);
cea2e8a9
GS
7685}
7686#endif
7687
954c1994
GS
7688/*
7689=for apidoc sv_setpvf
7690
7691Processes its arguments like C<sprintf> and sets an SV to the formatted
7692output. Does not handle 'set' magic. See C<sv_setpvf_mg>.
7693
7694=cut
7695*/
7696
46fc3d4c 7697void
864dbfa3 7698Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 7699{
7700 va_list args;
46fc3d4c 7701 va_start(args, pat);
c5be433b 7702 sv_vsetpvf(sv, pat, &args);
46fc3d4c 7703 va_end(args);
7704}
7705
645c22ef
DM
7706/* backend for C<sv_setpvf> and C<sv_setpvf_nocontext> */
7707
c5be433b
GS
7708void
7709Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7710{
7711 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7712}
ef50df4b 7713
954c1994
GS
7714/*
7715=for apidoc sv_setpvf_mg
7716
7717Like C<sv_setpvf>, but also handles 'set' magic.
7718
7719=cut
7720*/
7721
ef50df4b 7722void
864dbfa3 7723Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
7724{
7725 va_list args;
ef50df4b 7726 va_start(args, pat);
c5be433b 7727 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 7728 va_end(args);
c5be433b
GS
7729}
7730
645c22ef
DM
7731/* backend for C<sv_setpvf_mg> C<setpvf_mg_nocontext> */
7732
c5be433b
GS
7733void
7734Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7735{
7736 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
7737 SvSETMAGIC(sv);
7738}
7739
cea2e8a9 7740#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7741
7742/* pTHX_ magic can't cope with varargs, so this is a no-context
7743 * version of the main function, (which may itself be aliased to us).
7744 * Don't access this version directly.
7745 */
7746
cea2e8a9
GS
7747void
7748Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
7749{
7750 dTHX;
7751 va_list args;
7752 va_start(args, pat);
c5be433b 7753 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
7754 va_end(args);
7755}
7756
645c22ef
DM
7757/* pTHX_ magic can't cope with varargs, so this is a no-context
7758 * version of the main function, (which may itself be aliased to us).
7759 * Don't access this version directly.
7760 */
7761
cea2e8a9
GS
7762void
7763Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
7764{
7765 dTHX;
7766 va_list args;
7767 va_start(args, pat);
c5be433b 7768 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 7769 va_end(args);
cea2e8a9
GS
7770}
7771#endif
7772
954c1994
GS
7773/*
7774=for apidoc sv_catpvf
7775
d5ce4a7c
GA
7776Processes its arguments like C<sprintf> and appends the formatted
7777output to an SV. If the appended data contains "wide" characters
7778(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
7779and characters >255 formatted with %c), the original SV might get
7780upgraded to UTF-8. Handles 'get' magic, but not 'set' magic.
7781C<SvSETMAGIC()> must typically be called after calling this function
7782to handle 'set' magic.
954c1994 7783
d5ce4a7c 7784=cut */
954c1994 7785
46fc3d4c 7786void
864dbfa3 7787Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 7788{
7789 va_list args;
46fc3d4c 7790 va_start(args, pat);
c5be433b 7791 sv_vcatpvf(sv, pat, &args);
46fc3d4c 7792 va_end(args);
7793}
7794
645c22ef
DM
7795/* backend for C<sv_catpvf> and C<catpvf_mg_nocontext> */
7796
ef50df4b 7797void
c5be433b
GS
7798Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7799{
7800 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7801}
7802
954c1994
GS
7803/*
7804=for apidoc sv_catpvf_mg
7805
7806Like C<sv_catpvf>, but also handles 'set' magic.
7807
7808=cut
7809*/
7810
c5be433b 7811void
864dbfa3 7812Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
7813{
7814 va_list args;
ef50df4b 7815 va_start(args, pat);
c5be433b 7816 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 7817 va_end(args);
c5be433b
GS
7818}
7819
645c22ef
DM
7820/* backend for C<catpvf_mg> and C<catpvf_mg_nocontext> */
7821
c5be433b
GS
7822void
7823Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7824{
7825 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
7826 SvSETMAGIC(sv);
7827}
7828
954c1994
GS
7829/*
7830=for apidoc sv_vsetpvfn
7831
7832Works like C<vcatpvfn> but copies the text into the SV instead of
7833appending it.
7834
645c22ef
DM
7835Usually used via one of its frontends C<sv_setpvf> and C<sv_setpvf_mg>.
7836
954c1994
GS
7837=cut
7838*/
7839
46fc3d4c 7840void
7d5ea4e7 7841Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 7842{
7843 sv_setpvn(sv, "", 0);
7d5ea4e7 7844 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 7845}
7846
645c22ef
DM
7847/* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
7848
2d00ba3b 7849STATIC I32
9dd79c3f 7850S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
7851{
7852 I32 var = 0;
7853 switch (**pattern) {
7854 case '1': case '2': case '3':
7855 case '4': case '5': case '6':
7856 case '7': case '8': case '9':
7857 while (isDIGIT(**pattern))
7858 var = var * 10 + (*(*pattern)++ - '0');
7859 }
7860 return var;
7861}
9dd79c3f 7862#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 7863
954c1994
GS
7864/*
7865=for apidoc sv_vcatpvfn
7866
7867Processes its arguments like C<vsprintf> and appends the formatted output
7868to an SV. Uses an array of SVs if the C style variable argument list is
7869missing (NULL). When running with taint checks enabled, indicates via
7870C<maybe_tainted> if results are untrustworthy (often due to the use of
7871locales).
7872
645c22ef
DM
7873Usually used via one of its frontends C<sv_catpvf> and C<sv_catpvf_mg>.
7874
954c1994
GS
7875=cut
7876*/
7877
46fc3d4c 7878void
7d5ea4e7 7879Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 7880{
7881 char *p;
7882 char *q;
7883 char *patend;
fc36a67e 7884 STRLEN origlen;
46fc3d4c 7885 I32 svix = 0;
c635e13b 7886 static char nullstr[] = "(null)";
9c5ffd7c 7887 SV *argsv = Nullsv;
2cf2cfc6 7888 bool has_utf8 = FALSE; /* has the result utf8? */
46fc3d4c 7889
7890 /* no matter what, this is a string now */
fc36a67e 7891 (void)SvPV_force(sv, origlen);
46fc3d4c 7892
fc36a67e 7893 /* special-case "", "%s", and "%_" */
46fc3d4c 7894 if (patlen == 0)
7895 return;
fc36a67e 7896 if (patlen == 2 && pat[0] == '%') {
7897 switch (pat[1]) {
7898 case 's':
c635e13b 7899 if (args) {
7900 char *s = va_arg(*args, char*);
7901 sv_catpv(sv, s ? s : nullstr);
7902 }
7e2040f0 7903 else if (svix < svmax) {
fc36a67e 7904 sv_catsv(sv, *svargs);
7e2040f0
GS
7905 if (DO_UTF8(*svargs))
7906 SvUTF8_on(sv);
7907 }
fc36a67e 7908 return;
7909 case '_':
7910 if (args) {
7e2040f0
GS
7911 argsv = va_arg(*args, SV*);
7912 sv_catsv(sv, argsv);
7913 if (DO_UTF8(argsv))
7914 SvUTF8_on(sv);
fc36a67e 7915 return;
7916 }
7917 /* See comment on '_' below */
7918 break;
7919 }
46fc3d4c 7920 }
7921
2cf2cfc6 7922 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 7923 has_utf8 = TRUE;
2cf2cfc6 7924
46fc3d4c 7925 patend = (char*)pat + patlen;
7926 for (p = (char*)pat; p < patend; p = q) {
7927 bool alt = FALSE;
7928 bool left = FALSE;
b22c7a20 7929 bool vectorize = FALSE;
211dfcf1 7930 bool vectorarg = FALSE;
2cf2cfc6 7931 bool vec_utf8 = FALSE;
46fc3d4c 7932 char fill = ' ';
7933 char plus = 0;
7934 char intsize = 0;
7935 STRLEN width = 0;
fc36a67e 7936 STRLEN zeros = 0;
46fc3d4c 7937 bool has_precis = FALSE;
7938 STRLEN precis = 0;
2cf2cfc6 7939 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
7940#ifdef HAS_LDBL_SPRINTF_BUG
7941 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 7942 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
7943 bool fix_ldbl_sprintf_bug = FALSE;
7944#endif
205f51d8 7945
46fc3d4c 7946 char esignbuf[4];
ad391ad9 7947 U8 utf8buf[UTF8_MAXLEN+1];
46fc3d4c 7948 STRLEN esignlen = 0;
7949
7950 char *eptr = Nullch;
fc36a67e 7951 STRLEN elen = 0;
089c015b
JH
7952 /* Times 4: a decimal digit takes more than 3 binary digits.
7953 * NV_DIG: mantissa takes than many decimal digits.
7954 * Plus 32: Playing safe. */
7955 char ebuf[IV_DIG * 4 + NV_DIG + 32];
205f51d8 7956 /* large enough for "%#.#f" --chip */
2d4389e4 7957 /* what about long double NVs? --jhi */
b22c7a20 7958
81f715da 7959 SV *vecsv = Nullsv;
a05b299f 7960 U8 *vecstr = Null(U8*);
b22c7a20 7961 STRLEN veclen = 0;
934abaf1 7962 char c = 0;
46fc3d4c 7963 int i;
9c5ffd7c 7964 unsigned base = 0;
8c8eb53c
RB
7965 IV iv = 0;
7966 UV uv = 0;
9e5b023a
JH
7967 /* we need a long double target in case HAS_LONG_DOUBLE but
7968 not USE_LONG_DOUBLE
7969 */
35fff930 7970#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
7971 long double nv;
7972#else
65202027 7973 NV nv;
9e5b023a 7974#endif
46fc3d4c 7975 STRLEN have;
7976 STRLEN need;
7977 STRLEN gap;
b22c7a20
GS
7978 char *dotstr = ".";
7979 STRLEN dotstrlen = 1;
211dfcf1 7980 I32 efix = 0; /* explicit format parameter index */
eb3fce90 7981 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
7982 I32 epix = 0; /* explicit precision index */
7983 I32 evix = 0; /* explicit vector index */
eb3fce90 7984 bool asterisk = FALSE;
46fc3d4c 7985
211dfcf1 7986 /* echo everything up to the next format specification */
46fc3d4c 7987 for (q = p; q < patend && *q != '%'; ++q) ;
7988 if (q > p) {
7989 sv_catpvn(sv, p, q - p);
7990 p = q;
7991 }
7992 if (q++ >= patend)
7993 break;
7994
211dfcf1
HS
7995/*
7996 We allow format specification elements in this order:
7997 \d+\$ explicit format parameter index
7998 [-+ 0#]+ flags
a472f209 7999 v|\*(\d+\$)?v vector with optional (optionally specified) arg
211dfcf1
HS
8000 \d+|\*(\d+\$)? width using optional (optionally specified) arg
8001 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
8002 [hlqLV] size
8003 [%bcdefginopsux_DFOUX] format (mandatory)
8004*/
8005 if (EXPECT_NUMBER(q, width)) {
8006 if (*q == '$') {
8007 ++q;
8008 efix = width;
8009 } else {
8010 goto gotwidth;
8011 }
8012 }
8013
fc36a67e 8014 /* FLAGS */
8015
46fc3d4c 8016 while (*q) {
8017 switch (*q) {
8018 case ' ':
8019 case '+':
8020 plus = *q++;
8021 continue;
8022
8023 case '-':
8024 left = TRUE;
8025 q++;
8026 continue;
8027
8028 case '0':
8029 fill = *q++;
8030 continue;
8031
8032 case '#':
8033 alt = TRUE;
8034 q++;
8035 continue;
8036
fc36a67e 8037 default:
8038 break;
8039 }
8040 break;
8041 }
46fc3d4c 8042
211dfcf1 8043 tryasterisk:
eb3fce90 8044 if (*q == '*') {
211dfcf1
HS
8045 q++;
8046 if (EXPECT_NUMBER(q, ewix))
8047 if (*q++ != '$')
8048 goto unknown;
eb3fce90 8049 asterisk = TRUE;
211dfcf1
HS
8050 }
8051 if (*q == 'v') {
eb3fce90 8052 q++;
211dfcf1
HS
8053 if (vectorize)
8054 goto unknown;
9cbac4c7 8055 if ((vectorarg = asterisk)) {
211dfcf1
HS
8056 evix = ewix;
8057 ewix = 0;
8058 asterisk = FALSE;
8059 }
8060 vectorize = TRUE;
8061 goto tryasterisk;
eb3fce90
JH
8062 }
8063
211dfcf1
HS
8064 if (!asterisk)
8065 EXPECT_NUMBER(q, width);
8066
8067 if (vectorize) {
8068 if (vectorarg) {
8069 if (args)
8070 vecsv = va_arg(*args, SV*);
8071 else
8072 vecsv = (evix ? evix <= svmax : svix < svmax) ?
8073 svargs[ewix ? ewix-1 : svix++] : &PL_sv_undef;
4459522c 8074 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1 8075 if (DO_UTF8(vecsv))
2cf2cfc6 8076 is_utf8 = TRUE;
211dfcf1
HS
8077 }
8078 if (args) {
8079 vecsv = va_arg(*args, SV*);
8080 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 8081 vec_utf8 = DO_UTF8(vecsv);
eb3fce90 8082 }
211dfcf1
HS
8083 else if (efix ? efix <= svmax : svix < svmax) {
8084 vecsv = svargs[efix ? efix-1 : svix++];
8085 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 8086 vec_utf8 = DO_UTF8(vecsv);
211dfcf1
HS
8087 }
8088 else {
8089 vecstr = (U8*)"";
8090 veclen = 0;
8091 }
eb3fce90 8092 }
fc36a67e 8093
eb3fce90 8094 if (asterisk) {
fc36a67e 8095 if (args)
8096 i = va_arg(*args, int);
8097 else
eb3fce90
JH
8098 i = (ewix ? ewix <= svmax : svix < svmax) ?
8099 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8100 left |= (i < 0);
8101 width = (i < 0) ? -i : i;
fc36a67e 8102 }
211dfcf1 8103 gotwidth:
fc36a67e 8104
8105 /* PRECISION */
46fc3d4c 8106
fc36a67e 8107 if (*q == '.') {
8108 q++;
8109 if (*q == '*') {
211dfcf1 8110 q++;
7b8dd722
HS
8111 if (EXPECT_NUMBER(q, epix) && *q++ != '$')
8112 goto unknown;
8113 /* XXX: todo, support specified precision parameter */
8114 if (epix)
211dfcf1 8115 goto unknown;
46fc3d4c 8116 if (args)
8117 i = va_arg(*args, int);
8118 else
eb3fce90
JH
8119 i = (ewix ? ewix <= svmax : svix < svmax)
8120 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8121 precis = (i < 0) ? 0 : i;
fc36a67e 8122 }
8123 else {
8124 precis = 0;
8125 while (isDIGIT(*q))
8126 precis = precis * 10 + (*q++ - '0');
8127 }
8128 has_precis = TRUE;
8129 }
46fc3d4c 8130
fc36a67e 8131 /* SIZE */
46fc3d4c 8132
fc36a67e 8133 switch (*q) {
c623ac67
GS
8134#ifdef WIN32
8135 case 'I': /* Ix, I32x, and I64x */
8136# ifdef WIN64
8137 if (q[1] == '6' && q[2] == '4') {
8138 q += 3;
8139 intsize = 'q';
8140 break;
8141 }
8142# endif
8143 if (q[1] == '3' && q[2] == '2') {
8144 q += 3;
8145 break;
8146 }
8147# ifdef WIN64
8148 intsize = 'q';
8149# endif
8150 q++;
8151 break;
8152#endif
9e5b023a 8153#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 8154 case 'L': /* Ld */
e5c81feb 8155 /* FALL THROUGH */
e5c81feb 8156#ifdef HAS_QUAD
6f9bb7fd 8157 case 'q': /* qd */
9e5b023a 8158#endif
6f9bb7fd
GS
8159 intsize = 'q';
8160 q++;
8161 break;
8162#endif
fc36a67e 8163 case 'l':
9e5b023a 8164#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 8165 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 8166 intsize = 'q';
8167 q += 2;
46fc3d4c 8168 break;
cf2093f6 8169 }
fc36a67e 8170#endif
6f9bb7fd 8171 /* FALL THROUGH */
fc36a67e 8172 case 'h':
cf2093f6 8173 /* FALL THROUGH */
fc36a67e 8174 case 'V':
8175 intsize = *q++;
46fc3d4c 8176 break;
8177 }
8178
fc36a67e 8179 /* CONVERSION */
8180
211dfcf1
HS
8181 if (*q == '%') {
8182 eptr = q++;
8183 elen = 1;
8184 goto string;
8185 }
8186
be75b157
HS
8187 if (vectorize)
8188 argsv = vecsv;
8189 else if (!args)
211dfcf1
HS
8190 argsv = (efix ? efix <= svmax : svix < svmax) ?
8191 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
8192
46fc3d4c 8193 switch (c = *q++) {
8194
8195 /* STRINGS */
8196
46fc3d4c 8197 case 'c':
be75b157 8198 uv = (args && !vectorize) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
8199 if ((uv > 255 ||
8200 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 8201 && !IN_BYTES) {
dfe13c55 8202 eptr = (char*)utf8buf;
9041c2e3 8203 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 8204 is_utf8 = TRUE;
7e2040f0
GS
8205 }
8206 else {
8207 c = (char)uv;
8208 eptr = &c;
8209 elen = 1;
a0ed51b3 8210 }
46fc3d4c 8211 goto string;
8212
46fc3d4c 8213 case 's':
be75b157 8214 if (args && !vectorize) {
fc36a67e 8215 eptr = va_arg(*args, char*);
c635e13b 8216 if (eptr)
1d7c1841
GS
8217#ifdef MACOS_TRADITIONAL
8218 /* On MacOS, %#s format is used for Pascal strings */
8219 if (alt)
8220 elen = *eptr++;
8221 else
8222#endif
c635e13b 8223 elen = strlen(eptr);
8224 else {
8225 eptr = nullstr;
8226 elen = sizeof nullstr - 1;
8227 }
46fc3d4c 8228 }
211dfcf1 8229 else {
7e2040f0
GS
8230 eptr = SvPVx(argsv, elen);
8231 if (DO_UTF8(argsv)) {
a0ed51b3
LW
8232 if (has_precis && precis < elen) {
8233 I32 p = precis;
7e2040f0 8234 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
8235 precis = p;
8236 }
8237 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 8238 width += elen - sv_len_utf8(argsv);
a0ed51b3 8239 }
2cf2cfc6 8240 is_utf8 = TRUE;
a0ed51b3
LW
8241 }
8242 }
46fc3d4c 8243 goto string;
8244
fc36a67e 8245 case '_':
8246 /*
8247 * The "%_" hack might have to be changed someday,
8248 * if ISO or ANSI decide to use '_' for something.
8249 * So we keep it hidden from users' code.
8250 */
be75b157 8251 if (!args || vectorize)
fc36a67e 8252 goto unknown;
211dfcf1 8253 argsv = va_arg(*args, SV*);
7e2040f0
GS
8254 eptr = SvPVx(argsv, elen);
8255 if (DO_UTF8(argsv))
2cf2cfc6 8256 is_utf8 = TRUE;
fc36a67e 8257
46fc3d4c 8258 string:
b22c7a20 8259 vectorize = FALSE;
46fc3d4c 8260 if (has_precis && elen > precis)
8261 elen = precis;
8262 break;
8263
8264 /* INTEGERS */
8265
fc36a67e 8266 case 'p':
be75b157 8267 if (alt || vectorize)
c2e66d9e 8268 goto unknown;
211dfcf1 8269 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 8270 base = 16;
8271 goto integer;
8272
46fc3d4c 8273 case 'D':
29fe7a80 8274#ifdef IV_IS_QUAD
22f3ae8c 8275 intsize = 'q';
29fe7a80 8276#else
46fc3d4c 8277 intsize = 'l';
29fe7a80 8278#endif
46fc3d4c 8279 /* FALL THROUGH */
8280 case 'd':
8281 case 'i':
b22c7a20 8282 if (vectorize) {
ba210ebe 8283 STRLEN ulen;
211dfcf1
HS
8284 if (!veclen)
8285 continue;
2cf2cfc6
A
8286 if (vec_utf8)
8287 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8288 UTF8_ALLOW_ANYUV);
b22c7a20 8289 else {
e83d50c9 8290 uv = *vecstr;
b22c7a20
GS
8291 ulen = 1;
8292 }
8293 vecstr += ulen;
8294 veclen -= ulen;
e83d50c9
JP
8295 if (plus)
8296 esignbuf[esignlen++] = plus;
b22c7a20
GS
8297 }
8298 else if (args) {
46fc3d4c 8299 switch (intsize) {
8300 case 'h': iv = (short)va_arg(*args, int); break;
8301 default: iv = va_arg(*args, int); break;
8302 case 'l': iv = va_arg(*args, long); break;
fc36a67e 8303 case 'V': iv = va_arg(*args, IV); break;
cf2093f6
JH
8304#ifdef HAS_QUAD
8305 case 'q': iv = va_arg(*args, Quad_t); break;
8306#endif
46fc3d4c 8307 }
8308 }
8309 else {
211dfcf1 8310 iv = SvIVx(argsv);
46fc3d4c 8311 switch (intsize) {
8312 case 'h': iv = (short)iv; break;
be28567c 8313 default: break;
46fc3d4c 8314 case 'l': iv = (long)iv; break;
fc36a67e 8315 case 'V': break;
cf2093f6
JH
8316#ifdef HAS_QUAD
8317 case 'q': iv = (Quad_t)iv; break;
8318#endif
46fc3d4c 8319 }
8320 }
e83d50c9
JP
8321 if ( !vectorize ) /* we already set uv above */
8322 {
8323 if (iv >= 0) {
8324 uv = iv;
8325 if (plus)
8326 esignbuf[esignlen++] = plus;
8327 }
8328 else {
8329 uv = -iv;
8330 esignbuf[esignlen++] = '-';
8331 }
46fc3d4c 8332 }
8333 base = 10;
8334 goto integer;
8335
fc36a67e 8336 case 'U':
29fe7a80 8337#ifdef IV_IS_QUAD
22f3ae8c 8338 intsize = 'q';
29fe7a80 8339#else
fc36a67e 8340 intsize = 'l';
29fe7a80 8341#endif
fc36a67e 8342 /* FALL THROUGH */
8343 case 'u':
8344 base = 10;
8345 goto uns_integer;
8346
4f19785b
WSI
8347 case 'b':
8348 base = 2;
8349 goto uns_integer;
8350
46fc3d4c 8351 case 'O':
29fe7a80 8352#ifdef IV_IS_QUAD
22f3ae8c 8353 intsize = 'q';
29fe7a80 8354#else
46fc3d4c 8355 intsize = 'l';
29fe7a80 8356#endif
46fc3d4c 8357 /* FALL THROUGH */
8358 case 'o':
8359 base = 8;
8360 goto uns_integer;
8361
8362 case 'X':
46fc3d4c 8363 case 'x':
8364 base = 16;
46fc3d4c 8365
8366 uns_integer:
b22c7a20 8367 if (vectorize) {
ba210ebe 8368 STRLEN ulen;
b22c7a20 8369 vector:
211dfcf1
HS
8370 if (!veclen)
8371 continue;
2cf2cfc6
A
8372 if (vec_utf8)
8373 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8374 UTF8_ALLOW_ANYUV);
b22c7a20 8375 else {
a05b299f 8376 uv = *vecstr;
b22c7a20
GS
8377 ulen = 1;
8378 }
8379 vecstr += ulen;
8380 veclen -= ulen;
8381 }
8382 else if (args) {
46fc3d4c 8383 switch (intsize) {
8384 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
8385 default: uv = va_arg(*args, unsigned); break;
8386 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 8387 case 'V': uv = va_arg(*args, UV); break;
cf2093f6
JH
8388#ifdef HAS_QUAD
8389 case 'q': uv = va_arg(*args, Quad_t); break;
8390#endif
46fc3d4c 8391 }
8392 }
8393 else {
211dfcf1 8394 uv = SvUVx(argsv);
46fc3d4c 8395 switch (intsize) {
8396 case 'h': uv = (unsigned short)uv; break;
be28567c 8397 default: break;
46fc3d4c 8398 case 'l': uv = (unsigned long)uv; break;
fc36a67e 8399 case 'V': break;
cf2093f6
JH
8400#ifdef HAS_QUAD
8401 case 'q': uv = (Quad_t)uv; break;
8402#endif
46fc3d4c 8403 }
8404 }
8405
8406 integer:
46fc3d4c 8407 eptr = ebuf + sizeof ebuf;
fc36a67e 8408 switch (base) {
8409 unsigned dig;
8410 case 16:
c10ed8b9
HS
8411 if (!uv)
8412 alt = FALSE;
1d7c1841
GS
8413 p = (char*)((c == 'X')
8414 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 8415 do {
8416 dig = uv & 15;
8417 *--eptr = p[dig];
8418 } while (uv >>= 4);
8419 if (alt) {
46fc3d4c 8420 esignbuf[esignlen++] = '0';
fc36a67e 8421 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 8422 }
fc36a67e 8423 break;
8424 case 8:
8425 do {
8426 dig = uv & 7;
8427 *--eptr = '0' + dig;
8428 } while (uv >>= 3);
8429 if (alt && *eptr != '0')
8430 *--eptr = '0';
8431 break;
4f19785b
WSI
8432 case 2:
8433 do {
8434 dig = uv & 1;
8435 *--eptr = '0' + dig;
8436 } while (uv >>= 1);
eda88b6d
JH
8437 if (alt) {
8438 esignbuf[esignlen++] = '0';
7481bb52 8439 esignbuf[esignlen++] = 'b';
eda88b6d 8440 }
4f19785b 8441 break;
fc36a67e 8442 default: /* it had better be ten or less */
6bc102ca 8443#if defined(PERL_Y2KWARN)
e476b1b5 8444 if (ckWARN(WARN_Y2K)) {
6bc102ca
GS
8445 STRLEN n;
8446 char *s = SvPV(sv,n);
8447 if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
8448 && (n == 2 || !isDIGIT(s[n-3])))
8449 {
9014280d 8450 Perl_warner(aTHX_ packWARN(WARN_Y2K),
6bc102ca
GS
8451 "Possible Y2K bug: %%%c %s",
8452 c, "format string following '19'");
8453 }
8454 }
8455#endif
fc36a67e 8456 do {
8457 dig = uv % base;
8458 *--eptr = '0' + dig;
8459 } while (uv /= base);
8460 break;
46fc3d4c 8461 }
8462 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
8463 if (has_precis) {
8464 if (precis > elen)
8465 zeros = precis - elen;
8466 else if (precis == 0 && elen == 1 && *eptr == '0')
8467 elen = 0;
8468 }
46fc3d4c 8469 break;
8470
8471 /* FLOATING POINT */
8472
fc36a67e 8473 case 'F':
8474 c = 'f'; /* maybe %F isn't supported here */
8475 /* FALL THROUGH */
46fc3d4c 8476 case 'e': case 'E':
fc36a67e 8477 case 'f':
46fc3d4c 8478 case 'g': case 'G':
8479
8480 /* This is evil, but floating point is even more evil */
8481
9e5b023a
JH
8482 /* for SV-style calling, we can only get NV
8483 for C-style calling, we assume %f is double;
8484 for simplicity we allow any of %Lf, %llf, %qf for long double
8485 */
8486 switch (intsize) {
8487 case 'V':
8488#if defined(USE_LONG_DOUBLE)
8489 intsize = 'q';
8490#endif
8491 break;
8492 default:
8493#if defined(USE_LONG_DOUBLE)
8494 intsize = args ? 0 : 'q';
8495#endif
8496 break;
8497 case 'q':
8498#if defined(HAS_LONG_DOUBLE)
8499 break;
8500#else
8501 /* FALL THROUGH */
8502#endif
8503 case 'h':
8504 /* FALL THROUGH */
8505 case 'l':
8506 goto unknown;
8507 }
8508
8509 /* now we need (long double) if intsize == 'q', else (double) */
be75b157 8510 nv = (args && !vectorize) ?
35fff930
JH
8511#if LONG_DOUBLESIZE > DOUBLESIZE
8512 intsize == 'q' ?
205f51d8
AS
8513 va_arg(*args, long double) :
8514 va_arg(*args, double)
35fff930 8515#else
205f51d8 8516 va_arg(*args, double)
35fff930 8517#endif
9e5b023a 8518 : SvNVx(argsv);
fc36a67e 8519
8520 need = 0;
be75b157 8521 vectorize = FALSE;
fc36a67e 8522 if (c != 'e' && c != 'E') {
8523 i = PERL_INT_MIN;
9e5b023a
JH
8524 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
8525 will cast our (long double) to (double) */
73b309ea 8526 (void)Perl_frexp(nv, &i);
fc36a67e 8527 if (i == PERL_INT_MIN)
cea2e8a9 8528 Perl_die(aTHX_ "panic: frexp");
c635e13b 8529 if (i > 0)
fc36a67e 8530 need = BIT_DIGITS(i);
8531 }
8532 need += has_precis ? precis : 6; /* known default */
20f6aaab 8533
fc36a67e 8534 if (need < width)
8535 need = width;
8536
20f6aaab
AS
8537#ifdef HAS_LDBL_SPRINTF_BUG
8538 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
8539 with sfio - Allen <allens@cpan.org> */
8540
8541# ifdef DBL_MAX
8542# define MY_DBL_MAX DBL_MAX
8543# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
8544# if DOUBLESIZE >= 8
8545# define MY_DBL_MAX 1.7976931348623157E+308L
8546# else
8547# define MY_DBL_MAX 3.40282347E+38L
8548# endif
8549# endif
8550
8551# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
8552# define MY_DBL_MAX_BUG 1L
20f6aaab 8553# else
205f51d8 8554# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 8555# endif
20f6aaab 8556
205f51d8
AS
8557# ifdef DBL_MIN
8558# define MY_DBL_MIN DBL_MIN
8559# else /* XXX guessing! -Allen */
8560# if DOUBLESIZE >= 8
8561# define MY_DBL_MIN 2.2250738585072014E-308L
8562# else
8563# define MY_DBL_MIN 1.17549435E-38L
8564# endif
8565# endif
20f6aaab 8566
205f51d8
AS
8567 if ((intsize == 'q') && (c == 'f') &&
8568 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
8569 (need < DBL_DIG)) {
8570 /* it's going to be short enough that
8571 * long double precision is not needed */
8572
8573 if ((nv <= 0L) && (nv >= -0L))
8574 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
8575 else {
8576 /* would use Perl_fp_class as a double-check but not
8577 * functional on IRIX - see perl.h comments */
8578
8579 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
8580 /* It's within the range that a double can represent */
8581#if defined(DBL_MAX) && !defined(DBL_MIN)
8582 if ((nv >= ((long double)1/DBL_MAX)) ||
8583 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 8584#endif
205f51d8 8585 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 8586 }
205f51d8
AS
8587 }
8588 if (fix_ldbl_sprintf_bug == TRUE) {
8589 double temp;
8590
8591 intsize = 0;
8592 temp = (double)nv;
8593 nv = (NV)temp;
8594 }
20f6aaab 8595 }
205f51d8
AS
8596
8597# undef MY_DBL_MAX
8598# undef MY_DBL_MAX_BUG
8599# undef MY_DBL_MIN
8600
20f6aaab
AS
8601#endif /* HAS_LDBL_SPRINTF_BUG */
8602
46fc3d4c 8603 need += 20; /* fudge factor */
80252599
GS
8604 if (PL_efloatsize < need) {
8605 Safefree(PL_efloatbuf);
8606 PL_efloatsize = need + 20; /* more fudge */
8607 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 8608 PL_efloatbuf[0] = '\0';
46fc3d4c 8609 }
8610
8611 eptr = ebuf + sizeof ebuf;
8612 *--eptr = '\0';
8613 *--eptr = c;
9e5b023a
JH
8614 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
8615#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
8616 if (intsize == 'q') {
e5c81feb
JH
8617 /* Copy the one or more characters in a long double
8618 * format before the 'base' ([efgEFG]) character to
8619 * the format string. */
8620 static char const prifldbl[] = PERL_PRIfldbl;
8621 char const *p = prifldbl + sizeof(prifldbl) - 3;
8622 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 8623 }
65202027 8624#endif
46fc3d4c 8625 if (has_precis) {
8626 base = precis;
8627 do { *--eptr = '0' + (base % 10); } while (base /= 10);
8628 *--eptr = '.';
8629 }
8630 if (width) {
8631 base = width;
8632 do { *--eptr = '0' + (base % 10); } while (base /= 10);
8633 }
8634 if (fill == '0')
8635 *--eptr = fill;
84902520
TB
8636 if (left)
8637 *--eptr = '-';
46fc3d4c 8638 if (plus)
8639 *--eptr = plus;
8640 if (alt)
8641 *--eptr = '#';
8642 *--eptr = '%';
8643
ff9121f8
JH
8644 /* No taint. Otherwise we are in the strange situation
8645 * where printf() taints but print($float) doesn't.
bda0f7a5 8646 * --jhi */
9e5b023a
JH
8647#if defined(HAS_LONG_DOUBLE)
8648 if (intsize == 'q')
8649 (void)sprintf(PL_efloatbuf, eptr, nv);
8650 else
8651 (void)sprintf(PL_efloatbuf, eptr, (double)nv);
8652#else
dd8482fc 8653 (void)sprintf(PL_efloatbuf, eptr, nv);
9e5b023a 8654#endif
80252599
GS
8655 eptr = PL_efloatbuf;
8656 elen = strlen(PL_efloatbuf);
46fc3d4c 8657 break;
8658
fc36a67e 8659 /* SPECIAL */
8660
8661 case 'n':
8662 i = SvCUR(sv) - origlen;
be75b157 8663 if (args && !vectorize) {
c635e13b 8664 switch (intsize) {
8665 case 'h': *(va_arg(*args, short*)) = i; break;
8666 default: *(va_arg(*args, int*)) = i; break;
8667 case 'l': *(va_arg(*args, long*)) = i; break;
8668 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
8669#ifdef HAS_QUAD
8670 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
8671#endif
c635e13b 8672 }
fc36a67e 8673 }
9dd79c3f 8674 else
211dfcf1 8675 sv_setuv_mg(argsv, (UV)i);
be75b157 8676 vectorize = FALSE;
fc36a67e 8677 continue; /* not "break" */
8678
8679 /* UNKNOWN */
8680
46fc3d4c 8681 default:
fc36a67e 8682 unknown:
b22c7a20 8683 vectorize = FALSE;
599cee73 8684 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 8685 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 8686 SV *msg = sv_newmortal();
cea2e8a9 8687 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %s: ",
533c011a 8688 (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
0f4b6630 8689 if (c) {
0f4b6630 8690 if (isPRINT(c))
1c846c1f 8691 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
8692 "\"%%%c\"", c & 0xFF);
8693 else
8694 Perl_sv_catpvf(aTHX_ msg,
57def98f 8695 "\"%%\\%03"UVof"\"",
0f4b6630 8696 (UV)c & 0xFF);
0f4b6630 8697 } else
c635e13b 8698 sv_catpv(msg, "end of string");
9014280d 8699 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 8700 }
fb73857a 8701
8702 /* output mangled stuff ... */
8703 if (c == '\0')
8704 --q;
46fc3d4c 8705 eptr = p;
8706 elen = q - p;
fb73857a 8707
8708 /* ... right here, because formatting flags should not apply */
8709 SvGROW(sv, SvCUR(sv) + elen + 1);
8710 p = SvEND(sv);
4459522c 8711 Copy(eptr, p, elen, char);
fb73857a 8712 p += elen;
8713 *p = '\0';
8714 SvCUR(sv) = p - SvPVX(sv);
8715 continue; /* not "break" */
46fc3d4c 8716 }
8717
d2876be5
JH
8718 if (is_utf8 != has_utf8) {
8719 if (is_utf8) {
8720 if (SvCUR(sv))
8721 sv_utf8_upgrade(sv);
8722 }
8723 else {
8724 SV *nsv = sv_2mortal(newSVpvn(eptr, elen));
8725 sv_utf8_upgrade(nsv);
8726 eptr = SvPVX(nsv);
8727 elen = SvCUR(nsv);
8728 }
8729 SvGROW(sv, SvCUR(sv) + elen + 1);
8730 p = SvEND(sv);
8731 *p = '\0';
8732 }
8733
fc36a67e 8734 have = esignlen + zeros + elen;
46fc3d4c 8735 need = (have > width ? have : width);
8736 gap = need - have;
8737
b22c7a20 8738 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 8739 p = SvEND(sv);
8740 if (esignlen && fill == '0') {
eb160463 8741 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 8742 *p++ = esignbuf[i];
8743 }
8744 if (gap && !left) {
8745 memset(p, fill, gap);
8746 p += gap;
8747 }
8748 if (esignlen && fill != '0') {
eb160463 8749 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 8750 *p++ = esignbuf[i];
8751 }
fc36a67e 8752 if (zeros) {
8753 for (i = zeros; i; i--)
8754 *p++ = '0';
8755 }
46fc3d4c 8756 if (elen) {
4459522c 8757 Copy(eptr, p, elen, char);
46fc3d4c 8758 p += elen;
8759 }
8760 if (gap && left) {
8761 memset(p, ' ', gap);
8762 p += gap;
8763 }
b22c7a20
GS
8764 if (vectorize) {
8765 if (veclen) {
4459522c 8766 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
8767 p += dotstrlen;
8768 }
8769 else
8770 vectorize = FALSE; /* done iterating over vecstr */
8771 }
2cf2cfc6
A
8772 if (is_utf8)
8773 has_utf8 = TRUE;
8774 if (has_utf8)
7e2040f0 8775 SvUTF8_on(sv);
46fc3d4c 8776 *p = '\0';
8777 SvCUR(sv) = p - SvPVX(sv);
b22c7a20
GS
8778 if (vectorize) {
8779 esignlen = 0;
8780 goto vector;
8781 }
46fc3d4c 8782 }
8783}
51371543 8784
645c22ef
DM
8785/* =========================================================================
8786
8787=head1 Cloning an interpreter
8788
8789All the macros and functions in this section are for the private use of
8790the main function, perl_clone().
8791
8792The foo_dup() functions make an exact copy of an existing foo thinngy.
8793During the course of a cloning, a hash table is used to map old addresses
8794to new addresses. The table is created and manipulated with the
8795ptr_table_* functions.
8796
8797=cut
8798
8799============================================================================*/
8800
8801
1d7c1841
GS
8802#if defined(USE_ITHREADS)
8803
1d7c1841
GS
8804#ifndef GpREFCNT_inc
8805# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
8806#endif
8807
8808
d2d73c3e
AB
8809#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
8810#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
8811#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8812#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
8813#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8814#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
8815#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8816#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
8817#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
8818#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
8819#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
8820#define SAVEPV(p) (p ? savepv(p) : Nullch)
8821#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 8822
d2d73c3e 8823
d2f185dc
AMS
8824/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
8825 regcomp.c. AMS 20010712 */
645c22ef 8826
1d7c1841 8827REGEXP *
a8fc9800 8828Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
1d7c1841 8829{
d2f185dc
AMS
8830 REGEXP *ret;
8831 int i, len, npar;
8832 struct reg_substr_datum *s;
8833
8834 if (!r)
8835 return (REGEXP *)NULL;
8836
8837 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
8838 return ret;
8839
8840 len = r->offsets[0];
8841 npar = r->nparens+1;
8842
8843 Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
8844 Copy(r->program, ret->program, len+1, regnode);
8845
8846 New(0, ret->startp, npar, I32);
8847 Copy(r->startp, ret->startp, npar, I32);
8848 New(0, ret->endp, npar, I32);
8849 Copy(r->startp, ret->startp, npar, I32);
8850
d2f185dc
AMS
8851 New(0, ret->substrs, 1, struct reg_substr_data);
8852 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
8853 s->min_offset = r->substrs->data[i].min_offset;
8854 s->max_offset = r->substrs->data[i].max_offset;
8855 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 8856 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
8857 }
8858
70612e96 8859 ret->regstclass = NULL;
d2f185dc
AMS
8860 if (r->data) {
8861 struct reg_data *d;
8862 int count = r->data->count;
8863
8864 Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
8865 char, struct reg_data);
8866 New(0, d->what, count, U8);
8867
8868 d->count = count;
8869 for (i = 0; i < count; i++) {
8870 d->what[i] = r->data->what[i];
8871 switch (d->what[i]) {
8872 case 's':
8873 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
8874 break;
8875 case 'p':
8876 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
8877 break;
8878 case 'f':
8879 /* This is cheating. */
8880 New(0, d->data[i], 1, struct regnode_charclass_class);
8881 StructCopy(r->data->data[i], d->data[i],
8882 struct regnode_charclass_class);
70612e96 8883 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
8884 break;
8885 case 'o':
33773810
AMS
8886 /* Compiled op trees are readonly, and can thus be
8887 shared without duplication. */
9b978d73
DM
8888 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
8889 break;
d2f185dc
AMS
8890 case 'n':
8891 d->data[i] = r->data->data[i];
8892 break;
8893 }
8894 }
8895
8896 ret->data = d;
8897 }
8898 else
8899 ret->data = NULL;
8900
8901 New(0, ret->offsets, 2*len+1, U32);
8902 Copy(r->offsets, ret->offsets, 2*len+1, U32);
8903
8904 ret->precomp = SAVEPV(r->precomp);
d2f185dc
AMS
8905 ret->refcnt = r->refcnt;
8906 ret->minlen = r->minlen;
8907 ret->prelen = r->prelen;
8908 ret->nparens = r->nparens;
8909 ret->lastparen = r->lastparen;
8910 ret->lastcloseparen = r->lastcloseparen;
8911 ret->reganch = r->reganch;
8912
70612e96
RG
8913 ret->sublen = r->sublen;
8914
8915 if (RX_MATCH_COPIED(ret))
8916 ret->subbeg = SAVEPV(r->subbeg);
8917 else
8918 ret->subbeg = Nullch;
8919
d2f185dc
AMS
8920 ptr_table_store(PL_ptr_table, r, ret);
8921 return ret;
1d7c1841
GS
8922}
8923
d2d73c3e 8924/* duplicate a file handle */
645c22ef 8925
1d7c1841 8926PerlIO *
a8fc9800 8927Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
8928{
8929 PerlIO *ret;
8930 if (!fp)
8931 return (PerlIO*)NULL;
8932
8933 /* look for it in the table first */
8934 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
8935 if (ret)
8936 return ret;
8937
8938 /* create anew and remember what it is */
ecdeb87c 8939 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
8940 ptr_table_store(PL_ptr_table, fp, ret);
8941 return ret;
8942}
8943
645c22ef
DM
8944/* duplicate a directory handle */
8945
1d7c1841
GS
8946DIR *
8947Perl_dirp_dup(pTHX_ DIR *dp)
8948{
8949 if (!dp)
8950 return (DIR*)NULL;
8951 /* XXX TODO */
8952 return dp;
8953}
8954
ff276b08 8955/* duplicate a typeglob */
645c22ef 8956
1d7c1841 8957GP *
a8fc9800 8958Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
8959{
8960 GP *ret;
8961 if (!gp)
8962 return (GP*)NULL;
8963 /* look for it in the table first */
8964 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
8965 if (ret)
8966 return ret;
8967
8968 /* create anew and remember what it is */
8969 Newz(0, ret, 1, GP);
8970 ptr_table_store(PL_ptr_table, gp, ret);
8971
8972 /* clone */
8973 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
8974 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
8975 ret->gp_io = io_dup_inc(gp->gp_io, param);
8976 ret->gp_form = cv_dup_inc(gp->gp_form, param);
8977 ret->gp_av = av_dup_inc(gp->gp_av, param);
8978 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
8979 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
8980 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
8981 ret->gp_cvgen = gp->gp_cvgen;
8982 ret->gp_flags = gp->gp_flags;
8983 ret->gp_line = gp->gp_line;
8984 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
8985 return ret;
8986}
8987
645c22ef
DM
8988/* duplicate a chain of magic */
8989
1d7c1841 8990MAGIC *
a8fc9800 8991Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 8992{
cb359b41
JH
8993 MAGIC *mgprev = (MAGIC*)NULL;
8994 MAGIC *mgret;
1d7c1841
GS
8995 if (!mg)
8996 return (MAGIC*)NULL;
8997 /* look for it in the table first */
8998 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
8999 if (mgret)
9000 return mgret;
9001
9002 for (; mg; mg = mg->mg_moremagic) {
9003 MAGIC *nmg;
9004 Newz(0, nmg, 1, MAGIC);
cb359b41 9005 if (mgprev)
1d7c1841 9006 mgprev->mg_moremagic = nmg;
cb359b41
JH
9007 else
9008 mgret = nmg;
1d7c1841
GS
9009 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
9010 nmg->mg_private = mg->mg_private;
9011 nmg->mg_type = mg->mg_type;
9012 nmg->mg_flags = mg->mg_flags;
14befaf4 9013 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 9014 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 9015 }
05bd4103
JH
9016 else if(mg->mg_type == PERL_MAGIC_backref) {
9017 AV *av = (AV*) mg->mg_obj;
9018 SV **svp;
9019 I32 i;
9020 nmg->mg_obj = (SV*)newAV();
9021 svp = AvARRAY(av);
9022 i = AvFILLp(av);
9023 while (i >= 0) {
9024 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
9025 i--;
9026 }
9027 }
1d7c1841
GS
9028 else {
9029 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
9030 ? sv_dup_inc(mg->mg_obj, param)
9031 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
9032 }
9033 nmg->mg_len = mg->mg_len;
9034 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 9035 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 9036 if (mg->mg_len > 0) {
1d7c1841 9037 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
9038 if (mg->mg_type == PERL_MAGIC_overload_table &&
9039 AMT_AMAGIC((AMT*)mg->mg_ptr))
9040 {
1d7c1841
GS
9041 AMT *amtp = (AMT*)mg->mg_ptr;
9042 AMT *namtp = (AMT*)nmg->mg_ptr;
9043 I32 i;
9044 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 9045 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
9046 }
9047 }
9048 }
9049 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 9050 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 9051 }
68795e93
NIS
9052 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
9053 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
9054 }
1d7c1841
GS
9055 mgprev = nmg;
9056 }
9057 return mgret;
9058}
9059
645c22ef
DM
9060/* create a new pointer-mapping table */
9061
1d7c1841
GS
9062PTR_TBL_t *
9063Perl_ptr_table_new(pTHX)
9064{
9065 PTR_TBL_t *tbl;
9066 Newz(0, tbl, 1, PTR_TBL_t);
9067 tbl->tbl_max = 511;
9068 tbl->tbl_items = 0;
9069 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
9070 return tbl;
9071}
9072
645c22ef
DM
9073/* map an existing pointer using a table */
9074
1d7c1841
GS
9075void *
9076Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
9077{
9078 PTR_TBL_ENT_t *tblent;
d2a79402 9079 UV hash = PTR2UV(sv);
1d7c1841
GS
9080 assert(tbl);
9081 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
9082 for (; tblent; tblent = tblent->next) {
9083 if (tblent->oldval == sv)
9084 return tblent->newval;
9085 }
9086 return (void*)NULL;
9087}
9088
645c22ef
DM
9089/* add a new entry to a pointer-mapping table */
9090
1d7c1841
GS
9091void
9092Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
9093{
9094 PTR_TBL_ENT_t *tblent, **otblent;
9095 /* XXX this may be pessimal on platforms where pointers aren't good
9096 * hash values e.g. if they grow faster in the most significant
9097 * bits */
d2a79402 9098 UV hash = PTR2UV(oldv);
1d7c1841
GS
9099 bool i = 1;
9100
9101 assert(tbl);
9102 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
9103 for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
9104 if (tblent->oldval == oldv) {
9105 tblent->newval = newv;
1d7c1841
GS
9106 return;
9107 }
9108 }
9109 Newz(0, tblent, 1, PTR_TBL_ENT_t);
9110 tblent->oldval = oldv;
9111 tblent->newval = newv;
9112 tblent->next = *otblent;
9113 *otblent = tblent;
9114 tbl->tbl_items++;
9115 if (i && tbl->tbl_items > tbl->tbl_max)
9116 ptr_table_split(tbl);
9117}
9118
645c22ef
DM
9119/* double the hash bucket size of an existing ptr table */
9120
1d7c1841
GS
9121void
9122Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
9123{
9124 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
9125 UV oldsize = tbl->tbl_max + 1;
9126 UV newsize = oldsize * 2;
9127 UV i;
9128
9129 Renew(ary, newsize, PTR_TBL_ENT_t*);
9130 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
9131 tbl->tbl_max = --newsize;
9132 tbl->tbl_ary = ary;
9133 for (i=0; i < oldsize; i++, ary++) {
9134 PTR_TBL_ENT_t **curentp, **entp, *ent;
9135 if (!*ary)
9136 continue;
9137 curentp = ary + oldsize;
9138 for (entp = ary, ent = *ary; ent; ent = *entp) {
d2a79402 9139 if ((newsize & PTR2UV(ent->oldval)) != i) {
1d7c1841
GS
9140 *entp = ent->next;
9141 ent->next = *curentp;
9142 *curentp = ent;
9143 continue;
9144 }
9145 else
9146 entp = &ent->next;
9147 }
9148 }
9149}
9150
645c22ef
DM
9151/* remove all the entries from a ptr table */
9152
a0739874
DM
9153void
9154Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
9155{
9156 register PTR_TBL_ENT_t **array;
9157 register PTR_TBL_ENT_t *entry;
9158 register PTR_TBL_ENT_t *oentry = Null(PTR_TBL_ENT_t*);
9159 UV riter = 0;
9160 UV max;
9161
9162 if (!tbl || !tbl->tbl_items) {
9163 return;
9164 }
9165
9166 array = tbl->tbl_ary;
9167 entry = array[0];
9168 max = tbl->tbl_max;
9169
9170 for (;;) {
9171 if (entry) {
9172 oentry = entry;
9173 entry = entry->next;
9174 Safefree(oentry);
9175 }
9176 if (!entry) {
9177 if (++riter > max) {
9178 break;
9179 }
9180 entry = array[riter];
9181 }
9182 }
9183
9184 tbl->tbl_items = 0;
9185}
9186
645c22ef
DM
9187/* clear and free a ptr table */
9188
a0739874
DM
9189void
9190Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
9191{
9192 if (!tbl) {
9193 return;
9194 }
9195 ptr_table_clear(tbl);
9196 Safefree(tbl->tbl_ary);
9197 Safefree(tbl);
9198}
9199
1d7c1841
GS
9200#ifdef DEBUGGING
9201char *PL_watch_pvx;
9202#endif
9203
645c22ef
DM
9204/* attempt to make everything in the typeglob readonly */
9205
5bd07a3d 9206STATIC SV *
59b40662 9207S_gv_share(pTHX_ SV *sstr, CLONE_PARAMS *param)
5bd07a3d
DM
9208{
9209 GV *gv = (GV*)sstr;
59b40662 9210 SV *sv = &param->proto_perl->Isv_no; /* just need SvREADONLY-ness */
5bd07a3d
DM
9211
9212 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 9213 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
9214 }
9215 else if (!GvCV(gv)) {
9216 GvCV(gv) = (CV*)sv;
9217 }
9218 else {
9219 /* CvPADLISTs cannot be shared */
37e20706 9220 if (!SvREADONLY(GvCV(gv)) && !CvXSUB(GvCV(gv))) {
7fb37951 9221 GvUNIQUE_off(gv);
5bd07a3d
DM
9222 }
9223 }
9224
7fb37951 9225 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
9226#if 0
9227 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
9228 HvNAME(GvSTASH(gv)), GvNAME(gv));
9229#endif
9230 return Nullsv;
9231 }
9232
4411f3b6 9233 /*
5bd07a3d
DM
9234 * write attempts will die with
9235 * "Modification of a read-only value attempted"
9236 */
9237 if (!GvSV(gv)) {
9238 GvSV(gv) = sv;
9239 }
9240 else {
9241 SvREADONLY_on(GvSV(gv));
9242 }
9243
9244 if (!GvAV(gv)) {
9245 GvAV(gv) = (AV*)sv;
9246 }
9247 else {
9248 SvREADONLY_on(GvAV(gv));
9249 }
9250
9251 if (!GvHV(gv)) {
9252 GvHV(gv) = (HV*)sv;
9253 }
9254 else {
9255 SvREADONLY_on(GvAV(gv));
9256 }
9257
9258 return sstr; /* he_dup() will SvREFCNT_inc() */
9259}
9260
645c22ef
DM
9261/* duplicate an SV of any type (including AV, HV etc) */
9262
83841fad
NIS
9263void
9264Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
9265{
9266 if (SvROK(sstr)) {
d3d0e6f1 9267 SvRV(dstr) = SvWEAKREF(sstr)
83841fad
NIS
9268 ? sv_dup(SvRV(sstr), param)
9269 : sv_dup_inc(SvRV(sstr), param);
9270 }
9271 else if (SvPVX(sstr)) {
9272 /* Has something there */
9273 if (SvLEN(sstr)) {
68795e93 9274 /* Normal PV - clone whole allocated space */
83841fad 9275 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
d3d0e6f1
NC
9276 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
9277 /* Not that normal - actually sstr is copy on write.
9278 But we are a true, independant SV, so: */
9279 SvREADONLY_off(dstr);
9280 SvFAKE_off(dstr);
9281 }
68795e93 9282 }
83841fad
NIS
9283 else {
9284 /* Special case - not normally malloced for some reason */
9285 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
9286 /* A "shared" PV - clone it as unshared string */
9287 SvFAKE_off(dstr);
9288 SvREADONLY_off(dstr);
9289 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvCUR(sstr));
9290 }
9291 else {
9292 /* Some other special case - random pointer */
9293 SvPVX(dstr) = SvPVX(sstr);
d3d0e6f1 9294 }
83841fad
NIS
9295 }
9296 }
9297 else {
9298 /* Copy the Null */
9299 SvPVX(dstr) = SvPVX(sstr);
9300 }
9301}
9302
1d7c1841 9303SV *
a8fc9800 9304Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
1d7c1841 9305{
1d7c1841
GS
9306 SV *dstr;
9307
9308 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
9309 return Nullsv;
9310 /* look for it in the table first */
9311 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
9312 if (dstr)
9313 return dstr;
9314
9315 /* create anew and remember what it is */
9316 new_SV(dstr);
9317 ptr_table_store(PL_ptr_table, sstr, dstr);
9318
9319 /* clone */
9320 SvFLAGS(dstr) = SvFLAGS(sstr);
9321 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
9322 SvREFCNT(dstr) = 0; /* must be before any other dups! */
9323
9324#ifdef DEBUGGING
9325 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
9326 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
9327 PL_watch_pvx, SvPVX(sstr));
9328#endif
9329
9330 switch (SvTYPE(sstr)) {
9331 case SVt_NULL:
9332 SvANY(dstr) = NULL;
9333 break;
9334 case SVt_IV:
9335 SvANY(dstr) = new_XIV();
9336 SvIVX(dstr) = SvIVX(sstr);
9337 break;
9338 case SVt_NV:
9339 SvANY(dstr) = new_XNV();
9340 SvNVX(dstr) = SvNVX(sstr);
9341 break;
9342 case SVt_RV:
9343 SvANY(dstr) = new_XRV();
83841fad 9344 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9345 break;
9346 case SVt_PV:
9347 SvANY(dstr) = new_XPV();
9348 SvCUR(dstr) = SvCUR(sstr);
9349 SvLEN(dstr) = SvLEN(sstr);
83841fad 9350 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9351 break;
9352 case SVt_PVIV:
9353 SvANY(dstr) = new_XPVIV();
9354 SvCUR(dstr) = SvCUR(sstr);
9355 SvLEN(dstr) = SvLEN(sstr);
9356 SvIVX(dstr) = SvIVX(sstr);
83841fad 9357 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9358 break;
9359 case SVt_PVNV:
9360 SvANY(dstr) = new_XPVNV();
9361 SvCUR(dstr) = SvCUR(sstr);
9362 SvLEN(dstr) = SvLEN(sstr);
9363 SvIVX(dstr) = SvIVX(sstr);
9364 SvNVX(dstr) = SvNVX(sstr);
83841fad 9365 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9366 break;
9367 case SVt_PVMG:
9368 SvANY(dstr) = new_XPVMG();
9369 SvCUR(dstr) = SvCUR(sstr);
9370 SvLEN(dstr) = SvLEN(sstr);
9371 SvIVX(dstr) = SvIVX(sstr);
9372 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9373 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9374 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9375 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9376 break;
9377 case SVt_PVBM:
9378 SvANY(dstr) = new_XPVBM();
9379 SvCUR(dstr) = SvCUR(sstr);
9380 SvLEN(dstr) = SvLEN(sstr);
9381 SvIVX(dstr) = SvIVX(sstr);
9382 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9383 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9384 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9385 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9386 BmRARE(dstr) = BmRARE(sstr);
9387 BmUSEFUL(dstr) = BmUSEFUL(sstr);
9388 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
9389 break;
9390 case SVt_PVLV:
9391 SvANY(dstr) = new_XPVLV();
9392 SvCUR(dstr) = SvCUR(sstr);
9393 SvLEN(dstr) = SvLEN(sstr);
9394 SvIVX(dstr) = SvIVX(sstr);
9395 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9396 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9397 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9398 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9399 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
9400 LvTARGLEN(dstr) = LvTARGLEN(sstr);
d2d73c3e 9401 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr), param);
1d7c1841
GS
9402 LvTYPE(dstr) = LvTYPE(sstr);
9403 break;
9404 case SVt_PVGV:
7fb37951 9405 if (GvUNIQUE((GV*)sstr)) {
5bd07a3d 9406 SV *share;
59b40662 9407 if ((share = gv_share(sstr, param))) {
5bd07a3d
DM
9408 del_SV(dstr);
9409 dstr = share;
37e20706 9410 ptr_table_store(PL_ptr_table, sstr, dstr);
5bd07a3d
DM
9411#if 0
9412 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
9413 HvNAME(GvSTASH(share)), GvNAME(share));
9414#endif
9415 break;
9416 }
9417 }
1d7c1841
GS
9418 SvANY(dstr) = new_XPVGV();
9419 SvCUR(dstr) = SvCUR(sstr);
9420 SvLEN(dstr) = SvLEN(sstr);
9421 SvIVX(dstr) = SvIVX(sstr);
9422 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9423 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9424 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9425 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9426 GvNAMELEN(dstr) = GvNAMELEN(sstr);
9427 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
d2d73c3e 9428 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr), param);
1d7c1841 9429 GvFLAGS(dstr) = GvFLAGS(sstr);
d2d73c3e 9430 GvGP(dstr) = gp_dup(GvGP(sstr), param);
1d7c1841
GS
9431 (void)GpREFCNT_inc(GvGP(dstr));
9432 break;
9433 case SVt_PVIO:
9434 SvANY(dstr) = new_XPVIO();
9435 SvCUR(dstr) = SvCUR(sstr);
9436 SvLEN(dstr) = SvLEN(sstr);
9437 SvIVX(dstr) = SvIVX(sstr);
9438 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9439 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9440 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9441 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
a8fc9800 9442 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
9443 if (IoOFP(sstr) == IoIFP(sstr))
9444 IoOFP(dstr) = IoIFP(dstr);
9445 else
a8fc9800 9446 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
9447 /* PL_rsfp_filters entries have fake IoDIRP() */
9448 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
9449 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
9450 else
9451 IoDIRP(dstr) = IoDIRP(sstr);
9452 IoLINES(dstr) = IoLINES(sstr);
9453 IoPAGE(dstr) = IoPAGE(sstr);
9454 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
9455 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
9456 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
d2d73c3e 9457 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr), param);
1d7c1841 9458 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
d2d73c3e 9459 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr), param);
1d7c1841 9460 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
d2d73c3e 9461 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr), param);
1d7c1841
GS
9462 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
9463 IoTYPE(dstr) = IoTYPE(sstr);
9464 IoFLAGS(dstr) = IoFLAGS(sstr);
9465 break;
9466 case SVt_PVAV:
9467 SvANY(dstr) = new_XPVAV();
9468 SvCUR(dstr) = SvCUR(sstr);
9469 SvLEN(dstr) = SvLEN(sstr);
9470 SvIVX(dstr) = SvIVX(sstr);
9471 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9472 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9473 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
9474 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
1d7c1841
GS
9475 AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
9476 if (AvARRAY((AV*)sstr)) {
9477 SV **dst_ary, **src_ary;
9478 SSize_t items = AvFILLp((AV*)sstr) + 1;
9479
9480 src_ary = AvARRAY((AV*)sstr);
9481 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
9482 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
9483 SvPVX(dstr) = (char*)dst_ary;
9484 AvALLOC((AV*)dstr) = dst_ary;
9485 if (AvREAL((AV*)sstr)) {
9486 while (items-- > 0)
d2d73c3e 9487 *dst_ary++ = sv_dup_inc(*src_ary++, param);
1d7c1841
GS
9488 }
9489 else {
9490 while (items-- > 0)
d2d73c3e 9491 *dst_ary++ = sv_dup(*src_ary++, param);
1d7c1841
GS
9492 }
9493 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
9494 while (items-- > 0) {
9495 *dst_ary++ = &PL_sv_undef;
9496 }
9497 }
9498 else {
9499 SvPVX(dstr) = Nullch;
9500 AvALLOC((AV*)dstr) = (SV**)NULL;
9501 }
9502 break;
9503 case SVt_PVHV:
9504 SvANY(dstr) = new_XPVHV();
9505 SvCUR(dstr) = SvCUR(sstr);
9506 SvLEN(dstr) = SvLEN(sstr);
9507 SvIVX(dstr) = SvIVX(sstr);
9508 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9509 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9510 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841
GS
9511 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
9512 if (HvARRAY((HV*)sstr)) {
1d7c1841
GS
9513 STRLEN i = 0;
9514 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
9515 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
9516 Newz(0, dxhv->xhv_array,
9517 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
9518 while (i <= sxhv->xhv_max) {
9519 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
eb160463
GS
9520 (bool)!!HvSHAREKEYS(sstr),
9521 param);
1d7c1841
GS
9522 ++i;
9523 }
eb160463
GS
9524 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter,
9525 (bool)!!HvSHAREKEYS(sstr), param);
1d7c1841
GS
9526 }
9527 else {
9528 SvPVX(dstr) = Nullch;
9529 HvEITER((HV*)dstr) = (HE*)NULL;
9530 }
9531 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
9532 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
c43294b8 9533 /* Record stashes for possible cloning in Perl_clone(). */
6676db26 9534 if(HvNAME((HV*)dstr))
d2d73c3e 9535 av_push(param->stashes, dstr);
1d7c1841
GS
9536 break;
9537 case SVt_PVFM:
9538 SvANY(dstr) = new_XPVFM();
9539 FmLINES(dstr) = FmLINES(sstr);
9540 goto dup_pvcv;
9541 /* NOTREACHED */
9542 case SVt_PVCV:
9543 SvANY(dstr) = new_XPVCV();
d2d73c3e 9544 dup_pvcv:
1d7c1841
GS
9545 SvCUR(dstr) = SvCUR(sstr);
9546 SvLEN(dstr) = SvLEN(sstr);
9547 SvIVX(dstr) = SvIVX(sstr);
9548 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9549 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9550 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9551 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
d2d73c3e 9552 CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
1d7c1841
GS
9553 CvSTART(dstr) = CvSTART(sstr);
9554 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
9555 CvXSUB(dstr) = CvXSUB(sstr);
9556 CvXSUBANY(dstr) = CvXSUBANY(sstr);
01485f8b
DM
9557 if (CvCONST(sstr)) {
9558 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
9559 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
9560 sv_dup_inc(CvXSUBANY(sstr).any_ptr, param);
9561 }
d2d73c3e
AB
9562 CvGV(dstr) = gv_dup(CvGV(sstr), param);
9563 if (param->flags & CLONEf_COPY_STACKS) {
9564 CvDEPTH(dstr) = CvDEPTH(sstr);
9565 } else {
9566 CvDEPTH(dstr) = 0;
9567 }
dd2155a4 9568 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
282f25c9 9569 if (!CvANON(sstr) || CvCLONED(sstr))
d2d73c3e 9570 CvOUTSIDE(dstr) = cv_dup_inc(CvOUTSIDE(sstr), param);
282f25c9 9571 else
d2d73c3e 9572 CvOUTSIDE(dstr) = cv_dup(CvOUTSIDE(sstr), param);
1d7c1841 9573 CvFLAGS(dstr) = CvFLAGS(sstr);
54356c7d 9574 CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
1d7c1841
GS
9575 break;
9576 default:
c803eecc 9577 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
1d7c1841
GS
9578 break;
9579 }
9580
9581 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
9582 ++PL_sv_objcount;
9583
9584 return dstr;
d2d73c3e 9585 }
1d7c1841 9586
645c22ef
DM
9587/* duplicate a context */
9588
1d7c1841 9589PERL_CONTEXT *
a8fc9800 9590Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
9591{
9592 PERL_CONTEXT *ncxs;
9593
9594 if (!cxs)
9595 return (PERL_CONTEXT*)NULL;
9596
9597 /* look for it in the table first */
9598 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
9599 if (ncxs)
9600 return ncxs;
9601
9602 /* create anew and remember what it is */
9603 Newz(56, ncxs, max + 1, PERL_CONTEXT);
9604 ptr_table_store(PL_ptr_table, cxs, ncxs);
9605
9606 while (ix >= 0) {
9607 PERL_CONTEXT *cx = &cxs[ix];
9608 PERL_CONTEXT *ncx = &ncxs[ix];
9609 ncx->cx_type = cx->cx_type;
9610 if (CxTYPE(cx) == CXt_SUBST) {
9611 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
9612 }
9613 else {
9614 ncx->blk_oldsp = cx->blk_oldsp;
9615 ncx->blk_oldcop = cx->blk_oldcop;
9616 ncx->blk_oldretsp = cx->blk_oldretsp;
9617 ncx->blk_oldmarksp = cx->blk_oldmarksp;
9618 ncx->blk_oldscopesp = cx->blk_oldscopesp;
9619 ncx->blk_oldpm = cx->blk_oldpm;
9620 ncx->blk_gimme = cx->blk_gimme;
9621 switch (CxTYPE(cx)) {
9622 case CXt_SUB:
9623 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
9624 ? cv_dup_inc(cx->blk_sub.cv, param)
9625 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 9626 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 9627 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 9628 : Nullav);
d2d73c3e 9629 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
9630 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
9631 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
9632 ncx->blk_sub.lval = cx->blk_sub.lval;
9633 break;
9634 case CXt_EVAL:
9635 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
9636 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 9637 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 9638 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 9639 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
1d7c1841
GS
9640 break;
9641 case CXt_LOOP:
9642 ncx->blk_loop.label = cx->blk_loop.label;
9643 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
9644 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
9645 ncx->blk_loop.next_op = cx->blk_loop.next_op;
9646 ncx->blk_loop.last_op = cx->blk_loop.last_op;
9647 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
9648 ? cx->blk_loop.iterdata
d2d73c3e 9649 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
9650 ncx->blk_loop.oldcomppad
9651 = (PAD*)ptr_table_fetch(PL_ptr_table,
9652 cx->blk_loop.oldcomppad);
d2d73c3e
AB
9653 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
9654 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
9655 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
9656 ncx->blk_loop.iterix = cx->blk_loop.iterix;
9657 ncx->blk_loop.itermax = cx->blk_loop.itermax;
9658 break;
9659 case CXt_FORMAT:
d2d73c3e
AB
9660 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
9661 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
9662 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841
GS
9663 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
9664 break;
9665 case CXt_BLOCK:
9666 case CXt_NULL:
9667 break;
9668 }
9669 }
9670 --ix;
9671 }
9672 return ncxs;
9673}
9674
645c22ef
DM
9675/* duplicate a stack info structure */
9676
1d7c1841 9677PERL_SI *
a8fc9800 9678Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
9679{
9680 PERL_SI *nsi;
9681
9682 if (!si)
9683 return (PERL_SI*)NULL;
9684
9685 /* look for it in the table first */
9686 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
9687 if (nsi)
9688 return nsi;
9689
9690 /* create anew and remember what it is */
9691 Newz(56, nsi, 1, PERL_SI);
9692 ptr_table_store(PL_ptr_table, si, nsi);
9693
d2d73c3e 9694 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
9695 nsi->si_cxix = si->si_cxix;
9696 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 9697 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 9698 nsi->si_type = si->si_type;
d2d73c3e
AB
9699 nsi->si_prev = si_dup(si->si_prev, param);
9700 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
9701 nsi->si_markoff = si->si_markoff;
9702
9703 return nsi;
9704}
9705
9706#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
9707#define TOPINT(ss,ix) ((ss)[ix].any_i32)
9708#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
9709#define TOPLONG(ss,ix) ((ss)[ix].any_long)
9710#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
9711#define TOPIV(ss,ix) ((ss)[ix].any_iv)
9712#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
9713#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
9714#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
9715#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
9716#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
9717#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
9718
9719/* XXXXX todo */
9720#define pv_dup_inc(p) SAVEPV(p)
9721#define pv_dup(p) SAVEPV(p)
9722#define svp_dup_inc(p,pp) any_dup(p,pp)
9723
645c22ef
DM
9724/* map any object to the new equivent - either something in the
9725 * ptr table, or something in the interpreter structure
9726 */
9727
1d7c1841
GS
9728void *
9729Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
9730{
9731 void *ret;
9732
9733 if (!v)
9734 return (void*)NULL;
9735
9736 /* look for it in the table first */
9737 ret = ptr_table_fetch(PL_ptr_table, v);
9738 if (ret)
9739 return ret;
9740
9741 /* see if it is part of the interpreter structure */
9742 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 9743 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 9744 else {
1d7c1841 9745 ret = v;
05ec9bb3 9746 }
1d7c1841
GS
9747
9748 return ret;
9749}
9750
645c22ef
DM
9751/* duplicate the save stack */
9752
1d7c1841 9753ANY *
a8fc9800 9754Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841
GS
9755{
9756 ANY *ss = proto_perl->Tsavestack;
9757 I32 ix = proto_perl->Tsavestack_ix;
9758 I32 max = proto_perl->Tsavestack_max;
9759 ANY *nss;
9760 SV *sv;
9761 GV *gv;
9762 AV *av;
9763 HV *hv;
9764 void* ptr;
9765 int intval;
9766 long longval;
9767 GP *gp;
9768 IV iv;
9769 I32 i;
c4e33207 9770 char *c = NULL;
1d7c1841 9771 void (*dptr) (void*);
acfe0abc 9772 void (*dxptr) (pTHX_ void*);
e977893f 9773 OP *o;
1d7c1841
GS
9774
9775 Newz(54, nss, max, ANY);
9776
9777 while (ix > 0) {
9778 i = POPINT(ss,ix);
9779 TOPINT(nss,ix) = i;
9780 switch (i) {
9781 case SAVEt_ITEM: /* normal string */
9782 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9783 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9784 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9785 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9786 break;
9787 case SAVEt_SV: /* scalar reference */
9788 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9789 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9790 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9791 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 9792 break;
f4dd75d9
GS
9793 case SAVEt_GENERIC_PVREF: /* generic char* */
9794 c = (char*)POPPTR(ss,ix);
9795 TOPPTR(nss,ix) = pv_dup(c);
9796 ptr = POPPTR(ss,ix);
9797 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9798 break;
05ec9bb3
NIS
9799 case SAVEt_SHARED_PVREF: /* char* in shared space */
9800 c = (char*)POPPTR(ss,ix);
9801 TOPPTR(nss,ix) = savesharedpv(c);
9802 ptr = POPPTR(ss,ix);
9803 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9804 break;
1d7c1841
GS
9805 case SAVEt_GENERIC_SVREF: /* generic sv */
9806 case SAVEt_SVREF: /* scalar reference */
9807 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9808 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9809 ptr = POPPTR(ss,ix);
9810 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
9811 break;
9812 case SAVEt_AV: /* array reference */
9813 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9814 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 9815 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9816 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9817 break;
9818 case SAVEt_HV: /* hash reference */
9819 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9820 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 9821 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9822 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9823 break;
9824 case SAVEt_INT: /* int reference */
9825 ptr = POPPTR(ss,ix);
9826 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9827 intval = (int)POPINT(ss,ix);
9828 TOPINT(nss,ix) = intval;
9829 break;
9830 case SAVEt_LONG: /* long reference */
9831 ptr = POPPTR(ss,ix);
9832 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9833 longval = (long)POPLONG(ss,ix);
9834 TOPLONG(nss,ix) = longval;
9835 break;
9836 case SAVEt_I32: /* I32 reference */
9837 case SAVEt_I16: /* I16 reference */
9838 case SAVEt_I8: /* I8 reference */
9839 ptr = POPPTR(ss,ix);
9840 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9841 i = POPINT(ss,ix);
9842 TOPINT(nss,ix) = i;
9843 break;
9844 case SAVEt_IV: /* IV reference */
9845 ptr = POPPTR(ss,ix);
9846 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9847 iv = POPIV(ss,ix);
9848 TOPIV(nss,ix) = iv;
9849 break;
9850 case SAVEt_SPTR: /* SV* reference */
9851 ptr = POPPTR(ss,ix);
9852 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9853 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9854 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
9855 break;
9856 case SAVEt_VPTR: /* random* reference */
9857 ptr = POPPTR(ss,ix);
9858 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9859 ptr = POPPTR(ss,ix);
9860 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9861 break;
9862 case SAVEt_PPTR: /* char* reference */
9863 ptr = POPPTR(ss,ix);
9864 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9865 c = (char*)POPPTR(ss,ix);
9866 TOPPTR(nss,ix) = pv_dup(c);
9867 break;
9868 case SAVEt_HPTR: /* HV* reference */
9869 ptr = POPPTR(ss,ix);
9870 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9871 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9872 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
9873 break;
9874 case SAVEt_APTR: /* AV* reference */
9875 ptr = POPPTR(ss,ix);
9876 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9877 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9878 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
9879 break;
9880 case SAVEt_NSTAB:
9881 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9882 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9883 break;
9884 case SAVEt_GP: /* scalar reference */
9885 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 9886 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
9887 (void)GpREFCNT_inc(gp);
9888 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 9889 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
9890 c = (char*)POPPTR(ss,ix);
9891 TOPPTR(nss,ix) = pv_dup(c);
9892 iv = POPIV(ss,ix);
9893 TOPIV(nss,ix) = iv;
9894 iv = POPIV(ss,ix);
9895 TOPIV(nss,ix) = iv;
9896 break;
9897 case SAVEt_FREESV:
26d9b02f 9898 case SAVEt_MORTALIZESV:
1d7c1841 9899 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9900 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9901 break;
9902 case SAVEt_FREEOP:
9903 ptr = POPPTR(ss,ix);
9904 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
9905 /* these are assumed to be refcounted properly */
9906 switch (((OP*)ptr)->op_type) {
9907 case OP_LEAVESUB:
9908 case OP_LEAVESUBLV:
9909 case OP_LEAVEEVAL:
9910 case OP_LEAVE:
9911 case OP_SCOPE:
9912 case OP_LEAVEWRITE:
e977893f
GS
9913 TOPPTR(nss,ix) = ptr;
9914 o = (OP*)ptr;
9915 OpREFCNT_inc(o);
1d7c1841
GS
9916 break;
9917 default:
9918 TOPPTR(nss,ix) = Nullop;
9919 break;
9920 }
9921 }
9922 else
9923 TOPPTR(nss,ix) = Nullop;
9924 break;
9925 case SAVEt_FREEPV:
9926 c = (char*)POPPTR(ss,ix);
9927 TOPPTR(nss,ix) = pv_dup_inc(c);
9928 break;
9929 case SAVEt_CLEARSV:
9930 longval = POPLONG(ss,ix);
9931 TOPLONG(nss,ix) = longval;
9932 break;
9933 case SAVEt_DELETE:
9934 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9935 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
9936 c = (char*)POPPTR(ss,ix);
9937 TOPPTR(nss,ix) = pv_dup_inc(c);
9938 i = POPINT(ss,ix);
9939 TOPINT(nss,ix) = i;
9940 break;
9941 case SAVEt_DESTRUCTOR:
9942 ptr = POPPTR(ss,ix);
9943 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
9944 dptr = POPDPTR(ss,ix);
ef75a179 9945 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
9946 break;
9947 case SAVEt_DESTRUCTOR_X:
9948 ptr = POPPTR(ss,ix);
9949 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
9950 dxptr = POPDXPTR(ss,ix);
acfe0abc 9951 TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
9952 break;
9953 case SAVEt_REGCONTEXT:
9954 case SAVEt_ALLOC:
9955 i = POPINT(ss,ix);
9956 TOPINT(nss,ix) = i;
9957 ix -= i;
9958 break;
9959 case SAVEt_STACK_POS: /* Position on Perl stack */
9960 i = POPINT(ss,ix);
9961 TOPINT(nss,ix) = i;
9962 break;
9963 case SAVEt_AELEM: /* array element */
9964 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9965 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9966 i = POPINT(ss,ix);
9967 TOPINT(nss,ix) = i;
9968 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9969 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
9970 break;
9971 case SAVEt_HELEM: /* hash element */
9972 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9973 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9974 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9975 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9976 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9977 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
9978 break;
9979 case SAVEt_OP:
9980 ptr = POPPTR(ss,ix);
9981 TOPPTR(nss,ix) = ptr;
9982 break;
9983 case SAVEt_HINTS:
9984 i = POPINT(ss,ix);
9985 TOPINT(nss,ix) = i;
9986 break;
c4410b1b
GS
9987 case SAVEt_COMPPAD:
9988 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9989 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 9990 break;
c3564e5c
GS
9991 case SAVEt_PADSV:
9992 longval = (long)POPLONG(ss,ix);
9993 TOPLONG(nss,ix) = longval;
9994 ptr = POPPTR(ss,ix);
9995 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9996 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9997 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 9998 break;
1d7c1841
GS
9999 default:
10000 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
10001 }
10002 }
10003
10004 return nss;
10005}
10006
645c22ef
DM
10007/*
10008=for apidoc perl_clone
10009
10010Create and return a new interpreter by cloning the current one.
10011
10012=cut
10013*/
10014
10015/* XXX the above needs expanding by someone who actually understands it ! */
3fc56081
NK
10016EXTERN_C PerlInterpreter *
10017perl_clone_host(PerlInterpreter* proto_perl, UV flags);
645c22ef 10018
1d7c1841
GS
10019PerlInterpreter *
10020perl_clone(PerlInterpreter *proto_perl, UV flags)
10021{
1d7c1841 10022#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
10023
10024 /* perlhost.h so we need to call into it
10025 to clone the host, CPerlHost should have a c interface, sky */
10026
10027 if (flags & CLONEf_CLONE_HOST) {
10028 return perl_clone_host(proto_perl,flags);
10029 }
10030 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
10031 proto_perl->IMem,
10032 proto_perl->IMemShared,
10033 proto_perl->IMemParse,
10034 proto_perl->IEnv,
10035 proto_perl->IStdIO,
10036 proto_perl->ILIO,
10037 proto_perl->IDir,
10038 proto_perl->ISock,
10039 proto_perl->IProc);
10040}
10041
10042PerlInterpreter *
10043perl_clone_using(PerlInterpreter *proto_perl, UV flags,
10044 struct IPerlMem* ipM, struct IPerlMem* ipMS,
10045 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
10046 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
10047 struct IPerlDir* ipD, struct IPerlSock* ipS,
10048 struct IPerlProc* ipP)
10049{
10050 /* XXX many of the string copies here can be optimized if they're
10051 * constants; they need to be allocated as common memory and just
10052 * their pointers copied. */
10053
10054 IV i;
64aa0685
GS
10055 CLONE_PARAMS clone_params;
10056 CLONE_PARAMS* param = &clone_params;
d2d73c3e 10057
1d7c1841 10058 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
ba869deb 10059 PERL_SET_THX(my_perl);
1d7c1841 10060
acfe0abc 10061# ifdef DEBUGGING
a4530404 10062 Poison(my_perl, 1, PerlInterpreter);
1d7c1841
GS
10063 PL_markstack = 0;
10064 PL_scopestack = 0;
10065 PL_savestack = 0;
10066 PL_retstack = 0;
66fe0623 10067 PL_sig_pending = 0;
25596c82 10068 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
acfe0abc 10069# else /* !DEBUGGING */
1d7c1841 10070 Zero(my_perl, 1, PerlInterpreter);
acfe0abc 10071# endif /* DEBUGGING */
1d7c1841
GS
10072
10073 /* host pointers */
10074 PL_Mem = ipM;
10075 PL_MemShared = ipMS;
10076 PL_MemParse = ipMP;
10077 PL_Env = ipE;
10078 PL_StdIO = ipStd;
10079 PL_LIO = ipLIO;
10080 PL_Dir = ipD;
10081 PL_Sock = ipS;
10082 PL_Proc = ipP;
1d7c1841
GS
10083#else /* !PERL_IMPLICIT_SYS */
10084 IV i;
64aa0685
GS
10085 CLONE_PARAMS clone_params;
10086 CLONE_PARAMS* param = &clone_params;
1d7c1841 10087 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 10088 PERL_SET_THX(my_perl);
1d7c1841 10089
d2d73c3e
AB
10090
10091
1d7c1841 10092# ifdef DEBUGGING
a4530404 10093 Poison(my_perl, 1, PerlInterpreter);
1d7c1841
GS
10094 PL_markstack = 0;
10095 PL_scopestack = 0;
10096 PL_savestack = 0;
10097 PL_retstack = 0;
66fe0623 10098 PL_sig_pending = 0;
25596c82 10099 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
1d7c1841
GS
10100# else /* !DEBUGGING */
10101 Zero(my_perl, 1, PerlInterpreter);
10102# endif /* DEBUGGING */
10103#endif /* PERL_IMPLICIT_SYS */
83236556 10104 param->flags = flags;
59b40662 10105 param->proto_perl = proto_perl;
1d7c1841
GS
10106
10107 /* arena roots */
10108 PL_xiv_arenaroot = NULL;
10109 PL_xiv_root = NULL;
612f20c3 10110 PL_xnv_arenaroot = NULL;
1d7c1841 10111 PL_xnv_root = NULL;
612f20c3 10112 PL_xrv_arenaroot = NULL;
1d7c1841 10113 PL_xrv_root = NULL;
612f20c3 10114 PL_xpv_arenaroot = NULL;
1d7c1841 10115 PL_xpv_root = NULL;
612f20c3 10116 PL_xpviv_arenaroot = NULL;
1d7c1841 10117 PL_xpviv_root = NULL;
612f20c3 10118 PL_xpvnv_arenaroot = NULL;
1d7c1841 10119 PL_xpvnv_root = NULL;
612f20c3 10120 PL_xpvcv_arenaroot = NULL;
1d7c1841 10121 PL_xpvcv_root = NULL;
612f20c3 10122 PL_xpvav_arenaroot = NULL;
1d7c1841 10123 PL_xpvav_root = NULL;
612f20c3 10124 PL_xpvhv_arenaroot = NULL;
1d7c1841 10125 PL_xpvhv_root = NULL;
612f20c3 10126 PL_xpvmg_arenaroot = NULL;
1d7c1841 10127 PL_xpvmg_root = NULL;
612f20c3 10128 PL_xpvlv_arenaroot = NULL;
1d7c1841 10129 PL_xpvlv_root = NULL;
612f20c3 10130 PL_xpvbm_arenaroot = NULL;
1d7c1841 10131 PL_xpvbm_root = NULL;
612f20c3 10132 PL_he_arenaroot = NULL;
1d7c1841
GS
10133 PL_he_root = NULL;
10134 PL_nice_chunk = NULL;
10135 PL_nice_chunk_size = 0;
10136 PL_sv_count = 0;
10137 PL_sv_objcount = 0;
10138 PL_sv_root = Nullsv;
10139 PL_sv_arenaroot = Nullsv;
10140
10141 PL_debug = proto_perl->Idebug;
10142
e5dd39fc 10143#ifdef USE_REENTRANT_API
59bd0823 10144 Perl_reentrant_init(aTHX);
e5dd39fc
AB
10145#endif
10146
1d7c1841
GS
10147 /* create SV map for pointer relocation */
10148 PL_ptr_table = ptr_table_new();
10149
10150 /* initialize these special pointers as early as possible */
10151 SvANY(&PL_sv_undef) = NULL;
10152 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
10153 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
10154 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
10155
1d7c1841 10156 SvANY(&PL_sv_no) = new_XPVNV();
1d7c1841
GS
10157 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
10158 SvFLAGS(&PL_sv_no) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
10159 SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
10160 SvCUR(&PL_sv_no) = 0;
10161 SvLEN(&PL_sv_no) = 1;
10162 SvNVX(&PL_sv_no) = 0;
10163 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
10164
1d7c1841 10165 SvANY(&PL_sv_yes) = new_XPVNV();
1d7c1841
GS
10166 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
10167 SvFLAGS(&PL_sv_yes) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
10168 SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
10169 SvCUR(&PL_sv_yes) = 1;
10170 SvLEN(&PL_sv_yes) = 2;
10171 SvNVX(&PL_sv_yes) = 1;
10172 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
10173
05ec9bb3 10174 /* create (a non-shared!) shared string table */
1d7c1841
GS
10175 PL_strtab = newHV();
10176 HvSHAREKEYS_off(PL_strtab);
10177 hv_ksplit(PL_strtab, 512);
10178 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
10179
05ec9bb3
NIS
10180 PL_compiling = proto_perl->Icompiling;
10181
10182 /* These two PVs will be free'd special way so must set them same way op.c does */
10183 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
10184 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
10185
10186 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
10187 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
10188
1d7c1841
GS
10189 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
10190 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 10191 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 10192 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 10193 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
10194 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
10195
10196 /* pseudo environmental stuff */
10197 PL_origargc = proto_perl->Iorigargc;
10198 i = PL_origargc;
10199 New(0, PL_origargv, i+1, char*);
10200 PL_origargv[i] = '\0';
10201 while (i-- > 0) {
10202 PL_origargv[i] = SAVEPV(proto_perl->Iorigargv[i]);
10203 }
d2d73c3e 10204
d2d73c3e
AB
10205 param->stashes = newAV(); /* Setup array of objects to call clone on */
10206
a1ea730d 10207#ifdef PERLIO_LAYERS
3a1ee7e8
NIS
10208 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
10209 PerlIO_clone(aTHX_ proto_perl, param);
a1ea730d 10210#endif
d2d73c3e
AB
10211
10212 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
10213 PL_incgv = gv_dup(proto_perl->Iincgv, param);
10214 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 10215 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
10216 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
10217 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
10218
10219 /* switches */
10220 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 10221 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
10222 PL_localpatches = proto_perl->Ilocalpatches;
10223 PL_splitstr = proto_perl->Isplitstr;
10224 PL_preprocess = proto_perl->Ipreprocess;
10225 PL_minus_n = proto_perl->Iminus_n;
10226 PL_minus_p = proto_perl->Iminus_p;
10227 PL_minus_l = proto_perl->Iminus_l;
10228 PL_minus_a = proto_perl->Iminus_a;
10229 PL_minus_F = proto_perl->Iminus_F;
10230 PL_doswitches = proto_perl->Idoswitches;
10231 PL_dowarn = proto_perl->Idowarn;
10232 PL_doextract = proto_perl->Idoextract;
10233 PL_sawampersand = proto_perl->Isawampersand;
10234 PL_unsafe = proto_perl->Iunsafe;
10235 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 10236 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
10237 PL_perldb = proto_perl->Iperldb;
10238 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
1cbb0781 10239 PL_exit_flags = proto_perl->Iexit_flags;
1d7c1841
GS
10240
10241 /* magical thingies */
10242 /* XXX time(&PL_basetime) when asked for? */
10243 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 10244 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
10245
10246 PL_maxsysfd = proto_perl->Imaxsysfd;
10247 PL_multiline = proto_perl->Imultiline;
10248 PL_statusvalue = proto_perl->Istatusvalue;
10249#ifdef VMS
10250 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
10251#endif
0a378802 10252 PL_encoding = sv_dup(proto_perl->Iencoding, param);
1d7c1841 10253
4a4c6fe3 10254 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
1f483ca1
JH
10255 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
10256 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
4a4c6fe3 10257
d2f185dc
AMS
10258 /* Clone the regex array */
10259 PL_regex_padav = newAV();
10260 {
10261 I32 len = av_len((AV*)proto_perl->Iregex_padav);
10262 SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
0f95fc41
AB
10263 av_push(PL_regex_padav,
10264 sv_dup_inc(regexen[0],param));
10265 for(i = 1; i <= len; i++) {
10266 if(SvREPADTMP(regexen[i])) {
10267 av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
8cf8f3d1 10268 } else {
0f95fc41
AB
10269 av_push(PL_regex_padav,
10270 SvREFCNT_inc(
8cf8f3d1 10271 newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
cbfa9890 10272 SvIVX(regexen[i])), param)))
0f95fc41
AB
10273 ));
10274 }
d2f185dc
AMS
10275 }
10276 }
10277 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 10278
1d7c1841 10279 /* shortcuts to various I/O objects */
d2d73c3e
AB
10280 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
10281 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
10282 PL_defgv = gv_dup(proto_perl->Idefgv, param);
10283 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
10284 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
10285 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
10286
10287 /* shortcuts to regexp stuff */
d2d73c3e 10288 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
10289
10290 /* shortcuts to misc objects */
d2d73c3e 10291 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
10292
10293 /* shortcuts to debugging objects */
d2d73c3e
AB
10294 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
10295 PL_DBline = gv_dup(proto_perl->IDBline, param);
10296 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
10297 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
10298 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
10299 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
10300 PL_lineary = av_dup(proto_perl->Ilineary, param);
10301 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
10302
10303 /* symbol tables */
d2d73c3e
AB
10304 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
10305 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
d2d73c3e
AB
10306 PL_debstash = hv_dup(proto_perl->Idebstash, param);
10307 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
10308 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
10309
10310 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
ee1c5a4e 10311 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
ece599bd 10312 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
d2d73c3e
AB
10313 PL_endav = av_dup_inc(proto_perl->Iendav, param);
10314 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
10315 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
10316
10317 PL_sub_generation = proto_perl->Isub_generation;
10318
10319 /* funky return mechanisms */
10320 PL_forkprocess = proto_perl->Iforkprocess;
10321
10322 /* subprocess state */
d2d73c3e 10323 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
10324
10325 /* internal state */
10326 PL_tainting = proto_perl->Itainting;
10327 PL_maxo = proto_perl->Imaxo;
10328 if (proto_perl->Iop_mask)
10329 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
10330 else
10331 PL_op_mask = Nullch;
10332
10333 /* current interpreter roots */
d2d73c3e 10334 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
10335 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
10336 PL_main_start = proto_perl->Imain_start;
e977893f 10337 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
10338 PL_eval_start = proto_perl->Ieval_start;
10339
10340 /* runtime control stuff */
10341 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
10342 PL_copline = proto_perl->Icopline;
10343
10344 PL_filemode = proto_perl->Ifilemode;
10345 PL_lastfd = proto_perl->Ilastfd;
10346 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
10347 PL_Argv = NULL;
10348 PL_Cmd = Nullch;
10349 PL_gensym = proto_perl->Igensym;
10350 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 10351 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
10352 PL_laststatval = proto_perl->Ilaststatval;
10353 PL_laststype = proto_perl->Ilaststype;
10354 PL_mess_sv = Nullsv;
10355
d2d73c3e 10356 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
10357 PL_ofmt = SAVEPV(proto_perl->Iofmt);
10358
10359 /* interpreter atexit processing */
10360 PL_exitlistlen = proto_perl->Iexitlistlen;
10361 if (PL_exitlistlen) {
10362 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
10363 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
10364 }
10365 else
10366 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 10367 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
19e8ce8e
AB
10368 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
10369 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1d7c1841
GS
10370
10371 PL_profiledata = NULL;
a8fc9800 10372 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
1d7c1841 10373 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 10374 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 10375
d2d73c3e 10376 PL_compcv = cv_dup(proto_perl->Icompcv, param);
dd2155a4
DM
10377
10378 PAD_CLONE_VARS(proto_perl, param);
1d7c1841
GS
10379
10380#ifdef HAVE_INTERP_INTERN
10381 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
10382#endif
10383
10384 /* more statics moved here */
10385 PL_generation = proto_perl->Igeneration;
d2d73c3e 10386 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
10387
10388 PL_in_clean_objs = proto_perl->Iin_clean_objs;
10389 PL_in_clean_all = proto_perl->Iin_clean_all;
10390
10391 PL_uid = proto_perl->Iuid;
10392 PL_euid = proto_perl->Ieuid;
10393 PL_gid = proto_perl->Igid;
10394 PL_egid = proto_perl->Iegid;
10395 PL_nomemok = proto_perl->Inomemok;
10396 PL_an = proto_perl->Ian;
1d7c1841
GS
10397 PL_op_seqmax = proto_perl->Iop_seqmax;
10398 PL_evalseq = proto_perl->Ievalseq;
10399 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
10400 PL_origalen = proto_perl->Iorigalen;
10401 PL_pidstatus = newHV(); /* XXX flag for cloning? */
10402 PL_osname = SAVEPV(proto_perl->Iosname);
0bb09c15 10403 PL_sh_path = proto_perl->Ish_path; /* XXX never deallocated */
1d7c1841
GS
10404 PL_sighandlerp = proto_perl->Isighandlerp;
10405
10406
10407 PL_runops = proto_perl->Irunops;
10408
10409 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
10410
10411#ifdef CSH
10412 PL_cshlen = proto_perl->Icshlen;
74f1b2b8 10413 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
1d7c1841
GS
10414#endif
10415
10416 PL_lex_state = proto_perl->Ilex_state;
10417 PL_lex_defer = proto_perl->Ilex_defer;
10418 PL_lex_expect = proto_perl->Ilex_expect;
10419 PL_lex_formbrack = proto_perl->Ilex_formbrack;
10420 PL_lex_dojoin = proto_perl->Ilex_dojoin;
10421 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
10422 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
10423 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
10424 PL_lex_op = proto_perl->Ilex_op;
10425 PL_lex_inpat = proto_perl->Ilex_inpat;
10426 PL_lex_inwhat = proto_perl->Ilex_inwhat;
10427 PL_lex_brackets = proto_perl->Ilex_brackets;
10428 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
10429 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
10430 PL_lex_casemods = proto_perl->Ilex_casemods;
10431 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
10432 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
10433
10434 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
10435 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
10436 PL_nexttoke = proto_perl->Inexttoke;
10437
1d773130
TB
10438 /* XXX This is probably masking the deeper issue of why
10439 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
10440 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
10441 * (A little debugging with a watchpoint on it may help.)
10442 */
389edf32
TB
10443 if (SvANY(proto_perl->Ilinestr)) {
10444 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
10445 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
10446 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10447 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
10448 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10449 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
10450 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10451 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
10452 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10453 }
10454 else {
10455 PL_linestr = NEWSV(65,79);
10456 sv_upgrade(PL_linestr,SVt_PVIV);
10457 sv_setpvn(PL_linestr,"",0);
10458 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
10459 }
1d7c1841 10460 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1d7c1841
GS
10461 PL_pending_ident = proto_perl->Ipending_ident;
10462 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
10463
10464 PL_expect = proto_perl->Iexpect;
10465
10466 PL_multi_start = proto_perl->Imulti_start;
10467 PL_multi_end = proto_perl->Imulti_end;
10468 PL_multi_open = proto_perl->Imulti_open;
10469 PL_multi_close = proto_perl->Imulti_close;
10470
10471 PL_error_count = proto_perl->Ierror_count;
10472 PL_subline = proto_perl->Isubline;
d2d73c3e 10473 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841 10474
1d773130 10475 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
389edf32
TB
10476 if (SvANY(proto_perl->Ilinestr)) {
10477 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
10478 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10479 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
10480 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10481 PL_last_lop_op = proto_perl->Ilast_lop_op;
10482 }
10483 else {
10484 PL_last_uni = SvPVX(PL_linestr);
10485 PL_last_lop = SvPVX(PL_linestr);
10486 PL_last_lop_op = 0;
10487 }
1d7c1841 10488 PL_in_my = proto_perl->Iin_my;
d2d73c3e 10489 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
10490#ifdef FCRYPT
10491 PL_cryptseen = proto_perl->Icryptseen;
10492#endif
10493
10494 PL_hints = proto_perl->Ihints;
10495
10496 PL_amagic_generation = proto_perl->Iamagic_generation;
10497
10498#ifdef USE_LOCALE_COLLATE
10499 PL_collation_ix = proto_perl->Icollation_ix;
10500 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
10501 PL_collation_standard = proto_perl->Icollation_standard;
10502 PL_collxfrm_base = proto_perl->Icollxfrm_base;
10503 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
10504#endif /* USE_LOCALE_COLLATE */
10505
10506#ifdef USE_LOCALE_NUMERIC
10507 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
10508 PL_numeric_standard = proto_perl->Inumeric_standard;
10509 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 10510 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
10511#endif /* !USE_LOCALE_NUMERIC */
10512
10513 /* utf8 character classes */
d2d73c3e
AB
10514 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
10515 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
10516 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
10517 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
10518 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
10519 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
10520 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
10521 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
10522 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
10523 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
10524 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
10525 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
10526 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
10527 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
10528 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
10529 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
10530 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
b4e400f9 10531 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
82686b01
JH
10532 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
10533 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841
GS
10534
10535 /* swatch cache */
10536 PL_last_swash_hv = Nullhv; /* reinits on demand */
10537 PL_last_swash_klen = 0;
10538 PL_last_swash_key[0]= '\0';
10539 PL_last_swash_tmps = (U8*)NULL;
10540 PL_last_swash_slen = 0;
10541
10542 /* perly.c globals */
10543 PL_yydebug = proto_perl->Iyydebug;
10544 PL_yynerrs = proto_perl->Iyynerrs;
10545 PL_yyerrflag = proto_perl->Iyyerrflag;
10546 PL_yychar = proto_perl->Iyychar;
10547 PL_yyval = proto_perl->Iyyval;
10548 PL_yylval = proto_perl->Iyylval;
10549
10550 PL_glob_index = proto_perl->Iglob_index;
10551 PL_srand_called = proto_perl->Isrand_called;
10552 PL_uudmap['M'] = 0; /* reinits on demand */
10553 PL_bitcount = Nullch; /* reinits on demand */
10554
66fe0623
NIS
10555 if (proto_perl->Ipsig_pend) {
10556 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 10557 }
66fe0623
NIS
10558 else {
10559 PL_psig_pend = (int*)NULL;
10560 }
10561
1d7c1841 10562 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
10563 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
10564 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 10565 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
10566 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
10567 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
10568 }
10569 }
10570 else {
10571 PL_psig_ptr = (SV**)NULL;
10572 PL_psig_name = (SV**)NULL;
10573 }
10574
10575 /* thrdvar.h stuff */
10576
a0739874 10577 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
10578 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
10579 PL_tmps_ix = proto_perl->Ttmps_ix;
10580 PL_tmps_max = proto_perl->Ttmps_max;
10581 PL_tmps_floor = proto_perl->Ttmps_floor;
10582 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
10583 i = 0;
10584 while (i <= PL_tmps_ix) {
d2d73c3e 10585 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
10586 ++i;
10587 }
10588
10589 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
10590 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
10591 Newz(54, PL_markstack, i, I32);
10592 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
10593 - proto_perl->Tmarkstack);
10594 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
10595 - proto_perl->Tmarkstack);
10596 Copy(proto_perl->Tmarkstack, PL_markstack,
10597 PL_markstack_ptr - PL_markstack + 1, I32);
10598
10599 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
10600 * NOTE: unlike the others! */
10601 PL_scopestack_ix = proto_perl->Tscopestack_ix;
10602 PL_scopestack_max = proto_perl->Tscopestack_max;
10603 Newz(54, PL_scopestack, PL_scopestack_max, I32);
10604 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
10605
10606 /* next push_return() sets PL_retstack[PL_retstack_ix]
10607 * NOTE: unlike the others! */
10608 PL_retstack_ix = proto_perl->Tretstack_ix;
10609 PL_retstack_max = proto_perl->Tretstack_max;
10610 Newz(54, PL_retstack, PL_retstack_max, OP*);
ce0a1ae0 10611 Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, OP*);
1d7c1841
GS
10612
10613 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 10614 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
10615
10616 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
10617 PL_curstack = av_dup(proto_perl->Tcurstack, param);
10618 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
10619
10620 /* next PUSHs() etc. set *(PL_stack_sp+1) */
10621 PL_stack_base = AvARRAY(PL_curstack);
10622 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
10623 - proto_perl->Tstack_base);
10624 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
10625
10626 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
10627 * NOTE: unlike the others! */
10628 PL_savestack_ix = proto_perl->Tsavestack_ix;
10629 PL_savestack_max = proto_perl->Tsavestack_max;
10630 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 10631 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
10632 }
10633 else {
10634 init_stacks();
985e7056 10635 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
10636 }
10637
10638 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
10639 PL_top_env = &PL_start_env;
10640
10641 PL_op = proto_perl->Top;
10642
10643 PL_Sv = Nullsv;
10644 PL_Xpv = (XPV*)NULL;
10645 PL_na = proto_perl->Tna;
10646
10647 PL_statbuf = proto_perl->Tstatbuf;
10648 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
10649 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
10650 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
10651#ifdef HAS_TIMES
10652 PL_timesbuf = proto_perl->Ttimesbuf;
10653#endif
10654
10655 PL_tainted = proto_perl->Ttainted;
10656 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
10657 PL_rs = sv_dup_inc(proto_perl->Trs, param);
10658 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
10659 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
10660 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 10661 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
10662 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
10663 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
10664 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
10665
10666 PL_restartop = proto_perl->Trestartop;
10667 PL_in_eval = proto_perl->Tin_eval;
10668 PL_delaymagic = proto_perl->Tdelaymagic;
10669 PL_dirty = proto_perl->Tdirty;
10670 PL_localizing = proto_perl->Tlocalizing;
10671
14dd3ad8 10672#ifdef PERL_FLEXIBLE_EXCEPTIONS
1d7c1841 10673 PL_protect = proto_perl->Tprotect;
14dd3ad8 10674#endif
d2d73c3e 10675 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
1d7c1841
GS
10676 PL_av_fetch_sv = Nullsv;
10677 PL_hv_fetch_sv = Nullsv;
10678 Zero(&PL_hv_fetch_ent_mh, 1, HE); /* XXX */
10679 PL_modcount = proto_perl->Tmodcount;
10680 PL_lastgotoprobe = Nullop;
10681 PL_dumpindent = proto_perl->Tdumpindent;
10682
10683 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
10684 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
10685 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
10686 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
10687 PL_sortcxix = proto_perl->Tsortcxix;
10688 PL_efloatbuf = Nullch; /* reinits on demand */
10689 PL_efloatsize = 0; /* reinits on demand */
10690
10691 /* regex stuff */
10692
10693 PL_screamfirst = NULL;
10694 PL_screamnext = NULL;
10695 PL_maxscream = -1; /* reinits on demand */
10696 PL_lastscream = Nullsv;
10697
10698 PL_watchaddr = NULL;
10699 PL_watchok = Nullch;
10700
10701 PL_regdummy = proto_perl->Tregdummy;
10702 PL_regcomp_parse = Nullch;
10703 PL_regxend = Nullch;
10704 PL_regcode = (regnode*)NULL;
10705 PL_regnaughty = 0;
10706 PL_regsawback = 0;
10707 PL_regprecomp = Nullch;
10708 PL_regnpar = 0;
10709 PL_regsize = 0;
10710 PL_regflags = 0;
10711 PL_regseen = 0;
10712 PL_seen_zerolen = 0;
10713 PL_seen_evals = 0;
10714 PL_regcomp_rx = (regexp*)NULL;
10715 PL_extralen = 0;
10716 PL_colorset = 0; /* reinits PL_colors[] */
10717 /*PL_colors[6] = {0,0,0,0,0,0};*/
10718 PL_reg_whilem_seen = 0;
10719 PL_reginput = Nullch;
10720 PL_regbol = Nullch;
10721 PL_regeol = Nullch;
10722 PL_regstartp = (I32*)NULL;
10723 PL_regendp = (I32*)NULL;
10724 PL_reglastparen = (U32*)NULL;
10725 PL_regtill = Nullch;
1d7c1841
GS
10726 PL_reg_start_tmp = (char**)NULL;
10727 PL_reg_start_tmpl = 0;
10728 PL_regdata = (struct reg_data*)NULL;
10729 PL_bostr = Nullch;
10730 PL_reg_flags = 0;
10731 PL_reg_eval_set = 0;
10732 PL_regnarrate = 0;
10733 PL_regprogram = (regnode*)NULL;
10734 PL_regindent = 0;
10735 PL_regcc = (CURCUR*)NULL;
10736 PL_reg_call_cc = (struct re_cc_state*)NULL;
10737 PL_reg_re = (regexp*)NULL;
10738 PL_reg_ganch = Nullch;
10739 PL_reg_sv = Nullsv;
53c4c00c 10740 PL_reg_match_utf8 = FALSE;
1d7c1841
GS
10741 PL_reg_magic = (MAGIC*)NULL;
10742 PL_reg_oldpos = 0;
10743 PL_reg_oldcurpm = (PMOP*)NULL;
10744 PL_reg_curpm = (PMOP*)NULL;
10745 PL_reg_oldsaved = Nullch;
10746 PL_reg_oldsavedlen = 0;
10747 PL_reg_maxiter = 0;
10748 PL_reg_leftiter = 0;
10749 PL_reg_poscache = Nullch;
10750 PL_reg_poscache_size= 0;
10751
10752 /* RE engine - function pointers */
10753 PL_regcompp = proto_perl->Tregcompp;
10754 PL_regexecp = proto_perl->Tregexecp;
10755 PL_regint_start = proto_perl->Tregint_start;
10756 PL_regint_string = proto_perl->Tregint_string;
10757 PL_regfree = proto_perl->Tregfree;
10758
10759 PL_reginterp_cnt = 0;
10760 PL_reg_starttry = 0;
10761
a2efc822
SC
10762 /* Pluggable optimizer */
10763 PL_peepp = proto_perl->Tpeepp;
10764
a0739874
DM
10765 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
10766 ptr_table_free(PL_ptr_table);
10767 PL_ptr_table = NULL;
10768 }
8cf8f3d1 10769
f284b03f
AMS
10770 /* Call the ->CLONE method, if it exists, for each of the stashes
10771 identified by sv_dup() above.
10772 */
d2d73c3e
AB
10773 while(av_len(param->stashes) != -1) {
10774 HV* stash = (HV*) av_shift(param->stashes);
f284b03f
AMS
10775 GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
10776 if (cloner && GvCV(cloner)) {
10777 dSP;
10778 ENTER;
10779 SAVETMPS;
10780 PUSHMARK(SP);
dc507217 10781 XPUSHs(sv_2mortal(newSVpv(HvNAME(stash), 0)));
f284b03f
AMS
10782 PUTBACK;
10783 call_sv((SV*)GvCV(cloner), G_DISCARD);
10784 FREETMPS;
10785 LEAVE;
10786 }
4a09accc 10787 }
a0739874 10788
dc507217 10789 SvREFCNT_dec(param->stashes);
dc507217 10790
1d7c1841 10791 return my_perl;
1d7c1841
GS
10792}
10793
1d7c1841 10794#endif /* USE_ITHREADS */
a0ae6670 10795
9f4817db 10796/*
ccfc67b7
JH
10797=head1 Unicode Support
10798
9f4817db
JH
10799=for apidoc sv_recode_to_utf8
10800
5d170f3a
JH
10801The encoding is assumed to be an Encode object, on entry the PV
10802of the sv is assumed to be octets in that encoding, and the sv
10803will be converted into Unicode (and UTF-8).
9f4817db 10804
5d170f3a
JH
10805If the sv already is UTF-8 (or if it is not POK), or if the encoding
10806is not a reference, nothing is done to the sv. If the encoding is not
1768d7eb
JH
10807an C<Encode::XS> Encoding object, bad things will happen.
10808(See F<lib/encoding.pm> and L<Encode>).
9f4817db 10809
5d170f3a 10810The PV of the sv is returned.
9f4817db 10811
5d170f3a
JH
10812=cut */
10813
10814char *
10815Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
10816{
f9893866 10817 if (SvPOK(sv) && !DO_UTF8(sv) && SvROK(encoding)) {
d0063567
DK
10818 int vary = FALSE;
10819 SV *uni;
10820 STRLEN len;
10821 char *s;
10822 dSP;
10823 ENTER;
10824 SAVETMPS;
10825 PUSHMARK(sp);
10826 EXTEND(SP, 3);
10827 XPUSHs(encoding);
10828 XPUSHs(sv);
f9893866
NIS
10829/*
10830 NI-S 2002/07/09
10831 Passing sv_yes is wrong - it needs to be or'ed set of constants
10832 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
10833 remove converted chars from source.
10834
10835 Both will default the value - let them.
10836
d0063567 10837 XPUSHs(&PL_sv_yes);
f9893866 10838*/
d0063567
DK
10839 PUTBACK;
10840 call_method("decode", G_SCALAR);
10841 SPAGAIN;
10842 uni = POPs;
10843 PUTBACK;
10844 s = SvPV(uni, len);
10845 {
10846 U8 *t = (U8 *)s, *e = (U8 *)s + len;
10847 while (t < e) {
10848 if ((vary = !UTF8_IS_INVARIANT(*t++)))
10849 break;
10850 }
10851 }
10852 if (s != SvPVX(sv)) {
10853 SvGROW(sv, len + 1);
10854 Move(s, SvPVX(sv), len, char);
10855 SvCUR_set(sv, len);
10856 SvPVX(sv)[len] = 0;
10857 }
10858 FREETMPS;
10859 LEAVE;
10860 if (vary)
10861 SvUTF8_on(sv);
10862 SvUTF8_on(sv);
f9893866
NIS
10863 }
10864 return SvPVX(sv);
9f4817db
JH
10865}
10866
68795e93 10867
f9893866 10868