This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix [perl #24660], [perl #24663].
[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);
5c98da1c 4500 int is_utf8 = SvUTF8(sv);
1c846c1f
NIS
4501 STRLEN len = SvCUR(sv);
4502 U32 hash = SvUVX(sv);
10bcdfd6
NC
4503 SvFAKE_off(sv);
4504 SvREADONLY_off(sv);
5c98da1c
NC
4505 SvPVX(sv) = 0;
4506 SvLEN(sv) = 0;
1c846c1f
NIS
4507 SvGROW(sv, len + 1);
4508 Move(pvx,SvPVX(sv),len,char);
4509 *SvEND(sv) = '\0';
5c98da1c 4510 unsharepvn(pvx, is_utf8 ? -(I32)len : len, hash);
1c846c1f 4511 }
923e4eb5 4512 else if (IN_PERL_RUNTIME)
cea2e8a9 4513 Perl_croak(aTHX_ PL_no_modify);
0f15f207 4514 }
765f542d 4515#endif
2213622d 4516 if (SvROK(sv))
840a7b70 4517 sv_unref_flags(sv, flags);
6fc92669
GS
4518 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4519 sv_unglob(sv);
0f15f207 4520}
1c846c1f 4521
645c22ef
DM
4522/*
4523=for apidoc sv_force_normal
4524
4525Undo various types of fakery on an SV: if the PV is a shared string, make
4526a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4527an xpvmg. See also C<sv_force_normal_flags>.
4528
4529=cut
4530*/
4531
840a7b70
IZ
4532void
4533Perl_sv_force_normal(pTHX_ register SV *sv)
4534{
4535 sv_force_normal_flags(sv, 0);
4536}
4537
954c1994
GS
4538/*
4539=for apidoc sv_chop
4540
1c846c1f 4541Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4542SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4543the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4544string. Uses the "OOK hack".
31869a79
AE
4545Beware: after this function returns, C<ptr> and SvPVX(sv) may no longer
4546refer to the same chunk of data.
954c1994
GS
4547
4548=cut
4549*/
4550
79072805 4551void
645c22ef 4552Perl_sv_chop(pTHX_ register SV *sv, register char *ptr)
79072805
LW
4553{
4554 register STRLEN delta;
a0d0e21e 4555 if (!ptr || !SvPOKp(sv))
79072805 4556 return;
31869a79 4557 delta = ptr - SvPVX(sv);
2213622d 4558 SV_CHECK_THINKFIRST(sv);
79072805
LW
4559 if (SvTYPE(sv) < SVt_PVIV)
4560 sv_upgrade(sv,SVt_PVIV);
4561
4562 if (!SvOOK(sv)) {
50483b2c
JD
4563 if (!SvLEN(sv)) { /* make copy of shared string */
4564 char *pvx = SvPVX(sv);
4565 STRLEN len = SvCUR(sv);
4566 SvGROW(sv, len + 1);
4567 Move(pvx,SvPVX(sv),len,char);
4568 *SvEND(sv) = '\0';
4569 }
463ee0b2 4570 SvIVX(sv) = 0;
a4bfb290
AB
4571 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
4572 and we do that anyway inside the SvNIOK_off
4573 */
4574 SvFLAGS(sv) |= SVf_OOK;
79072805 4575 }
a4bfb290 4576 SvNIOK_off(sv);
79072805
LW
4577 SvLEN(sv) -= delta;
4578 SvCUR(sv) -= delta;
463ee0b2
LW
4579 SvPVX(sv) += delta;
4580 SvIVX(sv) += delta;
79072805
LW
4581}
4582
09540bc3
JH
4583/* sv_catpvn() is now a macro using Perl_sv_catpvn_flags();
4584 * this function provided for binary compatibility only
4585 */
4586
4587void
4588Perl_sv_catpvn(pTHX_ SV *dsv, const char* sstr, STRLEN slen)
4589{
4590 sv_catpvn_flags(dsv, sstr, slen, SV_GMAGIC);
4591}
4592
954c1994
GS
4593/*
4594=for apidoc sv_catpvn
4595
4596Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4597C<len> indicates number of bytes to copy. If the SV has the UTF-8
4598status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 4599Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 4600
8d6d96c1
HS
4601=for apidoc sv_catpvn_flags
4602
4603Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4604C<len> indicates number of bytes to copy. If the SV has the UTF-8
4605status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
4606If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4607appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4608in terms of this function.
4609
4610=cut
4611*/
4612
4613void
4614Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
4615{
4616 STRLEN dlen;
4617 char *dstr;
4618
4619 dstr = SvPV_force_flags(dsv, dlen, flags);
4620 SvGROW(dsv, dlen + slen + 1);
4621 if (sstr == dstr)
4622 sstr = SvPVX(dsv);
4623 Move(sstr, SvPVX(dsv) + dlen, slen, char);
4624 SvCUR(dsv) += slen;
4625 *SvEND(dsv) = '\0';
4626 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
4627 SvTAINT(dsv);
79072805
LW
4628}
4629
954c1994
GS
4630/*
4631=for apidoc sv_catpvn_mg
4632
4633Like C<sv_catpvn>, but also handles 'set' magic.
4634
4635=cut
4636*/
4637
79072805 4638void
864dbfa3 4639Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4640{
4641 sv_catpvn(sv,ptr,len);
4642 SvSETMAGIC(sv);
4643}
4644
09540bc3
JH
4645/* sv_catsv() is now a macro using Perl_sv_catsv_flags();
4646 * this function provided for binary compatibility only
4647 */
4648
4649void
4650Perl_sv_catsv(pTHX_ SV *dstr, register SV *sstr)
4651{
4652 sv_catsv_flags(dstr, sstr, SV_GMAGIC);
4653}
4654
954c1994
GS
4655/*
4656=for apidoc sv_catsv
4657
13e8c8e3
JH
4658Concatenates the string from SV C<ssv> onto the end of the string in
4659SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
4660not 'set' magic. See C<sv_catsv_mg>.
954c1994 4661
8d6d96c1
HS
4662=for apidoc sv_catsv_flags
4663
4664Concatenates the string from SV C<ssv> onto the end of the string in
4665SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
4666bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4667and C<sv_catsv_nomg> are implemented in terms of this function.
4668
4669=cut */
4670
ef50df4b 4671void
8d6d96c1 4672Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 4673{
13e8c8e3
JH
4674 char *spv;
4675 STRLEN slen;
46199a12 4676 if (!ssv)
79072805 4677 return;
46199a12 4678 if ((spv = SvPV(ssv, slen))) {
4fd84b44
AD
4679 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4680 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
8cf8f3d1
NIS
4681 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4682 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4fd84b44
AD
4683 dsv->sv_flags doesn't have that bit set.
4684 Andy Dougherty 12 Oct 2001
4685 */
4686 I32 sutf8 = DO_UTF8(ssv);
4687 I32 dutf8;
13e8c8e3 4688
8d6d96c1
HS
4689 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4690 mg_get(dsv);
4691 dutf8 = DO_UTF8(dsv);
4692
4693 if (dutf8 != sutf8) {
13e8c8e3 4694 if (dutf8) {
46199a12 4695 /* Not modifying source SV, so taking a temporary copy. */
8d6d96c1 4696 SV* csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 4697
46199a12 4698 sv_utf8_upgrade(csv);
8d6d96c1 4699 spv = SvPV(csv, slen);
13e8c8e3 4700 }
8d6d96c1
HS
4701 else
4702 sv_utf8_upgrade_nomg(dsv);
e84ff256 4703 }
8d6d96c1 4704 sv_catpvn_nomg(dsv, spv, slen);
560a288e 4705 }
79072805
LW
4706}
4707
954c1994
GS
4708/*
4709=for apidoc sv_catsv_mg
4710
4711Like C<sv_catsv>, but also handles 'set' magic.
4712
4713=cut
4714*/
4715
79072805 4716void
46199a12 4717Perl_sv_catsv_mg(pTHX_ SV *dsv, register SV *ssv)
ef50df4b 4718{
46199a12
JH
4719 sv_catsv(dsv,ssv);
4720 SvSETMAGIC(dsv);
ef50df4b
GS
4721}
4722
954c1994
GS
4723/*
4724=for apidoc sv_catpv
4725
4726Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
4727If the SV has the UTF-8 status set, then the bytes appended should be
4728valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 4729
d5ce4a7c 4730=cut */
954c1994 4731
ef50df4b 4732void
0c981600 4733Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4734{
4735 register STRLEN len;
463ee0b2 4736 STRLEN tlen;
748a9306 4737 char *junk;
79072805 4738
0c981600 4739 if (!ptr)
79072805 4740 return;
748a9306 4741 junk = SvPV_force(sv, tlen);
0c981600 4742 len = strlen(ptr);
463ee0b2 4743 SvGROW(sv, tlen + len + 1);
0c981600
JH
4744 if (ptr == junk)
4745 ptr = SvPVX(sv);
4746 Move(ptr,SvPVX(sv)+tlen,len+1,char);
79072805 4747 SvCUR(sv) += len;
d41ff1b8 4748 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4749 SvTAINT(sv);
79072805
LW
4750}
4751
954c1994
GS
4752/*
4753=for apidoc sv_catpv_mg
4754
4755Like C<sv_catpv>, but also handles 'set' magic.
4756
4757=cut
4758*/
4759
ef50df4b 4760void
0c981600 4761Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 4762{
0c981600 4763 sv_catpv(sv,ptr);
ef50df4b
GS
4764 SvSETMAGIC(sv);
4765}
4766
645c22ef
DM
4767/*
4768=for apidoc newSV
4769
4770Create a new null SV, or if len > 0, create a new empty SVt_PV type SV
4771with an initial PV allocation of len+1. Normally accessed via the C<NEWSV>
4772macro.
4773
4774=cut
4775*/
4776
79072805 4777SV *
864dbfa3 4778Perl_newSV(pTHX_ STRLEN len)
79072805
LW
4779{
4780 register SV *sv;
1c846c1f 4781
4561caa4 4782 new_SV(sv);
79072805
LW
4783 if (len) {
4784 sv_upgrade(sv, SVt_PV);
4785 SvGROW(sv, len + 1);
4786 }
4787 return sv;
4788}
954c1994 4789/*
92110913 4790=for apidoc sv_magicext
954c1994 4791
68795e93 4792Adds magic to an SV, upgrading it if necessary. Applies the
92110913
NIS
4793supplied vtable and returns pointer to the magic added.
4794
4795Note that sv_magicext will allow things that sv_magic will not.
68795e93 4796In particular you can add magic to SvREADONLY SVs and and more than
92110913 4797one instance of the same 'how'
645c22ef 4798
92110913 4799I C<namelen> is greater then zero then a savepvn() I<copy> of C<name> is stored,
68795e93
NIS
4800if C<namelen> is zero then C<name> is stored as-is and - as another special
4801case - if C<(name && namelen == HEf_SVKEY)> then C<name> is assumed to contain
92110913
NIS
4802an C<SV*> and has its REFCNT incremented
4803
4804(This is now used as a subroutine by sv_magic.)
954c1994
GS
4805
4806=cut
4807*/
92110913
NIS
4808MAGIC *
4809Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, MGVTBL *vtable,
4810 const char* name, I32 namlen)
79072805
LW
4811{
4812 MAGIC* mg;
68795e93 4813
92110913
NIS
4814 if (SvTYPE(sv) < SVt_PVMG) {
4815 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 4816 }
79072805
LW
4817 Newz(702,mg, 1, MAGIC);
4818 mg->mg_moremagic = SvMAGIC(sv);
79072805 4819 SvMAGIC(sv) = mg;
75f9d97a 4820
18808301 4821 /* Some magic sontains a reference loop, where the sv and object refer to
bb03859b
RS
4822 each other. To prevent a reference loop that would prevent such
4823 objects being freed, we look for such loops and if we find one we
87f0b213
JH
4824 avoid incrementing the object refcount.
4825
4826 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 4827 have its REFCNT incremented to keep it in existence.
87f0b213
JH
4828
4829 */
14befaf4
DM
4830 if (!obj || obj == sv ||
4831 how == PERL_MAGIC_arylen ||
4832 how == PERL_MAGIC_qr ||
75f9d97a
JH
4833 (SvTYPE(obj) == SVt_PVGV &&
4834 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4835 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 4836 GvFORM(obj) == (CV*)sv)))
75f9d97a 4837 {
8990e307 4838 mg->mg_obj = obj;
75f9d97a 4839 }
85e6fe83 4840 else {
8990e307 4841 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
4842 mg->mg_flags |= MGf_REFCOUNTED;
4843 }
b5ccf5f2
YST
4844
4845 /* Normal self-ties simply pass a null object, and instead of
4846 using mg_obj directly, use the SvTIED_obj macro to produce a
4847 new RV as needed. For glob "self-ties", we are tieing the PVIO
4848 with an RV obj pointing to the glob containing the PVIO. In
4849 this case, to avoid a reference loop, we need to weaken the
4850 reference.
4851 */
4852
4853 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4854 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
4855 {
4856 sv_rvweaken(obj);
4857 }
4858
79072805 4859 mg->mg_type = how;
565764a8 4860 mg->mg_len = namlen;
9cbac4c7 4861 if (name) {
92110913 4862 if (namlen > 0)
1edc1566 4863 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 4864 else if (namlen == HEf_SVKEY)
1edc1566 4865 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
68795e93 4866 else
92110913 4867 mg->mg_ptr = (char *) name;
9cbac4c7 4868 }
92110913 4869 mg->mg_virtual = vtable;
68795e93 4870
92110913
NIS
4871 mg_magical(sv);
4872 if (SvGMAGICAL(sv))
4873 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4874 return mg;
4875}
4876
4877/*
4878=for apidoc sv_magic
1c846c1f 4879
92110913
NIS
4880Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4881then adds a new magic item of type C<how> to the head of the magic list.
4882
4883=cut
4884*/
4885
4886void
4887Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 4888{
92110913
NIS
4889 MAGIC* mg;
4890 MGVTBL *vtable = 0;
4891
765f542d
NC
4892#ifdef PERL_COPY_ON_WRITE
4893 if (SvIsCOW(sv))
4894 sv_force_normal_flags(sv, 0);
4895#endif
92110913 4896 if (SvREADONLY(sv)) {
923e4eb5 4897 if (IN_PERL_RUNTIME
92110913
NIS
4898 && how != PERL_MAGIC_regex_global
4899 && how != PERL_MAGIC_bm
4900 && how != PERL_MAGIC_fm
4901 && how != PERL_MAGIC_sv
4902 )
4903 {
4904 Perl_croak(aTHX_ PL_no_modify);
4905 }
4906 }
4907 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4908 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
4909 /* sv_magic() refuses to add a magic of the same 'how' as an
4910 existing one
92110913
NIS
4911 */
4912 if (how == PERL_MAGIC_taint)
4913 mg->mg_len |= 1;
4914 return;
4915 }
4916 }
68795e93 4917
79072805 4918 switch (how) {
14befaf4 4919 case PERL_MAGIC_sv:
92110913 4920 vtable = &PL_vtbl_sv;
79072805 4921 break;
14befaf4 4922 case PERL_MAGIC_overload:
92110913 4923 vtable = &PL_vtbl_amagic;
a0d0e21e 4924 break;
14befaf4 4925 case PERL_MAGIC_overload_elem:
92110913 4926 vtable = &PL_vtbl_amagicelem;
a0d0e21e 4927 break;
14befaf4 4928 case PERL_MAGIC_overload_table:
92110913 4929 vtable = &PL_vtbl_ovrld;
a0d0e21e 4930 break;
14befaf4 4931 case PERL_MAGIC_bm:
92110913 4932 vtable = &PL_vtbl_bm;
79072805 4933 break;
14befaf4 4934 case PERL_MAGIC_regdata:
92110913 4935 vtable = &PL_vtbl_regdata;
6cef1e77 4936 break;
14befaf4 4937 case PERL_MAGIC_regdatum:
92110913 4938 vtable = &PL_vtbl_regdatum;
6cef1e77 4939 break;
14befaf4 4940 case PERL_MAGIC_env:
92110913 4941 vtable = &PL_vtbl_env;
79072805 4942 break;
14befaf4 4943 case PERL_MAGIC_fm:
92110913 4944 vtable = &PL_vtbl_fm;
55497cff 4945 break;
14befaf4 4946 case PERL_MAGIC_envelem:
92110913 4947 vtable = &PL_vtbl_envelem;
79072805 4948 break;
14befaf4 4949 case PERL_MAGIC_regex_global:
92110913 4950 vtable = &PL_vtbl_mglob;
93a17b20 4951 break;
14befaf4 4952 case PERL_MAGIC_isa:
92110913 4953 vtable = &PL_vtbl_isa;
463ee0b2 4954 break;
14befaf4 4955 case PERL_MAGIC_isaelem:
92110913 4956 vtable = &PL_vtbl_isaelem;
463ee0b2 4957 break;
14befaf4 4958 case PERL_MAGIC_nkeys:
92110913 4959 vtable = &PL_vtbl_nkeys;
16660edb 4960 break;
14befaf4 4961 case PERL_MAGIC_dbfile:
92110913 4962 vtable = 0;
93a17b20 4963 break;
14befaf4 4964 case PERL_MAGIC_dbline:
92110913 4965 vtable = &PL_vtbl_dbline;
79072805 4966 break;
36477c24 4967#ifdef USE_LOCALE_COLLATE
14befaf4 4968 case PERL_MAGIC_collxfrm:
92110913 4969 vtable = &PL_vtbl_collxfrm;
bbce6d69 4970 break;
36477c24 4971#endif /* USE_LOCALE_COLLATE */
14befaf4 4972 case PERL_MAGIC_tied:
92110913 4973 vtable = &PL_vtbl_pack;
463ee0b2 4974 break;
14befaf4
DM
4975 case PERL_MAGIC_tiedelem:
4976 case PERL_MAGIC_tiedscalar:
92110913 4977 vtable = &PL_vtbl_packelem;
463ee0b2 4978 break;
14befaf4 4979 case PERL_MAGIC_qr:
92110913 4980 vtable = &PL_vtbl_regexp;
c277df42 4981 break;
14befaf4 4982 case PERL_MAGIC_sig:
92110913 4983 vtable = &PL_vtbl_sig;
79072805 4984 break;
14befaf4 4985 case PERL_MAGIC_sigelem:
92110913 4986 vtable = &PL_vtbl_sigelem;
79072805 4987 break;
14befaf4 4988 case PERL_MAGIC_taint:
92110913 4989 vtable = &PL_vtbl_taint;
463ee0b2 4990 break;
14befaf4 4991 case PERL_MAGIC_uvar:
92110913 4992 vtable = &PL_vtbl_uvar;
79072805 4993 break;
14befaf4 4994 case PERL_MAGIC_vec:
92110913 4995 vtable = &PL_vtbl_vec;
79072805 4996 break;
ece467f9
JP
4997 case PERL_MAGIC_vstring:
4998 vtable = 0;
4999 break;
7e8c5dac
HS
5000 case PERL_MAGIC_utf8:
5001 vtable = &PL_vtbl_utf8;
5002 break;
14befaf4 5003 case PERL_MAGIC_substr:
92110913 5004 vtable = &PL_vtbl_substr;
79072805 5005 break;
14befaf4 5006 case PERL_MAGIC_defelem:
92110913 5007 vtable = &PL_vtbl_defelem;
5f05dabc 5008 break;
14befaf4 5009 case PERL_MAGIC_glob:
92110913 5010 vtable = &PL_vtbl_glob;
79072805 5011 break;
14befaf4 5012 case PERL_MAGIC_arylen:
92110913 5013 vtable = &PL_vtbl_arylen;
79072805 5014 break;
14befaf4 5015 case PERL_MAGIC_pos:
92110913 5016 vtable = &PL_vtbl_pos;
a0d0e21e 5017 break;
14befaf4 5018 case PERL_MAGIC_backref:
92110913 5019 vtable = &PL_vtbl_backref;
810b8aa5 5020 break;
14befaf4
DM
5021 case PERL_MAGIC_ext:
5022 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
5023 /* Useful for attaching extension internal data to perl vars. */
5024 /* Note that multiple extensions may clash if magical scalars */
5025 /* etc holding private data from one are passed to another. */
a0d0e21e 5026 break;
79072805 5027 default:
14befaf4 5028 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 5029 }
68795e93 5030
92110913
NIS
5031 /* Rest of work is done else where */
5032 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 5033
92110913
NIS
5034 switch (how) {
5035 case PERL_MAGIC_taint:
5036 mg->mg_len = 1;
5037 break;
5038 case PERL_MAGIC_ext:
5039 case PERL_MAGIC_dbfile:
5040 SvRMAGICAL_on(sv);
5041 break;
5042 }
463ee0b2
LW
5043}
5044
c461cf8f
JH
5045/*
5046=for apidoc sv_unmagic
5047
645c22ef 5048Removes all magic of type C<type> from an SV.
c461cf8f
JH
5049
5050=cut
5051*/
5052
463ee0b2 5053int
864dbfa3 5054Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
5055{
5056 MAGIC* mg;
5057 MAGIC** mgp;
91bba347 5058 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
5059 return 0;
5060 mgp = &SvMAGIC(sv);
5061 for (mg = *mgp; mg; mg = *mgp) {
5062 if (mg->mg_type == type) {
5063 MGVTBL* vtbl = mg->mg_virtual;
5064 *mgp = mg->mg_moremagic;
1d7c1841 5065 if (vtbl && vtbl->svt_free)
fc0dc3b3 5066 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 5067 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 5068 if (mg->mg_len > 0)
1edc1566 5069 Safefree(mg->mg_ptr);
565764a8 5070 else if (mg->mg_len == HEf_SVKEY)
1edc1566 5071 SvREFCNT_dec((SV*)mg->mg_ptr);
7e8c5dac
HS
5072 else if (mg->mg_type == PERL_MAGIC_utf8 && mg->mg_ptr)
5073 Safefree(mg->mg_ptr);
9cbac4c7 5074 }
a0d0e21e
LW
5075 if (mg->mg_flags & MGf_REFCOUNTED)
5076 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
5077 Safefree(mg);
5078 }
5079 else
5080 mgp = &mg->mg_moremagic;
79072805 5081 }
91bba347 5082 if (!SvMAGIC(sv)) {
463ee0b2 5083 SvMAGICAL_off(sv);
06759ea0 5084 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
5085 }
5086
5087 return 0;
79072805
LW
5088}
5089
c461cf8f
JH
5090/*
5091=for apidoc sv_rvweaken
5092
645c22ef
DM
5093Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5094referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5095push a back-reference to this RV onto the array of backreferences
5096associated with that magic.
c461cf8f
JH
5097
5098=cut
5099*/
5100
810b8aa5 5101SV *
864dbfa3 5102Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
5103{
5104 SV *tsv;
5105 if (!SvOK(sv)) /* let undefs pass */
5106 return sv;
5107 if (!SvROK(sv))
cea2e8a9 5108 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 5109 else if (SvWEAKREF(sv)) {
810b8aa5 5110 if (ckWARN(WARN_MISC))
9014280d 5111 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
5112 return sv;
5113 }
5114 tsv = SvRV(sv);
5115 sv_add_backref(tsv, sv);
5116 SvWEAKREF_on(sv);
1c846c1f 5117 SvREFCNT_dec(tsv);
810b8aa5
GS
5118 return sv;
5119}
5120
645c22ef
DM
5121/* Give tsv backref magic if it hasn't already got it, then push a
5122 * back-reference to sv onto the array associated with the backref magic.
5123 */
5124
810b8aa5 5125STATIC void
cea2e8a9 5126S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
5127{
5128 AV *av;
5129 MAGIC *mg;
14befaf4 5130 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, PERL_MAGIC_backref)))
810b8aa5
GS
5131 av = (AV*)mg->mg_obj;
5132 else {
5133 av = newAV();
14befaf4 5134 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
d99b02a1
DM
5135 /* av now has a refcnt of 2, which avoids it getting freed
5136 * before us during global cleanup. The extra ref is removed
5137 * by magic_killbackrefs() when tsv is being freed */
810b8aa5 5138 }
d91d49e8 5139 if (AvFILLp(av) >= AvMAX(av)) {
fdc9a813 5140 I32 i;
d91d49e8 5141 SV **svp = AvARRAY(av);
fdc9a813
AE
5142 for (i = AvFILLp(av); i >= 0; i--)
5143 if (!svp[i]) {
d91d49e8
MM
5144 svp[i] = sv; /* reuse the slot */
5145 return;
5146 }
d91d49e8
MM
5147 av_extend(av, AvFILLp(av)+1);
5148 }
5149 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
5150}
5151
645c22ef
DM
5152/* delete a back-reference to ourselves from the backref magic associated
5153 * with the SV we point to.
5154 */
5155
1c846c1f 5156STATIC void
cea2e8a9 5157S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
5158{
5159 AV *av;
5160 SV **svp;
5161 I32 i;
5162 SV *tsv = SvRV(sv);
c04a4dfe 5163 MAGIC *mg = NULL;
14befaf4 5164 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, PERL_MAGIC_backref)))
cea2e8a9 5165 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
5166 av = (AV *)mg->mg_obj;
5167 svp = AvARRAY(av);
fdc9a813
AE
5168 for (i = AvFILLp(av); i >= 0; i--)
5169 if (svp[i] == sv) svp[i] = Nullsv;
810b8aa5
GS
5170}
5171
954c1994
GS
5172/*
5173=for apidoc sv_insert
5174
5175Inserts a string at the specified offset/length within the SV. Similar to
5176the Perl substr() function.
5177
5178=cut
5179*/
5180
79072805 5181void
864dbfa3 5182Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
79072805
LW
5183{
5184 register char *big;
5185 register char *mid;
5186 register char *midend;
5187 register char *bigend;
5188 register I32 i;
6ff81951 5189 STRLEN curlen;
1c846c1f 5190
79072805 5191
8990e307 5192 if (!bigstr)
cea2e8a9 5193 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 5194 SvPV_force(bigstr, curlen);
60fa28ff 5195 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
5196 if (offset + len > curlen) {
5197 SvGROW(bigstr, offset+len+1);
5198 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
5199 SvCUR_set(bigstr, offset+len);
5200 }
79072805 5201
69b47968 5202 SvTAINT(bigstr);
79072805
LW
5203 i = littlelen - len;
5204 if (i > 0) { /* string might grow */
a0d0e21e 5205 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
5206 mid = big + offset + len;
5207 midend = bigend = big + SvCUR(bigstr);
5208 bigend += i;
5209 *bigend = '\0';
5210 while (midend > mid) /* shove everything down */
5211 *--bigend = *--midend;
5212 Move(little,big+offset,littlelen,char);
5213 SvCUR(bigstr) += i;
5214 SvSETMAGIC(bigstr);
5215 return;
5216 }
5217 else if (i == 0) {
463ee0b2 5218 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
5219 SvSETMAGIC(bigstr);
5220 return;
5221 }
5222
463ee0b2 5223 big = SvPVX(bigstr);
79072805
LW
5224 mid = big + offset;
5225 midend = mid + len;
5226 bigend = big + SvCUR(bigstr);
5227
5228 if (midend > bigend)
cea2e8a9 5229 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5230
5231 if (mid - big > bigend - midend) { /* faster to shorten from end */
5232 if (littlelen) {
5233 Move(little, mid, littlelen,char);
5234 mid += littlelen;
5235 }
5236 i = bigend - midend;
5237 if (i > 0) {
5238 Move(midend, mid, i,char);
5239 mid += i;
5240 }
5241 *mid = '\0';
5242 SvCUR_set(bigstr, mid - big);
5243 }
5244 /*SUPPRESS 560*/
155aba94 5245 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5246 midend -= littlelen;
5247 mid = midend;
5248 sv_chop(bigstr,midend-i);
5249 big += i;
5250 while (i--)
5251 *--midend = *--big;
5252 if (littlelen)
5253 Move(little, mid, littlelen,char);
5254 }
5255 else if (littlelen) {
5256 midend -= littlelen;
5257 sv_chop(bigstr,midend);
5258 Move(little,midend,littlelen,char);
5259 }
5260 else {
5261 sv_chop(bigstr,midend);
5262 }
5263 SvSETMAGIC(bigstr);
5264}
5265
c461cf8f
JH
5266/*
5267=for apidoc sv_replace
5268
5269Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5270The target SV physically takes over ownership of the body of the source SV
5271and inherits its flags; however, the target keeps any magic it owns,
5272and any magic in the source is discarded.
ff276b08 5273Note that this is a rather specialist SV copying operation; most of the
645c22ef 5274time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5275
5276=cut
5277*/
79072805
LW
5278
5279void
864dbfa3 5280Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805
LW
5281{
5282 U32 refcnt = SvREFCNT(sv);
765f542d 5283 SV_CHECK_THINKFIRST_COW_DROP(sv);
0453d815 5284 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
9014280d 5285 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
93a17b20 5286 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5287 if (SvMAGICAL(nsv))
5288 mg_free(nsv);
5289 else
5290 sv_upgrade(nsv, SVt_PVMG);
93a17b20 5291 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 5292 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
5293 SvMAGICAL_off(sv);
5294 SvMAGIC(sv) = 0;
5295 }
79072805
LW
5296 SvREFCNT(sv) = 0;
5297 sv_clear(sv);
477f5d66 5298 assert(!SvREFCNT(sv));
79072805 5299 StructCopy(nsv,sv,SV);
d3d0e6f1
NC
5300#ifdef PERL_COPY_ON_WRITE
5301 if (SvIsCOW_normal(nsv)) {
5302 /* We need to follow the pointers around the loop to make the
5303 previous SV point to sv, rather than nsv. */
5304 SV *next;
5305 SV *current = nsv;
5306 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5307 assert(next);
5308 current = next;
5309 assert(SvPVX(current) == SvPVX(nsv));
5310 }
5311 /* Make the SV before us point to the SV after us. */
5312 if (DEBUG_C_TEST) {
5313 PerlIO_printf(Perl_debug_log, "previous is\n");
5314 sv_dump(current);
a29f6d03
NC
5315 PerlIO_printf(Perl_debug_log,
5316 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5317 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5318 }
a29f6d03 5319 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5320 }
5321#endif
79072805 5322 SvREFCNT(sv) = refcnt;
1edc1566 5323 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 5324 SvREFCNT(nsv) = 0;
463ee0b2 5325 del_SV(nsv);
79072805
LW
5326}
5327
c461cf8f
JH
5328/*
5329=for apidoc sv_clear
5330
645c22ef
DM
5331Clear an SV: call any destructors, free up any memory used by the body,
5332and free the body itself. The SV's head is I<not> freed, although
5333its type is set to all 1's so that it won't inadvertently be assumed
5334to be live during global destruction etc.
5335This function should only be called when REFCNT is zero. Most of the time
5336you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5337instead.
c461cf8f
JH
5338
5339=cut
5340*/
5341
79072805 5342void
864dbfa3 5343Perl_sv_clear(pTHX_ register SV *sv)
79072805 5344{
ec12f114 5345 HV* stash;
79072805
LW
5346 assert(sv);
5347 assert(SvREFCNT(sv) == 0);
5348
ed6116ce 5349 if (SvOBJECT(sv)) {
3280af22 5350 if (PL_defstash) { /* Still have a symbol table? */
39644a26 5351 dSP;
32251b26 5352 CV* destructor;
a0d0e21e 5353
5cc433a6 5354
8ebc5c01 5355
d460ef45 5356 do {
4e8e7886 5357 stash = SvSTASH(sv);
32251b26 5358 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 5359 if (destructor) {
5cc433a6
AB
5360 SV* tmpref = newRV(sv);
5361 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 5362 ENTER;
e788e7d3 5363 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
5364 EXTEND(SP, 2);
5365 PUSHMARK(SP);
5cc433a6 5366 PUSHs(tmpref);
4e8e7886 5367 PUTBACK;
44389ee9 5368 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
5cc433a6
AB
5369
5370
d3acc0f7 5371 POPSTACK;
3095d977 5372 SPAGAIN;
4e8e7886 5373 LEAVE;
5cc433a6
AB
5374 if(SvREFCNT(tmpref) < 2) {
5375 /* tmpref is not kept alive! */
5376 SvREFCNT(sv)--;
5377 SvRV(tmpref) = 0;
5378 SvROK_off(tmpref);
5379 }
5380 SvREFCNT_dec(tmpref);
4e8e7886
GS
5381 }
5382 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5383
6f44e0a4
JP
5384
5385 if (SvREFCNT(sv)) {
5386 if (PL_in_clean_objs)
cea2e8a9 5387 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
6f44e0a4
JP
5388 HvNAME(stash));
5389 /* DESTROY gave object new lease on life */
5390 return;
5391 }
a0d0e21e 5392 }
4e8e7886 5393
a0d0e21e 5394 if (SvOBJECT(sv)) {
4e8e7886 5395 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
5396 SvOBJECT_off(sv); /* Curse the object. */
5397 if (SvTYPE(sv) != SVt_PVIO)
3280af22 5398 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5399 }
463ee0b2 5400 }
524189f1
JH
5401 if (SvTYPE(sv) >= SVt_PVMG) {
5402 if (SvMAGIC(sv))
5403 mg_free(sv);
5404 if (SvFLAGS(sv) & SVpad_TYPED)
5405 SvREFCNT_dec(SvSTASH(sv));
5406 }
ec12f114 5407 stash = NULL;
79072805 5408 switch (SvTYPE(sv)) {
8990e307 5409 case SVt_PVIO:
df0bd2f4
GS
5410 if (IoIFP(sv) &&
5411 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5412 IoIFP(sv) != PerlIO_stdout() &&
5413 IoIFP(sv) != PerlIO_stderr())
93578b34 5414 {
f2b5be74 5415 io_close((IO*)sv, FALSE);
93578b34 5416 }
1d7c1841 5417 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5418 PerlDir_close(IoDIRP(sv));
1d7c1841 5419 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5420 Safefree(IoTOP_NAME(sv));
5421 Safefree(IoFMT_NAME(sv));
5422 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 5423 /* FALL THROUGH */
79072805 5424 case SVt_PVBM:
a0d0e21e 5425 goto freescalar;
79072805 5426 case SVt_PVCV:
748a9306 5427 case SVt_PVFM:
85e6fe83 5428 cv_undef((CV*)sv);
a0d0e21e 5429 goto freescalar;
79072805 5430 case SVt_PVHV:
85e6fe83 5431 hv_undef((HV*)sv);
a0d0e21e 5432 break;
79072805 5433 case SVt_PVAV:
85e6fe83 5434 av_undef((AV*)sv);
a0d0e21e 5435 break;
02270b4e 5436 case SVt_PVLV:
dd28f7bb
DM
5437 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5438 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5439 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5440 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5441 }
5442 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
5443 SvREFCNT_dec(LvTARG(sv));
02270b4e 5444 goto freescalar;
a0d0e21e 5445 case SVt_PVGV:
1edc1566 5446 gp_free((GV*)sv);
a0d0e21e 5447 Safefree(GvNAME(sv));
ec12f114
JPC
5448 /* cannot decrease stash refcount yet, as we might recursively delete
5449 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
5450 of stash until current sv is completely gone.
5451 -- JohnPC, 27 Mar 1998 */
5452 stash = GvSTASH(sv);
a0d0e21e 5453 /* FALL THROUGH */
79072805 5454 case SVt_PVMG:
79072805
LW
5455 case SVt_PVNV:
5456 case SVt_PVIV:
a0d0e21e
LW
5457 freescalar:
5458 (void)SvOOK_off(sv);
79072805
LW
5459 /* FALL THROUGH */
5460 case SVt_PV:
a0d0e21e 5461 case SVt_RV:
810b8aa5
GS
5462 if (SvROK(sv)) {
5463 if (SvWEAKREF(sv))
5464 sv_del_backref(sv);
5465 else
5466 SvREFCNT_dec(SvRV(sv));
5467 }
765f542d
NC
5468#ifdef PERL_COPY_ON_WRITE
5469 else if (SvPVX(sv)) {
5470 if (SvIsCOW(sv)) {
5471 /* I believe I need to grab the global SV mutex here and
5472 then recheck the COW status. */
46187eeb
NC
5473 if (DEBUG_C_TEST) {
5474 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5475 sv_dump(sv);
46187eeb 5476 }
e419cbc5 5477 sv_release_COW(sv, SvPVX(sv), SvCUR(sv), SvLEN(sv),
765f542d
NC
5478 SvUVX(sv), SV_COW_NEXT_SV(sv));
5479 /* And drop it here. */
5480 SvFAKE_off(sv);
5481 } else if (SvLEN(sv)) {
5482 Safefree(SvPVX(sv));
5483 }
5484 }
5485#else
1edc1566 5486 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 5487 Safefree(SvPVX(sv));
1c846c1f 5488 else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
25716404
GS
5489 unsharepvn(SvPVX(sv),
5490 SvUTF8(sv) ? -(I32)SvCUR(sv) : SvCUR(sv),
5491 SvUVX(sv));
1c846c1f
NIS
5492 SvFAKE_off(sv);
5493 }
765f542d 5494#endif
79072805 5495 break;
a0d0e21e 5496/*
79072805 5497 case SVt_NV:
79072805 5498 case SVt_IV:
79072805
LW
5499 case SVt_NULL:
5500 break;
a0d0e21e 5501*/
79072805
LW
5502 }
5503
5504 switch (SvTYPE(sv)) {
5505 case SVt_NULL:
5506 break;
79072805
LW
5507 case SVt_IV:
5508 del_XIV(SvANY(sv));
5509 break;
5510 case SVt_NV:
5511 del_XNV(SvANY(sv));
5512 break;
ed6116ce
LW
5513 case SVt_RV:
5514 del_XRV(SvANY(sv));
5515 break;
79072805
LW
5516 case SVt_PV:
5517 del_XPV(SvANY(sv));
5518 break;
5519 case SVt_PVIV:
5520 del_XPVIV(SvANY(sv));
5521 break;
5522 case SVt_PVNV:
5523 del_XPVNV(SvANY(sv));
5524 break;
5525 case SVt_PVMG:
5526 del_XPVMG(SvANY(sv));
5527 break;
5528 case SVt_PVLV:
5529 del_XPVLV(SvANY(sv));
5530 break;
5531 case SVt_PVAV:
5532 del_XPVAV(SvANY(sv));
5533 break;
5534 case SVt_PVHV:
5535 del_XPVHV(SvANY(sv));
5536 break;
5537 case SVt_PVCV:
5538 del_XPVCV(SvANY(sv));
5539 break;
5540 case SVt_PVGV:
5541 del_XPVGV(SvANY(sv));
ec12f114
JPC
5542 /* code duplication for increased performance. */
5543 SvFLAGS(sv) &= SVf_BREAK;
5544 SvFLAGS(sv) |= SVTYPEMASK;
5545 /* decrease refcount of the stash that owns this GV, if any */
5546 if (stash)
5547 SvREFCNT_dec(stash);
5548 return; /* not break, SvFLAGS reset already happened */
79072805
LW
5549 case SVt_PVBM:
5550 del_XPVBM(SvANY(sv));
5551 break;
5552 case SVt_PVFM:
5553 del_XPVFM(SvANY(sv));
5554 break;
8990e307
LW
5555 case SVt_PVIO:
5556 del_XPVIO(SvANY(sv));
5557 break;
79072805 5558 }
a0d0e21e 5559 SvFLAGS(sv) &= SVf_BREAK;
8990e307 5560 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
5561}
5562
645c22ef
DM
5563/*
5564=for apidoc sv_newref
5565
5566Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5567instead.
5568
5569=cut
5570*/
5571
79072805 5572SV *
864dbfa3 5573Perl_sv_newref(pTHX_ SV *sv)
79072805 5574{
463ee0b2 5575 if (sv)
4db098f4 5576 (SvREFCNT(sv))++;
79072805
LW
5577 return sv;
5578}
5579
c461cf8f
JH
5580/*
5581=for apidoc sv_free
5582
645c22ef
DM
5583Decrement an SV's reference count, and if it drops to zero, call
5584C<sv_clear> to invoke destructors and free up any memory used by
5585the body; finally, deallocate the SV's head itself.
5586Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5587
5588=cut
5589*/
5590
79072805 5591void
864dbfa3 5592Perl_sv_free(pTHX_ SV *sv)
79072805
LW
5593{
5594 if (!sv)
5595 return;
a0d0e21e
LW
5596 if (SvREFCNT(sv) == 0) {
5597 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5598 /* this SV's refcnt has been artificially decremented to
5599 * trigger cleanup */
a0d0e21e 5600 return;
3280af22 5601 if (PL_in_clean_all) /* All is fair */
1edc1566 5602 return;
d689ffdd
JP
5603 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5604 /* make sure SvREFCNT(sv)==0 happens very seldom */
5605 SvREFCNT(sv) = (~(U32)0)/2;
5606 return;
5607 }
0453d815 5608 if (ckWARN_d(WARN_INTERNAL))
d5dede04 5609 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
f386e492 5610 "Attempt to free unreferenced scalar: SV 0x%"UVxf,
d5dede04 5611 PTR2UV(sv));
79072805
LW
5612 return;
5613 }
4db098f4 5614 if (--(SvREFCNT(sv)) > 0)
8990e307 5615 return;
8c4d3c90
NC
5616 Perl_sv_free2(aTHX_ sv);
5617}
5618
5619void
5620Perl_sv_free2(pTHX_ SV *sv)
5621{
463ee0b2
LW
5622#ifdef DEBUGGING
5623 if (SvTEMP(sv)) {
0453d815 5624 if (ckWARN_d(WARN_DEBUGGING))
9014280d 5625 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
1d7c1841
GS
5626 "Attempt to free temp prematurely: SV 0x%"UVxf,
5627 PTR2UV(sv));
79072805 5628 return;
79072805 5629 }
463ee0b2 5630#endif
d689ffdd
JP
5631 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5632 /* make sure SvREFCNT(sv)==0 happens very seldom */
5633 SvREFCNT(sv) = (~(U32)0)/2;
5634 return;
5635 }
79072805 5636 sv_clear(sv);
477f5d66
CS
5637 if (! SvREFCNT(sv))
5638 del_SV(sv);
79072805
LW
5639}
5640
954c1994
GS
5641/*
5642=for apidoc sv_len
5643
645c22ef
DM
5644Returns the length of the string in the SV. Handles magic and type
5645coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5646
5647=cut
5648*/
5649
79072805 5650STRLEN
864dbfa3 5651Perl_sv_len(pTHX_ register SV *sv)
79072805 5652{
463ee0b2 5653 STRLEN len;
79072805
LW
5654
5655 if (!sv)
5656 return 0;
5657
8990e307 5658 if (SvGMAGICAL(sv))
565764a8 5659 len = mg_length(sv);
8990e307 5660 else
497b47a8 5661 (void)SvPV(sv, len);
463ee0b2 5662 return len;
79072805
LW
5663}
5664
c461cf8f
JH
5665/*
5666=for apidoc sv_len_utf8
5667
5668Returns the number of characters in the string in an SV, counting wide
1e54db1a 5669UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5670
5671=cut
5672*/
5673
7e8c5dac
HS
5674/*
5675 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
5676 * mg_ptr is used, by sv_pos_u2b(), see the comments of S_utf8_mg_pos_init().
5677 * (Note that the mg_len is not the length of the mg_ptr field.)
5678 *
5679 */
5680
a0ed51b3 5681STRLEN
864dbfa3 5682Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 5683{
a0ed51b3
LW
5684 if (!sv)
5685 return 0;
5686
a0ed51b3 5687 if (SvGMAGICAL(sv))
b76347f2 5688 return mg_length(sv);
a0ed51b3 5689 else
b76347f2 5690 {
7e8c5dac 5691 STRLEN len, ulen;
b76347f2 5692 U8 *s = (U8*)SvPV(sv, len);
7e8c5dac
HS
5693 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
5694
e23c8137 5695 if (mg && mg->mg_len != -1 && (mg->mg_len > 0 || len == 0)) {
7e8c5dac 5696 ulen = mg->mg_len;
e23c8137
JH
5697#ifdef PERL_UTF8_CACHE_ASSERT
5698 assert(ulen == Perl_utf8_length(aTHX_ s, s + len));
5699#endif
5700 }
7e8c5dac
HS
5701 else {
5702 ulen = Perl_utf8_length(aTHX_ s, s + len);
5703 if (!mg && !SvREADONLY(sv)) {
5704 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
5705 mg = mg_find(sv, PERL_MAGIC_utf8);
5706 assert(mg);
5707 }
5708 if (mg)
5709 mg->mg_len = ulen;
5710 }
5711 return ulen;
5712 }
5713}
5714
5715/* S_utf8_mg_pos_init() is used to initialize the mg_ptr field of
5716 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5717 * between UTF-8 and byte offsets. There are two (substr offset and substr
5718 * length, the i offset, PERL_MAGIC_UTF8_CACHESIZE) times two (UTF-8 offset
5719 * and byte offset) cache positions.
5720 *
5721 * The mg_len field is used by sv_len_utf8(), see its comments.
5722 * Note that the mg_len is not the length of the mg_ptr field.
5723 *
5724 */
5725STATIC bool
6e551876 5726S_utf8_mg_pos_init(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, U8 *s, U8 *start)
7e8c5dac
HS
5727{
5728 bool found = FALSE;
5729
5730 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
8f78557a
AE
5731 if (!*mgp)
5732 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, &PL_vtbl_utf8, 0, 0);
7e8c5dac 5733 assert(*mgp);
b76347f2 5734
7e8c5dac
HS
5735 if ((*mgp)->mg_ptr)
5736 *cachep = (STRLEN *) (*mgp)->mg_ptr;
5737 else {
5738 Newz(0, *cachep, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
5739 (*mgp)->mg_ptr = (char *) *cachep;
5740 }
5741 assert(*cachep);
5742
5743 (*cachep)[i] = *offsetp;
5744 (*cachep)[i+1] = s - start;
5745 found = TRUE;
a0ed51b3 5746 }
7e8c5dac
HS
5747
5748 return found;
a0ed51b3
LW
5749}
5750
645c22ef 5751/*
7e8c5dac
HS
5752 * S_utf8_mg_pos() is used to query and update mg_ptr field of
5753 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5754 * between UTF-8 and byte offsets. See also the comments of
5755 * S_utf8_mg_pos_init().
5756 *
5757 */
5758STATIC bool
6e551876 5759S_utf8_mg_pos(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, I32 uoff, U8 **sp, U8 *start, U8 *send)
7e8c5dac
HS
5760{
5761 bool found = FALSE;
5762
5763 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
5764 if (!*mgp)
5765 *mgp = mg_find(sv, PERL_MAGIC_utf8);
5766 if (*mgp && (*mgp)->mg_ptr) {
5767 *cachep = (STRLEN *) (*mgp)->mg_ptr;
e23c8137 5768 ASSERT_UTF8_CACHE(*cachep);
667208dd 5769 if ((*cachep)[i] == (STRLEN)uoff) /* An exact match. */
e23c8137 5770 found = TRUE;
7e8c5dac
HS
5771 else { /* We will skip to the right spot. */
5772 STRLEN forw = 0;
5773 STRLEN backw = 0;
5774 U8* p = NULL;
5775
5776 /* The assumption is that going backward is half
5777 * the speed of going forward (that's where the
5778 * 2 * backw in the below comes from). (The real
5779 * figure of course depends on the UTF-8 data.) */
5780
667208dd 5781 if ((*cachep)[i] > (STRLEN)uoff) {
7e8c5dac 5782 forw = uoff;
667208dd 5783 backw = (*cachep)[i] - (STRLEN)uoff;
7e8c5dac
HS
5784
5785 if (forw < 2 * backw)
5786 p = start;
5787 else
5788 p = start + (*cachep)[i+1];
5789 }
5790 /* Try this only for the substr offset (i == 0),
5791 * not for the substr length (i == 2). */
5792 else if (i == 0) { /* (*cachep)[i] < uoff */
5793 STRLEN ulen = sv_len_utf8(sv);
5794
667208dd
JH
5795 if ((STRLEN)uoff < ulen) {
5796 forw = (STRLEN)uoff - (*cachep)[i];
5797 backw = ulen - (STRLEN)uoff;
7e8c5dac
HS
5798
5799 if (forw < 2 * backw)
5800 p = start + (*cachep)[i+1];
5801 else
5802 p = send;
5803 }
5804
5805 /* If the string is not long enough for uoff,
5806 * we could extend it, but not at this low a level. */
5807 }
5808
5809 if (p) {
5810 if (forw < 2 * backw) {
5811 while (forw--)
5812 p += UTF8SKIP(p);
5813 }
5814 else {
5815 while (backw--) {
5816 p--;
5817 while (UTF8_IS_CONTINUATION(*p))
5818 p--;
5819 }
5820 }
5821
5822 /* Update the cache. */
667208dd 5823 (*cachep)[i] = (STRLEN)uoff;
7e8c5dac 5824 (*cachep)[i+1] = p - start;
8f78557a
AE
5825
5826 /* Drop the stale "length" cache */
5827 if (i == 0) {
5828 (*cachep)[2] = 0;
5829 (*cachep)[3] = 0;
5830 }
7e8c5dac
HS
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) {
979acdb5 6056 Newz(0, cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7e8c5dac
HS
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') {
2873255c
NC
8653 /* Add check for digits != 0 because it seems that some
8654 gconverts are buggy in this case, and we don't yet have
8655 a Configure test for this. */
8656 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
8657 /* 0, point, slack */
2e59c212 8658 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
8659 sv_catpv(sv, ebuf);
8660 if (*ebuf) /* May return an empty string for digits==0 */
8661 return;
8662 }
8663 } else if (!digits) {
8664 STRLEN l;
8665
8666 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
8667 sv_catpvn(sv, p, l);
8668 return;
8669 }
8670 }
8671 }
8672 }
1d917b39 8673#endif /* !USE_LONG_DOUBLE */
4151a5fe 8674
2cf2cfc6 8675 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 8676 has_utf8 = TRUE;
2cf2cfc6 8677
46fc3d4c 8678 patend = (char*)pat + patlen;
8679 for (p = (char*)pat; p < patend; p = q) {
8680 bool alt = FALSE;
8681 bool left = FALSE;
b22c7a20 8682 bool vectorize = FALSE;
211dfcf1 8683 bool vectorarg = FALSE;
2cf2cfc6 8684 bool vec_utf8 = FALSE;
46fc3d4c 8685 char fill = ' ';
8686 char plus = 0;
8687 char intsize = 0;
8688 STRLEN width = 0;
fc36a67e 8689 STRLEN zeros = 0;
46fc3d4c 8690 bool has_precis = FALSE;
8691 STRLEN precis = 0;
58e33a90 8692 I32 osvix = svix;
2cf2cfc6 8693 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
8694#ifdef HAS_LDBL_SPRINTF_BUG
8695 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 8696 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
8697 bool fix_ldbl_sprintf_bug = FALSE;
8698#endif
205f51d8 8699
46fc3d4c 8700 char esignbuf[4];
ad391ad9 8701 U8 utf8buf[UTF8_MAXLEN+1];
46fc3d4c 8702 STRLEN esignlen = 0;
8703
8704 char *eptr = Nullch;
fc36a67e 8705 STRLEN elen = 0;
81f715da 8706 SV *vecsv = Nullsv;
a05b299f 8707 U8 *vecstr = Null(U8*);
b22c7a20 8708 STRLEN veclen = 0;
934abaf1 8709 char c = 0;
46fc3d4c 8710 int i;
9c5ffd7c 8711 unsigned base = 0;
8c8eb53c
RB
8712 IV iv = 0;
8713 UV uv = 0;
9e5b023a
JH
8714 /* we need a long double target in case HAS_LONG_DOUBLE but
8715 not USE_LONG_DOUBLE
8716 */
35fff930 8717#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
8718 long double nv;
8719#else
65202027 8720 NV nv;
9e5b023a 8721#endif
46fc3d4c 8722 STRLEN have;
8723 STRLEN need;
8724 STRLEN gap;
b22c7a20
GS
8725 char *dotstr = ".";
8726 STRLEN dotstrlen = 1;
211dfcf1 8727 I32 efix = 0; /* explicit format parameter index */
eb3fce90 8728 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
8729 I32 epix = 0; /* explicit precision index */
8730 I32 evix = 0; /* explicit vector index */
eb3fce90 8731 bool asterisk = FALSE;
46fc3d4c 8732
211dfcf1 8733 /* echo everything up to the next format specification */
46fc3d4c 8734 for (q = p; q < patend && *q != '%'; ++q) ;
8735 if (q > p) {
db79b45b
JH
8736 if (has_utf8 && !pat_utf8)
8737 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
8738 else
8739 sv_catpvn(sv, p, q - p);
46fc3d4c 8740 p = q;
8741 }
8742 if (q++ >= patend)
8743 break;
8744
211dfcf1
HS
8745/*
8746 We allow format specification elements in this order:
8747 \d+\$ explicit format parameter index
8748 [-+ 0#]+ flags
a472f209 8749 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 8750 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
8751 \d+|\*(\d+\$)? width using optional (optionally specified) arg
8752 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
8753 [hlqLV] size
8754 [%bcdefginopsux_DFOUX] format (mandatory)
8755*/
8756 if (EXPECT_NUMBER(q, width)) {
8757 if (*q == '$') {
8758 ++q;
8759 efix = width;
8760 } else {
8761 goto gotwidth;
8762 }
8763 }
8764
fc36a67e 8765 /* FLAGS */
8766
46fc3d4c 8767 while (*q) {
8768 switch (*q) {
8769 case ' ':
8770 case '+':
8771 plus = *q++;
8772 continue;
8773
8774 case '-':
8775 left = TRUE;
8776 q++;
8777 continue;
8778
8779 case '0':
8780 fill = *q++;
8781 continue;
8782
8783 case '#':
8784 alt = TRUE;
8785 q++;
8786 continue;
8787
fc36a67e 8788 default:
8789 break;
8790 }
8791 break;
8792 }
46fc3d4c 8793
211dfcf1 8794 tryasterisk:
eb3fce90 8795 if (*q == '*') {
211dfcf1
HS
8796 q++;
8797 if (EXPECT_NUMBER(q, ewix))
8798 if (*q++ != '$')
8799 goto unknown;
eb3fce90 8800 asterisk = TRUE;
211dfcf1
HS
8801 }
8802 if (*q == 'v') {
eb3fce90 8803 q++;
211dfcf1
HS
8804 if (vectorize)
8805 goto unknown;
9cbac4c7 8806 if ((vectorarg = asterisk)) {
211dfcf1
HS
8807 evix = ewix;
8808 ewix = 0;
8809 asterisk = FALSE;
8810 }
8811 vectorize = TRUE;
8812 goto tryasterisk;
eb3fce90
JH
8813 }
8814
211dfcf1 8815 if (!asterisk)
f3583277
RB
8816 if( *q == '0' )
8817 fill = *q++;
211dfcf1
HS
8818 EXPECT_NUMBER(q, width);
8819
8820 if (vectorize) {
8821 if (vectorarg) {
8822 if (args)
8823 vecsv = va_arg(*args, SV*);
8824 else
8825 vecsv = (evix ? evix <= svmax : svix < svmax) ?
3a7a539e 8826 svargs[evix ? evix-1 : svix++] : &PL_sv_undef;
4459522c 8827 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1 8828 if (DO_UTF8(vecsv))
2cf2cfc6 8829 is_utf8 = TRUE;
211dfcf1
HS
8830 }
8831 if (args) {
8832 vecsv = va_arg(*args, SV*);
8833 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 8834 vec_utf8 = DO_UTF8(vecsv);
eb3fce90 8835 }
211dfcf1
HS
8836 else if (efix ? efix <= svmax : svix < svmax) {
8837 vecsv = svargs[efix ? efix-1 : svix++];
8838 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 8839 vec_utf8 = DO_UTF8(vecsv);
211dfcf1
HS
8840 }
8841 else {
8842 vecstr = (U8*)"";
8843 veclen = 0;
8844 }
eb3fce90 8845 }
fc36a67e 8846
eb3fce90 8847 if (asterisk) {
fc36a67e 8848 if (args)
8849 i = va_arg(*args, int);
8850 else
eb3fce90
JH
8851 i = (ewix ? ewix <= svmax : svix < svmax) ?
8852 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8853 left |= (i < 0);
8854 width = (i < 0) ? -i : i;
fc36a67e 8855 }
211dfcf1 8856 gotwidth:
fc36a67e 8857
8858 /* PRECISION */
46fc3d4c 8859
fc36a67e 8860 if (*q == '.') {
8861 q++;
8862 if (*q == '*') {
211dfcf1 8863 q++;
7b8dd722
HS
8864 if (EXPECT_NUMBER(q, epix) && *q++ != '$')
8865 goto unknown;
8866 /* XXX: todo, support specified precision parameter */
8867 if (epix)
211dfcf1 8868 goto unknown;
46fc3d4c 8869 if (args)
8870 i = va_arg(*args, int);
8871 else
eb3fce90
JH
8872 i = (ewix ? ewix <= svmax : svix < svmax)
8873 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8874 precis = (i < 0) ? 0 : i;
fc36a67e 8875 }
8876 else {
8877 precis = 0;
8878 while (isDIGIT(*q))
8879 precis = precis * 10 + (*q++ - '0');
8880 }
8881 has_precis = TRUE;
8882 }
46fc3d4c 8883
fc36a67e 8884 /* SIZE */
46fc3d4c 8885
fc36a67e 8886 switch (*q) {
c623ac67
GS
8887#ifdef WIN32
8888 case 'I': /* Ix, I32x, and I64x */
8889# ifdef WIN64
8890 if (q[1] == '6' && q[2] == '4') {
8891 q += 3;
8892 intsize = 'q';
8893 break;
8894 }
8895# endif
8896 if (q[1] == '3' && q[2] == '2') {
8897 q += 3;
8898 break;
8899 }
8900# ifdef WIN64
8901 intsize = 'q';
8902# endif
8903 q++;
8904 break;
8905#endif
9e5b023a 8906#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 8907 case 'L': /* Ld */
e5c81feb 8908 /* FALL THROUGH */
e5c81feb 8909#ifdef HAS_QUAD
6f9bb7fd 8910 case 'q': /* qd */
9e5b023a 8911#endif
6f9bb7fd
GS
8912 intsize = 'q';
8913 q++;
8914 break;
8915#endif
fc36a67e 8916 case 'l':
9e5b023a 8917#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 8918 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 8919 intsize = 'q';
8920 q += 2;
46fc3d4c 8921 break;
cf2093f6 8922 }
fc36a67e 8923#endif
6f9bb7fd 8924 /* FALL THROUGH */
fc36a67e 8925 case 'h':
cf2093f6 8926 /* FALL THROUGH */
fc36a67e 8927 case 'V':
8928 intsize = *q++;
46fc3d4c 8929 break;
8930 }
8931
fc36a67e 8932 /* CONVERSION */
8933
211dfcf1
HS
8934 if (*q == '%') {
8935 eptr = q++;
8936 elen = 1;
8937 goto string;
8938 }
8939
be75b157
HS
8940 if (vectorize)
8941 argsv = vecsv;
8942 else if (!args)
211dfcf1
HS
8943 argsv = (efix ? efix <= svmax : svix < svmax) ?
8944 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
8945
46fc3d4c 8946 switch (c = *q++) {
8947
8948 /* STRINGS */
8949
46fc3d4c 8950 case 'c':
be75b157 8951 uv = (args && !vectorize) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
8952 if ((uv > 255 ||
8953 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 8954 && !IN_BYTES) {
dfe13c55 8955 eptr = (char*)utf8buf;
9041c2e3 8956 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 8957 is_utf8 = TRUE;
7e2040f0
GS
8958 }
8959 else {
8960 c = (char)uv;
8961 eptr = &c;
8962 elen = 1;
a0ed51b3 8963 }
46fc3d4c 8964 goto string;
8965
46fc3d4c 8966 case 's':
be75b157 8967 if (args && !vectorize) {
fc36a67e 8968 eptr = va_arg(*args, char*);
c635e13b 8969 if (eptr)
1d7c1841
GS
8970#ifdef MACOS_TRADITIONAL
8971 /* On MacOS, %#s format is used for Pascal strings */
8972 if (alt)
8973 elen = *eptr++;
8974 else
8975#endif
c635e13b 8976 elen = strlen(eptr);
8977 else {
8978 eptr = nullstr;
8979 elen = sizeof nullstr - 1;
8980 }
46fc3d4c 8981 }
211dfcf1 8982 else {
7e2040f0
GS
8983 eptr = SvPVx(argsv, elen);
8984 if (DO_UTF8(argsv)) {
a0ed51b3
LW
8985 if (has_precis && precis < elen) {
8986 I32 p = precis;
7e2040f0 8987 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
8988 precis = p;
8989 }
8990 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 8991 width += elen - sv_len_utf8(argsv);
a0ed51b3 8992 }
2cf2cfc6 8993 is_utf8 = TRUE;
a0ed51b3
LW
8994 }
8995 }
46fc3d4c 8996 goto string;
8997
fc36a67e 8998 case '_':
8999 /*
9000 * The "%_" hack might have to be changed someday,
9001 * if ISO or ANSI decide to use '_' for something.
9002 * So we keep it hidden from users' code.
9003 */
be75b157 9004 if (!args || vectorize)
fc36a67e 9005 goto unknown;
211dfcf1 9006 argsv = va_arg(*args, SV*);
7e2040f0
GS
9007 eptr = SvPVx(argsv, elen);
9008 if (DO_UTF8(argsv))
2cf2cfc6 9009 is_utf8 = TRUE;
fc36a67e 9010
46fc3d4c 9011 string:
b22c7a20 9012 vectorize = FALSE;
46fc3d4c 9013 if (has_precis && elen > precis)
9014 elen = precis;
9015 break;
9016
9017 /* INTEGERS */
9018
fc36a67e 9019 case 'p':
be75b157 9020 if (alt || vectorize)
c2e66d9e 9021 goto unknown;
211dfcf1 9022 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 9023 base = 16;
9024 goto integer;
9025
46fc3d4c 9026 case 'D':
29fe7a80 9027#ifdef IV_IS_QUAD
22f3ae8c 9028 intsize = 'q';
29fe7a80 9029#else
46fc3d4c 9030 intsize = 'l';
29fe7a80 9031#endif
46fc3d4c 9032 /* FALL THROUGH */
9033 case 'd':
9034 case 'i':
b22c7a20 9035 if (vectorize) {
ba210ebe 9036 STRLEN ulen;
211dfcf1
HS
9037 if (!veclen)
9038 continue;
2cf2cfc6
A
9039 if (vec_utf8)
9040 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9041 UTF8_ALLOW_ANYUV);
b22c7a20 9042 else {
e83d50c9 9043 uv = *vecstr;
b22c7a20
GS
9044 ulen = 1;
9045 }
9046 vecstr += ulen;
9047 veclen -= ulen;
e83d50c9
JP
9048 if (plus)
9049 esignbuf[esignlen++] = plus;
b22c7a20
GS
9050 }
9051 else if (args) {
46fc3d4c 9052 switch (intsize) {
9053 case 'h': iv = (short)va_arg(*args, int); break;
9054 default: iv = va_arg(*args, int); break;
9055 case 'l': iv = va_arg(*args, long); break;
fc36a67e 9056 case 'V': iv = va_arg(*args, IV); break;
cf2093f6
JH
9057#ifdef HAS_QUAD
9058 case 'q': iv = va_arg(*args, Quad_t); break;
9059#endif
46fc3d4c 9060 }
9061 }
9062 else {
211dfcf1 9063 iv = SvIVx(argsv);
46fc3d4c 9064 switch (intsize) {
9065 case 'h': iv = (short)iv; break;
be28567c 9066 default: break;
46fc3d4c 9067 case 'l': iv = (long)iv; break;
fc36a67e 9068 case 'V': break;
cf2093f6
JH
9069#ifdef HAS_QUAD
9070 case 'q': iv = (Quad_t)iv; break;
9071#endif
46fc3d4c 9072 }
9073 }
e83d50c9
JP
9074 if ( !vectorize ) /* we already set uv above */
9075 {
9076 if (iv >= 0) {
9077 uv = iv;
9078 if (plus)
9079 esignbuf[esignlen++] = plus;
9080 }
9081 else {
9082 uv = -iv;
9083 esignbuf[esignlen++] = '-';
9084 }
46fc3d4c 9085 }
9086 base = 10;
9087 goto integer;
9088
fc36a67e 9089 case 'U':
29fe7a80 9090#ifdef IV_IS_QUAD
22f3ae8c 9091 intsize = 'q';
29fe7a80 9092#else
fc36a67e 9093 intsize = 'l';
29fe7a80 9094#endif
fc36a67e 9095 /* FALL THROUGH */
9096 case 'u':
9097 base = 10;
9098 goto uns_integer;
9099
4f19785b
WSI
9100 case 'b':
9101 base = 2;
9102 goto uns_integer;
9103
46fc3d4c 9104 case 'O':
29fe7a80 9105#ifdef IV_IS_QUAD
22f3ae8c 9106 intsize = 'q';
29fe7a80 9107#else
46fc3d4c 9108 intsize = 'l';
29fe7a80 9109#endif
46fc3d4c 9110 /* FALL THROUGH */
9111 case 'o':
9112 base = 8;
9113 goto uns_integer;
9114
9115 case 'X':
46fc3d4c 9116 case 'x':
9117 base = 16;
46fc3d4c 9118
9119 uns_integer:
b22c7a20 9120 if (vectorize) {
ba210ebe 9121 STRLEN ulen;
b22c7a20 9122 vector:
211dfcf1
HS
9123 if (!veclen)
9124 continue;
2cf2cfc6
A
9125 if (vec_utf8)
9126 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9127 UTF8_ALLOW_ANYUV);
b22c7a20 9128 else {
a05b299f 9129 uv = *vecstr;
b22c7a20
GS
9130 ulen = 1;
9131 }
9132 vecstr += ulen;
9133 veclen -= ulen;
9134 }
9135 else if (args) {
46fc3d4c 9136 switch (intsize) {
9137 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
9138 default: uv = va_arg(*args, unsigned); break;
9139 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 9140 case 'V': uv = va_arg(*args, UV); break;
cf2093f6
JH
9141#ifdef HAS_QUAD
9142 case 'q': uv = va_arg(*args, Quad_t); break;
9143#endif
46fc3d4c 9144 }
9145 }
9146 else {
211dfcf1 9147 uv = SvUVx(argsv);
46fc3d4c 9148 switch (intsize) {
9149 case 'h': uv = (unsigned short)uv; break;
be28567c 9150 default: break;
46fc3d4c 9151 case 'l': uv = (unsigned long)uv; break;
fc36a67e 9152 case 'V': break;
cf2093f6
JH
9153#ifdef HAS_QUAD
9154 case 'q': uv = (Quad_t)uv; break;
9155#endif
46fc3d4c 9156 }
9157 }
9158
9159 integer:
46fc3d4c 9160 eptr = ebuf + sizeof ebuf;
fc36a67e 9161 switch (base) {
9162 unsigned dig;
9163 case 16:
c10ed8b9
HS
9164 if (!uv)
9165 alt = FALSE;
1d7c1841
GS
9166 p = (char*)((c == 'X')
9167 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 9168 do {
9169 dig = uv & 15;
9170 *--eptr = p[dig];
9171 } while (uv >>= 4);
9172 if (alt) {
46fc3d4c 9173 esignbuf[esignlen++] = '0';
fc36a67e 9174 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 9175 }
fc36a67e 9176 break;
9177 case 8:
9178 do {
9179 dig = uv & 7;
9180 *--eptr = '0' + dig;
9181 } while (uv >>= 3);
9182 if (alt && *eptr != '0')
9183 *--eptr = '0';
9184 break;
4f19785b
WSI
9185 case 2:
9186 do {
9187 dig = uv & 1;
9188 *--eptr = '0' + dig;
9189 } while (uv >>= 1);
eda88b6d
JH
9190 if (alt) {
9191 esignbuf[esignlen++] = '0';
7481bb52 9192 esignbuf[esignlen++] = 'b';
eda88b6d 9193 }
4f19785b 9194 break;
fc36a67e 9195 default: /* it had better be ten or less */
6bc102ca 9196#if defined(PERL_Y2KWARN)
e476b1b5 9197 if (ckWARN(WARN_Y2K)) {
6bc102ca
GS
9198 STRLEN n;
9199 char *s = SvPV(sv,n);
9200 if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
9201 && (n == 2 || !isDIGIT(s[n-3])))
9202 {
9014280d 9203 Perl_warner(aTHX_ packWARN(WARN_Y2K),
6bc102ca
GS
9204 "Possible Y2K bug: %%%c %s",
9205 c, "format string following '19'");
9206 }
9207 }
9208#endif
fc36a67e 9209 do {
9210 dig = uv % base;
9211 *--eptr = '0' + dig;
9212 } while (uv /= base);
9213 break;
46fc3d4c 9214 }
9215 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
9216 if (has_precis) {
9217 if (precis > elen)
9218 zeros = precis - elen;
9219 else if (precis == 0 && elen == 1 && *eptr == '0')
9220 elen = 0;
9221 }
46fc3d4c 9222 break;
9223
9224 /* FLOATING POINT */
9225
fc36a67e 9226 case 'F':
9227 c = 'f'; /* maybe %F isn't supported here */
9228 /* FALL THROUGH */
46fc3d4c 9229 case 'e': case 'E':
fc36a67e 9230 case 'f':
46fc3d4c 9231 case 'g': case 'G':
9232
9233 /* This is evil, but floating point is even more evil */
9234
9e5b023a
JH
9235 /* for SV-style calling, we can only get NV
9236 for C-style calling, we assume %f is double;
9237 for simplicity we allow any of %Lf, %llf, %qf for long double
9238 */
9239 switch (intsize) {
9240 case 'V':
9241#if defined(USE_LONG_DOUBLE)
9242 intsize = 'q';
9243#endif
9244 break;
8a2e3f14 9245/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364
HS
9246 case 'l':
9247 /* FALL THROUGH */
9e5b023a
JH
9248 default:
9249#if defined(USE_LONG_DOUBLE)
9250 intsize = args ? 0 : 'q';
9251#endif
9252 break;
9253 case 'q':
9254#if defined(HAS_LONG_DOUBLE)
9255 break;
9256#else
9257 /* FALL THROUGH */
9258#endif
9259 case 'h':
9e5b023a
JH
9260 goto unknown;
9261 }
9262
9263 /* now we need (long double) if intsize == 'q', else (double) */
be75b157 9264 nv = (args && !vectorize) ?
35fff930
JH
9265#if LONG_DOUBLESIZE > DOUBLESIZE
9266 intsize == 'q' ?
205f51d8
AS
9267 va_arg(*args, long double) :
9268 va_arg(*args, double)
35fff930 9269#else
205f51d8 9270 va_arg(*args, double)
35fff930 9271#endif
9e5b023a 9272 : SvNVx(argsv);
fc36a67e 9273
9274 need = 0;
be75b157 9275 vectorize = FALSE;
fc36a67e 9276 if (c != 'e' && c != 'E') {
9277 i = PERL_INT_MIN;
9e5b023a
JH
9278 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9279 will cast our (long double) to (double) */
73b309ea 9280 (void)Perl_frexp(nv, &i);
fc36a67e 9281 if (i == PERL_INT_MIN)
cea2e8a9 9282 Perl_die(aTHX_ "panic: frexp");
c635e13b 9283 if (i > 0)
fc36a67e 9284 need = BIT_DIGITS(i);
9285 }
9286 need += has_precis ? precis : 6; /* known default */
20f6aaab 9287
fc36a67e 9288 if (need < width)
9289 need = width;
9290
20f6aaab
AS
9291#ifdef HAS_LDBL_SPRINTF_BUG
9292 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9293 with sfio - Allen <allens@cpan.org> */
9294
9295# ifdef DBL_MAX
9296# define MY_DBL_MAX DBL_MAX
9297# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9298# if DOUBLESIZE >= 8
9299# define MY_DBL_MAX 1.7976931348623157E+308L
9300# else
9301# define MY_DBL_MAX 3.40282347E+38L
9302# endif
9303# endif
9304
9305# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9306# define MY_DBL_MAX_BUG 1L
20f6aaab 9307# else
205f51d8 9308# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9309# endif
20f6aaab 9310
205f51d8
AS
9311# ifdef DBL_MIN
9312# define MY_DBL_MIN DBL_MIN
9313# else /* XXX guessing! -Allen */
9314# if DOUBLESIZE >= 8
9315# define MY_DBL_MIN 2.2250738585072014E-308L
9316# else
9317# define MY_DBL_MIN 1.17549435E-38L
9318# endif
9319# endif
20f6aaab 9320
205f51d8
AS
9321 if ((intsize == 'q') && (c == 'f') &&
9322 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9323 (need < DBL_DIG)) {
9324 /* it's going to be short enough that
9325 * long double precision is not needed */
9326
9327 if ((nv <= 0L) && (nv >= -0L))
9328 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9329 else {
9330 /* would use Perl_fp_class as a double-check but not
9331 * functional on IRIX - see perl.h comments */
9332
9333 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9334 /* It's within the range that a double can represent */
9335#if defined(DBL_MAX) && !defined(DBL_MIN)
9336 if ((nv >= ((long double)1/DBL_MAX)) ||
9337 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9338#endif
205f51d8 9339 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9340 }
205f51d8
AS
9341 }
9342 if (fix_ldbl_sprintf_bug == TRUE) {
9343 double temp;
9344
9345 intsize = 0;
9346 temp = (double)nv;
9347 nv = (NV)temp;
9348 }
20f6aaab 9349 }
205f51d8
AS
9350
9351# undef MY_DBL_MAX
9352# undef MY_DBL_MAX_BUG
9353# undef MY_DBL_MIN
9354
20f6aaab
AS
9355#endif /* HAS_LDBL_SPRINTF_BUG */
9356
46fc3d4c 9357 need += 20; /* fudge factor */
80252599
GS
9358 if (PL_efloatsize < need) {
9359 Safefree(PL_efloatbuf);
9360 PL_efloatsize = need + 20; /* more fudge */
9361 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9362 PL_efloatbuf[0] = '\0';
46fc3d4c 9363 }
9364
4151a5fe
IZ
9365 if ( !(width || left || plus || alt) && fill != '0'
9366 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
9367 /* See earlier comment about buggy Gconvert when digits,
9368 aka precis is 0 */
9369 if ( c == 'g' && precis) {
2e59c212 9370 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4151a5fe
IZ
9371 if (*PL_efloatbuf) /* May return an empty string for digits==0 */
9372 goto float_converted;
9373 } else if ( c == 'f' && !precis) {
9374 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9375 break;
9376 }
9377 }
46fc3d4c 9378 eptr = ebuf + sizeof ebuf;
9379 *--eptr = '\0';
9380 *--eptr = c;
9e5b023a
JH
9381 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9382#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
9383 if (intsize == 'q') {
e5c81feb
JH
9384 /* Copy the one or more characters in a long double
9385 * format before the 'base' ([efgEFG]) character to
9386 * the format string. */
9387 static char const prifldbl[] = PERL_PRIfldbl;
9388 char const *p = prifldbl + sizeof(prifldbl) - 3;
9389 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 9390 }
65202027 9391#endif
46fc3d4c 9392 if (has_precis) {
9393 base = precis;
9394 do { *--eptr = '0' + (base % 10); } while (base /= 10);
9395 *--eptr = '.';
9396 }
9397 if (width) {
9398 base = width;
9399 do { *--eptr = '0' + (base % 10); } while (base /= 10);
9400 }
9401 if (fill == '0')
9402 *--eptr = fill;
84902520
TB
9403 if (left)
9404 *--eptr = '-';
46fc3d4c 9405 if (plus)
9406 *--eptr = plus;
9407 if (alt)
9408 *--eptr = '#';
9409 *--eptr = '%';
9410
ff9121f8
JH
9411 /* No taint. Otherwise we are in the strange situation
9412 * where printf() taints but print($float) doesn't.
bda0f7a5 9413 * --jhi */
9e5b023a
JH
9414#if defined(HAS_LONG_DOUBLE)
9415 if (intsize == 'q')
9416 (void)sprintf(PL_efloatbuf, eptr, nv);
9417 else
9418 (void)sprintf(PL_efloatbuf, eptr, (double)nv);
9419#else
dd8482fc 9420 (void)sprintf(PL_efloatbuf, eptr, nv);
9e5b023a 9421#endif
4151a5fe 9422 float_converted:
80252599
GS
9423 eptr = PL_efloatbuf;
9424 elen = strlen(PL_efloatbuf);
46fc3d4c 9425 break;
9426
fc36a67e 9427 /* SPECIAL */
9428
9429 case 'n':
9430 i = SvCUR(sv) - origlen;
be75b157 9431 if (args && !vectorize) {
c635e13b 9432 switch (intsize) {
9433 case 'h': *(va_arg(*args, short*)) = i; break;
9434 default: *(va_arg(*args, int*)) = i; break;
9435 case 'l': *(va_arg(*args, long*)) = i; break;
9436 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
9437#ifdef HAS_QUAD
9438 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
9439#endif
c635e13b 9440 }
fc36a67e 9441 }
9dd79c3f 9442 else
211dfcf1 9443 sv_setuv_mg(argsv, (UV)i);
be75b157 9444 vectorize = FALSE;
fc36a67e 9445 continue; /* not "break" */
9446
9447 /* UNKNOWN */
9448
46fc3d4c 9449 default:
fc36a67e 9450 unknown:
599cee73 9451 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 9452 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 9453 SV *msg = sv_newmortal();
35c1215d
NC
9454 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9455 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 9456 if (c) {
0f4b6630 9457 if (isPRINT(c))
1c846c1f 9458 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
9459 "\"%%%c\"", c & 0xFF);
9460 else
9461 Perl_sv_catpvf(aTHX_ msg,
57def98f 9462 "\"%%\\%03"UVof"\"",
0f4b6630 9463 (UV)c & 0xFF);
0f4b6630 9464 } else
c635e13b 9465 sv_catpv(msg, "end of string");
9014280d 9466 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 9467 }
fb73857a 9468
9469 /* output mangled stuff ... */
9470 if (c == '\0')
9471 --q;
46fc3d4c 9472 eptr = p;
9473 elen = q - p;
fb73857a 9474
9475 /* ... right here, because formatting flags should not apply */
9476 SvGROW(sv, SvCUR(sv) + elen + 1);
9477 p = SvEND(sv);
4459522c 9478 Copy(eptr, p, elen, char);
fb73857a 9479 p += elen;
9480 *p = '\0';
9481 SvCUR(sv) = p - SvPVX(sv);
58e33a90 9482 svix = osvix;
fb73857a 9483 continue; /* not "break" */
46fc3d4c 9484 }
9485
d2876be5
JH
9486 if (is_utf8 != has_utf8) {
9487 if (is_utf8) {
9488 if (SvCUR(sv))
9489 sv_utf8_upgrade(sv);
9490 }
9491 else {
9492 SV *nsv = sv_2mortal(newSVpvn(eptr, elen));
9493 sv_utf8_upgrade(nsv);
9494 eptr = SvPVX(nsv);
9495 elen = SvCUR(nsv);
9496 }
9497 SvGROW(sv, SvCUR(sv) + elen + 1);
9498 p = SvEND(sv);
9499 *p = '\0';
9500 }
94330da2
MHM
9501 /* Use memchr() instead of strchr(), as eptr is not guaranteed */
9502 /* to point to a null-terminated string. */
9503 if (left && ckWARN(WARN_PRINTF) && memchr(eptr, '\n', elen) &&
dca6e23f
RB
9504 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF))
9505 Perl_warner(aTHX_ packWARN(WARN_PRINTF),
9506 "Newline in left-justified string for %sprintf",
9507 (PL_op->op_type == OP_PRTF) ? "" : "s");
d2876be5 9508
fc36a67e 9509 have = esignlen + zeros + elen;
46fc3d4c 9510 need = (have > width ? have : width);
9511 gap = need - have;
9512
b22c7a20 9513 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 9514 p = SvEND(sv);
9515 if (esignlen && fill == '0') {
eb160463 9516 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9517 *p++ = esignbuf[i];
9518 }
9519 if (gap && !left) {
9520 memset(p, fill, gap);
9521 p += gap;
9522 }
9523 if (esignlen && fill != '0') {
eb160463 9524 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9525 *p++ = esignbuf[i];
9526 }
fc36a67e 9527 if (zeros) {
9528 for (i = zeros; i; i--)
9529 *p++ = '0';
9530 }
46fc3d4c 9531 if (elen) {
4459522c 9532 Copy(eptr, p, elen, char);
46fc3d4c 9533 p += elen;
9534 }
9535 if (gap && left) {
9536 memset(p, ' ', gap);
9537 p += gap;
9538 }
b22c7a20
GS
9539 if (vectorize) {
9540 if (veclen) {
4459522c 9541 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
9542 p += dotstrlen;
9543 }
9544 else
9545 vectorize = FALSE; /* done iterating over vecstr */
9546 }
2cf2cfc6
A
9547 if (is_utf8)
9548 has_utf8 = TRUE;
9549 if (has_utf8)
7e2040f0 9550 SvUTF8_on(sv);
46fc3d4c 9551 *p = '\0';
9552 SvCUR(sv) = p - SvPVX(sv);
b22c7a20
GS
9553 if (vectorize) {
9554 esignlen = 0;
9555 goto vector;
9556 }
46fc3d4c 9557 }
9558}
51371543 9559
645c22ef
DM
9560/* =========================================================================
9561
9562=head1 Cloning an interpreter
9563
9564All the macros and functions in this section are for the private use of
9565the main function, perl_clone().
9566
9567The foo_dup() functions make an exact copy of an existing foo thinngy.
9568During the course of a cloning, a hash table is used to map old addresses
9569to new addresses. The table is created and manipulated with the
9570ptr_table_* functions.
9571
9572=cut
9573
9574============================================================================*/
9575
9576
1d7c1841
GS
9577#if defined(USE_ITHREADS)
9578
1d7c1841
GS
9579#ifndef GpREFCNT_inc
9580# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
9581#endif
9582
9583
d2d73c3e
AB
9584#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
9585#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
9586#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9587#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
9588#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9589#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
9590#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9591#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
9592#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
9593#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
9594#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
9595#define SAVEPV(p) (p ? savepv(p) : Nullch)
9596#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 9597
d2d73c3e 9598
d2f185dc
AMS
9599/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
9600 regcomp.c. AMS 20010712 */
645c22ef 9601
1d7c1841 9602REGEXP *
a8fc9800 9603Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
1d7c1841 9604{
d2f185dc
AMS
9605 REGEXP *ret;
9606 int i, len, npar;
9607 struct reg_substr_datum *s;
9608
9609 if (!r)
9610 return (REGEXP *)NULL;
9611
9612 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
9613 return ret;
9614
9615 len = r->offsets[0];
9616 npar = r->nparens+1;
9617
9618 Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
9619 Copy(r->program, ret->program, len+1, regnode);
9620
9621 New(0, ret->startp, npar, I32);
9622 Copy(r->startp, ret->startp, npar, I32);
9623 New(0, ret->endp, npar, I32);
9624 Copy(r->startp, ret->startp, npar, I32);
9625
d2f185dc
AMS
9626 New(0, ret->substrs, 1, struct reg_substr_data);
9627 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
9628 s->min_offset = r->substrs->data[i].min_offset;
9629 s->max_offset = r->substrs->data[i].max_offset;
9630 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 9631 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
9632 }
9633
70612e96 9634 ret->regstclass = NULL;
d2f185dc
AMS
9635 if (r->data) {
9636 struct reg_data *d;
9637 int count = r->data->count;
9638
9639 Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
9640 char, struct reg_data);
9641 New(0, d->what, count, U8);
9642
9643 d->count = count;
9644 for (i = 0; i < count; i++) {
9645 d->what[i] = r->data->what[i];
9646 switch (d->what[i]) {
9647 case 's':
9648 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
9649 break;
9650 case 'p':
9651 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
9652 break;
9653 case 'f':
9654 /* This is cheating. */
9655 New(0, d->data[i], 1, struct regnode_charclass_class);
9656 StructCopy(r->data->data[i], d->data[i],
9657 struct regnode_charclass_class);
70612e96 9658 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
9659 break;
9660 case 'o':
33773810
AMS
9661 /* Compiled op trees are readonly, and can thus be
9662 shared without duplication. */
9b978d73
DM
9663 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
9664 break;
d2f185dc
AMS
9665 case 'n':
9666 d->data[i] = r->data->data[i];
9667 break;
9668 }
9669 }
9670
9671 ret->data = d;
9672 }
9673 else
9674 ret->data = NULL;
9675
9676 New(0, ret->offsets, 2*len+1, U32);
9677 Copy(r->offsets, ret->offsets, 2*len+1, U32);
9678
9679 ret->precomp = SAVEPV(r->precomp);
d2f185dc
AMS
9680 ret->refcnt = r->refcnt;
9681 ret->minlen = r->minlen;
9682 ret->prelen = r->prelen;
9683 ret->nparens = r->nparens;
9684 ret->lastparen = r->lastparen;
9685 ret->lastcloseparen = r->lastcloseparen;
9686 ret->reganch = r->reganch;
9687
70612e96
RG
9688 ret->sublen = r->sublen;
9689
9690 if (RX_MATCH_COPIED(ret))
9691 ret->subbeg = SAVEPV(r->subbeg);
9692 else
9693 ret->subbeg = Nullch;
9a26048b
NC
9694#ifdef PERL_COPY_ON_WRITE
9695 ret->saved_copy = Nullsv;
9696#endif
70612e96 9697
d2f185dc
AMS
9698 ptr_table_store(PL_ptr_table, r, ret);
9699 return ret;
1d7c1841
GS
9700}
9701
d2d73c3e 9702/* duplicate a file handle */
645c22ef 9703
1d7c1841 9704PerlIO *
a8fc9800 9705Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
9706{
9707 PerlIO *ret;
9708 if (!fp)
9709 return (PerlIO*)NULL;
9710
9711 /* look for it in the table first */
9712 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
9713 if (ret)
9714 return ret;
9715
9716 /* create anew and remember what it is */
ecdeb87c 9717 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
9718 ptr_table_store(PL_ptr_table, fp, ret);
9719 return ret;
9720}
9721
645c22ef
DM
9722/* duplicate a directory handle */
9723
1d7c1841
GS
9724DIR *
9725Perl_dirp_dup(pTHX_ DIR *dp)
9726{
9727 if (!dp)
9728 return (DIR*)NULL;
9729 /* XXX TODO */
9730 return dp;
9731}
9732
ff276b08 9733/* duplicate a typeglob */
645c22ef 9734
1d7c1841 9735GP *
a8fc9800 9736Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
9737{
9738 GP *ret;
9739 if (!gp)
9740 return (GP*)NULL;
9741 /* look for it in the table first */
9742 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
9743 if (ret)
9744 return ret;
9745
9746 /* create anew and remember what it is */
9747 Newz(0, ret, 1, GP);
9748 ptr_table_store(PL_ptr_table, gp, ret);
9749
9750 /* clone */
9751 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
9752 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
9753 ret->gp_io = io_dup_inc(gp->gp_io, param);
9754 ret->gp_form = cv_dup_inc(gp->gp_form, param);
9755 ret->gp_av = av_dup_inc(gp->gp_av, param);
9756 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
9757 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
9758 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
9759 ret->gp_cvgen = gp->gp_cvgen;
9760 ret->gp_flags = gp->gp_flags;
9761 ret->gp_line = gp->gp_line;
9762 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
9763 return ret;
9764}
9765
645c22ef
DM
9766/* duplicate a chain of magic */
9767
1d7c1841 9768MAGIC *
a8fc9800 9769Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 9770{
cb359b41
JH
9771 MAGIC *mgprev = (MAGIC*)NULL;
9772 MAGIC *mgret;
1d7c1841
GS
9773 if (!mg)
9774 return (MAGIC*)NULL;
9775 /* look for it in the table first */
9776 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
9777 if (mgret)
9778 return mgret;
9779
9780 for (; mg; mg = mg->mg_moremagic) {
9781 MAGIC *nmg;
9782 Newz(0, nmg, 1, MAGIC);
cb359b41 9783 if (mgprev)
1d7c1841 9784 mgprev->mg_moremagic = nmg;
cb359b41
JH
9785 else
9786 mgret = nmg;
1d7c1841
GS
9787 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
9788 nmg->mg_private = mg->mg_private;
9789 nmg->mg_type = mg->mg_type;
9790 nmg->mg_flags = mg->mg_flags;
14befaf4 9791 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 9792 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 9793 }
05bd4103 9794 else if(mg->mg_type == PERL_MAGIC_backref) {
fdc9a813
AE
9795 AV *av = (AV*) mg->mg_obj;
9796 SV **svp;
9797 I32 i;
9798 SvREFCNT_inc(nmg->mg_obj = (SV*)newAV());
9799 svp = AvARRAY(av);
9800 for (i = AvFILLp(av); i >= 0; i--) {
9801 if (!svp[i] || SvREFCNT(svp[i]) < 2) continue;
9802 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
9803 }
05bd4103 9804 }
1d7c1841
GS
9805 else {
9806 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
9807 ? sv_dup_inc(mg->mg_obj, param)
9808 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
9809 }
9810 nmg->mg_len = mg->mg_len;
9811 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 9812 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 9813 if (mg->mg_len > 0) {
1d7c1841 9814 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
9815 if (mg->mg_type == PERL_MAGIC_overload_table &&
9816 AMT_AMAGIC((AMT*)mg->mg_ptr))
9817 {
1d7c1841
GS
9818 AMT *amtp = (AMT*)mg->mg_ptr;
9819 AMT *namtp = (AMT*)nmg->mg_ptr;
9820 I32 i;
9821 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 9822 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
9823 }
9824 }
9825 }
9826 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 9827 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 9828 }
68795e93
NIS
9829 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
9830 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
9831 }
1d7c1841
GS
9832 mgprev = nmg;
9833 }
9834 return mgret;
9835}
9836
645c22ef
DM
9837/* create a new pointer-mapping table */
9838
1d7c1841
GS
9839PTR_TBL_t *
9840Perl_ptr_table_new(pTHX)
9841{
9842 PTR_TBL_t *tbl;
9843 Newz(0, tbl, 1, PTR_TBL_t);
9844 tbl->tbl_max = 511;
9845 tbl->tbl_items = 0;
9846 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
9847 return tbl;
9848}
9849
645c22ef
DM
9850/* map an existing pointer using a table */
9851
1d7c1841
GS
9852void *
9853Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
9854{
9855 PTR_TBL_ENT_t *tblent;
d2a79402 9856 UV hash = PTR2UV(sv);
1d7c1841
GS
9857 assert(tbl);
9858 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
9859 for (; tblent; tblent = tblent->next) {
9860 if (tblent->oldval == sv)
9861 return tblent->newval;
9862 }
9863 return (void*)NULL;
9864}
9865
645c22ef
DM
9866/* add a new entry to a pointer-mapping table */
9867
1d7c1841
GS
9868void
9869Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
9870{
9871 PTR_TBL_ENT_t *tblent, **otblent;
9872 /* XXX this may be pessimal on platforms where pointers aren't good
9873 * hash values e.g. if they grow faster in the most significant
9874 * bits */
d2a79402 9875 UV hash = PTR2UV(oldv);
1d7c1841
GS
9876 bool i = 1;
9877
9878 assert(tbl);
9879 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
9880 for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
9881 if (tblent->oldval == oldv) {
9882 tblent->newval = newv;
1d7c1841
GS
9883 return;
9884 }
9885 }
9886 Newz(0, tblent, 1, PTR_TBL_ENT_t);
9887 tblent->oldval = oldv;
9888 tblent->newval = newv;
9889 tblent->next = *otblent;
9890 *otblent = tblent;
9891 tbl->tbl_items++;
9892 if (i && tbl->tbl_items > tbl->tbl_max)
9893 ptr_table_split(tbl);
9894}
9895
645c22ef
DM
9896/* double the hash bucket size of an existing ptr table */
9897
1d7c1841
GS
9898void
9899Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
9900{
9901 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
9902 UV oldsize = tbl->tbl_max + 1;
9903 UV newsize = oldsize * 2;
9904 UV i;
9905
9906 Renew(ary, newsize, PTR_TBL_ENT_t*);
9907 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
9908 tbl->tbl_max = --newsize;
9909 tbl->tbl_ary = ary;
9910 for (i=0; i < oldsize; i++, ary++) {
9911 PTR_TBL_ENT_t **curentp, **entp, *ent;
9912 if (!*ary)
9913 continue;
9914 curentp = ary + oldsize;
9915 for (entp = ary, ent = *ary; ent; ent = *entp) {
d2a79402 9916 if ((newsize & PTR2UV(ent->oldval)) != i) {
1d7c1841
GS
9917 *entp = ent->next;
9918 ent->next = *curentp;
9919 *curentp = ent;
9920 continue;
9921 }
9922 else
9923 entp = &ent->next;
9924 }
9925 }
9926}
9927
645c22ef
DM
9928/* remove all the entries from a ptr table */
9929
a0739874
DM
9930void
9931Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
9932{
9933 register PTR_TBL_ENT_t **array;
9934 register PTR_TBL_ENT_t *entry;
9935 register PTR_TBL_ENT_t *oentry = Null(PTR_TBL_ENT_t*);
9936 UV riter = 0;
9937 UV max;
9938
9939 if (!tbl || !tbl->tbl_items) {
9940 return;
9941 }
9942
9943 array = tbl->tbl_ary;
9944 entry = array[0];
9945 max = tbl->tbl_max;
9946
9947 for (;;) {
9948 if (entry) {
9949 oentry = entry;
9950 entry = entry->next;
9951 Safefree(oentry);
9952 }
9953 if (!entry) {
9954 if (++riter > max) {
9955 break;
9956 }
9957 entry = array[riter];
9958 }
9959 }
9960
9961 tbl->tbl_items = 0;
9962}
9963
645c22ef
DM
9964/* clear and free a ptr table */
9965
a0739874
DM
9966void
9967Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
9968{
9969 if (!tbl) {
9970 return;
9971 }
9972 ptr_table_clear(tbl);
9973 Safefree(tbl->tbl_ary);
9974 Safefree(tbl);
9975}
9976
1d7c1841
GS
9977#ifdef DEBUGGING
9978char *PL_watch_pvx;
9979#endif
9980
645c22ef
DM
9981/* attempt to make everything in the typeglob readonly */
9982
5bd07a3d 9983STATIC SV *
59b40662 9984S_gv_share(pTHX_ SV *sstr, CLONE_PARAMS *param)
5bd07a3d
DM
9985{
9986 GV *gv = (GV*)sstr;
59b40662 9987 SV *sv = &param->proto_perl->Isv_no; /* just need SvREADONLY-ness */
5bd07a3d
DM
9988
9989 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 9990 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
9991 }
9992 else if (!GvCV(gv)) {
9993 GvCV(gv) = (CV*)sv;
9994 }
9995 else {
9996 /* CvPADLISTs cannot be shared */
37e20706 9997 if (!SvREADONLY(GvCV(gv)) && !CvXSUB(GvCV(gv))) {
7fb37951 9998 GvUNIQUE_off(gv);
5bd07a3d
DM
9999 }
10000 }
10001
7fb37951 10002 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
10003#if 0
10004 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
10005 HvNAME(GvSTASH(gv)), GvNAME(gv));
10006#endif
10007 return Nullsv;
10008 }
10009
4411f3b6 10010 /*
5bd07a3d
DM
10011 * write attempts will die with
10012 * "Modification of a read-only value attempted"
10013 */
10014 if (!GvSV(gv)) {
10015 GvSV(gv) = sv;
10016 }
10017 else {
10018 SvREADONLY_on(GvSV(gv));
10019 }
10020
10021 if (!GvAV(gv)) {
10022 GvAV(gv) = (AV*)sv;
10023 }
10024 else {
10025 SvREADONLY_on(GvAV(gv));
10026 }
10027
10028 if (!GvHV(gv)) {
10029 GvHV(gv) = (HV*)sv;
10030 }
10031 else {
10032 SvREADONLY_on(GvAV(gv));
10033 }
10034
10035 return sstr; /* he_dup() will SvREFCNT_inc() */
10036}
10037
645c22ef
DM
10038/* duplicate an SV of any type (including AV, HV etc) */
10039
83841fad
NIS
10040void
10041Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
10042{
10043 if (SvROK(sstr)) {
d3d0e6f1 10044 SvRV(dstr) = SvWEAKREF(sstr)
83841fad
NIS
10045 ? sv_dup(SvRV(sstr), param)
10046 : sv_dup_inc(SvRV(sstr), param);
10047 }
10048 else if (SvPVX(sstr)) {
10049 /* Has something there */
10050 if (SvLEN(sstr)) {
68795e93 10051 /* Normal PV - clone whole allocated space */
83841fad 10052 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
d3d0e6f1
NC
10053 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10054 /* Not that normal - actually sstr is copy on write.
10055 But we are a true, independant SV, so: */
10056 SvREADONLY_off(dstr);
10057 SvFAKE_off(dstr);
10058 }
68795e93 10059 }
83841fad
NIS
10060 else {
10061 /* Special case - not normally malloced for some reason */
10062 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10063 /* A "shared" PV - clone it as unshared string */
281b2760 10064 if(SvPADTMP(sstr)) {
5e6160dc
AB
10065 /* However, some of them live in the pad
10066 and they should not have these flags
10067 turned off */
281b2760
AB
10068
10069 SvPVX(dstr) = sharepvn(SvPVX(sstr), SvCUR(sstr),
10070 SvUVX(sstr));
10071 SvUVX(dstr) = SvUVX(sstr);
10072 } else {
10073
10074 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvCUR(sstr));
10075 SvFAKE_off(dstr);
10076 SvREADONLY_off(dstr);
5e6160dc 10077 }
83841fad
NIS
10078 }
10079 else {
10080 /* Some other special case - random pointer */
10081 SvPVX(dstr) = SvPVX(sstr);
d3d0e6f1 10082 }
83841fad
NIS
10083 }
10084 }
10085 else {
10086 /* Copy the Null */
10087 SvPVX(dstr) = SvPVX(sstr);
10088 }
10089}
10090
1d7c1841 10091SV *
a8fc9800 10092Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
1d7c1841 10093{
1d7c1841
GS
10094 SV *dstr;
10095
10096 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
10097 return Nullsv;
10098 /* look for it in the table first */
10099 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
10100 if (dstr)
10101 return dstr;
10102
0405e91e
AB
10103 if(param->flags & CLONEf_JOIN_IN) {
10104 /** We are joining here so we don't want do clone
10105 something that is bad **/
10106
10107 if(SvTYPE(sstr) == SVt_PVHV &&
10108 HvNAME(sstr)) {
10109 /** don't clone stashes if they already exist **/
10110 HV* old_stash = gv_stashpv(HvNAME(sstr),0);
10111 return (SV*) old_stash;
10112 }
10113 }
10114
1d7c1841
GS
10115 /* create anew and remember what it is */
10116 new_SV(dstr);
10117 ptr_table_store(PL_ptr_table, sstr, dstr);
10118
10119 /* clone */
10120 SvFLAGS(dstr) = SvFLAGS(sstr);
10121 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
10122 SvREFCNT(dstr) = 0; /* must be before any other dups! */
10123
10124#ifdef DEBUGGING
10125 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
10126 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
10127 PL_watch_pvx, SvPVX(sstr));
10128#endif
10129
10130 switch (SvTYPE(sstr)) {
10131 case SVt_NULL:
10132 SvANY(dstr) = NULL;
10133 break;
10134 case SVt_IV:
10135 SvANY(dstr) = new_XIV();
10136 SvIVX(dstr) = SvIVX(sstr);
10137 break;
10138 case SVt_NV:
10139 SvANY(dstr) = new_XNV();
10140 SvNVX(dstr) = SvNVX(sstr);
10141 break;
10142 case SVt_RV:
10143 SvANY(dstr) = new_XRV();
83841fad 10144 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10145 break;
10146 case SVt_PV:
10147 SvANY(dstr) = new_XPV();
10148 SvCUR(dstr) = SvCUR(sstr);
10149 SvLEN(dstr) = SvLEN(sstr);
83841fad 10150 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10151 break;
10152 case SVt_PVIV:
10153 SvANY(dstr) = new_XPVIV();
10154 SvCUR(dstr) = SvCUR(sstr);
10155 SvLEN(dstr) = SvLEN(sstr);
10156 SvIVX(dstr) = SvIVX(sstr);
83841fad 10157 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10158 break;
10159 case SVt_PVNV:
10160 SvANY(dstr) = new_XPVNV();
10161 SvCUR(dstr) = SvCUR(sstr);
10162 SvLEN(dstr) = SvLEN(sstr);
10163 SvIVX(dstr) = SvIVX(sstr);
10164 SvNVX(dstr) = SvNVX(sstr);
83841fad 10165 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10166 break;
10167 case SVt_PVMG:
10168 SvANY(dstr) = new_XPVMG();
10169 SvCUR(dstr) = SvCUR(sstr);
10170 SvLEN(dstr) = SvLEN(sstr);
10171 SvIVX(dstr) = SvIVX(sstr);
10172 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10173 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10174 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10175 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10176 break;
10177 case SVt_PVBM:
10178 SvANY(dstr) = new_XPVBM();
10179 SvCUR(dstr) = SvCUR(sstr);
10180 SvLEN(dstr) = SvLEN(sstr);
10181 SvIVX(dstr) = SvIVX(sstr);
10182 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10183 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10184 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10185 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10186 BmRARE(dstr) = BmRARE(sstr);
10187 BmUSEFUL(dstr) = BmUSEFUL(sstr);
10188 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
10189 break;
10190 case SVt_PVLV:
10191 SvANY(dstr) = new_XPVLV();
10192 SvCUR(dstr) = SvCUR(sstr);
10193 SvLEN(dstr) = SvLEN(sstr);
10194 SvIVX(dstr) = SvIVX(sstr);
10195 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10196 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10197 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10198 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10199 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
10200 LvTARGLEN(dstr) = LvTARGLEN(sstr);
dd28f7bb
DM
10201 if (LvTYPE(sstr) == 't') /* for tie: unrefcnted fake (SV**) */
10202 LvTARG(dstr) = dstr;
10203 else if (LvTYPE(sstr) == 'T') /* for tie: fake HE */
10204 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(sstr), 0, param);
10205 else
10206 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr), param);
1d7c1841
GS
10207 LvTYPE(dstr) = LvTYPE(sstr);
10208 break;
10209 case SVt_PVGV:
7fb37951 10210 if (GvUNIQUE((GV*)sstr)) {
5bd07a3d 10211 SV *share;
59b40662 10212 if ((share = gv_share(sstr, param))) {
5bd07a3d
DM
10213 del_SV(dstr);
10214 dstr = share;
37e20706 10215 ptr_table_store(PL_ptr_table, sstr, dstr);
5bd07a3d
DM
10216#if 0
10217 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
10218 HvNAME(GvSTASH(share)), GvNAME(share));
10219#endif
10220 break;
10221 }
10222 }
1d7c1841
GS
10223 SvANY(dstr) = new_XPVGV();
10224 SvCUR(dstr) = SvCUR(sstr);
10225 SvLEN(dstr) = SvLEN(sstr);
10226 SvIVX(dstr) = SvIVX(sstr);
10227 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10228 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10229 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10230 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10231 GvNAMELEN(dstr) = GvNAMELEN(sstr);
10232 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
d2d73c3e 10233 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr), param);
1d7c1841 10234 GvFLAGS(dstr) = GvFLAGS(sstr);
d2d73c3e 10235 GvGP(dstr) = gp_dup(GvGP(sstr), param);
1d7c1841
GS
10236 (void)GpREFCNT_inc(GvGP(dstr));
10237 break;
10238 case SVt_PVIO:
10239 SvANY(dstr) = new_XPVIO();
10240 SvCUR(dstr) = SvCUR(sstr);
10241 SvLEN(dstr) = SvLEN(sstr);
10242 SvIVX(dstr) = SvIVX(sstr);
10243 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10244 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10245 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10246 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
a8fc9800 10247 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10248 if (IoOFP(sstr) == IoIFP(sstr))
10249 IoOFP(dstr) = IoIFP(dstr);
10250 else
a8fc9800 10251 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10252 /* PL_rsfp_filters entries have fake IoDIRP() */
10253 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
10254 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
10255 else
10256 IoDIRP(dstr) = IoDIRP(sstr);
10257 IoLINES(dstr) = IoLINES(sstr);
10258 IoPAGE(dstr) = IoPAGE(sstr);
10259 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
10260 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
5a37521b
AB
10261 if(IoFLAGS(sstr) & IOf_FAKE_DIRP) {
10262 /* I have no idea why fake dirp (rsfps)
10263 should be treaded differently but otherwise
10264 we end up with leaks -- sky*/
10265 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(sstr), param);
10266 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(sstr), param);
10267 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(sstr), param);
10268 } else {
10269 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr), param);
10270 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr), param);
10271 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr), param);
10272 }
1d7c1841 10273 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
1d7c1841 10274 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
1d7c1841 10275 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
1d7c1841
GS
10276 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
10277 IoTYPE(dstr) = IoTYPE(sstr);
10278 IoFLAGS(dstr) = IoFLAGS(sstr);
10279 break;
10280 case SVt_PVAV:
10281 SvANY(dstr) = new_XPVAV();
10282 SvCUR(dstr) = SvCUR(sstr);
10283 SvLEN(dstr) = SvLEN(sstr);
10284 SvIVX(dstr) = SvIVX(sstr);
10285 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10286 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10287 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
10288 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
1d7c1841
GS
10289 AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
10290 if (AvARRAY((AV*)sstr)) {
10291 SV **dst_ary, **src_ary;
10292 SSize_t items = AvFILLp((AV*)sstr) + 1;
10293
10294 src_ary = AvARRAY((AV*)sstr);
10295 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
10296 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
10297 SvPVX(dstr) = (char*)dst_ary;
10298 AvALLOC((AV*)dstr) = dst_ary;
10299 if (AvREAL((AV*)sstr)) {
10300 while (items-- > 0)
d2d73c3e 10301 *dst_ary++ = sv_dup_inc(*src_ary++, param);
1d7c1841
GS
10302 }
10303 else {
10304 while (items-- > 0)
d2d73c3e 10305 *dst_ary++ = sv_dup(*src_ary++, param);
1d7c1841
GS
10306 }
10307 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10308 while (items-- > 0) {
10309 *dst_ary++ = &PL_sv_undef;
10310 }
10311 }
10312 else {
10313 SvPVX(dstr) = Nullch;
10314 AvALLOC((AV*)dstr) = (SV**)NULL;
10315 }
10316 break;
10317 case SVt_PVHV:
10318 SvANY(dstr) = new_XPVHV();
10319 SvCUR(dstr) = SvCUR(sstr);
10320 SvLEN(dstr) = SvLEN(sstr);
10321 SvIVX(dstr) = SvIVX(sstr);
10322 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10323 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10324 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841
GS
10325 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
10326 if (HvARRAY((HV*)sstr)) {
1d7c1841
GS
10327 STRLEN i = 0;
10328 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
10329 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
10330 Newz(0, dxhv->xhv_array,
10331 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
10332 while (i <= sxhv->xhv_max) {
10333 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
eb160463
GS
10334 (bool)!!HvSHAREKEYS(sstr),
10335 param);
1d7c1841
GS
10336 ++i;
10337 }
eb160463
GS
10338 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter,
10339 (bool)!!HvSHAREKEYS(sstr), param);
1d7c1841
GS
10340 }
10341 else {
10342 SvPVX(dstr) = Nullch;
10343 HvEITER((HV*)dstr) = (HE*)NULL;
10344 }
10345 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
10346 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
c43294b8 10347 /* Record stashes for possible cloning in Perl_clone(). */
6676db26 10348 if(HvNAME((HV*)dstr))
d2d73c3e 10349 av_push(param->stashes, dstr);
1d7c1841
GS
10350 break;
10351 case SVt_PVFM:
10352 SvANY(dstr) = new_XPVFM();
10353 FmLINES(dstr) = FmLINES(sstr);
10354 goto dup_pvcv;
10355 /* NOTREACHED */
10356 case SVt_PVCV:
10357 SvANY(dstr) = new_XPVCV();
d2d73c3e 10358 dup_pvcv:
1d7c1841
GS
10359 SvCUR(dstr) = SvCUR(sstr);
10360 SvLEN(dstr) = SvLEN(sstr);
10361 SvIVX(dstr) = SvIVX(sstr);
10362 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10363 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10364 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10365 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
d2d73c3e 10366 CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
1d7c1841
GS
10367 CvSTART(dstr) = CvSTART(sstr);
10368 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
10369 CvXSUB(dstr) = CvXSUB(sstr);
10370 CvXSUBANY(dstr) = CvXSUBANY(sstr);
01485f8b
DM
10371 if (CvCONST(sstr)) {
10372 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
10373 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
10374 sv_dup_inc(CvXSUBANY(sstr).any_ptr, param);
10375 }
d2d73c3e
AB
10376 CvGV(dstr) = gv_dup(CvGV(sstr), param);
10377 if (param->flags & CLONEf_COPY_STACKS) {
10378 CvDEPTH(dstr) = CvDEPTH(sstr);
10379 } else {
10380 CvDEPTH(dstr) = 0;
10381 }
dd2155a4 10382 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
7dafbf52
DM
10383 CvOUTSIDE_SEQ(dstr) = CvOUTSIDE_SEQ(sstr);
10384 CvOUTSIDE(dstr) =
10385 CvWEAKOUTSIDE(sstr)
10386 ? cv_dup( CvOUTSIDE(sstr), param)
10387 : cv_dup_inc(CvOUTSIDE(sstr), param);
1d7c1841 10388 CvFLAGS(dstr) = CvFLAGS(sstr);
54356c7d 10389 CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
1d7c1841
GS
10390 break;
10391 default:
c803eecc 10392 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
1d7c1841
GS
10393 break;
10394 }
10395
10396 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
10397 ++PL_sv_objcount;
10398
10399 return dstr;
d2d73c3e 10400 }
1d7c1841 10401
645c22ef
DM
10402/* duplicate a context */
10403
1d7c1841 10404PERL_CONTEXT *
a8fc9800 10405Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
10406{
10407 PERL_CONTEXT *ncxs;
10408
10409 if (!cxs)
10410 return (PERL_CONTEXT*)NULL;
10411
10412 /* look for it in the table first */
10413 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
10414 if (ncxs)
10415 return ncxs;
10416
10417 /* create anew and remember what it is */
10418 Newz(56, ncxs, max + 1, PERL_CONTEXT);
10419 ptr_table_store(PL_ptr_table, cxs, ncxs);
10420
10421 while (ix >= 0) {
10422 PERL_CONTEXT *cx = &cxs[ix];
10423 PERL_CONTEXT *ncx = &ncxs[ix];
10424 ncx->cx_type = cx->cx_type;
10425 if (CxTYPE(cx) == CXt_SUBST) {
10426 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
10427 }
10428 else {
10429 ncx->blk_oldsp = cx->blk_oldsp;
10430 ncx->blk_oldcop = cx->blk_oldcop;
10431 ncx->blk_oldretsp = cx->blk_oldretsp;
10432 ncx->blk_oldmarksp = cx->blk_oldmarksp;
10433 ncx->blk_oldscopesp = cx->blk_oldscopesp;
10434 ncx->blk_oldpm = cx->blk_oldpm;
10435 ncx->blk_gimme = cx->blk_gimme;
10436 switch (CxTYPE(cx)) {
10437 case CXt_SUB:
10438 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
10439 ? cv_dup_inc(cx->blk_sub.cv, param)
10440 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 10441 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 10442 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 10443 : Nullav);
d2d73c3e 10444 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
10445 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
10446 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10447 ncx->blk_sub.lval = cx->blk_sub.lval;
10448 break;
10449 case CXt_EVAL:
10450 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
10451 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 10452 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 10453 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 10454 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
1d7c1841
GS
10455 break;
10456 case CXt_LOOP:
10457 ncx->blk_loop.label = cx->blk_loop.label;
10458 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
10459 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
10460 ncx->blk_loop.next_op = cx->blk_loop.next_op;
10461 ncx->blk_loop.last_op = cx->blk_loop.last_op;
10462 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
10463 ? cx->blk_loop.iterdata
d2d73c3e 10464 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
10465 ncx->blk_loop.oldcomppad
10466 = (PAD*)ptr_table_fetch(PL_ptr_table,
10467 cx->blk_loop.oldcomppad);
d2d73c3e
AB
10468 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
10469 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
10470 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
10471 ncx->blk_loop.iterix = cx->blk_loop.iterix;
10472 ncx->blk_loop.itermax = cx->blk_loop.itermax;
10473 break;
10474 case CXt_FORMAT:
d2d73c3e
AB
10475 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
10476 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
10477 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841
GS
10478 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10479 break;
10480 case CXt_BLOCK:
10481 case CXt_NULL:
10482 break;
10483 }
10484 }
10485 --ix;
10486 }
10487 return ncxs;
10488}
10489
645c22ef
DM
10490/* duplicate a stack info structure */
10491
1d7c1841 10492PERL_SI *
a8fc9800 10493Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
10494{
10495 PERL_SI *nsi;
10496
10497 if (!si)
10498 return (PERL_SI*)NULL;
10499
10500 /* look for it in the table first */
10501 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
10502 if (nsi)
10503 return nsi;
10504
10505 /* create anew and remember what it is */
10506 Newz(56, nsi, 1, PERL_SI);
10507 ptr_table_store(PL_ptr_table, si, nsi);
10508
d2d73c3e 10509 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
10510 nsi->si_cxix = si->si_cxix;
10511 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 10512 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 10513 nsi->si_type = si->si_type;
d2d73c3e
AB
10514 nsi->si_prev = si_dup(si->si_prev, param);
10515 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
10516 nsi->si_markoff = si->si_markoff;
10517
10518 return nsi;
10519}
10520
10521#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
10522#define TOPINT(ss,ix) ((ss)[ix].any_i32)
10523#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
10524#define TOPLONG(ss,ix) ((ss)[ix].any_long)
10525#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
10526#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
10527#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
10528#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
10529#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
10530#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
10531#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
10532#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
10533#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
10534#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
10535
10536/* XXXXX todo */
10537#define pv_dup_inc(p) SAVEPV(p)
10538#define pv_dup(p) SAVEPV(p)
10539#define svp_dup_inc(p,pp) any_dup(p,pp)
10540
645c22ef
DM
10541/* map any object to the new equivent - either something in the
10542 * ptr table, or something in the interpreter structure
10543 */
10544
1d7c1841
GS
10545void *
10546Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
10547{
10548 void *ret;
10549
10550 if (!v)
10551 return (void*)NULL;
10552
10553 /* look for it in the table first */
10554 ret = ptr_table_fetch(PL_ptr_table, v);
10555 if (ret)
10556 return ret;
10557
10558 /* see if it is part of the interpreter structure */
10559 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 10560 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 10561 else {
1d7c1841 10562 ret = v;
05ec9bb3 10563 }
1d7c1841
GS
10564
10565 return ret;
10566}
10567
645c22ef
DM
10568/* duplicate the save stack */
10569
1d7c1841 10570ANY *
a8fc9800 10571Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841
GS
10572{
10573 ANY *ss = proto_perl->Tsavestack;
10574 I32 ix = proto_perl->Tsavestack_ix;
10575 I32 max = proto_perl->Tsavestack_max;
10576 ANY *nss;
10577 SV *sv;
10578 GV *gv;
10579 AV *av;
10580 HV *hv;
10581 void* ptr;
10582 int intval;
10583 long longval;
10584 GP *gp;
10585 IV iv;
10586 I32 i;
c4e33207 10587 char *c = NULL;
1d7c1841 10588 void (*dptr) (void*);
acfe0abc 10589 void (*dxptr) (pTHX_ void*);
e977893f 10590 OP *o;
1d7c1841
GS
10591
10592 Newz(54, nss, max, ANY);
10593
10594 while (ix > 0) {
10595 i = POPINT(ss,ix);
10596 TOPINT(nss,ix) = i;
10597 switch (i) {
10598 case SAVEt_ITEM: /* normal string */
10599 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10600 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10601 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10602 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10603 break;
10604 case SAVEt_SV: /* scalar reference */
10605 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10606 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10607 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10608 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 10609 break;
f4dd75d9
GS
10610 case SAVEt_GENERIC_PVREF: /* generic char* */
10611 c = (char*)POPPTR(ss,ix);
10612 TOPPTR(nss,ix) = pv_dup(c);
10613 ptr = POPPTR(ss,ix);
10614 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10615 break;
05ec9bb3
NIS
10616 case SAVEt_SHARED_PVREF: /* char* in shared space */
10617 c = (char*)POPPTR(ss,ix);
10618 TOPPTR(nss,ix) = savesharedpv(c);
10619 ptr = POPPTR(ss,ix);
10620 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10621 break;
1d7c1841
GS
10622 case SAVEt_GENERIC_SVREF: /* generic sv */
10623 case SAVEt_SVREF: /* scalar reference */
10624 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10625 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10626 ptr = POPPTR(ss,ix);
10627 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
10628 break;
10629 case SAVEt_AV: /* array reference */
10630 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10631 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 10632 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10633 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10634 break;
10635 case SAVEt_HV: /* hash reference */
10636 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10637 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 10638 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10639 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10640 break;
10641 case SAVEt_INT: /* int reference */
10642 ptr = POPPTR(ss,ix);
10643 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10644 intval = (int)POPINT(ss,ix);
10645 TOPINT(nss,ix) = intval;
10646 break;
10647 case SAVEt_LONG: /* long reference */
10648 ptr = POPPTR(ss,ix);
10649 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10650 longval = (long)POPLONG(ss,ix);
10651 TOPLONG(nss,ix) = longval;
10652 break;
10653 case SAVEt_I32: /* I32 reference */
10654 case SAVEt_I16: /* I16 reference */
10655 case SAVEt_I8: /* I8 reference */
10656 ptr = POPPTR(ss,ix);
10657 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10658 i = POPINT(ss,ix);
10659 TOPINT(nss,ix) = i;
10660 break;
10661 case SAVEt_IV: /* IV reference */
10662 ptr = POPPTR(ss,ix);
10663 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10664 iv = POPIV(ss,ix);
10665 TOPIV(nss,ix) = iv;
10666 break;
10667 case SAVEt_SPTR: /* SV* reference */
10668 ptr = POPPTR(ss,ix);
10669 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10670 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10671 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
10672 break;
10673 case SAVEt_VPTR: /* random* reference */
10674 ptr = POPPTR(ss,ix);
10675 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10676 ptr = POPPTR(ss,ix);
10677 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10678 break;
10679 case SAVEt_PPTR: /* char* reference */
10680 ptr = POPPTR(ss,ix);
10681 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10682 c = (char*)POPPTR(ss,ix);
10683 TOPPTR(nss,ix) = pv_dup(c);
10684 break;
10685 case SAVEt_HPTR: /* HV* reference */
10686 ptr = POPPTR(ss,ix);
10687 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10688 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10689 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
10690 break;
10691 case SAVEt_APTR: /* AV* reference */
10692 ptr = POPPTR(ss,ix);
10693 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10694 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10695 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
10696 break;
10697 case SAVEt_NSTAB:
10698 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10699 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10700 break;
10701 case SAVEt_GP: /* scalar reference */
10702 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 10703 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
10704 (void)GpREFCNT_inc(gp);
10705 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 10706 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
10707 c = (char*)POPPTR(ss,ix);
10708 TOPPTR(nss,ix) = pv_dup(c);
10709 iv = POPIV(ss,ix);
10710 TOPIV(nss,ix) = iv;
10711 iv = POPIV(ss,ix);
10712 TOPIV(nss,ix) = iv;
10713 break;
10714 case SAVEt_FREESV:
26d9b02f 10715 case SAVEt_MORTALIZESV:
1d7c1841 10716 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10717 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10718 break;
10719 case SAVEt_FREEOP:
10720 ptr = POPPTR(ss,ix);
10721 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
10722 /* these are assumed to be refcounted properly */
10723 switch (((OP*)ptr)->op_type) {
10724 case OP_LEAVESUB:
10725 case OP_LEAVESUBLV:
10726 case OP_LEAVEEVAL:
10727 case OP_LEAVE:
10728 case OP_SCOPE:
10729 case OP_LEAVEWRITE:
e977893f
GS
10730 TOPPTR(nss,ix) = ptr;
10731 o = (OP*)ptr;
10732 OpREFCNT_inc(o);
1d7c1841
GS
10733 break;
10734 default:
10735 TOPPTR(nss,ix) = Nullop;
10736 break;
10737 }
10738 }
10739 else
10740 TOPPTR(nss,ix) = Nullop;
10741 break;
10742 case SAVEt_FREEPV:
10743 c = (char*)POPPTR(ss,ix);
10744 TOPPTR(nss,ix) = pv_dup_inc(c);
10745 break;
10746 case SAVEt_CLEARSV:
10747 longval = POPLONG(ss,ix);
10748 TOPLONG(nss,ix) = longval;
10749 break;
10750 case SAVEt_DELETE:
10751 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10752 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10753 c = (char*)POPPTR(ss,ix);
10754 TOPPTR(nss,ix) = pv_dup_inc(c);
10755 i = POPINT(ss,ix);
10756 TOPINT(nss,ix) = i;
10757 break;
10758 case SAVEt_DESTRUCTOR:
10759 ptr = POPPTR(ss,ix);
10760 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10761 dptr = POPDPTR(ss,ix);
ef75a179 10762 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
10763 break;
10764 case SAVEt_DESTRUCTOR_X:
10765 ptr = POPPTR(ss,ix);
10766 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10767 dxptr = POPDXPTR(ss,ix);
acfe0abc 10768 TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
10769 break;
10770 case SAVEt_REGCONTEXT:
10771 case SAVEt_ALLOC:
10772 i = POPINT(ss,ix);
10773 TOPINT(nss,ix) = i;
10774 ix -= i;
10775 break;
10776 case SAVEt_STACK_POS: /* Position on Perl stack */
10777 i = POPINT(ss,ix);
10778 TOPINT(nss,ix) = i;
10779 break;
10780 case SAVEt_AELEM: /* array element */
10781 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10782 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10783 i = POPINT(ss,ix);
10784 TOPINT(nss,ix) = i;
10785 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10786 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
10787 break;
10788 case SAVEt_HELEM: /* hash element */
10789 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10790 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10791 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10792 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10793 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10794 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10795 break;
10796 case SAVEt_OP:
10797 ptr = POPPTR(ss,ix);
10798 TOPPTR(nss,ix) = ptr;
10799 break;
10800 case SAVEt_HINTS:
10801 i = POPINT(ss,ix);
10802 TOPINT(nss,ix) = i;
10803 break;
c4410b1b
GS
10804 case SAVEt_COMPPAD:
10805 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10806 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 10807 break;
c3564e5c
GS
10808 case SAVEt_PADSV:
10809 longval = (long)POPLONG(ss,ix);
10810 TOPLONG(nss,ix) = longval;
10811 ptr = POPPTR(ss,ix);
10812 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10813 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10814 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 10815 break;
a1bb4754 10816 case SAVEt_BOOL:
38d8b13e 10817 ptr = POPPTR(ss,ix);
b9609c01 10818 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 10819 longval = (long)POPBOOL(ss,ix);
b9609c01 10820 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 10821 break;
8bd2680e
MHM
10822 case SAVEt_SET_SVFLAGS:
10823 i = POPINT(ss,ix);
10824 TOPINT(nss,ix) = i;
10825 i = POPINT(ss,ix);
10826 TOPINT(nss,ix) = i;
10827 sv = (SV*)POPPTR(ss,ix);
10828 TOPPTR(nss,ix) = sv_dup(sv, param);
10829 break;
1d7c1841
GS
10830 default:
10831 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
10832 }
10833 }
10834
10835 return nss;
10836}
10837
645c22ef
DM
10838/*
10839=for apidoc perl_clone
10840
10841Create and return a new interpreter by cloning the current one.
10842
4be49ee6 10843perl_clone takes these flags as parameters:
6a78b4db
AB
10844
10845CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
10846without it we only clone the data and zero the stacks,
10847with it we copy the stacks and the new perl interpreter is
10848ready to run at the exact same point as the previous one.
10849The pseudo-fork code uses COPY_STACKS while the
10850threads->new doesn't.
10851
10852CLONEf_KEEP_PTR_TABLE
10853perl_clone keeps a ptr_table with the pointer of the old
10854variable as a key and the new variable as a value,
10855this allows it to check if something has been cloned and not
10856clone it again but rather just use the value and increase the
10857refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
10858the ptr_table using the function
10859C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
10860reason to keep it around is if you want to dup some of your own
10861variable who are outside the graph perl scans, example of this
10862code is in threads.xs create
10863
10864CLONEf_CLONE_HOST
10865This is a win32 thing, it is ignored on unix, it tells perls
10866win32host code (which is c++) to clone itself, this is needed on
10867win32 if you want to run two threads at the same time,
10868if you just want to do some stuff in a separate perl interpreter
10869and then throw it away and return to the original one,
10870you don't need to do anything.
10871
645c22ef
DM
10872=cut
10873*/
10874
10875/* XXX the above needs expanding by someone who actually understands it ! */
3fc56081
NK
10876EXTERN_C PerlInterpreter *
10877perl_clone_host(PerlInterpreter* proto_perl, UV flags);
645c22ef 10878
1d7c1841
GS
10879PerlInterpreter *
10880perl_clone(PerlInterpreter *proto_perl, UV flags)
10881{
1d7c1841 10882#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
10883
10884 /* perlhost.h so we need to call into it
10885 to clone the host, CPerlHost should have a c interface, sky */
10886
10887 if (flags & CLONEf_CLONE_HOST) {
10888 return perl_clone_host(proto_perl,flags);
10889 }
10890 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
10891 proto_perl->IMem,
10892 proto_perl->IMemShared,
10893 proto_perl->IMemParse,
10894 proto_perl->IEnv,
10895 proto_perl->IStdIO,
10896 proto_perl->ILIO,
10897 proto_perl->IDir,
10898 proto_perl->ISock,
10899 proto_perl->IProc);
10900}
10901
10902PerlInterpreter *
10903perl_clone_using(PerlInterpreter *proto_perl, UV flags,
10904 struct IPerlMem* ipM, struct IPerlMem* ipMS,
10905 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
10906 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
10907 struct IPerlDir* ipD, struct IPerlSock* ipS,
10908 struct IPerlProc* ipP)
10909{
10910 /* XXX many of the string copies here can be optimized if they're
10911 * constants; they need to be allocated as common memory and just
10912 * their pointers copied. */
10913
10914 IV i;
64aa0685
GS
10915 CLONE_PARAMS clone_params;
10916 CLONE_PARAMS* param = &clone_params;
d2d73c3e 10917
1d7c1841 10918 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
ba869deb 10919 PERL_SET_THX(my_perl);
1d7c1841 10920
acfe0abc 10921# ifdef DEBUGGING
a4530404 10922 Poison(my_perl, 1, PerlInterpreter);
1d7c1841
GS
10923 PL_markstack = 0;
10924 PL_scopestack = 0;
10925 PL_savestack = 0;
22f7c9c9
JH
10926 PL_savestack_ix = 0;
10927 PL_savestack_max = -1;
1d7c1841 10928 PL_retstack = 0;
66fe0623 10929 PL_sig_pending = 0;
25596c82 10930 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
acfe0abc 10931# else /* !DEBUGGING */
1d7c1841 10932 Zero(my_perl, 1, PerlInterpreter);
acfe0abc 10933# endif /* DEBUGGING */
1d7c1841
GS
10934
10935 /* host pointers */
10936 PL_Mem = ipM;
10937 PL_MemShared = ipMS;
10938 PL_MemParse = ipMP;
10939 PL_Env = ipE;
10940 PL_StdIO = ipStd;
10941 PL_LIO = ipLIO;
10942 PL_Dir = ipD;
10943 PL_Sock = ipS;
10944 PL_Proc = ipP;
1d7c1841
GS
10945#else /* !PERL_IMPLICIT_SYS */
10946 IV i;
64aa0685
GS
10947 CLONE_PARAMS clone_params;
10948 CLONE_PARAMS* param = &clone_params;
1d7c1841 10949 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 10950 PERL_SET_THX(my_perl);
1d7c1841 10951
d2d73c3e
AB
10952
10953
1d7c1841 10954# ifdef DEBUGGING
a4530404 10955 Poison(my_perl, 1, PerlInterpreter);
1d7c1841
GS
10956 PL_markstack = 0;
10957 PL_scopestack = 0;
10958 PL_savestack = 0;
22f7c9c9
JH
10959 PL_savestack_ix = 0;
10960 PL_savestack_max = -1;
1d7c1841 10961 PL_retstack = 0;
66fe0623 10962 PL_sig_pending = 0;
25596c82 10963 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
1d7c1841
GS
10964# else /* !DEBUGGING */
10965 Zero(my_perl, 1, PerlInterpreter);
10966# endif /* DEBUGGING */
10967#endif /* PERL_IMPLICIT_SYS */
83236556 10968 param->flags = flags;
59b40662 10969 param->proto_perl = proto_perl;
1d7c1841
GS
10970
10971 /* arena roots */
10972 PL_xiv_arenaroot = NULL;
10973 PL_xiv_root = NULL;
612f20c3 10974 PL_xnv_arenaroot = NULL;
1d7c1841 10975 PL_xnv_root = NULL;
612f20c3 10976 PL_xrv_arenaroot = NULL;
1d7c1841 10977 PL_xrv_root = NULL;
612f20c3 10978 PL_xpv_arenaroot = NULL;
1d7c1841 10979 PL_xpv_root = NULL;
612f20c3 10980 PL_xpviv_arenaroot = NULL;
1d7c1841 10981 PL_xpviv_root = NULL;
612f20c3 10982 PL_xpvnv_arenaroot = NULL;
1d7c1841 10983 PL_xpvnv_root = NULL;
612f20c3 10984 PL_xpvcv_arenaroot = NULL;
1d7c1841 10985 PL_xpvcv_root = NULL;
612f20c3 10986 PL_xpvav_arenaroot = NULL;
1d7c1841 10987 PL_xpvav_root = NULL;
612f20c3 10988 PL_xpvhv_arenaroot = NULL;
1d7c1841 10989 PL_xpvhv_root = NULL;
612f20c3 10990 PL_xpvmg_arenaroot = NULL;
1d7c1841 10991 PL_xpvmg_root = NULL;
612f20c3 10992 PL_xpvlv_arenaroot = NULL;
1d7c1841 10993 PL_xpvlv_root = NULL;
612f20c3 10994 PL_xpvbm_arenaroot = NULL;
1d7c1841 10995 PL_xpvbm_root = NULL;
612f20c3 10996 PL_he_arenaroot = NULL;
1d7c1841
GS
10997 PL_he_root = NULL;
10998 PL_nice_chunk = NULL;
10999 PL_nice_chunk_size = 0;
11000 PL_sv_count = 0;
11001 PL_sv_objcount = 0;
11002 PL_sv_root = Nullsv;
11003 PL_sv_arenaroot = Nullsv;
11004
11005 PL_debug = proto_perl->Idebug;
11006
e5dd39fc 11007#ifdef USE_REENTRANT_API
68853529
SB
11008 /* XXX: things like -Dm will segfault here in perlio, but doing
11009 * PERL_SET_CONTEXT(proto_perl);
11010 * breaks too many other things
11011 */
59bd0823 11012 Perl_reentrant_init(aTHX);
e5dd39fc
AB
11013#endif
11014
1d7c1841
GS
11015 /* create SV map for pointer relocation */
11016 PL_ptr_table = ptr_table_new();
11017
11018 /* initialize these special pointers as early as possible */
11019 SvANY(&PL_sv_undef) = NULL;
11020 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
11021 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
11022 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
11023
1d7c1841 11024 SvANY(&PL_sv_no) = new_XPVNV();
1d7c1841
GS
11025 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
11026 SvFLAGS(&PL_sv_no) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
11027 SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
11028 SvCUR(&PL_sv_no) = 0;
11029 SvLEN(&PL_sv_no) = 1;
11030 SvNVX(&PL_sv_no) = 0;
11031 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
11032
1d7c1841 11033 SvANY(&PL_sv_yes) = new_XPVNV();
1d7c1841
GS
11034 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
11035 SvFLAGS(&PL_sv_yes) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
11036 SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
11037 SvCUR(&PL_sv_yes) = 1;
11038 SvLEN(&PL_sv_yes) = 2;
11039 SvNVX(&PL_sv_yes) = 1;
11040 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
11041
05ec9bb3 11042 /* create (a non-shared!) shared string table */
1d7c1841
GS
11043 PL_strtab = newHV();
11044 HvSHAREKEYS_off(PL_strtab);
11045 hv_ksplit(PL_strtab, 512);
11046 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
11047
05ec9bb3
NIS
11048 PL_compiling = proto_perl->Icompiling;
11049
11050 /* These two PVs will be free'd special way so must set them same way op.c does */
11051 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
11052 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
11053
11054 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
11055 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
11056
1d7c1841
GS
11057 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
11058 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 11059 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 11060 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 11061 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
11062 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
11063
11064 /* pseudo environmental stuff */
11065 PL_origargc = proto_perl->Iorigargc;
e2975953 11066 PL_origargv = proto_perl->Iorigargv;
d2d73c3e 11067
d2d73c3e
AB
11068 param->stashes = newAV(); /* Setup array of objects to call clone on */
11069
a1ea730d 11070#ifdef PERLIO_LAYERS
3a1ee7e8
NIS
11071 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11072 PerlIO_clone(aTHX_ proto_perl, param);
a1ea730d 11073#endif
d2d73c3e
AB
11074
11075 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
11076 PL_incgv = gv_dup(proto_perl->Iincgv, param);
11077 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 11078 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
11079 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
11080 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
11081
11082 /* switches */
11083 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 11084 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
11085 PL_localpatches = proto_perl->Ilocalpatches;
11086 PL_splitstr = proto_perl->Isplitstr;
11087 PL_preprocess = proto_perl->Ipreprocess;
11088 PL_minus_n = proto_perl->Iminus_n;
11089 PL_minus_p = proto_perl->Iminus_p;
11090 PL_minus_l = proto_perl->Iminus_l;
11091 PL_minus_a = proto_perl->Iminus_a;
11092 PL_minus_F = proto_perl->Iminus_F;
11093 PL_doswitches = proto_perl->Idoswitches;
11094 PL_dowarn = proto_perl->Idowarn;
11095 PL_doextract = proto_perl->Idoextract;
11096 PL_sawampersand = proto_perl->Isawampersand;
11097 PL_unsafe = proto_perl->Iunsafe;
11098 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 11099 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
11100 PL_perldb = proto_perl->Iperldb;
11101 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
1cbb0781 11102 PL_exit_flags = proto_perl->Iexit_flags;
1d7c1841
GS
11103
11104 /* magical thingies */
11105 /* XXX time(&PL_basetime) when asked for? */
11106 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 11107 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
11108
11109 PL_maxsysfd = proto_perl->Imaxsysfd;
11110 PL_multiline = proto_perl->Imultiline;
11111 PL_statusvalue = proto_perl->Istatusvalue;
11112#ifdef VMS
11113 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
11114#endif
0a378802 11115 PL_encoding = sv_dup(proto_perl->Iencoding, param);
1d7c1841 11116
4a4c6fe3 11117 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
1f483ca1
JH
11118 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
11119 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
4a4c6fe3 11120
d2f185dc
AMS
11121 /* Clone the regex array */
11122 PL_regex_padav = newAV();
11123 {
11124 I32 len = av_len((AV*)proto_perl->Iregex_padav);
11125 SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
0f95fc41
AB
11126 av_push(PL_regex_padav,
11127 sv_dup_inc(regexen[0],param));
11128 for(i = 1; i <= len; i++) {
11129 if(SvREPADTMP(regexen[i])) {
11130 av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
8cf8f3d1 11131 } else {
0f95fc41
AB
11132 av_push(PL_regex_padav,
11133 SvREFCNT_inc(
8cf8f3d1 11134 newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
cbfa9890 11135 SvIVX(regexen[i])), param)))
0f95fc41
AB
11136 ));
11137 }
d2f185dc
AMS
11138 }
11139 }
11140 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 11141
1d7c1841 11142 /* shortcuts to various I/O objects */
d2d73c3e
AB
11143 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
11144 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
11145 PL_defgv = gv_dup(proto_perl->Idefgv, param);
11146 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
11147 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
11148 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
11149
11150 /* shortcuts to regexp stuff */
d2d73c3e 11151 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
11152
11153 /* shortcuts to misc objects */
d2d73c3e 11154 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
11155
11156 /* shortcuts to debugging objects */
d2d73c3e
AB
11157 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
11158 PL_DBline = gv_dup(proto_perl->IDBline, param);
11159 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
11160 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
11161 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
11162 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
06492da6 11163 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
d2d73c3e
AB
11164 PL_lineary = av_dup(proto_perl->Ilineary, param);
11165 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
11166
11167 /* symbol tables */
d2d73c3e
AB
11168 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
11169 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
d2d73c3e
AB
11170 PL_debstash = hv_dup(proto_perl->Idebstash, param);
11171 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
11172 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
11173
11174 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
ee1c5a4e 11175 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
ece599bd 11176 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
d2d73c3e
AB
11177 PL_endav = av_dup_inc(proto_perl->Iendav, param);
11178 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
11179 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
11180
11181 PL_sub_generation = proto_perl->Isub_generation;
11182
11183 /* funky return mechanisms */
11184 PL_forkprocess = proto_perl->Iforkprocess;
11185
11186 /* subprocess state */
d2d73c3e 11187 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
11188
11189 /* internal state */
11190 PL_tainting = proto_perl->Itainting;
7135f00b 11191 PL_taint_warn = proto_perl->Itaint_warn;
1d7c1841
GS
11192 PL_maxo = proto_perl->Imaxo;
11193 if (proto_perl->Iop_mask)
11194 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11195 else
11196 PL_op_mask = Nullch;
06492da6 11197 /* PL_asserting = proto_perl->Iasserting; */
1d7c1841
GS
11198
11199 /* current interpreter roots */
d2d73c3e 11200 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
11201 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
11202 PL_main_start = proto_perl->Imain_start;
e977893f 11203 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
11204 PL_eval_start = proto_perl->Ieval_start;
11205
11206 /* runtime control stuff */
11207 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
11208 PL_copline = proto_perl->Icopline;
11209
11210 PL_filemode = proto_perl->Ifilemode;
11211 PL_lastfd = proto_perl->Ilastfd;
11212 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
11213 PL_Argv = NULL;
11214 PL_Cmd = Nullch;
11215 PL_gensym = proto_perl->Igensym;
11216 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 11217 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
11218 PL_laststatval = proto_perl->Ilaststatval;
11219 PL_laststype = proto_perl->Ilaststype;
11220 PL_mess_sv = Nullsv;
11221
d2d73c3e 11222 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
11223 PL_ofmt = SAVEPV(proto_perl->Iofmt);
11224
11225 /* interpreter atexit processing */
11226 PL_exitlistlen = proto_perl->Iexitlistlen;
11227 if (PL_exitlistlen) {
11228 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11229 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11230 }
11231 else
11232 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 11233 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
19e8ce8e
AB
11234 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
11235 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1d7c1841
GS
11236
11237 PL_profiledata = NULL;
a8fc9800 11238 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
1d7c1841 11239 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 11240 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 11241
d2d73c3e 11242 PL_compcv = cv_dup(proto_perl->Icompcv, param);
dd2155a4
DM
11243
11244 PAD_CLONE_VARS(proto_perl, param);
1d7c1841
GS
11245
11246#ifdef HAVE_INTERP_INTERN
11247 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11248#endif
11249
11250 /* more statics moved here */
11251 PL_generation = proto_perl->Igeneration;
d2d73c3e 11252 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
11253
11254 PL_in_clean_objs = proto_perl->Iin_clean_objs;
11255 PL_in_clean_all = proto_perl->Iin_clean_all;
11256
11257 PL_uid = proto_perl->Iuid;
11258 PL_euid = proto_perl->Ieuid;
11259 PL_gid = proto_perl->Igid;
11260 PL_egid = proto_perl->Iegid;
11261 PL_nomemok = proto_perl->Inomemok;
11262 PL_an = proto_perl->Ian;
1d7c1841
GS
11263 PL_op_seqmax = proto_perl->Iop_seqmax;
11264 PL_evalseq = proto_perl->Ievalseq;
11265 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
11266 PL_origalen = proto_perl->Iorigalen;
11267 PL_pidstatus = newHV(); /* XXX flag for cloning? */
11268 PL_osname = SAVEPV(proto_perl->Iosname);
5c728af0 11269 PL_sh_path_compat = proto_perl->Ish_path_compat; /* XXX never deallocated */
1d7c1841
GS
11270 PL_sighandlerp = proto_perl->Isighandlerp;
11271
11272
11273 PL_runops = proto_perl->Irunops;
11274
11275 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
11276
11277#ifdef CSH
11278 PL_cshlen = proto_perl->Icshlen;
74f1b2b8 11279 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
1d7c1841
GS
11280#endif
11281
11282 PL_lex_state = proto_perl->Ilex_state;
11283 PL_lex_defer = proto_perl->Ilex_defer;
11284 PL_lex_expect = proto_perl->Ilex_expect;
11285 PL_lex_formbrack = proto_perl->Ilex_formbrack;
11286 PL_lex_dojoin = proto_perl->Ilex_dojoin;
11287 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
11288 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
11289 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
11290 PL_lex_op = proto_perl->Ilex_op;
11291 PL_lex_inpat = proto_perl->Ilex_inpat;
11292 PL_lex_inwhat = proto_perl->Ilex_inwhat;
11293 PL_lex_brackets = proto_perl->Ilex_brackets;
11294 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
11295 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
11296 PL_lex_casemods = proto_perl->Ilex_casemods;
11297 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
11298 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
11299
11300 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
11301 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
11302 PL_nexttoke = proto_perl->Inexttoke;
11303
1d773130
TB
11304 /* XXX This is probably masking the deeper issue of why
11305 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
11306 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
11307 * (A little debugging with a watchpoint on it may help.)
11308 */
389edf32
TB
11309 if (SvANY(proto_perl->Ilinestr)) {
11310 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
11311 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
11312 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11313 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
11314 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11315 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
11316 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11317 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
11318 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11319 }
11320 else {
11321 PL_linestr = NEWSV(65,79);
11322 sv_upgrade(PL_linestr,SVt_PVIV);
11323 sv_setpvn(PL_linestr,"",0);
11324 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
11325 }
1d7c1841 11326 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1d7c1841
GS
11327 PL_pending_ident = proto_perl->Ipending_ident;
11328 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
11329
11330 PL_expect = proto_perl->Iexpect;
11331
11332 PL_multi_start = proto_perl->Imulti_start;
11333 PL_multi_end = proto_perl->Imulti_end;
11334 PL_multi_open = proto_perl->Imulti_open;
11335 PL_multi_close = proto_perl->Imulti_close;
11336
11337 PL_error_count = proto_perl->Ierror_count;
11338 PL_subline = proto_perl->Isubline;
d2d73c3e 11339 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841 11340
1d773130 11341 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
389edf32
TB
11342 if (SvANY(proto_perl->Ilinestr)) {
11343 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
11344 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11345 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
11346 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11347 PL_last_lop_op = proto_perl->Ilast_lop_op;
11348 }
11349 else {
11350 PL_last_uni = SvPVX(PL_linestr);
11351 PL_last_lop = SvPVX(PL_linestr);
11352 PL_last_lop_op = 0;
11353 }
1d7c1841 11354 PL_in_my = proto_perl->Iin_my;
d2d73c3e 11355 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
11356#ifdef FCRYPT
11357 PL_cryptseen = proto_perl->Icryptseen;
11358#endif
11359
11360 PL_hints = proto_perl->Ihints;
11361
11362 PL_amagic_generation = proto_perl->Iamagic_generation;
11363
11364#ifdef USE_LOCALE_COLLATE
11365 PL_collation_ix = proto_perl->Icollation_ix;
11366 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
11367 PL_collation_standard = proto_perl->Icollation_standard;
11368 PL_collxfrm_base = proto_perl->Icollxfrm_base;
11369 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
11370#endif /* USE_LOCALE_COLLATE */
11371
11372#ifdef USE_LOCALE_NUMERIC
11373 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
11374 PL_numeric_standard = proto_perl->Inumeric_standard;
11375 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 11376 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
11377#endif /* !USE_LOCALE_NUMERIC */
11378
11379 /* utf8 character classes */
d2d73c3e
AB
11380 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
11381 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
11382 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
11383 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
11384 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
11385 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
11386 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
11387 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
11388 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
11389 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
11390 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
11391 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
11392 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
11393 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
11394 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
11395 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
11396 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
b4e400f9 11397 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
82686b01
JH
11398 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
11399 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 11400
6c3182a5 11401 /* Did the locale setup indicate UTF-8? */
9769094f 11402 PL_utf8locale = proto_perl->Iutf8locale;
6c3182a5
JH
11403 /* Unicode features (see perlrun/-C) */
11404 PL_unicode = proto_perl->Iunicode;
11405
11406 /* Pre-5.8 signals control */
11407 PL_signals = proto_perl->Isignals;
11408
11409 /* times() ticks per second */
11410 PL_clocktick = proto_perl->Iclocktick;
11411
11412 /* Recursion stopper for PerlIO_find_layer */
11413 PL_in_load_module = proto_perl->Iin_load_module;
11414
11415 /* sort() routine */
11416 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
11417
57c6e6d2
JH
11418 /* Not really needed/useful since the reenrant_retint is "volatile",
11419 * but do it for consistency's sake. */
11420 PL_reentrant_retint = proto_perl->Ireentrant_retint;
11421
15a5279a
JH
11422 /* Hooks to shared SVs and locks. */
11423 PL_sharehook = proto_perl->Isharehook;
11424 PL_lockhook = proto_perl->Ilockhook;
11425 PL_unlockhook = proto_perl->Iunlockhook;
11426 PL_threadhook = proto_perl->Ithreadhook;
11427
bce260cd
JH
11428 PL_runops_std = proto_perl->Irunops_std;
11429 PL_runops_dbg = proto_perl->Irunops_dbg;
11430
11431#ifdef THREADS_HAVE_PIDS
11432 PL_ppid = proto_perl->Ippid;
11433#endif
11434
1d7c1841
GS
11435 /* swatch cache */
11436 PL_last_swash_hv = Nullhv; /* reinits on demand */
11437 PL_last_swash_klen = 0;
11438 PL_last_swash_key[0]= '\0';
11439 PL_last_swash_tmps = (U8*)NULL;
11440 PL_last_swash_slen = 0;
11441
11442 /* perly.c globals */
11443 PL_yydebug = proto_perl->Iyydebug;
11444 PL_yynerrs = proto_perl->Iyynerrs;
11445 PL_yyerrflag = proto_perl->Iyyerrflag;
11446 PL_yychar = proto_perl->Iyychar;
11447 PL_yyval = proto_perl->Iyyval;
11448 PL_yylval = proto_perl->Iyylval;
11449
11450 PL_glob_index = proto_perl->Iglob_index;
11451 PL_srand_called = proto_perl->Isrand_called;
504f80c1 11452 PL_hash_seed = proto_perl->Ihash_seed;
008fb0c0 11453 PL_rehash_seed = proto_perl->Irehash_seed;
1d7c1841
GS
11454 PL_uudmap['M'] = 0; /* reinits on demand */
11455 PL_bitcount = Nullch; /* reinits on demand */
11456
66fe0623
NIS
11457 if (proto_perl->Ipsig_pend) {
11458 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 11459 }
66fe0623
NIS
11460 else {
11461 PL_psig_pend = (int*)NULL;
11462 }
11463
1d7c1841 11464 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
11465 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
11466 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 11467 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
11468 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
11469 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
11470 }
11471 }
11472 else {
11473 PL_psig_ptr = (SV**)NULL;
11474 PL_psig_name = (SV**)NULL;
11475 }
11476
11477 /* thrdvar.h stuff */
11478
a0739874 11479 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
11480 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
11481 PL_tmps_ix = proto_perl->Ttmps_ix;
11482 PL_tmps_max = proto_perl->Ttmps_max;
11483 PL_tmps_floor = proto_perl->Ttmps_floor;
11484 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
11485 i = 0;
11486 while (i <= PL_tmps_ix) {
d2d73c3e 11487 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
11488 ++i;
11489 }
11490
11491 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
11492 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
11493 Newz(54, PL_markstack, i, I32);
11494 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
11495 - proto_perl->Tmarkstack);
11496 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
11497 - proto_perl->Tmarkstack);
11498 Copy(proto_perl->Tmarkstack, PL_markstack,
11499 PL_markstack_ptr - PL_markstack + 1, I32);
11500
11501 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
11502 * NOTE: unlike the others! */
11503 PL_scopestack_ix = proto_perl->Tscopestack_ix;
11504 PL_scopestack_max = proto_perl->Tscopestack_max;
11505 Newz(54, PL_scopestack, PL_scopestack_max, I32);
11506 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
11507
11508 /* next push_return() sets PL_retstack[PL_retstack_ix]
11509 * NOTE: unlike the others! */
11510 PL_retstack_ix = proto_perl->Tretstack_ix;
11511 PL_retstack_max = proto_perl->Tretstack_max;
11512 Newz(54, PL_retstack, PL_retstack_max, OP*);
ce0a1ae0 11513 Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, OP*);
1d7c1841
GS
11514
11515 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 11516 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
11517
11518 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
11519 PL_curstack = av_dup(proto_perl->Tcurstack, param);
11520 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
11521
11522 /* next PUSHs() etc. set *(PL_stack_sp+1) */
11523 PL_stack_base = AvARRAY(PL_curstack);
11524 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
11525 - proto_perl->Tstack_base);
11526 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
11527
11528 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
11529 * NOTE: unlike the others! */
11530 PL_savestack_ix = proto_perl->Tsavestack_ix;
11531 PL_savestack_max = proto_perl->Tsavestack_max;
11532 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 11533 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
11534 }
11535 else {
11536 init_stacks();
985e7056 11537 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
11538 }
11539
11540 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
11541 PL_top_env = &PL_start_env;
11542
11543 PL_op = proto_perl->Top;
11544
11545 PL_Sv = Nullsv;
11546 PL_Xpv = (XPV*)NULL;
11547 PL_na = proto_perl->Tna;
11548
11549 PL_statbuf = proto_perl->Tstatbuf;
11550 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
11551 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
11552 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
11553#ifdef HAS_TIMES
11554 PL_timesbuf = proto_perl->Ttimesbuf;
11555#endif
11556
11557 PL_tainted = proto_perl->Ttainted;
11558 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
11559 PL_rs = sv_dup_inc(proto_perl->Trs, param);
11560 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
11561 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
11562 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 11563 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
11564 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
11565 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
11566 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
11567
11568 PL_restartop = proto_perl->Trestartop;
11569 PL_in_eval = proto_perl->Tin_eval;
11570 PL_delaymagic = proto_perl->Tdelaymagic;
11571 PL_dirty = proto_perl->Tdirty;
11572 PL_localizing = proto_perl->Tlocalizing;
11573
14dd3ad8 11574#ifdef PERL_FLEXIBLE_EXCEPTIONS
1d7c1841 11575 PL_protect = proto_perl->Tprotect;
14dd3ad8 11576#endif
d2d73c3e 11577 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
dd28f7bb 11578 PL_hv_fetch_ent_mh = Nullhe;
1d7c1841
GS
11579 PL_modcount = proto_perl->Tmodcount;
11580 PL_lastgotoprobe = Nullop;
11581 PL_dumpindent = proto_perl->Tdumpindent;
11582
11583 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
11584 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
11585 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
11586 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
11587 PL_sortcxix = proto_perl->Tsortcxix;
11588 PL_efloatbuf = Nullch; /* reinits on demand */
11589 PL_efloatsize = 0; /* reinits on demand */
11590
11591 /* regex stuff */
11592
11593 PL_screamfirst = NULL;
11594 PL_screamnext = NULL;
11595 PL_maxscream = -1; /* reinits on demand */
11596 PL_lastscream = Nullsv;
11597
11598 PL_watchaddr = NULL;
11599 PL_watchok = Nullch;
11600
11601 PL_regdummy = proto_perl->Tregdummy;
1d7c1841
GS
11602 PL_regprecomp = Nullch;
11603 PL_regnpar = 0;
11604 PL_regsize = 0;
1d7c1841
GS
11605 PL_colorset = 0; /* reinits PL_colors[] */
11606 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841
GS
11607 PL_reginput = Nullch;
11608 PL_regbol = Nullch;
11609 PL_regeol = Nullch;
11610 PL_regstartp = (I32*)NULL;
11611 PL_regendp = (I32*)NULL;
11612 PL_reglastparen = (U32*)NULL;
2d862feb 11613 PL_reglastcloseparen = (U32*)NULL;
1d7c1841 11614 PL_regtill = Nullch;
1d7c1841
GS
11615 PL_reg_start_tmp = (char**)NULL;
11616 PL_reg_start_tmpl = 0;
11617 PL_regdata = (struct reg_data*)NULL;
11618 PL_bostr = Nullch;
11619 PL_reg_flags = 0;
11620 PL_reg_eval_set = 0;
11621 PL_regnarrate = 0;
11622 PL_regprogram = (regnode*)NULL;
11623 PL_regindent = 0;
11624 PL_regcc = (CURCUR*)NULL;
11625 PL_reg_call_cc = (struct re_cc_state*)NULL;
11626 PL_reg_re = (regexp*)NULL;
11627 PL_reg_ganch = Nullch;
11628 PL_reg_sv = Nullsv;
53c4c00c 11629 PL_reg_match_utf8 = FALSE;
1d7c1841
GS
11630 PL_reg_magic = (MAGIC*)NULL;
11631 PL_reg_oldpos = 0;
11632 PL_reg_oldcurpm = (PMOP*)NULL;
11633 PL_reg_curpm = (PMOP*)NULL;
11634 PL_reg_oldsaved = Nullch;
11635 PL_reg_oldsavedlen = 0;
ed252734 11636#ifdef PERL_COPY_ON_WRITE
504cff3b 11637 PL_nrs = Nullsv;
ed252734 11638#endif
1d7c1841
GS
11639 PL_reg_maxiter = 0;
11640 PL_reg_leftiter = 0;
11641 PL_reg_poscache = Nullch;
11642 PL_reg_poscache_size= 0;
11643
11644 /* RE engine - function pointers */
11645 PL_regcompp = proto_perl->Tregcompp;
11646 PL_regexecp = proto_perl->Tregexecp;
11647 PL_regint_start = proto_perl->Tregint_start;
11648 PL_regint_string = proto_perl->Tregint_string;
11649 PL_regfree = proto_perl->Tregfree;
11650
11651 PL_reginterp_cnt = 0;
11652 PL_reg_starttry = 0;
11653
a2efc822
SC
11654 /* Pluggable optimizer */
11655 PL_peepp = proto_perl->Tpeepp;
11656
081fc587
AB
11657 PL_stashcache = newHV();
11658
a0739874
DM
11659 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
11660 ptr_table_free(PL_ptr_table);
11661 PL_ptr_table = NULL;
11662 }
8cf8f3d1 11663
f284b03f
AMS
11664 /* Call the ->CLONE method, if it exists, for each of the stashes
11665 identified by sv_dup() above.
11666 */
d2d73c3e
AB
11667 while(av_len(param->stashes) != -1) {
11668 HV* stash = (HV*) av_shift(param->stashes);
f284b03f
AMS
11669 GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
11670 if (cloner && GvCV(cloner)) {
11671 dSP;
11672 ENTER;
11673 SAVETMPS;
11674 PUSHMARK(SP);
dc507217 11675 XPUSHs(sv_2mortal(newSVpv(HvNAME(stash), 0)));
f284b03f
AMS
11676 PUTBACK;
11677 call_sv((SV*)GvCV(cloner), G_DISCARD);
11678 FREETMPS;
11679 LEAVE;
11680 }
4a09accc 11681 }
a0739874 11682
dc507217 11683 SvREFCNT_dec(param->stashes);
dc507217 11684
1d7c1841 11685 return my_perl;
1d7c1841
GS
11686}
11687
1d7c1841 11688#endif /* USE_ITHREADS */
a0ae6670 11689
9f4817db 11690/*
ccfc67b7
JH
11691=head1 Unicode Support
11692
9f4817db
JH
11693=for apidoc sv_recode_to_utf8
11694
5d170f3a
JH
11695The encoding is assumed to be an Encode object, on entry the PV
11696of the sv is assumed to be octets in that encoding, and the sv
11697will be converted into Unicode (and UTF-8).
9f4817db 11698
5d170f3a
JH
11699If the sv already is UTF-8 (or if it is not POK), or if the encoding
11700is not a reference, nothing is done to the sv. If the encoding is not
1768d7eb
JH
11701an C<Encode::XS> Encoding object, bad things will happen.
11702(See F<lib/encoding.pm> and L<Encode>).
9f4817db 11703
5d170f3a 11704The PV of the sv is returned.
9f4817db 11705
5d170f3a
JH
11706=cut */
11707
11708char *
11709Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
11710{
220e2d4e 11711 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
d0063567
DK
11712 SV *uni;
11713 STRLEN len;
11714 char *s;
11715 dSP;
11716 ENTER;
11717 SAVETMPS;
220e2d4e 11718 save_re_context();
d0063567
DK
11719 PUSHMARK(sp);
11720 EXTEND(SP, 3);
11721 XPUSHs(encoding);
11722 XPUSHs(sv);
f9893866
NIS
11723/*
11724 NI-S 2002/07/09
11725 Passing sv_yes is wrong - it needs to be or'ed set of constants
11726 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
11727 remove converted chars from source.
11728
11729 Both will default the value - let them.
11730
d0063567 11731 XPUSHs(&PL_sv_yes);
f9893866 11732*/
d0063567
DK
11733 PUTBACK;
11734 call_method("decode", G_SCALAR);
11735 SPAGAIN;
11736 uni = POPs;
11737 PUTBACK;
11738 s = SvPV(uni, len);
d0063567
DK
11739 if (s != SvPVX(sv)) {
11740 SvGROW(sv, len + 1);
11741 Move(s, SvPVX(sv), len, char);
11742 SvCUR_set(sv, len);
11743 SvPVX(sv)[len] = 0;
11744 }
11745 FREETMPS;
11746 LEAVE;
d0063567 11747 SvUTF8_on(sv);
f9893866
NIS
11748 }
11749 return SvPVX(sv);
9f4817db
JH
11750}
11751
220e2d4e
IH
11752/*
11753=for apidoc sv_cat_decode
11754
11755The encoding is assumed to be an Encode object, the PV of the ssv is
11756assumed to be octets in that encoding and decoding the input starts
11757from the position which (PV + *offset) pointed to. The dsv will be
11758concatenated the decoded UTF-8 string from ssv. Decoding will terminate
11759when the string tstr appears in decoding output or the input ends on
11760the PV of the ssv. The value which the offset points will be modified
11761to the last input position on the ssv.
68795e93 11762
220e2d4e
IH
11763Returns TRUE if the terminator was found, else returns FALSE.
11764
11765=cut */
11766
11767bool
11768Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
11769 SV *ssv, int *offset, char *tstr, int tlen)
11770{
a73e8557 11771 bool ret = FALSE;
220e2d4e 11772 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
220e2d4e
IH
11773 SV *offsv;
11774 dSP;
11775 ENTER;
11776 SAVETMPS;
11777 save_re_context();
11778 PUSHMARK(sp);
11779 EXTEND(SP, 6);
11780 XPUSHs(encoding);
11781 XPUSHs(dsv);
11782 XPUSHs(ssv);
11783 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
11784 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
11785 PUTBACK;
11786 call_method("cat_decode", G_SCALAR);
11787 SPAGAIN;
11788 ret = SvTRUE(TOPs);
11789 *offset = SvIV(offsv);
11790 PUTBACK;
11791 FREETMPS;
11792 LEAVE;
220e2d4e 11793 }
a73e8557
JH
11794 else
11795 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
11796 return ret;
220e2d4e 11797}
f9893866 11798