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