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