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