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