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