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