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