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