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