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