This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add the macros dAX and dITEMS to PPPort.
[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
MM
5139 if (AvFILLp(av) >= AvMAX(av)) {
5140 SV **svp = AvARRAY(av);
5141 I32 i = AvFILLp(av);
5142 while (i >= 0) {
5143 if (svp[i] == &PL_sv_undef) {
5144 svp[i] = sv; /* reuse the slot */
5145 return;
5146 }
5147 i--;
5148 }
5149 av_extend(av, AvFILLp(av)+1);
5150 }
5151 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
5152}
5153
645c22ef
DM
5154/* delete a back-reference to ourselves from the backref magic associated
5155 * with the SV we point to.
5156 */
5157
1c846c1f 5158STATIC void
cea2e8a9 5159S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
5160{
5161 AV *av;
5162 SV **svp;
5163 I32 i;
5164 SV *tsv = SvRV(sv);
c04a4dfe 5165 MAGIC *mg = NULL;
14befaf4 5166 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, PERL_MAGIC_backref)))
cea2e8a9 5167 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
5168 av = (AV *)mg->mg_obj;
5169 svp = AvARRAY(av);
5170 i = AvFILLp(av);
5171 while (i >= 0) {
5172 if (svp[i] == sv) {
5173 svp[i] = &PL_sv_undef; /* XXX */
5174 }
5175 i--;
5176 }
5177}
5178
954c1994
GS
5179/*
5180=for apidoc sv_insert
5181
5182Inserts a string at the specified offset/length within the SV. Similar to
5183the Perl substr() function.
5184
5185=cut
5186*/
5187
79072805 5188void
864dbfa3 5189Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
79072805
LW
5190{
5191 register char *big;
5192 register char *mid;
5193 register char *midend;
5194 register char *bigend;
5195 register I32 i;
6ff81951 5196 STRLEN curlen;
1c846c1f 5197
79072805 5198
8990e307 5199 if (!bigstr)
cea2e8a9 5200 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 5201 SvPV_force(bigstr, curlen);
60fa28ff 5202 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
5203 if (offset + len > curlen) {
5204 SvGROW(bigstr, offset+len+1);
5205 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
5206 SvCUR_set(bigstr, offset+len);
5207 }
79072805 5208
69b47968 5209 SvTAINT(bigstr);
79072805
LW
5210 i = littlelen - len;
5211 if (i > 0) { /* string might grow */
a0d0e21e 5212 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
5213 mid = big + offset + len;
5214 midend = bigend = big + SvCUR(bigstr);
5215 bigend += i;
5216 *bigend = '\0';
5217 while (midend > mid) /* shove everything down */
5218 *--bigend = *--midend;
5219 Move(little,big+offset,littlelen,char);
5220 SvCUR(bigstr) += i;
5221 SvSETMAGIC(bigstr);
5222 return;
5223 }
5224 else if (i == 0) {
463ee0b2 5225 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
5226 SvSETMAGIC(bigstr);
5227 return;
5228 }
5229
463ee0b2 5230 big = SvPVX(bigstr);
79072805
LW
5231 mid = big + offset;
5232 midend = mid + len;
5233 bigend = big + SvCUR(bigstr);
5234
5235 if (midend > bigend)
cea2e8a9 5236 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5237
5238 if (mid - big > bigend - midend) { /* faster to shorten from end */
5239 if (littlelen) {
5240 Move(little, mid, littlelen,char);
5241 mid += littlelen;
5242 }
5243 i = bigend - midend;
5244 if (i > 0) {
5245 Move(midend, mid, i,char);
5246 mid += i;
5247 }
5248 *mid = '\0';
5249 SvCUR_set(bigstr, mid - big);
5250 }
5251 /*SUPPRESS 560*/
155aba94 5252 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5253 midend -= littlelen;
5254 mid = midend;
5255 sv_chop(bigstr,midend-i);
5256 big += i;
5257 while (i--)
5258 *--midend = *--big;
5259 if (littlelen)
5260 Move(little, mid, littlelen,char);
5261 }
5262 else if (littlelen) {
5263 midend -= littlelen;
5264 sv_chop(bigstr,midend);
5265 Move(little,midend,littlelen,char);
5266 }
5267 else {
5268 sv_chop(bigstr,midend);
5269 }
5270 SvSETMAGIC(bigstr);
5271}
5272
c461cf8f
JH
5273/*
5274=for apidoc sv_replace
5275
5276Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5277The target SV physically takes over ownership of the body of the source SV
5278and inherits its flags; however, the target keeps any magic it owns,
5279and any magic in the source is discarded.
ff276b08 5280Note that this is a rather specialist SV copying operation; most of the
645c22ef 5281time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5282
5283=cut
5284*/
79072805
LW
5285
5286void
864dbfa3 5287Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805
LW
5288{
5289 U32 refcnt = SvREFCNT(sv);
765f542d 5290 SV_CHECK_THINKFIRST_COW_DROP(sv);
0453d815 5291 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
9014280d 5292 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
93a17b20 5293 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5294 if (SvMAGICAL(nsv))
5295 mg_free(nsv);
5296 else
5297 sv_upgrade(nsv, SVt_PVMG);
93a17b20 5298 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 5299 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
5300 SvMAGICAL_off(sv);
5301 SvMAGIC(sv) = 0;
5302 }
79072805
LW
5303 SvREFCNT(sv) = 0;
5304 sv_clear(sv);
477f5d66 5305 assert(!SvREFCNT(sv));
79072805 5306 StructCopy(nsv,sv,SV);
d3d0e6f1
NC
5307#ifdef PERL_COPY_ON_WRITE
5308 if (SvIsCOW_normal(nsv)) {
5309 /* We need to follow the pointers around the loop to make the
5310 previous SV point to sv, rather than nsv. */
5311 SV *next;
5312 SV *current = nsv;
5313 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5314 assert(next);
5315 current = next;
5316 assert(SvPVX(current) == SvPVX(nsv));
5317 }
5318 /* Make the SV before us point to the SV after us. */
5319 if (DEBUG_C_TEST) {
5320 PerlIO_printf(Perl_debug_log, "previous is\n");
5321 sv_dump(current);
a29f6d03
NC
5322 PerlIO_printf(Perl_debug_log,
5323 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5324 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5325 }
a29f6d03 5326 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5327 }
5328#endif
79072805 5329 SvREFCNT(sv) = refcnt;
1edc1566 5330 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 5331 SvREFCNT(nsv) = 0;
463ee0b2 5332 del_SV(nsv);
79072805
LW
5333}
5334
c461cf8f
JH
5335/*
5336=for apidoc sv_clear
5337
645c22ef
DM
5338Clear an SV: call any destructors, free up any memory used by the body,
5339and free the body itself. The SV's head is I<not> freed, although
5340its type is set to all 1's so that it won't inadvertently be assumed
5341to be live during global destruction etc.
5342This function should only be called when REFCNT is zero. Most of the time
5343you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5344instead.
c461cf8f
JH
5345
5346=cut
5347*/
5348
79072805 5349void
864dbfa3 5350Perl_sv_clear(pTHX_ register SV *sv)
79072805 5351{
ec12f114 5352 HV* stash;
79072805
LW
5353 assert(sv);
5354 assert(SvREFCNT(sv) == 0);
5355
ed6116ce 5356 if (SvOBJECT(sv)) {
3280af22 5357 if (PL_defstash) { /* Still have a symbol table? */
39644a26 5358 dSP;
32251b26 5359 CV* destructor;
a0d0e21e 5360
5cc433a6 5361
8ebc5c01 5362
d460ef45 5363 do {
4e8e7886 5364 stash = SvSTASH(sv);
32251b26 5365 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 5366 if (destructor) {
5cc433a6
AB
5367 SV* tmpref = newRV(sv);
5368 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 5369 ENTER;
e788e7d3 5370 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
5371 EXTEND(SP, 2);
5372 PUSHMARK(SP);
5cc433a6 5373 PUSHs(tmpref);
4e8e7886 5374 PUTBACK;
44389ee9 5375 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
5cc433a6
AB
5376
5377
d3acc0f7 5378 POPSTACK;
3095d977 5379 SPAGAIN;
4e8e7886 5380 LEAVE;
5cc433a6
AB
5381 if(SvREFCNT(tmpref) < 2) {
5382 /* tmpref is not kept alive! */
5383 SvREFCNT(sv)--;
5384 SvRV(tmpref) = 0;
5385 SvROK_off(tmpref);
5386 }
5387 SvREFCNT_dec(tmpref);
4e8e7886
GS
5388 }
5389 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5390
6f44e0a4
JP
5391
5392 if (SvREFCNT(sv)) {
5393 if (PL_in_clean_objs)
cea2e8a9 5394 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
6f44e0a4
JP
5395 HvNAME(stash));
5396 /* DESTROY gave object new lease on life */
5397 return;
5398 }
a0d0e21e 5399 }
4e8e7886 5400
a0d0e21e 5401 if (SvOBJECT(sv)) {
4e8e7886 5402 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
5403 SvOBJECT_off(sv); /* Curse the object. */
5404 if (SvTYPE(sv) != SVt_PVIO)
3280af22 5405 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5406 }
463ee0b2 5407 }
524189f1
JH
5408 if (SvTYPE(sv) >= SVt_PVMG) {
5409 if (SvMAGIC(sv))
5410 mg_free(sv);
5411 if (SvFLAGS(sv) & SVpad_TYPED)
5412 SvREFCNT_dec(SvSTASH(sv));
5413 }
ec12f114 5414 stash = NULL;
79072805 5415 switch (SvTYPE(sv)) {
8990e307 5416 case SVt_PVIO:
df0bd2f4
GS
5417 if (IoIFP(sv) &&
5418 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5419 IoIFP(sv) != PerlIO_stdout() &&
5420 IoIFP(sv) != PerlIO_stderr())
93578b34 5421 {
f2b5be74 5422 io_close((IO*)sv, FALSE);
93578b34 5423 }
1d7c1841 5424 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5425 PerlDir_close(IoDIRP(sv));
1d7c1841 5426 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5427 Safefree(IoTOP_NAME(sv));
5428 Safefree(IoFMT_NAME(sv));
5429 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 5430 /* FALL THROUGH */
79072805 5431 case SVt_PVBM:
a0d0e21e 5432 goto freescalar;
79072805 5433 case SVt_PVCV:
748a9306 5434 case SVt_PVFM:
85e6fe83 5435 cv_undef((CV*)sv);
a0d0e21e 5436 goto freescalar;
79072805 5437 case SVt_PVHV:
85e6fe83 5438 hv_undef((HV*)sv);
a0d0e21e 5439 break;
79072805 5440 case SVt_PVAV:
85e6fe83 5441 av_undef((AV*)sv);
a0d0e21e 5442 break;
02270b4e 5443 case SVt_PVLV:
dd28f7bb
DM
5444 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5445 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5446 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5447 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5448 }
5449 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
5450 SvREFCNT_dec(LvTARG(sv));
02270b4e 5451 goto freescalar;
a0d0e21e 5452 case SVt_PVGV:
1edc1566 5453 gp_free((GV*)sv);
a0d0e21e 5454 Safefree(GvNAME(sv));
ec12f114
JPC
5455 /* cannot decrease stash refcount yet, as we might recursively delete
5456 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
5457 of stash until current sv is completely gone.
5458 -- JohnPC, 27 Mar 1998 */
5459 stash = GvSTASH(sv);
a0d0e21e 5460 /* FALL THROUGH */
79072805 5461 case SVt_PVMG:
79072805
LW
5462 case SVt_PVNV:
5463 case SVt_PVIV:
a0d0e21e
LW
5464 freescalar:
5465 (void)SvOOK_off(sv);
79072805
LW
5466 /* FALL THROUGH */
5467 case SVt_PV:
a0d0e21e 5468 case SVt_RV:
810b8aa5
GS
5469 if (SvROK(sv)) {
5470 if (SvWEAKREF(sv))
5471 sv_del_backref(sv);
5472 else
5473 SvREFCNT_dec(SvRV(sv));
5474 }
765f542d
NC
5475#ifdef PERL_COPY_ON_WRITE
5476 else if (SvPVX(sv)) {
5477 if (SvIsCOW(sv)) {
5478 /* I believe I need to grab the global SV mutex here and
5479 then recheck the COW status. */
46187eeb
NC
5480 if (DEBUG_C_TEST) {
5481 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5482 sv_dump(sv);
46187eeb 5483 }
e419cbc5 5484 sv_release_COW(sv, SvPVX(sv), SvCUR(sv), SvLEN(sv),
765f542d
NC
5485 SvUVX(sv), SV_COW_NEXT_SV(sv));
5486 /* And drop it here. */
5487 SvFAKE_off(sv);
5488 } else if (SvLEN(sv)) {
5489 Safefree(SvPVX(sv));
5490 }
5491 }
5492#else
1edc1566 5493 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 5494 Safefree(SvPVX(sv));
1c846c1f 5495 else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
25716404
GS
5496 unsharepvn(SvPVX(sv),
5497 SvUTF8(sv) ? -(I32)SvCUR(sv) : SvCUR(sv),
5498 SvUVX(sv));
1c846c1f
NIS
5499 SvFAKE_off(sv);
5500 }
765f542d 5501#endif
79072805 5502 break;
a0d0e21e 5503/*
79072805 5504 case SVt_NV:
79072805 5505 case SVt_IV:
79072805
LW
5506 case SVt_NULL:
5507 break;
a0d0e21e 5508*/
79072805
LW
5509 }
5510
5511 switch (SvTYPE(sv)) {
5512 case SVt_NULL:
5513 break;
79072805
LW
5514 case SVt_IV:
5515 del_XIV(SvANY(sv));
5516 break;
5517 case SVt_NV:
5518 del_XNV(SvANY(sv));
5519 break;
ed6116ce
LW
5520 case SVt_RV:
5521 del_XRV(SvANY(sv));
5522 break;
79072805
LW
5523 case SVt_PV:
5524 del_XPV(SvANY(sv));
5525 break;
5526 case SVt_PVIV:
5527 del_XPVIV(SvANY(sv));
5528 break;
5529 case SVt_PVNV:
5530 del_XPVNV(SvANY(sv));
5531 break;
5532 case SVt_PVMG:
5533 del_XPVMG(SvANY(sv));
5534 break;
5535 case SVt_PVLV:
5536 del_XPVLV(SvANY(sv));
5537 break;
5538 case SVt_PVAV:
5539 del_XPVAV(SvANY(sv));
5540 break;
5541 case SVt_PVHV:
5542 del_XPVHV(SvANY(sv));
5543 break;
5544 case SVt_PVCV:
5545 del_XPVCV(SvANY(sv));
5546 break;
5547 case SVt_PVGV:
5548 del_XPVGV(SvANY(sv));
ec12f114
JPC
5549 /* code duplication for increased performance. */
5550 SvFLAGS(sv) &= SVf_BREAK;
5551 SvFLAGS(sv) |= SVTYPEMASK;
5552 /* decrease refcount of the stash that owns this GV, if any */
5553 if (stash)
5554 SvREFCNT_dec(stash);
5555 return; /* not break, SvFLAGS reset already happened */
79072805
LW
5556 case SVt_PVBM:
5557 del_XPVBM(SvANY(sv));
5558 break;
5559 case SVt_PVFM:
5560 del_XPVFM(SvANY(sv));
5561 break;
8990e307
LW
5562 case SVt_PVIO:
5563 del_XPVIO(SvANY(sv));
5564 break;
79072805 5565 }
a0d0e21e 5566 SvFLAGS(sv) &= SVf_BREAK;
8990e307 5567 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
5568}
5569
645c22ef
DM
5570/*
5571=for apidoc sv_newref
5572
5573Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5574instead.
5575
5576=cut
5577*/
5578
79072805 5579SV *
864dbfa3 5580Perl_sv_newref(pTHX_ SV *sv)
79072805 5581{
463ee0b2 5582 if (sv)
4db098f4 5583 (SvREFCNT(sv))++;
79072805
LW
5584 return sv;
5585}
5586
c461cf8f
JH
5587/*
5588=for apidoc sv_free
5589
645c22ef
DM
5590Decrement an SV's reference count, and if it drops to zero, call
5591C<sv_clear> to invoke destructors and free up any memory used by
5592the body; finally, deallocate the SV's head itself.
5593Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5594
5595=cut
5596*/
5597
79072805 5598void
864dbfa3 5599Perl_sv_free(pTHX_ SV *sv)
79072805
LW
5600{
5601 if (!sv)
5602 return;
a0d0e21e
LW
5603 if (SvREFCNT(sv) == 0) {
5604 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5605 /* this SV's refcnt has been artificially decremented to
5606 * trigger cleanup */
a0d0e21e 5607 return;
3280af22 5608 if (PL_in_clean_all) /* All is fair */
1edc1566 5609 return;
d689ffdd
JP
5610 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5611 /* make sure SvREFCNT(sv)==0 happens very seldom */
5612 SvREFCNT(sv) = (~(U32)0)/2;
5613 return;
5614 }
0453d815 5615 if (ckWARN_d(WARN_INTERNAL))
d5dede04 5616 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
f386e492 5617 "Attempt to free unreferenced scalar: SV 0x%"UVxf,
d5dede04 5618 PTR2UV(sv));
79072805
LW
5619 return;
5620 }
4db098f4 5621 if (--(SvREFCNT(sv)) > 0)
8990e307 5622 return;
8c4d3c90
NC
5623 Perl_sv_free2(aTHX_ sv);
5624}
5625
5626void
5627Perl_sv_free2(pTHX_ SV *sv)
5628{
463ee0b2
LW
5629#ifdef DEBUGGING
5630 if (SvTEMP(sv)) {
0453d815 5631 if (ckWARN_d(WARN_DEBUGGING))
9014280d 5632 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
1d7c1841
GS
5633 "Attempt to free temp prematurely: SV 0x%"UVxf,
5634 PTR2UV(sv));
79072805 5635 return;
79072805 5636 }
463ee0b2 5637#endif
d689ffdd
JP
5638 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5639 /* make sure SvREFCNT(sv)==0 happens very seldom */
5640 SvREFCNT(sv) = (~(U32)0)/2;
5641 return;
5642 }
79072805 5643 sv_clear(sv);
477f5d66
CS
5644 if (! SvREFCNT(sv))
5645 del_SV(sv);
79072805
LW
5646}
5647
954c1994
GS
5648/*
5649=for apidoc sv_len
5650
645c22ef
DM
5651Returns the length of the string in the SV. Handles magic and type
5652coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5653
5654=cut
5655*/
5656
79072805 5657STRLEN
864dbfa3 5658Perl_sv_len(pTHX_ register SV *sv)
79072805 5659{
463ee0b2 5660 STRLEN len;
79072805
LW
5661
5662 if (!sv)
5663 return 0;
5664
8990e307 5665 if (SvGMAGICAL(sv))
565764a8 5666 len = mg_length(sv);
8990e307 5667 else
497b47a8 5668 (void)SvPV(sv, len);
463ee0b2 5669 return len;
79072805
LW
5670}
5671
c461cf8f
JH
5672/*
5673=for apidoc sv_len_utf8
5674
5675Returns the number of characters in the string in an SV, counting wide
1e54db1a 5676UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5677
5678=cut
5679*/
5680
7e8c5dac
HS
5681/*
5682 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
5683 * mg_ptr is used, by sv_pos_u2b(), see the comments of S_utf8_mg_pos_init().
5684 * (Note that the mg_len is not the length of the mg_ptr field.)
5685 *
5686 */
5687
a0ed51b3 5688STRLEN
864dbfa3 5689Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 5690{
a0ed51b3
LW
5691 if (!sv)
5692 return 0;
5693
a0ed51b3 5694 if (SvGMAGICAL(sv))
b76347f2 5695 return mg_length(sv);
a0ed51b3 5696 else
b76347f2 5697 {
7e8c5dac 5698 STRLEN len, ulen;
b76347f2 5699 U8 *s = (U8*)SvPV(sv, len);
7e8c5dac
HS
5700 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
5701
e23c8137 5702 if (mg && mg->mg_len != -1 && (mg->mg_len > 0 || len == 0)) {
7e8c5dac 5703 ulen = mg->mg_len;
e23c8137
JH
5704#ifdef PERL_UTF8_CACHE_ASSERT
5705 assert(ulen == Perl_utf8_length(aTHX_ s, s + len));
5706#endif
5707 }
7e8c5dac
HS
5708 else {
5709 ulen = Perl_utf8_length(aTHX_ s, s + len);
5710 if (!mg && !SvREADONLY(sv)) {
5711 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
5712 mg = mg_find(sv, PERL_MAGIC_utf8);
5713 assert(mg);
5714 }
5715 if (mg)
5716 mg->mg_len = ulen;
5717 }
5718 return ulen;
5719 }
5720}
5721
5722/* S_utf8_mg_pos_init() is used to initialize the mg_ptr field of
5723 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5724 * between UTF-8 and byte offsets. There are two (substr offset and substr
5725 * length, the i offset, PERL_MAGIC_UTF8_CACHESIZE) times two (UTF-8 offset
5726 * and byte offset) cache positions.
5727 *
5728 * The mg_len field is used by sv_len_utf8(), see its comments.
5729 * Note that the mg_len is not the length of the mg_ptr field.
5730 *
5731 */
5732STATIC bool
6e551876 5733S_utf8_mg_pos_init(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, U8 *s, U8 *start)
7e8c5dac
HS
5734{
5735 bool found = FALSE;
5736
5737 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
8f78557a
AE
5738 if (!*mgp)
5739 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, &PL_vtbl_utf8, 0, 0);
7e8c5dac 5740 assert(*mgp);
b76347f2 5741
7e8c5dac
HS
5742 if ((*mgp)->mg_ptr)
5743 *cachep = (STRLEN *) (*mgp)->mg_ptr;
5744 else {
5745 Newz(0, *cachep, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
5746 (*mgp)->mg_ptr = (char *) *cachep;
5747 }
5748 assert(*cachep);
5749
5750 (*cachep)[i] = *offsetp;
5751 (*cachep)[i+1] = s - start;
5752 found = TRUE;
a0ed51b3 5753 }
7e8c5dac
HS
5754
5755 return found;
a0ed51b3
LW
5756}
5757
645c22ef 5758/*
7e8c5dac
HS
5759 * S_utf8_mg_pos() is used to query and update mg_ptr field of
5760 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5761 * between UTF-8 and byte offsets. See also the comments of
5762 * S_utf8_mg_pos_init().
5763 *
5764 */
5765STATIC bool
6e551876 5766S_utf8_mg_pos(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, I32 uoff, U8 **sp, U8 *start, U8 *send)
7e8c5dac
HS
5767{
5768 bool found = FALSE;
5769
5770 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
5771 if (!*mgp)
5772 *mgp = mg_find(sv, PERL_MAGIC_utf8);
5773 if (*mgp && (*mgp)->mg_ptr) {
5774 *cachep = (STRLEN *) (*mgp)->mg_ptr;
e23c8137 5775 ASSERT_UTF8_CACHE(*cachep);
667208dd 5776 if ((*cachep)[i] == (STRLEN)uoff) /* An exact match. */
e23c8137 5777 found = TRUE;
7e8c5dac
HS
5778 else { /* We will skip to the right spot. */
5779 STRLEN forw = 0;
5780 STRLEN backw = 0;
5781 U8* p = NULL;
5782
5783 /* The assumption is that going backward is half
5784 * the speed of going forward (that's where the
5785 * 2 * backw in the below comes from). (The real
5786 * figure of course depends on the UTF-8 data.) */
5787
667208dd 5788 if ((*cachep)[i] > (STRLEN)uoff) {
7e8c5dac 5789 forw = uoff;
667208dd 5790 backw = (*cachep)[i] - (STRLEN)uoff;
7e8c5dac
HS
5791
5792 if (forw < 2 * backw)
5793 p = start;
5794 else
5795 p = start + (*cachep)[i+1];
5796 }
5797 /* Try this only for the substr offset (i == 0),
5798 * not for the substr length (i == 2). */
5799 else if (i == 0) { /* (*cachep)[i] < uoff */
5800 STRLEN ulen = sv_len_utf8(sv);
5801
667208dd
JH
5802 if ((STRLEN)uoff < ulen) {
5803 forw = (STRLEN)uoff - (*cachep)[i];
5804 backw = ulen - (STRLEN)uoff;
7e8c5dac
HS
5805
5806 if (forw < 2 * backw)
5807 p = start + (*cachep)[i+1];
5808 else
5809 p = send;
5810 }
5811
5812 /* If the string is not long enough for uoff,
5813 * we could extend it, but not at this low a level. */
5814 }
5815
5816 if (p) {
5817 if (forw < 2 * backw) {
5818 while (forw--)
5819 p += UTF8SKIP(p);
5820 }
5821 else {
5822 while (backw--) {
5823 p--;
5824 while (UTF8_IS_CONTINUATION(*p))
5825 p--;
5826 }
5827 }
5828
5829 /* Update the cache. */
667208dd 5830 (*cachep)[i] = (STRLEN)uoff;
7e8c5dac 5831 (*cachep)[i+1] = p - start;
8f78557a
AE
5832
5833 /* Drop the stale "length" cache */
5834 if (i == 0) {
5835 (*cachep)[2] = 0;
5836 (*cachep)[3] = 0;
5837 }
7e8c5dac
HS
5838
5839 found = TRUE;
5840 }
5841 }
5842 if (found) { /* Setup the return values. */
5843 *offsetp = (*cachep)[i+1];
5844 *sp = start + *offsetp;
5845 if (*sp >= send) {
5846 *sp = send;
5847 *offsetp = send - start;
5848 }
5849 else if (*sp < start) {
5850 *sp = start;
5851 *offsetp = 0;
5852 }
5853 }
5854 }
e23c8137
JH
5855#ifdef PERL_UTF8_CACHE_ASSERT
5856 if (found) {
5857 U8 *s = start;
5858 I32 n = uoff;
5859
5860 while (n-- && s < send)
5861 s += UTF8SKIP(s);
5862
5863 if (i == 0) {
5864 assert(*offsetp == s - start);
5865 assert((*cachep)[0] == (STRLEN)uoff);
5866 assert((*cachep)[1] == *offsetp);
5867 }
5868 ASSERT_UTF8_CACHE(*cachep);
5869 }
5870#endif
7e8c5dac 5871 }
e23c8137 5872
7e8c5dac
HS
5873 return found;
5874}
5875
5876/*
645c22ef
DM
5877=for apidoc sv_pos_u2b
5878
1e54db1a 5879Converts the value pointed to by offsetp from a count of UTF-8 chars from
645c22ef
DM
5880the start of the string, to a count of the equivalent number of bytes; if
5881lenp is non-zero, it does the same to lenp, but this time starting from
5882the offset, rather than from the start of the string. Handles magic and
5883type coercion.
5884
5885=cut
5886*/
5887
7e8c5dac
HS
5888/*
5889 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
5890 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5891 * byte offsets. See also the comments of S_utf8_mg_pos().
5892 *
5893 */
5894
a0ed51b3 5895void
864dbfa3 5896Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 5897{
dfe13c55
GS
5898 U8 *start;
5899 U8 *s;
a0ed51b3 5900 STRLEN len;
7e8c5dac
HS
5901 STRLEN *cache = 0;
5902 STRLEN boffset = 0;
a0ed51b3
LW
5903
5904 if (!sv)
5905 return;
5906
dfe13c55 5907 start = s = (U8*)SvPV(sv, len);
7e8c5dac
HS
5908 if (len) {
5909 I32 uoffset = *offsetp;
5910 U8 *send = s + len;
5911 MAGIC *mg = 0;
5912 bool found = FALSE;
5913
bdf77a2a 5914 if (utf8_mg_pos(sv, &mg, &cache, 0, offsetp, *offsetp, &s, start, send))
7e8c5dac
HS
5915 found = TRUE;
5916 if (!found && uoffset > 0) {
5917 while (s < send && uoffset--)
5918 s += UTF8SKIP(s);
5919 if (s >= send)
5920 s = send;
bdf77a2a 5921 if (utf8_mg_pos_init(sv, &mg, &cache, 0, offsetp, s, start))
7e8c5dac
HS
5922 boffset = cache[1];
5923 *offsetp = s - start;
5924 }
5925 if (lenp) {
5926 found = FALSE;
5927 start = s;
bdf77a2a 5928 if (utf8_mg_pos(sv, &mg, &cache, 2, lenp, *lenp + *offsetp, &s, start, send)) {
7e8c5dac
HS
5929 *lenp -= boffset;
5930 found = TRUE;
5931 }
5932 if (!found && *lenp > 0) {
5933 I32 ulen = *lenp;
5934 if (ulen > 0)
5935 while (s < send && ulen--)
5936 s += UTF8SKIP(s);
5937 if (s >= send)
5938 s = send;
bdf77a2a 5939 if (utf8_mg_pos_init(sv, &mg, &cache, 2, lenp, s, start))
7e8c5dac
HS
5940 cache[2] += *offsetp;
5941 }
5942 *lenp = s - start;
5943 }
e23c8137 5944 ASSERT_UTF8_CACHE(cache);
7e8c5dac
HS
5945 }
5946 else {
5947 *offsetp = 0;
5948 if (lenp)
5949 *lenp = 0;
a0ed51b3 5950 }
e23c8137 5951
a0ed51b3
LW
5952 return;
5953}
5954
645c22ef
DM
5955/*
5956=for apidoc sv_pos_b2u
5957
5958Converts the value pointed to by offsetp from a count of bytes from the
1e54db1a 5959start of the string, to a count of the equivalent number of UTF-8 chars.
645c22ef
DM
5960Handles magic and type coercion.
5961
5962=cut
5963*/
5964
7e8c5dac
HS
5965/*
5966 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
5967 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5968 * byte offsets. See also the comments of S_utf8_mg_pos().
5969 *
5970 */
5971
a0ed51b3 5972void
7e8c5dac 5973Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 5974{
7e8c5dac 5975 U8* s;
a0ed51b3
LW
5976 STRLEN len;
5977
5978 if (!sv)
5979 return;
5980
dfe13c55 5981 s = (U8*)SvPV(sv, len);
eb160463 5982 if ((I32)len < *offsetp)
a0dbb045 5983 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac
HS
5984 else {
5985 U8* send = s + *offsetp;
5986 MAGIC* mg = NULL;
5987 STRLEN *cache = NULL;
5988
5989 len = 0;
5990
5991 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
5992 mg = mg_find(sv, PERL_MAGIC_utf8);
5993 if (mg && mg->mg_ptr) {
5994 cache = (STRLEN *) mg->mg_ptr;
c5661c80 5995 if (cache[1] == (STRLEN)*offsetp) {
7e8c5dac
HS
5996 /* An exact match. */
5997 *offsetp = cache[0];
5998
5999 return;
6000 }
c5661c80 6001 else if (cache[1] < (STRLEN)*offsetp) {
7e8c5dac
HS
6002 /* We already know part of the way. */
6003 len = cache[0];
6004 s += cache[1];
6005 /* Let the below loop do the rest. */
6006 }
6007 else { /* cache[1] > *offsetp */
6008 /* We already know all of the way, now we may
6009 * be able to walk back. The same assumption
6010 * is made as in S_utf8_mg_pos(), namely that
6011 * walking backward is twice slower than
6012 * walking forward. */
6013 STRLEN forw = *offsetp;
6014 STRLEN backw = cache[1] - *offsetp;
6015
6016 if (!(forw < 2 * backw)) {
6017 U8 *p = s + cache[1];
6018 STRLEN ubackw = 0;
6019
a5b510f2
AE
6020 cache[1] -= backw;
6021
7e8c5dac
HS
6022 while (backw--) {
6023 p--;
0aeb64d0 6024 while (UTF8_IS_CONTINUATION(*p)) {
7e8c5dac 6025 p--;
0aeb64d0
JH
6026 backw--;
6027 }
7e8c5dac
HS
6028 ubackw++;
6029 }
6030
6031 cache[0] -= ubackw;
0aeb64d0
JH
6032 *offsetp = cache[0];
6033 return;
7e8c5dac
HS
6034 }
6035 }
6036 }
e23c8137 6037 ASSERT_UTF8_CACHE(cache);
a0dbb045 6038 }
7e8c5dac
HS
6039
6040 while (s < send) {
6041 STRLEN n = 1;
6042
6043 /* Call utf8n_to_uvchr() to validate the sequence
6044 * (unless a simple non-UTF character) */
6045 if (!UTF8_IS_INVARIANT(*s))
6046 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
6047 if (n > 0) {
6048 s += n;
6049 len++;
6050 }
6051 else
6052 break;
6053 }
6054
6055 if (!SvREADONLY(sv)) {
6056 if (!mg) {
6057 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
6058 mg = mg_find(sv, PERL_MAGIC_utf8);
6059 }
6060 assert(mg);
6061
6062 if (!mg->mg_ptr) {
979acdb5 6063 Newz(0, cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7e8c5dac
HS
6064 mg->mg_ptr = (char *) cache;
6065 }
6066 assert(cache);
6067
6068 cache[0] = len;
6069 cache[1] = *offsetp;
6070 }
6071
6072 *offsetp = len;
a0ed51b3 6073 }
a0ed51b3
LW
6074 return;
6075}
6076
954c1994
GS
6077/*
6078=for apidoc sv_eq
6079
6080Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
6081identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6082coerce its args to strings if necessary.
954c1994
GS
6083
6084=cut
6085*/
6086
79072805 6087I32
e01b9e88 6088Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805
LW
6089{
6090 char *pv1;
463ee0b2 6091 STRLEN cur1;
79072805 6092 char *pv2;
463ee0b2 6093 STRLEN cur2;
e01b9e88 6094 I32 eq = 0;
553e1bcc
AT
6095 char *tpv = Nullch;
6096 SV* svrecode = Nullsv;
79072805 6097
e01b9e88 6098 if (!sv1) {
79072805
LW
6099 pv1 = "";
6100 cur1 = 0;
6101 }
463ee0b2 6102 else
e01b9e88 6103 pv1 = SvPV(sv1, cur1);
79072805 6104
e01b9e88
SC
6105 if (!sv2){
6106 pv2 = "";
6107 cur2 = 0;
92d29cee 6108 }
e01b9e88
SC
6109 else
6110 pv2 = SvPV(sv2, cur2);
79072805 6111
cf48d248 6112 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6113 /* Differing utf8ness.
6114 * Do not UTF8size the comparands as a side-effect. */
6115 if (PL_encoding) {
6116 if (SvUTF8(sv1)) {
553e1bcc
AT
6117 svrecode = newSVpvn(pv2, cur2);
6118 sv_recode_to_utf8(svrecode, PL_encoding);
6119 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6120 }
6121 else {
553e1bcc
AT
6122 svrecode = newSVpvn(pv1, cur1);
6123 sv_recode_to_utf8(svrecode, PL_encoding);
6124 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6125 }
6126 /* Now both are in UTF-8. */
6127 if (cur1 != cur2)
6128 return FALSE;
6129 }
6130 else {
6131 bool is_utf8 = TRUE;
6132
6133 if (SvUTF8(sv1)) {
6134 /* sv1 is the UTF-8 one,
6135 * if is equal it must be downgrade-able */
6136 char *pv = (char*)bytes_from_utf8((U8*)pv1,
6137 &cur1, &is_utf8);
6138 if (pv != pv1)
553e1bcc 6139 pv1 = tpv = pv;
799ef3cb
JH
6140 }
6141 else {
6142 /* sv2 is the UTF-8 one,
6143 * if is equal it must be downgrade-able */
6144 char *pv = (char *)bytes_from_utf8((U8*)pv2,
6145 &cur2, &is_utf8);
6146 if (pv != pv2)
553e1bcc 6147 pv2 = tpv = pv;
799ef3cb
JH
6148 }
6149 if (is_utf8) {
6150 /* Downgrade not possible - cannot be eq */
6151 return FALSE;
6152 }
6153 }
cf48d248
JH
6154 }
6155
6156 if (cur1 == cur2)
765f542d 6157 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 6158
553e1bcc
AT
6159 if (svrecode)
6160 SvREFCNT_dec(svrecode);
799ef3cb 6161
553e1bcc
AT
6162 if (tpv)
6163 Safefree(tpv);
cf48d248 6164
e01b9e88 6165 return eq;
79072805
LW
6166}
6167
954c1994
GS
6168/*
6169=for apidoc sv_cmp
6170
6171Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
6172string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
6173C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6174coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
6175
6176=cut
6177*/
6178
79072805 6179I32
e01b9e88 6180Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 6181{
560a288e 6182 STRLEN cur1, cur2;
553e1bcc 6183 char *pv1, *pv2, *tpv = Nullch;
cf48d248 6184 I32 cmp;
553e1bcc 6185 SV *svrecode = Nullsv;
560a288e 6186
e01b9e88
SC
6187 if (!sv1) {
6188 pv1 = "";
560a288e
GS
6189 cur1 = 0;
6190 }
e01b9e88
SC
6191 else
6192 pv1 = SvPV(sv1, cur1);
560a288e 6193
553e1bcc 6194 if (!sv2) {
e01b9e88 6195 pv2 = "";
560a288e
GS
6196 cur2 = 0;
6197 }
e01b9e88
SC
6198 else
6199 pv2 = SvPV(sv2, cur2);
79072805 6200
cf48d248 6201 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6202 /* Differing utf8ness.
6203 * Do not UTF8size the comparands as a side-effect. */
cf48d248 6204 if (SvUTF8(sv1)) {
799ef3cb 6205 if (PL_encoding) {
553e1bcc
AT
6206 svrecode = newSVpvn(pv2, cur2);
6207 sv_recode_to_utf8(svrecode, PL_encoding);
6208 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6209 }
6210 else {
553e1bcc 6211 pv2 = tpv = (char*)bytes_to_utf8((U8*)pv2, &cur2);
799ef3cb 6212 }
cf48d248
JH
6213 }
6214 else {
799ef3cb 6215 if (PL_encoding) {
553e1bcc
AT
6216 svrecode = newSVpvn(pv1, cur1);
6217 sv_recode_to_utf8(svrecode, PL_encoding);
6218 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6219 }
6220 else {
553e1bcc 6221 pv1 = tpv = (char*)bytes_to_utf8((U8*)pv1, &cur1);
799ef3cb 6222 }
cf48d248
JH
6223 }
6224 }
6225
e01b9e88 6226 if (!cur1) {
cf48d248 6227 cmp = cur2 ? -1 : 0;
e01b9e88 6228 } else if (!cur2) {
cf48d248
JH
6229 cmp = 1;
6230 } else {
6231 I32 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
6232
6233 if (retval) {
cf48d248 6234 cmp = retval < 0 ? -1 : 1;
e01b9e88 6235 } else if (cur1 == cur2) {
cf48d248
JH
6236 cmp = 0;
6237 } else {
6238 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 6239 }
cf48d248 6240 }
16660edb 6241
553e1bcc
AT
6242 if (svrecode)
6243 SvREFCNT_dec(svrecode);
799ef3cb 6244
553e1bcc
AT
6245 if (tpv)
6246 Safefree(tpv);
cf48d248
JH
6247
6248 return cmp;
bbce6d69 6249}
16660edb 6250
c461cf8f
JH
6251/*
6252=for apidoc sv_cmp_locale
6253
645c22ef
DM
6254Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6255'use bytes' aware, handles get magic, and will coerce its args to strings
6256if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
6257
6258=cut
6259*/
6260
bbce6d69 6261I32
864dbfa3 6262Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 6263{
36477c24 6264#ifdef USE_LOCALE_COLLATE
16660edb 6265
bbce6d69 6266 char *pv1, *pv2;
6267 STRLEN len1, len2;
6268 I32 retval;
16660edb 6269
3280af22 6270 if (PL_collation_standard)
bbce6d69 6271 goto raw_compare;
16660edb 6272
bbce6d69 6273 len1 = 0;
8ac85365 6274 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 6275 len2 = 0;
8ac85365 6276 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 6277
bbce6d69 6278 if (!pv1 || !len1) {
6279 if (pv2 && len2)
6280 return -1;
6281 else
6282 goto raw_compare;
6283 }
6284 else {
6285 if (!pv2 || !len2)
6286 return 1;
6287 }
16660edb 6288
bbce6d69 6289 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 6290
bbce6d69 6291 if (retval)
16660edb 6292 return retval < 0 ? -1 : 1;
6293
bbce6d69 6294 /*
6295 * When the result of collation is equality, that doesn't mean
6296 * that there are no differences -- some locales exclude some
6297 * characters from consideration. So to avoid false equalities,
6298 * we use the raw string as a tiebreaker.
6299 */
16660edb 6300
bbce6d69 6301 raw_compare:
6302 /* FALL THROUGH */
16660edb 6303
36477c24 6304#endif /* USE_LOCALE_COLLATE */
16660edb 6305
bbce6d69 6306 return sv_cmp(sv1, sv2);
6307}
79072805 6308
645c22ef 6309
36477c24 6310#ifdef USE_LOCALE_COLLATE
645c22ef 6311
7a4c00b4 6312/*
645c22ef
DM
6313=for apidoc sv_collxfrm
6314
6315Add Collate Transform magic to an SV if it doesn't already have it.
6316
6317Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6318scalar data of the variable, but transformed to such a format that a normal
6319memory comparison can be used to compare the data according to the locale
6320settings.
6321
6322=cut
6323*/
6324
bbce6d69 6325char *
864dbfa3 6326Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 6327{
7a4c00b4 6328 MAGIC *mg;
16660edb 6329
14befaf4 6330 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 6331 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 6332 char *s, *xf;
6333 STRLEN len, xlen;
6334
7a4c00b4 6335 if (mg)
6336 Safefree(mg->mg_ptr);
bbce6d69 6337 s = SvPV(sv, len);
6338 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 6339 if (SvREADONLY(sv)) {
6340 SAVEFREEPV(xf);
6341 *nxp = xlen;
3280af22 6342 return xf + sizeof(PL_collation_ix);
ff0cee69 6343 }
7a4c00b4 6344 if (! mg) {
14befaf4
DM
6345 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
6346 mg = mg_find(sv, PERL_MAGIC_collxfrm);
7a4c00b4 6347 assert(mg);
bbce6d69 6348 }
7a4c00b4 6349 mg->mg_ptr = xf;
565764a8 6350 mg->mg_len = xlen;
7a4c00b4 6351 }
6352 else {
ff0cee69 6353 if (mg) {
6354 mg->mg_ptr = NULL;
565764a8 6355 mg->mg_len = -1;
ff0cee69 6356 }
bbce6d69 6357 }
6358 }
7a4c00b4 6359 if (mg && mg->mg_ptr) {
565764a8 6360 *nxp = mg->mg_len;
3280af22 6361 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 6362 }
6363 else {
6364 *nxp = 0;
6365 return NULL;
16660edb 6366 }
79072805
LW
6367}
6368
36477c24 6369#endif /* USE_LOCALE_COLLATE */
bbce6d69 6370
c461cf8f
JH
6371/*
6372=for apidoc sv_gets
6373
6374Get a line from the filehandle and store it into the SV, optionally
6375appending to the currently-stored string.
6376
6377=cut
6378*/
6379
79072805 6380char *
864dbfa3 6381Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 6382{
c07a80fd 6383 char *rsptr;
6384 STRLEN rslen;
6385 register STDCHAR rslast;
6386 register STDCHAR *bp;
6387 register I32 cnt;
9c5ffd7c 6388 I32 i = 0;
8bfdd7d9 6389 I32 rspara = 0;
e311fd51 6390 I32 recsize;
c07a80fd 6391
bc44a8a2
NC
6392 if (SvTHINKFIRST(sv))
6393 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
6394 /* XXX. If you make this PVIV, then copy on write can copy scalars read
6395 from <>.
6396 However, perlbench says it's slower, because the existing swipe code
6397 is faster than copy on write.
6398 Swings and roundabouts. */
6fc92669 6399 (void)SvUPGRADE(sv, SVt_PV);
99491443 6400
ff68c719 6401 SvSCREAM_off(sv);
efd8b2ba
AE
6402
6403 if (append) {
6404 if (PerlIO_isutf8(fp)) {
6405 if (!SvUTF8(sv)) {
6406 sv_utf8_upgrade_nomg(sv);
6407 sv_pos_u2b(sv,&append,0);
6408 }
6409 } else if (SvUTF8(sv)) {
6410 SV *tsv = NEWSV(0,0);
6411 sv_gets(tsv, fp, 0);
6412 sv_utf8_upgrade_nomg(tsv);
6413 SvCUR_set(sv,append);
6414 sv_catsv(sv,tsv);
6415 sv_free(tsv);
6416 goto return_string_or_null;
6417 }
6418 }
6419
6420 SvPOK_only(sv);
6421 if (PerlIO_isutf8(fp))
6422 SvUTF8_on(sv);
c07a80fd 6423
923e4eb5 6424 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
6425 /* we always read code in line mode */
6426 rsptr = "\n";
6427 rslen = 1;
6428 }
6429 else if (RsSNARF(PL_rs)) {
e468d35b
NIS
6430 /* If it is a regular disk file use size from stat() as estimate
6431 of amount we are going to read - may result in malloc-ing
6432 more memory than we realy need if layers bellow reduce
6433 size we read (e.g. CRLF or a gzip layer)
6434 */
e311fd51 6435 Stat_t st;
e468d35b
NIS
6436 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
6437 Off_t offset = PerlIO_tell(fp);
58f1856e 6438 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
6439 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6440 }
6441 }
c07a80fd 6442 rsptr = NULL;
6443 rslen = 0;
6444 }
3280af22 6445 else if (RsRECORD(PL_rs)) {
e311fd51 6446 I32 bytesread;
5b2b9c68
HM
6447 char *buffer;
6448
6449 /* Grab the size of the record we're getting */
3280af22 6450 recsize = SvIV(SvRV(PL_rs));
e311fd51 6451 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
6452 /* Go yank in */
6453#ifdef VMS
6454 /* VMS wants read instead of fread, because fread doesn't respect */
6455 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
6456 /* doing, but we've got no other real choice - except avoid stdio
6457 as implementation - perhaps write a :vms layer ?
6458 */
5b2b9c68
HM
6459 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
6460#else
6461 bytesread = PerlIO_read(fp, buffer, recsize);
6462#endif
27e6ca2d
AE
6463 if (bytesread < 0)
6464 bytesread = 0;
e311fd51 6465 SvCUR_set(sv, bytesread += append);
e670df4e 6466 buffer[bytesread] = '\0';
efd8b2ba 6467 goto return_string_or_null;
5b2b9c68 6468 }
3280af22 6469 else if (RsPARA(PL_rs)) {
c07a80fd 6470 rsptr = "\n\n";
6471 rslen = 2;
8bfdd7d9 6472 rspara = 1;
c07a80fd 6473 }
7d59b7e4
NIS
6474 else {
6475 /* Get $/ i.e. PL_rs into same encoding as stream wants */
6476 if (PerlIO_isutf8(fp)) {
6477 rsptr = SvPVutf8(PL_rs, rslen);
6478 }
6479 else {
6480 if (SvUTF8(PL_rs)) {
6481 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
6482 Perl_croak(aTHX_ "Wide character in $/");
6483 }
6484 }
6485 rsptr = SvPV(PL_rs, rslen);
6486 }
6487 }
6488
c07a80fd 6489 rslast = rslen ? rsptr[rslen - 1] : '\0';
6490
8bfdd7d9 6491 if (rspara) { /* have to do this both before and after */
79072805 6492 do { /* to make sure file boundaries work right */
760ac839 6493 if (PerlIO_eof(fp))
a0d0e21e 6494 return 0;
760ac839 6495 i = PerlIO_getc(fp);
79072805 6496 if (i != '\n') {
a0d0e21e
LW
6497 if (i == -1)
6498 return 0;
760ac839 6499 PerlIO_ungetc(fp,i);
79072805
LW
6500 break;
6501 }
6502 } while (i != EOF);
6503 }
c07a80fd 6504
760ac839
LW
6505 /* See if we know enough about I/O mechanism to cheat it ! */
6506
6507 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 6508 of abstracting out stdio interface. One call should be cheap
760ac839
LW
6509 enough here - and may even be a macro allowing compile
6510 time optimization.
6511 */
6512
6513 if (PerlIO_fast_gets(fp)) {
6514
6515 /*
6516 * We're going to steal some values from the stdio struct
6517 * and put EVERYTHING in the innermost loop into registers.
6518 */
6519 register STDCHAR *ptr;
6520 STRLEN bpx;
6521 I32 shortbuffered;
6522
16660edb 6523#if defined(VMS) && defined(PERLIO_IS_STDIO)
6524 /* An ungetc()d char is handled separately from the regular
6525 * buffer, so we getc() it back out and stuff it in the buffer.
6526 */
6527 i = PerlIO_getc(fp);
6528 if (i == EOF) return 0;
6529 *(--((*fp)->_ptr)) = (unsigned char) i;
6530 (*fp)->_cnt++;
6531#endif
c07a80fd 6532
c2960299 6533 /* Here is some breathtakingly efficient cheating */
c07a80fd 6534
a20bf0c3 6535 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b
NIS
6536 /* make sure we have the room */
6537 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
6538 /* Not room for all of it
6539 if we are looking for a separator and room for some
6540 */
6541 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
6542 /* just process what we have room for */
79072805
LW
6543 shortbuffered = cnt - SvLEN(sv) + append + 1;
6544 cnt -= shortbuffered;
6545 }
6546 else {
6547 shortbuffered = 0;
bbce6d69 6548 /* remember that cnt can be negative */
eb160463 6549 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
6550 }
6551 }
e468d35b 6552 else
79072805 6553 shortbuffered = 0;
c07a80fd 6554 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
a20bf0c3 6555 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 6556 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6557 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 6558 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 6559 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6560 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6561 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
6562 for (;;) {
6563 screamer:
93a17b20 6564 if (cnt > 0) {
c07a80fd 6565 if (rslen) {
760ac839
LW
6566 while (cnt > 0) { /* this | eat */
6567 cnt--;
c07a80fd 6568 if ((*bp++ = *ptr++) == rslast) /* really | dust */
6569 goto thats_all_folks; /* screams | sed :-) */
6570 }
6571 }
6572 else {
1c846c1f
NIS
6573 Copy(ptr, bp, cnt, char); /* this | eat */
6574 bp += cnt; /* screams | dust */
c07a80fd 6575 ptr += cnt; /* louder | sed :-) */
a5f75d66 6576 cnt = 0;
93a17b20 6577 }
79072805
LW
6578 }
6579
748a9306 6580 if (shortbuffered) { /* oh well, must extend */
79072805
LW
6581 cnt = shortbuffered;
6582 shortbuffered = 0;
c07a80fd 6583 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
6584 SvCUR_set(sv, bpx);
6585 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 6586 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
6587 continue;
6588 }
6589
16660edb 6590 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
6591 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
6592 PTR2UV(ptr),(long)cnt));
cc00df79 6593 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 6594#if 0
16660edb 6595 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6596 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6597 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6598 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6599#endif
1c846c1f 6600 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 6601 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
6602 another abstraction. */
760ac839 6603 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 6604#if 0
16660edb 6605 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6606 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6607 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6608 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6609#endif
a20bf0c3
JH
6610 cnt = PerlIO_get_cnt(fp);
6611 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 6612 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6613 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 6614
748a9306
LW
6615 if (i == EOF) /* all done for ever? */
6616 goto thats_really_all_folks;
6617
c07a80fd 6618 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
6619 SvCUR_set(sv, bpx);
6620 SvGROW(sv, bpx + cnt + 2);
c07a80fd 6621 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
6622
eb160463 6623 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 6624
c07a80fd 6625 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 6626 goto thats_all_folks;
79072805
LW
6627 }
6628
6629thats_all_folks:
eb160463 6630 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX(sv)) < rslen) ||
36477c24 6631 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 6632 goto screamer; /* go back to the fray */
79072805
LW
6633thats_really_all_folks:
6634 if (shortbuffered)
6635 cnt += shortbuffered;
16660edb 6636 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6637 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 6638 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 6639 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6640 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6641 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6642 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 6643 *bp = '\0';
760ac839 6644 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 6645 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 6646 "Screamer: done, len=%ld, string=|%.*s|\n",
6647 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
6648 }
6649 else
79072805 6650 {
6edd2cd5
JH
6651 /*The big, slow, and stupid way. */
6652
6653 /* Any stack-challenged places. */
33d5f59c 6654#if defined(EPOC)
6edd2cd5
JH
6655 /* EPOC: need to work around SDK features. *
6656 * On WINS: MS VC5 generates calls to _chkstk, *
6657 * if a "large" stack frame is allocated. *
6658 * gcc on MARM does not generate calls like these. */
6659# define USEHEAPINSTEADOFSTACK
6660#endif
6661
6662#ifdef USEHEAPINSTEADOFSTACK
6663 STDCHAR *buf = 0;
6664 New(0, buf, 8192, STDCHAR);
6665 assert(buf);
4d2c4e07 6666#else
6edd2cd5 6667 STDCHAR buf[8192];
4d2c4e07 6668#endif
79072805 6669
760ac839 6670screamer2:
c07a80fd 6671 if (rslen) {
760ac839
LW
6672 register STDCHAR *bpe = buf + sizeof(buf);
6673 bp = buf;
eb160463 6674 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
6675 ; /* keep reading */
6676 cnt = bp - buf;
c07a80fd 6677 }
6678 else {
760ac839 6679 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 6680 /* Accomodate broken VAXC compiler, which applies U8 cast to
6681 * both args of ?: operator, causing EOF to change into 255
6682 */
37be0adf 6683 if (cnt > 0)
cbe9e203
JH
6684 i = (U8)buf[cnt - 1];
6685 else
37be0adf 6686 i = EOF;
c07a80fd 6687 }
79072805 6688
cbe9e203
JH
6689 if (cnt < 0)
6690 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
6691 if (append)
6692 sv_catpvn(sv, (char *) buf, cnt);
6693 else
6694 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 6695
6696 if (i != EOF && /* joy */
6697 (!rslen ||
6698 SvCUR(sv) < rslen ||
36477c24 6699 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
6700 {
6701 append = -1;
63e4d877
CS
6702 /*
6703 * If we're reading from a TTY and we get a short read,
6704 * indicating that the user hit his EOF character, we need
6705 * to notice it now, because if we try to read from the TTY
6706 * again, the EOF condition will disappear.
6707 *
6708 * The comparison of cnt to sizeof(buf) is an optimization
6709 * that prevents unnecessary calls to feof().
6710 *
6711 * - jik 9/25/96
6712 */
6713 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
6714 goto screamer2;
79072805 6715 }
6edd2cd5
JH
6716
6717#ifdef USEHEAPINSTEADOFSTACK
6718 Safefree(buf);
6719#endif
79072805
LW
6720 }
6721
8bfdd7d9 6722 if (rspara) { /* have to do this both before and after */
c07a80fd 6723 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 6724 i = PerlIO_getc(fp);
79072805 6725 if (i != '\n') {
760ac839 6726 PerlIO_ungetc(fp,i);
79072805
LW
6727 break;
6728 }
6729 }
6730 }
c07a80fd 6731
efd8b2ba 6732return_string_or_null:
c07a80fd 6733 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
6734}
6735
954c1994
GS
6736/*
6737=for apidoc sv_inc
6738
645c22ef
DM
6739Auto-increment of the value in the SV, doing string to numeric conversion
6740if necessary. Handles 'get' magic.
954c1994
GS
6741
6742=cut
6743*/
6744
79072805 6745void
864dbfa3 6746Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
6747{
6748 register char *d;
463ee0b2 6749 int flags;
79072805
LW
6750
6751 if (!sv)
6752 return;
b23a5f78
GB
6753 if (SvGMAGICAL(sv))
6754 mg_get(sv);
ed6116ce 6755 if (SvTHINKFIRST(sv)) {
765f542d
NC
6756 if (SvIsCOW(sv))
6757 sv_force_normal_flags(sv, 0);
0f15f207 6758 if (SvREADONLY(sv)) {
923e4eb5 6759 if (IN_PERL_RUNTIME)
cea2e8a9 6760 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6761 }
a0d0e21e 6762 if (SvROK(sv)) {
b5be31e9 6763 IV i;
9e7bc3e8
JD
6764 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
6765 return;
56431972 6766 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6767 sv_unref(sv);
6768 sv_setiv(sv, i);
a0d0e21e 6769 }
ed6116ce 6770 }
8990e307 6771 flags = SvFLAGS(sv);
28e5dec8
JH
6772 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
6773 /* It's (privately or publicly) a float, but not tested as an
6774 integer, so test it to see. */
d460ef45 6775 (void) SvIV(sv);
28e5dec8
JH
6776 flags = SvFLAGS(sv);
6777 }
6778 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6779 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6780#ifdef PERL_PRESERVE_IVUV
28e5dec8 6781 oops_its_int:
59d8ce62 6782#endif
25da4f38
IZ
6783 if (SvIsUV(sv)) {
6784 if (SvUVX(sv) == UV_MAX)
a1e868e7 6785 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
6786 else
6787 (void)SvIOK_only_UV(sv);
6788 ++SvUVX(sv);
6789 } else {
6790 if (SvIVX(sv) == IV_MAX)
28e5dec8 6791 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
6792 else {
6793 (void)SvIOK_only(sv);
6794 ++SvIVX(sv);
1c846c1f 6795 }
55497cff 6796 }
79072805
LW
6797 return;
6798 }
28e5dec8
JH
6799 if (flags & SVp_NOK) {
6800 (void)SvNOK_only(sv);
6801 SvNVX(sv) += 1.0;
6802 return;
6803 }
6804
8990e307 6805 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
28e5dec8
JH
6806 if ((flags & SVTYPEMASK) < SVt_PVIV)
6807 sv_upgrade(sv, SVt_IV);
6808 (void)SvIOK_only(sv);
6809 SvIVX(sv) = 1;
79072805
LW
6810 return;
6811 }
463ee0b2 6812 d = SvPVX(sv);
79072805
LW
6813 while (isALPHA(*d)) d++;
6814 while (isDIGIT(*d)) d++;
6815 if (*d) {
28e5dec8 6816#ifdef PERL_PRESERVE_IVUV
d1be9408 6817 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
6818 warnings. Probably ought to make the sv_iv_please() that does
6819 the conversion if possible, and silently. */
c2988b20 6820 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
6821 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6822 /* Need to try really hard to see if it's an integer.
6823 9.22337203685478e+18 is an integer.
6824 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6825 so $a="9.22337203685478e+18"; $a+0; $a++
6826 needs to be the same as $a="9.22337203685478e+18"; $a++
6827 or we go insane. */
d460ef45 6828
28e5dec8
JH
6829 (void) sv_2iv(sv);
6830 if (SvIOK(sv))
6831 goto oops_its_int;
6832
6833 /* sv_2iv *should* have made this an NV */
6834 if (flags & SVp_NOK) {
6835 (void)SvNOK_only(sv);
6836 SvNVX(sv) += 1.0;
6837 return;
6838 }
6839 /* I don't think we can get here. Maybe I should assert this
6840 And if we do get here I suspect that sv_setnv will croak. NWC
6841 Fall through. */
6842#if defined(USE_LONG_DOUBLE)
6843 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",
6844 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6845#else
1779d84d 6846 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
6847 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6848#endif
6849 }
6850#endif /* PERL_PRESERVE_IVUV */
6851 sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
79072805
LW
6852 return;
6853 }
6854 d--;
463ee0b2 6855 while (d >= SvPVX(sv)) {
79072805
LW
6856 if (isDIGIT(*d)) {
6857 if (++*d <= '9')
6858 return;
6859 *(d--) = '0';
6860 }
6861 else {
9d116dd7
JH
6862#ifdef EBCDIC
6863 /* MKS: The original code here died if letters weren't consecutive.
6864 * at least it didn't have to worry about non-C locales. The
6865 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 6866 * arranged in order (although not consecutively) and that only
9d116dd7
JH
6867 * [A-Za-z] are accepted by isALPHA in the C locale.
6868 */
6869 if (*d != 'z' && *d != 'Z') {
6870 do { ++*d; } while (!isALPHA(*d));
6871 return;
6872 }
6873 *(d--) -= 'z' - 'a';
6874#else
79072805
LW
6875 ++*d;
6876 if (isALPHA(*d))
6877 return;
6878 *(d--) -= 'z' - 'a' + 1;
9d116dd7 6879#endif
79072805
LW
6880 }
6881 }
6882 /* oh,oh, the number grew */
6883 SvGROW(sv, SvCUR(sv) + 2);
6884 SvCUR(sv)++;
463ee0b2 6885 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
6886 *d = d[-1];
6887 if (isDIGIT(d[1]))
6888 *d = '1';
6889 else
6890 *d = d[1];
6891}
6892
954c1994
GS
6893/*
6894=for apidoc sv_dec
6895
645c22ef
DM
6896Auto-decrement of the value in the SV, doing string to numeric conversion
6897if necessary. Handles 'get' magic.
954c1994
GS
6898
6899=cut
6900*/
6901
79072805 6902void
864dbfa3 6903Perl_sv_dec(pTHX_ register SV *sv)
79072805 6904{
463ee0b2
LW
6905 int flags;
6906
79072805
LW
6907 if (!sv)
6908 return;
b23a5f78
GB
6909 if (SvGMAGICAL(sv))
6910 mg_get(sv);
ed6116ce 6911 if (SvTHINKFIRST(sv)) {
765f542d
NC
6912 if (SvIsCOW(sv))
6913 sv_force_normal_flags(sv, 0);
0f15f207 6914 if (SvREADONLY(sv)) {
923e4eb5 6915 if (IN_PERL_RUNTIME)
cea2e8a9 6916 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6917 }
a0d0e21e 6918 if (SvROK(sv)) {
b5be31e9 6919 IV i;
9e7bc3e8
JD
6920 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6921 return;
56431972 6922 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6923 sv_unref(sv);
6924 sv_setiv(sv, i);
a0d0e21e 6925 }
ed6116ce 6926 }
28e5dec8
JH
6927 /* Unlike sv_inc we don't have to worry about string-never-numbers
6928 and keeping them magic. But we mustn't warn on punting */
8990e307 6929 flags = SvFLAGS(sv);
28e5dec8
JH
6930 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6931 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6932#ifdef PERL_PRESERVE_IVUV
28e5dec8 6933 oops_its_int:
59d8ce62 6934#endif
25da4f38
IZ
6935 if (SvIsUV(sv)) {
6936 if (SvUVX(sv) == 0) {
6937 (void)SvIOK_only(sv);
6938 SvIVX(sv) = -1;
6939 }
6940 else {
6941 (void)SvIOK_only_UV(sv);
6942 --SvUVX(sv);
1c846c1f 6943 }
25da4f38
IZ
6944 } else {
6945 if (SvIVX(sv) == IV_MIN)
65202027 6946 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
6947 else {
6948 (void)SvIOK_only(sv);
6949 --SvIVX(sv);
1c846c1f 6950 }
55497cff 6951 }
6952 return;
6953 }
28e5dec8
JH
6954 if (flags & SVp_NOK) {
6955 SvNVX(sv) -= 1.0;
6956 (void)SvNOK_only(sv);
6957 return;
6958 }
8990e307 6959 if (!(flags & SVp_POK)) {
4633a7c4
LW
6960 if ((flags & SVTYPEMASK) < SVt_PVNV)
6961 sv_upgrade(sv, SVt_NV);
463ee0b2 6962 SvNVX(sv) = -1.0;
a0d0e21e 6963 (void)SvNOK_only(sv);
79072805
LW
6964 return;
6965 }
28e5dec8
JH
6966#ifdef PERL_PRESERVE_IVUV
6967 {
c2988b20 6968 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
6969 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6970 /* Need to try really hard to see if it's an integer.
6971 9.22337203685478e+18 is an integer.
6972 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6973 so $a="9.22337203685478e+18"; $a+0; $a--
6974 needs to be the same as $a="9.22337203685478e+18"; $a--
6975 or we go insane. */
d460ef45 6976
28e5dec8
JH
6977 (void) sv_2iv(sv);
6978 if (SvIOK(sv))
6979 goto oops_its_int;
6980
6981 /* sv_2iv *should* have made this an NV */
6982 if (flags & SVp_NOK) {
6983 (void)SvNOK_only(sv);
6984 SvNVX(sv) -= 1.0;
6985 return;
6986 }
6987 /* I don't think we can get here. Maybe I should assert this
6988 And if we do get here I suspect that sv_setnv will croak. NWC
6989 Fall through. */
6990#if defined(USE_LONG_DOUBLE)
6991 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",
6992 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6993#else
1779d84d 6994 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
6995 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6996#endif
6997 }
6998 }
6999#endif /* PERL_PRESERVE_IVUV */
097ee67d 7000 sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
7001}
7002
954c1994
GS
7003/*
7004=for apidoc sv_mortalcopy
7005
645c22ef 7006Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
7007The new SV is marked as mortal. It will be destroyed "soon", either by an
7008explicit call to FREETMPS, or by an implicit call at places such as
7009statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
7010
7011=cut
7012*/
7013
79072805
LW
7014/* Make a string that will exist for the duration of the expression
7015 * evaluation. Actually, it may have to last longer than that, but
7016 * hopefully we won't free it until it has been assigned to a
7017 * permanent location. */
7018
7019SV *
864dbfa3 7020Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 7021{
463ee0b2 7022 register SV *sv;
b881518d 7023
4561caa4 7024 new_SV(sv);
79072805 7025 sv_setsv(sv,oldstr);
677b06e3
GS
7026 EXTEND_MORTAL(1);
7027 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
7028 SvTEMP_on(sv);
7029 return sv;
7030}
7031
954c1994
GS
7032/*
7033=for apidoc sv_newmortal
7034
645c22ef 7035Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
7036set to 1. It will be destroyed "soon", either by an explicit call to
7037FREETMPS, or by an implicit call at places such as statement boundaries.
7038See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
7039
7040=cut
7041*/
7042
8990e307 7043SV *
864dbfa3 7044Perl_sv_newmortal(pTHX)
8990e307
LW
7045{
7046 register SV *sv;
7047
4561caa4 7048 new_SV(sv);
8990e307 7049 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
7050 EXTEND_MORTAL(1);
7051 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
7052 return sv;
7053}
7054
954c1994
GS
7055/*
7056=for apidoc sv_2mortal
7057
d4236ebc
DM
7058Marks an existing SV as mortal. The SV will be destroyed "soon", either
7059by an explicit call to FREETMPS, or by an implicit call at places such as
7060statement boundaries. See also C<sv_newmortal> and C<sv_mortalcopy>.
954c1994
GS
7061
7062=cut
7063*/
7064
79072805 7065SV *
864dbfa3 7066Perl_sv_2mortal(pTHX_ register SV *sv)
79072805
LW
7067{
7068 if (!sv)
7069 return sv;
d689ffdd 7070 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 7071 return sv;
677b06e3
GS
7072 EXTEND_MORTAL(1);
7073 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 7074 SvTEMP_on(sv);
79072805
LW
7075 return sv;
7076}
7077
954c1994
GS
7078/*
7079=for apidoc newSVpv
7080
7081Creates a new SV and copies a string into it. The reference count for the
7082SV is set to 1. If C<len> is zero, Perl will compute the length using
7083strlen(). For efficiency, consider using C<newSVpvn> instead.
7084
7085=cut
7086*/
7087
79072805 7088SV *
864dbfa3 7089Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 7090{
463ee0b2 7091 register SV *sv;
79072805 7092
4561caa4 7093 new_SV(sv);
79072805
LW
7094 if (!len)
7095 len = strlen(s);
7096 sv_setpvn(sv,s,len);
7097 return sv;
7098}
7099
954c1994
GS
7100/*
7101=for apidoc newSVpvn
7102
7103Creates a new SV and copies a string into it. The reference count for the
1c846c1f 7104SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994
GS
7105string. You are responsible for ensuring that the source string is at least
7106C<len> bytes long.
7107
7108=cut
7109*/
7110
9da1e3b5 7111SV *
864dbfa3 7112Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
7113{
7114 register SV *sv;
7115
7116 new_SV(sv);
9da1e3b5
MUN
7117 sv_setpvn(sv,s,len);
7118 return sv;
7119}
7120
1c846c1f
NIS
7121/*
7122=for apidoc newSVpvn_share
7123
645c22ef
DM
7124Creates a new SV with its SvPVX pointing to a shared string in the string
7125table. If the string does not already exist in the table, it is created
7126first. Turns on READONLY and FAKE. The string's hash is stored in the UV
7127slot of the SV; if the C<hash> parameter is non-zero, that value is used;
7128otherwise the hash is computed. The idea here is that as the string table
7129is used for shared hash keys these strings will have SvPVX == HeKEY and
7130hash lookup will avoid string compare.
1c846c1f
NIS
7131
7132=cut
7133*/
7134
7135SV *
c3654f1a 7136Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
7137{
7138 register SV *sv;
c3654f1a
IH
7139 bool is_utf8 = FALSE;
7140 if (len < 0) {
77caf834 7141 STRLEN tmplen = -len;
c3654f1a 7142 is_utf8 = TRUE;
75a54232
JH
7143 /* See the note in hv.c:hv_fetch() --jhi */
7144 src = (char*)bytes_from_utf8((U8*)src, &tmplen, &is_utf8);
7145 len = tmplen;
7146 }
1c846c1f 7147 if (!hash)
5afd6d42 7148 PERL_HASH(hash, src, len);
1c846c1f
NIS
7149 new_SV(sv);
7150 sv_upgrade(sv, SVt_PVIV);
c3654f1a 7151 SvPVX(sv) = sharepvn(src, is_utf8?-len:len, hash);
1c846c1f
NIS
7152 SvCUR(sv) = len;
7153 SvUVX(sv) = hash;
7154 SvLEN(sv) = 0;
7155 SvREADONLY_on(sv);
7156 SvFAKE_on(sv);
7157 SvPOK_on(sv);
c3654f1a
IH
7158 if (is_utf8)
7159 SvUTF8_on(sv);
1c846c1f
NIS
7160 return sv;
7161}
7162
645c22ef 7163
cea2e8a9 7164#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7165
7166/* pTHX_ magic can't cope with varargs, so this is a no-context
7167 * version of the main function, (which may itself be aliased to us).
7168 * Don't access this version directly.
7169 */
7170
46fc3d4c 7171SV *
cea2e8a9 7172Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 7173{
cea2e8a9 7174 dTHX;
46fc3d4c 7175 register SV *sv;
7176 va_list args;
46fc3d4c 7177 va_start(args, pat);
c5be433b 7178 sv = vnewSVpvf(pat, &args);
46fc3d4c 7179 va_end(args);
7180 return sv;
7181}
cea2e8a9 7182#endif
46fc3d4c 7183
954c1994
GS
7184/*
7185=for apidoc newSVpvf
7186
645c22ef 7187Creates a new SV and initializes it with the string formatted like
954c1994
GS
7188C<sprintf>.
7189
7190=cut
7191*/
7192
cea2e8a9
GS
7193SV *
7194Perl_newSVpvf(pTHX_ const char* pat, ...)
7195{
7196 register SV *sv;
7197 va_list args;
cea2e8a9 7198 va_start(args, pat);
c5be433b 7199 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
7200 va_end(args);
7201 return sv;
7202}
46fc3d4c 7203
645c22ef
DM
7204/* backend for newSVpvf() and newSVpvf_nocontext() */
7205
79072805 7206SV *
c5be433b
GS
7207Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
7208{
7209 register SV *sv;
7210 new_SV(sv);
7211 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7212 return sv;
7213}
7214
954c1994
GS
7215/*
7216=for apidoc newSVnv
7217
7218Creates a new SV and copies a floating point value into it.
7219The reference count for the SV is set to 1.
7220
7221=cut
7222*/
7223
c5be433b 7224SV *
65202027 7225Perl_newSVnv(pTHX_ NV n)
79072805 7226{
463ee0b2 7227 register SV *sv;
79072805 7228
4561caa4 7229 new_SV(sv);
79072805
LW
7230 sv_setnv(sv,n);
7231 return sv;
7232}
7233
954c1994
GS
7234/*
7235=for apidoc newSViv
7236
7237Creates a new SV and copies an integer into it. The reference count for the
7238SV is set to 1.
7239
7240=cut
7241*/
7242
79072805 7243SV *
864dbfa3 7244Perl_newSViv(pTHX_ IV i)
79072805 7245{
463ee0b2 7246 register SV *sv;
79072805 7247
4561caa4 7248 new_SV(sv);
79072805
LW
7249 sv_setiv(sv,i);
7250 return sv;
7251}
7252
954c1994 7253/*
1a3327fb
JH
7254=for apidoc newSVuv
7255
7256Creates a new SV and copies an unsigned integer into it.
7257The reference count for the SV is set to 1.
7258
7259=cut
7260*/
7261
7262SV *
7263Perl_newSVuv(pTHX_ UV u)
7264{
7265 register SV *sv;
7266
7267 new_SV(sv);
7268 sv_setuv(sv,u);
7269 return sv;
7270}
7271
7272/*
954c1994
GS
7273=for apidoc newRV_noinc
7274
7275Creates an RV wrapper for an SV. The reference count for the original
7276SV is B<not> incremented.
7277
7278=cut
7279*/
7280
2304df62 7281SV *
864dbfa3 7282Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
7283{
7284 register SV *sv;
7285
4561caa4 7286 new_SV(sv);
2304df62 7287 sv_upgrade(sv, SVt_RV);
76e3520e 7288 SvTEMP_off(tmpRef);
d689ffdd 7289 SvRV(sv) = tmpRef;
2304df62 7290 SvROK_on(sv);
2304df62
AD
7291 return sv;
7292}
7293
ff276b08 7294/* newRV_inc is the official function name to use now.
645c22ef
DM
7295 * newRV_inc is in fact #defined to newRV in sv.h
7296 */
7297
5f05dabc 7298SV *
864dbfa3 7299Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 7300{
5f6447b6 7301 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 7302}
5f05dabc 7303
954c1994
GS
7304/*
7305=for apidoc newSVsv
7306
7307Creates a new SV which is an exact duplicate of the original SV.
645c22ef 7308(Uses C<sv_setsv>).
954c1994
GS
7309
7310=cut
7311*/
7312
79072805 7313SV *
864dbfa3 7314Perl_newSVsv(pTHX_ register SV *old)
79072805 7315{
463ee0b2 7316 register SV *sv;
79072805
LW
7317
7318 if (!old)
7319 return Nullsv;
8990e307 7320 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 7321 if (ckWARN_d(WARN_INTERNAL))
9014280d 7322 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
79072805
LW
7323 return Nullsv;
7324 }
4561caa4 7325 new_SV(sv);
ff68c719 7326 if (SvTEMP(old)) {
7327 SvTEMP_off(old);
463ee0b2 7328 sv_setsv(sv,old);
ff68c719 7329 SvTEMP_on(old);
79072805
LW
7330 }
7331 else
463ee0b2
LW
7332 sv_setsv(sv,old);
7333 return sv;
79072805
LW
7334}
7335
645c22ef
DM
7336/*
7337=for apidoc sv_reset
7338
7339Underlying implementation for the C<reset> Perl function.
7340Note that the perl-level function is vaguely deprecated.
7341
7342=cut
7343*/
7344
79072805 7345void
864dbfa3 7346Perl_sv_reset(pTHX_ register char *s, HV *stash)
79072805
LW
7347{
7348 register HE *entry;
7349 register GV *gv;
7350 register SV *sv;
7351 register I32 i;
7352 register PMOP *pm;
7353 register I32 max;
4802d5d7 7354 char todo[PERL_UCHAR_MAX+1];
79072805 7355
49d8d3a1
MB
7356 if (!stash)
7357 return;
7358
79072805
LW
7359 if (!*s) { /* reset ?? searches */
7360 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
48c036b1 7361 pm->op_pmdynflags &= ~PMdf_USED;
79072805
LW
7362 }
7363 return;
7364 }
7365
7366 /* reset variables */
7367
7368 if (!HvARRAY(stash))
7369 return;
463ee0b2
LW
7370
7371 Zero(todo, 256, char);
79072805 7372 while (*s) {
4802d5d7 7373 i = (unsigned char)*s;
79072805
LW
7374 if (s[1] == '-') {
7375 s += 2;
7376 }
4802d5d7 7377 max = (unsigned char)*s++;
79072805 7378 for ( ; i <= max; i++) {
463ee0b2
LW
7379 todo[i] = 1;
7380 }
a0d0e21e 7381 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 7382 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7383 entry;
7384 entry = HeNEXT(entry))
7385 {
1edc1566 7386 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7387 continue;
1edc1566 7388 gv = (GV*)HeVAL(entry);
79072805 7389 sv = GvSV(gv);
9e35f4b3
GS
7390 if (SvTHINKFIRST(sv)) {
7391 if (!SvREADONLY(sv) && SvROK(sv))
7392 sv_unref(sv);
7393 continue;
7394 }
a0d0e21e 7395 (void)SvOK_off(sv);
79072805
LW
7396 if (SvTYPE(sv) >= SVt_PV) {
7397 SvCUR_set(sv, 0);
463ee0b2
LW
7398 if (SvPVX(sv) != Nullch)
7399 *SvPVX(sv) = '\0';
44a8e56a 7400 SvTAINT(sv);
79072805
LW
7401 }
7402 if (GvAV(gv)) {
7403 av_clear(GvAV(gv));
7404 }
44a8e56a 7405 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
463ee0b2 7406 hv_clear(GvHV(gv));
2f42fcb0 7407#ifndef PERL_MICRO
fa6a1c44 7408#ifdef USE_ENVIRON_ARRAY
4efc5df6
GS
7409 if (gv == PL_envgv
7410# ifdef USE_ITHREADS
7411 && PL_curinterp == aTHX
7412# endif
7413 )
7414 {
79072805 7415 environ[0] = Nullch;
4efc5df6 7416 }
a0d0e21e 7417#endif
2f42fcb0 7418#endif /* !PERL_MICRO */
79072805
LW
7419 }
7420 }
7421 }
7422 }
7423}
7424
645c22ef
DM
7425/*
7426=for apidoc sv_2io
7427
7428Using various gambits, try to get an IO from an SV: the IO slot if its a
7429GV; or the recursive result if we're an RV; or the IO slot of the symbol
7430named after the PV if we're a string.
7431
7432=cut
7433*/
7434
46fc3d4c 7435IO*
864dbfa3 7436Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 7437{
7438 IO* io;
7439 GV* gv;
2d8e6c8d 7440 STRLEN n_a;
46fc3d4c 7441
7442 switch (SvTYPE(sv)) {
7443 case SVt_PVIO:
7444 io = (IO*)sv;
7445 break;
7446 case SVt_PVGV:
7447 gv = (GV*)sv;
7448 io = GvIO(gv);
7449 if (!io)
cea2e8a9 7450 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 7451 break;
7452 default:
7453 if (!SvOK(sv))
cea2e8a9 7454 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 7455 if (SvROK(sv))
7456 return sv_2io(SvRV(sv));
2d8e6c8d 7457 gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
46fc3d4c 7458 if (gv)
7459 io = GvIO(gv);
7460 else
7461 io = 0;
7462 if (!io)
35c1215d 7463 Perl_croak(aTHX_ "Bad filehandle: %"SVf, sv);
46fc3d4c 7464 break;
7465 }
7466 return io;
7467}
7468
645c22ef
DM
7469/*
7470=for apidoc sv_2cv
7471
7472Using various gambits, try to get a CV from an SV; in addition, try if
7473possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
7474
7475=cut
7476*/
7477
79072805 7478CV *
864dbfa3 7479Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 7480{
c04a4dfe
JH
7481 GV *gv = Nullgv;
7482 CV *cv = Nullcv;
2d8e6c8d 7483 STRLEN n_a;
79072805
LW
7484
7485 if (!sv)
93a17b20 7486 return *gvp = Nullgv, Nullcv;
79072805 7487 switch (SvTYPE(sv)) {
79072805
LW
7488 case SVt_PVCV:
7489 *st = CvSTASH(sv);
7490 *gvp = Nullgv;
7491 return (CV*)sv;
7492 case SVt_PVHV:
7493 case SVt_PVAV:
7494 *gvp = Nullgv;
7495 return Nullcv;
8990e307
LW
7496 case SVt_PVGV:
7497 gv = (GV*)sv;
a0d0e21e 7498 *gvp = gv;
8990e307
LW
7499 *st = GvESTASH(gv);
7500 goto fix_gv;
7501
79072805 7502 default:
a0d0e21e
LW
7503 if (SvGMAGICAL(sv))
7504 mg_get(sv);
7505 if (SvROK(sv)) {
f5284f61
IZ
7506 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
7507 tryAMAGICunDEREF(to_cv);
7508
62f274bf
GS
7509 sv = SvRV(sv);
7510 if (SvTYPE(sv) == SVt_PVCV) {
7511 cv = (CV*)sv;
7512 *gvp = Nullgv;
7513 *st = CvSTASH(cv);
7514 return cv;
7515 }
7516 else if(isGV(sv))
7517 gv = (GV*)sv;
7518 else
cea2e8a9 7519 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 7520 }
62f274bf 7521 else if (isGV(sv))
79072805
LW
7522 gv = (GV*)sv;
7523 else
2d8e6c8d 7524 gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
79072805
LW
7525 *gvp = gv;
7526 if (!gv)
7527 return Nullcv;
7528 *st = GvESTASH(gv);
8990e307 7529 fix_gv:
8ebc5c01 7530 if (lref && !GvCVu(gv)) {
4633a7c4 7531 SV *tmpsv;
748a9306 7532 ENTER;
4633a7c4 7533 tmpsv = NEWSV(704,0);
16660edb 7534 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
7535 /* XXX this is probably not what they think they're getting.
7536 * It has the same effect as "sub name;", i.e. just a forward
7537 * declaration! */
774d564b 7538 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
7539 newSVOP(OP_CONST, 0, tmpsv),
7540 Nullop,
8990e307 7541 Nullop);
748a9306 7542 LEAVE;
8ebc5c01 7543 if (!GvCVu(gv))
35c1215d
NC
7544 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
7545 sv);
8990e307 7546 }
8ebc5c01 7547 return GvCVu(gv);
79072805
LW
7548 }
7549}
7550
c461cf8f
JH
7551/*
7552=for apidoc sv_true
7553
7554Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
7555Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
7556instead use an in-line version.
c461cf8f
JH
7557
7558=cut
7559*/
7560
79072805 7561I32
864dbfa3 7562Perl_sv_true(pTHX_ register SV *sv)
79072805 7563{
8990e307
LW
7564 if (!sv)
7565 return 0;
79072805 7566 if (SvPOK(sv)) {
4e35701f
NIS
7567 register XPV* tXpv;
7568 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 7569 (tXpv->xpv_cur > 1 ||
4e35701f 7570 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
79072805
LW
7571 return 1;
7572 else
7573 return 0;
7574 }
7575 else {
7576 if (SvIOK(sv))
463ee0b2 7577 return SvIVX(sv) != 0;
79072805
LW
7578 else {
7579 if (SvNOK(sv))
463ee0b2 7580 return SvNVX(sv) != 0.0;
79072805 7581 else
463ee0b2 7582 return sv_2bool(sv);
79072805
LW
7583 }
7584 }
7585}
79072805 7586
645c22ef
DM
7587/*
7588=for apidoc sv_iv
7589
7590A private implementation of the C<SvIVx> macro for compilers which can't
7591cope with complex macro expressions. Always use the macro instead.
7592
7593=cut
7594*/
7595
ff68c719 7596IV
864dbfa3 7597Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 7598{
25da4f38
IZ
7599 if (SvIOK(sv)) {
7600 if (SvIsUV(sv))
7601 return (IV)SvUVX(sv);
ff68c719 7602 return SvIVX(sv);
25da4f38 7603 }
ff68c719 7604 return sv_2iv(sv);
85e6fe83 7605}
85e6fe83 7606
645c22ef
DM
7607/*
7608=for apidoc sv_uv
7609
7610A private implementation of the C<SvUVx> macro for compilers which can't
7611cope with complex macro expressions. Always use the macro instead.
7612
7613=cut
7614*/
7615
ff68c719 7616UV
864dbfa3 7617Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 7618{
25da4f38
IZ
7619 if (SvIOK(sv)) {
7620 if (SvIsUV(sv))
7621 return SvUVX(sv);
7622 return (UV)SvIVX(sv);
7623 }
ff68c719 7624 return sv_2uv(sv);
7625}
85e6fe83 7626
645c22ef
DM
7627/*
7628=for apidoc sv_nv
7629
7630A private implementation of the C<SvNVx> macro for compilers which can't
7631cope with complex macro expressions. Always use the macro instead.
7632
7633=cut
7634*/
7635
65202027 7636NV
864dbfa3 7637Perl_sv_nv(pTHX_ register SV *sv)
79072805 7638{
ff68c719 7639 if (SvNOK(sv))
7640 return SvNVX(sv);
7641 return sv_2nv(sv);
79072805 7642}
79072805 7643
09540bc3
JH
7644/* sv_pv() is now a macro using SvPV_nolen();
7645 * this function provided for binary compatibility only
7646 */
7647
7648char *
7649Perl_sv_pv(pTHX_ SV *sv)
7650{
7651 STRLEN n_a;
7652
7653 if (SvPOK(sv))
7654 return SvPVX(sv);
7655
7656 return sv_2pv(sv, &n_a);
7657}
7658
645c22ef
DM
7659/*
7660=for apidoc sv_pv
7661
baca2b92 7662Use the C<SvPV_nolen> macro instead
645c22ef 7663
645c22ef
DM
7664=for apidoc sv_pvn
7665
7666A private implementation of the C<SvPV> macro for compilers which can't
7667cope with complex macro expressions. Always use the macro instead.
7668
7669=cut
7670*/
7671
1fa8b10d 7672char *
864dbfa3 7673Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 7674{
85e6fe83
LW
7675 if (SvPOK(sv)) {
7676 *lp = SvCUR(sv);
a0d0e21e 7677 return SvPVX(sv);
85e6fe83 7678 }
463ee0b2 7679 return sv_2pv(sv, lp);
79072805 7680}
79072805 7681
6e9d1081
NC
7682
7683char *
7684Perl_sv_pvn_nomg(pTHX_ register SV *sv, STRLEN *lp)
7685{
7686 if (SvPOK(sv)) {
7687 *lp = SvCUR(sv);
7688 return SvPVX(sv);
7689 }
7690 return sv_2pv_flags(sv, lp, 0);
7691}
7692
09540bc3
JH
7693/* sv_pvn_force() is now a macro using Perl_sv_pvn_force_flags();
7694 * this function provided for binary compatibility only
7695 */
7696
7697char *
7698Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
7699{
7700 return sv_pvn_force_flags(sv, lp, SV_GMAGIC);
7701}
7702
c461cf8f
JH
7703/*
7704=for apidoc sv_pvn_force
7705
7706Get a sensible string out of the SV somehow.
645c22ef
DM
7707A private implementation of the C<SvPV_force> macro for compilers which
7708can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 7709
8d6d96c1
HS
7710=for apidoc sv_pvn_force_flags
7711
7712Get a sensible string out of the SV somehow.
7713If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
7714appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
7715implemented in terms of this function.
645c22ef
DM
7716You normally want to use the various wrapper macros instead: see
7717C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
7718
7719=cut
7720*/
7721
7722char *
7723Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
7724{
c04a4dfe 7725 char *s = NULL;
a0d0e21e 7726
6fc92669 7727 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 7728 sv_force_normal_flags(sv, 0);
1c846c1f 7729
a0d0e21e
LW
7730 if (SvPOK(sv)) {
7731 *lp = SvCUR(sv);
7732 }
7733 else {
748a9306 7734 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 7735 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 7736 OP_NAME(PL_op));
a0d0e21e 7737 }
4633a7c4 7738 else
8d6d96c1 7739 s = sv_2pv_flags(sv, lp, flags);
a0d0e21e
LW
7740 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
7741 STRLEN len = *lp;
1c846c1f 7742
a0d0e21e
LW
7743 if (SvROK(sv))
7744 sv_unref(sv);
7745 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
7746 SvGROW(sv, len + 1);
7747 Move(s,SvPVX(sv),len,char);
7748 SvCUR_set(sv, len);
7749 *SvEND(sv) = '\0';
7750 }
7751 if (!SvPOK(sv)) {
7752 SvPOK_on(sv); /* validate pointer */
7753 SvTAINT(sv);
1d7c1841
GS
7754 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
7755 PTR2UV(sv),SvPVX(sv)));
a0d0e21e
LW
7756 }
7757 }
7758 return SvPVX(sv);
7759}
7760
09540bc3
JH
7761/* sv_pvbyte () is now a macro using Perl_sv_2pv_flags();
7762 * this function provided for binary compatibility only
7763 */
7764
7765char *
7766Perl_sv_pvbyte(pTHX_ SV *sv)
7767{
7768 sv_utf8_downgrade(sv,0);
7769 return sv_pv(sv);
7770}
7771
645c22ef
DM
7772/*
7773=for apidoc sv_pvbyte
7774
baca2b92 7775Use C<SvPVbyte_nolen> instead.
645c22ef 7776
645c22ef
DM
7777=for apidoc sv_pvbyten
7778
7779A private implementation of the C<SvPVbyte> macro for compilers
7780which can't cope with complex macro expressions. Always use the macro
7781instead.
7782
7783=cut
7784*/
7785
7340a771
GS
7786char *
7787Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
7788{
ffebcc3e 7789 sv_utf8_downgrade(sv,0);
7340a771
GS
7790 return sv_pvn(sv,lp);
7791}
7792
645c22ef
DM
7793/*
7794=for apidoc sv_pvbyten_force
7795
7796A private implementation of the C<SvPVbytex_force> macro for compilers
7797which can't cope with complex macro expressions. Always use the macro
7798instead.
7799
7800=cut
7801*/
7802
7340a771
GS
7803char *
7804Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
7805{
ffebcc3e 7806 sv_utf8_downgrade(sv,0);
7340a771
GS
7807 return sv_pvn_force(sv,lp);
7808}
7809
09540bc3
JH
7810/* sv_pvutf8 () is now a macro using Perl_sv_2pv_flags();
7811 * this function provided for binary compatibility only
7812 */
7813
7814char *
7815Perl_sv_pvutf8(pTHX_ SV *sv)
7816{
7817 sv_utf8_upgrade(sv);
7818 return sv_pv(sv);
7819}
7820
645c22ef
DM
7821/*
7822=for apidoc sv_pvutf8
7823
baca2b92 7824Use the C<SvPVutf8_nolen> macro instead
645c22ef 7825
645c22ef
DM
7826=for apidoc sv_pvutf8n
7827
7828A private implementation of the C<SvPVutf8> macro for compilers
7829which can't cope with complex macro expressions. Always use the macro
7830instead.
7831
7832=cut
7833*/
7834
7340a771
GS
7835char *
7836Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
7837{
560a288e 7838 sv_utf8_upgrade(sv);
7340a771
GS
7839 return sv_pvn(sv,lp);
7840}
7841
c461cf8f
JH
7842/*
7843=for apidoc sv_pvutf8n_force
7844
645c22ef
DM
7845A private implementation of the C<SvPVutf8_force> macro for compilers
7846which can't cope with complex macro expressions. Always use the macro
7847instead.
c461cf8f
JH
7848
7849=cut
7850*/
7851
7340a771
GS
7852char *
7853Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
7854{
560a288e 7855 sv_utf8_upgrade(sv);
7340a771
GS
7856 return sv_pvn_force(sv,lp);
7857}
7858
c461cf8f
JH
7859/*
7860=for apidoc sv_reftype
7861
7862Returns a string describing what the SV is a reference to.
7863
7864=cut
7865*/
7866
7340a771 7867char *
864dbfa3 7868Perl_sv_reftype(pTHX_ SV *sv, int ob)
a0d0e21e 7869{
c86bf373 7870 if (ob && SvOBJECT(sv)) {
e27ad1f2
AV
7871 if (HvNAME(SvSTASH(sv)))
7872 return HvNAME(SvSTASH(sv));
7873 else
7874 return "__ANON__";
c86bf373 7875 }
a0d0e21e
LW
7876 else {
7877 switch (SvTYPE(sv)) {
7878 case SVt_NULL:
7879 case SVt_IV:
7880 case SVt_NV:
7881 case SVt_RV:
7882 case SVt_PV:
7883 case SVt_PVIV:
7884 case SVt_PVNV:
7885 case SVt_PVMG:
7886 case SVt_PVBM:
439cb1c4
JP
7887 if (SvVOK(sv))
7888 return "VSTRING";
a0d0e21e
LW
7889 if (SvROK(sv))
7890 return "REF";
7891 else
7892 return "SCALAR";
be65207d
DM
7893
7894 case SVt_PVLV: return SvROK(sv) ? "REF"
7895 /* tied lvalues should appear to be
7896 * scalars for backwards compatitbility */
7897 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
7898 ? "SCALAR" : "LVALUE";
a0d0e21e
LW
7899 case SVt_PVAV: return "ARRAY";
7900 case SVt_PVHV: return "HASH";
7901 case SVt_PVCV: return "CODE";
7902 case SVt_PVGV: return "GLOB";
1d2dff63 7903 case SVt_PVFM: return "FORMAT";
27f9d8f3 7904 case SVt_PVIO: return "IO";
a0d0e21e
LW
7905 default: return "UNKNOWN";
7906 }
7907 }
7908}
7909
954c1994
GS
7910/*
7911=for apidoc sv_isobject
7912
7913Returns a boolean indicating whether the SV is an RV pointing to a blessed
7914object. If the SV is not an RV, or if the object is not blessed, then this
7915will return false.
7916
7917=cut
7918*/
7919
463ee0b2 7920int
864dbfa3 7921Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 7922{
68dc0745 7923 if (!sv)
7924 return 0;
7925 if (SvGMAGICAL(sv))
7926 mg_get(sv);
85e6fe83
LW
7927 if (!SvROK(sv))
7928 return 0;
7929 sv = (SV*)SvRV(sv);
7930 if (!SvOBJECT(sv))
7931 return 0;
7932 return 1;
7933}
7934
954c1994
GS
7935/*
7936=for apidoc sv_isa
7937
7938Returns a boolean indicating whether the SV is blessed into the specified
7939class. This does not check for subtypes; use C<sv_derived_from> to verify
7940an inheritance relationship.
7941
7942=cut
7943*/
7944
85e6fe83 7945int
864dbfa3 7946Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 7947{
68dc0745 7948 if (!sv)
7949 return 0;
7950 if (SvGMAGICAL(sv))
7951 mg_get(sv);
ed6116ce 7952 if (!SvROK(sv))
463ee0b2 7953 return 0;
ed6116ce
LW
7954 sv = (SV*)SvRV(sv);
7955 if (!SvOBJECT(sv))
463ee0b2 7956 return 0;
e27ad1f2
AV
7957 if (!HvNAME(SvSTASH(sv)))
7958 return 0;
463ee0b2
LW
7959
7960 return strEQ(HvNAME(SvSTASH(sv)), name);
7961}
7962
954c1994
GS
7963/*
7964=for apidoc newSVrv
7965
7966Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
7967it will be upgraded to one. If C<classname> is non-null then the new SV will
7968be blessed in the specified package. The new SV is returned and its
7969reference count is 1.
7970
7971=cut
7972*/
7973
463ee0b2 7974SV*
864dbfa3 7975Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 7976{
463ee0b2
LW
7977 SV *sv;
7978
4561caa4 7979 new_SV(sv);
51cf62d8 7980
765f542d 7981 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 7982 SvAMAGIC_off(rv);
51cf62d8 7983
0199fce9
JD
7984 if (SvTYPE(rv) >= SVt_PVMG) {
7985 U32 refcnt = SvREFCNT(rv);
7986 SvREFCNT(rv) = 0;
7987 sv_clear(rv);
7988 SvFLAGS(rv) = 0;
7989 SvREFCNT(rv) = refcnt;
7990 }
7991
51cf62d8 7992 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
7993 sv_upgrade(rv, SVt_RV);
7994 else if (SvTYPE(rv) > SVt_RV) {
7995 (void)SvOOK_off(rv);
7996 if (SvPVX(rv) && SvLEN(rv))
7997 Safefree(SvPVX(rv));
7998 SvCUR_set(rv, 0);
7999 SvLEN_set(rv, 0);
8000 }
51cf62d8
OT
8001
8002 (void)SvOK_off(rv);
053fc874 8003 SvRV(rv) = sv;
ed6116ce 8004 SvROK_on(rv);
463ee0b2 8005
a0d0e21e
LW
8006 if (classname) {
8007 HV* stash = gv_stashpv(classname, TRUE);
8008 (void)sv_bless(rv, stash);
8009 }
8010 return sv;
8011}
8012
954c1994
GS
8013/*
8014=for apidoc sv_setref_pv
8015
8016Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
8017argument will be upgraded to an RV. That RV will be modified to point to
8018the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
8019into the SV. The C<classname> argument indicates the package for the
8020blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8021will have a reference count of 1, and the RV will be returned.
954c1994
GS
8022
8023Do not use with other Perl types such as HV, AV, SV, CV, because those
8024objects will become corrupted by the pointer copy process.
8025
8026Note that C<sv_setref_pvn> copies the string while this copies the pointer.
8027
8028=cut
8029*/
8030
a0d0e21e 8031SV*
864dbfa3 8032Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 8033{
189b2af5 8034 if (!pv) {
3280af22 8035 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
8036 SvSETMAGIC(rv);
8037 }
a0d0e21e 8038 else
56431972 8039 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
8040 return rv;
8041}
8042
954c1994
GS
8043/*
8044=for apidoc sv_setref_iv
8045
8046Copies an integer into a new SV, optionally blessing the SV. The C<rv>
8047argument will be upgraded to an RV. That RV will be modified to point to
8048the new SV. The C<classname> argument indicates the package for the
8049blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8050will have a reference count of 1, and the RV will be returned.
954c1994
GS
8051
8052=cut
8053*/
8054
a0d0e21e 8055SV*
864dbfa3 8056Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
8057{
8058 sv_setiv(newSVrv(rv,classname), iv);
8059 return rv;
8060}
8061
954c1994 8062/*
e1c57cef
JH
8063=for apidoc sv_setref_uv
8064
8065Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
8066argument will be upgraded to an RV. That RV will be modified to point to
8067the new SV. The C<classname> argument indicates the package for the
8068blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8069will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
8070
8071=cut
8072*/
8073
8074SV*
8075Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
8076{
8077 sv_setuv(newSVrv(rv,classname), uv);
8078 return rv;
8079}
8080
8081/*
954c1994
GS
8082=for apidoc sv_setref_nv
8083
8084Copies a double into a new SV, optionally blessing the SV. The C<rv>
8085argument will be upgraded to an RV. That RV will be modified to point to
8086the new SV. The C<classname> argument indicates the package for the
8087blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8088will have a reference count of 1, and the RV will be returned.
954c1994
GS
8089
8090=cut
8091*/
8092
a0d0e21e 8093SV*
65202027 8094Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
8095{
8096 sv_setnv(newSVrv(rv,classname), nv);
8097 return rv;
8098}
463ee0b2 8099
954c1994
GS
8100/*
8101=for apidoc sv_setref_pvn
8102
8103Copies a string into a new SV, optionally blessing the SV. The length of the
8104string must be specified with C<n>. The C<rv> argument will be upgraded to
8105an RV. That RV will be modified to point to the new SV. The C<classname>
8106argument indicates the package for the blessing. Set C<classname> to
d34c2299
JS
8107C<Nullch> to avoid the blessing. The new SV will have a reference count
8108of 1, and the RV will be returned.
954c1994
GS
8109
8110Note that C<sv_setref_pv> copies the pointer while this copies the string.
8111
8112=cut
8113*/
8114
a0d0e21e 8115SV*
864dbfa3 8116Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
8117{
8118 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
8119 return rv;
8120}
8121
954c1994
GS
8122/*
8123=for apidoc sv_bless
8124
8125Blesses an SV into a specified package. The SV must be an RV. The package
8126must be designated by its stash (see C<gv_stashpv()>). The reference count
8127of the SV is unaffected.
8128
8129=cut
8130*/
8131
a0d0e21e 8132SV*
864dbfa3 8133Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 8134{
76e3520e 8135 SV *tmpRef;
a0d0e21e 8136 if (!SvROK(sv))
cea2e8a9 8137 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
8138 tmpRef = SvRV(sv);
8139 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
8140 if (SvREADONLY(tmpRef))
cea2e8a9 8141 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
8142 if (SvOBJECT(tmpRef)) {
8143 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8144 --PL_sv_objcount;
76e3520e 8145 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 8146 }
a0d0e21e 8147 }
76e3520e
GS
8148 SvOBJECT_on(tmpRef);
8149 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8150 ++PL_sv_objcount;
76e3520e
GS
8151 (void)SvUPGRADE(tmpRef, SVt_PVMG);
8152 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
a0d0e21e 8153
2e3febc6
CS
8154 if (Gv_AMG(stash))
8155 SvAMAGIC_on(sv);
8156 else
8157 SvAMAGIC_off(sv);
a0d0e21e 8158
1edbfb88
AB
8159 if(SvSMAGICAL(tmpRef))
8160 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8161 mg_set(tmpRef);
8162
8163
ecdeb87c 8164
a0d0e21e
LW
8165 return sv;
8166}
8167
645c22ef 8168/* Downgrades a PVGV to a PVMG.
645c22ef
DM
8169 */
8170
76e3520e 8171STATIC void
cea2e8a9 8172S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 8173{
850fabdf
GS
8174 void *xpvmg;
8175
a0d0e21e
LW
8176 assert(SvTYPE(sv) == SVt_PVGV);
8177 SvFAKE_off(sv);
8178 if (GvGP(sv))
1edc1566 8179 gp_free((GV*)sv);
e826b3c7
GS
8180 if (GvSTASH(sv)) {
8181 SvREFCNT_dec(GvSTASH(sv));
8182 GvSTASH(sv) = Nullhv;
8183 }
14befaf4 8184 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 8185 Safefree(GvNAME(sv));
a5f75d66 8186 GvMULTI_off(sv);
850fabdf
GS
8187
8188 /* need to keep SvANY(sv) in the right arena */
8189 xpvmg = new_XPVMG();
8190 StructCopy(SvANY(sv), xpvmg, XPVMG);
8191 del_XPVGV(SvANY(sv));
8192 SvANY(sv) = xpvmg;
8193
a0d0e21e
LW
8194 SvFLAGS(sv) &= ~SVTYPEMASK;
8195 SvFLAGS(sv) |= SVt_PVMG;
8196}
8197
954c1994 8198/*
840a7b70 8199=for apidoc sv_unref_flags
954c1994
GS
8200
8201Unsets the RV status of the SV, and decrements the reference count of
8202whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
8203as a reversal of C<newSVrv>. The C<cflags> argument can contain
8204C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8205(otherwise the decrementing is conditional on the reference count being
8206different from one or the reference being a readonly SV).
7889fe52 8207See C<SvROK_off>.
954c1994
GS
8208
8209=cut
8210*/
8211
ed6116ce 8212void
840a7b70 8213Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 8214{
a0d0e21e 8215 SV* rv = SvRV(sv);
810b8aa5
GS
8216
8217 if (SvWEAKREF(sv)) {
8218 sv_del_backref(sv);
8219 SvWEAKREF_off(sv);
8220 SvRV(sv) = 0;
8221 return;
8222 }
ed6116ce
LW
8223 SvRV(sv) = 0;
8224 SvROK_off(sv);
04ca4930
NC
8225 /* You can't have a || SvREADONLY(rv) here, as $a = $$a, where $a was
8226 assigned to as BEGIN {$a = \"Foo"} will fail. */
8227 if (SvREFCNT(rv) != 1 || (flags & SV_IMMEDIATE_UNREF))
4633a7c4 8228 SvREFCNT_dec(rv);
840a7b70 8229 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 8230 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 8231}
8990e307 8232
840a7b70
IZ
8233/*
8234=for apidoc sv_unref
8235
8236Unsets the RV status of the SV, and decrements the reference count of
8237whatever was being referenced by the RV. This can almost be thought of
8238as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 8239being zero. See C<SvROK_off>.
840a7b70
IZ
8240
8241=cut
8242*/
8243
8244void
8245Perl_sv_unref(pTHX_ SV *sv)
8246{
8247 sv_unref_flags(sv, 0);
8248}
8249
645c22ef
DM
8250/*
8251=for apidoc sv_taint
8252
8253Taint an SV. Use C<SvTAINTED_on> instead.
8254=cut
8255*/
8256
bbce6d69 8257void
864dbfa3 8258Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 8259{
14befaf4 8260 sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
bbce6d69 8261}
8262
645c22ef
DM
8263/*
8264=for apidoc sv_untaint
8265
8266Untaint an SV. Use C<SvTAINTED_off> instead.
8267=cut
8268*/
8269
bbce6d69 8270void
864dbfa3 8271Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 8272{
13f57bf8 8273 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8274 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 8275 if (mg)
565764a8 8276 mg->mg_len &= ~1;
36477c24 8277 }
bbce6d69 8278}
8279
645c22ef
DM
8280/*
8281=for apidoc sv_tainted
8282
8283Test an SV for taintedness. Use C<SvTAINTED> instead.
8284=cut
8285*/
8286
bbce6d69 8287bool
864dbfa3 8288Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 8289{
13f57bf8 8290 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8291 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
155aba94 8292 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 8293 return TRUE;
8294 }
8295 return FALSE;
bbce6d69 8296}
8297
09540bc3
JH
8298/*
8299=for apidoc sv_setpviv
8300
8301Copies an integer into the given SV, also updating its string value.
8302Does not handle 'set' magic. See C<sv_setpviv_mg>.
8303
8304=cut
8305*/
8306
8307void
8308Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
8309{
8310 char buf[TYPE_CHARS(UV)];
8311 char *ebuf;
8312 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8313
8314 sv_setpvn(sv, ptr, ebuf - ptr);
8315}
8316
8317/*
8318=for apidoc sv_setpviv_mg
8319
8320Like C<sv_setpviv>, but also handles 'set' magic.
8321
8322=cut
8323*/
8324
8325void
8326Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
8327{
8328 char buf[TYPE_CHARS(UV)];
8329 char *ebuf;
8330 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8331
8332 sv_setpvn(sv, ptr, ebuf - ptr);
8333 SvSETMAGIC(sv);
8334}
8335
cea2e8a9 8336#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8337
8338/* pTHX_ magic can't cope with varargs, so this is a no-context
8339 * version of the main function, (which may itself be aliased to us).
8340 * Don't access this version directly.
8341 */
8342
cea2e8a9
GS
8343void
8344Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
8345{
8346 dTHX;
8347 va_list args;
8348 va_start(args, pat);
c5be433b 8349 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
8350 va_end(args);
8351}
8352
645c22ef
DM
8353/* pTHX_ magic can't cope with varargs, so this is a no-context
8354 * version of the main function, (which may itself be aliased to us).
8355 * Don't access this version directly.
8356 */
cea2e8a9
GS
8357
8358void
8359Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
8360{
8361 dTHX;
8362 va_list args;
8363 va_start(args, pat);
c5be433b 8364 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 8365 va_end(args);
cea2e8a9
GS
8366}
8367#endif
8368
954c1994
GS
8369/*
8370=for apidoc sv_setpvf
8371
8372Processes its arguments like C<sprintf> and sets an SV to the formatted
8373output. Does not handle 'set' magic. See C<sv_setpvf_mg>.
8374
8375=cut
8376*/
8377
46fc3d4c 8378void
864dbfa3 8379Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8380{
8381 va_list args;
46fc3d4c 8382 va_start(args, pat);
c5be433b 8383 sv_vsetpvf(sv, pat, &args);
46fc3d4c 8384 va_end(args);
8385}
8386
645c22ef
DM
8387/* backend for C<sv_setpvf> and C<sv_setpvf_nocontext> */
8388
c5be433b
GS
8389void
8390Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8391{
8392 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8393}
ef50df4b 8394
954c1994
GS
8395/*
8396=for apidoc sv_setpvf_mg
8397
8398Like C<sv_setpvf>, but also handles 'set' magic.
8399
8400=cut
8401*/
8402
ef50df4b 8403void
864dbfa3 8404Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8405{
8406 va_list args;
ef50df4b 8407 va_start(args, pat);
c5be433b 8408 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 8409 va_end(args);
c5be433b
GS
8410}
8411
645c22ef
DM
8412/* backend for C<sv_setpvf_mg> C<setpvf_mg_nocontext> */
8413
c5be433b
GS
8414void
8415Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8416{
8417 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
8418 SvSETMAGIC(sv);
8419}
8420
cea2e8a9 8421#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8422
8423/* pTHX_ magic can't cope with varargs, so this is a no-context
8424 * version of the main function, (which may itself be aliased to us).
8425 * Don't access this version directly.
8426 */
8427
cea2e8a9
GS
8428void
8429Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
8430{
8431 dTHX;
8432 va_list args;
8433 va_start(args, pat);
c5be433b 8434 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
8435 va_end(args);
8436}
8437
645c22ef
DM
8438/* pTHX_ magic can't cope with varargs, so this is a no-context
8439 * version of the main function, (which may itself be aliased to us).
8440 * Don't access this version directly.
8441 */
8442
cea2e8a9
GS
8443void
8444Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
8445{
8446 dTHX;
8447 va_list args;
8448 va_start(args, pat);
c5be433b 8449 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 8450 va_end(args);
cea2e8a9
GS
8451}
8452#endif
8453
954c1994
GS
8454/*
8455=for apidoc sv_catpvf
8456
d5ce4a7c
GA
8457Processes its arguments like C<sprintf> and appends the formatted
8458output to an SV. If the appended data contains "wide" characters
8459(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
8460and characters >255 formatted with %c), the original SV might get
8461upgraded to UTF-8. Handles 'get' magic, but not 'set' magic.
8462C<SvSETMAGIC()> must typically be called after calling this function
8463to handle 'set' magic.
954c1994 8464
d5ce4a7c 8465=cut */
954c1994 8466
46fc3d4c 8467void
864dbfa3 8468Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8469{
8470 va_list args;
46fc3d4c 8471 va_start(args, pat);
c5be433b 8472 sv_vcatpvf(sv, pat, &args);
46fc3d4c 8473 va_end(args);
8474}
8475
645c22ef
DM
8476/* backend for C<sv_catpvf> and C<catpvf_mg_nocontext> */
8477
ef50df4b 8478void
c5be433b
GS
8479Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8480{
8481 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8482}
8483
954c1994
GS
8484/*
8485=for apidoc sv_catpvf_mg
8486
8487Like C<sv_catpvf>, but also handles 'set' magic.
8488
8489=cut
8490*/
8491
c5be433b 8492void
864dbfa3 8493Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8494{
8495 va_list args;
ef50df4b 8496 va_start(args, pat);
c5be433b 8497 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 8498 va_end(args);
c5be433b
GS
8499}
8500
645c22ef
DM
8501/* backend for C<catpvf_mg> and C<catpvf_mg_nocontext> */
8502
c5be433b
GS
8503void
8504Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8505{
8506 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
8507 SvSETMAGIC(sv);
8508}
8509
954c1994
GS
8510/*
8511=for apidoc sv_vsetpvfn
8512
8513Works like C<vcatpvfn> but copies the text into the SV instead of
8514appending it.
8515
645c22ef
DM
8516Usually used via one of its frontends C<sv_setpvf> and C<sv_setpvf_mg>.
8517
954c1994
GS
8518=cut
8519*/
8520
46fc3d4c 8521void
7d5ea4e7 8522Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8523{
8524 sv_setpvn(sv, "", 0);
7d5ea4e7 8525 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 8526}
8527
645c22ef
DM
8528/* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
8529
2d00ba3b 8530STATIC I32
9dd79c3f 8531S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
8532{
8533 I32 var = 0;
8534 switch (**pattern) {
8535 case '1': case '2': case '3':
8536 case '4': case '5': case '6':
8537 case '7': case '8': case '9':
8538 while (isDIGIT(**pattern))
8539 var = var * 10 + (*(*pattern)++ - '0');
8540 }
8541 return var;
8542}
9dd79c3f 8543#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 8544
4151a5fe
IZ
8545static char *
8546F0convert(NV nv, char *endbuf, STRLEN *len)
8547{
8548 int neg = nv < 0;
8549 UV uv;
8550 char *p = endbuf;
8551
8552 if (neg)
8553 nv = -nv;
8554 if (nv < UV_MAX) {
8555 nv += 0.5;
8556 uv = nv;
8557 if (uv & 1 && uv == nv)
8558 uv--; /* Round to even */
8559 do {
8560 unsigned dig = uv % 10;
8561 *--p = '0' + dig;
8562 } while (uv /= 10);
8563 if (neg)
8564 *--p = '-';
8565 *len = endbuf - p;
8566 return p;
8567 }
8568 return Nullch;
8569}
8570
8571
954c1994
GS
8572/*
8573=for apidoc sv_vcatpvfn
8574
8575Processes its arguments like C<vsprintf> and appends the formatted output
8576to an SV. Uses an array of SVs if the C style variable argument list is
8577missing (NULL). When running with taint checks enabled, indicates via
8578C<maybe_tainted> if results are untrustworthy (often due to the use of
8579locales).
8580
645c22ef
DM
8581Usually used via one of its frontends C<sv_catpvf> and C<sv_catpvf_mg>.
8582
954c1994
GS
8583=cut
8584*/
8585
46fc3d4c 8586void
7d5ea4e7 8587Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8588{
8589 char *p;
8590 char *q;
8591 char *patend;
fc36a67e 8592 STRLEN origlen;
46fc3d4c 8593 I32 svix = 0;
c635e13b 8594 static char nullstr[] = "(null)";
9c5ffd7c 8595 SV *argsv = Nullsv;
db79b45b
JH
8596 bool has_utf8; /* has the result utf8? */
8597 bool pat_utf8; /* the pattern is in utf8? */
8598 SV *nsv = Nullsv;
4151a5fe
IZ
8599 /* Times 4: a decimal digit takes more than 3 binary digits.
8600 * NV_DIG: mantissa takes than many decimal digits.
8601 * Plus 32: Playing safe. */
8602 char ebuf[IV_DIG * 4 + NV_DIG + 32];
8603 /* large enough for "%#.#f" --chip */
8604 /* what about long double NVs? --jhi */
db79b45b
JH
8605
8606 has_utf8 = pat_utf8 = DO_UTF8(sv);
46fc3d4c 8607
8608 /* no matter what, this is a string now */
fc36a67e 8609 (void)SvPV_force(sv, origlen);
46fc3d4c 8610
fc36a67e 8611 /* special-case "", "%s", and "%_" */
46fc3d4c 8612 if (patlen == 0)
8613 return;
fc36a67e 8614 if (patlen == 2 && pat[0] == '%') {
8615 switch (pat[1]) {
8616 case 's':
c635e13b 8617 if (args) {
8618 char *s = va_arg(*args, char*);
8619 sv_catpv(sv, s ? s : nullstr);
8620 }
7e2040f0 8621 else if (svix < svmax) {
fc36a67e 8622 sv_catsv(sv, *svargs);
7e2040f0
GS
8623 if (DO_UTF8(*svargs))
8624 SvUTF8_on(sv);
8625 }
fc36a67e 8626 return;
8627 case '_':
8628 if (args) {
7e2040f0
GS
8629 argsv = va_arg(*args, SV*);
8630 sv_catsv(sv, argsv);
8631 if (DO_UTF8(argsv))
8632 SvUTF8_on(sv);
fc36a67e 8633 return;
8634 }
8635 /* See comment on '_' below */
8636 break;
8637 }
46fc3d4c 8638 }
8639
1d917b39 8640#ifndef USE_LONG_DOUBLE
4151a5fe
IZ
8641 /* special-case "%.<number>[gf]" */
8642 if ( patlen <= 5 && pat[0] == '%' && pat[1] == '.'
8643 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
8644 unsigned digits = 0;
8645 const char *pp;
8646
8647 pp = pat + 2;
8648 while (*pp >= '0' && *pp <= '9')
8649 digits = 10 * digits + (*pp++ - '0');
8650 if (pp - pat == patlen - 1) {
8651 NV nv;
8652
8653 if (args)
8654 nv = (NV)va_arg(*args, double);
8655 else if (svix < svmax)
8656 nv = SvNV(*svargs);
8657 else
8658 return;
8659 if (*pp == 'g') {
8660 if (digits < sizeof(ebuf) - NV_DIG - 10) { /* 0, point, slack */
2e59c212 8661 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
8662 sv_catpv(sv, ebuf);
8663 if (*ebuf) /* May return an empty string for digits==0 */
8664 return;
8665 }
8666 } else if (!digits) {
8667 STRLEN l;
8668
8669 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
8670 sv_catpvn(sv, p, l);
8671 return;
8672 }
8673 }
8674 }
8675 }
1d917b39 8676#endif /* !USE_LONG_DOUBLE */
4151a5fe 8677
2cf2cfc6 8678 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 8679 has_utf8 = TRUE;
2cf2cfc6 8680
46fc3d4c 8681 patend = (char*)pat + patlen;
8682 for (p = (char*)pat; p < patend; p = q) {
8683 bool alt = FALSE;
8684 bool left = FALSE;
b22c7a20 8685 bool vectorize = FALSE;
211dfcf1 8686 bool vectorarg = FALSE;
2cf2cfc6 8687 bool vec_utf8 = FALSE;
46fc3d4c 8688 char fill = ' ';
8689 char plus = 0;
8690 char intsize = 0;
8691 STRLEN width = 0;
fc36a67e 8692 STRLEN zeros = 0;
46fc3d4c 8693 bool has_precis = FALSE;
8694 STRLEN precis = 0;
58e33a90 8695 I32 osvix = svix;
2cf2cfc6 8696 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
8697#ifdef HAS_LDBL_SPRINTF_BUG
8698 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 8699 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
8700 bool fix_ldbl_sprintf_bug = FALSE;
8701#endif
205f51d8 8702
46fc3d4c 8703 char esignbuf[4];
ad391ad9 8704 U8 utf8buf[UTF8_MAXLEN+1];
46fc3d4c 8705 STRLEN esignlen = 0;
8706
8707 char *eptr = Nullch;
fc36a67e 8708 STRLEN elen = 0;
81f715da 8709 SV *vecsv = Nullsv;
a05b299f 8710 U8 *vecstr = Null(U8*);
b22c7a20 8711 STRLEN veclen = 0;
934abaf1 8712 char c = 0;
46fc3d4c 8713 int i;
9c5ffd7c 8714 unsigned base = 0;
8c8eb53c
RB
8715 IV iv = 0;
8716 UV uv = 0;
9e5b023a
JH
8717 /* we need a long double target in case HAS_LONG_DOUBLE but
8718 not USE_LONG_DOUBLE
8719 */
35fff930 8720#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
8721 long double nv;
8722#else
65202027 8723 NV nv;
9e5b023a 8724#endif
46fc3d4c 8725 STRLEN have;
8726 STRLEN need;
8727 STRLEN gap;
b22c7a20
GS
8728 char *dotstr = ".";
8729 STRLEN dotstrlen = 1;
211dfcf1 8730 I32 efix = 0; /* explicit format parameter index */
eb3fce90 8731 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
8732 I32 epix = 0; /* explicit precision index */
8733 I32 evix = 0; /* explicit vector index */
eb3fce90 8734 bool asterisk = FALSE;
46fc3d4c 8735
211dfcf1 8736 /* echo everything up to the next format specification */
46fc3d4c 8737 for (q = p; q < patend && *q != '%'; ++q) ;
8738 if (q > p) {
db79b45b
JH
8739 if (has_utf8 && !pat_utf8)
8740 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
8741 else
8742 sv_catpvn(sv, p, q - p);
46fc3d4c 8743 p = q;
8744 }
8745 if (q++ >= patend)
8746 break;
8747
211dfcf1
HS
8748/*
8749 We allow format specification elements in this order:
8750 \d+\$ explicit format parameter index
8751 [-+ 0#]+ flags
a472f209 8752 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 8753 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
8754 \d+|\*(\d+\$)? width using optional (optionally specified) arg
8755 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
8756 [hlqLV] size
8757 [%bcdefginopsux_DFOUX] format (mandatory)
8758*/
8759 if (EXPECT_NUMBER(q, width)) {
8760 if (*q == '$') {
8761 ++q;
8762 efix = width;
8763 } else {
8764 goto gotwidth;
8765 }
8766 }
8767
fc36a67e 8768 /* FLAGS */
8769
46fc3d4c 8770 while (*q) {
8771 switch (*q) {
8772 case ' ':
8773 case '+':
8774 plus = *q++;
8775 continue;
8776
8777 case '-':
8778 left = TRUE;
8779 q++;
8780 continue;
8781
8782 case '0':
8783 fill = *q++;
8784 continue;
8785
8786 case '#':
8787 alt = TRUE;
8788 q++;
8789 continue;
8790
fc36a67e 8791 default:
8792 break;
8793 }
8794 break;
8795 }
46fc3d4c 8796
211dfcf1 8797 tryasterisk:
eb3fce90 8798 if (*q == '*') {
211dfcf1
HS
8799 q++;
8800 if (EXPECT_NUMBER(q, ewix))
8801 if (*q++ != '$')
8802 goto unknown;
eb3fce90 8803 asterisk = TRUE;
211dfcf1
HS
8804 }
8805 if (*q == 'v') {
eb3fce90 8806 q++;
211dfcf1
HS
8807 if (vectorize)
8808 goto unknown;
9cbac4c7 8809 if ((vectorarg = asterisk)) {
211dfcf1
HS
8810 evix = ewix;
8811 ewix = 0;
8812 asterisk = FALSE;
8813 }
8814 vectorize = TRUE;
8815 goto tryasterisk;
eb3fce90
JH
8816 }
8817
211dfcf1 8818 if (!asterisk)
f3583277
RB
8819 if( *q == '0' )
8820 fill = *q++;
211dfcf1
HS
8821 EXPECT_NUMBER(q, width);
8822
8823 if (vectorize) {
8824 if (vectorarg) {
8825 if (args)
8826 vecsv = va_arg(*args, SV*);
8827 else
8828 vecsv = (evix ? evix <= svmax : svix < svmax) ?
3a7a539e 8829 svargs[evix ? evix-1 : svix++] : &PL_sv_undef;
4459522c 8830 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1 8831 if (DO_UTF8(vecsv))
2cf2cfc6 8832 is_utf8 = TRUE;
211dfcf1
HS
8833 }
8834 if (args) {
8835 vecsv = va_arg(*args, SV*);
8836 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 8837 vec_utf8 = DO_UTF8(vecsv);
eb3fce90 8838 }
211dfcf1
HS
8839 else if (efix ? efix <= svmax : svix < svmax) {
8840 vecsv = svargs[efix ? efix-1 : svix++];
8841 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 8842 vec_utf8 = DO_UTF8(vecsv);
211dfcf1
HS
8843 }
8844 else {
8845 vecstr = (U8*)"";
8846 veclen = 0;
8847 }
eb3fce90 8848 }
fc36a67e 8849
eb3fce90 8850 if (asterisk) {
fc36a67e 8851 if (args)
8852 i = va_arg(*args, int);
8853 else
eb3fce90
JH
8854 i = (ewix ? ewix <= svmax : svix < svmax) ?
8855 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8856 left |= (i < 0);
8857 width = (i < 0) ? -i : i;
fc36a67e 8858 }
211dfcf1 8859 gotwidth:
fc36a67e 8860
8861 /* PRECISION */
46fc3d4c 8862
fc36a67e 8863 if (*q == '.') {
8864 q++;
8865 if (*q == '*') {
211dfcf1 8866 q++;
7b8dd722
HS
8867 if (EXPECT_NUMBER(q, epix) && *q++ != '$')
8868 goto unknown;
8869 /* XXX: todo, support specified precision parameter */
8870 if (epix)
211dfcf1 8871 goto unknown;
46fc3d4c 8872 if (args)
8873 i = va_arg(*args, int);
8874 else
eb3fce90
JH
8875 i = (ewix ? ewix <= svmax : svix < svmax)
8876 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8877 precis = (i < 0) ? 0 : i;
fc36a67e 8878 }
8879 else {
8880 precis = 0;
8881 while (isDIGIT(*q))
8882 precis = precis * 10 + (*q++ - '0');
8883 }
8884 has_precis = TRUE;
8885 }
46fc3d4c 8886
fc36a67e 8887 /* SIZE */
46fc3d4c 8888
fc36a67e 8889 switch (*q) {
c623ac67
GS
8890#ifdef WIN32
8891 case 'I': /* Ix, I32x, and I64x */
8892# ifdef WIN64
8893 if (q[1] == '6' && q[2] == '4') {
8894 q += 3;
8895 intsize = 'q';
8896 break;
8897 }
8898# endif
8899 if (q[1] == '3' && q[2] == '2') {
8900 q += 3;
8901 break;
8902 }
8903# ifdef WIN64
8904 intsize = 'q';
8905# endif
8906 q++;
8907 break;
8908#endif
9e5b023a 8909#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 8910 case 'L': /* Ld */
e5c81feb 8911 /* FALL THROUGH */
e5c81feb 8912#ifdef HAS_QUAD
6f9bb7fd 8913 case 'q': /* qd */
9e5b023a 8914#endif
6f9bb7fd
GS
8915 intsize = 'q';
8916 q++;
8917 break;
8918#endif
fc36a67e 8919 case 'l':
9e5b023a 8920#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 8921 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 8922 intsize = 'q';
8923 q += 2;
46fc3d4c 8924 break;
cf2093f6 8925 }
fc36a67e 8926#endif
6f9bb7fd 8927 /* FALL THROUGH */
fc36a67e 8928 case 'h':
cf2093f6 8929 /* FALL THROUGH */
fc36a67e 8930 case 'V':
8931 intsize = *q++;
46fc3d4c 8932 break;
8933 }
8934
fc36a67e 8935 /* CONVERSION */
8936
211dfcf1
HS
8937 if (*q == '%') {
8938 eptr = q++;
8939 elen = 1;
8940 goto string;
8941 }
8942
be75b157
HS
8943 if (vectorize)
8944 argsv = vecsv;
8945 else if (!args)
211dfcf1
HS
8946 argsv = (efix ? efix <= svmax : svix < svmax) ?
8947 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
8948
46fc3d4c 8949 switch (c = *q++) {
8950
8951 /* STRINGS */
8952
46fc3d4c 8953 case 'c':
be75b157 8954 uv = (args && !vectorize) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
8955 if ((uv > 255 ||
8956 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 8957 && !IN_BYTES) {
dfe13c55 8958 eptr = (char*)utf8buf;
9041c2e3 8959 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 8960 is_utf8 = TRUE;
7e2040f0
GS
8961 }
8962 else {
8963 c = (char)uv;
8964 eptr = &c;
8965 elen = 1;
a0ed51b3 8966 }
46fc3d4c 8967 goto string;
8968
46fc3d4c 8969 case 's':
be75b157 8970 if (args && !vectorize) {
fc36a67e 8971 eptr = va_arg(*args, char*);
c635e13b 8972 if (eptr)
1d7c1841
GS
8973#ifdef MACOS_TRADITIONAL
8974 /* On MacOS, %#s format is used for Pascal strings */
8975 if (alt)
8976 elen = *eptr++;
8977 else
8978#endif
c635e13b 8979 elen = strlen(eptr);
8980 else {
8981 eptr = nullstr;
8982 elen = sizeof nullstr - 1;
8983 }
46fc3d4c 8984 }
211dfcf1 8985 else {
7e2040f0
GS
8986 eptr = SvPVx(argsv, elen);
8987 if (DO_UTF8(argsv)) {
a0ed51b3
LW
8988 if (has_precis && precis < elen) {
8989 I32 p = precis;
7e2040f0 8990 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
8991 precis = p;
8992 }
8993 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 8994 width += elen - sv_len_utf8(argsv);
a0ed51b3 8995 }
2cf2cfc6 8996 is_utf8 = TRUE;
a0ed51b3
LW
8997 }
8998 }
46fc3d4c 8999 goto string;
9000
fc36a67e 9001 case '_':
9002 /*
9003 * The "%_" hack might have to be changed someday,
9004 * if ISO or ANSI decide to use '_' for something.
9005 * So we keep it hidden from users' code.
9006 */
be75b157 9007 if (!args || vectorize)
fc36a67e 9008 goto unknown;
211dfcf1 9009 argsv = va_arg(*args, SV*);
7e2040f0
GS
9010 eptr = SvPVx(argsv, elen);
9011 if (DO_UTF8(argsv))
2cf2cfc6 9012 is_utf8 = TRUE;
fc36a67e 9013
46fc3d4c 9014 string:
b22c7a20 9015 vectorize = FALSE;
46fc3d4c 9016 if (has_precis && elen > precis)
9017 elen = precis;
9018 break;
9019
9020 /* INTEGERS */
9021
fc36a67e 9022 case 'p':
be75b157 9023 if (alt || vectorize)
c2e66d9e 9024 goto unknown;
211dfcf1 9025 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 9026 base = 16;
9027 goto integer;
9028
46fc3d4c 9029 case 'D':
29fe7a80 9030#ifdef IV_IS_QUAD
22f3ae8c 9031 intsize = 'q';
29fe7a80 9032#else
46fc3d4c 9033 intsize = 'l';
29fe7a80 9034#endif
46fc3d4c 9035 /* FALL THROUGH */
9036 case 'd':
9037 case 'i':
b22c7a20 9038 if (vectorize) {
ba210ebe 9039 STRLEN ulen;
211dfcf1
HS
9040 if (!veclen)
9041 continue;
2cf2cfc6
A
9042 if (vec_utf8)
9043 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9044 UTF8_ALLOW_ANYUV);
b22c7a20 9045 else {
e83d50c9 9046 uv = *vecstr;
b22c7a20
GS
9047 ulen = 1;
9048 }
9049 vecstr += ulen;
9050 veclen -= ulen;
e83d50c9
JP
9051 if (plus)
9052 esignbuf[esignlen++] = plus;
b22c7a20
GS
9053 }
9054 else if (args) {
46fc3d4c 9055 switch (intsize) {
9056 case 'h': iv = (short)va_arg(*args, int); break;
9057 default: iv = va_arg(*args, int); break;
9058 case 'l': iv = va_arg(*args, long); break;
fc36a67e 9059 case 'V': iv = va_arg(*args, IV); break;
cf2093f6
JH
9060#ifdef HAS_QUAD
9061 case 'q': iv = va_arg(*args, Quad_t); break;
9062#endif
46fc3d4c 9063 }
9064 }
9065 else {
211dfcf1 9066 iv = SvIVx(argsv);
46fc3d4c 9067 switch (intsize) {
9068 case 'h': iv = (short)iv; break;
be28567c 9069 default: break;
46fc3d4c 9070 case 'l': iv = (long)iv; break;
fc36a67e 9071 case 'V': break;
cf2093f6
JH
9072#ifdef HAS_QUAD
9073 case 'q': iv = (Quad_t)iv; break;
9074#endif
46fc3d4c 9075 }
9076 }
e83d50c9
JP
9077 if ( !vectorize ) /* we already set uv above */
9078 {
9079 if (iv >= 0) {
9080 uv = iv;
9081 if (plus)
9082 esignbuf[esignlen++] = plus;
9083 }
9084 else {
9085 uv = -iv;
9086 esignbuf[esignlen++] = '-';
9087 }
46fc3d4c 9088 }
9089 base = 10;
9090 goto integer;
9091
fc36a67e 9092 case 'U':
29fe7a80 9093#ifdef IV_IS_QUAD
22f3ae8c 9094 intsize = 'q';
29fe7a80 9095#else
fc36a67e 9096 intsize = 'l';
29fe7a80 9097#endif
fc36a67e 9098 /* FALL THROUGH */
9099 case 'u':
9100 base = 10;
9101 goto uns_integer;
9102
4f19785b
WSI
9103 case 'b':
9104 base = 2;
9105 goto uns_integer;
9106
46fc3d4c 9107 case 'O':
29fe7a80 9108#ifdef IV_IS_QUAD
22f3ae8c 9109 intsize = 'q';
29fe7a80 9110#else
46fc3d4c 9111 intsize = 'l';
29fe7a80 9112#endif
46fc3d4c 9113 /* FALL THROUGH */
9114 case 'o':
9115 base = 8;
9116 goto uns_integer;
9117
9118 case 'X':
46fc3d4c 9119 case 'x':
9120 base = 16;
46fc3d4c 9121
9122 uns_integer:
b22c7a20 9123 if (vectorize) {
ba210ebe 9124 STRLEN ulen;
b22c7a20 9125 vector:
211dfcf1
HS
9126 if (!veclen)
9127 continue;
2cf2cfc6
A
9128 if (vec_utf8)
9129 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9130 UTF8_ALLOW_ANYUV);
b22c7a20 9131 else {
a05b299f 9132 uv = *vecstr;
b22c7a20
GS
9133 ulen = 1;
9134 }
9135 vecstr += ulen;
9136 veclen -= ulen;
9137 }
9138 else if (args) {
46fc3d4c 9139 switch (intsize) {
9140 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
9141 default: uv = va_arg(*args, unsigned); break;
9142 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 9143 case 'V': uv = va_arg(*args, UV); break;
cf2093f6
JH
9144#ifdef HAS_QUAD
9145 case 'q': uv = va_arg(*args, Quad_t); break;
9146#endif
46fc3d4c 9147 }
9148 }
9149 else {
211dfcf1 9150 uv = SvUVx(argsv);
46fc3d4c 9151 switch (intsize) {
9152 case 'h': uv = (unsigned short)uv; break;
be28567c 9153 default: break;
46fc3d4c 9154 case 'l': uv = (unsigned long)uv; break;
fc36a67e 9155 case 'V': break;
cf2093f6
JH
9156#ifdef HAS_QUAD
9157 case 'q': uv = (Quad_t)uv; break;
9158#endif
46fc3d4c 9159 }
9160 }
9161
9162 integer:
46fc3d4c 9163 eptr = ebuf + sizeof ebuf;
fc36a67e 9164 switch (base) {
9165 unsigned dig;
9166 case 16:
c10ed8b9
HS
9167 if (!uv)
9168 alt = FALSE;
1d7c1841
GS
9169 p = (char*)((c == 'X')
9170 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 9171 do {
9172 dig = uv & 15;
9173 *--eptr = p[dig];
9174 } while (uv >>= 4);
9175 if (alt) {
46fc3d4c 9176 esignbuf[esignlen++] = '0';
fc36a67e 9177 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 9178 }
fc36a67e 9179 break;
9180 case 8:
9181 do {
9182 dig = uv & 7;
9183 *--eptr = '0' + dig;
9184 } while (uv >>= 3);
9185 if (alt && *eptr != '0')
9186 *--eptr = '0';
9187 break;
4f19785b
WSI
9188 case 2:
9189 do {
9190 dig = uv & 1;
9191 *--eptr = '0' + dig;
9192 } while (uv >>= 1);
eda88b6d
JH
9193 if (alt) {
9194 esignbuf[esignlen++] = '0';
7481bb52 9195 esignbuf[esignlen++] = 'b';
eda88b6d 9196 }
4f19785b 9197 break;
fc36a67e 9198 default: /* it had better be ten or less */
6bc102ca 9199#if defined(PERL_Y2KWARN)
e476b1b5 9200 if (ckWARN(WARN_Y2K)) {
6bc102ca
GS
9201 STRLEN n;
9202 char *s = SvPV(sv,n);
9203 if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
9204 && (n == 2 || !isDIGIT(s[n-3])))
9205 {
9014280d 9206 Perl_warner(aTHX_ packWARN(WARN_Y2K),
6bc102ca
GS
9207 "Possible Y2K bug: %%%c %s",
9208 c, "format string following '19'");
9209 }
9210 }
9211#endif
fc36a67e 9212 do {
9213 dig = uv % base;
9214 *--eptr = '0' + dig;
9215 } while (uv /= base);
9216 break;
46fc3d4c 9217 }
9218 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
9219 if (has_precis) {
9220 if (precis > elen)
9221 zeros = precis - elen;
9222 else if (precis == 0 && elen == 1 && *eptr == '0')
9223 elen = 0;
9224 }
46fc3d4c 9225 break;
9226
9227 /* FLOATING POINT */
9228
fc36a67e 9229 case 'F':
9230 c = 'f'; /* maybe %F isn't supported here */
9231 /* FALL THROUGH */
46fc3d4c 9232 case 'e': case 'E':
fc36a67e 9233 case 'f':
46fc3d4c 9234 case 'g': case 'G':
9235
9236 /* This is evil, but floating point is even more evil */
9237
9e5b023a
JH
9238 /* for SV-style calling, we can only get NV
9239 for C-style calling, we assume %f is double;
9240 for simplicity we allow any of %Lf, %llf, %qf for long double
9241 */
9242 switch (intsize) {
9243 case 'V':
9244#if defined(USE_LONG_DOUBLE)
9245 intsize = 'q';
9246#endif
9247 break;
8a2e3f14 9248/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364
HS
9249 case 'l':
9250 /* FALL THROUGH */
9e5b023a
JH
9251 default:
9252#if defined(USE_LONG_DOUBLE)
9253 intsize = args ? 0 : 'q';
9254#endif
9255 break;
9256 case 'q':
9257#if defined(HAS_LONG_DOUBLE)
9258 break;
9259#else
9260 /* FALL THROUGH */
9261#endif
9262 case 'h':
9e5b023a
JH
9263 goto unknown;
9264 }
9265
9266 /* now we need (long double) if intsize == 'q', else (double) */
be75b157 9267 nv = (args && !vectorize) ?
35fff930
JH
9268#if LONG_DOUBLESIZE > DOUBLESIZE
9269 intsize == 'q' ?
205f51d8
AS
9270 va_arg(*args, long double) :
9271 va_arg(*args, double)
35fff930 9272#else
205f51d8 9273 va_arg(*args, double)
35fff930 9274#endif
9e5b023a 9275 : SvNVx(argsv);
fc36a67e 9276
9277 need = 0;
be75b157 9278 vectorize = FALSE;
fc36a67e 9279 if (c != 'e' && c != 'E') {
9280 i = PERL_INT_MIN;
9e5b023a
JH
9281 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9282 will cast our (long double) to (double) */
73b309ea 9283 (void)Perl_frexp(nv, &i);
fc36a67e 9284 if (i == PERL_INT_MIN)
cea2e8a9 9285 Perl_die(aTHX_ "panic: frexp");
c635e13b 9286 if (i > 0)
fc36a67e 9287 need = BIT_DIGITS(i);
9288 }
9289 need += has_precis ? precis : 6; /* known default */
20f6aaab 9290
fc36a67e 9291 if (need < width)
9292 need = width;
9293
20f6aaab
AS
9294#ifdef HAS_LDBL_SPRINTF_BUG
9295 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9296 with sfio - Allen <allens@cpan.org> */
9297
9298# ifdef DBL_MAX
9299# define MY_DBL_MAX DBL_MAX
9300# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9301# if DOUBLESIZE >= 8
9302# define MY_DBL_MAX 1.7976931348623157E+308L
9303# else
9304# define MY_DBL_MAX 3.40282347E+38L
9305# endif
9306# endif
9307
9308# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9309# define MY_DBL_MAX_BUG 1L
20f6aaab 9310# else
205f51d8 9311# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9312# endif
20f6aaab 9313
205f51d8
AS
9314# ifdef DBL_MIN
9315# define MY_DBL_MIN DBL_MIN
9316# else /* XXX guessing! -Allen */
9317# if DOUBLESIZE >= 8
9318# define MY_DBL_MIN 2.2250738585072014E-308L
9319# else
9320# define MY_DBL_MIN 1.17549435E-38L
9321# endif
9322# endif
20f6aaab 9323
205f51d8
AS
9324 if ((intsize == 'q') && (c == 'f') &&
9325 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9326 (need < DBL_DIG)) {
9327 /* it's going to be short enough that
9328 * long double precision is not needed */
9329
9330 if ((nv <= 0L) && (nv >= -0L))
9331 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9332 else {
9333 /* would use Perl_fp_class as a double-check but not
9334 * functional on IRIX - see perl.h comments */
9335
9336 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9337 /* It's within the range that a double can represent */
9338#if defined(DBL_MAX) && !defined(DBL_MIN)
9339 if ((nv >= ((long double)1/DBL_MAX)) ||
9340 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9341#endif
205f51d8 9342 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9343 }
205f51d8
AS
9344 }
9345 if (fix_ldbl_sprintf_bug == TRUE) {
9346 double temp;
9347
9348 intsize = 0;
9349 temp = (double)nv;
9350 nv = (NV)temp;
9351 }
20f6aaab 9352 }
205f51d8
AS
9353
9354# undef MY_DBL_MAX
9355# undef MY_DBL_MAX_BUG
9356# undef MY_DBL_MIN
9357
20f6aaab
AS
9358#endif /* HAS_LDBL_SPRINTF_BUG */
9359
46fc3d4c 9360 need += 20; /* fudge factor */
80252599
GS
9361 if (PL_efloatsize < need) {
9362 Safefree(PL_efloatbuf);
9363 PL_efloatsize = need + 20; /* more fudge */
9364 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9365 PL_efloatbuf[0] = '\0';
46fc3d4c 9366 }
9367
4151a5fe
IZ
9368 if ( !(width || left || plus || alt) && fill != '0'
9369 && has_precis && intsize != 'q' ) { /* Shortcuts */
9370 if ( c == 'g') {
2e59c212 9371 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4151a5fe
IZ
9372 if (*PL_efloatbuf) /* May return an empty string for digits==0 */
9373 goto float_converted;
9374 } else if ( c == 'f' && !precis) {
9375 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9376 break;
9377 }
9378 }
46fc3d4c 9379 eptr = ebuf + sizeof ebuf;
9380 *--eptr = '\0';
9381 *--eptr = c;
9e5b023a
JH
9382 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9383#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
9384 if (intsize == 'q') {
e5c81feb
JH
9385 /* Copy the one or more characters in a long double
9386 * format before the 'base' ([efgEFG]) character to
9387 * the format string. */
9388 static char const prifldbl[] = PERL_PRIfldbl;
9389 char const *p = prifldbl + sizeof(prifldbl) - 3;
9390 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 9391 }
65202027 9392#endif
46fc3d4c 9393 if (has_precis) {
9394 base = precis;
9395 do { *--eptr = '0' + (base % 10); } while (base /= 10);
9396 *--eptr = '.';
9397 }
9398 if (width) {
9399 base = width;
9400 do { *--eptr = '0' + (base % 10); } while (base /= 10);
9401 }
9402 if (fill == '0')
9403 *--eptr = fill;
84902520
TB
9404 if (left)
9405 *--eptr = '-';
46fc3d4c 9406 if (plus)
9407 *--eptr = plus;
9408 if (alt)
9409 *--eptr = '#';
9410 *--eptr = '%';
9411
ff9121f8
JH
9412 /* No taint. Otherwise we are in the strange situation
9413 * where printf() taints but print($float) doesn't.
bda0f7a5 9414 * --jhi */
9e5b023a
JH
9415#if defined(HAS_LONG_DOUBLE)
9416 if (intsize == 'q')
9417 (void)sprintf(PL_efloatbuf, eptr, nv);
9418 else
9419 (void)sprintf(PL_efloatbuf, eptr, (double)nv);
9420#else
dd8482fc 9421 (void)sprintf(PL_efloatbuf, eptr, nv);
9e5b023a 9422#endif
4151a5fe 9423 float_converted:
80252599
GS
9424 eptr = PL_efloatbuf;
9425 elen = strlen(PL_efloatbuf);
46fc3d4c 9426 break;
9427
fc36a67e 9428 /* SPECIAL */
9429
9430 case 'n':
9431 i = SvCUR(sv) - origlen;
be75b157 9432 if (args && !vectorize) {
c635e13b 9433 switch (intsize) {
9434 case 'h': *(va_arg(*args, short*)) = i; break;
9435 default: *(va_arg(*args, int*)) = i; break;
9436 case 'l': *(va_arg(*args, long*)) = i; break;
9437 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
9438#ifdef HAS_QUAD
9439 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
9440#endif
c635e13b 9441 }
fc36a67e 9442 }
9dd79c3f 9443 else
211dfcf1 9444 sv_setuv_mg(argsv, (UV)i);
be75b157 9445 vectorize = FALSE;
fc36a67e 9446 continue; /* not "break" */
9447
9448 /* UNKNOWN */
9449
46fc3d4c 9450 default:
fc36a67e 9451 unknown:
599cee73 9452 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 9453 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 9454 SV *msg = sv_newmortal();
35c1215d
NC
9455 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9456 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 9457 if (c) {
0f4b6630 9458 if (isPRINT(c))
1c846c1f 9459 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
9460 "\"%%%c\"", c & 0xFF);
9461 else
9462 Perl_sv_catpvf(aTHX_ msg,
57def98f 9463 "\"%%\\%03"UVof"\"",
0f4b6630 9464 (UV)c & 0xFF);
0f4b6630 9465 } else
c635e13b 9466 sv_catpv(msg, "end of string");
9014280d 9467 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 9468 }
fb73857a 9469
9470 /* output mangled stuff ... */
9471 if (c == '\0')
9472 --q;
46fc3d4c 9473 eptr = p;
9474 elen = q - p;
fb73857a 9475
9476 /* ... right here, because formatting flags should not apply */
9477 SvGROW(sv, SvCUR(sv) + elen + 1);
9478 p = SvEND(sv);
4459522c 9479 Copy(eptr, p, elen, char);
fb73857a 9480 p += elen;
9481 *p = '\0';
9482 SvCUR(sv) = p - SvPVX(sv);
58e33a90 9483 svix = osvix;
fb73857a 9484 continue; /* not "break" */
46fc3d4c 9485 }
9486
d2876be5
JH
9487 if (is_utf8 != has_utf8) {
9488 if (is_utf8) {
9489 if (SvCUR(sv))
9490 sv_utf8_upgrade(sv);
9491 }
9492 else {
9493 SV *nsv = sv_2mortal(newSVpvn(eptr, elen));
9494 sv_utf8_upgrade(nsv);
9495 eptr = SvPVX(nsv);
9496 elen = SvCUR(nsv);
9497 }
9498 SvGROW(sv, SvCUR(sv) + elen + 1);
9499 p = SvEND(sv);
9500 *p = '\0';
9501 }
94330da2
MHM
9502 /* Use memchr() instead of strchr(), as eptr is not guaranteed */
9503 /* to point to a null-terminated string. */
9504 if (left && ckWARN(WARN_PRINTF) && memchr(eptr, '\n', elen) &&
dca6e23f
RB
9505 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF))
9506 Perl_warner(aTHX_ packWARN(WARN_PRINTF),
9507 "Newline in left-justified string for %sprintf",
9508 (PL_op->op_type == OP_PRTF) ? "" : "s");
d2876be5 9509
fc36a67e 9510 have = esignlen + zeros + elen;
46fc3d4c 9511 need = (have > width ? have : width);
9512 gap = need - have;
9513
b22c7a20 9514 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 9515 p = SvEND(sv);
9516 if (esignlen && fill == '0') {
eb160463 9517 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9518 *p++ = esignbuf[i];
9519 }
9520 if (gap && !left) {
9521 memset(p, fill, gap);
9522 p += gap;
9523 }
9524 if (esignlen && fill != '0') {
eb160463 9525 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9526 *p++ = esignbuf[i];
9527 }
fc36a67e 9528 if (zeros) {
9529 for (i = zeros; i; i--)
9530 *p++ = '0';
9531 }
46fc3d4c 9532 if (elen) {
4459522c 9533 Copy(eptr, p, elen, char);
46fc3d4c 9534 p += elen;
9535 }
9536 if (gap && left) {
9537 memset(p, ' ', gap);
9538 p += gap;
9539 }
b22c7a20
GS
9540 if (vectorize) {
9541 if (veclen) {
4459522c 9542 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
9543 p += dotstrlen;
9544 }
9545 else
9546 vectorize = FALSE; /* done iterating over vecstr */
9547 }
2cf2cfc6
A
9548 if (is_utf8)
9549 has_utf8 = TRUE;
9550 if (has_utf8)
7e2040f0 9551 SvUTF8_on(sv);
46fc3d4c 9552 *p = '\0';
9553 SvCUR(sv) = p - SvPVX(sv);
b22c7a20
GS
9554 if (vectorize) {
9555 esignlen = 0;
9556 goto vector;
9557 }
46fc3d4c 9558 }
9559}
51371543 9560
645c22ef
DM
9561/* =========================================================================
9562
9563=head1 Cloning an interpreter
9564
9565All the macros and functions in this section are for the private use of
9566the main function, perl_clone().
9567
9568The foo_dup() functions make an exact copy of an existing foo thinngy.
9569During the course of a cloning, a hash table is used to map old addresses
9570to new addresses. The table is created and manipulated with the
9571ptr_table_* functions.
9572
9573=cut
9574
9575============================================================================*/
9576
9577
1d7c1841
GS
9578#if defined(USE_ITHREADS)
9579
1d7c1841
GS
9580#ifndef GpREFCNT_inc
9581# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
9582#endif
9583
9584
d2d73c3e
AB
9585#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
9586#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
9587#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9588#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
9589#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9590#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
9591#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9592#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
9593#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
9594#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
9595#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
9596#define SAVEPV(p) (p ? savepv(p) : Nullch)
9597#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 9598
d2d73c3e 9599
d2f185dc
AMS
9600/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
9601 regcomp.c. AMS 20010712 */
645c22ef 9602
1d7c1841 9603REGEXP *
a8fc9800 9604Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
1d7c1841 9605{
d2f185dc
AMS
9606 REGEXP *ret;
9607 int i, len, npar;
9608 struct reg_substr_datum *s;
9609
9610 if (!r)
9611 return (REGEXP *)NULL;
9612
9613 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
9614 return ret;
9615
9616 len = r->offsets[0];
9617 npar = r->nparens+1;
9618
9619 Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
9620 Copy(r->program, ret->program, len+1, regnode);
9621
9622 New(0, ret->startp, npar, I32);
9623 Copy(r->startp, ret->startp, npar, I32);
9624 New(0, ret->endp, npar, I32);
9625 Copy(r->startp, ret->startp, npar, I32);
9626
d2f185dc
AMS
9627 New(0, ret->substrs, 1, struct reg_substr_data);
9628 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
9629 s->min_offset = r->substrs->data[i].min_offset;
9630 s->max_offset = r->substrs->data[i].max_offset;
9631 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 9632 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
9633 }
9634
70612e96 9635 ret->regstclass = NULL;
d2f185dc
AMS
9636 if (r->data) {
9637 struct reg_data *d;
9638 int count = r->data->count;
9639
9640 Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
9641 char, struct reg_data);
9642 New(0, d->what, count, U8);
9643
9644 d->count = count;
9645 for (i = 0; i < count; i++) {
9646 d->what[i] = r->data->what[i];
9647 switch (d->what[i]) {
9648 case 's':
9649 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
9650 break;
9651 case 'p':
9652 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
9653 break;
9654 case 'f':
9655 /* This is cheating. */
9656 New(0, d->data[i], 1, struct regnode_charclass_class);
9657 StructCopy(r->data->data[i], d->data[i],
9658 struct regnode_charclass_class);
70612e96 9659 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
9660 break;
9661 case 'o':
33773810
AMS
9662 /* Compiled op trees are readonly, and can thus be
9663 shared without duplication. */
9b978d73
DM
9664 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
9665 break;
d2f185dc
AMS
9666 case 'n':
9667 d->data[i] = r->data->data[i];
9668 break;
9669 }
9670 }
9671
9672 ret->data = d;
9673 }
9674 else
9675 ret->data = NULL;
9676
9677 New(0, ret->offsets, 2*len+1, U32);
9678 Copy(r->offsets, ret->offsets, 2*len+1, U32);
9679
9680 ret->precomp = SAVEPV(r->precomp);
d2f185dc
AMS
9681 ret->refcnt = r->refcnt;
9682 ret->minlen = r->minlen;
9683 ret->prelen = r->prelen;
9684 ret->nparens = r->nparens;
9685 ret->lastparen = r->lastparen;
9686 ret->lastcloseparen = r->lastcloseparen;
9687 ret->reganch = r->reganch;
9688
70612e96
RG
9689 ret->sublen = r->sublen;
9690
9691 if (RX_MATCH_COPIED(ret))
9692 ret->subbeg = SAVEPV(r->subbeg);
9693 else
9694 ret->subbeg = Nullch;
9a26048b
NC
9695#ifdef PERL_COPY_ON_WRITE
9696 ret->saved_copy = Nullsv;
9697#endif
70612e96 9698
d2f185dc
AMS
9699 ptr_table_store(PL_ptr_table, r, ret);
9700 return ret;
1d7c1841
GS
9701}
9702
d2d73c3e 9703/* duplicate a file handle */
645c22ef 9704
1d7c1841 9705PerlIO *
a8fc9800 9706Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
9707{
9708 PerlIO *ret;
9709 if (!fp)
9710 return (PerlIO*)NULL;
9711
9712 /* look for it in the table first */
9713 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
9714 if (ret)
9715 return ret;
9716
9717 /* create anew and remember what it is */
ecdeb87c 9718 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
9719 ptr_table_store(PL_ptr_table, fp, ret);
9720 return ret;
9721}
9722
645c22ef
DM
9723/* duplicate a directory handle */
9724
1d7c1841
GS
9725DIR *
9726Perl_dirp_dup(pTHX_ DIR *dp)
9727{
9728 if (!dp)
9729 return (DIR*)NULL;
9730 /* XXX TODO */
9731 return dp;
9732}
9733
ff276b08 9734/* duplicate a typeglob */
645c22ef 9735
1d7c1841 9736GP *
a8fc9800 9737Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
9738{
9739 GP *ret;
9740 if (!gp)
9741 return (GP*)NULL;
9742 /* look for it in the table first */
9743 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
9744 if (ret)
9745 return ret;
9746
9747 /* create anew and remember what it is */
9748 Newz(0, ret, 1, GP);
9749 ptr_table_store(PL_ptr_table, gp, ret);
9750
9751 /* clone */
9752 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
9753 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
9754 ret->gp_io = io_dup_inc(gp->gp_io, param);
9755 ret->gp_form = cv_dup_inc(gp->gp_form, param);
9756 ret->gp_av = av_dup_inc(gp->gp_av, param);
9757 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
9758 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
9759 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
9760 ret->gp_cvgen = gp->gp_cvgen;
9761 ret->gp_flags = gp->gp_flags;
9762 ret->gp_line = gp->gp_line;
9763 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
9764 return ret;
9765}
9766
645c22ef
DM
9767/* duplicate a chain of magic */
9768
1d7c1841 9769MAGIC *
a8fc9800 9770Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 9771{
cb359b41
JH
9772 MAGIC *mgprev = (MAGIC*)NULL;
9773 MAGIC *mgret;
1d7c1841
GS
9774 if (!mg)
9775 return (MAGIC*)NULL;
9776 /* look for it in the table first */
9777 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
9778 if (mgret)
9779 return mgret;
9780
9781 for (; mg; mg = mg->mg_moremagic) {
9782 MAGIC *nmg;
9783 Newz(0, nmg, 1, MAGIC);
cb359b41 9784 if (mgprev)
1d7c1841 9785 mgprev->mg_moremagic = nmg;
cb359b41
JH
9786 else
9787 mgret = nmg;
1d7c1841
GS
9788 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
9789 nmg->mg_private = mg->mg_private;
9790 nmg->mg_type = mg->mg_type;
9791 nmg->mg_flags = mg->mg_flags;
14befaf4 9792 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 9793 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 9794 }
05bd4103
JH
9795 else if(mg->mg_type == PERL_MAGIC_backref) {
9796 AV *av = (AV*) mg->mg_obj;
9797 SV **svp;
9798 I32 i;
9799 nmg->mg_obj = (SV*)newAV();
9800 svp = AvARRAY(av);
9801 i = AvFILLp(av);
9802 while (i >= 0) {
9803 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
9804 i--;
9805 }
9806 }
1d7c1841
GS
9807 else {
9808 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
9809 ? sv_dup_inc(mg->mg_obj, param)
9810 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
9811 }
9812 nmg->mg_len = mg->mg_len;
9813 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 9814 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 9815 if (mg->mg_len > 0) {
1d7c1841 9816 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
9817 if (mg->mg_type == PERL_MAGIC_overload_table &&
9818 AMT_AMAGIC((AMT*)mg->mg_ptr))
9819 {
1d7c1841
GS
9820 AMT *amtp = (AMT*)mg->mg_ptr;
9821 AMT *namtp = (AMT*)nmg->mg_ptr;
9822 I32 i;
9823 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 9824 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
9825 }
9826 }
9827 }
9828 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 9829 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 9830 }
68795e93
NIS
9831 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
9832 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
9833 }
1d7c1841
GS
9834 mgprev = nmg;
9835 }
9836 return mgret;
9837}
9838
645c22ef
DM
9839/* create a new pointer-mapping table */
9840
1d7c1841
GS
9841PTR_TBL_t *
9842Perl_ptr_table_new(pTHX)
9843{
9844 PTR_TBL_t *tbl;
9845 Newz(0, tbl, 1, PTR_TBL_t);
9846 tbl->tbl_max = 511;
9847 tbl->tbl_items = 0;
9848 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
9849 return tbl;
9850}
9851
645c22ef
DM
9852/* map an existing pointer using a table */
9853
1d7c1841
GS
9854void *
9855Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
9856{
9857 PTR_TBL_ENT_t *tblent;
d2a79402 9858 UV hash = PTR2UV(sv);
1d7c1841
GS
9859 assert(tbl);
9860 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
9861 for (; tblent; tblent = tblent->next) {
9862 if (tblent->oldval == sv)
9863 return tblent->newval;
9864 }
9865 return (void*)NULL;
9866}
9867
645c22ef
DM
9868/* add a new entry to a pointer-mapping table */
9869
1d7c1841
GS
9870void
9871Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
9872{
9873 PTR_TBL_ENT_t *tblent, **otblent;
9874 /* XXX this may be pessimal on platforms where pointers aren't good
9875 * hash values e.g. if they grow faster in the most significant
9876 * bits */
d2a79402 9877 UV hash = PTR2UV(oldv);
1d7c1841
GS
9878 bool i = 1;
9879
9880 assert(tbl);
9881 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
9882 for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
9883 if (tblent->oldval == oldv) {
9884 tblent->newval = newv;
1d7c1841
GS
9885 return;
9886 }
9887 }
9888 Newz(0, tblent, 1, PTR_TBL_ENT_t);
9889 tblent->oldval = oldv;
9890 tblent->newval = newv;
9891 tblent->next = *otblent;
9892 *otblent = tblent;
9893 tbl->tbl_items++;
9894 if (i && tbl->tbl_items > tbl->tbl_max)
9895 ptr_table_split(tbl);
9896}
9897
645c22ef
DM
9898/* double the hash bucket size of an existing ptr table */
9899
1d7c1841
GS
9900void
9901Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
9902{
9903 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
9904 UV oldsize = tbl->tbl_max + 1;
9905 UV newsize = oldsize * 2;
9906 UV i;
9907
9908 Renew(ary, newsize, PTR_TBL_ENT_t*);
9909 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
9910 tbl->tbl_max = --newsize;
9911 tbl->tbl_ary = ary;
9912 for (i=0; i < oldsize; i++, ary++) {
9913 PTR_TBL_ENT_t **curentp, **entp, *ent;
9914 if (!*ary)
9915 continue;
9916 curentp = ary + oldsize;
9917 for (entp = ary, ent = *ary; ent; ent = *entp) {
d2a79402 9918 if ((newsize & PTR2UV(ent->oldval)) != i) {
1d7c1841
GS
9919 *entp = ent->next;
9920 ent->next = *curentp;
9921 *curentp = ent;
9922 continue;
9923 }
9924 else
9925 entp = &ent->next;
9926 }
9927 }
9928}
9929
645c22ef
DM
9930/* remove all the entries from a ptr table */
9931
a0739874
DM
9932void
9933Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
9934{
9935 register PTR_TBL_ENT_t **array;
9936 register PTR_TBL_ENT_t *entry;
9937 register PTR_TBL_ENT_t *oentry = Null(PTR_TBL_ENT_t*);
9938 UV riter = 0;
9939 UV max;
9940
9941 if (!tbl || !tbl->tbl_items) {
9942 return;
9943 }
9944
9945 array = tbl->tbl_ary;
9946 entry = array[0];
9947 max = tbl->tbl_max;
9948
9949 for (;;) {
9950 if (entry) {
9951 oentry = entry;
9952 entry = entry->next;
9953 Safefree(oentry);
9954 }
9955 if (!entry) {
9956 if (++riter > max) {
9957 break;
9958 }
9959 entry = array[riter];
9960 }
9961 }
9962
9963 tbl->tbl_items = 0;
9964}
9965
645c22ef
DM
9966/* clear and free a ptr table */
9967
a0739874
DM
9968void
9969Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
9970{
9971 if (!tbl) {
9972 return;
9973 }
9974 ptr_table_clear(tbl);
9975 Safefree(tbl->tbl_ary);
9976 Safefree(tbl);
9977}
9978
1d7c1841
GS
9979#ifdef DEBUGGING
9980char *PL_watch_pvx;
9981#endif
9982
645c22ef
DM
9983/* attempt to make everything in the typeglob readonly */
9984
5bd07a3d 9985STATIC SV *
59b40662 9986S_gv_share(pTHX_ SV *sstr, CLONE_PARAMS *param)
5bd07a3d
DM
9987{
9988 GV *gv = (GV*)sstr;
59b40662 9989 SV *sv = &param->proto_perl->Isv_no; /* just need SvREADONLY-ness */
5bd07a3d
DM
9990
9991 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 9992 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
9993 }
9994 else if (!GvCV(gv)) {
9995 GvCV(gv) = (CV*)sv;
9996 }
9997 else {
9998 /* CvPADLISTs cannot be shared */
37e20706 9999 if (!SvREADONLY(GvCV(gv)) && !CvXSUB(GvCV(gv))) {
7fb37951 10000 GvUNIQUE_off(gv);
5bd07a3d
DM
10001 }
10002 }
10003
7fb37951 10004 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
10005#if 0
10006 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
10007 HvNAME(GvSTASH(gv)), GvNAME(gv));
10008#endif
10009 return Nullsv;
10010 }
10011
4411f3b6 10012 /*
5bd07a3d
DM
10013 * write attempts will die with
10014 * "Modification of a read-only value attempted"
10015 */
10016 if (!GvSV(gv)) {
10017 GvSV(gv) = sv;
10018 }
10019 else {
10020 SvREADONLY_on(GvSV(gv));
10021 }
10022
10023 if (!GvAV(gv)) {
10024 GvAV(gv) = (AV*)sv;
10025 }
10026 else {
10027 SvREADONLY_on(GvAV(gv));
10028 }
10029
10030 if (!GvHV(gv)) {
10031 GvHV(gv) = (HV*)sv;
10032 }
10033 else {
10034 SvREADONLY_on(GvAV(gv));
10035 }
10036
10037 return sstr; /* he_dup() will SvREFCNT_inc() */
10038}
10039
645c22ef
DM
10040/* duplicate an SV of any type (including AV, HV etc) */
10041
83841fad
NIS
10042void
10043Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
10044{
10045 if (SvROK(sstr)) {
d3d0e6f1 10046 SvRV(dstr) = SvWEAKREF(sstr)
83841fad
NIS
10047 ? sv_dup(SvRV(sstr), param)
10048 : sv_dup_inc(SvRV(sstr), param);
10049 }
10050 else if (SvPVX(sstr)) {
10051 /* Has something there */
10052 if (SvLEN(sstr)) {
68795e93 10053 /* Normal PV - clone whole allocated space */
83841fad 10054 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
d3d0e6f1
NC
10055 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10056 /* Not that normal - actually sstr is copy on write.
10057 But we are a true, independant SV, so: */
10058 SvREADONLY_off(dstr);
10059 SvFAKE_off(dstr);
10060 }
68795e93 10061 }
83841fad
NIS
10062 else {
10063 /* Special case - not normally malloced for some reason */
10064 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10065 /* A "shared" PV - clone it as unshared string */
281b2760 10066 if(SvPADTMP(sstr)) {
5e6160dc
AB
10067 /* However, some of them live in the pad
10068 and they should not have these flags
10069 turned off */
281b2760
AB
10070
10071 SvPVX(dstr) = sharepvn(SvPVX(sstr), SvCUR(sstr),
10072 SvUVX(sstr));
10073 SvUVX(dstr) = SvUVX(sstr);
10074 } else {
10075
10076 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvCUR(sstr));
10077 SvFAKE_off(dstr);
10078 SvREADONLY_off(dstr);
5e6160dc 10079 }
83841fad
NIS
10080 }
10081 else {
10082 /* Some other special case - random pointer */
10083 SvPVX(dstr) = SvPVX(sstr);
d3d0e6f1 10084 }
83841fad
NIS
10085 }
10086 }
10087 else {
10088 /* Copy the Null */
10089 SvPVX(dstr) = SvPVX(sstr);
10090 }
10091}
10092
1d7c1841 10093SV *
a8fc9800 10094Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
1d7c1841 10095{
1d7c1841
GS
10096 SV *dstr;
10097
10098 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
10099 return Nullsv;
10100 /* look for it in the table first */
10101 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
10102 if (dstr)
10103 return dstr;
10104
0405e91e
AB
10105 if(param->flags & CLONEf_JOIN_IN) {
10106 /** We are joining here so we don't want do clone
10107 something that is bad **/
10108
10109 if(SvTYPE(sstr) == SVt_PVHV &&
10110 HvNAME(sstr)) {
10111 /** don't clone stashes if they already exist **/
10112 HV* old_stash = gv_stashpv(HvNAME(sstr),0);
10113 return (SV*) old_stash;
10114 }
10115 }
10116
1d7c1841
GS
10117 /* create anew and remember what it is */
10118 new_SV(dstr);
10119 ptr_table_store(PL_ptr_table, sstr, dstr);
10120
10121 /* clone */
10122 SvFLAGS(dstr) = SvFLAGS(sstr);
10123 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
10124 SvREFCNT(dstr) = 0; /* must be before any other dups! */
10125
10126#ifdef DEBUGGING
10127 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
10128 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
10129 PL_watch_pvx, SvPVX(sstr));
10130#endif
10131
10132 switch (SvTYPE(sstr)) {
10133 case SVt_NULL:
10134 SvANY(dstr) = NULL;
10135 break;
10136 case SVt_IV:
10137 SvANY(dstr) = new_XIV();
10138 SvIVX(dstr) = SvIVX(sstr);
10139 break;
10140 case SVt_NV:
10141 SvANY(dstr) = new_XNV();
10142 SvNVX(dstr) = SvNVX(sstr);
10143 break;
10144 case SVt_RV:
10145 SvANY(dstr) = new_XRV();
83841fad 10146 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10147 break;
10148 case SVt_PV:
10149 SvANY(dstr) = new_XPV();
10150 SvCUR(dstr) = SvCUR(sstr);
10151 SvLEN(dstr) = SvLEN(sstr);
83841fad 10152 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10153 break;
10154 case SVt_PVIV:
10155 SvANY(dstr) = new_XPVIV();
10156 SvCUR(dstr) = SvCUR(sstr);
10157 SvLEN(dstr) = SvLEN(sstr);
10158 SvIVX(dstr) = SvIVX(sstr);
83841fad 10159 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10160 break;
10161 case SVt_PVNV:
10162 SvANY(dstr) = new_XPVNV();
10163 SvCUR(dstr) = SvCUR(sstr);
10164 SvLEN(dstr) = SvLEN(sstr);
10165 SvIVX(dstr) = SvIVX(sstr);
10166 SvNVX(dstr) = SvNVX(sstr);
83841fad 10167 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10168 break;
10169 case SVt_PVMG:
10170 SvANY(dstr) = new_XPVMG();
10171 SvCUR(dstr) = SvCUR(sstr);
10172 SvLEN(dstr) = SvLEN(sstr);
10173 SvIVX(dstr) = SvIVX(sstr);
10174 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10175 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10176 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10177 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10178 break;
10179 case SVt_PVBM:
10180 SvANY(dstr) = new_XPVBM();
10181 SvCUR(dstr) = SvCUR(sstr);
10182 SvLEN(dstr) = SvLEN(sstr);
10183 SvIVX(dstr) = SvIVX(sstr);
10184 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10185 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10186 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10187 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10188 BmRARE(dstr) = BmRARE(sstr);
10189 BmUSEFUL(dstr) = BmUSEFUL(sstr);
10190 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
10191 break;
10192 case SVt_PVLV:
10193 SvANY(dstr) = new_XPVLV();
10194 SvCUR(dstr) = SvCUR(sstr);
10195 SvLEN(dstr) = SvLEN(sstr);
10196 SvIVX(dstr) = SvIVX(sstr);
10197 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10198 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10199 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10200 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10201 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
10202 LvTARGLEN(dstr) = LvTARGLEN(sstr);
dd28f7bb
DM
10203 if (LvTYPE(sstr) == 't') /* for tie: unrefcnted fake (SV**) */
10204 LvTARG(dstr) = dstr;
10205 else if (LvTYPE(sstr) == 'T') /* for tie: fake HE */
10206 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(sstr), 0, param);
10207 else
10208 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr), param);
1d7c1841
GS
10209 LvTYPE(dstr) = LvTYPE(sstr);
10210 break;
10211 case SVt_PVGV:
7fb37951 10212 if (GvUNIQUE((GV*)sstr)) {
5bd07a3d 10213 SV *share;
59b40662 10214 if ((share = gv_share(sstr, param))) {
5bd07a3d
DM
10215 del_SV(dstr);
10216 dstr = share;
37e20706 10217 ptr_table_store(PL_ptr_table, sstr, dstr);
5bd07a3d
DM
10218#if 0
10219 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
10220 HvNAME(GvSTASH(share)), GvNAME(share));
10221#endif
10222 break;
10223 }
10224 }
1d7c1841
GS
10225 SvANY(dstr) = new_XPVGV();
10226 SvCUR(dstr) = SvCUR(sstr);
10227 SvLEN(dstr) = SvLEN(sstr);
10228 SvIVX(dstr) = SvIVX(sstr);
10229 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10230 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10231 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10232 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10233 GvNAMELEN(dstr) = GvNAMELEN(sstr);
10234 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
d2d73c3e 10235 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr), param);
1d7c1841 10236 GvFLAGS(dstr) = GvFLAGS(sstr);
d2d73c3e 10237 GvGP(dstr) = gp_dup(GvGP(sstr), param);
1d7c1841
GS
10238 (void)GpREFCNT_inc(GvGP(dstr));
10239 break;
10240 case SVt_PVIO:
10241 SvANY(dstr) = new_XPVIO();
10242 SvCUR(dstr) = SvCUR(sstr);
10243 SvLEN(dstr) = SvLEN(sstr);
10244 SvIVX(dstr) = SvIVX(sstr);
10245 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10246 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10247 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10248 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
a8fc9800 10249 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10250 if (IoOFP(sstr) == IoIFP(sstr))
10251 IoOFP(dstr) = IoIFP(dstr);
10252 else
a8fc9800 10253 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10254 /* PL_rsfp_filters entries have fake IoDIRP() */
10255 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
10256 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
10257 else
10258 IoDIRP(dstr) = IoDIRP(sstr);
10259 IoLINES(dstr) = IoLINES(sstr);
10260 IoPAGE(dstr) = IoPAGE(sstr);
10261 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
10262 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
5a37521b
AB
10263 if(IoFLAGS(sstr) & IOf_FAKE_DIRP) {
10264 /* I have no idea why fake dirp (rsfps)
10265 should be treaded differently but otherwise
10266 we end up with leaks -- sky*/
10267 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(sstr), param);
10268 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(sstr), param);
10269 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(sstr), param);
10270 } else {
10271 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr), param);
10272 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr), param);
10273 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr), param);
10274 }
1d7c1841 10275 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
1d7c1841 10276 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
1d7c1841 10277 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
1d7c1841
GS
10278 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
10279 IoTYPE(dstr) = IoTYPE(sstr);
10280 IoFLAGS(dstr) = IoFLAGS(sstr);
10281 break;
10282 case SVt_PVAV:
10283 SvANY(dstr) = new_XPVAV();
10284 SvCUR(dstr) = SvCUR(sstr);
10285 SvLEN(dstr) = SvLEN(sstr);
10286 SvIVX(dstr) = SvIVX(sstr);
10287 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10288 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10289 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
10290 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
1d7c1841
GS
10291 AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
10292 if (AvARRAY((AV*)sstr)) {
10293 SV **dst_ary, **src_ary;
10294 SSize_t items = AvFILLp((AV*)sstr) + 1;
10295
10296 src_ary = AvARRAY((AV*)sstr);
10297 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
10298 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
10299 SvPVX(dstr) = (char*)dst_ary;
10300 AvALLOC((AV*)dstr) = dst_ary;
10301 if (AvREAL((AV*)sstr)) {
10302 while (items-- > 0)
d2d73c3e 10303 *dst_ary++ = sv_dup_inc(*src_ary++, param);
1d7c1841
GS
10304 }
10305 else {
10306 while (items-- > 0)
d2d73c3e 10307 *dst_ary++ = sv_dup(*src_ary++, param);
1d7c1841
GS
10308 }
10309 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10310 while (items-- > 0) {
10311 *dst_ary++ = &PL_sv_undef;
10312 }
10313 }
10314 else {
10315 SvPVX(dstr) = Nullch;
10316 AvALLOC((AV*)dstr) = (SV**)NULL;
10317 }
10318 break;
10319 case SVt_PVHV:
10320 SvANY(dstr) = new_XPVHV();
10321 SvCUR(dstr) = SvCUR(sstr);
10322 SvLEN(dstr) = SvLEN(sstr);
10323 SvIVX(dstr) = SvIVX(sstr);
10324 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10325 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10326 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841
GS
10327 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
10328 if (HvARRAY((HV*)sstr)) {
1d7c1841
GS
10329 STRLEN i = 0;
10330 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
10331 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
10332 Newz(0, dxhv->xhv_array,
10333 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
10334 while (i <= sxhv->xhv_max) {
10335 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
eb160463
GS
10336 (bool)!!HvSHAREKEYS(sstr),
10337 param);
1d7c1841
GS
10338 ++i;
10339 }
eb160463
GS
10340 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter,
10341 (bool)!!HvSHAREKEYS(sstr), param);
1d7c1841
GS
10342 }
10343 else {
10344 SvPVX(dstr) = Nullch;
10345 HvEITER((HV*)dstr) = (HE*)NULL;
10346 }
10347 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
10348 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
c43294b8 10349 /* Record stashes for possible cloning in Perl_clone(). */
6676db26 10350 if(HvNAME((HV*)dstr))
d2d73c3e 10351 av_push(param->stashes, dstr);
1d7c1841
GS
10352 break;
10353 case SVt_PVFM:
10354 SvANY(dstr) = new_XPVFM();
10355 FmLINES(dstr) = FmLINES(sstr);
10356 goto dup_pvcv;
10357 /* NOTREACHED */
10358 case SVt_PVCV:
10359 SvANY(dstr) = new_XPVCV();
d2d73c3e 10360 dup_pvcv:
1d7c1841
GS
10361 SvCUR(dstr) = SvCUR(sstr);
10362 SvLEN(dstr) = SvLEN(sstr);
10363 SvIVX(dstr) = SvIVX(sstr);
10364 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10365 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10366 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10367 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
d2d73c3e 10368 CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
1d7c1841
GS
10369 CvSTART(dstr) = CvSTART(sstr);
10370 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
10371 CvXSUB(dstr) = CvXSUB(sstr);
10372 CvXSUBANY(dstr) = CvXSUBANY(sstr);
01485f8b
DM
10373 if (CvCONST(sstr)) {
10374 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
10375 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
10376 sv_dup_inc(CvXSUBANY(sstr).any_ptr, param);
10377 }
d2d73c3e
AB
10378 CvGV(dstr) = gv_dup(CvGV(sstr), param);
10379 if (param->flags & CLONEf_COPY_STACKS) {
10380 CvDEPTH(dstr) = CvDEPTH(sstr);
10381 } else {
10382 CvDEPTH(dstr) = 0;
10383 }
dd2155a4 10384 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
7dafbf52
DM
10385 CvOUTSIDE_SEQ(dstr) = CvOUTSIDE_SEQ(sstr);
10386 CvOUTSIDE(dstr) =
10387 CvWEAKOUTSIDE(sstr)
10388 ? cv_dup( CvOUTSIDE(sstr), param)
10389 : cv_dup_inc(CvOUTSIDE(sstr), param);
1d7c1841 10390 CvFLAGS(dstr) = CvFLAGS(sstr);
54356c7d 10391 CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
1d7c1841
GS
10392 break;
10393 default:
c803eecc 10394 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
1d7c1841
GS
10395 break;
10396 }
10397
10398 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
10399 ++PL_sv_objcount;
10400
10401 return dstr;
d2d73c3e 10402 }
1d7c1841 10403
645c22ef
DM
10404/* duplicate a context */
10405
1d7c1841 10406PERL_CONTEXT *
a8fc9800 10407Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
10408{
10409 PERL_CONTEXT *ncxs;
10410
10411 if (!cxs)
10412 return (PERL_CONTEXT*)NULL;
10413
10414 /* look for it in the table first */
10415 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
10416 if (ncxs)
10417 return ncxs;
10418
10419 /* create anew and remember what it is */
10420 Newz(56, ncxs, max + 1, PERL_CONTEXT);
10421 ptr_table_store(PL_ptr_table, cxs, ncxs);
10422
10423 while (ix >= 0) {
10424 PERL_CONTEXT *cx = &cxs[ix];
10425 PERL_CONTEXT *ncx = &ncxs[ix];
10426 ncx->cx_type = cx->cx_type;
10427 if (CxTYPE(cx) == CXt_SUBST) {
10428 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
10429 }
10430 else {
10431 ncx->blk_oldsp = cx->blk_oldsp;
10432 ncx->blk_oldcop = cx->blk_oldcop;
10433 ncx->blk_oldretsp = cx->blk_oldretsp;
10434 ncx->blk_oldmarksp = cx->blk_oldmarksp;
10435 ncx->blk_oldscopesp = cx->blk_oldscopesp;
10436 ncx->blk_oldpm = cx->blk_oldpm;
10437 ncx->blk_gimme = cx->blk_gimme;
10438 switch (CxTYPE(cx)) {
10439 case CXt_SUB:
10440 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
10441 ? cv_dup_inc(cx->blk_sub.cv, param)
10442 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 10443 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 10444 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 10445 : Nullav);
d2d73c3e 10446 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
10447 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
10448 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10449 ncx->blk_sub.lval = cx->blk_sub.lval;
10450 break;
10451 case CXt_EVAL:
10452 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
10453 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 10454 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 10455 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 10456 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
1d7c1841
GS
10457 break;
10458 case CXt_LOOP:
10459 ncx->blk_loop.label = cx->blk_loop.label;
10460 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
10461 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
10462 ncx->blk_loop.next_op = cx->blk_loop.next_op;
10463 ncx->blk_loop.last_op = cx->blk_loop.last_op;
10464 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
10465 ? cx->blk_loop.iterdata
d2d73c3e 10466 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
10467 ncx->blk_loop.oldcomppad
10468 = (PAD*)ptr_table_fetch(PL_ptr_table,
10469 cx->blk_loop.oldcomppad);
d2d73c3e
AB
10470 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
10471 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
10472 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
10473 ncx->blk_loop.iterix = cx->blk_loop.iterix;
10474 ncx->blk_loop.itermax = cx->blk_loop.itermax;
10475 break;
10476 case CXt_FORMAT:
d2d73c3e
AB
10477 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
10478 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
10479 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841
GS
10480 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10481 break;
10482 case CXt_BLOCK:
10483 case CXt_NULL:
10484 break;
10485 }
10486 }
10487 --ix;
10488 }
10489 return ncxs;
10490}
10491
645c22ef
DM
10492/* duplicate a stack info structure */
10493
1d7c1841 10494PERL_SI *
a8fc9800 10495Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
10496{
10497 PERL_SI *nsi;
10498
10499 if (!si)
10500 return (PERL_SI*)NULL;
10501
10502 /* look for it in the table first */
10503 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
10504 if (nsi)
10505 return nsi;
10506
10507 /* create anew and remember what it is */
10508 Newz(56, nsi, 1, PERL_SI);
10509 ptr_table_store(PL_ptr_table, si, nsi);
10510
d2d73c3e 10511 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
10512 nsi->si_cxix = si->si_cxix;
10513 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 10514 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 10515 nsi->si_type = si->si_type;
d2d73c3e
AB
10516 nsi->si_prev = si_dup(si->si_prev, param);
10517 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
10518 nsi->si_markoff = si->si_markoff;
10519
10520 return nsi;
10521}
10522
10523#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
10524#define TOPINT(ss,ix) ((ss)[ix].any_i32)
10525#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
10526#define TOPLONG(ss,ix) ((ss)[ix].any_long)
10527#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
10528#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
10529#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
10530#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
10531#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
10532#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
10533#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
10534#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
10535#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
10536#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
10537
10538/* XXXXX todo */
10539#define pv_dup_inc(p) SAVEPV(p)
10540#define pv_dup(p) SAVEPV(p)
10541#define svp_dup_inc(p,pp) any_dup(p,pp)
10542
645c22ef
DM
10543/* map any object to the new equivent - either something in the
10544 * ptr table, or something in the interpreter structure
10545 */
10546
1d7c1841
GS
10547void *
10548Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
10549{
10550 void *ret;
10551
10552 if (!v)
10553 return (void*)NULL;
10554
10555 /* look for it in the table first */
10556 ret = ptr_table_fetch(PL_ptr_table, v);
10557 if (ret)
10558 return ret;
10559
10560 /* see if it is part of the interpreter structure */
10561 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 10562 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 10563 else {
1d7c1841 10564 ret = v;
05ec9bb3 10565 }
1d7c1841
GS
10566
10567 return ret;
10568}
10569
645c22ef
DM
10570/* duplicate the save stack */
10571
1d7c1841 10572ANY *
a8fc9800 10573Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841
GS
10574{
10575 ANY *ss = proto_perl->Tsavestack;
10576 I32 ix = proto_perl->Tsavestack_ix;
10577 I32 max = proto_perl->Tsavestack_max;
10578 ANY *nss;
10579 SV *sv;
10580 GV *gv;
10581 AV *av;
10582 HV *hv;
10583 void* ptr;
10584 int intval;
10585 long longval;
10586 GP *gp;
10587 IV iv;
10588 I32 i;
c4e33207 10589 char *c = NULL;
1d7c1841 10590 void (*dptr) (void*);
acfe0abc 10591 void (*dxptr) (pTHX_ void*);
e977893f 10592 OP *o;
1d7c1841
GS
10593
10594 Newz(54, nss, max, ANY);
10595
10596 while (ix > 0) {
10597 i = POPINT(ss,ix);
10598 TOPINT(nss,ix) = i;
10599 switch (i) {
10600 case SAVEt_ITEM: /* normal string */
10601 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10602 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10603 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10604 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10605 break;
10606 case SAVEt_SV: /* scalar reference */
10607 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10608 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10609 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10610 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 10611 break;
f4dd75d9
GS
10612 case SAVEt_GENERIC_PVREF: /* generic char* */
10613 c = (char*)POPPTR(ss,ix);
10614 TOPPTR(nss,ix) = pv_dup(c);
10615 ptr = POPPTR(ss,ix);
10616 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10617 break;
05ec9bb3
NIS
10618 case SAVEt_SHARED_PVREF: /* char* in shared space */
10619 c = (char*)POPPTR(ss,ix);
10620 TOPPTR(nss,ix) = savesharedpv(c);
10621 ptr = POPPTR(ss,ix);
10622 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10623 break;
1d7c1841
GS
10624 case SAVEt_GENERIC_SVREF: /* generic sv */
10625 case SAVEt_SVREF: /* scalar reference */
10626 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10627 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10628 ptr = POPPTR(ss,ix);
10629 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
10630 break;
10631 case SAVEt_AV: /* array reference */
10632 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10633 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 10634 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10635 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10636 break;
10637 case SAVEt_HV: /* hash reference */
10638 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10639 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 10640 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10641 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10642 break;
10643 case SAVEt_INT: /* int reference */
10644 ptr = POPPTR(ss,ix);
10645 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10646 intval = (int)POPINT(ss,ix);
10647 TOPINT(nss,ix) = intval;
10648 break;
10649 case SAVEt_LONG: /* long reference */
10650 ptr = POPPTR(ss,ix);
10651 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10652 longval = (long)POPLONG(ss,ix);
10653 TOPLONG(nss,ix) = longval;
10654 break;
10655 case SAVEt_I32: /* I32 reference */
10656 case SAVEt_I16: /* I16 reference */
10657 case SAVEt_I8: /* I8 reference */
10658 ptr = POPPTR(ss,ix);
10659 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10660 i = POPINT(ss,ix);
10661 TOPINT(nss,ix) = i;
10662 break;
10663 case SAVEt_IV: /* IV reference */
10664 ptr = POPPTR(ss,ix);
10665 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10666 iv = POPIV(ss,ix);
10667 TOPIV(nss,ix) = iv;
10668 break;
10669 case SAVEt_SPTR: /* SV* reference */
10670 ptr = POPPTR(ss,ix);
10671 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10672 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10673 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
10674 break;
10675 case SAVEt_VPTR: /* random* reference */
10676 ptr = POPPTR(ss,ix);
10677 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10678 ptr = POPPTR(ss,ix);
10679 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10680 break;
10681 case SAVEt_PPTR: /* char* reference */
10682 ptr = POPPTR(ss,ix);
10683 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10684 c = (char*)POPPTR(ss,ix);
10685 TOPPTR(nss,ix) = pv_dup(c);
10686 break;
10687 case SAVEt_HPTR: /* HV* reference */
10688 ptr = POPPTR(ss,ix);
10689 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10690 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10691 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
10692 break;
10693 case SAVEt_APTR: /* AV* reference */
10694 ptr = POPPTR(ss,ix);
10695 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10696 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10697 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
10698 break;
10699 case SAVEt_NSTAB:
10700 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10701 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10702 break;
10703 case SAVEt_GP: /* scalar reference */
10704 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 10705 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
10706 (void)GpREFCNT_inc(gp);
10707 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 10708 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
10709 c = (char*)POPPTR(ss,ix);
10710 TOPPTR(nss,ix) = pv_dup(c);
10711 iv = POPIV(ss,ix);
10712 TOPIV(nss,ix) = iv;
10713 iv = POPIV(ss,ix);
10714 TOPIV(nss,ix) = iv;
10715 break;
10716 case SAVEt_FREESV:
26d9b02f 10717 case SAVEt_MORTALIZESV:
1d7c1841 10718 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10719 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10720 break;
10721 case SAVEt_FREEOP:
10722 ptr = POPPTR(ss,ix);
10723 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
10724 /* these are assumed to be refcounted properly */
10725 switch (((OP*)ptr)->op_type) {
10726 case OP_LEAVESUB:
10727 case OP_LEAVESUBLV:
10728 case OP_LEAVEEVAL:
10729 case OP_LEAVE:
10730 case OP_SCOPE:
10731 case OP_LEAVEWRITE:
e977893f
GS
10732 TOPPTR(nss,ix) = ptr;
10733 o = (OP*)ptr;
10734 OpREFCNT_inc(o);
1d7c1841
GS
10735 break;
10736 default:
10737 TOPPTR(nss,ix) = Nullop;
10738 break;
10739 }
10740 }
10741 else
10742 TOPPTR(nss,ix) = Nullop;
10743 break;
10744 case SAVEt_FREEPV:
10745 c = (char*)POPPTR(ss,ix);
10746 TOPPTR(nss,ix) = pv_dup_inc(c);
10747 break;
10748 case SAVEt_CLEARSV:
10749 longval = POPLONG(ss,ix);
10750 TOPLONG(nss,ix) = longval;
10751 break;
10752 case SAVEt_DELETE:
10753 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10754 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10755 c = (char*)POPPTR(ss,ix);
10756 TOPPTR(nss,ix) = pv_dup_inc(c);
10757 i = POPINT(ss,ix);
10758 TOPINT(nss,ix) = i;
10759 break;
10760 case SAVEt_DESTRUCTOR:
10761 ptr = POPPTR(ss,ix);
10762 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10763 dptr = POPDPTR(ss,ix);
ef75a179 10764 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
10765 break;
10766 case SAVEt_DESTRUCTOR_X:
10767 ptr = POPPTR(ss,ix);
10768 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10769 dxptr = POPDXPTR(ss,ix);
acfe0abc 10770 TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
10771 break;
10772 case SAVEt_REGCONTEXT:
10773 case SAVEt_ALLOC:
10774 i = POPINT(ss,ix);
10775 TOPINT(nss,ix) = i;
10776 ix -= i;
10777 break;
10778 case SAVEt_STACK_POS: /* Position on Perl stack */
10779 i = POPINT(ss,ix);
10780 TOPINT(nss,ix) = i;
10781 break;
10782 case SAVEt_AELEM: /* array element */
10783 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10784 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10785 i = POPINT(ss,ix);
10786 TOPINT(nss,ix) = i;
10787 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10788 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
10789 break;
10790 case SAVEt_HELEM: /* hash element */
10791 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10792 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10793 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10794 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10795 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10796 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10797 break;
10798 case SAVEt_OP:
10799 ptr = POPPTR(ss,ix);
10800 TOPPTR(nss,ix) = ptr;
10801 break;
10802 case SAVEt_HINTS:
10803 i = POPINT(ss,ix);
10804 TOPINT(nss,ix) = i;
10805 break;
c4410b1b
GS
10806 case SAVEt_COMPPAD:
10807 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10808 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 10809 break;
c3564e5c
GS
10810 case SAVEt_PADSV:
10811 longval = (long)POPLONG(ss,ix);
10812 TOPLONG(nss,ix) = longval;
10813 ptr = POPPTR(ss,ix);
10814 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10815 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10816 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 10817 break;
a1bb4754 10818 case SAVEt_BOOL:
38d8b13e 10819 ptr = POPPTR(ss,ix);
b9609c01 10820 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 10821 longval = (long)POPBOOL(ss,ix);
b9609c01 10822 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 10823 break;
8bd2680e
MHM
10824 case SAVEt_SET_SVFLAGS:
10825 i = POPINT(ss,ix);
10826 TOPINT(nss,ix) = i;
10827 i = POPINT(ss,ix);
10828 TOPINT(nss,ix) = i;
10829 sv = (SV*)POPPTR(ss,ix);
10830 TOPPTR(nss,ix) = sv_dup(sv, param);
10831 break;
1d7c1841
GS
10832 default:
10833 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
10834 }
10835 }
10836
10837 return nss;
10838}
10839
645c22ef
DM
10840/*
10841=for apidoc perl_clone
10842
10843Create and return a new interpreter by cloning the current one.
10844
4be49ee6 10845perl_clone takes these flags as parameters:
6a78b4db
AB
10846
10847CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
10848without it we only clone the data and zero the stacks,
10849with it we copy the stacks and the new perl interpreter is
10850ready to run at the exact same point as the previous one.
10851The pseudo-fork code uses COPY_STACKS while the
10852threads->new doesn't.
10853
10854CLONEf_KEEP_PTR_TABLE
10855perl_clone keeps a ptr_table with the pointer of the old
10856variable as a key and the new variable as a value,
10857this allows it to check if something has been cloned and not
10858clone it again but rather just use the value and increase the
10859refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
10860the ptr_table using the function
10861C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
10862reason to keep it around is if you want to dup some of your own
10863variable who are outside the graph perl scans, example of this
10864code is in threads.xs create
10865
10866CLONEf_CLONE_HOST
10867This is a win32 thing, it is ignored on unix, it tells perls
10868win32host code (which is c++) to clone itself, this is needed on
10869win32 if you want to run two threads at the same time,
10870if you just want to do some stuff in a separate perl interpreter
10871and then throw it away and return to the original one,
10872you don't need to do anything.
10873
645c22ef
DM
10874=cut
10875*/
10876
10877/* XXX the above needs expanding by someone who actually understands it ! */
3fc56081
NK
10878EXTERN_C PerlInterpreter *
10879perl_clone_host(PerlInterpreter* proto_perl, UV flags);
645c22ef 10880
1d7c1841
GS
10881PerlInterpreter *
10882perl_clone(PerlInterpreter *proto_perl, UV flags)
10883{
1d7c1841 10884#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
10885
10886 /* perlhost.h so we need to call into it
10887 to clone the host, CPerlHost should have a c interface, sky */
10888
10889 if (flags & CLONEf_CLONE_HOST) {
10890 return perl_clone_host(proto_perl,flags);
10891 }
10892 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
10893 proto_perl->IMem,
10894 proto_perl->IMemShared,
10895 proto_perl->IMemParse,
10896 proto_perl->IEnv,
10897 proto_perl->IStdIO,
10898 proto_perl->ILIO,
10899 proto_perl->IDir,
10900 proto_perl->ISock,
10901 proto_perl->IProc);
10902}
10903
10904PerlInterpreter *
10905perl_clone_using(PerlInterpreter *proto_perl, UV flags,
10906 struct IPerlMem* ipM, struct IPerlMem* ipMS,
10907 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
10908 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
10909 struct IPerlDir* ipD, struct IPerlSock* ipS,
10910 struct IPerlProc* ipP)
10911{
10912 /* XXX many of the string copies here can be optimized if they're
10913 * constants; they need to be allocated as common memory and just
10914 * their pointers copied. */
10915
10916 IV i;
64aa0685
GS
10917 CLONE_PARAMS clone_params;
10918 CLONE_PARAMS* param = &clone_params;
d2d73c3e 10919
1d7c1841 10920 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
ba869deb 10921 PERL_SET_THX(my_perl);
1d7c1841 10922
acfe0abc 10923# ifdef DEBUGGING
a4530404 10924 Poison(my_perl, 1, PerlInterpreter);
1d7c1841
GS
10925 PL_markstack = 0;
10926 PL_scopestack = 0;
10927 PL_savestack = 0;
22f7c9c9
JH
10928 PL_savestack_ix = 0;
10929 PL_savestack_max = -1;
1d7c1841 10930 PL_retstack = 0;
66fe0623 10931 PL_sig_pending = 0;
25596c82 10932 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
acfe0abc 10933# else /* !DEBUGGING */
1d7c1841 10934 Zero(my_perl, 1, PerlInterpreter);
acfe0abc 10935# endif /* DEBUGGING */
1d7c1841
GS
10936
10937 /* host pointers */
10938 PL_Mem = ipM;
10939 PL_MemShared = ipMS;
10940 PL_MemParse = ipMP;
10941 PL_Env = ipE;
10942 PL_StdIO = ipStd;
10943 PL_LIO = ipLIO;
10944 PL_Dir = ipD;
10945 PL_Sock = ipS;
10946 PL_Proc = ipP;
1d7c1841
GS
10947#else /* !PERL_IMPLICIT_SYS */
10948 IV i;
64aa0685
GS
10949 CLONE_PARAMS clone_params;
10950 CLONE_PARAMS* param = &clone_params;
1d7c1841 10951 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 10952 PERL_SET_THX(my_perl);
1d7c1841 10953
d2d73c3e
AB
10954
10955
1d7c1841 10956# ifdef DEBUGGING
a4530404 10957 Poison(my_perl, 1, PerlInterpreter);
1d7c1841
GS
10958 PL_markstack = 0;
10959 PL_scopestack = 0;
10960 PL_savestack = 0;
22f7c9c9
JH
10961 PL_savestack_ix = 0;
10962 PL_savestack_max = -1;
1d7c1841 10963 PL_retstack = 0;
66fe0623 10964 PL_sig_pending = 0;
25596c82 10965 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
1d7c1841
GS
10966# else /* !DEBUGGING */
10967 Zero(my_perl, 1, PerlInterpreter);
10968# endif /* DEBUGGING */
10969#endif /* PERL_IMPLICIT_SYS */
83236556 10970 param->flags = flags;
59b40662 10971 param->proto_perl = proto_perl;
1d7c1841
GS
10972
10973 /* arena roots */
10974 PL_xiv_arenaroot = NULL;
10975 PL_xiv_root = NULL;
612f20c3 10976 PL_xnv_arenaroot = NULL;
1d7c1841 10977 PL_xnv_root = NULL;
612f20c3 10978 PL_xrv_arenaroot = NULL;
1d7c1841 10979 PL_xrv_root = NULL;
612f20c3 10980 PL_xpv_arenaroot = NULL;
1d7c1841 10981 PL_xpv_root = NULL;
612f20c3 10982 PL_xpviv_arenaroot = NULL;
1d7c1841 10983 PL_xpviv_root = NULL;
612f20c3 10984 PL_xpvnv_arenaroot = NULL;
1d7c1841 10985 PL_xpvnv_root = NULL;
612f20c3 10986 PL_xpvcv_arenaroot = NULL;
1d7c1841 10987 PL_xpvcv_root = NULL;
612f20c3 10988 PL_xpvav_arenaroot = NULL;
1d7c1841 10989 PL_xpvav_root = NULL;
612f20c3 10990 PL_xpvhv_arenaroot = NULL;
1d7c1841 10991 PL_xpvhv_root = NULL;
612f20c3 10992 PL_xpvmg_arenaroot = NULL;
1d7c1841 10993 PL_xpvmg_root = NULL;
612f20c3 10994 PL_xpvlv_arenaroot = NULL;
1d7c1841 10995 PL_xpvlv_root = NULL;
612f20c3 10996 PL_xpvbm_arenaroot = NULL;
1d7c1841 10997 PL_xpvbm_root = NULL;
612f20c3 10998 PL_he_arenaroot = NULL;
1d7c1841
GS
10999 PL_he_root = NULL;
11000 PL_nice_chunk = NULL;
11001 PL_nice_chunk_size = 0;
11002 PL_sv_count = 0;
11003 PL_sv_objcount = 0;
11004 PL_sv_root = Nullsv;
11005 PL_sv_arenaroot = Nullsv;
11006
11007 PL_debug = proto_perl->Idebug;
11008
e5dd39fc 11009#ifdef USE_REENTRANT_API
68853529
SB
11010 /* XXX: things like -Dm will segfault here in perlio, but doing
11011 * PERL_SET_CONTEXT(proto_perl);
11012 * breaks too many other things
11013 */
59bd0823 11014 Perl_reentrant_init(aTHX);
e5dd39fc
AB
11015#endif
11016
1d7c1841
GS
11017 /* create SV map for pointer relocation */
11018 PL_ptr_table = ptr_table_new();
11019
11020 /* initialize these special pointers as early as possible */
11021 SvANY(&PL_sv_undef) = NULL;
11022 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
11023 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
11024 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
11025
1d7c1841 11026 SvANY(&PL_sv_no) = new_XPVNV();
1d7c1841
GS
11027 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
11028 SvFLAGS(&PL_sv_no) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
11029 SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
11030 SvCUR(&PL_sv_no) = 0;
11031 SvLEN(&PL_sv_no) = 1;
11032 SvNVX(&PL_sv_no) = 0;
11033 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
11034
1d7c1841 11035 SvANY(&PL_sv_yes) = new_XPVNV();
1d7c1841
GS
11036 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
11037 SvFLAGS(&PL_sv_yes) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
11038 SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
11039 SvCUR(&PL_sv_yes) = 1;
11040 SvLEN(&PL_sv_yes) = 2;
11041 SvNVX(&PL_sv_yes) = 1;
11042 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
11043
05ec9bb3 11044 /* create (a non-shared!) shared string table */
1d7c1841
GS
11045 PL_strtab = newHV();
11046 HvSHAREKEYS_off(PL_strtab);
11047 hv_ksplit(PL_strtab, 512);
11048 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
11049
05ec9bb3
NIS
11050 PL_compiling = proto_perl->Icompiling;
11051
11052 /* These two PVs will be free'd special way so must set them same way op.c does */
11053 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
11054 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
11055
11056 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
11057 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
11058
1d7c1841
GS
11059 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
11060 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 11061 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 11062 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 11063 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
11064 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
11065
11066 /* pseudo environmental stuff */
11067 PL_origargc = proto_perl->Iorigargc;
e2975953 11068 PL_origargv = proto_perl->Iorigargv;
d2d73c3e 11069
d2d73c3e
AB
11070 param->stashes = newAV(); /* Setup array of objects to call clone on */
11071
a1ea730d 11072#ifdef PERLIO_LAYERS
3a1ee7e8
NIS
11073 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11074 PerlIO_clone(aTHX_ proto_perl, param);
a1ea730d 11075#endif
d2d73c3e
AB
11076
11077 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
11078 PL_incgv = gv_dup(proto_perl->Iincgv, param);
11079 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 11080 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
11081 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
11082 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
11083
11084 /* switches */
11085 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 11086 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
11087 PL_localpatches = proto_perl->Ilocalpatches;
11088 PL_splitstr = proto_perl->Isplitstr;
11089 PL_preprocess = proto_perl->Ipreprocess;
11090 PL_minus_n = proto_perl->Iminus_n;
11091 PL_minus_p = proto_perl->Iminus_p;
11092 PL_minus_l = proto_perl->Iminus_l;
11093 PL_minus_a = proto_perl->Iminus_a;
11094 PL_minus_F = proto_perl->Iminus_F;
11095 PL_doswitches = proto_perl->Idoswitches;
11096 PL_dowarn = proto_perl->Idowarn;
11097 PL_doextract = proto_perl->Idoextract;
11098 PL_sawampersand = proto_perl->Isawampersand;
11099 PL_unsafe = proto_perl->Iunsafe;
11100 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 11101 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
11102 PL_perldb = proto_perl->Iperldb;
11103 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
1cbb0781 11104 PL_exit_flags = proto_perl->Iexit_flags;
1d7c1841
GS
11105
11106 /* magical thingies */
11107 /* XXX time(&PL_basetime) when asked for? */
11108 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 11109 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
11110
11111 PL_maxsysfd = proto_perl->Imaxsysfd;
11112 PL_multiline = proto_perl->Imultiline;
11113 PL_statusvalue = proto_perl->Istatusvalue;
11114#ifdef VMS
11115 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
11116#endif
0a378802 11117 PL_encoding = sv_dup(proto_perl->Iencoding, param);
1d7c1841 11118
4a4c6fe3 11119 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
1f483ca1
JH
11120 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
11121 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
4a4c6fe3 11122
d2f185dc
AMS
11123 /* Clone the regex array */
11124 PL_regex_padav = newAV();
11125 {
11126 I32 len = av_len((AV*)proto_perl->Iregex_padav);
11127 SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
0f95fc41
AB
11128 av_push(PL_regex_padav,
11129 sv_dup_inc(regexen[0],param));
11130 for(i = 1; i <= len; i++) {
11131 if(SvREPADTMP(regexen[i])) {
11132 av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
8cf8f3d1 11133 } else {
0f95fc41
AB
11134 av_push(PL_regex_padav,
11135 SvREFCNT_inc(
8cf8f3d1 11136 newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
cbfa9890 11137 SvIVX(regexen[i])), param)))
0f95fc41
AB
11138 ));
11139 }
d2f185dc
AMS
11140 }
11141 }
11142 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 11143
1d7c1841 11144 /* shortcuts to various I/O objects */
d2d73c3e
AB
11145 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
11146 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
11147 PL_defgv = gv_dup(proto_perl->Idefgv, param);
11148 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
11149 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
11150 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
11151
11152 /* shortcuts to regexp stuff */
d2d73c3e 11153 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
11154
11155 /* shortcuts to misc objects */
d2d73c3e 11156 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
11157
11158 /* shortcuts to debugging objects */
d2d73c3e
AB
11159 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
11160 PL_DBline = gv_dup(proto_perl->IDBline, param);
11161 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
11162 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
11163 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
11164 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
06492da6 11165 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
d2d73c3e
AB
11166 PL_lineary = av_dup(proto_perl->Ilineary, param);
11167 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
11168
11169 /* symbol tables */
d2d73c3e
AB
11170 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
11171 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
d2d73c3e
AB
11172 PL_debstash = hv_dup(proto_perl->Idebstash, param);
11173 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
11174 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
11175
11176 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
ee1c5a4e 11177 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
ece599bd 11178 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
d2d73c3e
AB
11179 PL_endav = av_dup_inc(proto_perl->Iendav, param);
11180 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
11181 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
11182
11183 PL_sub_generation = proto_perl->Isub_generation;
11184
11185 /* funky return mechanisms */
11186 PL_forkprocess = proto_perl->Iforkprocess;
11187
11188 /* subprocess state */
d2d73c3e 11189 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
11190
11191 /* internal state */
11192 PL_tainting = proto_perl->Itainting;
7135f00b 11193 PL_taint_warn = proto_perl->Itaint_warn;
1d7c1841
GS
11194 PL_maxo = proto_perl->Imaxo;
11195 if (proto_perl->Iop_mask)
11196 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11197 else
11198 PL_op_mask = Nullch;
06492da6 11199 /* PL_asserting = proto_perl->Iasserting; */
1d7c1841
GS
11200
11201 /* current interpreter roots */
d2d73c3e 11202 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
11203 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
11204 PL_main_start = proto_perl->Imain_start;
e977893f 11205 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
11206 PL_eval_start = proto_perl->Ieval_start;
11207
11208 /* runtime control stuff */
11209 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
11210 PL_copline = proto_perl->Icopline;
11211
11212 PL_filemode = proto_perl->Ifilemode;
11213 PL_lastfd = proto_perl->Ilastfd;
11214 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
11215 PL_Argv = NULL;
11216 PL_Cmd = Nullch;
11217 PL_gensym = proto_perl->Igensym;
11218 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 11219 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
11220 PL_laststatval = proto_perl->Ilaststatval;
11221 PL_laststype = proto_perl->Ilaststype;
11222 PL_mess_sv = Nullsv;
11223
d2d73c3e 11224 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
11225 PL_ofmt = SAVEPV(proto_perl->Iofmt);
11226
11227 /* interpreter atexit processing */
11228 PL_exitlistlen = proto_perl->Iexitlistlen;
11229 if (PL_exitlistlen) {
11230 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11231 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11232 }
11233 else
11234 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 11235 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
19e8ce8e
AB
11236 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
11237 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1d7c1841
GS
11238
11239 PL_profiledata = NULL;
a8fc9800 11240 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
1d7c1841 11241 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 11242 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 11243
d2d73c3e 11244 PL_compcv = cv_dup(proto_perl->Icompcv, param);
dd2155a4
DM
11245
11246 PAD_CLONE_VARS(proto_perl, param);
1d7c1841
GS
11247
11248#ifdef HAVE_INTERP_INTERN
11249 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11250#endif
11251
11252 /* more statics moved here */
11253 PL_generation = proto_perl->Igeneration;
d2d73c3e 11254 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
11255
11256 PL_in_clean_objs = proto_perl->Iin_clean_objs;
11257 PL_in_clean_all = proto_perl->Iin_clean_all;
11258
11259 PL_uid = proto_perl->Iuid;
11260 PL_euid = proto_perl->Ieuid;
11261 PL_gid = proto_perl->Igid;
11262 PL_egid = proto_perl->Iegid;
11263 PL_nomemok = proto_perl->Inomemok;
11264 PL_an = proto_perl->Ian;
1d7c1841
GS
11265 PL_op_seqmax = proto_perl->Iop_seqmax;
11266 PL_evalseq = proto_perl->Ievalseq;
11267 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
11268 PL_origalen = proto_perl->Iorigalen;
11269 PL_pidstatus = newHV(); /* XXX flag for cloning? */
11270 PL_osname = SAVEPV(proto_perl->Iosname);
5c728af0 11271 PL_sh_path_compat = proto_perl->Ish_path_compat; /* XXX never deallocated */
1d7c1841
GS
11272 PL_sighandlerp = proto_perl->Isighandlerp;
11273
11274
11275 PL_runops = proto_perl->Irunops;
11276
11277 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
11278
11279#ifdef CSH
11280 PL_cshlen = proto_perl->Icshlen;
74f1b2b8 11281 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
1d7c1841
GS
11282#endif
11283
11284 PL_lex_state = proto_perl->Ilex_state;
11285 PL_lex_defer = proto_perl->Ilex_defer;
11286 PL_lex_expect = proto_perl->Ilex_expect;
11287 PL_lex_formbrack = proto_perl->Ilex_formbrack;
11288 PL_lex_dojoin = proto_perl->Ilex_dojoin;
11289 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
11290 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
11291 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
11292 PL_lex_op = proto_perl->Ilex_op;
11293 PL_lex_inpat = proto_perl->Ilex_inpat;
11294 PL_lex_inwhat = proto_perl->Ilex_inwhat;
11295 PL_lex_brackets = proto_perl->Ilex_brackets;
11296 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
11297 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
11298 PL_lex_casemods = proto_perl->Ilex_casemods;
11299 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
11300 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
11301
11302 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
11303 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
11304 PL_nexttoke = proto_perl->Inexttoke;
11305
1d773130
TB
11306 /* XXX This is probably masking the deeper issue of why
11307 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
11308 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
11309 * (A little debugging with a watchpoint on it may help.)
11310 */
389edf32
TB
11311 if (SvANY(proto_perl->Ilinestr)) {
11312 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
11313 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
11314 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11315 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
11316 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11317 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
11318 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11319 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
11320 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11321 }
11322 else {
11323 PL_linestr = NEWSV(65,79);
11324 sv_upgrade(PL_linestr,SVt_PVIV);
11325 sv_setpvn(PL_linestr,"",0);
11326 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
11327 }
1d7c1841 11328 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1d7c1841
GS
11329 PL_pending_ident = proto_perl->Ipending_ident;
11330 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
11331
11332 PL_expect = proto_perl->Iexpect;
11333
11334 PL_multi_start = proto_perl->Imulti_start;
11335 PL_multi_end = proto_perl->Imulti_end;
11336 PL_multi_open = proto_perl->Imulti_open;
11337 PL_multi_close = proto_perl->Imulti_close;
11338
11339 PL_error_count = proto_perl->Ierror_count;
11340 PL_subline = proto_perl->Isubline;
d2d73c3e 11341 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841 11342
1d773130 11343 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
389edf32
TB
11344 if (SvANY(proto_perl->Ilinestr)) {
11345 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
11346 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11347 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
11348 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11349 PL_last_lop_op = proto_perl->Ilast_lop_op;
11350 }
11351 else {
11352 PL_last_uni = SvPVX(PL_linestr);
11353 PL_last_lop = SvPVX(PL_linestr);
11354 PL_last_lop_op = 0;
11355 }
1d7c1841 11356 PL_in_my = proto_perl->Iin_my;
d2d73c3e 11357 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
11358#ifdef FCRYPT
11359 PL_cryptseen = proto_perl->Icryptseen;
11360#endif
11361
11362 PL_hints = proto_perl->Ihints;
11363
11364 PL_amagic_generation = proto_perl->Iamagic_generation;
11365
11366#ifdef USE_LOCALE_COLLATE
11367 PL_collation_ix = proto_perl->Icollation_ix;
11368 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
11369 PL_collation_standard = proto_perl->Icollation_standard;
11370 PL_collxfrm_base = proto_perl->Icollxfrm_base;
11371 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
11372#endif /* USE_LOCALE_COLLATE */
11373
11374#ifdef USE_LOCALE_NUMERIC
11375 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
11376 PL_numeric_standard = proto_perl->Inumeric_standard;
11377 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 11378 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
11379#endif /* !USE_LOCALE_NUMERIC */
11380
11381 /* utf8 character classes */
d2d73c3e
AB
11382 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
11383 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
11384 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
11385 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
11386 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
11387 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
11388 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
11389 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
11390 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
11391 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
11392 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
11393 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
11394 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
11395 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
11396 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
11397 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
11398 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
b4e400f9 11399 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
82686b01
JH
11400 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
11401 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 11402
6c3182a5 11403 /* Did the locale setup indicate UTF-8? */
9769094f 11404 PL_utf8locale = proto_perl->Iutf8locale;
6c3182a5
JH
11405 /* Unicode features (see perlrun/-C) */
11406 PL_unicode = proto_perl->Iunicode;
11407
11408 /* Pre-5.8 signals control */
11409 PL_signals = proto_perl->Isignals;
11410
11411 /* times() ticks per second */
11412 PL_clocktick = proto_perl->Iclocktick;
11413
11414 /* Recursion stopper for PerlIO_find_layer */
11415 PL_in_load_module = proto_perl->Iin_load_module;
11416
11417 /* sort() routine */
11418 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
11419
57c6e6d2
JH
11420 /* Not really needed/useful since the reenrant_retint is "volatile",
11421 * but do it for consistency's sake. */
11422 PL_reentrant_retint = proto_perl->Ireentrant_retint;
11423
15a5279a
JH
11424 /* Hooks to shared SVs and locks. */
11425 PL_sharehook = proto_perl->Isharehook;
11426 PL_lockhook = proto_perl->Ilockhook;
11427 PL_unlockhook = proto_perl->Iunlockhook;
11428 PL_threadhook = proto_perl->Ithreadhook;
11429
bce260cd
JH
11430 PL_runops_std = proto_perl->Irunops_std;
11431 PL_runops_dbg = proto_perl->Irunops_dbg;
11432
11433#ifdef THREADS_HAVE_PIDS
11434 PL_ppid = proto_perl->Ippid;
11435#endif
11436
1d7c1841
GS
11437 /* swatch cache */
11438 PL_last_swash_hv = Nullhv; /* reinits on demand */
11439 PL_last_swash_klen = 0;
11440 PL_last_swash_key[0]= '\0';
11441 PL_last_swash_tmps = (U8*)NULL;
11442 PL_last_swash_slen = 0;
11443
11444 /* perly.c globals */
11445 PL_yydebug = proto_perl->Iyydebug;
11446 PL_yynerrs = proto_perl->Iyynerrs;
11447 PL_yyerrflag = proto_perl->Iyyerrflag;
11448 PL_yychar = proto_perl->Iyychar;
11449 PL_yyval = proto_perl->Iyyval;
11450 PL_yylval = proto_perl->Iyylval;
11451
11452 PL_glob_index = proto_perl->Iglob_index;
11453 PL_srand_called = proto_perl->Isrand_called;
504f80c1 11454 PL_hash_seed = proto_perl->Ihash_seed;
008fb0c0 11455 PL_rehash_seed = proto_perl->Irehash_seed;
1d7c1841
GS
11456 PL_uudmap['M'] = 0; /* reinits on demand */
11457 PL_bitcount = Nullch; /* reinits on demand */
11458
66fe0623
NIS
11459 if (proto_perl->Ipsig_pend) {
11460 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 11461 }
66fe0623
NIS
11462 else {
11463 PL_psig_pend = (int*)NULL;
11464 }
11465
1d7c1841 11466 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
11467 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
11468 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 11469 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
11470 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
11471 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
11472 }
11473 }
11474 else {
11475 PL_psig_ptr = (SV**)NULL;
11476 PL_psig_name = (SV**)NULL;
11477 }
11478
11479 /* thrdvar.h stuff */
11480
a0739874 11481 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
11482 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
11483 PL_tmps_ix = proto_perl->Ttmps_ix;
11484 PL_tmps_max = proto_perl->Ttmps_max;
11485 PL_tmps_floor = proto_perl->Ttmps_floor;
11486 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
11487 i = 0;
11488 while (i <= PL_tmps_ix) {
d2d73c3e 11489 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
11490 ++i;
11491 }
11492
11493 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
11494 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
11495 Newz(54, PL_markstack, i, I32);
11496 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
11497 - proto_perl->Tmarkstack);
11498 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
11499 - proto_perl->Tmarkstack);
11500 Copy(proto_perl->Tmarkstack, PL_markstack,
11501 PL_markstack_ptr - PL_markstack + 1, I32);
11502
11503 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
11504 * NOTE: unlike the others! */
11505 PL_scopestack_ix = proto_perl->Tscopestack_ix;
11506 PL_scopestack_max = proto_perl->Tscopestack_max;
11507 Newz(54, PL_scopestack, PL_scopestack_max, I32);
11508 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
11509
11510 /* next push_return() sets PL_retstack[PL_retstack_ix]
11511 * NOTE: unlike the others! */
11512 PL_retstack_ix = proto_perl->Tretstack_ix;
11513 PL_retstack_max = proto_perl->Tretstack_max;
11514 Newz(54, PL_retstack, PL_retstack_max, OP*);
ce0a1ae0 11515 Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, OP*);
1d7c1841
GS
11516
11517 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 11518 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
11519
11520 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
11521 PL_curstack = av_dup(proto_perl->Tcurstack, param);
11522 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
11523
11524 /* next PUSHs() etc. set *(PL_stack_sp+1) */
11525 PL_stack_base = AvARRAY(PL_curstack);
11526 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
11527 - proto_perl->Tstack_base);
11528 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
11529
11530 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
11531 * NOTE: unlike the others! */
11532 PL_savestack_ix = proto_perl->Tsavestack_ix;
11533 PL_savestack_max = proto_perl->Tsavestack_max;
11534 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 11535 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
11536 }
11537 else {
11538 init_stacks();
985e7056 11539 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
11540 }
11541
11542 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
11543 PL_top_env = &PL_start_env;
11544
11545 PL_op = proto_perl->Top;
11546
11547 PL_Sv = Nullsv;
11548 PL_Xpv = (XPV*)NULL;
11549 PL_na = proto_perl->Tna;
11550
11551 PL_statbuf = proto_perl->Tstatbuf;
11552 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
11553 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
11554 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
11555#ifdef HAS_TIMES
11556 PL_timesbuf = proto_perl->Ttimesbuf;
11557#endif
11558
11559 PL_tainted = proto_perl->Ttainted;
11560 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
11561 PL_rs = sv_dup_inc(proto_perl->Trs, param);
11562 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
11563 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
11564 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 11565 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
11566 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
11567 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
11568 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
11569
11570 PL_restartop = proto_perl->Trestartop;
11571 PL_in_eval = proto_perl->Tin_eval;
11572 PL_delaymagic = proto_perl->Tdelaymagic;
11573 PL_dirty = proto_perl->Tdirty;
11574 PL_localizing = proto_perl->Tlocalizing;
11575
14dd3ad8 11576#ifdef PERL_FLEXIBLE_EXCEPTIONS
1d7c1841 11577 PL_protect = proto_perl->Tprotect;
14dd3ad8 11578#endif
d2d73c3e 11579 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
dd28f7bb 11580 PL_hv_fetch_ent_mh = Nullhe;
1d7c1841
GS
11581 PL_modcount = proto_perl->Tmodcount;
11582 PL_lastgotoprobe = Nullop;
11583 PL_dumpindent = proto_perl->Tdumpindent;
11584
11585 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
11586 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
11587 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
11588 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
11589 PL_sortcxix = proto_perl->Tsortcxix;
11590 PL_efloatbuf = Nullch; /* reinits on demand */
11591 PL_efloatsize = 0; /* reinits on demand */
11592
11593 /* regex stuff */
11594
11595 PL_screamfirst = NULL;
11596 PL_screamnext = NULL;
11597 PL_maxscream = -1; /* reinits on demand */
11598 PL_lastscream = Nullsv;
11599
11600 PL_watchaddr = NULL;
11601 PL_watchok = Nullch;
11602
11603 PL_regdummy = proto_perl->Tregdummy;
1d7c1841
GS
11604 PL_regprecomp = Nullch;
11605 PL_regnpar = 0;
11606 PL_regsize = 0;
1d7c1841
GS
11607 PL_colorset = 0; /* reinits PL_colors[] */
11608 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841
GS
11609 PL_reginput = Nullch;
11610 PL_regbol = Nullch;
11611 PL_regeol = Nullch;
11612 PL_regstartp = (I32*)NULL;
11613 PL_regendp = (I32*)NULL;
11614 PL_reglastparen = (U32*)NULL;
2d862feb 11615 PL_reglastcloseparen = (U32*)NULL;
1d7c1841 11616 PL_regtill = Nullch;
1d7c1841
GS
11617 PL_reg_start_tmp = (char**)NULL;
11618 PL_reg_start_tmpl = 0;
11619 PL_regdata = (struct reg_data*)NULL;
11620 PL_bostr = Nullch;
11621 PL_reg_flags = 0;
11622 PL_reg_eval_set = 0;
11623 PL_regnarrate = 0;
11624 PL_regprogram = (regnode*)NULL;
11625 PL_regindent = 0;
11626 PL_regcc = (CURCUR*)NULL;
11627 PL_reg_call_cc = (struct re_cc_state*)NULL;
11628 PL_reg_re = (regexp*)NULL;
11629 PL_reg_ganch = Nullch;
11630 PL_reg_sv = Nullsv;
53c4c00c 11631 PL_reg_match_utf8 = FALSE;
1d7c1841
GS
11632 PL_reg_magic = (MAGIC*)NULL;
11633 PL_reg_oldpos = 0;
11634 PL_reg_oldcurpm = (PMOP*)NULL;
11635 PL_reg_curpm = (PMOP*)NULL;
11636 PL_reg_oldsaved = Nullch;
11637 PL_reg_oldsavedlen = 0;
ed252734 11638#ifdef PERL_COPY_ON_WRITE
504cff3b 11639 PL_nrs = Nullsv;
ed252734 11640#endif
1d7c1841
GS
11641 PL_reg_maxiter = 0;
11642 PL_reg_leftiter = 0;
11643 PL_reg_poscache = Nullch;
11644 PL_reg_poscache_size= 0;
11645
11646 /* RE engine - function pointers */
11647 PL_regcompp = proto_perl->Tregcompp;
11648 PL_regexecp = proto_perl->Tregexecp;
11649 PL_regint_start = proto_perl->Tregint_start;
11650 PL_regint_string = proto_perl->Tregint_string;
11651 PL_regfree = proto_perl->Tregfree;
11652
11653 PL_reginterp_cnt = 0;
11654 PL_reg_starttry = 0;
11655
a2efc822
SC
11656 /* Pluggable optimizer */
11657 PL_peepp = proto_perl->Tpeepp;
11658
081fc587
AB
11659 PL_stashcache = newHV();
11660
a0739874
DM
11661 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
11662 ptr_table_free(PL_ptr_table);
11663 PL_ptr_table = NULL;
11664 }
8cf8f3d1 11665
f284b03f
AMS
11666 /* Call the ->CLONE method, if it exists, for each of the stashes
11667 identified by sv_dup() above.
11668 */
d2d73c3e
AB
11669 while(av_len(param->stashes) != -1) {
11670 HV* stash = (HV*) av_shift(param->stashes);
f284b03f
AMS
11671 GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
11672 if (cloner && GvCV(cloner)) {
11673 dSP;
11674 ENTER;
11675 SAVETMPS;
11676 PUSHMARK(SP);
dc507217 11677 XPUSHs(sv_2mortal(newSVpv(HvNAME(stash), 0)));
f284b03f
AMS
11678 PUTBACK;
11679 call_sv((SV*)GvCV(cloner), G_DISCARD);
11680 FREETMPS;
11681 LEAVE;
11682 }
4a09accc 11683 }
a0739874 11684
dc507217 11685 SvREFCNT_dec(param->stashes);
dc507217 11686
1d7c1841 11687 return my_perl;
1d7c1841
GS
11688}
11689
1d7c1841 11690#endif /* USE_ITHREADS */
a0ae6670 11691
9f4817db 11692/*
ccfc67b7
JH
11693=head1 Unicode Support
11694
9f4817db
JH
11695=for apidoc sv_recode_to_utf8
11696
5d170f3a
JH
11697The encoding is assumed to be an Encode object, on entry the PV
11698of the sv is assumed to be octets in that encoding, and the sv
11699will be converted into Unicode (and UTF-8).
9f4817db 11700
5d170f3a
JH
11701If the sv already is UTF-8 (or if it is not POK), or if the encoding
11702is not a reference, nothing is done to the sv. If the encoding is not
1768d7eb
JH
11703an C<Encode::XS> Encoding object, bad things will happen.
11704(See F<lib/encoding.pm> and L<Encode>).
9f4817db 11705
5d170f3a 11706The PV of the sv is returned.
9f4817db 11707
5d170f3a
JH
11708=cut */
11709
11710char *
11711Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
11712{
220e2d4e 11713 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
d0063567
DK
11714 SV *uni;
11715 STRLEN len;
11716 char *s;
11717 dSP;
11718 ENTER;
11719 SAVETMPS;
220e2d4e 11720 save_re_context();
d0063567
DK
11721 PUSHMARK(sp);
11722 EXTEND(SP, 3);
11723 XPUSHs(encoding);
11724 XPUSHs(sv);
f9893866
NIS
11725/*
11726 NI-S 2002/07/09
11727 Passing sv_yes is wrong - it needs to be or'ed set of constants
11728 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
11729 remove converted chars from source.
11730
11731 Both will default the value - let them.
11732
d0063567 11733 XPUSHs(&PL_sv_yes);
f9893866 11734*/
d0063567
DK
11735 PUTBACK;
11736 call_method("decode", G_SCALAR);
11737 SPAGAIN;
11738 uni = POPs;
11739 PUTBACK;
11740 s = SvPV(uni, len);
d0063567
DK
11741 if (s != SvPVX(sv)) {
11742 SvGROW(sv, len + 1);
11743 Move(s, SvPVX(sv), len, char);
11744 SvCUR_set(sv, len);
11745 SvPVX(sv)[len] = 0;
11746 }
11747 FREETMPS;
11748 LEAVE;
d0063567 11749 SvUTF8_on(sv);
f9893866
NIS
11750 }
11751 return SvPVX(sv);
9f4817db
JH
11752}
11753
220e2d4e
IH
11754/*
11755=for apidoc sv_cat_decode
11756
11757The encoding is assumed to be an Encode object, the PV of the ssv is
11758assumed to be octets in that encoding and decoding the input starts
11759from the position which (PV + *offset) pointed to. The dsv will be
11760concatenated the decoded UTF-8 string from ssv. Decoding will terminate
11761when the string tstr appears in decoding output or the input ends on
11762the PV of the ssv. The value which the offset points will be modified
11763to the last input position on the ssv.
68795e93 11764
220e2d4e
IH
11765Returns TRUE if the terminator was found, else returns FALSE.
11766
11767=cut */
11768
11769bool
11770Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
11771 SV *ssv, int *offset, char *tstr, int tlen)
11772{
a73e8557 11773 bool ret = FALSE;
220e2d4e 11774 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
220e2d4e
IH
11775 SV *offsv;
11776 dSP;
11777 ENTER;
11778 SAVETMPS;
11779 save_re_context();
11780 PUSHMARK(sp);
11781 EXTEND(SP, 6);
11782 XPUSHs(encoding);
11783 XPUSHs(dsv);
11784 XPUSHs(ssv);
11785 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
11786 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
11787 PUTBACK;
11788 call_method("cat_decode", G_SCALAR);
11789 SPAGAIN;
11790 ret = SvTRUE(TOPs);
11791 *offset = SvIV(offsv);
11792 PUTBACK;
11793 FREETMPS;
11794 LEAVE;
220e2d4e 11795 }
a73e8557
JH
11796 else
11797 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
11798 return ret;
220e2d4e 11799}
f9893866 11800