This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PATCH: tweak 'split' docs for case of explicit 0 LIMIT
[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;
dd28f7bb 3090 case SVt_PVLV: s = SvROK(sv) ? "REF":"LVALUE"; break;
ed6116ce
LW
3091 case SVt_PVAV: s = "ARRAY"; break;
3092 case SVt_PVHV: s = "HASH"; break;
3093 case SVt_PVCV: s = "CODE"; break;
3094 case SVt_PVGV: s = "GLOB"; break;
1d2dff63 3095 case SVt_PVFM: s = "FORMAT"; break;
36477c24 3096 case SVt_PVIO: s = "IO"; break;
ed6116ce
LW
3097 default: s = "UNKNOWN"; break;
3098 }
46fc3d4c 3099 tsv = NEWSV(0,0);
de11ba31 3100 if (SvOBJECT(sv))
e27ad1f2
AV
3101 if (HvNAME(SvSTASH(sv)))
3102 Perl_sv_setpvf(aTHX_ tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
3103 else
3104 Perl_sv_setpvf(aTHX_ tsv, "__ANON__=%s", s);
ed6116ce 3105 else
46fc3d4c 3106 sv_setpv(tsv, s);
57def98f 3107 Perl_sv_catpvf(aTHX_ tsv, "(0x%"UVxf")", PTR2UV(sv));
a0d0e21e 3108 goto tokensaveref;
463ee0b2 3109 }
ed6116ce
LW
3110 *lp = strlen(s);
3111 return s;
79072805 3112 }
0336b60e 3113 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 3114 if (ckWARN(WARN_UNINITIALIZED))
1d7c1841 3115 report_uninit();
ed6116ce
LW
3116 *lp = 0;
3117 return "";
79072805 3118 }
79072805 3119 }
28e5dec8
JH
3120 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
3121 /* I'm assuming that if both IV and NV are equally valid then
3122 converting the IV is going to be more efficient */
3123 U32 isIOK = SvIOK(sv);
3124 U32 isUIOK = SvIsUV(sv);
3125 char buf[TYPE_CHARS(UV)];
3126 char *ebuf, *ptr;
3127
3128 if (SvTYPE(sv) < SVt_PVIV)
3129 sv_upgrade(sv, SVt_PVIV);
3130 if (isUIOK)
3131 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
3132 else
3133 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
eb160463 3134 SvGROW(sv, (STRLEN)(ebuf - ptr + 1)); /* inlined from sv_setpvn */
28e5dec8
JH
3135 Move(ptr,SvPVX(sv),ebuf - ptr,char);
3136 SvCUR_set(sv, ebuf - ptr);
3137 s = SvEND(sv);
3138 *s = '\0';
3139 if (isIOK)
3140 SvIOK_on(sv);
3141 else
3142 SvIOKp_on(sv);
3143 if (isUIOK)
3144 SvIsUV_on(sv);
3145 }
3146 else if (SvNOKp(sv)) {
79072805
LW
3147 if (SvTYPE(sv) < SVt_PVNV)
3148 sv_upgrade(sv, SVt_PVNV);
1c846c1f 3149 /* The +20 is pure guesswork. Configure test needed. --jhi */
59155cc0 3150 SvGROW(sv, NV_DIG + 20);
463ee0b2 3151 s = SvPVX(sv);
79072805 3152 olderrno = errno; /* some Xenix systems wipe out errno here */
79072805 3153#ifdef apollo
463ee0b2 3154 if (SvNVX(sv) == 0.0)
79072805
LW
3155 (void)strcpy(s,"0");
3156 else
3157#endif /*apollo*/
bbce6d69 3158 {
2d4389e4 3159 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 3160 }
79072805 3161 errno = olderrno;
a0d0e21e
LW
3162#ifdef FIXNEGATIVEZERO
3163 if (*s == '-' && s[1] == '0' && !s[2])
3164 strcpy(s,"0");
3165#endif
79072805
LW
3166 while (*s) s++;
3167#ifdef hcx
3168 if (s[-1] == '.')
46fc3d4c 3169 *--s = '\0';
79072805
LW
3170#endif
3171 }
79072805 3172 else {
0336b60e
IZ
3173 if (ckWARN(WARN_UNINITIALIZED)
3174 && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1d7c1841 3175 report_uninit();
a0d0e21e 3176 *lp = 0;
25da4f38
IZ
3177 if (SvTYPE(sv) < SVt_PV)
3178 /* Typically the caller expects that sv_any is not NULL now. */
3179 sv_upgrade(sv, SVt_PV);
a0d0e21e 3180 return "";
79072805 3181 }
463ee0b2
LW
3182 *lp = s - SvPVX(sv);
3183 SvCUR_set(sv, *lp);
79072805 3184 SvPOK_on(sv);
1d7c1841
GS
3185 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3186 PTR2UV(sv),SvPVX(sv)));
463ee0b2 3187 return SvPVX(sv);
a0d0e21e
LW
3188
3189 tokensave:
3190 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
3191 /* Sneaky stuff here */
3192
3193 tokensaveref:
46fc3d4c 3194 if (!tsv)
96827780 3195 tsv = newSVpv(tmpbuf, 0);
46fc3d4c 3196 sv_2mortal(tsv);
3197 *lp = SvCUR(tsv);
3198 return SvPVX(tsv);
a0d0e21e
LW
3199 }
3200 else {
3201 STRLEN len;
46fc3d4c 3202 char *t;
3203
3204 if (tsv) {
3205 sv_2mortal(tsv);
3206 t = SvPVX(tsv);
3207 len = SvCUR(tsv);
3208 }
3209 else {
96827780
MB
3210 t = tmpbuf;
3211 len = strlen(tmpbuf);
46fc3d4c 3212 }
a0d0e21e 3213#ifdef FIXNEGATIVEZERO
46fc3d4c 3214 if (len == 2 && t[0] == '-' && t[1] == '0') {
3215 t = "0";
3216 len = 1;
3217 }
a0d0e21e
LW
3218#endif
3219 (void)SvUPGRADE(sv, SVt_PV);
46fc3d4c 3220 *lp = len;
a0d0e21e
LW
3221 s = SvGROW(sv, len + 1);
3222 SvCUR_set(sv, len);
46fc3d4c 3223 (void)strcpy(s, t);
6bf554b4 3224 SvPOKp_on(sv);
a0d0e21e
LW
3225 return s;
3226 }
463ee0b2
LW
3227}
3228
645c22ef 3229/*
6050d10e
JP
3230=for apidoc sv_copypv
3231
3232Copies a stringified representation of the source SV into the
3233destination SV. Automatically performs any necessary mg_get and
54f0641b 3234coercion of numeric values into strings. Guaranteed to preserve
6050d10e 3235UTF-8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
3236sv_2pv[_flags] but operates directly on an SV instead of just the
3237string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
3238would lose the UTF-8'ness of the PV.
3239
3240=cut
3241*/
3242
3243void
3244Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
3245{
446eaa42
YST
3246 STRLEN len;
3247 char *s;
3248 s = SvPV(ssv,len);
cb50f42d 3249 sv_setpvn(dsv,s,len);
446eaa42 3250 if (SvUTF8(ssv))
cb50f42d 3251 SvUTF8_on(dsv);
446eaa42 3252 else
cb50f42d 3253 SvUTF8_off(dsv);
6050d10e
JP
3254}
3255
3256/*
645c22ef
DM
3257=for apidoc sv_2pvbyte_nolen
3258
3259Return a pointer to the byte-encoded representation of the SV.
3260May cause the SV to be downgraded from UTF8 as a side-effect.
3261
3262Usually accessed via the C<SvPVbyte_nolen> macro.
3263
3264=cut
3265*/
3266
7340a771
GS
3267char *
3268Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
3269{
560a288e
GS
3270 STRLEN n_a;
3271 return sv_2pvbyte(sv, &n_a);
7340a771
GS
3272}
3273
645c22ef
DM
3274/*
3275=for apidoc sv_2pvbyte
3276
3277Return a pointer to the byte-encoded representation of the SV, and set *lp
3278to its length. May cause the SV to be downgraded from UTF8 as a
3279side-effect.
3280
3281Usually accessed via the C<SvPVbyte> macro.
3282
3283=cut
3284*/
3285
7340a771
GS
3286char *
3287Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
3288{
0875d2fe
NIS
3289 sv_utf8_downgrade(sv,0);
3290 return SvPV(sv,*lp);
7340a771
GS
3291}
3292
645c22ef
DM
3293/*
3294=for apidoc sv_2pvutf8_nolen
3295
3296Return a pointer to the UTF8-encoded representation of the SV.
3297May cause the SV to be upgraded to UTF8 as a side-effect.
3298
3299Usually accessed via the C<SvPVutf8_nolen> macro.
3300
3301=cut
3302*/
3303
7340a771
GS
3304char *
3305Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
3306{
560a288e
GS
3307 STRLEN n_a;
3308 return sv_2pvutf8(sv, &n_a);
7340a771
GS
3309}
3310
645c22ef
DM
3311/*
3312=for apidoc sv_2pvutf8
3313
3314Return a pointer to the UTF8-encoded representation of the SV, and set *lp
3315to its length. May cause the SV to be upgraded to UTF8 as a side-effect.
3316
3317Usually accessed via the C<SvPVutf8> macro.
3318
3319=cut
3320*/
3321
7340a771
GS
3322char *
3323Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
3324{
560a288e 3325 sv_utf8_upgrade(sv);
7d59b7e4 3326 return SvPV(sv,*lp);
7340a771 3327}
1c846c1f 3328
645c22ef
DM
3329/*
3330=for apidoc sv_2bool
3331
3332This function is only called on magical items, and is only used by
8cf8f3d1 3333sv_true() or its macro equivalent.
645c22ef
DM
3334
3335=cut
3336*/
3337
463ee0b2 3338bool
864dbfa3 3339Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 3340{
8990e307 3341 if (SvGMAGICAL(sv))
463ee0b2
LW
3342 mg_get(sv);
3343
a0d0e21e
LW
3344 if (!SvOK(sv))
3345 return 0;
3346 if (SvROK(sv)) {
a0d0e21e 3347 SV* tmpsv;
1554e226 3348 if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
9e3013b1 3349 (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
8a31060d 3350 return (bool)SvTRUE(tmpsv);
a0d0e21e
LW
3351 return SvRV(sv) != 0;
3352 }
463ee0b2 3353 if (SvPOKp(sv)) {
11343788
MB
3354 register XPV* Xpvtmp;
3355 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
3356 (*Xpvtmp->xpv_pv > '0' ||
3357 Xpvtmp->xpv_cur > 1 ||
3358 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
463ee0b2
LW
3359 return 1;
3360 else
3361 return 0;
3362 }
3363 else {
3364 if (SvIOKp(sv))
3365 return SvIVX(sv) != 0;
3366 else {
3367 if (SvNOKp(sv))
3368 return SvNVX(sv) != 0.0;
3369 else
3370 return FALSE;
3371 }
3372 }
79072805
LW
3373}
3374
09540bc3
JH
3375/* sv_utf8_upgrade() is now a macro using sv_utf8_upgrade_flags();
3376 * this function provided for binary compatibility only
3377 */
3378
3379
3380STRLEN
3381Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
3382{
3383 return sv_utf8_upgrade_flags(sv, SV_GMAGIC);
3384}
3385
c461cf8f
JH
3386/*
3387=for apidoc sv_utf8_upgrade
3388
3389Convert the PV of an SV to its UTF8-encoded form.
645c22ef 3390Forces the SV to string form if it is not already.
4411f3b6
NIS
3391Always sets the SvUTF8 flag to avoid future validity checks even
3392if all the bytes have hibit clear.
c461cf8f 3393
13a6c0e0
JH
3394This is not as a general purpose byte encoding to Unicode interface:
3395use the Encode extension for that.
3396
8d6d96c1
HS
3397=for apidoc sv_utf8_upgrade_flags
3398
3399Convert the PV of an SV to its UTF8-encoded form.
645c22ef 3400Forces the SV to string form if it is not already.
8d6d96c1
HS
3401Always sets the SvUTF8 flag to avoid future validity checks even
3402if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
3403will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
3404C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3405
13a6c0e0
JH
3406This is not as a general purpose byte encoding to Unicode interface:
3407use the Encode extension for that.
3408
8d6d96c1
HS
3409=cut
3410*/
3411
3412STRLEN
3413Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
3414{
db42d148 3415 U8 *s, *t, *e;
511c2ff0 3416 int hibit = 0;
560a288e 3417
4411f3b6
NIS
3418 if (!sv)
3419 return 0;
3420
e0e62c2a
NIS
3421 if (!SvPOK(sv)) {
3422 STRLEN len = 0;
8d6d96c1 3423 (void) sv_2pv_flags(sv,&len, flags);
e0e62c2a
NIS
3424 if (!SvPOK(sv))
3425 return len;
3426 }
4411f3b6
NIS
3427
3428 if (SvUTF8(sv))
3429 return SvCUR(sv);
560a288e 3430
765f542d
NC
3431 if (SvIsCOW(sv)) {
3432 sv_force_normal_flags(sv, 0);
db42d148
NIS
3433 }
3434
88632417 3435 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
799ef3cb 3436 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 3437 else { /* Assume Latin-1/EBCDIC */
0a378802
JH
3438 /* This function could be much more efficient if we
3439 * had a FLAG in SVs to signal if there are any hibit
3440 * chars in the PV. Given that there isn't such a flag
3441 * make the loop as fast as possible. */
3442 s = (U8 *) SvPVX(sv);
3443 e = (U8 *) SvEND(sv);
3444 t = s;
3445 while (t < e) {
3446 U8 ch = *t++;
3447 if ((hibit = !NATIVE_IS_INVARIANT(ch)))
3448 break;
3449 }
3450 if (hibit) {
3451 STRLEN len;
ecdeb87c 3452
0a378802
JH
3453 len = SvCUR(sv) + 1; /* Plus the \0 */
3454 SvPVX(sv) = (char*)bytes_to_utf8((U8*)s, &len);
3455 SvCUR(sv) = len - 1;
3456 if (SvLEN(sv) != 0)
3457 Safefree(s); /* No longer using what was there before. */
3458 SvLEN(sv) = len; /* No longer know the real size. */
3459 }
9f4817db
JH
3460 /* Mark as UTF-8 even if no hibit - saves scanning loop */
3461 SvUTF8_on(sv);
560a288e 3462 }
4411f3b6 3463 return SvCUR(sv);
560a288e
GS
3464}
3465
c461cf8f
JH
3466/*
3467=for apidoc sv_utf8_downgrade
3468
3469Attempt to convert the PV of an SV from UTF8-encoded to byte encoding.
3470This may not be possible if the PV contains non-byte encoding characters;
3471if this is the case, either returns false or, if C<fail_ok> is not
3472true, croaks.
3473
13a6c0e0
JH
3474This is not as a general purpose Unicode to byte encoding interface:
3475use the Encode extension for that.
3476
c461cf8f
JH
3477=cut
3478*/
3479
560a288e
GS
3480bool
3481Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
3482{
3483 if (SvPOK(sv) && SvUTF8(sv)) {
fa301091 3484 if (SvCUR(sv)) {
03cfe0ae 3485 U8 *s;
652088fc 3486 STRLEN len;
fa301091 3487
765f542d
NC
3488 if (SvIsCOW(sv)) {
3489 sv_force_normal_flags(sv, 0);
3490 }
03cfe0ae
NIS
3491 s = (U8 *) SvPV(sv, len);
3492 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
3493 if (fail_ok)
3494 return FALSE;
3495 else {
3496 if (PL_op)
3497 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 3498 OP_DESC(PL_op));
fa301091
JH
3499 else
3500 Perl_croak(aTHX_ "Wide character");
3501 }
4b3603a4 3502 }
fa301091 3503 SvCUR(sv) = len;
67e989fb 3504 }
560a288e 3505 }
ffebcc3e 3506 SvUTF8_off(sv);
560a288e
GS
3507 return TRUE;
3508}
3509
c461cf8f
JH
3510/*
3511=for apidoc sv_utf8_encode
3512
3513Convert the PV of an SV to UTF8-encoded, but then turn off the C<SvUTF8>
4411f3b6
NIS
3514flag so that it looks like octets again. Used as a building block
3515for encode_utf8 in Encode.xs
c461cf8f
JH
3516
3517=cut
3518*/
3519
560a288e
GS
3520void
3521Perl_sv_utf8_encode(pTHX_ register SV *sv)
3522{
4411f3b6 3523 (void) sv_utf8_upgrade(sv);
560a288e
GS
3524 SvUTF8_off(sv);
3525}
3526
4411f3b6
NIS
3527/*
3528=for apidoc sv_utf8_decode
3529
3530Convert the octets in the PV from UTF-8 to chars. Scan for validity and then
645c22ef 3531turn off SvUTF8 if needed so that we see characters. Used as a building block
4411f3b6
NIS
3532for decode_utf8 in Encode.xs
3533
3534=cut
3535*/
3536
560a288e
GS
3537bool
3538Perl_sv_utf8_decode(pTHX_ register SV *sv)
3539{
3540 if (SvPOK(sv)) {
63cd0674
NIS
3541 U8 *c;
3542 U8 *e;
9cbac4c7 3543
645c22ef
DM
3544 /* The octets may have got themselves encoded - get them back as
3545 * bytes
3546 */
3547 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
3548 return FALSE;
3549
3550 /* it is actually just a matter of turning the utf8 flag on, but
3551 * we want to make sure everything inside is valid utf8 first.
3552 */
63cd0674
NIS
3553 c = (U8 *) SvPVX(sv);
3554 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 3555 return FALSE;
63cd0674 3556 e = (U8 *) SvEND(sv);
511c2ff0 3557 while (c < e) {
c4d5f83a
NIS
3558 U8 ch = *c++;
3559 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
3560 SvUTF8_on(sv);
3561 break;
3562 }
560a288e 3563 }
560a288e
GS
3564 }
3565 return TRUE;
3566}
3567
09540bc3
JH
3568/* sv_setsv() is now a macro using Perl_sv_setsv_flags();
3569 * this function provided for binary compatibility only
3570 */
3571
3572void
3573Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
3574{
3575 sv_setsv_flags(dstr, sstr, SV_GMAGIC);
3576}
3577
954c1994
GS
3578/*
3579=for apidoc sv_setsv
3580
645c22ef
DM
3581Copies the contents of the source SV C<ssv> into the destination SV
3582C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3583function if the source SV needs to be reused. Does not handle 'set' magic.
3584Loosely speaking, it performs a copy-by-value, obliterating any previous
3585content of the destination.
3586
3587You probably want to use one of the assortment of wrappers, such as
3588C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3589C<SvSetMagicSV_nosteal>.
3590
8d6d96c1
HS
3591=for apidoc sv_setsv_flags
3592
645c22ef
DM
3593Copies the contents of the source SV C<ssv> into the destination SV
3594C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3595function if the source SV needs to be reused. Does not handle 'set' magic.
3596Loosely speaking, it performs a copy-by-value, obliterating any previous
3597content of the destination.
3598If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
3599C<ssv> if appropriate, else not. C<sv_setsv> and C<sv_setsv_nomg> are
3600implemented in terms of this function.
3601
3602You probably want to use one of the assortment of wrappers, such as
3603C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3604C<SvSetMagicSV_nosteal>.
3605
3606This is the primary function for copying scalars, and most other
3607copy-ish functions and macros use this underneath.
8d6d96c1
HS
3608
3609=cut
3610*/
3611
3612void
3613Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
3614{
8990e307
LW
3615 register U32 sflags;
3616 register int dtype;
3617 register int stype;
463ee0b2 3618
79072805
LW
3619 if (sstr == dstr)
3620 return;
765f542d 3621 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 3622 if (!sstr)
3280af22 3623 sstr = &PL_sv_undef;
8990e307
LW
3624 stype = SvTYPE(sstr);
3625 dtype = SvTYPE(dstr);
79072805 3626
a0d0e21e 3627 SvAMAGIC_off(dstr);
ece467f9
JP
3628 if ( SvVOK(dstr) )
3629 {
3630 /* need to nuke the magic */
3631 mg_free(dstr);
3632 SvRMAGICAL_off(dstr);
3633 }
9e7bc3e8 3634
463ee0b2 3635 /* There's a lot of redundancy below but we're going for speed here */
79072805 3636
8990e307 3637 switch (stype) {
79072805 3638 case SVt_NULL:
aece5585 3639 undef_sstr:
20408e3c
GS
3640 if (dtype != SVt_PVGV) {
3641 (void)SvOK_off(dstr);
3642 return;
3643 }
3644 break;
463ee0b2 3645 case SVt_IV:
aece5585
GA
3646 if (SvIOK(sstr)) {
3647 switch (dtype) {
3648 case SVt_NULL:
8990e307 3649 sv_upgrade(dstr, SVt_IV);
aece5585
GA
3650 break;
3651 case SVt_NV:
8990e307 3652 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
3653 break;
3654 case SVt_RV:
3655 case SVt_PV:
a0d0e21e 3656 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
3657 break;
3658 }
3659 (void)SvIOK_only(dstr);
3660 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
3661 if (SvIsUV(sstr))
3662 SvIsUV_on(dstr);
27c9684d
AP
3663 if (SvTAINTED(sstr))
3664 SvTAINT(dstr);
aece5585 3665 return;
8990e307 3666 }
aece5585
GA
3667 goto undef_sstr;
3668
463ee0b2 3669 case SVt_NV:
aece5585
GA
3670 if (SvNOK(sstr)) {
3671 switch (dtype) {
3672 case SVt_NULL:
3673 case SVt_IV:
8990e307 3674 sv_upgrade(dstr, SVt_NV);
aece5585
GA
3675 break;
3676 case SVt_RV:
3677 case SVt_PV:
3678 case SVt_PVIV:
a0d0e21e 3679 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
3680 break;
3681 }
3682 SvNVX(dstr) = SvNVX(sstr);
3683 (void)SvNOK_only(dstr);
27c9684d
AP
3684 if (SvTAINTED(sstr))
3685 SvTAINT(dstr);
aece5585 3686 return;
8990e307 3687 }
aece5585
GA
3688 goto undef_sstr;
3689
ed6116ce 3690 case SVt_RV:
8990e307 3691 if (dtype < SVt_RV)
ed6116ce 3692 sv_upgrade(dstr, SVt_RV);
c07a80fd 3693 else if (dtype == SVt_PVGV &&
23bb1b96 3694 SvROK(sstr) && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
c07a80fd 3695 sstr = SvRV(sstr);
a5f75d66 3696 if (sstr == dstr) {
1d7c1841
GS
3697 if (GvIMPORTED(dstr) != GVf_IMPORTED
3698 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3699 {
a5f75d66 3700 GvIMPORTED_on(dstr);
1d7c1841 3701 }
a5f75d66
AD
3702 GvMULTI_on(dstr);
3703 return;
3704 }
c07a80fd 3705 goto glob_assign;
3706 }
ed6116ce 3707 break;
fc36a67e 3708 case SVt_PVFM:
d89fc664
NC
3709#ifdef PERL_COPY_ON_WRITE
3710 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
3711 if (dtype < SVt_PVIV)
3712 sv_upgrade(dstr, SVt_PVIV);
3713 break;
3714 }
3715 /* Fall through */
3716#endif
3717 case SVt_PV:
8990e307 3718 if (dtype < SVt_PV)
463ee0b2 3719 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
3720 break;
3721 case SVt_PVIV:
8990e307 3722 if (dtype < SVt_PVIV)
463ee0b2 3723 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
3724 break;
3725 case SVt_PVNV:
8990e307 3726 if (dtype < SVt_PVNV)
463ee0b2 3727 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 3728 break;
4633a7c4
LW
3729 case SVt_PVAV:
3730 case SVt_PVHV:
3731 case SVt_PVCV:
4633a7c4 3732 case SVt_PVIO:
533c011a 3733 if (PL_op)
cea2e8a9 3734 Perl_croak(aTHX_ "Bizarre copy of %s in %s", sv_reftype(sstr, 0),
53e06cf0 3735 OP_NAME(PL_op));
4633a7c4 3736 else
cea2e8a9 3737 Perl_croak(aTHX_ "Bizarre copy of %s", sv_reftype(sstr, 0));
4633a7c4
LW
3738 break;
3739
79072805 3740 case SVt_PVGV:
8990e307 3741 if (dtype <= SVt_PVGV) {
c07a80fd 3742 glob_assign:
a5f75d66 3743 if (dtype != SVt_PVGV) {
a0d0e21e
LW
3744 char *name = GvNAME(sstr);
3745 STRLEN len = GvNAMELEN(sstr);
463ee0b2 3746 sv_upgrade(dstr, SVt_PVGV);
14befaf4 3747 sv_magic(dstr, dstr, PERL_MAGIC_glob, Nullch, 0);
85aff577 3748 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
3749 GvNAME(dstr) = savepvn(name, len);
3750 GvNAMELEN(dstr) = len;
3751 SvFAKE_on(dstr); /* can coerce to non-glob */
3752 }
7bac28a0 3753 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
3754 else if (PL_curstackinfo->si_type == PERLSI_SORT
3755 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
cea2e8a9 3756 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
7bac28a0 3757 GvNAME(dstr));
5bd07a3d 3758
7fb37951
AMS
3759#ifdef GV_UNIQUE_CHECK
3760 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
3761 Perl_croak(aTHX_ PL_no_modify);
3762 }
3763#endif
3764
a0d0e21e 3765 (void)SvOK_off(dstr);
a5f75d66 3766 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 3767 gp_free((GV*)dstr);
79072805 3768 GvGP(dstr) = gp_ref(GvGP(sstr));
27c9684d
AP
3769 if (SvTAINTED(sstr))
3770 SvTAINT(dstr);
1d7c1841
GS
3771 if (GvIMPORTED(dstr) != GVf_IMPORTED
3772 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3773 {
a5f75d66 3774 GvIMPORTED_on(dstr);
1d7c1841 3775 }
a5f75d66 3776 GvMULTI_on(dstr);
79072805
LW
3777 return;
3778 }
3779 /* FALL THROUGH */
3780
3781 default:
8d6d96c1 3782 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 3783 mg_get(sstr);
eb160463 3784 if ((int)SvTYPE(sstr) != stype) {
973f89ab
CS
3785 stype = SvTYPE(sstr);
3786 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
3787 goto glob_assign;
3788 }
3789 }
ded42b9f 3790 if (stype == SVt_PVLV)
6fc92669 3791 (void)SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 3792 else
eb160463 3793 (void)SvUPGRADE(dstr, (U32)stype);
79072805
LW
3794 }
3795
8990e307
LW
3796 sflags = SvFLAGS(sstr);
3797
3798 if (sflags & SVf_ROK) {
3799 if (dtype >= SVt_PV) {
3800 if (dtype == SVt_PVGV) {
3801 SV *sref = SvREFCNT_inc(SvRV(sstr));
3802 SV *dref = 0;
a5f75d66 3803 int intro = GvINTRO(dstr);
a0d0e21e 3804
7fb37951
AMS
3805#ifdef GV_UNIQUE_CHECK
3806 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
3807 Perl_croak(aTHX_ PL_no_modify);
3808 }
3809#endif
3810
a0d0e21e 3811 if (intro) {
a5f75d66 3812 GvINTRO_off(dstr); /* one-shot flag */
1d7c1841 3813 GvLINE(dstr) = CopLINE(PL_curcop);
1edc1566 3814 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 3815 }
a5f75d66 3816 GvMULTI_on(dstr);
8990e307
LW
3817 switch (SvTYPE(sref)) {
3818 case SVt_PVAV:
a0d0e21e 3819 if (intro)
890ed176 3820 SAVEGENERICSV(GvAV(dstr));
a0d0e21e
LW
3821 else
3822 dref = (SV*)GvAV(dstr);
8990e307 3823 GvAV(dstr) = (AV*)sref;
39bac7f7 3824 if (!GvIMPORTED_AV(dstr)
1d7c1841
GS
3825 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3826 {
a5f75d66 3827 GvIMPORTED_AV_on(dstr);
1d7c1841 3828 }
8990e307
LW
3829 break;
3830 case SVt_PVHV:
a0d0e21e 3831 if (intro)
890ed176 3832 SAVEGENERICSV(GvHV(dstr));
a0d0e21e
LW
3833 else
3834 dref = (SV*)GvHV(dstr);
8990e307 3835 GvHV(dstr) = (HV*)sref;
39bac7f7 3836 if (!GvIMPORTED_HV(dstr)
1d7c1841
GS
3837 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3838 {
a5f75d66 3839 GvIMPORTED_HV_on(dstr);
1d7c1841 3840 }
8990e307
LW
3841 break;
3842 case SVt_PVCV:
8ebc5c01 3843 if (intro) {
3844 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
3845 SvREFCNT_dec(GvCV(dstr));
3846 GvCV(dstr) = Nullcv;
68dc0745 3847 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 3848 PL_sub_generation++;
8ebc5c01 3849 }
890ed176 3850 SAVEGENERICSV(GvCV(dstr));
8ebc5c01 3851 }
68dc0745 3852 else
3853 dref = (SV*)GvCV(dstr);
3854 if (GvCV(dstr) != (CV*)sref) {
748a9306 3855 CV* cv = GvCV(dstr);
4633a7c4 3856 if (cv) {
68dc0745 3857 if (!GvCVGEN((GV*)dstr) &&
3858 (CvROOT(cv) || CvXSUB(cv)))
3859 {
7bac28a0 3860 /* ahem, death to those who redefine
3861 * active sort subs */
3280af22
NIS
3862 if (PL_curstackinfo->si_type == PERLSI_SORT &&
3863 PL_sortcop == CvSTART(cv))
1c846c1f 3864 Perl_croak(aTHX_
7bac28a0 3865 "Can't redefine active sort subroutine %s",
3866 GvENAME((GV*)dstr));
beab0874
JT
3867 /* Redefining a sub - warning is mandatory if
3868 it was a const and its value changed. */
3869 if (ckWARN(WARN_REDEFINE)
3870 || (CvCONST(cv)
3871 && (!CvCONST((CV*)sref)
3872 || sv_cmp(cv_const_sv(cv),
3873 cv_const_sv((CV*)sref)))))
3874 {
9014280d 3875 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
beab0874 3876 CvCONST(cv)
910764e6
RGS
3877 ? "Constant subroutine %s::%s redefined"
3878 : "Subroutine %s::%s redefined",
3879 HvNAME(GvSTASH((GV*)dstr)),
beab0874
JT
3880 GvENAME((GV*)dstr));
3881 }
9607fc9c 3882 }
fb24441d
RGS
3883 if (!intro)
3884 cv_ckproto(cv, (GV*)dstr,
3885 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 3886 }
a5f75d66 3887 GvCV(dstr) = (CV*)sref;
7a4c00b4 3888 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 3889 GvASSUMECV_on(dstr);
3280af22 3890 PL_sub_generation++;
a5f75d66 3891 }
39bac7f7 3892 if (!GvIMPORTED_CV(dstr)
1d7c1841
GS
3893 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3894 {
a5f75d66 3895 GvIMPORTED_CV_on(dstr);
1d7c1841 3896 }
8990e307 3897 break;
91bba347
LW
3898 case SVt_PVIO:
3899 if (intro)
890ed176 3900 SAVEGENERICSV(GvIOp(dstr));
91bba347
LW
3901 else
3902 dref = (SV*)GvIOp(dstr);
3903 GvIOp(dstr) = (IO*)sref;
3904 break;
f4d13ee9
JH
3905 case SVt_PVFM:
3906 if (intro)
890ed176 3907 SAVEGENERICSV(GvFORM(dstr));
f4d13ee9
JH
3908 else
3909 dref = (SV*)GvFORM(dstr);
3910 GvFORM(dstr) = (CV*)sref;
3911 break;
8990e307 3912 default:
a0d0e21e 3913 if (intro)
890ed176 3914 SAVEGENERICSV(GvSV(dstr));
a0d0e21e
LW
3915 else
3916 dref = (SV*)GvSV(dstr);
8990e307 3917 GvSV(dstr) = sref;
39bac7f7 3918 if (!GvIMPORTED_SV(dstr)
1d7c1841
GS
3919 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3920 {
a5f75d66 3921 GvIMPORTED_SV_on(dstr);
1d7c1841 3922 }
8990e307
LW
3923 break;
3924 }
3925 if (dref)
3926 SvREFCNT_dec(dref);
27c9684d
AP
3927 if (SvTAINTED(sstr))
3928 SvTAINT(dstr);
8990e307
LW
3929 return;
3930 }
a0d0e21e 3931 if (SvPVX(dstr)) {
760ac839 3932 (void)SvOOK_off(dstr); /* backoff */
50483b2c
JD
3933 if (SvLEN(dstr))
3934 Safefree(SvPVX(dstr));
a0d0e21e
LW
3935 SvLEN(dstr)=SvCUR(dstr)=0;
3936 }
8990e307 3937 }
a0d0e21e 3938 (void)SvOK_off(dstr);
8990e307 3939 SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
ed6116ce 3940 SvROK_on(dstr);
8990e307 3941 if (sflags & SVp_NOK) {
3332b3c1
JH
3942 SvNOKp_on(dstr);
3943 /* Only set the public OK flag if the source has public OK. */
3944 if (sflags & SVf_NOK)
3945 SvFLAGS(dstr) |= SVf_NOK;
ed6116ce
LW
3946 SvNVX(dstr) = SvNVX(sstr);
3947 }
8990e307 3948 if (sflags & SVp_IOK) {
3332b3c1
JH
3949 (void)SvIOKp_on(dstr);
3950 if (sflags & SVf_IOK)
3951 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 3952 if (sflags & SVf_IVisUV)
25da4f38 3953 SvIsUV_on(dstr);
3332b3c1 3954 SvIVX(dstr) = SvIVX(sstr);
ed6116ce 3955 }
a0d0e21e
LW
3956 if (SvAMAGIC(sstr)) {
3957 SvAMAGIC_on(dstr);
3958 }
ed6116ce 3959 }
8990e307 3960 else if (sflags & SVp_POK) {
765f542d 3961 bool isSwipe = 0;
79072805
LW
3962
3963 /*
3964 * Check to see if we can just swipe the string. If so, it's a
3965 * possible small lose on short strings, but a big win on long ones.
463ee0b2
LW
3966 * It might even be a win on short strings if SvPVX(dstr)
3967 * has to be allocated and SvPVX(sstr) has to be freed.
79072805
LW
3968 */
3969
765f542d
NC
3970 if (
3971#ifdef PERL_COPY_ON_WRITE
3972 (sflags & (SVf_FAKE | SVf_READONLY)) != (SVf_FAKE | SVf_READONLY)
3973 &&
3974#endif
3975 !(isSwipe =
3976 (sflags & SVs_TEMP) && /* slated for free anyway? */
3977 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
3978 SvREFCNT(sstr) == 1 && /* and no other references to it? */
3979 SvLEN(sstr) && /* and really is a string */
645c22ef 3980 /* and won't be needed again, potentially */
765f542d
NC
3981 !(PL_op && PL_op->op_type == OP_AASSIGN))
3982#ifdef PERL_COPY_ON_WRITE
3983 && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
3984 && SvTYPE(sstr) >= SVt_PVIV)
3985#endif
3986 ) {
3987 /* Failed the swipe test, and it's not a shared hash key either.
3988 Have to copy the string. */
3989 STRLEN len = SvCUR(sstr);
3990 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3991 Move(SvPVX(sstr),SvPVX(dstr),len,char);
3992 SvCUR_set(dstr, len);
3993 *SvEND(dstr) = '\0';
3994 (void)SvPOK_only(dstr);
3995 } else {
3996 /* If PERL_COPY_ON_WRITE is not defined, then isSwipe will always
3997 be true in here. */
3998#ifdef PERL_COPY_ON_WRITE
3999 /* Either it's a shared hash key, or it's suitable for
4000 copy-on-write or we can swipe the string. */
46187eeb 4001 if (DEBUG_C_TEST) {
ed252734 4002 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
4003 sv_dump(sstr);
4004 sv_dump(dstr);
46187eeb 4005 }
765f542d
NC
4006 if (!isSwipe) {
4007 /* I believe I should acquire a global SV mutex if
4008 it's a COW sv (not a shared hash key) to stop
4009 it going un copy-on-write.
4010 If the source SV has gone un copy on write between up there
4011 and down here, then (assert() that) it is of the correct
4012 form to make it copy on write again */
4013 if ((sflags & (SVf_FAKE | SVf_READONLY))
4014 != (SVf_FAKE | SVf_READONLY)) {
4015 SvREADONLY_on(sstr);
4016 SvFAKE_on(sstr);
4017 /* Make the source SV into a loop of 1.
4018 (about to become 2) */
a29f6d03 4019 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
4020 }
4021 }
4022#endif
4023 /* Initial code is common. */
adbc6bb1 4024 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
4025 if (SvOOK(dstr)) {
4026 SvFLAGS(dstr) &= ~SVf_OOK;
4027 Safefree(SvPVX(dstr) - SvIVX(dstr));
4028 }
50483b2c 4029 else if (SvLEN(dstr))
a5f75d66 4030 Safefree(SvPVX(dstr));
79072805 4031 }
a5f75d66 4032 (void)SvPOK_only(dstr);
765f542d
NC
4033
4034#ifdef PERL_COPY_ON_WRITE
4035 if (!isSwipe) {
4036 /* making another shared SV. */
4037 STRLEN cur = SvCUR(sstr);
4038 STRLEN len = SvLEN(sstr);
d89fc664 4039 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
4040 if (len) {
4041 /* SvIsCOW_normal */
4042 /* splice us in between source and next-after-source. */
a29f6d03
NC
4043 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4044 SV_COW_NEXT_SV_SET(sstr, dstr);
765f542d
NC
4045 SvPV_set(dstr, SvPVX(sstr));
4046 } else {
4047 /* SvIsCOW_shared_hash */
4048 UV hash = SvUVX(sstr);
46187eeb
NC
4049 DEBUG_C(PerlIO_printf(Perl_debug_log,
4050 "Copy on write: Sharing hash\n"));
765f542d
NC
4051 SvPV_set(dstr,
4052 sharepvn(SvPVX(sstr),
4053 (sflags & SVf_UTF8?-cur:cur), hash));
4054 SvUVX(dstr) = hash;
4055 }
4056 SvLEN(dstr) = len;
4057 SvCUR(dstr) = cur;
4058 SvREADONLY_on(dstr);
4059 SvFAKE_on(dstr);
4060 /* Relesase a global SV mutex. */
4061 }
4062 else
4063#endif
4064 { /* Passes the swipe test. */
4065 SvPV_set(dstr, SvPVX(sstr));
4066 SvLEN_set(dstr, SvLEN(sstr));
4067 SvCUR_set(dstr, SvCUR(sstr));
4068
4069 SvTEMP_off(dstr);
4070 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
4071 SvPV_set(sstr, Nullch);
4072 SvLEN_set(sstr, 0);
4073 SvCUR_set(sstr, 0);
4074 SvTEMP_off(sstr);
4075 }
4076 }
9aa983d2 4077 if (sflags & SVf_UTF8)
a7cb1f99 4078 SvUTF8_on(dstr);
79072805 4079 /*SUPPRESS 560*/
8990e307 4080 if (sflags & SVp_NOK) {
3332b3c1
JH
4081 SvNOKp_on(dstr);
4082 if (sflags & SVf_NOK)
4083 SvFLAGS(dstr) |= SVf_NOK;
463ee0b2 4084 SvNVX(dstr) = SvNVX(sstr);
79072805 4085 }
8990e307 4086 if (sflags & SVp_IOK) {
3332b3c1
JH
4087 (void)SvIOKp_on(dstr);
4088 if (sflags & SVf_IOK)
4089 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4090 if (sflags & SVf_IVisUV)
25da4f38 4091 SvIsUV_on(dstr);
463ee0b2 4092 SvIVX(dstr) = SvIVX(sstr);
79072805 4093 }
92f0c265 4094 if (SvVOK(sstr)) {
ece467f9
JP
4095 MAGIC *smg = mg_find(sstr,PERL_MAGIC_vstring);
4096 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4097 smg->mg_ptr, smg->mg_len);
439cb1c4 4098 SvRMAGICAL_on(dstr);
92f0c265 4099 }
79072805 4100 }
8990e307 4101 else if (sflags & SVp_IOK) {
3332b3c1
JH
4102 if (sflags & SVf_IOK)
4103 (void)SvIOK_only(dstr);
4104 else {
9cbac4c7
DM
4105 (void)SvOK_off(dstr);
4106 (void)SvIOKp_on(dstr);
3332b3c1
JH
4107 }
4108 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2b1c7e3e 4109 if (sflags & SVf_IVisUV)
25da4f38 4110 SvIsUV_on(dstr);
3332b3c1
JH
4111 SvIVX(dstr) = SvIVX(sstr);
4112 if (sflags & SVp_NOK) {
4113 if (sflags & SVf_NOK)
4114 (void)SvNOK_on(dstr);
4115 else
4116 (void)SvNOKp_on(dstr);
4117 SvNVX(dstr) = SvNVX(sstr);
4118 }
4119 }
4120 else if (sflags & SVp_NOK) {
4121 if (sflags & SVf_NOK)
4122 (void)SvNOK_only(dstr);
4123 else {
9cbac4c7 4124 (void)SvOK_off(dstr);
3332b3c1
JH
4125 SvNOKp_on(dstr);
4126 }
4127 SvNVX(dstr) = SvNVX(sstr);
79072805
LW
4128 }
4129 else {
20408e3c 4130 if (dtype == SVt_PVGV) {
e476b1b5 4131 if (ckWARN(WARN_MISC))
9014280d 4132 Perl_warner(aTHX_ packWARN(WARN_MISC), "Undefined value assigned to typeglob");
20408e3c
GS
4133 }
4134 else
4135 (void)SvOK_off(dstr);
a0d0e21e 4136 }
27c9684d
AP
4137 if (SvTAINTED(sstr))
4138 SvTAINT(dstr);
79072805
LW
4139}
4140
954c1994
GS
4141/*
4142=for apidoc sv_setsv_mg
4143
4144Like C<sv_setsv>, but also handles 'set' magic.
4145
4146=cut
4147*/
4148
79072805 4149void
864dbfa3 4150Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
4151{
4152 sv_setsv(dstr,sstr);
4153 SvSETMAGIC(dstr);
4154}
4155
ed252734
NC
4156#ifdef PERL_COPY_ON_WRITE
4157SV *
4158Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4159{
4160 STRLEN cur = SvCUR(sstr);
4161 STRLEN len = SvLEN(sstr);
4162 register char *new_pv;
4163
4164 if (DEBUG_C_TEST) {
4165 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4166 sstr, dstr);
4167 sv_dump(sstr);
4168 if (dstr)
4169 sv_dump(dstr);
4170 }
4171
4172 if (dstr) {
4173 if (SvTHINKFIRST(dstr))
4174 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
4175 else if (SvPVX(dstr))
4176 Safefree(SvPVX(dstr));
4177 }
4178 else
4179 new_SV(dstr);
4180 SvUPGRADE (dstr, SVt_PVIV);
4181
4182 assert (SvPOK(sstr));
4183 assert (SvPOKp(sstr));
4184 assert (!SvIOK(sstr));
4185 assert (!SvIOKp(sstr));
4186 assert (!SvNOK(sstr));
4187 assert (!SvNOKp(sstr));
4188
4189 if (SvIsCOW(sstr)) {
4190
4191 if (SvLEN(sstr) == 0) {
4192 /* source is a COW shared hash key. */
4193 UV hash = SvUVX(sstr);
4194 DEBUG_C(PerlIO_printf(Perl_debug_log,
4195 "Fast copy on write: Sharing hash\n"));
4196 SvUVX(dstr) = hash;
4197 new_pv = sharepvn(SvPVX(sstr), (SvUTF8(sstr)?-cur:cur), hash);
4198 goto common_exit;
4199 }
4200 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4201 } else {
4202 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
4203 SvUPGRADE (sstr, SVt_PVIV);
4204 SvREADONLY_on(sstr);
4205 SvFAKE_on(sstr);
4206 DEBUG_C(PerlIO_printf(Perl_debug_log,
4207 "Fast copy on write: Converting sstr to COW\n"));
4208 SV_COW_NEXT_SV_SET(dstr, sstr);
4209 }
4210 SV_COW_NEXT_SV_SET(sstr, dstr);
4211 new_pv = SvPVX(sstr);
4212
4213 common_exit:
4214 SvPV_set(dstr, new_pv);
4215 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4216 if (SvUTF8(sstr))
4217 SvUTF8_on(dstr);
4218 SvLEN(dstr) = len;
4219 SvCUR(dstr) = cur;
4220 if (DEBUG_C_TEST) {
4221 sv_dump(dstr);
4222 }
4223 return dstr;
4224}
4225#endif
4226
954c1994
GS
4227/*
4228=for apidoc sv_setpvn
4229
4230Copies a string into an SV. The C<len> parameter indicates the number of
4231bytes to be copied. Does not handle 'set' magic. See C<sv_setpvn_mg>.
4232
4233=cut
4234*/
4235
ef50df4b 4236void
864dbfa3 4237Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 4238{
c6f8c383 4239 register char *dptr;
22c522df 4240
765f542d 4241 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4242 if (!ptr) {
a0d0e21e 4243 (void)SvOK_off(sv);
463ee0b2
LW
4244 return;
4245 }
22c522df
JH
4246 else {
4247 /* len is STRLEN which is unsigned, need to copy to signed */
4248 IV iv = len;
9c5ffd7c
JH
4249 if (iv < 0)
4250 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 4251 }
6fc92669 4252 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4253
79072805 4254 SvGROW(sv, len + 1);
c6f8c383
GA
4255 dptr = SvPVX(sv);
4256 Move(ptr,dptr,len,char);
4257 dptr[len] = '\0';
79072805 4258 SvCUR_set(sv, len);
1aa99e6b 4259 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4260 SvTAINT(sv);
79072805
LW
4261}
4262
954c1994
GS
4263/*
4264=for apidoc sv_setpvn_mg
4265
4266Like C<sv_setpvn>, but also handles 'set' magic.
4267
4268=cut
4269*/
4270
79072805 4271void
864dbfa3 4272Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4273{
4274 sv_setpvn(sv,ptr,len);
4275 SvSETMAGIC(sv);
4276}
4277
954c1994
GS
4278/*
4279=for apidoc sv_setpv
4280
4281Copies a string into an SV. The string must be null-terminated. Does not
4282handle 'set' magic. See C<sv_setpv_mg>.
4283
4284=cut
4285*/
4286
ef50df4b 4287void
864dbfa3 4288Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4289{
4290 register STRLEN len;
4291
765f542d 4292 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4293 if (!ptr) {
a0d0e21e 4294 (void)SvOK_off(sv);
463ee0b2
LW
4295 return;
4296 }
79072805 4297 len = strlen(ptr);
6fc92669 4298 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4299
79072805 4300 SvGROW(sv, len + 1);
463ee0b2 4301 Move(ptr,SvPVX(sv),len+1,char);
79072805 4302 SvCUR_set(sv, len);
1aa99e6b 4303 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
4304 SvTAINT(sv);
4305}
4306
954c1994
GS
4307/*
4308=for apidoc sv_setpv_mg
4309
4310Like C<sv_setpv>, but also handles 'set' magic.
4311
4312=cut
4313*/
4314
463ee0b2 4315void
864dbfa3 4316Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
4317{
4318 sv_setpv(sv,ptr);
4319 SvSETMAGIC(sv);
4320}
4321
954c1994
GS
4322/*
4323=for apidoc sv_usepvn
4324
4325Tells an SV to use C<ptr> to find its string value. Normally the string is
1c846c1f 4326stored inside the SV but sv_usepvn allows the SV to use an outside string.
954c1994
GS
4327The C<ptr> should point to memory that was allocated by C<malloc>. The
4328string length, C<len>, must be supplied. This function will realloc the
4329memory pointed to by C<ptr>, so that pointer should not be freed or used by
4330the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
4331See C<sv_usepvn_mg>.
4332
4333=cut
4334*/
4335
ef50df4b 4336void
864dbfa3 4337Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 4338{
765f542d 4339 SV_CHECK_THINKFIRST_COW_DROP(sv);
c6f8c383 4340 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 4341 if (!ptr) {
a0d0e21e 4342 (void)SvOK_off(sv);
463ee0b2
LW
4343 return;
4344 }
a0ed51b3 4345 (void)SvOOK_off(sv);
50483b2c 4346 if (SvPVX(sv) && SvLEN(sv))
463ee0b2
LW
4347 Safefree(SvPVX(sv));
4348 Renew(ptr, len+1, char);
4349 SvPVX(sv) = ptr;
4350 SvCUR_set(sv, len);
4351 SvLEN_set(sv, len+1);
4352 *SvEND(sv) = '\0';
1aa99e6b 4353 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4354 SvTAINT(sv);
79072805
LW
4355}
4356
954c1994
GS
4357/*
4358=for apidoc sv_usepvn_mg
4359
4360Like C<sv_usepvn>, but also handles 'set' magic.
4361
4362=cut
4363*/
4364
ef50df4b 4365void
864dbfa3 4366Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 4367{
51c1089b 4368 sv_usepvn(sv,ptr,len);
ef50df4b
GS
4369 SvSETMAGIC(sv);
4370}
4371
765f542d
NC
4372#ifdef PERL_COPY_ON_WRITE
4373/* Need to do this *after* making the SV normal, as we need the buffer
4374 pointer to remain valid until after we've copied it. If we let go too early,
4375 another thread could invalidate it by unsharing last of the same hash key
4376 (which it can do by means other than releasing copy-on-write Svs)
4377 or by changing the other copy-on-write SVs in the loop. */
4378STATIC void
4379S_sv_release_COW(pTHX_ register SV *sv, char *pvx, STRLEN cur, STRLEN len,
4380 U32 hash, SV *after)
4381{
4382 if (len) { /* this SV was SvIsCOW_normal(sv) */
4383 /* we need to find the SV pointing to us. */
4384 SV *current = SV_COW_NEXT_SV(after);
4385
4386 if (current == sv) {
4387 /* The SV we point to points back to us (there were only two of us
4388 in the loop.)
4389 Hence other SV is no longer copy on write either. */
4390 SvFAKE_off(after);
4391 SvREADONLY_off(after);
4392 } else {
4393 /* We need to follow the pointers around the loop. */
4394 SV *next;
4395 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4396 assert (next);
4397 current = next;
4398 /* don't loop forever if the structure is bust, and we have
4399 a pointer into a closed loop. */
4400 assert (current != after);
e419cbc5 4401 assert (SvPVX(current) == pvx);
765f542d
NC
4402 }
4403 /* Make the SV before us point to the SV after us. */
a29f6d03 4404 SV_COW_NEXT_SV_SET(current, after);
765f542d
NC
4405 }
4406 } else {
4407 unsharepvn(pvx, SvUTF8(sv) ? -(I32)cur : cur, hash);
4408 }
4409}
4410
4411int
4412Perl_sv_release_IVX(pTHX_ register SV *sv)
4413{
4414 if (SvIsCOW(sv))
4415 sv_force_normal_flags(sv, 0);
4416 return SvOOK_off(sv);
4417}
4418#endif
645c22ef
DM
4419/*
4420=for apidoc sv_force_normal_flags
4421
4422Undo various types of fakery on an SV: if the PV is a shared string, make
4423a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4424an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4425we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4426then a copy-on-write scalar drops its PV buffer (if any) and becomes
4427SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 4428set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
4429C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4430with flags set to 0.
645c22ef
DM
4431
4432=cut
4433*/
4434
6fc92669 4435void
840a7b70 4436Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 4437{
765f542d
NC
4438#ifdef PERL_COPY_ON_WRITE
4439 if (SvREADONLY(sv)) {
4440 /* At this point I believe I should acquire a global SV mutex. */
4441 if (SvFAKE(sv)) {
4442 char *pvx = SvPVX(sv);
4443 STRLEN len = SvLEN(sv);
4444 STRLEN cur = SvCUR(sv);
4445 U32 hash = SvUVX(sv);
4446 SV *next = SV_COW_NEXT_SV(sv); /* next COW sv in the loop. */
46187eeb
NC
4447 if (DEBUG_C_TEST) {
4448 PerlIO_printf(Perl_debug_log,
4449 "Copy on write: Force normal %ld\n",
4450 (long) flags);
e419cbc5 4451 sv_dump(sv);
46187eeb 4452 }
765f542d
NC
4453 SvFAKE_off(sv);
4454 SvREADONLY_off(sv);
4455 /* This SV doesn't own the buffer, so need to New() a new one: */
4456 SvPVX(sv) = 0;
4457 SvLEN(sv) = 0;
4458 if (flags & SV_COW_DROP_PV) {
4459 /* OK, so we don't need to copy our buffer. */
4460 SvPOK_off(sv);
4461 } else {
4462 SvGROW(sv, cur + 1);
4463 Move(pvx,SvPVX(sv),cur,char);
4464 SvCUR(sv) = cur;
4465 *SvEND(sv) = '\0';
4466 }
e419cbc5 4467 sv_release_COW(sv, pvx, cur, len, hash, next);
46187eeb 4468 if (DEBUG_C_TEST) {
e419cbc5 4469 sv_dump(sv);
46187eeb 4470 }
765f542d
NC
4471 }
4472 else if (PL_curcop != &PL_compiling)
4473 Perl_croak(aTHX_ PL_no_modify);
4474 /* At this point I believe that I can drop the global SV mutex. */
4475 }
4476#else
2213622d 4477 if (SvREADONLY(sv)) {
1c846c1f
NIS
4478 if (SvFAKE(sv)) {
4479 char *pvx = SvPVX(sv);
4480 STRLEN len = SvCUR(sv);
4481 U32 hash = SvUVX(sv);
10bcdfd6
NC
4482 SvFAKE_off(sv);
4483 SvREADONLY_off(sv);
1c846c1f
NIS
4484 SvGROW(sv, len + 1);
4485 Move(pvx,SvPVX(sv),len,char);
4486 *SvEND(sv) = '\0';
25716404 4487 unsharepvn(pvx, SvUTF8(sv) ? -(I32)len : len, hash);
1c846c1f
NIS
4488 }
4489 else if (PL_curcop != &PL_compiling)
cea2e8a9 4490 Perl_croak(aTHX_ PL_no_modify);
0f15f207 4491 }
765f542d 4492#endif
2213622d 4493 if (SvROK(sv))
840a7b70 4494 sv_unref_flags(sv, flags);
6fc92669
GS
4495 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4496 sv_unglob(sv);
0f15f207 4497}
1c846c1f 4498
645c22ef
DM
4499/*
4500=for apidoc sv_force_normal
4501
4502Undo various types of fakery on an SV: if the PV is a shared string, make
4503a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4504an xpvmg. See also C<sv_force_normal_flags>.
4505
4506=cut
4507*/
4508
840a7b70
IZ
4509void
4510Perl_sv_force_normal(pTHX_ register SV *sv)
4511{
4512 sv_force_normal_flags(sv, 0);
4513}
4514
954c1994
GS
4515/*
4516=for apidoc sv_chop
4517
1c846c1f 4518Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4519SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4520the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4521string. Uses the "OOK hack".
31869a79
AE
4522Beware: after this function returns, C<ptr> and SvPVX(sv) may no longer
4523refer to the same chunk of data.
954c1994
GS
4524
4525=cut
4526*/
4527
79072805 4528void
645c22ef 4529Perl_sv_chop(pTHX_ register SV *sv, register char *ptr)
79072805
LW
4530{
4531 register STRLEN delta;
a0d0e21e 4532 if (!ptr || !SvPOKp(sv))
79072805 4533 return;
31869a79 4534 delta = ptr - SvPVX(sv);
2213622d 4535 SV_CHECK_THINKFIRST(sv);
79072805
LW
4536 if (SvTYPE(sv) < SVt_PVIV)
4537 sv_upgrade(sv,SVt_PVIV);
4538
4539 if (!SvOOK(sv)) {
50483b2c
JD
4540 if (!SvLEN(sv)) { /* make copy of shared string */
4541 char *pvx = SvPVX(sv);
4542 STRLEN len = SvCUR(sv);
4543 SvGROW(sv, len + 1);
4544 Move(pvx,SvPVX(sv),len,char);
4545 *SvEND(sv) = '\0';
4546 }
463ee0b2 4547 SvIVX(sv) = 0;
a4bfb290
AB
4548 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
4549 and we do that anyway inside the SvNIOK_off
4550 */
4551 SvFLAGS(sv) |= SVf_OOK;
79072805 4552 }
a4bfb290 4553 SvNIOK_off(sv);
79072805
LW
4554 SvLEN(sv) -= delta;
4555 SvCUR(sv) -= delta;
463ee0b2
LW
4556 SvPVX(sv) += delta;
4557 SvIVX(sv) += delta;
79072805
LW
4558}
4559
09540bc3
JH
4560/* sv_catpvn() is now a macro using Perl_sv_catpvn_flags();
4561 * this function provided for binary compatibility only
4562 */
4563
4564void
4565Perl_sv_catpvn(pTHX_ SV *dsv, const char* sstr, STRLEN slen)
4566{
4567 sv_catpvn_flags(dsv, sstr, slen, SV_GMAGIC);
4568}
4569
954c1994
GS
4570/*
4571=for apidoc sv_catpvn
4572
4573Concatenates the string onto the end of the string which is in the SV. The
d5ce4a7c
GA
4574C<len> indicates number of bytes to copy. If the SV has the UTF8
4575status set, then the bytes appended should be valid UTF8.
4576Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 4577
8d6d96c1
HS
4578=for apidoc sv_catpvn_flags
4579
4580Concatenates the string onto the end of the string which is in the SV. The
4581C<len> indicates number of bytes to copy. If the SV has the UTF8
4582status set, then the bytes appended should be valid UTF8.
4583If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4584appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4585in terms of this function.
4586
4587=cut
4588*/
4589
4590void
4591Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
4592{
4593 STRLEN dlen;
4594 char *dstr;
4595
4596 dstr = SvPV_force_flags(dsv, dlen, flags);
4597 SvGROW(dsv, dlen + slen + 1);
4598 if (sstr == dstr)
4599 sstr = SvPVX(dsv);
4600 Move(sstr, SvPVX(dsv) + dlen, slen, char);
4601 SvCUR(dsv) += slen;
4602 *SvEND(dsv) = '\0';
4603 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
4604 SvTAINT(dsv);
79072805
LW
4605}
4606
954c1994
GS
4607/*
4608=for apidoc sv_catpvn_mg
4609
4610Like C<sv_catpvn>, but also handles 'set' magic.
4611
4612=cut
4613*/
4614
79072805 4615void
864dbfa3 4616Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4617{
4618 sv_catpvn(sv,ptr,len);
4619 SvSETMAGIC(sv);
4620}
4621
09540bc3
JH
4622/* sv_catsv() is now a macro using Perl_sv_catsv_flags();
4623 * this function provided for binary compatibility only
4624 */
4625
4626void
4627Perl_sv_catsv(pTHX_ SV *dstr, register SV *sstr)
4628{
4629 sv_catsv_flags(dstr, sstr, SV_GMAGIC);
4630}
4631
954c1994
GS
4632/*
4633=for apidoc sv_catsv
4634
13e8c8e3
JH
4635Concatenates the string from SV C<ssv> onto the end of the string in
4636SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
4637not 'set' magic. See C<sv_catsv_mg>.
954c1994 4638
8d6d96c1
HS
4639=for apidoc sv_catsv_flags
4640
4641Concatenates the string from SV C<ssv> onto the end of the string in
4642SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
4643bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4644and C<sv_catsv_nomg> are implemented in terms of this function.
4645
4646=cut */
4647
ef50df4b 4648void
8d6d96c1 4649Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 4650{
13e8c8e3
JH
4651 char *spv;
4652 STRLEN slen;
46199a12 4653 if (!ssv)
79072805 4654 return;
46199a12 4655 if ((spv = SvPV(ssv, slen))) {
4fd84b44
AD
4656 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4657 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
8cf8f3d1
NIS
4658 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4659 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4fd84b44
AD
4660 dsv->sv_flags doesn't have that bit set.
4661 Andy Dougherty 12 Oct 2001
4662 */
4663 I32 sutf8 = DO_UTF8(ssv);
4664 I32 dutf8;
13e8c8e3 4665
8d6d96c1
HS
4666 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4667 mg_get(dsv);
4668 dutf8 = DO_UTF8(dsv);
4669
4670 if (dutf8 != sutf8) {
13e8c8e3 4671 if (dutf8) {
46199a12 4672 /* Not modifying source SV, so taking a temporary copy. */
8d6d96c1 4673 SV* csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 4674
46199a12 4675 sv_utf8_upgrade(csv);
8d6d96c1 4676 spv = SvPV(csv, slen);
13e8c8e3 4677 }
8d6d96c1
HS
4678 else
4679 sv_utf8_upgrade_nomg(dsv);
e84ff256 4680 }
8d6d96c1 4681 sv_catpvn_nomg(dsv, spv, slen);
560a288e 4682 }
79072805
LW
4683}
4684
954c1994
GS
4685/*
4686=for apidoc sv_catsv_mg
4687
4688Like C<sv_catsv>, but also handles 'set' magic.
4689
4690=cut
4691*/
4692
79072805 4693void
46199a12 4694Perl_sv_catsv_mg(pTHX_ SV *dsv, register SV *ssv)
ef50df4b 4695{
46199a12
JH
4696 sv_catsv(dsv,ssv);
4697 SvSETMAGIC(dsv);
ef50df4b
GS
4698}
4699
954c1994
GS
4700/*
4701=for apidoc sv_catpv
4702
4703Concatenates the string onto the end of the string which is in the SV.
d5ce4a7c
GA
4704If the SV has the UTF8 status set, then the bytes appended should be
4705valid UTF8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 4706
d5ce4a7c 4707=cut */
954c1994 4708
ef50df4b 4709void
0c981600 4710Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4711{
4712 register STRLEN len;
463ee0b2 4713 STRLEN tlen;
748a9306 4714 char *junk;
79072805 4715
0c981600 4716 if (!ptr)
79072805 4717 return;
748a9306 4718 junk = SvPV_force(sv, tlen);
0c981600 4719 len = strlen(ptr);
463ee0b2 4720 SvGROW(sv, tlen + len + 1);
0c981600
JH
4721 if (ptr == junk)
4722 ptr = SvPVX(sv);
4723 Move(ptr,SvPVX(sv)+tlen,len+1,char);
79072805 4724 SvCUR(sv) += len;
d41ff1b8 4725 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4726 SvTAINT(sv);
79072805
LW
4727}
4728
954c1994
GS
4729/*
4730=for apidoc sv_catpv_mg
4731
4732Like C<sv_catpv>, but also handles 'set' magic.
4733
4734=cut
4735*/
4736
ef50df4b 4737void
0c981600 4738Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 4739{
0c981600 4740 sv_catpv(sv,ptr);
ef50df4b
GS
4741 SvSETMAGIC(sv);
4742}
4743
645c22ef
DM
4744/*
4745=for apidoc newSV
4746
4747Create a new null SV, or if len > 0, create a new empty SVt_PV type SV
4748with an initial PV allocation of len+1. Normally accessed via the C<NEWSV>
4749macro.
4750
4751=cut
4752*/
4753
79072805 4754SV *
864dbfa3 4755Perl_newSV(pTHX_ STRLEN len)
79072805
LW
4756{
4757 register SV *sv;
1c846c1f 4758
4561caa4 4759 new_SV(sv);
79072805
LW
4760 if (len) {
4761 sv_upgrade(sv, SVt_PV);
4762 SvGROW(sv, len + 1);
4763 }
4764 return sv;
4765}
954c1994 4766/*
92110913 4767=for apidoc sv_magicext
954c1994 4768
68795e93 4769Adds magic to an SV, upgrading it if necessary. Applies the
92110913
NIS
4770supplied vtable and returns pointer to the magic added.
4771
4772Note that sv_magicext will allow things that sv_magic will not.
68795e93 4773In particular you can add magic to SvREADONLY SVs and and more than
92110913 4774one instance of the same 'how'
645c22ef 4775
92110913 4776I C<namelen> is greater then zero then a savepvn() I<copy> of C<name> is stored,
68795e93
NIS
4777if C<namelen> is zero then C<name> is stored as-is and - as another special
4778case - if C<(name && namelen == HEf_SVKEY)> then C<name> is assumed to contain
92110913
NIS
4779an C<SV*> and has its REFCNT incremented
4780
4781(This is now used as a subroutine by sv_magic.)
954c1994
GS
4782
4783=cut
4784*/
92110913
NIS
4785MAGIC *
4786Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, MGVTBL *vtable,
4787 const char* name, I32 namlen)
79072805
LW
4788{
4789 MAGIC* mg;
68795e93 4790
92110913
NIS
4791 if (SvTYPE(sv) < SVt_PVMG) {
4792 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 4793 }
79072805
LW
4794 Newz(702,mg, 1, MAGIC);
4795 mg->mg_moremagic = SvMAGIC(sv);
79072805 4796 SvMAGIC(sv) = mg;
75f9d97a 4797
18808301 4798 /* Some magic sontains a reference loop, where the sv and object refer to
bb03859b
RS
4799 each other. To prevent a reference loop that would prevent such
4800 objects being freed, we look for such loops and if we find one we
87f0b213
JH
4801 avoid incrementing the object refcount.
4802
4803 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 4804 have its REFCNT incremented to keep it in existence.
87f0b213
JH
4805
4806 */
14befaf4
DM
4807 if (!obj || obj == sv ||
4808 how == PERL_MAGIC_arylen ||
4809 how == PERL_MAGIC_qr ||
75f9d97a
JH
4810 (SvTYPE(obj) == SVt_PVGV &&
4811 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4812 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 4813 GvFORM(obj) == (CV*)sv)))
75f9d97a 4814 {
8990e307 4815 mg->mg_obj = obj;
75f9d97a 4816 }
85e6fe83 4817 else {
8990e307 4818 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
4819 mg->mg_flags |= MGf_REFCOUNTED;
4820 }
b5ccf5f2
YST
4821
4822 /* Normal self-ties simply pass a null object, and instead of
4823 using mg_obj directly, use the SvTIED_obj macro to produce a
4824 new RV as needed. For glob "self-ties", we are tieing the PVIO
4825 with an RV obj pointing to the glob containing the PVIO. In
4826 this case, to avoid a reference loop, we need to weaken the
4827 reference.
4828 */
4829
4830 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4831 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
4832 {
4833 sv_rvweaken(obj);
4834 }
4835
79072805 4836 mg->mg_type = how;
565764a8 4837 mg->mg_len = namlen;
9cbac4c7 4838 if (name) {
92110913 4839 if (namlen > 0)
1edc1566 4840 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 4841 else if (namlen == HEf_SVKEY)
1edc1566 4842 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
68795e93 4843 else
92110913 4844 mg->mg_ptr = (char *) name;
9cbac4c7 4845 }
92110913 4846 mg->mg_virtual = vtable;
68795e93 4847
92110913
NIS
4848 mg_magical(sv);
4849 if (SvGMAGICAL(sv))
4850 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4851 return mg;
4852}
4853
4854/*
4855=for apidoc sv_magic
1c846c1f 4856
92110913
NIS
4857Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4858then adds a new magic item of type C<how> to the head of the magic list.
4859
4860=cut
4861*/
4862
4863void
4864Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 4865{
92110913
NIS
4866 MAGIC* mg;
4867 MGVTBL *vtable = 0;
4868
765f542d
NC
4869#ifdef PERL_COPY_ON_WRITE
4870 if (SvIsCOW(sv))
4871 sv_force_normal_flags(sv, 0);
4872#endif
92110913
NIS
4873 if (SvREADONLY(sv)) {
4874 if (PL_curcop != &PL_compiling
4875 && how != PERL_MAGIC_regex_global
4876 && how != PERL_MAGIC_bm
4877 && how != PERL_MAGIC_fm
4878 && how != PERL_MAGIC_sv
4879 )
4880 {
4881 Perl_croak(aTHX_ PL_no_modify);
4882 }
4883 }
4884 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4885 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
4886 /* sv_magic() refuses to add a magic of the same 'how' as an
4887 existing one
92110913
NIS
4888 */
4889 if (how == PERL_MAGIC_taint)
4890 mg->mg_len |= 1;
4891 return;
4892 }
4893 }
68795e93 4894
79072805 4895 switch (how) {
14befaf4 4896 case PERL_MAGIC_sv:
92110913 4897 vtable = &PL_vtbl_sv;
79072805 4898 break;
14befaf4 4899 case PERL_MAGIC_overload:
92110913 4900 vtable = &PL_vtbl_amagic;
a0d0e21e 4901 break;
14befaf4 4902 case PERL_MAGIC_overload_elem:
92110913 4903 vtable = &PL_vtbl_amagicelem;
a0d0e21e 4904 break;
14befaf4 4905 case PERL_MAGIC_overload_table:
92110913 4906 vtable = &PL_vtbl_ovrld;
a0d0e21e 4907 break;
14befaf4 4908 case PERL_MAGIC_bm:
92110913 4909 vtable = &PL_vtbl_bm;
79072805 4910 break;
14befaf4 4911 case PERL_MAGIC_regdata:
92110913 4912 vtable = &PL_vtbl_regdata;
6cef1e77 4913 break;
14befaf4 4914 case PERL_MAGIC_regdatum:
92110913 4915 vtable = &PL_vtbl_regdatum;
6cef1e77 4916 break;
14befaf4 4917 case PERL_MAGIC_env:
92110913 4918 vtable = &PL_vtbl_env;
79072805 4919 break;
14befaf4 4920 case PERL_MAGIC_fm:
92110913 4921 vtable = &PL_vtbl_fm;
55497cff 4922 break;
14befaf4 4923 case PERL_MAGIC_envelem:
92110913 4924 vtable = &PL_vtbl_envelem;
79072805 4925 break;
14befaf4 4926 case PERL_MAGIC_regex_global:
92110913 4927 vtable = &PL_vtbl_mglob;
93a17b20 4928 break;
14befaf4 4929 case PERL_MAGIC_isa:
92110913 4930 vtable = &PL_vtbl_isa;
463ee0b2 4931 break;
14befaf4 4932 case PERL_MAGIC_isaelem:
92110913 4933 vtable = &PL_vtbl_isaelem;
463ee0b2 4934 break;
14befaf4 4935 case PERL_MAGIC_nkeys:
92110913 4936 vtable = &PL_vtbl_nkeys;
16660edb 4937 break;
14befaf4 4938 case PERL_MAGIC_dbfile:
92110913 4939 vtable = 0;
93a17b20 4940 break;
14befaf4 4941 case PERL_MAGIC_dbline:
92110913 4942 vtable = &PL_vtbl_dbline;
79072805 4943 break;
36477c24 4944#ifdef USE_LOCALE_COLLATE
14befaf4 4945 case PERL_MAGIC_collxfrm:
92110913 4946 vtable = &PL_vtbl_collxfrm;
bbce6d69 4947 break;
36477c24 4948#endif /* USE_LOCALE_COLLATE */
14befaf4 4949 case PERL_MAGIC_tied:
92110913 4950 vtable = &PL_vtbl_pack;
463ee0b2 4951 break;
14befaf4
DM
4952 case PERL_MAGIC_tiedelem:
4953 case PERL_MAGIC_tiedscalar:
92110913 4954 vtable = &PL_vtbl_packelem;
463ee0b2 4955 break;
14befaf4 4956 case PERL_MAGIC_qr:
92110913 4957 vtable = &PL_vtbl_regexp;
c277df42 4958 break;
14befaf4 4959 case PERL_MAGIC_sig:
92110913 4960 vtable = &PL_vtbl_sig;
79072805 4961 break;
14befaf4 4962 case PERL_MAGIC_sigelem:
92110913 4963 vtable = &PL_vtbl_sigelem;
79072805 4964 break;
14befaf4 4965 case PERL_MAGIC_taint:
92110913 4966 vtable = &PL_vtbl_taint;
463ee0b2 4967 break;
14befaf4 4968 case PERL_MAGIC_uvar:
92110913 4969 vtable = &PL_vtbl_uvar;
79072805 4970 break;
14befaf4 4971 case PERL_MAGIC_vec:
92110913 4972 vtable = &PL_vtbl_vec;
79072805 4973 break;
ece467f9
JP
4974 case PERL_MAGIC_vstring:
4975 vtable = 0;
4976 break;
7e8c5dac
HS
4977 case PERL_MAGIC_utf8:
4978 vtable = &PL_vtbl_utf8;
4979 break;
14befaf4 4980 case PERL_MAGIC_substr:
92110913 4981 vtable = &PL_vtbl_substr;
79072805 4982 break;
14befaf4 4983 case PERL_MAGIC_defelem:
92110913 4984 vtable = &PL_vtbl_defelem;
5f05dabc 4985 break;
14befaf4 4986 case PERL_MAGIC_glob:
92110913 4987 vtable = &PL_vtbl_glob;
79072805 4988 break;
14befaf4 4989 case PERL_MAGIC_arylen:
92110913 4990 vtable = &PL_vtbl_arylen;
79072805 4991 break;
14befaf4 4992 case PERL_MAGIC_pos:
92110913 4993 vtable = &PL_vtbl_pos;
a0d0e21e 4994 break;
14befaf4 4995 case PERL_MAGIC_backref:
92110913 4996 vtable = &PL_vtbl_backref;
810b8aa5 4997 break;
14befaf4
DM
4998 case PERL_MAGIC_ext:
4999 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
5000 /* Useful for attaching extension internal data to perl vars. */
5001 /* Note that multiple extensions may clash if magical scalars */
5002 /* etc holding private data from one are passed to another. */
a0d0e21e 5003 break;
79072805 5004 default:
14befaf4 5005 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 5006 }
68795e93 5007
92110913
NIS
5008 /* Rest of work is done else where */
5009 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 5010
92110913
NIS
5011 switch (how) {
5012 case PERL_MAGIC_taint:
5013 mg->mg_len = 1;
5014 break;
5015 case PERL_MAGIC_ext:
5016 case PERL_MAGIC_dbfile:
5017 SvRMAGICAL_on(sv);
5018 break;
5019 }
463ee0b2
LW
5020}
5021
c461cf8f
JH
5022/*
5023=for apidoc sv_unmagic
5024
645c22ef 5025Removes all magic of type C<type> from an SV.
c461cf8f
JH
5026
5027=cut
5028*/
5029
463ee0b2 5030int
864dbfa3 5031Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
5032{
5033 MAGIC* mg;
5034 MAGIC** mgp;
91bba347 5035 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
5036 return 0;
5037 mgp = &SvMAGIC(sv);
5038 for (mg = *mgp; mg; mg = *mgp) {
5039 if (mg->mg_type == type) {
5040 MGVTBL* vtbl = mg->mg_virtual;
5041 *mgp = mg->mg_moremagic;
1d7c1841 5042 if (vtbl && vtbl->svt_free)
fc0dc3b3 5043 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 5044 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 5045 if (mg->mg_len > 0)
1edc1566 5046 Safefree(mg->mg_ptr);
565764a8 5047 else if (mg->mg_len == HEf_SVKEY)
1edc1566 5048 SvREFCNT_dec((SV*)mg->mg_ptr);
7e8c5dac
HS
5049 else if (mg->mg_type == PERL_MAGIC_utf8 && mg->mg_ptr)
5050 Safefree(mg->mg_ptr);
9cbac4c7 5051 }
a0d0e21e
LW
5052 if (mg->mg_flags & MGf_REFCOUNTED)
5053 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
5054 Safefree(mg);
5055 }
5056 else
5057 mgp = &mg->mg_moremagic;
79072805 5058 }
91bba347 5059 if (!SvMAGIC(sv)) {
463ee0b2 5060 SvMAGICAL_off(sv);
06759ea0 5061 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
5062 }
5063
5064 return 0;
79072805
LW
5065}
5066
c461cf8f
JH
5067/*
5068=for apidoc sv_rvweaken
5069
645c22ef
DM
5070Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5071referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5072push a back-reference to this RV onto the array of backreferences
5073associated with that magic.
c461cf8f
JH
5074
5075=cut
5076*/
5077
810b8aa5 5078SV *
864dbfa3 5079Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
5080{
5081 SV *tsv;
5082 if (!SvOK(sv)) /* let undefs pass */
5083 return sv;
5084 if (!SvROK(sv))
cea2e8a9 5085 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 5086 else if (SvWEAKREF(sv)) {
810b8aa5 5087 if (ckWARN(WARN_MISC))
9014280d 5088 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
5089 return sv;
5090 }
5091 tsv = SvRV(sv);
5092 sv_add_backref(tsv, sv);
5093 SvWEAKREF_on(sv);
1c846c1f 5094 SvREFCNT_dec(tsv);
810b8aa5
GS
5095 return sv;
5096}
5097
645c22ef
DM
5098/* Give tsv backref magic if it hasn't already got it, then push a
5099 * back-reference to sv onto the array associated with the backref magic.
5100 */
5101
810b8aa5 5102STATIC void
cea2e8a9 5103S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
5104{
5105 AV *av;
5106 MAGIC *mg;
14befaf4 5107 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, PERL_MAGIC_backref)))
810b8aa5
GS
5108 av = (AV*)mg->mg_obj;
5109 else {
5110 av = newAV();
14befaf4 5111 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
d99b02a1
DM
5112 /* av now has a refcnt of 2, which avoids it getting freed
5113 * before us during global cleanup. The extra ref is removed
5114 * by magic_killbackrefs() when tsv is being freed */
810b8aa5 5115 }
d91d49e8
MM
5116 if (AvFILLp(av) >= AvMAX(av)) {
5117 SV **svp = AvARRAY(av);
5118 I32 i = AvFILLp(av);
5119 while (i >= 0) {
5120 if (svp[i] == &PL_sv_undef) {
5121 svp[i] = sv; /* reuse the slot */
5122 return;
5123 }
5124 i--;
5125 }
5126 av_extend(av, AvFILLp(av)+1);
5127 }
5128 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
5129}
5130
645c22ef
DM
5131/* delete a back-reference to ourselves from the backref magic associated
5132 * with the SV we point to.
5133 */
5134
1c846c1f 5135STATIC void
cea2e8a9 5136S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
5137{
5138 AV *av;
5139 SV **svp;
5140 I32 i;
5141 SV *tsv = SvRV(sv);
c04a4dfe 5142 MAGIC *mg = NULL;
14befaf4 5143 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, PERL_MAGIC_backref)))
cea2e8a9 5144 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
5145 av = (AV *)mg->mg_obj;
5146 svp = AvARRAY(av);
5147 i = AvFILLp(av);
5148 while (i >= 0) {
5149 if (svp[i] == sv) {
5150 svp[i] = &PL_sv_undef; /* XXX */
5151 }
5152 i--;
5153 }
5154}
5155
954c1994
GS
5156/*
5157=for apidoc sv_insert
5158
5159Inserts a string at the specified offset/length within the SV. Similar to
5160the Perl substr() function.
5161
5162=cut
5163*/
5164
79072805 5165void
864dbfa3 5166Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
79072805
LW
5167{
5168 register char *big;
5169 register char *mid;
5170 register char *midend;
5171 register char *bigend;
5172 register I32 i;
6ff81951 5173 STRLEN curlen;
1c846c1f 5174
79072805 5175
8990e307 5176 if (!bigstr)
cea2e8a9 5177 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 5178 SvPV_force(bigstr, curlen);
60fa28ff 5179 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
5180 if (offset + len > curlen) {
5181 SvGROW(bigstr, offset+len+1);
5182 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
5183 SvCUR_set(bigstr, offset+len);
5184 }
79072805 5185
69b47968 5186 SvTAINT(bigstr);
79072805
LW
5187 i = littlelen - len;
5188 if (i > 0) { /* string might grow */
a0d0e21e 5189 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
5190 mid = big + offset + len;
5191 midend = bigend = big + SvCUR(bigstr);
5192 bigend += i;
5193 *bigend = '\0';
5194 while (midend > mid) /* shove everything down */
5195 *--bigend = *--midend;
5196 Move(little,big+offset,littlelen,char);
5197 SvCUR(bigstr) += i;
5198 SvSETMAGIC(bigstr);
5199 return;
5200 }
5201 else if (i == 0) {
463ee0b2 5202 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
5203 SvSETMAGIC(bigstr);
5204 return;
5205 }
5206
463ee0b2 5207 big = SvPVX(bigstr);
79072805
LW
5208 mid = big + offset;
5209 midend = mid + len;
5210 bigend = big + SvCUR(bigstr);
5211
5212 if (midend > bigend)
cea2e8a9 5213 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5214
5215 if (mid - big > bigend - midend) { /* faster to shorten from end */
5216 if (littlelen) {
5217 Move(little, mid, littlelen,char);
5218 mid += littlelen;
5219 }
5220 i = bigend - midend;
5221 if (i > 0) {
5222 Move(midend, mid, i,char);
5223 mid += i;
5224 }
5225 *mid = '\0';
5226 SvCUR_set(bigstr, mid - big);
5227 }
5228 /*SUPPRESS 560*/
155aba94 5229 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5230 midend -= littlelen;
5231 mid = midend;
5232 sv_chop(bigstr,midend-i);
5233 big += i;
5234 while (i--)
5235 *--midend = *--big;
5236 if (littlelen)
5237 Move(little, mid, littlelen,char);
5238 }
5239 else if (littlelen) {
5240 midend -= littlelen;
5241 sv_chop(bigstr,midend);
5242 Move(little,midend,littlelen,char);
5243 }
5244 else {
5245 sv_chop(bigstr,midend);
5246 }
5247 SvSETMAGIC(bigstr);
5248}
5249
c461cf8f
JH
5250/*
5251=for apidoc sv_replace
5252
5253Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5254The target SV physically takes over ownership of the body of the source SV
5255and inherits its flags; however, the target keeps any magic it owns,
5256and any magic in the source is discarded.
ff276b08 5257Note that this is a rather specialist SV copying operation; most of the
645c22ef 5258time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5259
5260=cut
5261*/
79072805
LW
5262
5263void
864dbfa3 5264Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805
LW
5265{
5266 U32 refcnt = SvREFCNT(sv);
765f542d 5267 SV_CHECK_THINKFIRST_COW_DROP(sv);
0453d815 5268 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
9014280d 5269 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
93a17b20 5270 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5271 if (SvMAGICAL(nsv))
5272 mg_free(nsv);
5273 else
5274 sv_upgrade(nsv, SVt_PVMG);
93a17b20 5275 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 5276 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
5277 SvMAGICAL_off(sv);
5278 SvMAGIC(sv) = 0;
5279 }
79072805
LW
5280 SvREFCNT(sv) = 0;
5281 sv_clear(sv);
477f5d66 5282 assert(!SvREFCNT(sv));
79072805 5283 StructCopy(nsv,sv,SV);
d3d0e6f1
NC
5284#ifdef PERL_COPY_ON_WRITE
5285 if (SvIsCOW_normal(nsv)) {
5286 /* We need to follow the pointers around the loop to make the
5287 previous SV point to sv, rather than nsv. */
5288 SV *next;
5289 SV *current = nsv;
5290 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5291 assert(next);
5292 current = next;
5293 assert(SvPVX(current) == SvPVX(nsv));
5294 }
5295 /* Make the SV before us point to the SV after us. */
5296 if (DEBUG_C_TEST) {
5297 PerlIO_printf(Perl_debug_log, "previous is\n");
5298 sv_dump(current);
a29f6d03
NC
5299 PerlIO_printf(Perl_debug_log,
5300 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5301 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5302 }
a29f6d03 5303 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5304 }
5305#endif
79072805 5306 SvREFCNT(sv) = refcnt;
1edc1566 5307 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
463ee0b2 5308 del_SV(nsv);
79072805
LW
5309}
5310
c461cf8f
JH
5311/*
5312=for apidoc sv_clear
5313
645c22ef
DM
5314Clear an SV: call any destructors, free up any memory used by the body,
5315and free the body itself. The SV's head is I<not> freed, although
5316its type is set to all 1's so that it won't inadvertently be assumed
5317to be live during global destruction etc.
5318This function should only be called when REFCNT is zero. Most of the time
5319you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5320instead.
c461cf8f
JH
5321
5322=cut
5323*/
5324
79072805 5325void
864dbfa3 5326Perl_sv_clear(pTHX_ register SV *sv)
79072805 5327{
ec12f114 5328 HV* stash;
79072805
LW
5329 assert(sv);
5330 assert(SvREFCNT(sv) == 0);
5331
ed6116ce 5332 if (SvOBJECT(sv)) {
3280af22 5333 if (PL_defstash) { /* Still have a symbol table? */
39644a26 5334 dSP;
32251b26 5335 CV* destructor;
a0d0e21e 5336
5cc433a6 5337
8ebc5c01 5338
d460ef45 5339 do {
4e8e7886 5340 stash = SvSTASH(sv);
32251b26 5341 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 5342 if (destructor) {
5cc433a6
AB
5343 SV* tmpref = newRV(sv);
5344 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 5345 ENTER;
e788e7d3 5346 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
5347 EXTEND(SP, 2);
5348 PUSHMARK(SP);
5cc433a6 5349 PUSHs(tmpref);
4e8e7886 5350 PUTBACK;
44389ee9 5351 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
5cc433a6
AB
5352
5353
d3acc0f7 5354 POPSTACK;
3095d977 5355 SPAGAIN;
4e8e7886 5356 LEAVE;
5cc433a6
AB
5357 if(SvREFCNT(tmpref) < 2) {
5358 /* tmpref is not kept alive! */
5359 SvREFCNT(sv)--;
5360 SvRV(tmpref) = 0;
5361 SvROK_off(tmpref);
5362 }
5363 SvREFCNT_dec(tmpref);
4e8e7886
GS
5364 }
5365 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5366
6f44e0a4
JP
5367
5368 if (SvREFCNT(sv)) {
5369 if (PL_in_clean_objs)
cea2e8a9 5370 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
6f44e0a4
JP
5371 HvNAME(stash));
5372 /* DESTROY gave object new lease on life */
5373 return;
5374 }
a0d0e21e 5375 }
4e8e7886 5376
a0d0e21e 5377 if (SvOBJECT(sv)) {
4e8e7886 5378 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
5379 SvOBJECT_off(sv); /* Curse the object. */
5380 if (SvTYPE(sv) != SVt_PVIO)
3280af22 5381 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5382 }
463ee0b2 5383 }
524189f1
JH
5384 if (SvTYPE(sv) >= SVt_PVMG) {
5385 if (SvMAGIC(sv))
5386 mg_free(sv);
5387 if (SvFLAGS(sv) & SVpad_TYPED)
5388 SvREFCNT_dec(SvSTASH(sv));
5389 }
ec12f114 5390 stash = NULL;
79072805 5391 switch (SvTYPE(sv)) {
8990e307 5392 case SVt_PVIO:
df0bd2f4
GS
5393 if (IoIFP(sv) &&
5394 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5395 IoIFP(sv) != PerlIO_stdout() &&
5396 IoIFP(sv) != PerlIO_stderr())
93578b34 5397 {
f2b5be74 5398 io_close((IO*)sv, FALSE);
93578b34 5399 }
1d7c1841 5400 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5401 PerlDir_close(IoDIRP(sv));
1d7c1841 5402 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5403 Safefree(IoTOP_NAME(sv));
5404 Safefree(IoFMT_NAME(sv));
5405 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 5406 /* FALL THROUGH */
79072805 5407 case SVt_PVBM:
a0d0e21e 5408 goto freescalar;
79072805 5409 case SVt_PVCV:
748a9306 5410 case SVt_PVFM:
85e6fe83 5411 cv_undef((CV*)sv);
a0d0e21e 5412 goto freescalar;
79072805 5413 case SVt_PVHV:
85e6fe83 5414 hv_undef((HV*)sv);
a0d0e21e 5415 break;
79072805 5416 case SVt_PVAV:
85e6fe83 5417 av_undef((AV*)sv);
a0d0e21e 5418 break;
02270b4e 5419 case SVt_PVLV:
dd28f7bb
DM
5420 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5421 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5422 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5423 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5424 }
5425 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
5426 SvREFCNT_dec(LvTARG(sv));
02270b4e 5427 goto freescalar;
a0d0e21e 5428 case SVt_PVGV:
1edc1566 5429 gp_free((GV*)sv);
a0d0e21e 5430 Safefree(GvNAME(sv));
ec12f114
JPC
5431 /* cannot decrease stash refcount yet, as we might recursively delete
5432 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
5433 of stash until current sv is completely gone.
5434 -- JohnPC, 27 Mar 1998 */
5435 stash = GvSTASH(sv);
a0d0e21e 5436 /* FALL THROUGH */
79072805 5437 case SVt_PVMG:
79072805
LW
5438 case SVt_PVNV:
5439 case SVt_PVIV:
a0d0e21e
LW
5440 freescalar:
5441 (void)SvOOK_off(sv);
79072805
LW
5442 /* FALL THROUGH */
5443 case SVt_PV:
a0d0e21e 5444 case SVt_RV:
810b8aa5
GS
5445 if (SvROK(sv)) {
5446 if (SvWEAKREF(sv))
5447 sv_del_backref(sv);
5448 else
5449 SvREFCNT_dec(SvRV(sv));
5450 }
765f542d
NC
5451#ifdef PERL_COPY_ON_WRITE
5452 else if (SvPVX(sv)) {
5453 if (SvIsCOW(sv)) {
5454 /* I believe I need to grab the global SV mutex here and
5455 then recheck the COW status. */
46187eeb
NC
5456 if (DEBUG_C_TEST) {
5457 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5458 sv_dump(sv);
46187eeb 5459 }
e419cbc5 5460 sv_release_COW(sv, SvPVX(sv), SvCUR(sv), SvLEN(sv),
765f542d
NC
5461 SvUVX(sv), SV_COW_NEXT_SV(sv));
5462 /* And drop it here. */
5463 SvFAKE_off(sv);
5464 } else if (SvLEN(sv)) {
5465 Safefree(SvPVX(sv));
5466 }
5467 }
5468#else
1edc1566 5469 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 5470 Safefree(SvPVX(sv));
1c846c1f 5471 else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
25716404
GS
5472 unsharepvn(SvPVX(sv),
5473 SvUTF8(sv) ? -(I32)SvCUR(sv) : SvCUR(sv),
5474 SvUVX(sv));
1c846c1f
NIS
5475 SvFAKE_off(sv);
5476 }
765f542d 5477#endif
79072805 5478 break;
a0d0e21e 5479/*
79072805 5480 case SVt_NV:
79072805 5481 case SVt_IV:
79072805
LW
5482 case SVt_NULL:
5483 break;
a0d0e21e 5484*/
79072805
LW
5485 }
5486
5487 switch (SvTYPE(sv)) {
5488 case SVt_NULL:
5489 break;
79072805
LW
5490 case SVt_IV:
5491 del_XIV(SvANY(sv));
5492 break;
5493 case SVt_NV:
5494 del_XNV(SvANY(sv));
5495 break;
ed6116ce
LW
5496 case SVt_RV:
5497 del_XRV(SvANY(sv));
5498 break;
79072805
LW
5499 case SVt_PV:
5500 del_XPV(SvANY(sv));
5501 break;
5502 case SVt_PVIV:
5503 del_XPVIV(SvANY(sv));
5504 break;
5505 case SVt_PVNV:
5506 del_XPVNV(SvANY(sv));
5507 break;
5508 case SVt_PVMG:
5509 del_XPVMG(SvANY(sv));
5510 break;
5511 case SVt_PVLV:
5512 del_XPVLV(SvANY(sv));
5513 break;
5514 case SVt_PVAV:
5515 del_XPVAV(SvANY(sv));
5516 break;
5517 case SVt_PVHV:
5518 del_XPVHV(SvANY(sv));
5519 break;
5520 case SVt_PVCV:
5521 del_XPVCV(SvANY(sv));
5522 break;
5523 case SVt_PVGV:
5524 del_XPVGV(SvANY(sv));
ec12f114
JPC
5525 /* code duplication for increased performance. */
5526 SvFLAGS(sv) &= SVf_BREAK;
5527 SvFLAGS(sv) |= SVTYPEMASK;
5528 /* decrease refcount of the stash that owns this GV, if any */
5529 if (stash)
5530 SvREFCNT_dec(stash);
5531 return; /* not break, SvFLAGS reset already happened */
79072805
LW
5532 case SVt_PVBM:
5533 del_XPVBM(SvANY(sv));
5534 break;
5535 case SVt_PVFM:
5536 del_XPVFM(SvANY(sv));
5537 break;
8990e307
LW
5538 case SVt_PVIO:
5539 del_XPVIO(SvANY(sv));
5540 break;
79072805 5541 }
a0d0e21e 5542 SvFLAGS(sv) &= SVf_BREAK;
8990e307 5543 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
5544}
5545
645c22ef
DM
5546/*
5547=for apidoc sv_newref
5548
5549Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5550instead.
5551
5552=cut
5553*/
5554
79072805 5555SV *
864dbfa3 5556Perl_sv_newref(pTHX_ SV *sv)
79072805 5557{
463ee0b2 5558 if (sv)
4db098f4 5559 (SvREFCNT(sv))++;
79072805
LW
5560 return sv;
5561}
5562
c461cf8f
JH
5563/*
5564=for apidoc sv_free
5565
645c22ef
DM
5566Decrement an SV's reference count, and if it drops to zero, call
5567C<sv_clear> to invoke destructors and free up any memory used by
5568the body; finally, deallocate the SV's head itself.
5569Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5570
5571=cut
5572*/
5573
79072805 5574void
864dbfa3 5575Perl_sv_free(pTHX_ SV *sv)
79072805
LW
5576{
5577 if (!sv)
5578 return;
a0d0e21e
LW
5579 if (SvREFCNT(sv) == 0) {
5580 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5581 /* this SV's refcnt has been artificially decremented to
5582 * trigger cleanup */
a0d0e21e 5583 return;
3280af22 5584 if (PL_in_clean_all) /* All is fair */
1edc1566 5585 return;
d689ffdd
JP
5586 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5587 /* make sure SvREFCNT(sv)==0 happens very seldom */
5588 SvREFCNT(sv) = (~(U32)0)/2;
5589 return;
5590 }
0453d815 5591 if (ckWARN_d(WARN_INTERNAL))
9014280d 5592 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Attempt to free unreferenced scalar");
79072805
LW
5593 return;
5594 }
4db098f4 5595 if (--(SvREFCNT(sv)) > 0)
8990e307 5596 return;
8c4d3c90
NC
5597 Perl_sv_free2(aTHX_ sv);
5598}
5599
5600void
5601Perl_sv_free2(pTHX_ SV *sv)
5602{
463ee0b2
LW
5603#ifdef DEBUGGING
5604 if (SvTEMP(sv)) {
0453d815 5605 if (ckWARN_d(WARN_DEBUGGING))
9014280d 5606 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
1d7c1841
GS
5607 "Attempt to free temp prematurely: SV 0x%"UVxf,
5608 PTR2UV(sv));
79072805 5609 return;
79072805 5610 }
463ee0b2 5611#endif
d689ffdd
JP
5612 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5613 /* make sure SvREFCNT(sv)==0 happens very seldom */
5614 SvREFCNT(sv) = (~(U32)0)/2;
5615 return;
5616 }
79072805 5617 sv_clear(sv);
477f5d66
CS
5618 if (! SvREFCNT(sv))
5619 del_SV(sv);
79072805
LW
5620}
5621
954c1994
GS
5622/*
5623=for apidoc sv_len
5624
645c22ef
DM
5625Returns the length of the string in the SV. Handles magic and type
5626coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5627
5628=cut
5629*/
5630
79072805 5631STRLEN
864dbfa3 5632Perl_sv_len(pTHX_ register SV *sv)
79072805 5633{
463ee0b2 5634 STRLEN len;
79072805
LW
5635
5636 if (!sv)
5637 return 0;
5638
8990e307 5639 if (SvGMAGICAL(sv))
565764a8 5640 len = mg_length(sv);
8990e307 5641 else
497b47a8 5642 (void)SvPV(sv, len);
463ee0b2 5643 return len;
79072805
LW
5644}
5645
c461cf8f
JH
5646/*
5647=for apidoc sv_len_utf8
5648
5649Returns the number of characters in the string in an SV, counting wide
645c22ef 5650UTF8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5651
5652=cut
5653*/
5654
7e8c5dac
HS
5655/*
5656 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
5657 * mg_ptr is used, by sv_pos_u2b(), see the comments of S_utf8_mg_pos_init().
5658 * (Note that the mg_len is not the length of the mg_ptr field.)
5659 *
5660 */
5661
a0ed51b3 5662STRLEN
864dbfa3 5663Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 5664{
a0ed51b3
LW
5665 if (!sv)
5666 return 0;
5667
a0ed51b3 5668 if (SvGMAGICAL(sv))
b76347f2 5669 return mg_length(sv);
a0ed51b3 5670 else
b76347f2 5671 {
7e8c5dac 5672 STRLEN len, ulen;
b76347f2 5673 U8 *s = (U8*)SvPV(sv, len);
7e8c5dac
HS
5674 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
5675
e23c8137 5676 if (mg && mg->mg_len != -1 && (mg->mg_len > 0 || len == 0)) {
7e8c5dac 5677 ulen = mg->mg_len;
e23c8137
JH
5678#ifdef PERL_UTF8_CACHE_ASSERT
5679 assert(ulen == Perl_utf8_length(aTHX_ s, s + len));
5680#endif
5681 }
7e8c5dac
HS
5682 else {
5683 ulen = Perl_utf8_length(aTHX_ s, s + len);
5684 if (!mg && !SvREADONLY(sv)) {
5685 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
5686 mg = mg_find(sv, PERL_MAGIC_utf8);
5687 assert(mg);
5688 }
5689 if (mg)
5690 mg->mg_len = ulen;
5691 }
5692 return ulen;
5693 }
5694}
5695
5696/* S_utf8_mg_pos_init() is used to initialize the mg_ptr field of
5697 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5698 * between UTF-8 and byte offsets. There are two (substr offset and substr
5699 * length, the i offset, PERL_MAGIC_UTF8_CACHESIZE) times two (UTF-8 offset
5700 * and byte offset) cache positions.
5701 *
5702 * The mg_len field is used by sv_len_utf8(), see its comments.
5703 * Note that the mg_len is not the length of the mg_ptr field.
5704 *
5705 */
5706STATIC bool
6e551876 5707S_utf8_mg_pos_init(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, U8 *s, U8 *start)
7e8c5dac
HS
5708{
5709 bool found = FALSE;
5710
5711 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
5712 if (!*mgp) {
5713 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
5714 *mgp = mg_find(sv, PERL_MAGIC_utf8);
5715 }
5716 assert(*mgp);
b76347f2 5717
7e8c5dac
HS
5718 if ((*mgp)->mg_ptr)
5719 *cachep = (STRLEN *) (*mgp)->mg_ptr;
5720 else {
5721 Newz(0, *cachep, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
5722 (*mgp)->mg_ptr = (char *) *cachep;
5723 }
5724 assert(*cachep);
5725
5726 (*cachep)[i] = *offsetp;
5727 (*cachep)[i+1] = s - start;
5728 found = TRUE;
a0ed51b3 5729 }
7e8c5dac
HS
5730
5731 return found;
a0ed51b3
LW
5732}
5733
645c22ef 5734/*
7e8c5dac
HS
5735 * S_utf8_mg_pos() is used to query and update mg_ptr field of
5736 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5737 * between UTF-8 and byte offsets. See also the comments of
5738 * S_utf8_mg_pos_init().
5739 *
5740 */
5741STATIC bool
6e551876 5742S_utf8_mg_pos(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, I32 uoff, U8 **sp, U8 *start, U8 *send)
7e8c5dac
HS
5743{
5744 bool found = FALSE;
5745
5746 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
5747 if (!*mgp)
5748 *mgp = mg_find(sv, PERL_MAGIC_utf8);
5749 if (*mgp && (*mgp)->mg_ptr) {
5750 *cachep = (STRLEN *) (*mgp)->mg_ptr;
e23c8137 5751 ASSERT_UTF8_CACHE(*cachep);
667208dd 5752 if ((*cachep)[i] == (STRLEN)uoff) /* An exact match. */
e23c8137 5753 found = TRUE;
7e8c5dac
HS
5754 else { /* We will skip to the right spot. */
5755 STRLEN forw = 0;
5756 STRLEN backw = 0;
5757 U8* p = NULL;
5758
5759 /* The assumption is that going backward is half
5760 * the speed of going forward (that's where the
5761 * 2 * backw in the below comes from). (The real
5762 * figure of course depends on the UTF-8 data.) */
5763
667208dd 5764 if ((*cachep)[i] > (STRLEN)uoff) {
7e8c5dac 5765 forw = uoff;
667208dd 5766 backw = (*cachep)[i] - (STRLEN)uoff;
7e8c5dac
HS
5767
5768 if (forw < 2 * backw)
5769 p = start;
5770 else
5771 p = start + (*cachep)[i+1];
5772 }
5773 /* Try this only for the substr offset (i == 0),
5774 * not for the substr length (i == 2). */
5775 else if (i == 0) { /* (*cachep)[i] < uoff */
5776 STRLEN ulen = sv_len_utf8(sv);
5777
667208dd
JH
5778 if ((STRLEN)uoff < ulen) {
5779 forw = (STRLEN)uoff - (*cachep)[i];
5780 backw = ulen - (STRLEN)uoff;
7e8c5dac
HS
5781
5782 if (forw < 2 * backw)
5783 p = start + (*cachep)[i+1];
5784 else
5785 p = send;
5786 }
5787
5788 /* If the string is not long enough for uoff,
5789 * we could extend it, but not at this low a level. */
5790 }
5791
5792 if (p) {
5793 if (forw < 2 * backw) {
5794 while (forw--)
5795 p += UTF8SKIP(p);
5796 }
5797 else {
5798 while (backw--) {
5799 p--;
5800 while (UTF8_IS_CONTINUATION(*p))
5801 p--;
5802 }
5803 }
5804
5805 /* Update the cache. */
667208dd 5806 (*cachep)[i] = (STRLEN)uoff;
7e8c5dac
HS
5807 (*cachep)[i+1] = p - start;
5808
5809 found = TRUE;
5810 }
5811 }
5812 if (found) { /* Setup the return values. */
5813 *offsetp = (*cachep)[i+1];
5814 *sp = start + *offsetp;
5815 if (*sp >= send) {
5816 *sp = send;
5817 *offsetp = send - start;
5818 }
5819 else if (*sp < start) {
5820 *sp = start;
5821 *offsetp = 0;
5822 }
5823 }
5824 }
e23c8137
JH
5825#ifdef PERL_UTF8_CACHE_ASSERT
5826 if (found) {
5827 U8 *s = start;
5828 I32 n = uoff;
5829
5830 while (n-- && s < send)
5831 s += UTF8SKIP(s);
5832
5833 if (i == 0) {
5834 assert(*offsetp == s - start);
5835 assert((*cachep)[0] == (STRLEN)uoff);
5836 assert((*cachep)[1] == *offsetp);
5837 }
5838 ASSERT_UTF8_CACHE(*cachep);
5839 }
5840#endif
7e8c5dac 5841 }
e23c8137 5842
7e8c5dac
HS
5843 return found;
5844}
5845
5846/*
645c22ef
DM
5847=for apidoc sv_pos_u2b
5848
5849Converts the value pointed to by offsetp from a count of UTF8 chars from
5850the start of the string, to a count of the equivalent number of bytes; if
5851lenp is non-zero, it does the same to lenp, but this time starting from
5852the offset, rather than from the start of the string. Handles magic and
5853type coercion.
5854
5855=cut
5856*/
5857
7e8c5dac
HS
5858/*
5859 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
5860 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5861 * byte offsets. See also the comments of S_utf8_mg_pos().
5862 *
5863 */
5864
a0ed51b3 5865void
864dbfa3 5866Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 5867{
dfe13c55
GS
5868 U8 *start;
5869 U8 *s;
a0ed51b3 5870 STRLEN len;
7e8c5dac
HS
5871 STRLEN *cache = 0;
5872 STRLEN boffset = 0;
a0ed51b3
LW
5873
5874 if (!sv)
5875 return;
5876
dfe13c55 5877 start = s = (U8*)SvPV(sv, len);
7e8c5dac
HS
5878 if (len) {
5879 I32 uoffset = *offsetp;
5880 U8 *send = s + len;
5881 MAGIC *mg = 0;
5882 bool found = FALSE;
5883
bdf77a2a 5884 if (utf8_mg_pos(sv, &mg, &cache, 0, offsetp, *offsetp, &s, start, send))
7e8c5dac
HS
5885 found = TRUE;
5886 if (!found && uoffset > 0) {
5887 while (s < send && uoffset--)
5888 s += UTF8SKIP(s);
5889 if (s >= send)
5890 s = send;
bdf77a2a 5891 if (utf8_mg_pos_init(sv, &mg, &cache, 0, offsetp, s, start))
7e8c5dac
HS
5892 boffset = cache[1];
5893 *offsetp = s - start;
5894 }
5895 if (lenp) {
5896 found = FALSE;
5897 start = s;
bdf77a2a 5898 if (utf8_mg_pos(sv, &mg, &cache, 2, lenp, *lenp + *offsetp, &s, start, send)) {
7e8c5dac
HS
5899 *lenp -= boffset;
5900 found = TRUE;
5901 }
5902 if (!found && *lenp > 0) {
5903 I32 ulen = *lenp;
5904 if (ulen > 0)
5905 while (s < send && ulen--)
5906 s += UTF8SKIP(s);
5907 if (s >= send)
5908 s = send;
bdf77a2a 5909 if (utf8_mg_pos_init(sv, &mg, &cache, 2, lenp, s, start))
7e8c5dac
HS
5910 cache[2] += *offsetp;
5911 }
5912 *lenp = s - start;
5913 }
e23c8137 5914 ASSERT_UTF8_CACHE(cache);
7e8c5dac
HS
5915 }
5916 else {
5917 *offsetp = 0;
5918 if (lenp)
5919 *lenp = 0;
a0ed51b3 5920 }
e23c8137 5921
a0ed51b3
LW
5922 return;
5923}
5924
645c22ef
DM
5925/*
5926=for apidoc sv_pos_b2u
5927
5928Converts the value pointed to by offsetp from a count of bytes from the
5929start of the string, to a count of the equivalent number of UTF8 chars.
5930Handles magic and type coercion.
5931
5932=cut
5933*/
5934
7e8c5dac
HS
5935/*
5936 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
5937 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5938 * byte offsets. See also the comments of S_utf8_mg_pos().
5939 *
5940 */
5941
a0ed51b3 5942void
7e8c5dac 5943Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 5944{
7e8c5dac 5945 U8* s;
a0ed51b3
LW
5946 STRLEN len;
5947
5948 if (!sv)
5949 return;
5950
dfe13c55 5951 s = (U8*)SvPV(sv, len);
eb160463 5952 if ((I32)len < *offsetp)
a0dbb045 5953 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac
HS
5954 else {
5955 U8* send = s + *offsetp;
5956 MAGIC* mg = NULL;
5957 STRLEN *cache = NULL;
5958
5959 len = 0;
5960
5961 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
5962 mg = mg_find(sv, PERL_MAGIC_utf8);
5963 if (mg && mg->mg_ptr) {
5964 cache = (STRLEN *) mg->mg_ptr;
c5661c80 5965 if (cache[1] == (STRLEN)*offsetp) {
7e8c5dac
HS
5966 /* An exact match. */
5967 *offsetp = cache[0];
5968
5969 return;
5970 }
c5661c80 5971 else if (cache[1] < (STRLEN)*offsetp) {
7e8c5dac
HS
5972 /* We already know part of the way. */
5973 len = cache[0];
5974 s += cache[1];
5975 /* Let the below loop do the rest. */
5976 }
5977 else { /* cache[1] > *offsetp */
5978 /* We already know all of the way, now we may
5979 * be able to walk back. The same assumption
5980 * is made as in S_utf8_mg_pos(), namely that
5981 * walking backward is twice slower than
5982 * walking forward. */
5983 STRLEN forw = *offsetp;
5984 STRLEN backw = cache[1] - *offsetp;
5985
5986 if (!(forw < 2 * backw)) {
5987 U8 *p = s + cache[1];
5988 STRLEN ubackw = 0;
5989
a5b510f2
AE
5990 cache[1] -= backw;
5991
7e8c5dac
HS
5992 while (backw--) {
5993 p--;
0aeb64d0 5994 while (UTF8_IS_CONTINUATION(*p)) {
7e8c5dac 5995 p--;
0aeb64d0
JH
5996 backw--;
5997 }
7e8c5dac
HS
5998 ubackw++;
5999 }
6000
6001 cache[0] -= ubackw;
0aeb64d0
JH
6002 *offsetp = cache[0];
6003 return;
7e8c5dac
HS
6004 }
6005 }
6006 }
e23c8137 6007 ASSERT_UTF8_CACHE(cache);
a0dbb045 6008 }
7e8c5dac
HS
6009
6010 while (s < send) {
6011 STRLEN n = 1;
6012
6013 /* Call utf8n_to_uvchr() to validate the sequence
6014 * (unless a simple non-UTF character) */
6015 if (!UTF8_IS_INVARIANT(*s))
6016 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
6017 if (n > 0) {
6018 s += n;
6019 len++;
6020 }
6021 else
6022 break;
6023 }
6024
6025 if (!SvREADONLY(sv)) {
6026 if (!mg) {
6027 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
6028 mg = mg_find(sv, PERL_MAGIC_utf8);
6029 }
6030 assert(mg);
6031
6032 if (!mg->mg_ptr) {
6033 Newz(0, cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
6034 mg->mg_ptr = (char *) cache;
6035 }
6036 assert(cache);
6037
6038 cache[0] = len;
6039 cache[1] = *offsetp;
6040 }
6041
6042 *offsetp = len;
a0ed51b3 6043 }
a0ed51b3
LW
6044 return;
6045}
6046
954c1994
GS
6047/*
6048=for apidoc sv_eq
6049
6050Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
6051identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6052coerce its args to strings if necessary.
954c1994
GS
6053
6054=cut
6055*/
6056
79072805 6057I32
e01b9e88 6058Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805
LW
6059{
6060 char *pv1;
463ee0b2 6061 STRLEN cur1;
79072805 6062 char *pv2;
463ee0b2 6063 STRLEN cur2;
e01b9e88 6064 I32 eq = 0;
553e1bcc
AT
6065 char *tpv = Nullch;
6066 SV* svrecode = Nullsv;
79072805 6067
e01b9e88 6068 if (!sv1) {
79072805
LW
6069 pv1 = "";
6070 cur1 = 0;
6071 }
463ee0b2 6072 else
e01b9e88 6073 pv1 = SvPV(sv1, cur1);
79072805 6074
e01b9e88
SC
6075 if (!sv2){
6076 pv2 = "";
6077 cur2 = 0;
92d29cee 6078 }
e01b9e88
SC
6079 else
6080 pv2 = SvPV(sv2, cur2);
79072805 6081
cf48d248 6082 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6083 /* Differing utf8ness.
6084 * Do not UTF8size the comparands as a side-effect. */
6085 if (PL_encoding) {
6086 if (SvUTF8(sv1)) {
553e1bcc
AT
6087 svrecode = newSVpvn(pv2, cur2);
6088 sv_recode_to_utf8(svrecode, PL_encoding);
6089 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6090 }
6091 else {
553e1bcc
AT
6092 svrecode = newSVpvn(pv1, cur1);
6093 sv_recode_to_utf8(svrecode, PL_encoding);
6094 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6095 }
6096 /* Now both are in UTF-8. */
6097 if (cur1 != cur2)
6098 return FALSE;
6099 }
6100 else {
6101 bool is_utf8 = TRUE;
6102
6103 if (SvUTF8(sv1)) {
6104 /* sv1 is the UTF-8 one,
6105 * if is equal it must be downgrade-able */
6106 char *pv = (char*)bytes_from_utf8((U8*)pv1,
6107 &cur1, &is_utf8);
6108 if (pv != pv1)
553e1bcc 6109 pv1 = tpv = pv;
799ef3cb
JH
6110 }
6111 else {
6112 /* sv2 is the UTF-8 one,
6113 * if is equal it must be downgrade-able */
6114 char *pv = (char *)bytes_from_utf8((U8*)pv2,
6115 &cur2, &is_utf8);
6116 if (pv != pv2)
553e1bcc 6117 pv2 = tpv = pv;
799ef3cb
JH
6118 }
6119 if (is_utf8) {
6120 /* Downgrade not possible - cannot be eq */
6121 return FALSE;
6122 }
6123 }
cf48d248
JH
6124 }
6125
6126 if (cur1 == cur2)
765f542d 6127 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 6128
553e1bcc
AT
6129 if (svrecode)
6130 SvREFCNT_dec(svrecode);
799ef3cb 6131
553e1bcc
AT
6132 if (tpv)
6133 Safefree(tpv);
cf48d248 6134
e01b9e88 6135 return eq;
79072805
LW
6136}
6137
954c1994
GS
6138/*
6139=for apidoc sv_cmp
6140
6141Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
6142string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
6143C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6144coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
6145
6146=cut
6147*/
6148
79072805 6149I32
e01b9e88 6150Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 6151{
560a288e 6152 STRLEN cur1, cur2;
553e1bcc 6153 char *pv1, *pv2, *tpv = Nullch;
cf48d248 6154 I32 cmp;
553e1bcc 6155 SV *svrecode = Nullsv;
560a288e 6156
e01b9e88
SC
6157 if (!sv1) {
6158 pv1 = "";
560a288e
GS
6159 cur1 = 0;
6160 }
e01b9e88
SC
6161 else
6162 pv1 = SvPV(sv1, cur1);
560a288e 6163
553e1bcc 6164 if (!sv2) {
e01b9e88 6165 pv2 = "";
560a288e
GS
6166 cur2 = 0;
6167 }
e01b9e88
SC
6168 else
6169 pv2 = SvPV(sv2, cur2);
79072805 6170
cf48d248 6171 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6172 /* Differing utf8ness.
6173 * Do not UTF8size the comparands as a side-effect. */
cf48d248 6174 if (SvUTF8(sv1)) {
799ef3cb 6175 if (PL_encoding) {
553e1bcc
AT
6176 svrecode = newSVpvn(pv2, cur2);
6177 sv_recode_to_utf8(svrecode, PL_encoding);
6178 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6179 }
6180 else {
553e1bcc 6181 pv2 = tpv = (char*)bytes_to_utf8((U8*)pv2, &cur2);
799ef3cb 6182 }
cf48d248
JH
6183 }
6184 else {
799ef3cb 6185 if (PL_encoding) {
553e1bcc
AT
6186 svrecode = newSVpvn(pv1, cur1);
6187 sv_recode_to_utf8(svrecode, PL_encoding);
6188 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6189 }
6190 else {
553e1bcc 6191 pv1 = tpv = (char*)bytes_to_utf8((U8*)pv1, &cur1);
799ef3cb 6192 }
cf48d248
JH
6193 }
6194 }
6195
e01b9e88 6196 if (!cur1) {
cf48d248 6197 cmp = cur2 ? -1 : 0;
e01b9e88 6198 } else if (!cur2) {
cf48d248
JH
6199 cmp = 1;
6200 } else {
6201 I32 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
6202
6203 if (retval) {
cf48d248 6204 cmp = retval < 0 ? -1 : 1;
e01b9e88 6205 } else if (cur1 == cur2) {
cf48d248
JH
6206 cmp = 0;
6207 } else {
6208 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 6209 }
cf48d248 6210 }
16660edb 6211
553e1bcc
AT
6212 if (svrecode)
6213 SvREFCNT_dec(svrecode);
799ef3cb 6214
553e1bcc
AT
6215 if (tpv)
6216 Safefree(tpv);
cf48d248
JH
6217
6218 return cmp;
bbce6d69 6219}
16660edb 6220
c461cf8f
JH
6221/*
6222=for apidoc sv_cmp_locale
6223
645c22ef
DM
6224Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6225'use bytes' aware, handles get magic, and will coerce its args to strings
6226if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
6227
6228=cut
6229*/
6230
bbce6d69 6231I32
864dbfa3 6232Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 6233{
36477c24 6234#ifdef USE_LOCALE_COLLATE
16660edb 6235
bbce6d69 6236 char *pv1, *pv2;
6237 STRLEN len1, len2;
6238 I32 retval;
16660edb 6239
3280af22 6240 if (PL_collation_standard)
bbce6d69 6241 goto raw_compare;
16660edb 6242
bbce6d69 6243 len1 = 0;
8ac85365 6244 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 6245 len2 = 0;
8ac85365 6246 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 6247
bbce6d69 6248 if (!pv1 || !len1) {
6249 if (pv2 && len2)
6250 return -1;
6251 else
6252 goto raw_compare;
6253 }
6254 else {
6255 if (!pv2 || !len2)
6256 return 1;
6257 }
16660edb 6258
bbce6d69 6259 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 6260
bbce6d69 6261 if (retval)
16660edb 6262 return retval < 0 ? -1 : 1;
6263
bbce6d69 6264 /*
6265 * When the result of collation is equality, that doesn't mean
6266 * that there are no differences -- some locales exclude some
6267 * characters from consideration. So to avoid false equalities,
6268 * we use the raw string as a tiebreaker.
6269 */
16660edb 6270
bbce6d69 6271 raw_compare:
6272 /* FALL THROUGH */
16660edb 6273
36477c24 6274#endif /* USE_LOCALE_COLLATE */
16660edb 6275
bbce6d69 6276 return sv_cmp(sv1, sv2);
6277}
79072805 6278
645c22ef 6279
36477c24 6280#ifdef USE_LOCALE_COLLATE
645c22ef 6281
7a4c00b4 6282/*
645c22ef
DM
6283=for apidoc sv_collxfrm
6284
6285Add Collate Transform magic to an SV if it doesn't already have it.
6286
6287Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6288scalar data of the variable, but transformed to such a format that a normal
6289memory comparison can be used to compare the data according to the locale
6290settings.
6291
6292=cut
6293*/
6294
bbce6d69 6295char *
864dbfa3 6296Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 6297{
7a4c00b4 6298 MAGIC *mg;
16660edb 6299
14befaf4 6300 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 6301 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 6302 char *s, *xf;
6303 STRLEN len, xlen;
6304
7a4c00b4 6305 if (mg)
6306 Safefree(mg->mg_ptr);
bbce6d69 6307 s = SvPV(sv, len);
6308 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 6309 if (SvREADONLY(sv)) {
6310 SAVEFREEPV(xf);
6311 *nxp = xlen;
3280af22 6312 return xf + sizeof(PL_collation_ix);
ff0cee69 6313 }
7a4c00b4 6314 if (! mg) {
14befaf4
DM
6315 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
6316 mg = mg_find(sv, PERL_MAGIC_collxfrm);
7a4c00b4 6317 assert(mg);
bbce6d69 6318 }
7a4c00b4 6319 mg->mg_ptr = xf;
565764a8 6320 mg->mg_len = xlen;
7a4c00b4 6321 }
6322 else {
ff0cee69 6323 if (mg) {
6324 mg->mg_ptr = NULL;
565764a8 6325 mg->mg_len = -1;
ff0cee69 6326 }
bbce6d69 6327 }
6328 }
7a4c00b4 6329 if (mg && mg->mg_ptr) {
565764a8 6330 *nxp = mg->mg_len;
3280af22 6331 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 6332 }
6333 else {
6334 *nxp = 0;
6335 return NULL;
16660edb 6336 }
79072805
LW
6337}
6338
36477c24 6339#endif /* USE_LOCALE_COLLATE */
bbce6d69 6340
c461cf8f
JH
6341/*
6342=for apidoc sv_gets
6343
6344Get a line from the filehandle and store it into the SV, optionally
6345appending to the currently-stored string.
6346
6347=cut
6348*/
6349
79072805 6350char *
864dbfa3 6351Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 6352{
c07a80fd 6353 char *rsptr;
6354 STRLEN rslen;
6355 register STDCHAR rslast;
6356 register STDCHAR *bp;
6357 register I32 cnt;
9c5ffd7c 6358 I32 i = 0;
8bfdd7d9 6359 I32 rspara = 0;
e311fd51 6360 I32 recsize;
c07a80fd 6361
bc44a8a2
NC
6362 if (SvTHINKFIRST(sv))
6363 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
6364 /* XXX. If you make this PVIV, then copy on write can copy scalars read
6365 from <>.
6366 However, perlbench says it's slower, because the existing swipe code
6367 is faster than copy on write.
6368 Swings and roundabouts. */
6fc92669 6369 (void)SvUPGRADE(sv, SVt_PV);
99491443 6370
ff68c719 6371 SvSCREAM_off(sv);
efd8b2ba
AE
6372
6373 if (append) {
6374 if (PerlIO_isutf8(fp)) {
6375 if (!SvUTF8(sv)) {
6376 sv_utf8_upgrade_nomg(sv);
6377 sv_pos_u2b(sv,&append,0);
6378 }
6379 } else if (SvUTF8(sv)) {
6380 SV *tsv = NEWSV(0,0);
6381 sv_gets(tsv, fp, 0);
6382 sv_utf8_upgrade_nomg(tsv);
6383 SvCUR_set(sv,append);
6384 sv_catsv(sv,tsv);
6385 sv_free(tsv);
6386 goto return_string_or_null;
6387 }
6388 }
6389
6390 SvPOK_only(sv);
6391 if (PerlIO_isutf8(fp))
6392 SvUTF8_on(sv);
c07a80fd 6393
8bfdd7d9
HS
6394 if (PL_curcop == &PL_compiling) {
6395 /* we always read code in line mode */
6396 rsptr = "\n";
6397 rslen = 1;
6398 }
6399 else if (RsSNARF(PL_rs)) {
e468d35b
NIS
6400 /* If it is a regular disk file use size from stat() as estimate
6401 of amount we are going to read - may result in malloc-ing
6402 more memory than we realy need if layers bellow reduce
6403 size we read (e.g. CRLF or a gzip layer)
6404 */
e311fd51 6405 Stat_t st;
e468d35b
NIS
6406 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
6407 Off_t offset = PerlIO_tell(fp);
58f1856e 6408 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
6409 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6410 }
6411 }
c07a80fd 6412 rsptr = NULL;
6413 rslen = 0;
6414 }
3280af22 6415 else if (RsRECORD(PL_rs)) {
e311fd51 6416 I32 bytesread;
5b2b9c68
HM
6417 char *buffer;
6418
6419 /* Grab the size of the record we're getting */
3280af22 6420 recsize = SvIV(SvRV(PL_rs));
e311fd51 6421 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
6422 /* Go yank in */
6423#ifdef VMS
6424 /* VMS wants read instead of fread, because fread doesn't respect */
6425 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
6426 /* doing, but we've got no other real choice - except avoid stdio
6427 as implementation - perhaps write a :vms layer ?
6428 */
5b2b9c68
HM
6429 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
6430#else
6431 bytesread = PerlIO_read(fp, buffer, recsize);
6432#endif
27e6ca2d
AE
6433 if (bytesread < 0)
6434 bytesread = 0;
e311fd51 6435 SvCUR_set(sv, bytesread += append);
e670df4e 6436 buffer[bytesread] = '\0';
efd8b2ba 6437 goto return_string_or_null;
5b2b9c68 6438 }
3280af22 6439 else if (RsPARA(PL_rs)) {
c07a80fd 6440 rsptr = "\n\n";
6441 rslen = 2;
8bfdd7d9 6442 rspara = 1;
c07a80fd 6443 }
7d59b7e4
NIS
6444 else {
6445 /* Get $/ i.e. PL_rs into same encoding as stream wants */
6446 if (PerlIO_isutf8(fp)) {
6447 rsptr = SvPVutf8(PL_rs, rslen);
6448 }
6449 else {
6450 if (SvUTF8(PL_rs)) {
6451 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
6452 Perl_croak(aTHX_ "Wide character in $/");
6453 }
6454 }
6455 rsptr = SvPV(PL_rs, rslen);
6456 }
6457 }
6458
c07a80fd 6459 rslast = rslen ? rsptr[rslen - 1] : '\0';
6460
8bfdd7d9 6461 if (rspara) { /* have to do this both before and after */
79072805 6462 do { /* to make sure file boundaries work right */
760ac839 6463 if (PerlIO_eof(fp))
a0d0e21e 6464 return 0;
760ac839 6465 i = PerlIO_getc(fp);
79072805 6466 if (i != '\n') {
a0d0e21e
LW
6467 if (i == -1)
6468 return 0;
760ac839 6469 PerlIO_ungetc(fp,i);
79072805
LW
6470 break;
6471 }
6472 } while (i != EOF);
6473 }
c07a80fd 6474
760ac839
LW
6475 /* See if we know enough about I/O mechanism to cheat it ! */
6476
6477 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 6478 of abstracting out stdio interface. One call should be cheap
760ac839
LW
6479 enough here - and may even be a macro allowing compile
6480 time optimization.
6481 */
6482
6483 if (PerlIO_fast_gets(fp)) {
6484
6485 /*
6486 * We're going to steal some values from the stdio struct
6487 * and put EVERYTHING in the innermost loop into registers.
6488 */
6489 register STDCHAR *ptr;
6490 STRLEN bpx;
6491 I32 shortbuffered;
6492
16660edb 6493#if defined(VMS) && defined(PERLIO_IS_STDIO)
6494 /* An ungetc()d char is handled separately from the regular
6495 * buffer, so we getc() it back out and stuff it in the buffer.
6496 */
6497 i = PerlIO_getc(fp);
6498 if (i == EOF) return 0;
6499 *(--((*fp)->_ptr)) = (unsigned char) i;
6500 (*fp)->_cnt++;
6501#endif
c07a80fd 6502
c2960299 6503 /* Here is some breathtakingly efficient cheating */
c07a80fd 6504
a20bf0c3 6505 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b
NIS
6506 /* make sure we have the room */
6507 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
6508 /* Not room for all of it
6509 if we are looking for a separator and room for some
6510 */
6511 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
6512 /* just process what we have room for */
79072805
LW
6513 shortbuffered = cnt - SvLEN(sv) + append + 1;
6514 cnt -= shortbuffered;
6515 }
6516 else {
6517 shortbuffered = 0;
bbce6d69 6518 /* remember that cnt can be negative */
eb160463 6519 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
6520 }
6521 }
e468d35b 6522 else
79072805 6523 shortbuffered = 0;
c07a80fd 6524 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
a20bf0c3 6525 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 6526 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6527 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 6528 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 6529 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6530 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6531 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
6532 for (;;) {
6533 screamer:
93a17b20 6534 if (cnt > 0) {
c07a80fd 6535 if (rslen) {
760ac839
LW
6536 while (cnt > 0) { /* this | eat */
6537 cnt--;
c07a80fd 6538 if ((*bp++ = *ptr++) == rslast) /* really | dust */
6539 goto thats_all_folks; /* screams | sed :-) */
6540 }
6541 }
6542 else {
1c846c1f
NIS
6543 Copy(ptr, bp, cnt, char); /* this | eat */
6544 bp += cnt; /* screams | dust */
c07a80fd 6545 ptr += cnt; /* louder | sed :-) */
a5f75d66 6546 cnt = 0;
93a17b20 6547 }
79072805
LW
6548 }
6549
748a9306 6550 if (shortbuffered) { /* oh well, must extend */
79072805
LW
6551 cnt = shortbuffered;
6552 shortbuffered = 0;
c07a80fd 6553 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
6554 SvCUR_set(sv, bpx);
6555 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 6556 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
6557 continue;
6558 }
6559
16660edb 6560 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
6561 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
6562 PTR2UV(ptr),(long)cnt));
cc00df79 6563 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 6564#if 0
16660edb 6565 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6566 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6567 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6568 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6569#endif
1c846c1f 6570 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 6571 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
6572 another abstraction. */
760ac839 6573 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 6574#if 0
16660edb 6575 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6576 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6577 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6578 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6579#endif
a20bf0c3
JH
6580 cnt = PerlIO_get_cnt(fp);
6581 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 6582 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6583 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 6584
748a9306
LW
6585 if (i == EOF) /* all done for ever? */
6586 goto thats_really_all_folks;
6587
c07a80fd 6588 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
6589 SvCUR_set(sv, bpx);
6590 SvGROW(sv, bpx + cnt + 2);
c07a80fd 6591 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
6592
eb160463 6593 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 6594
c07a80fd 6595 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 6596 goto thats_all_folks;
79072805
LW
6597 }
6598
6599thats_all_folks:
eb160463 6600 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX(sv)) < rslen) ||
36477c24 6601 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 6602 goto screamer; /* go back to the fray */
79072805
LW
6603thats_really_all_folks:
6604 if (shortbuffered)
6605 cnt += shortbuffered;
16660edb 6606 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6607 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 6608 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 6609 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6610 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6611 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6612 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 6613 *bp = '\0';
760ac839 6614 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 6615 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 6616 "Screamer: done, len=%ld, string=|%.*s|\n",
6617 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
6618 }
6619 else
79072805 6620 {
4d2c4e07 6621#ifndef EPOC
760ac839 6622 /*The big, slow, and stupid way */
c07a80fd 6623 STDCHAR buf[8192];
4d2c4e07
OF
6624#else
6625 /* Need to work around EPOC SDK features */
6626 /* On WINS: MS VC5 generates calls to _chkstk, */
6627 /* if a `large' stack frame is allocated */
6628 /* gcc on MARM does not generate calls like these */
6629 STDCHAR buf[1024];
6630#endif
79072805 6631
760ac839 6632screamer2:
c07a80fd 6633 if (rslen) {
760ac839
LW
6634 register STDCHAR *bpe = buf + sizeof(buf);
6635 bp = buf;
eb160463 6636 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
6637 ; /* keep reading */
6638 cnt = bp - buf;
c07a80fd 6639 }
6640 else {
760ac839 6641 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 6642 /* Accomodate broken VAXC compiler, which applies U8 cast to
6643 * both args of ?: operator, causing EOF to change into 255
6644 */
37be0adf 6645 if (cnt > 0)
cbe9e203
JH
6646 i = (U8)buf[cnt - 1];
6647 else
37be0adf 6648 i = EOF;
c07a80fd 6649 }
79072805 6650
cbe9e203
JH
6651 if (cnt < 0)
6652 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
6653 if (append)
6654 sv_catpvn(sv, (char *) buf, cnt);
6655 else
6656 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 6657
6658 if (i != EOF && /* joy */
6659 (!rslen ||
6660 SvCUR(sv) < rslen ||
36477c24 6661 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
6662 {
6663 append = -1;
63e4d877
CS
6664 /*
6665 * If we're reading from a TTY and we get a short read,
6666 * indicating that the user hit his EOF character, we need
6667 * to notice it now, because if we try to read from the TTY
6668 * again, the EOF condition will disappear.
6669 *
6670 * The comparison of cnt to sizeof(buf) is an optimization
6671 * that prevents unnecessary calls to feof().
6672 *
6673 * - jik 9/25/96
6674 */
6675 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
6676 goto screamer2;
79072805
LW
6677 }
6678 }
6679
8bfdd7d9 6680 if (rspara) { /* have to do this both before and after */
c07a80fd 6681 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 6682 i = PerlIO_getc(fp);
79072805 6683 if (i != '\n') {
760ac839 6684 PerlIO_ungetc(fp,i);
79072805
LW
6685 break;
6686 }
6687 }
6688 }
c07a80fd 6689
efd8b2ba 6690return_string_or_null:
c07a80fd 6691 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
6692}
6693
954c1994
GS
6694/*
6695=for apidoc sv_inc
6696
645c22ef
DM
6697Auto-increment of the value in the SV, doing string to numeric conversion
6698if necessary. Handles 'get' magic.
954c1994
GS
6699
6700=cut
6701*/
6702
79072805 6703void
864dbfa3 6704Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
6705{
6706 register char *d;
463ee0b2 6707 int flags;
79072805
LW
6708
6709 if (!sv)
6710 return;
b23a5f78
GB
6711 if (SvGMAGICAL(sv))
6712 mg_get(sv);
ed6116ce 6713 if (SvTHINKFIRST(sv)) {
765f542d
NC
6714 if (SvIsCOW(sv))
6715 sv_force_normal_flags(sv, 0);
0f15f207 6716 if (SvREADONLY(sv)) {
3280af22 6717 if (PL_curcop != &PL_compiling)
cea2e8a9 6718 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6719 }
a0d0e21e 6720 if (SvROK(sv)) {
b5be31e9 6721 IV i;
9e7bc3e8
JD
6722 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
6723 return;
56431972 6724 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6725 sv_unref(sv);
6726 sv_setiv(sv, i);
a0d0e21e 6727 }
ed6116ce 6728 }
8990e307 6729 flags = SvFLAGS(sv);
28e5dec8
JH
6730 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
6731 /* It's (privately or publicly) a float, but not tested as an
6732 integer, so test it to see. */
d460ef45 6733 (void) SvIV(sv);
28e5dec8
JH
6734 flags = SvFLAGS(sv);
6735 }
6736 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6737 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6738#ifdef PERL_PRESERVE_IVUV
28e5dec8 6739 oops_its_int:
59d8ce62 6740#endif
25da4f38
IZ
6741 if (SvIsUV(sv)) {
6742 if (SvUVX(sv) == UV_MAX)
a1e868e7 6743 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
6744 else
6745 (void)SvIOK_only_UV(sv);
6746 ++SvUVX(sv);
6747 } else {
6748 if (SvIVX(sv) == IV_MAX)
28e5dec8 6749 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
6750 else {
6751 (void)SvIOK_only(sv);
6752 ++SvIVX(sv);
1c846c1f 6753 }
55497cff 6754 }
79072805
LW
6755 return;
6756 }
28e5dec8
JH
6757 if (flags & SVp_NOK) {
6758 (void)SvNOK_only(sv);
6759 SvNVX(sv) += 1.0;
6760 return;
6761 }
6762
8990e307 6763 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
28e5dec8
JH
6764 if ((flags & SVTYPEMASK) < SVt_PVIV)
6765 sv_upgrade(sv, SVt_IV);
6766 (void)SvIOK_only(sv);
6767 SvIVX(sv) = 1;
79072805
LW
6768 return;
6769 }
463ee0b2 6770 d = SvPVX(sv);
79072805
LW
6771 while (isALPHA(*d)) d++;
6772 while (isDIGIT(*d)) d++;
6773 if (*d) {
28e5dec8 6774#ifdef PERL_PRESERVE_IVUV
d1be9408 6775 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
6776 warnings. Probably ought to make the sv_iv_please() that does
6777 the conversion if possible, and silently. */
c2988b20 6778 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
6779 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6780 /* Need to try really hard to see if it's an integer.
6781 9.22337203685478e+18 is an integer.
6782 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6783 so $a="9.22337203685478e+18"; $a+0; $a++
6784 needs to be the same as $a="9.22337203685478e+18"; $a++
6785 or we go insane. */
d460ef45 6786
28e5dec8
JH
6787 (void) sv_2iv(sv);
6788 if (SvIOK(sv))
6789 goto oops_its_int;
6790
6791 /* sv_2iv *should* have made this an NV */
6792 if (flags & SVp_NOK) {
6793 (void)SvNOK_only(sv);
6794 SvNVX(sv) += 1.0;
6795 return;
6796 }
6797 /* I don't think we can get here. Maybe I should assert this
6798 And if we do get here I suspect that sv_setnv will croak. NWC
6799 Fall through. */
6800#if defined(USE_LONG_DOUBLE)
6801 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",
6802 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6803#else
1779d84d 6804 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
6805 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6806#endif
6807 }
6808#endif /* PERL_PRESERVE_IVUV */
6809 sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
79072805
LW
6810 return;
6811 }
6812 d--;
463ee0b2 6813 while (d >= SvPVX(sv)) {
79072805
LW
6814 if (isDIGIT(*d)) {
6815 if (++*d <= '9')
6816 return;
6817 *(d--) = '0';
6818 }
6819 else {
9d116dd7
JH
6820#ifdef EBCDIC
6821 /* MKS: The original code here died if letters weren't consecutive.
6822 * at least it didn't have to worry about non-C locales. The
6823 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 6824 * arranged in order (although not consecutively) and that only
9d116dd7
JH
6825 * [A-Za-z] are accepted by isALPHA in the C locale.
6826 */
6827 if (*d != 'z' && *d != 'Z') {
6828 do { ++*d; } while (!isALPHA(*d));
6829 return;
6830 }
6831 *(d--) -= 'z' - 'a';
6832#else
79072805
LW
6833 ++*d;
6834 if (isALPHA(*d))
6835 return;
6836 *(d--) -= 'z' - 'a' + 1;
9d116dd7 6837#endif
79072805
LW
6838 }
6839 }
6840 /* oh,oh, the number grew */
6841 SvGROW(sv, SvCUR(sv) + 2);
6842 SvCUR(sv)++;
463ee0b2 6843 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
6844 *d = d[-1];
6845 if (isDIGIT(d[1]))
6846 *d = '1';
6847 else
6848 *d = d[1];
6849}
6850
954c1994
GS
6851/*
6852=for apidoc sv_dec
6853
645c22ef
DM
6854Auto-decrement of the value in the SV, doing string to numeric conversion
6855if necessary. Handles 'get' magic.
954c1994
GS
6856
6857=cut
6858*/
6859
79072805 6860void
864dbfa3 6861Perl_sv_dec(pTHX_ register SV *sv)
79072805 6862{
463ee0b2
LW
6863 int flags;
6864
79072805
LW
6865 if (!sv)
6866 return;
b23a5f78
GB
6867 if (SvGMAGICAL(sv))
6868 mg_get(sv);
ed6116ce 6869 if (SvTHINKFIRST(sv)) {
765f542d
NC
6870 if (SvIsCOW(sv))
6871 sv_force_normal_flags(sv, 0);
0f15f207 6872 if (SvREADONLY(sv)) {
3280af22 6873 if (PL_curcop != &PL_compiling)
cea2e8a9 6874 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6875 }
a0d0e21e 6876 if (SvROK(sv)) {
b5be31e9 6877 IV i;
9e7bc3e8
JD
6878 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6879 return;
56431972 6880 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6881 sv_unref(sv);
6882 sv_setiv(sv, i);
a0d0e21e 6883 }
ed6116ce 6884 }
28e5dec8
JH
6885 /* Unlike sv_inc we don't have to worry about string-never-numbers
6886 and keeping them magic. But we mustn't warn on punting */
8990e307 6887 flags = SvFLAGS(sv);
28e5dec8
JH
6888 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6889 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6890#ifdef PERL_PRESERVE_IVUV
28e5dec8 6891 oops_its_int:
59d8ce62 6892#endif
25da4f38
IZ
6893 if (SvIsUV(sv)) {
6894 if (SvUVX(sv) == 0) {
6895 (void)SvIOK_only(sv);
6896 SvIVX(sv) = -1;
6897 }
6898 else {
6899 (void)SvIOK_only_UV(sv);
6900 --SvUVX(sv);
1c846c1f 6901 }
25da4f38
IZ
6902 } else {
6903 if (SvIVX(sv) == IV_MIN)
65202027 6904 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
6905 else {
6906 (void)SvIOK_only(sv);
6907 --SvIVX(sv);
1c846c1f 6908 }
55497cff 6909 }
6910 return;
6911 }
28e5dec8
JH
6912 if (flags & SVp_NOK) {
6913 SvNVX(sv) -= 1.0;
6914 (void)SvNOK_only(sv);
6915 return;
6916 }
8990e307 6917 if (!(flags & SVp_POK)) {
4633a7c4
LW
6918 if ((flags & SVTYPEMASK) < SVt_PVNV)
6919 sv_upgrade(sv, SVt_NV);
463ee0b2 6920 SvNVX(sv) = -1.0;
a0d0e21e 6921 (void)SvNOK_only(sv);
79072805
LW
6922 return;
6923 }
28e5dec8
JH
6924#ifdef PERL_PRESERVE_IVUV
6925 {
c2988b20 6926 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
6927 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6928 /* Need to try really hard to see if it's an integer.
6929 9.22337203685478e+18 is an integer.
6930 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6931 so $a="9.22337203685478e+18"; $a+0; $a--
6932 needs to be the same as $a="9.22337203685478e+18"; $a--
6933 or we go insane. */
d460ef45 6934
28e5dec8
JH
6935 (void) sv_2iv(sv);
6936 if (SvIOK(sv))
6937 goto oops_its_int;
6938
6939 /* sv_2iv *should* have made this an NV */
6940 if (flags & SVp_NOK) {
6941 (void)SvNOK_only(sv);
6942 SvNVX(sv) -= 1.0;
6943 return;
6944 }
6945 /* I don't think we can get here. Maybe I should assert this
6946 And if we do get here I suspect that sv_setnv will croak. NWC
6947 Fall through. */
6948#if defined(USE_LONG_DOUBLE)
6949 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",
6950 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6951#else
1779d84d 6952 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
6953 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6954#endif
6955 }
6956 }
6957#endif /* PERL_PRESERVE_IVUV */
097ee67d 6958 sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
6959}
6960
954c1994
GS
6961/*
6962=for apidoc sv_mortalcopy
6963
645c22ef 6964Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
6965The new SV is marked as mortal. It will be destroyed "soon", either by an
6966explicit call to FREETMPS, or by an implicit call at places such as
6967statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
6968
6969=cut
6970*/
6971
79072805
LW
6972/* Make a string that will exist for the duration of the expression
6973 * evaluation. Actually, it may have to last longer than that, but
6974 * hopefully we won't free it until it has been assigned to a
6975 * permanent location. */
6976
6977SV *
864dbfa3 6978Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 6979{
463ee0b2 6980 register SV *sv;
b881518d 6981
4561caa4 6982 new_SV(sv);
79072805 6983 sv_setsv(sv,oldstr);
677b06e3
GS
6984 EXTEND_MORTAL(1);
6985 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
6986 SvTEMP_on(sv);
6987 return sv;
6988}
6989
954c1994
GS
6990/*
6991=for apidoc sv_newmortal
6992
645c22ef 6993Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
6994set to 1. It will be destroyed "soon", either by an explicit call to
6995FREETMPS, or by an implicit call at places such as statement boundaries.
6996See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
6997
6998=cut
6999*/
7000
8990e307 7001SV *
864dbfa3 7002Perl_sv_newmortal(pTHX)
8990e307
LW
7003{
7004 register SV *sv;
7005
4561caa4 7006 new_SV(sv);
8990e307 7007 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
7008 EXTEND_MORTAL(1);
7009 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
7010 return sv;
7011}
7012
954c1994
GS
7013/*
7014=for apidoc sv_2mortal
7015
d4236ebc
DM
7016Marks an existing SV as mortal. The SV will be destroyed "soon", either
7017by an explicit call to FREETMPS, or by an implicit call at places such as
7018statement boundaries. See also C<sv_newmortal> and C<sv_mortalcopy>.
954c1994
GS
7019
7020=cut
7021*/
7022
79072805 7023SV *
864dbfa3 7024Perl_sv_2mortal(pTHX_ register SV *sv)
79072805
LW
7025{
7026 if (!sv)
7027 return sv;
d689ffdd 7028 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 7029 return sv;
677b06e3
GS
7030 EXTEND_MORTAL(1);
7031 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 7032 SvTEMP_on(sv);
79072805
LW
7033 return sv;
7034}
7035
954c1994
GS
7036/*
7037=for apidoc newSVpv
7038
7039Creates a new SV and copies a string into it. The reference count for the
7040SV is set to 1. If C<len> is zero, Perl will compute the length using
7041strlen(). For efficiency, consider using C<newSVpvn> instead.
7042
7043=cut
7044*/
7045
79072805 7046SV *
864dbfa3 7047Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 7048{
463ee0b2 7049 register SV *sv;
79072805 7050
4561caa4 7051 new_SV(sv);
79072805
LW
7052 if (!len)
7053 len = strlen(s);
7054 sv_setpvn(sv,s,len);
7055 return sv;
7056}
7057
954c1994
GS
7058/*
7059=for apidoc newSVpvn
7060
7061Creates a new SV and copies a string into it. The reference count for the
1c846c1f 7062SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994
GS
7063string. You are responsible for ensuring that the source string is at least
7064C<len> bytes long.
7065
7066=cut
7067*/
7068
9da1e3b5 7069SV *
864dbfa3 7070Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
7071{
7072 register SV *sv;
7073
7074 new_SV(sv);
9da1e3b5
MUN
7075 sv_setpvn(sv,s,len);
7076 return sv;
7077}
7078
1c846c1f
NIS
7079/*
7080=for apidoc newSVpvn_share
7081
645c22ef
DM
7082Creates a new SV with its SvPVX pointing to a shared string in the string
7083table. If the string does not already exist in the table, it is created
7084first. Turns on READONLY and FAKE. The string's hash is stored in the UV
7085slot of the SV; if the C<hash> parameter is non-zero, that value is used;
7086otherwise the hash is computed. The idea here is that as the string table
7087is used for shared hash keys these strings will have SvPVX == HeKEY and
7088hash lookup will avoid string compare.
1c846c1f
NIS
7089
7090=cut
7091*/
7092
7093SV *
c3654f1a 7094Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
7095{
7096 register SV *sv;
c3654f1a
IH
7097 bool is_utf8 = FALSE;
7098 if (len < 0) {
77caf834 7099 STRLEN tmplen = -len;
c3654f1a 7100 is_utf8 = TRUE;
75a54232
JH
7101 /* See the note in hv.c:hv_fetch() --jhi */
7102 src = (char*)bytes_from_utf8((U8*)src, &tmplen, &is_utf8);
7103 len = tmplen;
7104 }
1c846c1f 7105 if (!hash)
5afd6d42 7106 PERL_HASH(hash, src, len);
1c846c1f
NIS
7107 new_SV(sv);
7108 sv_upgrade(sv, SVt_PVIV);
c3654f1a 7109 SvPVX(sv) = sharepvn(src, is_utf8?-len:len, hash);
1c846c1f
NIS
7110 SvCUR(sv) = len;
7111 SvUVX(sv) = hash;
7112 SvLEN(sv) = 0;
7113 SvREADONLY_on(sv);
7114 SvFAKE_on(sv);
7115 SvPOK_on(sv);
c3654f1a
IH
7116 if (is_utf8)
7117 SvUTF8_on(sv);
1c846c1f
NIS
7118 return sv;
7119}
7120
645c22ef 7121
cea2e8a9 7122#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7123
7124/* pTHX_ magic can't cope with varargs, so this is a no-context
7125 * version of the main function, (which may itself be aliased to us).
7126 * Don't access this version directly.
7127 */
7128
46fc3d4c 7129SV *
cea2e8a9 7130Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 7131{
cea2e8a9 7132 dTHX;
46fc3d4c 7133 register SV *sv;
7134 va_list args;
46fc3d4c 7135 va_start(args, pat);
c5be433b 7136 sv = vnewSVpvf(pat, &args);
46fc3d4c 7137 va_end(args);
7138 return sv;
7139}
cea2e8a9 7140#endif
46fc3d4c 7141
954c1994
GS
7142/*
7143=for apidoc newSVpvf
7144
645c22ef 7145Creates a new SV and initializes it with the string formatted like
954c1994
GS
7146C<sprintf>.
7147
7148=cut
7149*/
7150
cea2e8a9
GS
7151SV *
7152Perl_newSVpvf(pTHX_ const char* pat, ...)
7153{
7154 register SV *sv;
7155 va_list args;
cea2e8a9 7156 va_start(args, pat);
c5be433b 7157 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
7158 va_end(args);
7159 return sv;
7160}
46fc3d4c 7161
645c22ef
DM
7162/* backend for newSVpvf() and newSVpvf_nocontext() */
7163
79072805 7164SV *
c5be433b
GS
7165Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
7166{
7167 register SV *sv;
7168 new_SV(sv);
7169 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7170 return sv;
7171}
7172
954c1994
GS
7173/*
7174=for apidoc newSVnv
7175
7176Creates a new SV and copies a floating point value into it.
7177The reference count for the SV is set to 1.
7178
7179=cut
7180*/
7181
c5be433b 7182SV *
65202027 7183Perl_newSVnv(pTHX_ NV n)
79072805 7184{
463ee0b2 7185 register SV *sv;
79072805 7186
4561caa4 7187 new_SV(sv);
79072805
LW
7188 sv_setnv(sv,n);
7189 return sv;
7190}
7191
954c1994
GS
7192/*
7193=for apidoc newSViv
7194
7195Creates a new SV and copies an integer into it. The reference count for the
7196SV is set to 1.
7197
7198=cut
7199*/
7200
79072805 7201SV *
864dbfa3 7202Perl_newSViv(pTHX_ IV i)
79072805 7203{
463ee0b2 7204 register SV *sv;
79072805 7205
4561caa4 7206 new_SV(sv);
79072805
LW
7207 sv_setiv(sv,i);
7208 return sv;
7209}
7210
954c1994 7211/*
1a3327fb
JH
7212=for apidoc newSVuv
7213
7214Creates a new SV and copies an unsigned integer into it.
7215The reference count for the SV is set to 1.
7216
7217=cut
7218*/
7219
7220SV *
7221Perl_newSVuv(pTHX_ UV u)
7222{
7223 register SV *sv;
7224
7225 new_SV(sv);
7226 sv_setuv(sv,u);
7227 return sv;
7228}
7229
7230/*
954c1994
GS
7231=for apidoc newRV_noinc
7232
7233Creates an RV wrapper for an SV. The reference count for the original
7234SV is B<not> incremented.
7235
7236=cut
7237*/
7238
2304df62 7239SV *
864dbfa3 7240Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
7241{
7242 register SV *sv;
7243
4561caa4 7244 new_SV(sv);
2304df62 7245 sv_upgrade(sv, SVt_RV);
76e3520e 7246 SvTEMP_off(tmpRef);
d689ffdd 7247 SvRV(sv) = tmpRef;
2304df62 7248 SvROK_on(sv);
2304df62
AD
7249 return sv;
7250}
7251
ff276b08 7252/* newRV_inc is the official function name to use now.
645c22ef
DM
7253 * newRV_inc is in fact #defined to newRV in sv.h
7254 */
7255
5f05dabc 7256SV *
864dbfa3 7257Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 7258{
5f6447b6 7259 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 7260}
5f05dabc 7261
954c1994
GS
7262/*
7263=for apidoc newSVsv
7264
7265Creates a new SV which is an exact duplicate of the original SV.
645c22ef 7266(Uses C<sv_setsv>).
954c1994
GS
7267
7268=cut
7269*/
7270
79072805 7271SV *
864dbfa3 7272Perl_newSVsv(pTHX_ register SV *old)
79072805 7273{
463ee0b2 7274 register SV *sv;
79072805
LW
7275
7276 if (!old)
7277 return Nullsv;
8990e307 7278 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 7279 if (ckWARN_d(WARN_INTERNAL))
9014280d 7280 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
79072805
LW
7281 return Nullsv;
7282 }
4561caa4 7283 new_SV(sv);
ff68c719 7284 if (SvTEMP(old)) {
7285 SvTEMP_off(old);
463ee0b2 7286 sv_setsv(sv,old);
ff68c719 7287 SvTEMP_on(old);
79072805
LW
7288 }
7289 else
463ee0b2
LW
7290 sv_setsv(sv,old);
7291 return sv;
79072805
LW
7292}
7293
645c22ef
DM
7294/*
7295=for apidoc sv_reset
7296
7297Underlying implementation for the C<reset> Perl function.
7298Note that the perl-level function is vaguely deprecated.
7299
7300=cut
7301*/
7302
79072805 7303void
864dbfa3 7304Perl_sv_reset(pTHX_ register char *s, HV *stash)
79072805
LW
7305{
7306 register HE *entry;
7307 register GV *gv;
7308 register SV *sv;
7309 register I32 i;
7310 register PMOP *pm;
7311 register I32 max;
4802d5d7 7312 char todo[PERL_UCHAR_MAX+1];
79072805 7313
49d8d3a1
MB
7314 if (!stash)
7315 return;
7316
79072805
LW
7317 if (!*s) { /* reset ?? searches */
7318 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
48c036b1 7319 pm->op_pmdynflags &= ~PMdf_USED;
79072805
LW
7320 }
7321 return;
7322 }
7323
7324 /* reset variables */
7325
7326 if (!HvARRAY(stash))
7327 return;
463ee0b2
LW
7328
7329 Zero(todo, 256, char);
79072805 7330 while (*s) {
4802d5d7 7331 i = (unsigned char)*s;
79072805
LW
7332 if (s[1] == '-') {
7333 s += 2;
7334 }
4802d5d7 7335 max = (unsigned char)*s++;
79072805 7336 for ( ; i <= max; i++) {
463ee0b2
LW
7337 todo[i] = 1;
7338 }
a0d0e21e 7339 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 7340 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7341 entry;
7342 entry = HeNEXT(entry))
7343 {
1edc1566 7344 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7345 continue;
1edc1566 7346 gv = (GV*)HeVAL(entry);
79072805 7347 sv = GvSV(gv);
9e35f4b3
GS
7348 if (SvTHINKFIRST(sv)) {
7349 if (!SvREADONLY(sv) && SvROK(sv))
7350 sv_unref(sv);
7351 continue;
7352 }
a0d0e21e 7353 (void)SvOK_off(sv);
79072805
LW
7354 if (SvTYPE(sv) >= SVt_PV) {
7355 SvCUR_set(sv, 0);
463ee0b2
LW
7356 if (SvPVX(sv) != Nullch)
7357 *SvPVX(sv) = '\0';
44a8e56a 7358 SvTAINT(sv);
79072805
LW
7359 }
7360 if (GvAV(gv)) {
7361 av_clear(GvAV(gv));
7362 }
44a8e56a 7363 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
463ee0b2 7364 hv_clear(GvHV(gv));
fa6a1c44 7365#ifdef USE_ENVIRON_ARRAY
4efc5df6
GS
7366 if (gv == PL_envgv
7367# ifdef USE_ITHREADS
7368 && PL_curinterp == aTHX
7369# endif
7370 )
7371 {
79072805 7372 environ[0] = Nullch;
4efc5df6 7373 }
a0d0e21e 7374#endif
79072805
LW
7375 }
7376 }
7377 }
7378 }
7379}
7380
645c22ef
DM
7381/*
7382=for apidoc sv_2io
7383
7384Using various gambits, try to get an IO from an SV: the IO slot if its a
7385GV; or the recursive result if we're an RV; or the IO slot of the symbol
7386named after the PV if we're a string.
7387
7388=cut
7389*/
7390
46fc3d4c 7391IO*
864dbfa3 7392Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 7393{
7394 IO* io;
7395 GV* gv;
2d8e6c8d 7396 STRLEN n_a;
46fc3d4c 7397
7398 switch (SvTYPE(sv)) {
7399 case SVt_PVIO:
7400 io = (IO*)sv;
7401 break;
7402 case SVt_PVGV:
7403 gv = (GV*)sv;
7404 io = GvIO(gv);
7405 if (!io)
cea2e8a9 7406 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 7407 break;
7408 default:
7409 if (!SvOK(sv))
cea2e8a9 7410 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 7411 if (SvROK(sv))
7412 return sv_2io(SvRV(sv));
2d8e6c8d 7413 gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
46fc3d4c 7414 if (gv)
7415 io = GvIO(gv);
7416 else
7417 io = 0;
7418 if (!io)
35c1215d 7419 Perl_croak(aTHX_ "Bad filehandle: %"SVf, sv);
46fc3d4c 7420 break;
7421 }
7422 return io;
7423}
7424
645c22ef
DM
7425/*
7426=for apidoc sv_2cv
7427
7428Using various gambits, try to get a CV from an SV; in addition, try if
7429possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
7430
7431=cut
7432*/
7433
79072805 7434CV *
864dbfa3 7435Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 7436{
c04a4dfe
JH
7437 GV *gv = Nullgv;
7438 CV *cv = Nullcv;
2d8e6c8d 7439 STRLEN n_a;
79072805
LW
7440
7441 if (!sv)
93a17b20 7442 return *gvp = Nullgv, Nullcv;
79072805 7443 switch (SvTYPE(sv)) {
79072805
LW
7444 case SVt_PVCV:
7445 *st = CvSTASH(sv);
7446 *gvp = Nullgv;
7447 return (CV*)sv;
7448 case SVt_PVHV:
7449 case SVt_PVAV:
7450 *gvp = Nullgv;
7451 return Nullcv;
8990e307
LW
7452 case SVt_PVGV:
7453 gv = (GV*)sv;
a0d0e21e 7454 *gvp = gv;
8990e307
LW
7455 *st = GvESTASH(gv);
7456 goto fix_gv;
7457
79072805 7458 default:
a0d0e21e
LW
7459 if (SvGMAGICAL(sv))
7460 mg_get(sv);
7461 if (SvROK(sv)) {
f5284f61
IZ
7462 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
7463 tryAMAGICunDEREF(to_cv);
7464
62f274bf
GS
7465 sv = SvRV(sv);
7466 if (SvTYPE(sv) == SVt_PVCV) {
7467 cv = (CV*)sv;
7468 *gvp = Nullgv;
7469 *st = CvSTASH(cv);
7470 return cv;
7471 }
7472 else if(isGV(sv))
7473 gv = (GV*)sv;
7474 else
cea2e8a9 7475 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 7476 }
62f274bf 7477 else if (isGV(sv))
79072805
LW
7478 gv = (GV*)sv;
7479 else
2d8e6c8d 7480 gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
79072805
LW
7481 *gvp = gv;
7482 if (!gv)
7483 return Nullcv;
7484 *st = GvESTASH(gv);
8990e307 7485 fix_gv:
8ebc5c01 7486 if (lref && !GvCVu(gv)) {
4633a7c4 7487 SV *tmpsv;
748a9306 7488 ENTER;
4633a7c4 7489 tmpsv = NEWSV(704,0);
16660edb 7490 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
7491 /* XXX this is probably not what they think they're getting.
7492 * It has the same effect as "sub name;", i.e. just a forward
7493 * declaration! */
774d564b 7494 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
7495 newSVOP(OP_CONST, 0, tmpsv),
7496 Nullop,
8990e307 7497 Nullop);
748a9306 7498 LEAVE;
8ebc5c01 7499 if (!GvCVu(gv))
35c1215d
NC
7500 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
7501 sv);
8990e307 7502 }
8ebc5c01 7503 return GvCVu(gv);
79072805
LW
7504 }
7505}
7506
c461cf8f
JH
7507/*
7508=for apidoc sv_true
7509
7510Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
7511Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
7512instead use an in-line version.
c461cf8f
JH
7513
7514=cut
7515*/
7516
79072805 7517I32
864dbfa3 7518Perl_sv_true(pTHX_ register SV *sv)
79072805 7519{
8990e307
LW
7520 if (!sv)
7521 return 0;
79072805 7522 if (SvPOK(sv)) {
4e35701f
NIS
7523 register XPV* tXpv;
7524 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 7525 (tXpv->xpv_cur > 1 ||
4e35701f 7526 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
79072805
LW
7527 return 1;
7528 else
7529 return 0;
7530 }
7531 else {
7532 if (SvIOK(sv))
463ee0b2 7533 return SvIVX(sv) != 0;
79072805
LW
7534 else {
7535 if (SvNOK(sv))
463ee0b2 7536 return SvNVX(sv) != 0.0;
79072805 7537 else
463ee0b2 7538 return sv_2bool(sv);
79072805
LW
7539 }
7540 }
7541}
79072805 7542
645c22ef
DM
7543/*
7544=for apidoc sv_iv
7545
7546A private implementation of the C<SvIVx> macro for compilers which can't
7547cope with complex macro expressions. Always use the macro instead.
7548
7549=cut
7550*/
7551
ff68c719 7552IV
864dbfa3 7553Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 7554{
25da4f38
IZ
7555 if (SvIOK(sv)) {
7556 if (SvIsUV(sv))
7557 return (IV)SvUVX(sv);
ff68c719 7558 return SvIVX(sv);
25da4f38 7559 }
ff68c719 7560 return sv_2iv(sv);
85e6fe83 7561}
85e6fe83 7562
645c22ef
DM
7563/*
7564=for apidoc sv_uv
7565
7566A private implementation of the C<SvUVx> macro for compilers which can't
7567cope with complex macro expressions. Always use the macro instead.
7568
7569=cut
7570*/
7571
ff68c719 7572UV
864dbfa3 7573Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 7574{
25da4f38
IZ
7575 if (SvIOK(sv)) {
7576 if (SvIsUV(sv))
7577 return SvUVX(sv);
7578 return (UV)SvIVX(sv);
7579 }
ff68c719 7580 return sv_2uv(sv);
7581}
85e6fe83 7582
645c22ef
DM
7583/*
7584=for apidoc sv_nv
7585
7586A private implementation of the C<SvNVx> macro for compilers which can't
7587cope with complex macro expressions. Always use the macro instead.
7588
7589=cut
7590*/
7591
65202027 7592NV
864dbfa3 7593Perl_sv_nv(pTHX_ register SV *sv)
79072805 7594{
ff68c719 7595 if (SvNOK(sv))
7596 return SvNVX(sv);
7597 return sv_2nv(sv);
79072805 7598}
79072805 7599
09540bc3
JH
7600/* sv_pv() is now a macro using SvPV_nolen();
7601 * this function provided for binary compatibility only
7602 */
7603
7604char *
7605Perl_sv_pv(pTHX_ SV *sv)
7606{
7607 STRLEN n_a;
7608
7609 if (SvPOK(sv))
7610 return SvPVX(sv);
7611
7612 return sv_2pv(sv, &n_a);
7613}
7614
645c22ef
DM
7615/*
7616=for apidoc sv_pv
7617
baca2b92 7618Use the C<SvPV_nolen> macro instead
645c22ef 7619
645c22ef
DM
7620=for apidoc sv_pvn
7621
7622A private implementation of the C<SvPV> macro for compilers which can't
7623cope with complex macro expressions. Always use the macro instead.
7624
7625=cut
7626*/
7627
1fa8b10d 7628char *
864dbfa3 7629Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 7630{
85e6fe83
LW
7631 if (SvPOK(sv)) {
7632 *lp = SvCUR(sv);
a0d0e21e 7633 return SvPVX(sv);
85e6fe83 7634 }
463ee0b2 7635 return sv_2pv(sv, lp);
79072805 7636}
79072805 7637
6e9d1081
NC
7638
7639char *
7640Perl_sv_pvn_nomg(pTHX_ register SV *sv, STRLEN *lp)
7641{
7642 if (SvPOK(sv)) {
7643 *lp = SvCUR(sv);
7644 return SvPVX(sv);
7645 }
7646 return sv_2pv_flags(sv, lp, 0);
7647}
7648
09540bc3
JH
7649/* sv_pvn_force() is now a macro using Perl_sv_pvn_force_flags();
7650 * this function provided for binary compatibility only
7651 */
7652
7653char *
7654Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
7655{
7656 return sv_pvn_force_flags(sv, lp, SV_GMAGIC);
7657}
7658
c461cf8f
JH
7659/*
7660=for apidoc sv_pvn_force
7661
7662Get a sensible string out of the SV somehow.
645c22ef
DM
7663A private implementation of the C<SvPV_force> macro for compilers which
7664can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 7665
8d6d96c1
HS
7666=for apidoc sv_pvn_force_flags
7667
7668Get a sensible string out of the SV somehow.
7669If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
7670appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
7671implemented in terms of this function.
645c22ef
DM
7672You normally want to use the various wrapper macros instead: see
7673C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
7674
7675=cut
7676*/
7677
7678char *
7679Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
7680{
c04a4dfe 7681 char *s = NULL;
a0d0e21e 7682
6fc92669 7683 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 7684 sv_force_normal_flags(sv, 0);
1c846c1f 7685
a0d0e21e
LW
7686 if (SvPOK(sv)) {
7687 *lp = SvCUR(sv);
7688 }
7689 else {
748a9306 7690 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 7691 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 7692 OP_NAME(PL_op));
a0d0e21e 7693 }
4633a7c4 7694 else
8d6d96c1 7695 s = sv_2pv_flags(sv, lp, flags);
a0d0e21e
LW
7696 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
7697 STRLEN len = *lp;
1c846c1f 7698
a0d0e21e
LW
7699 if (SvROK(sv))
7700 sv_unref(sv);
7701 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
7702 SvGROW(sv, len + 1);
7703 Move(s,SvPVX(sv),len,char);
7704 SvCUR_set(sv, len);
7705 *SvEND(sv) = '\0';
7706 }
7707 if (!SvPOK(sv)) {
7708 SvPOK_on(sv); /* validate pointer */
7709 SvTAINT(sv);
1d7c1841
GS
7710 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
7711 PTR2UV(sv),SvPVX(sv)));
a0d0e21e
LW
7712 }
7713 }
7714 return SvPVX(sv);
7715}
7716
09540bc3
JH
7717/* sv_pvbyte () is now a macro using Perl_sv_2pv_flags();
7718 * this function provided for binary compatibility only
7719 */
7720
7721char *
7722Perl_sv_pvbyte(pTHX_ SV *sv)
7723{
7724 sv_utf8_downgrade(sv,0);
7725 return sv_pv(sv);
7726}
7727
645c22ef
DM
7728/*
7729=for apidoc sv_pvbyte
7730
baca2b92 7731Use C<SvPVbyte_nolen> instead.
645c22ef 7732
645c22ef
DM
7733=for apidoc sv_pvbyten
7734
7735A private implementation of the C<SvPVbyte> macro for compilers
7736which can't cope with complex macro expressions. Always use the macro
7737instead.
7738
7739=cut
7740*/
7741
7340a771
GS
7742char *
7743Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
7744{
ffebcc3e 7745 sv_utf8_downgrade(sv,0);
7340a771
GS
7746 return sv_pvn(sv,lp);
7747}
7748
645c22ef
DM
7749/*
7750=for apidoc sv_pvbyten_force
7751
7752A private implementation of the C<SvPVbytex_force> macro for compilers
7753which can't cope with complex macro expressions. Always use the macro
7754instead.
7755
7756=cut
7757*/
7758
7340a771
GS
7759char *
7760Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
7761{
ffebcc3e 7762 sv_utf8_downgrade(sv,0);
7340a771
GS
7763 return sv_pvn_force(sv,lp);
7764}
7765
09540bc3
JH
7766/* sv_pvutf8 () is now a macro using Perl_sv_2pv_flags();
7767 * this function provided for binary compatibility only
7768 */
7769
7770char *
7771Perl_sv_pvutf8(pTHX_ SV *sv)
7772{
7773 sv_utf8_upgrade(sv);
7774 return sv_pv(sv);
7775}
7776
645c22ef
DM
7777/*
7778=for apidoc sv_pvutf8
7779
baca2b92 7780Use the C<SvPVutf8_nolen> macro instead
645c22ef 7781
645c22ef
DM
7782=for apidoc sv_pvutf8n
7783
7784A private implementation of the C<SvPVutf8> macro for compilers
7785which can't cope with complex macro expressions. Always use the macro
7786instead.
7787
7788=cut
7789*/
7790
7340a771
GS
7791char *
7792Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
7793{
560a288e 7794 sv_utf8_upgrade(sv);
7340a771
GS
7795 return sv_pvn(sv,lp);
7796}
7797
c461cf8f
JH
7798/*
7799=for apidoc sv_pvutf8n_force
7800
645c22ef
DM
7801A private implementation of the C<SvPVutf8_force> macro for compilers
7802which can't cope with complex macro expressions. Always use the macro
7803instead.
c461cf8f
JH
7804
7805=cut
7806*/
7807
7340a771
GS
7808char *
7809Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
7810{
560a288e 7811 sv_utf8_upgrade(sv);
7340a771
GS
7812 return sv_pvn_force(sv,lp);
7813}
7814
c461cf8f
JH
7815/*
7816=for apidoc sv_reftype
7817
7818Returns a string describing what the SV is a reference to.
7819
7820=cut
7821*/
7822
7340a771 7823char *
864dbfa3 7824Perl_sv_reftype(pTHX_ SV *sv, int ob)
a0d0e21e 7825{
c86bf373 7826 if (ob && SvOBJECT(sv)) {
e27ad1f2
AV
7827 if (HvNAME(SvSTASH(sv)))
7828 return HvNAME(SvSTASH(sv));
7829 else
7830 return "__ANON__";
c86bf373 7831 }
a0d0e21e
LW
7832 else {
7833 switch (SvTYPE(sv)) {
7834 case SVt_NULL:
7835 case SVt_IV:
7836 case SVt_NV:
7837 case SVt_RV:
7838 case SVt_PV:
7839 case SVt_PVIV:
7840 case SVt_PVNV:
7841 case SVt_PVMG:
7842 case SVt_PVBM:
439cb1c4
JP
7843 if (SvVOK(sv))
7844 return "VSTRING";
a0d0e21e
LW
7845 if (SvROK(sv))
7846 return "REF";
7847 else
7848 return "SCALAR";
dd28f7bb 7849 case SVt_PVLV: return SvROK(sv) ? "REF" : "LVALUE";
a0d0e21e
LW
7850 case SVt_PVAV: return "ARRAY";
7851 case SVt_PVHV: return "HASH";
7852 case SVt_PVCV: return "CODE";
7853 case SVt_PVGV: return "GLOB";
1d2dff63 7854 case SVt_PVFM: return "FORMAT";
27f9d8f3 7855 case SVt_PVIO: return "IO";
a0d0e21e
LW
7856 default: return "UNKNOWN";
7857 }
7858 }
7859}
7860
954c1994
GS
7861/*
7862=for apidoc sv_isobject
7863
7864Returns a boolean indicating whether the SV is an RV pointing to a blessed
7865object. If the SV is not an RV, or if the object is not blessed, then this
7866will return false.
7867
7868=cut
7869*/
7870
463ee0b2 7871int
864dbfa3 7872Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 7873{
68dc0745 7874 if (!sv)
7875 return 0;
7876 if (SvGMAGICAL(sv))
7877 mg_get(sv);
85e6fe83
LW
7878 if (!SvROK(sv))
7879 return 0;
7880 sv = (SV*)SvRV(sv);
7881 if (!SvOBJECT(sv))
7882 return 0;
7883 return 1;
7884}
7885
954c1994
GS
7886/*
7887=for apidoc sv_isa
7888
7889Returns a boolean indicating whether the SV is blessed into the specified
7890class. This does not check for subtypes; use C<sv_derived_from> to verify
7891an inheritance relationship.
7892
7893=cut
7894*/
7895
85e6fe83 7896int
864dbfa3 7897Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 7898{
68dc0745 7899 if (!sv)
7900 return 0;
7901 if (SvGMAGICAL(sv))
7902 mg_get(sv);
ed6116ce 7903 if (!SvROK(sv))
463ee0b2 7904 return 0;
ed6116ce
LW
7905 sv = (SV*)SvRV(sv);
7906 if (!SvOBJECT(sv))
463ee0b2 7907 return 0;
e27ad1f2
AV
7908 if (!HvNAME(SvSTASH(sv)))
7909 return 0;
463ee0b2
LW
7910
7911 return strEQ(HvNAME(SvSTASH(sv)), name);
7912}
7913
954c1994
GS
7914/*
7915=for apidoc newSVrv
7916
7917Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
7918it will be upgraded to one. If C<classname> is non-null then the new SV will
7919be blessed in the specified package. The new SV is returned and its
7920reference count is 1.
7921
7922=cut
7923*/
7924
463ee0b2 7925SV*
864dbfa3 7926Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 7927{
463ee0b2
LW
7928 SV *sv;
7929
4561caa4 7930 new_SV(sv);
51cf62d8 7931
765f542d 7932 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 7933 SvAMAGIC_off(rv);
51cf62d8 7934
0199fce9
JD
7935 if (SvTYPE(rv) >= SVt_PVMG) {
7936 U32 refcnt = SvREFCNT(rv);
7937 SvREFCNT(rv) = 0;
7938 sv_clear(rv);
7939 SvFLAGS(rv) = 0;
7940 SvREFCNT(rv) = refcnt;
7941 }
7942
51cf62d8 7943 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
7944 sv_upgrade(rv, SVt_RV);
7945 else if (SvTYPE(rv) > SVt_RV) {
7946 (void)SvOOK_off(rv);
7947 if (SvPVX(rv) && SvLEN(rv))
7948 Safefree(SvPVX(rv));
7949 SvCUR_set(rv, 0);
7950 SvLEN_set(rv, 0);
7951 }
51cf62d8
OT
7952
7953 (void)SvOK_off(rv);
053fc874 7954 SvRV(rv) = sv;
ed6116ce 7955 SvROK_on(rv);
463ee0b2 7956
a0d0e21e
LW
7957 if (classname) {
7958 HV* stash = gv_stashpv(classname, TRUE);
7959 (void)sv_bless(rv, stash);
7960 }
7961 return sv;
7962}
7963
954c1994
GS
7964/*
7965=for apidoc sv_setref_pv
7966
7967Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
7968argument will be upgraded to an RV. That RV will be modified to point to
7969the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7970into the SV. The C<classname> argument indicates the package for the
7971blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7972will be returned and will have a reference count of 1.
7973
7974Do not use with other Perl types such as HV, AV, SV, CV, because those
7975objects will become corrupted by the pointer copy process.
7976
7977Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7978
7979=cut
7980*/
7981
a0d0e21e 7982SV*
864dbfa3 7983Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 7984{
189b2af5 7985 if (!pv) {
3280af22 7986 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
7987 SvSETMAGIC(rv);
7988 }
a0d0e21e 7989 else
56431972 7990 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
7991 return rv;
7992}
7993
954c1994
GS
7994/*
7995=for apidoc sv_setref_iv
7996
7997Copies an integer into a new SV, optionally blessing the SV. The C<rv>
7998argument will be upgraded to an RV. That RV will be modified to point to
7999the new SV. The C<classname> argument indicates the package for the
8000blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
8001will be returned and will have a reference count of 1.
8002
8003=cut
8004*/
8005
a0d0e21e 8006SV*
864dbfa3 8007Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
8008{
8009 sv_setiv(newSVrv(rv,classname), iv);
8010 return rv;
8011}
8012
954c1994 8013/*
e1c57cef
JH
8014=for apidoc sv_setref_uv
8015
8016Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
8017argument will be upgraded to an RV. That RV will be modified to point to
8018the new SV. The C<classname> argument indicates the package for the
8019blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
8020will be returned and will have a reference count of 1.
8021
8022=cut
8023*/
8024
8025SV*
8026Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
8027{
8028 sv_setuv(newSVrv(rv,classname), uv);
8029 return rv;
8030}
8031
8032/*
954c1994
GS
8033=for apidoc sv_setref_nv
8034
8035Copies a double into a new SV, optionally blessing the SV. The C<rv>
8036argument will be upgraded to an RV. That RV will be modified to point to
8037the new SV. The C<classname> argument indicates the package for the
8038blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
8039will be returned and will have a reference count of 1.
8040
8041=cut
8042*/
8043
a0d0e21e 8044SV*
65202027 8045Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
8046{
8047 sv_setnv(newSVrv(rv,classname), nv);
8048 return rv;
8049}
463ee0b2 8050
954c1994
GS
8051/*
8052=for apidoc sv_setref_pvn
8053
8054Copies a string into a new SV, optionally blessing the SV. The length of the
8055string must be specified with C<n>. The C<rv> argument will be upgraded to
8056an RV. That RV will be modified to point to the new SV. The C<classname>
8057argument indicates the package for the blessing. Set C<classname> to
8058C<Nullch> to avoid the blessing. The new SV will be returned and will have
8059a reference count of 1.
8060
8061Note that C<sv_setref_pv> copies the pointer while this copies the string.
8062
8063=cut
8064*/
8065
a0d0e21e 8066SV*
864dbfa3 8067Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
8068{
8069 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
8070 return rv;
8071}
8072
954c1994
GS
8073/*
8074=for apidoc sv_bless
8075
8076Blesses an SV into a specified package. The SV must be an RV. The package
8077must be designated by its stash (see C<gv_stashpv()>). The reference count
8078of the SV is unaffected.
8079
8080=cut
8081*/
8082
a0d0e21e 8083SV*
864dbfa3 8084Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 8085{
76e3520e 8086 SV *tmpRef;
a0d0e21e 8087 if (!SvROK(sv))
cea2e8a9 8088 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
8089 tmpRef = SvRV(sv);
8090 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
8091 if (SvREADONLY(tmpRef))
cea2e8a9 8092 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
8093 if (SvOBJECT(tmpRef)) {
8094 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8095 --PL_sv_objcount;
76e3520e 8096 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 8097 }
a0d0e21e 8098 }
76e3520e
GS
8099 SvOBJECT_on(tmpRef);
8100 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8101 ++PL_sv_objcount;
76e3520e
GS
8102 (void)SvUPGRADE(tmpRef, SVt_PVMG);
8103 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
a0d0e21e 8104
2e3febc6
CS
8105 if (Gv_AMG(stash))
8106 SvAMAGIC_on(sv);
8107 else
8108 SvAMAGIC_off(sv);
a0d0e21e 8109
1edbfb88
AB
8110 if(SvSMAGICAL(tmpRef))
8111 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8112 mg_set(tmpRef);
8113
8114
ecdeb87c 8115
a0d0e21e
LW
8116 return sv;
8117}
8118
645c22ef 8119/* Downgrades a PVGV to a PVMG.
645c22ef
DM
8120 */
8121
76e3520e 8122STATIC void
cea2e8a9 8123S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 8124{
850fabdf
GS
8125 void *xpvmg;
8126
a0d0e21e
LW
8127 assert(SvTYPE(sv) == SVt_PVGV);
8128 SvFAKE_off(sv);
8129 if (GvGP(sv))
1edc1566 8130 gp_free((GV*)sv);
e826b3c7
GS
8131 if (GvSTASH(sv)) {
8132 SvREFCNT_dec(GvSTASH(sv));
8133 GvSTASH(sv) = Nullhv;
8134 }
14befaf4 8135 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 8136 Safefree(GvNAME(sv));
a5f75d66 8137 GvMULTI_off(sv);
850fabdf
GS
8138
8139 /* need to keep SvANY(sv) in the right arena */
8140 xpvmg = new_XPVMG();
8141 StructCopy(SvANY(sv), xpvmg, XPVMG);
8142 del_XPVGV(SvANY(sv));
8143 SvANY(sv) = xpvmg;
8144
a0d0e21e
LW
8145 SvFLAGS(sv) &= ~SVTYPEMASK;
8146 SvFLAGS(sv) |= SVt_PVMG;
8147}
8148
954c1994 8149/*
840a7b70 8150=for apidoc sv_unref_flags
954c1994
GS
8151
8152Unsets the RV status of the SV, and decrements the reference count of
8153whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
8154as a reversal of C<newSVrv>. The C<cflags> argument can contain
8155C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8156(otherwise the decrementing is conditional on the reference count being
8157different from one or the reference being a readonly SV).
7889fe52 8158See C<SvROK_off>.
954c1994
GS
8159
8160=cut
8161*/
8162
ed6116ce 8163void
840a7b70 8164Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 8165{
a0d0e21e 8166 SV* rv = SvRV(sv);
810b8aa5
GS
8167
8168 if (SvWEAKREF(sv)) {
8169 sv_del_backref(sv);
8170 SvWEAKREF_off(sv);
8171 SvRV(sv) = 0;
8172 return;
8173 }
ed6116ce
LW
8174 SvRV(sv) = 0;
8175 SvROK_off(sv);
04ca4930
NC
8176 /* You can't have a || SvREADONLY(rv) here, as $a = $$a, where $a was
8177 assigned to as BEGIN {$a = \"Foo"} will fail. */
8178 if (SvREFCNT(rv) != 1 || (flags & SV_IMMEDIATE_UNREF))
4633a7c4 8179 SvREFCNT_dec(rv);
840a7b70 8180 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 8181 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 8182}
8990e307 8183
840a7b70
IZ
8184/*
8185=for apidoc sv_unref
8186
8187Unsets the RV status of the SV, and decrements the reference count of
8188whatever was being referenced by the RV. This can almost be thought of
8189as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 8190being zero. See C<SvROK_off>.
840a7b70
IZ
8191
8192=cut
8193*/
8194
8195void
8196Perl_sv_unref(pTHX_ SV *sv)
8197{
8198 sv_unref_flags(sv, 0);
8199}
8200
645c22ef
DM
8201/*
8202=for apidoc sv_taint
8203
8204Taint an SV. Use C<SvTAINTED_on> instead.
8205=cut
8206*/
8207
bbce6d69 8208void
864dbfa3 8209Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 8210{
14befaf4 8211 sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
bbce6d69 8212}
8213
645c22ef
DM
8214/*
8215=for apidoc sv_untaint
8216
8217Untaint an SV. Use C<SvTAINTED_off> instead.
8218=cut
8219*/
8220
bbce6d69 8221void
864dbfa3 8222Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 8223{
13f57bf8 8224 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8225 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 8226 if (mg)
565764a8 8227 mg->mg_len &= ~1;
36477c24 8228 }
bbce6d69 8229}
8230
645c22ef
DM
8231/*
8232=for apidoc sv_tainted
8233
8234Test an SV for taintedness. Use C<SvTAINTED> instead.
8235=cut
8236*/
8237
bbce6d69 8238bool
864dbfa3 8239Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 8240{
13f57bf8 8241 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8242 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
155aba94 8243 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 8244 return TRUE;
8245 }
8246 return FALSE;
bbce6d69 8247}
8248
09540bc3
JH
8249/*
8250=for apidoc sv_setpviv
8251
8252Copies an integer into the given SV, also updating its string value.
8253Does not handle 'set' magic. See C<sv_setpviv_mg>.
8254
8255=cut
8256*/
8257
8258void
8259Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
8260{
8261 char buf[TYPE_CHARS(UV)];
8262 char *ebuf;
8263 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8264
8265 sv_setpvn(sv, ptr, ebuf - ptr);
8266}
8267
8268/*
8269=for apidoc sv_setpviv_mg
8270
8271Like C<sv_setpviv>, but also handles 'set' magic.
8272
8273=cut
8274*/
8275
8276void
8277Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
8278{
8279 char buf[TYPE_CHARS(UV)];
8280 char *ebuf;
8281 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8282
8283 sv_setpvn(sv, ptr, ebuf - ptr);
8284 SvSETMAGIC(sv);
8285}
8286
cea2e8a9 8287#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8288
8289/* pTHX_ magic can't cope with varargs, so this is a no-context
8290 * version of the main function, (which may itself be aliased to us).
8291 * Don't access this version directly.
8292 */
8293
cea2e8a9
GS
8294void
8295Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
8296{
8297 dTHX;
8298 va_list args;
8299 va_start(args, pat);
c5be433b 8300 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
8301 va_end(args);
8302}
8303
645c22ef
DM
8304/* pTHX_ magic can't cope with varargs, so this is a no-context
8305 * version of the main function, (which may itself be aliased to us).
8306 * Don't access this version directly.
8307 */
cea2e8a9
GS
8308
8309void
8310Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
8311{
8312 dTHX;
8313 va_list args;
8314 va_start(args, pat);
c5be433b 8315 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 8316 va_end(args);
cea2e8a9
GS
8317}
8318#endif
8319
954c1994
GS
8320/*
8321=for apidoc sv_setpvf
8322
8323Processes its arguments like C<sprintf> and sets an SV to the formatted
8324output. Does not handle 'set' magic. See C<sv_setpvf_mg>.
8325
8326=cut
8327*/
8328
46fc3d4c 8329void
864dbfa3 8330Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8331{
8332 va_list args;
46fc3d4c 8333 va_start(args, pat);
c5be433b 8334 sv_vsetpvf(sv, pat, &args);
46fc3d4c 8335 va_end(args);
8336}
8337
645c22ef
DM
8338/* backend for C<sv_setpvf> and C<sv_setpvf_nocontext> */
8339
c5be433b
GS
8340void
8341Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8342{
8343 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8344}
ef50df4b 8345
954c1994
GS
8346/*
8347=for apidoc sv_setpvf_mg
8348
8349Like C<sv_setpvf>, but also handles 'set' magic.
8350
8351=cut
8352*/
8353
ef50df4b 8354void
864dbfa3 8355Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8356{
8357 va_list args;
ef50df4b 8358 va_start(args, pat);
c5be433b 8359 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 8360 va_end(args);
c5be433b
GS
8361}
8362
645c22ef
DM
8363/* backend for C<sv_setpvf_mg> C<setpvf_mg_nocontext> */
8364
c5be433b
GS
8365void
8366Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8367{
8368 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
8369 SvSETMAGIC(sv);
8370}
8371
cea2e8a9 8372#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8373
8374/* pTHX_ magic can't cope with varargs, so this is a no-context
8375 * version of the main function, (which may itself be aliased to us).
8376 * Don't access this version directly.
8377 */
8378
cea2e8a9
GS
8379void
8380Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
8381{
8382 dTHX;
8383 va_list args;
8384 va_start(args, pat);
c5be433b 8385 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
8386 va_end(args);
8387}
8388
645c22ef
DM
8389/* pTHX_ magic can't cope with varargs, so this is a no-context
8390 * version of the main function, (which may itself be aliased to us).
8391 * Don't access this version directly.
8392 */
8393
cea2e8a9
GS
8394void
8395Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
8396{
8397 dTHX;
8398 va_list args;
8399 va_start(args, pat);
c5be433b 8400 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 8401 va_end(args);
cea2e8a9
GS
8402}
8403#endif
8404
954c1994
GS
8405/*
8406=for apidoc sv_catpvf
8407
d5ce4a7c
GA
8408Processes its arguments like C<sprintf> and appends the formatted
8409output to an SV. If the appended data contains "wide" characters
8410(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
8411and characters >255 formatted with %c), the original SV might get
8412upgraded to UTF-8. Handles 'get' magic, but not 'set' magic.
8413C<SvSETMAGIC()> must typically be called after calling this function
8414to handle 'set' magic.
954c1994 8415
d5ce4a7c 8416=cut */
954c1994 8417
46fc3d4c 8418void
864dbfa3 8419Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8420{
8421 va_list args;
46fc3d4c 8422 va_start(args, pat);
c5be433b 8423 sv_vcatpvf(sv, pat, &args);
46fc3d4c 8424 va_end(args);
8425}
8426
645c22ef
DM
8427/* backend for C<sv_catpvf> and C<catpvf_mg_nocontext> */
8428
ef50df4b 8429void
c5be433b
GS
8430Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8431{
8432 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8433}
8434
954c1994
GS
8435/*
8436=for apidoc sv_catpvf_mg
8437
8438Like C<sv_catpvf>, but also handles 'set' magic.
8439
8440=cut
8441*/
8442
c5be433b 8443void
864dbfa3 8444Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8445{
8446 va_list args;
ef50df4b 8447 va_start(args, pat);
c5be433b 8448 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 8449 va_end(args);
c5be433b
GS
8450}
8451
645c22ef
DM
8452/* backend for C<catpvf_mg> and C<catpvf_mg_nocontext> */
8453
c5be433b
GS
8454void
8455Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8456{
8457 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
8458 SvSETMAGIC(sv);
8459}
8460
954c1994
GS
8461/*
8462=for apidoc sv_vsetpvfn
8463
8464Works like C<vcatpvfn> but copies the text into the SV instead of
8465appending it.
8466
645c22ef
DM
8467Usually used via one of its frontends C<sv_setpvf> and C<sv_setpvf_mg>.
8468
954c1994
GS
8469=cut
8470*/
8471
46fc3d4c 8472void
7d5ea4e7 8473Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8474{
8475 sv_setpvn(sv, "", 0);
7d5ea4e7 8476 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 8477}
8478
645c22ef
DM
8479/* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
8480
2d00ba3b 8481STATIC I32
9dd79c3f 8482S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
8483{
8484 I32 var = 0;
8485 switch (**pattern) {
8486 case '1': case '2': case '3':
8487 case '4': case '5': case '6':
8488 case '7': case '8': case '9':
8489 while (isDIGIT(**pattern))
8490 var = var * 10 + (*(*pattern)++ - '0');
8491 }
8492 return var;
8493}
9dd79c3f 8494#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 8495
954c1994
GS
8496/*
8497=for apidoc sv_vcatpvfn
8498
8499Processes its arguments like C<vsprintf> and appends the formatted output
8500to an SV. Uses an array of SVs if the C style variable argument list is
8501missing (NULL). When running with taint checks enabled, indicates via
8502C<maybe_tainted> if results are untrustworthy (often due to the use of
8503locales).
8504
645c22ef
DM
8505Usually used via one of its frontends C<sv_catpvf> and C<sv_catpvf_mg>.
8506
954c1994
GS
8507=cut
8508*/
8509
46fc3d4c 8510void
7d5ea4e7 8511Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8512{
8513 char *p;
8514 char *q;
8515 char *patend;
fc36a67e 8516 STRLEN origlen;
46fc3d4c 8517 I32 svix = 0;
c635e13b 8518 static char nullstr[] = "(null)";
9c5ffd7c 8519 SV *argsv = Nullsv;
db79b45b
JH
8520 bool has_utf8; /* has the result utf8? */
8521 bool pat_utf8; /* the pattern is in utf8? */
8522 SV *nsv = Nullsv;
8523
8524 has_utf8 = pat_utf8 = DO_UTF8(sv);
46fc3d4c 8525
8526 /* no matter what, this is a string now */
fc36a67e 8527 (void)SvPV_force(sv, origlen);
46fc3d4c 8528
fc36a67e 8529 /* special-case "", "%s", and "%_" */
46fc3d4c 8530 if (patlen == 0)
8531 return;
fc36a67e 8532 if (patlen == 2 && pat[0] == '%') {
8533 switch (pat[1]) {
8534 case 's':
c635e13b 8535 if (args) {
8536 char *s = va_arg(*args, char*);
8537 sv_catpv(sv, s ? s : nullstr);
8538 }
7e2040f0 8539 else if (svix < svmax) {
fc36a67e 8540 sv_catsv(sv, *svargs);
7e2040f0
GS
8541 if (DO_UTF8(*svargs))
8542 SvUTF8_on(sv);
8543 }
fc36a67e 8544 return;
8545 case '_':
8546 if (args) {
7e2040f0
GS
8547 argsv = va_arg(*args, SV*);
8548 sv_catsv(sv, argsv);
8549 if (DO_UTF8(argsv))
8550 SvUTF8_on(sv);
fc36a67e 8551 return;
8552 }
8553 /* See comment on '_' below */
8554 break;
8555 }
46fc3d4c 8556 }
8557
2cf2cfc6 8558 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 8559 has_utf8 = TRUE;
2cf2cfc6 8560
46fc3d4c 8561 patend = (char*)pat + patlen;
8562 for (p = (char*)pat; p < patend; p = q) {
8563 bool alt = FALSE;
8564 bool left = FALSE;
b22c7a20 8565 bool vectorize = FALSE;
211dfcf1 8566 bool vectorarg = FALSE;
2cf2cfc6 8567 bool vec_utf8 = FALSE;
46fc3d4c 8568 char fill = ' ';
8569 char plus = 0;
8570 char intsize = 0;
8571 STRLEN width = 0;
fc36a67e 8572 STRLEN zeros = 0;
46fc3d4c 8573 bool has_precis = FALSE;
8574 STRLEN precis = 0;
58e33a90 8575 I32 osvix = svix;
2cf2cfc6 8576 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
8577#ifdef HAS_LDBL_SPRINTF_BUG
8578 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 8579 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
8580 bool fix_ldbl_sprintf_bug = FALSE;
8581#endif
205f51d8 8582
46fc3d4c 8583 char esignbuf[4];
ad391ad9 8584 U8 utf8buf[UTF8_MAXLEN+1];
46fc3d4c 8585 STRLEN esignlen = 0;
8586
8587 char *eptr = Nullch;
fc36a67e 8588 STRLEN elen = 0;
089c015b
JH
8589 /* Times 4: a decimal digit takes more than 3 binary digits.
8590 * NV_DIG: mantissa takes than many decimal digits.
8591 * Plus 32: Playing safe. */
8592 char ebuf[IV_DIG * 4 + NV_DIG + 32];
205f51d8 8593 /* large enough for "%#.#f" --chip */
2d4389e4 8594 /* what about long double NVs? --jhi */
b22c7a20 8595
81f715da 8596 SV *vecsv = Nullsv;
a05b299f 8597 U8 *vecstr = Null(U8*);
b22c7a20 8598 STRLEN veclen = 0;
934abaf1 8599 char c = 0;
46fc3d4c 8600 int i;
9c5ffd7c 8601 unsigned base = 0;
8c8eb53c
RB
8602 IV iv = 0;
8603 UV uv = 0;
9e5b023a
JH
8604 /* we need a long double target in case HAS_LONG_DOUBLE but
8605 not USE_LONG_DOUBLE
8606 */
35fff930 8607#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
8608 long double nv;
8609#else
65202027 8610 NV nv;
9e5b023a 8611#endif
46fc3d4c 8612 STRLEN have;
8613 STRLEN need;
8614 STRLEN gap;
b22c7a20
GS
8615 char *dotstr = ".";
8616 STRLEN dotstrlen = 1;
211dfcf1 8617 I32 efix = 0; /* explicit format parameter index */
eb3fce90 8618 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
8619 I32 epix = 0; /* explicit precision index */
8620 I32 evix = 0; /* explicit vector index */
eb3fce90 8621 bool asterisk = FALSE;
46fc3d4c 8622
211dfcf1 8623 /* echo everything up to the next format specification */
46fc3d4c 8624 for (q = p; q < patend && *q != '%'; ++q) ;
8625 if (q > p) {
db79b45b
JH
8626 if (has_utf8 && !pat_utf8)
8627 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
8628 else
8629 sv_catpvn(sv, p, q - p);
46fc3d4c 8630 p = q;
8631 }
8632 if (q++ >= patend)
8633 break;
8634
211dfcf1
HS
8635/*
8636 We allow format specification elements in this order:
8637 \d+\$ explicit format parameter index
8638 [-+ 0#]+ flags
a472f209 8639 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 8640 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
8641 \d+|\*(\d+\$)? width using optional (optionally specified) arg
8642 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
8643 [hlqLV] size
8644 [%bcdefginopsux_DFOUX] format (mandatory)
8645*/
8646 if (EXPECT_NUMBER(q, width)) {
8647 if (*q == '$') {
8648 ++q;
8649 efix = width;
8650 } else {
8651 goto gotwidth;
8652 }
8653 }
8654
fc36a67e 8655 /* FLAGS */
8656
46fc3d4c 8657 while (*q) {
8658 switch (*q) {
8659 case ' ':
8660 case '+':
8661 plus = *q++;
8662 continue;
8663
8664 case '-':
8665 left = TRUE;
8666 q++;
8667 continue;
8668
8669 case '0':
8670 fill = *q++;
8671 continue;
8672
8673 case '#':
8674 alt = TRUE;
8675 q++;
8676 continue;
8677
fc36a67e 8678 default:
8679 break;
8680 }
8681 break;
8682 }
46fc3d4c 8683
211dfcf1 8684 tryasterisk:
eb3fce90 8685 if (*q == '*') {
211dfcf1
HS
8686 q++;
8687 if (EXPECT_NUMBER(q, ewix))
8688 if (*q++ != '$')
8689 goto unknown;
eb3fce90 8690 asterisk = TRUE;
211dfcf1
HS
8691 }
8692 if (*q == 'v') {
eb3fce90 8693 q++;
211dfcf1
HS
8694 if (vectorize)
8695 goto unknown;
9cbac4c7 8696 if ((vectorarg = asterisk)) {
211dfcf1
HS
8697 evix = ewix;
8698 ewix = 0;
8699 asterisk = FALSE;
8700 }
8701 vectorize = TRUE;
8702 goto tryasterisk;
eb3fce90
JH
8703 }
8704
211dfcf1 8705 if (!asterisk)
f3583277
RB
8706 if( *q == '0' )
8707 fill = *q++;
211dfcf1
HS
8708 EXPECT_NUMBER(q, width);
8709
8710 if (vectorize) {
8711 if (vectorarg) {
8712 if (args)
8713 vecsv = va_arg(*args, SV*);
8714 else
8715 vecsv = (evix ? evix <= svmax : svix < svmax) ?
3a7a539e 8716 svargs[evix ? evix-1 : svix++] : &PL_sv_undef;
4459522c 8717 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1 8718 if (DO_UTF8(vecsv))
2cf2cfc6 8719 is_utf8 = TRUE;
211dfcf1
HS
8720 }
8721 if (args) {
8722 vecsv = va_arg(*args, SV*);
8723 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 8724 vec_utf8 = DO_UTF8(vecsv);
eb3fce90 8725 }
211dfcf1
HS
8726 else if (efix ? efix <= svmax : svix < svmax) {
8727 vecsv = svargs[efix ? efix-1 : svix++];
8728 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 8729 vec_utf8 = DO_UTF8(vecsv);
211dfcf1
HS
8730 }
8731 else {
8732 vecstr = (U8*)"";
8733 veclen = 0;
8734 }
eb3fce90 8735 }
fc36a67e 8736
eb3fce90 8737 if (asterisk) {
fc36a67e 8738 if (args)
8739 i = va_arg(*args, int);
8740 else
eb3fce90
JH
8741 i = (ewix ? ewix <= svmax : svix < svmax) ?
8742 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8743 left |= (i < 0);
8744 width = (i < 0) ? -i : i;
fc36a67e 8745 }
211dfcf1 8746 gotwidth:
fc36a67e 8747
8748 /* PRECISION */
46fc3d4c 8749
fc36a67e 8750 if (*q == '.') {
8751 q++;
8752 if (*q == '*') {
211dfcf1 8753 q++;
7b8dd722
HS
8754 if (EXPECT_NUMBER(q, epix) && *q++ != '$')
8755 goto unknown;
8756 /* XXX: todo, support specified precision parameter */
8757 if (epix)
211dfcf1 8758 goto unknown;
46fc3d4c 8759 if (args)
8760 i = va_arg(*args, int);
8761 else
eb3fce90
JH
8762 i = (ewix ? ewix <= svmax : svix < svmax)
8763 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8764 precis = (i < 0) ? 0 : i;
fc36a67e 8765 }
8766 else {
8767 precis = 0;
8768 while (isDIGIT(*q))
8769 precis = precis * 10 + (*q++ - '0');
8770 }
8771 has_precis = TRUE;
8772 }
46fc3d4c 8773
fc36a67e 8774 /* SIZE */
46fc3d4c 8775
fc36a67e 8776 switch (*q) {
c623ac67
GS
8777#ifdef WIN32
8778 case 'I': /* Ix, I32x, and I64x */
8779# ifdef WIN64
8780 if (q[1] == '6' && q[2] == '4') {
8781 q += 3;
8782 intsize = 'q';
8783 break;
8784 }
8785# endif
8786 if (q[1] == '3' && q[2] == '2') {
8787 q += 3;
8788 break;
8789 }
8790# ifdef WIN64
8791 intsize = 'q';
8792# endif
8793 q++;
8794 break;
8795#endif
9e5b023a 8796#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 8797 case 'L': /* Ld */
e5c81feb 8798 /* FALL THROUGH */
e5c81feb 8799#ifdef HAS_QUAD
6f9bb7fd 8800 case 'q': /* qd */
9e5b023a 8801#endif
6f9bb7fd
GS
8802 intsize = 'q';
8803 q++;
8804 break;
8805#endif
fc36a67e 8806 case 'l':
9e5b023a 8807#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 8808 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 8809 intsize = 'q';
8810 q += 2;
46fc3d4c 8811 break;
cf2093f6 8812 }
fc36a67e 8813#endif
6f9bb7fd 8814 /* FALL THROUGH */
fc36a67e 8815 case 'h':
cf2093f6 8816 /* FALL THROUGH */
fc36a67e 8817 case 'V':
8818 intsize = *q++;
46fc3d4c 8819 break;
8820 }
8821
fc36a67e 8822 /* CONVERSION */
8823
211dfcf1
HS
8824 if (*q == '%') {
8825 eptr = q++;
8826 elen = 1;
8827 goto string;
8828 }
8829
be75b157
HS
8830 if (vectorize)
8831 argsv = vecsv;
8832 else if (!args)
211dfcf1
HS
8833 argsv = (efix ? efix <= svmax : svix < svmax) ?
8834 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
8835
46fc3d4c 8836 switch (c = *q++) {
8837
8838 /* STRINGS */
8839
46fc3d4c 8840 case 'c':
be75b157 8841 uv = (args && !vectorize) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
8842 if ((uv > 255 ||
8843 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 8844 && !IN_BYTES) {
dfe13c55 8845 eptr = (char*)utf8buf;
9041c2e3 8846 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 8847 is_utf8 = TRUE;
7e2040f0
GS
8848 }
8849 else {
8850 c = (char)uv;
8851 eptr = &c;
8852 elen = 1;
a0ed51b3 8853 }
46fc3d4c 8854 goto string;
8855
46fc3d4c 8856 case 's':
be75b157 8857 if (args && !vectorize) {
fc36a67e 8858 eptr = va_arg(*args, char*);
c635e13b 8859 if (eptr)
1d7c1841
GS
8860#ifdef MACOS_TRADITIONAL
8861 /* On MacOS, %#s format is used for Pascal strings */
8862 if (alt)
8863 elen = *eptr++;
8864 else
8865#endif
c635e13b 8866 elen = strlen(eptr);
8867 else {
8868 eptr = nullstr;
8869 elen = sizeof nullstr - 1;
8870 }
46fc3d4c 8871 }
211dfcf1 8872 else {
7e2040f0
GS
8873 eptr = SvPVx(argsv, elen);
8874 if (DO_UTF8(argsv)) {
a0ed51b3
LW
8875 if (has_precis && precis < elen) {
8876 I32 p = precis;
7e2040f0 8877 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
8878 precis = p;
8879 }
8880 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 8881 width += elen - sv_len_utf8(argsv);
a0ed51b3 8882 }
2cf2cfc6 8883 is_utf8 = TRUE;
a0ed51b3
LW
8884 }
8885 }
46fc3d4c 8886 goto string;
8887
fc36a67e 8888 case '_':
8889 /*
8890 * The "%_" hack might have to be changed someday,
8891 * if ISO or ANSI decide to use '_' for something.
8892 * So we keep it hidden from users' code.
8893 */
be75b157 8894 if (!args || vectorize)
fc36a67e 8895 goto unknown;
211dfcf1 8896 argsv = va_arg(*args, SV*);
7e2040f0
GS
8897 eptr = SvPVx(argsv, elen);
8898 if (DO_UTF8(argsv))
2cf2cfc6 8899 is_utf8 = TRUE;
fc36a67e 8900
46fc3d4c 8901 string:
b22c7a20 8902 vectorize = FALSE;
46fc3d4c 8903 if (has_precis && elen > precis)
8904 elen = precis;
8905 break;
8906
8907 /* INTEGERS */
8908
fc36a67e 8909 case 'p':
be75b157 8910 if (alt || vectorize)
c2e66d9e 8911 goto unknown;
211dfcf1 8912 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 8913 base = 16;
8914 goto integer;
8915
46fc3d4c 8916 case 'D':
29fe7a80 8917#ifdef IV_IS_QUAD
22f3ae8c 8918 intsize = 'q';
29fe7a80 8919#else
46fc3d4c 8920 intsize = 'l';
29fe7a80 8921#endif
46fc3d4c 8922 /* FALL THROUGH */
8923 case 'd':
8924 case 'i':
b22c7a20 8925 if (vectorize) {
ba210ebe 8926 STRLEN ulen;
211dfcf1
HS
8927 if (!veclen)
8928 continue;
2cf2cfc6
A
8929 if (vec_utf8)
8930 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8931 UTF8_ALLOW_ANYUV);
b22c7a20 8932 else {
e83d50c9 8933 uv = *vecstr;
b22c7a20
GS
8934 ulen = 1;
8935 }
8936 vecstr += ulen;
8937 veclen -= ulen;
e83d50c9
JP
8938 if (plus)
8939 esignbuf[esignlen++] = plus;
b22c7a20
GS
8940 }
8941 else if (args) {
46fc3d4c 8942 switch (intsize) {
8943 case 'h': iv = (short)va_arg(*args, int); break;
8944 default: iv = va_arg(*args, int); break;
8945 case 'l': iv = va_arg(*args, long); break;
fc36a67e 8946 case 'V': iv = va_arg(*args, IV); break;
cf2093f6
JH
8947#ifdef HAS_QUAD
8948 case 'q': iv = va_arg(*args, Quad_t); break;
8949#endif
46fc3d4c 8950 }
8951 }
8952 else {
211dfcf1 8953 iv = SvIVx(argsv);
46fc3d4c 8954 switch (intsize) {
8955 case 'h': iv = (short)iv; break;
be28567c 8956 default: break;
46fc3d4c 8957 case 'l': iv = (long)iv; break;
fc36a67e 8958 case 'V': break;
cf2093f6
JH
8959#ifdef HAS_QUAD
8960 case 'q': iv = (Quad_t)iv; break;
8961#endif
46fc3d4c 8962 }
8963 }
e83d50c9
JP
8964 if ( !vectorize ) /* we already set uv above */
8965 {
8966 if (iv >= 0) {
8967 uv = iv;
8968 if (plus)
8969 esignbuf[esignlen++] = plus;
8970 }
8971 else {
8972 uv = -iv;
8973 esignbuf[esignlen++] = '-';
8974 }
46fc3d4c 8975 }
8976 base = 10;
8977 goto integer;
8978
fc36a67e 8979 case 'U':
29fe7a80 8980#ifdef IV_IS_QUAD
22f3ae8c 8981 intsize = 'q';
29fe7a80 8982#else
fc36a67e 8983 intsize = 'l';
29fe7a80 8984#endif
fc36a67e 8985 /* FALL THROUGH */
8986 case 'u':
8987 base = 10;
8988 goto uns_integer;
8989
4f19785b
WSI
8990 case 'b':
8991 base = 2;
8992 goto uns_integer;
8993
46fc3d4c 8994 case 'O':
29fe7a80 8995#ifdef IV_IS_QUAD
22f3ae8c 8996 intsize = 'q';
29fe7a80 8997#else
46fc3d4c 8998 intsize = 'l';
29fe7a80 8999#endif
46fc3d4c 9000 /* FALL THROUGH */
9001 case 'o':
9002 base = 8;
9003 goto uns_integer;
9004
9005 case 'X':
46fc3d4c 9006 case 'x':
9007 base = 16;
46fc3d4c 9008
9009 uns_integer:
b22c7a20 9010 if (vectorize) {
ba210ebe 9011 STRLEN ulen;
b22c7a20 9012 vector:
211dfcf1
HS
9013 if (!veclen)
9014 continue;
2cf2cfc6
A
9015 if (vec_utf8)
9016 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9017 UTF8_ALLOW_ANYUV);
b22c7a20 9018 else {
a05b299f 9019 uv = *vecstr;
b22c7a20
GS
9020 ulen = 1;
9021 }
9022 vecstr += ulen;
9023 veclen -= ulen;
9024 }
9025 else if (args) {
46fc3d4c 9026 switch (intsize) {
9027 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
9028 default: uv = va_arg(*args, unsigned); break;
9029 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 9030 case 'V': uv = va_arg(*args, UV); break;
cf2093f6
JH
9031#ifdef HAS_QUAD
9032 case 'q': uv = va_arg(*args, Quad_t); break;
9033#endif
46fc3d4c 9034 }
9035 }
9036 else {
211dfcf1 9037 uv = SvUVx(argsv);
46fc3d4c 9038 switch (intsize) {
9039 case 'h': uv = (unsigned short)uv; break;
be28567c 9040 default: break;
46fc3d4c 9041 case 'l': uv = (unsigned long)uv; break;
fc36a67e 9042 case 'V': break;
cf2093f6
JH
9043#ifdef HAS_QUAD
9044 case 'q': uv = (Quad_t)uv; break;
9045#endif
46fc3d4c 9046 }
9047 }
9048
9049 integer:
46fc3d4c 9050 eptr = ebuf + sizeof ebuf;
fc36a67e 9051 switch (base) {
9052 unsigned dig;
9053 case 16:
c10ed8b9
HS
9054 if (!uv)
9055 alt = FALSE;
1d7c1841
GS
9056 p = (char*)((c == 'X')
9057 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 9058 do {
9059 dig = uv & 15;
9060 *--eptr = p[dig];
9061 } while (uv >>= 4);
9062 if (alt) {
46fc3d4c 9063 esignbuf[esignlen++] = '0';
fc36a67e 9064 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 9065 }
fc36a67e 9066 break;
9067 case 8:
9068 do {
9069 dig = uv & 7;
9070 *--eptr = '0' + dig;
9071 } while (uv >>= 3);
9072 if (alt && *eptr != '0')
9073 *--eptr = '0';
9074 break;
4f19785b
WSI
9075 case 2:
9076 do {
9077 dig = uv & 1;
9078 *--eptr = '0' + dig;
9079 } while (uv >>= 1);
eda88b6d
JH
9080 if (alt) {
9081 esignbuf[esignlen++] = '0';
7481bb52 9082 esignbuf[esignlen++] = 'b';
eda88b6d 9083 }
4f19785b 9084 break;
fc36a67e 9085 default: /* it had better be ten or less */
6bc102ca 9086#if defined(PERL_Y2KWARN)
e476b1b5 9087 if (ckWARN(WARN_Y2K)) {
6bc102ca
GS
9088 STRLEN n;
9089 char *s = SvPV(sv,n);
9090 if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
9091 && (n == 2 || !isDIGIT(s[n-3])))
9092 {
9014280d 9093 Perl_warner(aTHX_ packWARN(WARN_Y2K),
6bc102ca
GS
9094 "Possible Y2K bug: %%%c %s",
9095 c, "format string following '19'");
9096 }
9097 }
9098#endif
fc36a67e 9099 do {
9100 dig = uv % base;
9101 *--eptr = '0' + dig;
9102 } while (uv /= base);
9103 break;
46fc3d4c 9104 }
9105 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
9106 if (has_precis) {
9107 if (precis > elen)
9108 zeros = precis - elen;
9109 else if (precis == 0 && elen == 1 && *eptr == '0')
9110 elen = 0;
9111 }
46fc3d4c 9112 break;
9113
9114 /* FLOATING POINT */
9115
fc36a67e 9116 case 'F':
9117 c = 'f'; /* maybe %F isn't supported here */
9118 /* FALL THROUGH */
46fc3d4c 9119 case 'e': case 'E':
fc36a67e 9120 case 'f':
46fc3d4c 9121 case 'g': case 'G':
9122
9123 /* This is evil, but floating point is even more evil */
9124
9e5b023a
JH
9125 /* for SV-style calling, we can only get NV
9126 for C-style calling, we assume %f is double;
9127 for simplicity we allow any of %Lf, %llf, %qf for long double
9128 */
9129 switch (intsize) {
9130 case 'V':
9131#if defined(USE_LONG_DOUBLE)
9132 intsize = 'q';
9133#endif
9134 break;
8a2e3f14 9135/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364
HS
9136 case 'l':
9137 /* FALL THROUGH */
9e5b023a
JH
9138 default:
9139#if defined(USE_LONG_DOUBLE)
9140 intsize = args ? 0 : 'q';
9141#endif
9142 break;
9143 case 'q':
9144#if defined(HAS_LONG_DOUBLE)
9145 break;
9146#else
9147 /* FALL THROUGH */
9148#endif
9149 case 'h':
9e5b023a
JH
9150 goto unknown;
9151 }
9152
9153 /* now we need (long double) if intsize == 'q', else (double) */
be75b157 9154 nv = (args && !vectorize) ?
35fff930
JH
9155#if LONG_DOUBLESIZE > DOUBLESIZE
9156 intsize == 'q' ?
205f51d8
AS
9157 va_arg(*args, long double) :
9158 va_arg(*args, double)
35fff930 9159#else
205f51d8 9160 va_arg(*args, double)
35fff930 9161#endif
9e5b023a 9162 : SvNVx(argsv);
fc36a67e 9163
9164 need = 0;
be75b157 9165 vectorize = FALSE;
fc36a67e 9166 if (c != 'e' && c != 'E') {
9167 i = PERL_INT_MIN;
9e5b023a
JH
9168 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9169 will cast our (long double) to (double) */
73b309ea 9170 (void)Perl_frexp(nv, &i);
fc36a67e 9171 if (i == PERL_INT_MIN)
cea2e8a9 9172 Perl_die(aTHX_ "panic: frexp");
c635e13b 9173 if (i > 0)
fc36a67e 9174 need = BIT_DIGITS(i);
9175 }
9176 need += has_precis ? precis : 6; /* known default */
20f6aaab 9177
fc36a67e 9178 if (need < width)
9179 need = width;
9180
20f6aaab
AS
9181#ifdef HAS_LDBL_SPRINTF_BUG
9182 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9183 with sfio - Allen <allens@cpan.org> */
9184
9185# ifdef DBL_MAX
9186# define MY_DBL_MAX DBL_MAX
9187# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9188# if DOUBLESIZE >= 8
9189# define MY_DBL_MAX 1.7976931348623157E+308L
9190# else
9191# define MY_DBL_MAX 3.40282347E+38L
9192# endif
9193# endif
9194
9195# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9196# define MY_DBL_MAX_BUG 1L
20f6aaab 9197# else
205f51d8 9198# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9199# endif
20f6aaab 9200
205f51d8
AS
9201# ifdef DBL_MIN
9202# define MY_DBL_MIN DBL_MIN
9203# else /* XXX guessing! -Allen */
9204# if DOUBLESIZE >= 8
9205# define MY_DBL_MIN 2.2250738585072014E-308L
9206# else
9207# define MY_DBL_MIN 1.17549435E-38L
9208# endif
9209# endif
20f6aaab 9210
205f51d8
AS
9211 if ((intsize == 'q') && (c == 'f') &&
9212 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9213 (need < DBL_DIG)) {
9214 /* it's going to be short enough that
9215 * long double precision is not needed */
9216
9217 if ((nv <= 0L) && (nv >= -0L))
9218 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9219 else {
9220 /* would use Perl_fp_class as a double-check but not
9221 * functional on IRIX - see perl.h comments */
9222
9223 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9224 /* It's within the range that a double can represent */
9225#if defined(DBL_MAX) && !defined(DBL_MIN)
9226 if ((nv >= ((long double)1/DBL_MAX)) ||
9227 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9228#endif
205f51d8 9229 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9230 }
205f51d8
AS
9231 }
9232 if (fix_ldbl_sprintf_bug == TRUE) {
9233 double temp;
9234
9235 intsize = 0;
9236 temp = (double)nv;
9237 nv = (NV)temp;
9238 }
20f6aaab 9239 }
205f51d8
AS
9240
9241# undef MY_DBL_MAX
9242# undef MY_DBL_MAX_BUG
9243# undef MY_DBL_MIN
9244
20f6aaab
AS
9245#endif /* HAS_LDBL_SPRINTF_BUG */
9246
46fc3d4c 9247 need += 20; /* fudge factor */
80252599
GS
9248 if (PL_efloatsize < need) {
9249 Safefree(PL_efloatbuf);
9250 PL_efloatsize = need + 20; /* more fudge */
9251 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9252 PL_efloatbuf[0] = '\0';
46fc3d4c 9253 }
9254
9255 eptr = ebuf + sizeof ebuf;
9256 *--eptr = '\0';
9257 *--eptr = c;
9e5b023a
JH
9258 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9259#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
9260 if (intsize == 'q') {
e5c81feb
JH
9261 /* Copy the one or more characters in a long double
9262 * format before the 'base' ([efgEFG]) character to
9263 * the format string. */
9264 static char const prifldbl[] = PERL_PRIfldbl;
9265 char const *p = prifldbl + sizeof(prifldbl) - 3;
9266 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 9267 }
65202027 9268#endif
46fc3d4c 9269 if (has_precis) {
9270 base = precis;
9271 do { *--eptr = '0' + (base % 10); } while (base /= 10);
9272 *--eptr = '.';
9273 }
9274 if (width) {
9275 base = width;
9276 do { *--eptr = '0' + (base % 10); } while (base /= 10);
9277 }
9278 if (fill == '0')
9279 *--eptr = fill;
84902520
TB
9280 if (left)
9281 *--eptr = '-';
46fc3d4c 9282 if (plus)
9283 *--eptr = plus;
9284 if (alt)
9285 *--eptr = '#';
9286 *--eptr = '%';
9287
ff9121f8
JH
9288 /* No taint. Otherwise we are in the strange situation
9289 * where printf() taints but print($float) doesn't.
bda0f7a5 9290 * --jhi */
9e5b023a
JH
9291#if defined(HAS_LONG_DOUBLE)
9292 if (intsize == 'q')
9293 (void)sprintf(PL_efloatbuf, eptr, nv);
9294 else
9295 (void)sprintf(PL_efloatbuf, eptr, (double)nv);
9296#else
dd8482fc 9297 (void)sprintf(PL_efloatbuf, eptr, nv);
9e5b023a 9298#endif
80252599
GS
9299 eptr = PL_efloatbuf;
9300 elen = strlen(PL_efloatbuf);
46fc3d4c 9301 break;
9302
fc36a67e 9303 /* SPECIAL */
9304
9305 case 'n':
9306 i = SvCUR(sv) - origlen;
be75b157 9307 if (args && !vectorize) {
c635e13b 9308 switch (intsize) {
9309 case 'h': *(va_arg(*args, short*)) = i; break;
9310 default: *(va_arg(*args, int*)) = i; break;
9311 case 'l': *(va_arg(*args, long*)) = i; break;
9312 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
9313#ifdef HAS_QUAD
9314 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
9315#endif
c635e13b 9316 }
fc36a67e 9317 }
9dd79c3f 9318 else
211dfcf1 9319 sv_setuv_mg(argsv, (UV)i);
be75b157 9320 vectorize = FALSE;
fc36a67e 9321 continue; /* not "break" */
9322
9323 /* UNKNOWN */
9324
46fc3d4c 9325 default:
fc36a67e 9326 unknown:
599cee73 9327 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 9328 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 9329 SV *msg = sv_newmortal();
35c1215d
NC
9330 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9331 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 9332 if (c) {
0f4b6630 9333 if (isPRINT(c))
1c846c1f 9334 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
9335 "\"%%%c\"", c & 0xFF);
9336 else
9337 Perl_sv_catpvf(aTHX_ msg,
57def98f 9338 "\"%%\\%03"UVof"\"",
0f4b6630 9339 (UV)c & 0xFF);
0f4b6630 9340 } else
c635e13b 9341 sv_catpv(msg, "end of string");
9014280d 9342 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 9343 }
fb73857a 9344
9345 /* output mangled stuff ... */
9346 if (c == '\0')
9347 --q;
46fc3d4c 9348 eptr = p;
9349 elen = q - p;
fb73857a 9350
9351 /* ... right here, because formatting flags should not apply */
9352 SvGROW(sv, SvCUR(sv) + elen + 1);
9353 p = SvEND(sv);
4459522c 9354 Copy(eptr, p, elen, char);
fb73857a 9355 p += elen;
9356 *p = '\0';
9357 SvCUR(sv) = p - SvPVX(sv);
58e33a90 9358 svix = osvix;
fb73857a 9359 continue; /* not "break" */
46fc3d4c 9360 }
9361
d2876be5
JH
9362 if (is_utf8 != has_utf8) {
9363 if (is_utf8) {
9364 if (SvCUR(sv))
9365 sv_utf8_upgrade(sv);
9366 }
9367 else {
9368 SV *nsv = sv_2mortal(newSVpvn(eptr, elen));
9369 sv_utf8_upgrade(nsv);
9370 eptr = SvPVX(nsv);
9371 elen = SvCUR(nsv);
9372 }
9373 SvGROW(sv, SvCUR(sv) + elen + 1);
9374 p = SvEND(sv);
9375 *p = '\0';
9376 }
94330da2
MHM
9377 /* Use memchr() instead of strchr(), as eptr is not guaranteed */
9378 /* to point to a null-terminated string. */
9379 if (left && ckWARN(WARN_PRINTF) && memchr(eptr, '\n', elen) &&
dca6e23f
RB
9380 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF))
9381 Perl_warner(aTHX_ packWARN(WARN_PRINTF),
9382 "Newline in left-justified string for %sprintf",
9383 (PL_op->op_type == OP_PRTF) ? "" : "s");
d2876be5 9384
fc36a67e 9385 have = esignlen + zeros + elen;
46fc3d4c 9386 need = (have > width ? have : width);
9387 gap = need - have;
9388
b22c7a20 9389 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 9390 p = SvEND(sv);
9391 if (esignlen && fill == '0') {
eb160463 9392 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9393 *p++ = esignbuf[i];
9394 }
9395 if (gap && !left) {
9396 memset(p, fill, gap);
9397 p += gap;
9398 }
9399 if (esignlen && fill != '0') {
eb160463 9400 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9401 *p++ = esignbuf[i];
9402 }
fc36a67e 9403 if (zeros) {
9404 for (i = zeros; i; i--)
9405 *p++ = '0';
9406 }
46fc3d4c 9407 if (elen) {
4459522c 9408 Copy(eptr, p, elen, char);
46fc3d4c 9409 p += elen;
9410 }
9411 if (gap && left) {
9412 memset(p, ' ', gap);
9413 p += gap;
9414 }
b22c7a20
GS
9415 if (vectorize) {
9416 if (veclen) {
4459522c 9417 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
9418 p += dotstrlen;
9419 }
9420 else
9421 vectorize = FALSE; /* done iterating over vecstr */
9422 }
2cf2cfc6
A
9423 if (is_utf8)
9424 has_utf8 = TRUE;
9425 if (has_utf8)
7e2040f0 9426 SvUTF8_on(sv);
46fc3d4c 9427 *p = '\0';
9428 SvCUR(sv) = p - SvPVX(sv);
b22c7a20
GS
9429 if (vectorize) {
9430 esignlen = 0;
9431 goto vector;
9432 }
46fc3d4c 9433 }
9434}
51371543 9435
645c22ef
DM
9436/* =========================================================================
9437
9438=head1 Cloning an interpreter
9439
9440All the macros and functions in this section are for the private use of
9441the main function, perl_clone().
9442
9443The foo_dup() functions make an exact copy of an existing foo thinngy.
9444During the course of a cloning, a hash table is used to map old addresses
9445to new addresses. The table is created and manipulated with the
9446ptr_table_* functions.
9447
9448=cut
9449
9450============================================================================*/
9451
9452
1d7c1841
GS
9453#if defined(USE_ITHREADS)
9454
1d7c1841
GS
9455#ifndef GpREFCNT_inc
9456# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
9457#endif
9458
9459
d2d73c3e
AB
9460#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
9461#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
9462#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9463#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
9464#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9465#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
9466#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9467#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
9468#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
9469#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
9470#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
9471#define SAVEPV(p) (p ? savepv(p) : Nullch)
9472#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 9473
d2d73c3e 9474
d2f185dc
AMS
9475/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
9476 regcomp.c. AMS 20010712 */
645c22ef 9477
1d7c1841 9478REGEXP *
a8fc9800 9479Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
1d7c1841 9480{
d2f185dc
AMS
9481 REGEXP *ret;
9482 int i, len, npar;
9483 struct reg_substr_datum *s;
9484
9485 if (!r)
9486 return (REGEXP *)NULL;
9487
9488 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
9489 return ret;
9490
9491 len = r->offsets[0];
9492 npar = r->nparens+1;
9493
9494 Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
9495 Copy(r->program, ret->program, len+1, regnode);
9496
9497 New(0, ret->startp, npar, I32);
9498 Copy(r->startp, ret->startp, npar, I32);
9499 New(0, ret->endp, npar, I32);
9500 Copy(r->startp, ret->startp, npar, I32);
9501
d2f185dc
AMS
9502 New(0, ret->substrs, 1, struct reg_substr_data);
9503 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
9504 s->min_offset = r->substrs->data[i].min_offset;
9505 s->max_offset = r->substrs->data[i].max_offset;
9506 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 9507 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
9508 }
9509
70612e96 9510 ret->regstclass = NULL;
d2f185dc
AMS
9511 if (r->data) {
9512 struct reg_data *d;
9513 int count = r->data->count;
9514
9515 Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
9516 char, struct reg_data);
9517 New(0, d->what, count, U8);
9518
9519 d->count = count;
9520 for (i = 0; i < count; i++) {
9521 d->what[i] = r->data->what[i];
9522 switch (d->what[i]) {
9523 case 's':
9524 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
9525 break;
9526 case 'p':
9527 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
9528 break;
9529 case 'f':
9530 /* This is cheating. */
9531 New(0, d->data[i], 1, struct regnode_charclass_class);
9532 StructCopy(r->data->data[i], d->data[i],
9533 struct regnode_charclass_class);
70612e96 9534 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
9535 break;
9536 case 'o':
33773810
AMS
9537 /* Compiled op trees are readonly, and can thus be
9538 shared without duplication. */
9b978d73
DM
9539 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
9540 break;
d2f185dc
AMS
9541 case 'n':
9542 d->data[i] = r->data->data[i];
9543 break;
9544 }
9545 }
9546
9547 ret->data = d;
9548 }
9549 else
9550 ret->data = NULL;
9551
9552 New(0, ret->offsets, 2*len+1, U32);
9553 Copy(r->offsets, ret->offsets, 2*len+1, U32);
9554
9555 ret->precomp = SAVEPV(r->precomp);
d2f185dc
AMS
9556 ret->refcnt = r->refcnt;
9557 ret->minlen = r->minlen;
9558 ret->prelen = r->prelen;
9559 ret->nparens = r->nparens;
9560 ret->lastparen = r->lastparen;
9561 ret->lastcloseparen = r->lastcloseparen;
9562 ret->reganch = r->reganch;
9563
70612e96
RG
9564 ret->sublen = r->sublen;
9565
9566 if (RX_MATCH_COPIED(ret))
9567 ret->subbeg = SAVEPV(r->subbeg);
9568 else
9569 ret->subbeg = Nullch;
9a26048b
NC
9570#ifdef PERL_COPY_ON_WRITE
9571 ret->saved_copy = Nullsv;
9572#endif
70612e96 9573
d2f185dc
AMS
9574 ptr_table_store(PL_ptr_table, r, ret);
9575 return ret;
1d7c1841
GS
9576}
9577
d2d73c3e 9578/* duplicate a file handle */
645c22ef 9579
1d7c1841 9580PerlIO *
a8fc9800 9581Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
9582{
9583 PerlIO *ret;
9584 if (!fp)
9585 return (PerlIO*)NULL;
9586
9587 /* look for it in the table first */
9588 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
9589 if (ret)
9590 return ret;
9591
9592 /* create anew and remember what it is */
ecdeb87c 9593 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
9594 ptr_table_store(PL_ptr_table, fp, ret);
9595 return ret;
9596}
9597
645c22ef
DM
9598/* duplicate a directory handle */
9599
1d7c1841
GS
9600DIR *
9601Perl_dirp_dup(pTHX_ DIR *dp)
9602{
9603 if (!dp)
9604 return (DIR*)NULL;
9605 /* XXX TODO */
9606 return dp;
9607}
9608
ff276b08 9609/* duplicate a typeglob */
645c22ef 9610
1d7c1841 9611GP *
a8fc9800 9612Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
9613{
9614 GP *ret;
9615 if (!gp)
9616 return (GP*)NULL;
9617 /* look for it in the table first */
9618 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
9619 if (ret)
9620 return ret;
9621
9622 /* create anew and remember what it is */
9623 Newz(0, ret, 1, GP);
9624 ptr_table_store(PL_ptr_table, gp, ret);
9625
9626 /* clone */
9627 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
9628 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
9629 ret->gp_io = io_dup_inc(gp->gp_io, param);
9630 ret->gp_form = cv_dup_inc(gp->gp_form, param);
9631 ret->gp_av = av_dup_inc(gp->gp_av, param);
9632 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
9633 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
9634 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
9635 ret->gp_cvgen = gp->gp_cvgen;
9636 ret->gp_flags = gp->gp_flags;
9637 ret->gp_line = gp->gp_line;
9638 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
9639 return ret;
9640}
9641
645c22ef
DM
9642/* duplicate a chain of magic */
9643
1d7c1841 9644MAGIC *
a8fc9800 9645Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 9646{
cb359b41
JH
9647 MAGIC *mgprev = (MAGIC*)NULL;
9648 MAGIC *mgret;
1d7c1841
GS
9649 if (!mg)
9650 return (MAGIC*)NULL;
9651 /* look for it in the table first */
9652 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
9653 if (mgret)
9654 return mgret;
9655
9656 for (; mg; mg = mg->mg_moremagic) {
9657 MAGIC *nmg;
9658 Newz(0, nmg, 1, MAGIC);
cb359b41 9659 if (mgprev)
1d7c1841 9660 mgprev->mg_moremagic = nmg;
cb359b41
JH
9661 else
9662 mgret = nmg;
1d7c1841
GS
9663 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
9664 nmg->mg_private = mg->mg_private;
9665 nmg->mg_type = mg->mg_type;
9666 nmg->mg_flags = mg->mg_flags;
14befaf4 9667 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 9668 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 9669 }
05bd4103
JH
9670 else if(mg->mg_type == PERL_MAGIC_backref) {
9671 AV *av = (AV*) mg->mg_obj;
9672 SV **svp;
9673 I32 i;
9674 nmg->mg_obj = (SV*)newAV();
9675 svp = AvARRAY(av);
9676 i = AvFILLp(av);
9677 while (i >= 0) {
9678 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
9679 i--;
9680 }
9681 }
1d7c1841
GS
9682 else {
9683 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
9684 ? sv_dup_inc(mg->mg_obj, param)
9685 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
9686 }
9687 nmg->mg_len = mg->mg_len;
9688 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 9689 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 9690 if (mg->mg_len > 0) {
1d7c1841 9691 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
9692 if (mg->mg_type == PERL_MAGIC_overload_table &&
9693 AMT_AMAGIC((AMT*)mg->mg_ptr))
9694 {
1d7c1841
GS
9695 AMT *amtp = (AMT*)mg->mg_ptr;
9696 AMT *namtp = (AMT*)nmg->mg_ptr;
9697 I32 i;
9698 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 9699 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
9700 }
9701 }
9702 }
9703 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 9704 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 9705 }
68795e93
NIS
9706 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
9707 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
9708 }
1d7c1841
GS
9709 mgprev = nmg;
9710 }
9711 return mgret;
9712}
9713
645c22ef
DM
9714/* create a new pointer-mapping table */
9715
1d7c1841
GS
9716PTR_TBL_t *
9717Perl_ptr_table_new(pTHX)
9718{
9719 PTR_TBL_t *tbl;
9720 Newz(0, tbl, 1, PTR_TBL_t);
9721 tbl->tbl_max = 511;
9722 tbl->tbl_items = 0;
9723 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
9724 return tbl;
9725}
9726
645c22ef
DM
9727/* map an existing pointer using a table */
9728
1d7c1841
GS
9729void *
9730Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
9731{
9732 PTR_TBL_ENT_t *tblent;
d2a79402 9733 UV hash = PTR2UV(sv);
1d7c1841
GS
9734 assert(tbl);
9735 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
9736 for (; tblent; tblent = tblent->next) {
9737 if (tblent->oldval == sv)
9738 return tblent->newval;
9739 }
9740 return (void*)NULL;
9741}
9742
645c22ef
DM
9743/* add a new entry to a pointer-mapping table */
9744
1d7c1841
GS
9745void
9746Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
9747{
9748 PTR_TBL_ENT_t *tblent, **otblent;
9749 /* XXX this may be pessimal on platforms where pointers aren't good
9750 * hash values e.g. if they grow faster in the most significant
9751 * bits */
d2a79402 9752 UV hash = PTR2UV(oldv);
1d7c1841
GS
9753 bool i = 1;
9754
9755 assert(tbl);
9756 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
9757 for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
9758 if (tblent->oldval == oldv) {
9759 tblent->newval = newv;
1d7c1841
GS
9760 return;
9761 }
9762 }
9763 Newz(0, tblent, 1, PTR_TBL_ENT_t);
9764 tblent->oldval = oldv;
9765 tblent->newval = newv;
9766 tblent->next = *otblent;
9767 *otblent = tblent;
9768 tbl->tbl_items++;
9769 if (i && tbl->tbl_items > tbl->tbl_max)
9770 ptr_table_split(tbl);
9771}
9772
645c22ef
DM
9773/* double the hash bucket size of an existing ptr table */
9774
1d7c1841
GS
9775void
9776Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
9777{
9778 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
9779 UV oldsize = tbl->tbl_max + 1;
9780 UV newsize = oldsize * 2;
9781 UV i;
9782
9783 Renew(ary, newsize, PTR_TBL_ENT_t*);
9784 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
9785 tbl->tbl_max = --newsize;
9786 tbl->tbl_ary = ary;
9787 for (i=0; i < oldsize; i++, ary++) {
9788 PTR_TBL_ENT_t **curentp, **entp, *ent;
9789 if (!*ary)
9790 continue;
9791 curentp = ary + oldsize;
9792 for (entp = ary, ent = *ary; ent; ent = *entp) {
d2a79402 9793 if ((newsize & PTR2UV(ent->oldval)) != i) {
1d7c1841
GS
9794 *entp = ent->next;
9795 ent->next = *curentp;
9796 *curentp = ent;
9797 continue;
9798 }
9799 else
9800 entp = &ent->next;
9801 }
9802 }
9803}
9804
645c22ef
DM
9805/* remove all the entries from a ptr table */
9806
a0739874
DM
9807void
9808Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
9809{
9810 register PTR_TBL_ENT_t **array;
9811 register PTR_TBL_ENT_t *entry;
9812 register PTR_TBL_ENT_t *oentry = Null(PTR_TBL_ENT_t*);
9813 UV riter = 0;
9814 UV max;
9815
9816 if (!tbl || !tbl->tbl_items) {
9817 return;
9818 }
9819
9820 array = tbl->tbl_ary;
9821 entry = array[0];
9822 max = tbl->tbl_max;
9823
9824 for (;;) {
9825 if (entry) {
9826 oentry = entry;
9827 entry = entry->next;
9828 Safefree(oentry);
9829 }
9830 if (!entry) {
9831 if (++riter > max) {
9832 break;
9833 }
9834 entry = array[riter];
9835 }
9836 }
9837
9838 tbl->tbl_items = 0;
9839}
9840
645c22ef
DM
9841/* clear and free a ptr table */
9842
a0739874
DM
9843void
9844Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
9845{
9846 if (!tbl) {
9847 return;
9848 }
9849 ptr_table_clear(tbl);
9850 Safefree(tbl->tbl_ary);
9851 Safefree(tbl);
9852}
9853
1d7c1841
GS
9854#ifdef DEBUGGING
9855char *PL_watch_pvx;
9856#endif
9857
645c22ef
DM
9858/* attempt to make everything in the typeglob readonly */
9859
5bd07a3d 9860STATIC SV *
59b40662 9861S_gv_share(pTHX_ SV *sstr, CLONE_PARAMS *param)
5bd07a3d
DM
9862{
9863 GV *gv = (GV*)sstr;
59b40662 9864 SV *sv = &param->proto_perl->Isv_no; /* just need SvREADONLY-ness */
5bd07a3d
DM
9865
9866 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 9867 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
9868 }
9869 else if (!GvCV(gv)) {
9870 GvCV(gv) = (CV*)sv;
9871 }
9872 else {
9873 /* CvPADLISTs cannot be shared */
37e20706 9874 if (!SvREADONLY(GvCV(gv)) && !CvXSUB(GvCV(gv))) {
7fb37951 9875 GvUNIQUE_off(gv);
5bd07a3d
DM
9876 }
9877 }
9878
7fb37951 9879 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
9880#if 0
9881 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
9882 HvNAME(GvSTASH(gv)), GvNAME(gv));
9883#endif
9884 return Nullsv;
9885 }
9886
4411f3b6 9887 /*
5bd07a3d
DM
9888 * write attempts will die with
9889 * "Modification of a read-only value attempted"
9890 */
9891 if (!GvSV(gv)) {
9892 GvSV(gv) = sv;
9893 }
9894 else {
9895 SvREADONLY_on(GvSV(gv));
9896 }
9897
9898 if (!GvAV(gv)) {
9899 GvAV(gv) = (AV*)sv;
9900 }
9901 else {
9902 SvREADONLY_on(GvAV(gv));
9903 }
9904
9905 if (!GvHV(gv)) {
9906 GvHV(gv) = (HV*)sv;
9907 }
9908 else {
9909 SvREADONLY_on(GvAV(gv));
9910 }
9911
9912 return sstr; /* he_dup() will SvREFCNT_inc() */
9913}
9914
645c22ef
DM
9915/* duplicate an SV of any type (including AV, HV etc) */
9916
83841fad
NIS
9917void
9918Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
9919{
9920 if (SvROK(sstr)) {
d3d0e6f1 9921 SvRV(dstr) = SvWEAKREF(sstr)
83841fad
NIS
9922 ? sv_dup(SvRV(sstr), param)
9923 : sv_dup_inc(SvRV(sstr), param);
9924 }
9925 else if (SvPVX(sstr)) {
9926 /* Has something there */
9927 if (SvLEN(sstr)) {
68795e93 9928 /* Normal PV - clone whole allocated space */
83841fad 9929 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
d3d0e6f1
NC
9930 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
9931 /* Not that normal - actually sstr is copy on write.
9932 But we are a true, independant SV, so: */
9933 SvREADONLY_off(dstr);
9934 SvFAKE_off(dstr);
9935 }
68795e93 9936 }
83841fad
NIS
9937 else {
9938 /* Special case - not normally malloced for some reason */
9939 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
9940 /* A "shared" PV - clone it as unshared string */
281b2760 9941 if(SvPADTMP(sstr)) {
5e6160dc
AB
9942 /* However, some of them live in the pad
9943 and they should not have these flags
9944 turned off */
281b2760
AB
9945
9946 SvPVX(dstr) = sharepvn(SvPVX(sstr), SvCUR(sstr),
9947 SvUVX(sstr));
9948 SvUVX(dstr) = SvUVX(sstr);
9949 } else {
9950
9951 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvCUR(sstr));
9952 SvFAKE_off(dstr);
9953 SvREADONLY_off(dstr);
5e6160dc 9954 }
83841fad
NIS
9955 }
9956 else {
9957 /* Some other special case - random pointer */
9958 SvPVX(dstr) = SvPVX(sstr);
d3d0e6f1 9959 }
83841fad
NIS
9960 }
9961 }
9962 else {
9963 /* Copy the Null */
9964 SvPVX(dstr) = SvPVX(sstr);
9965 }
9966}
9967
1d7c1841 9968SV *
a8fc9800 9969Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
1d7c1841 9970{
1d7c1841
GS
9971 SV *dstr;
9972
9973 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
9974 return Nullsv;
9975 /* look for it in the table first */
9976 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
9977 if (dstr)
9978 return dstr;
9979
0405e91e
AB
9980 if(param->flags & CLONEf_JOIN_IN) {
9981 /** We are joining here so we don't want do clone
9982 something that is bad **/
9983
9984 if(SvTYPE(sstr) == SVt_PVHV &&
9985 HvNAME(sstr)) {
9986 /** don't clone stashes if they already exist **/
9987 HV* old_stash = gv_stashpv(HvNAME(sstr),0);
9988 return (SV*) old_stash;
9989 }
9990 }
9991
1d7c1841
GS
9992 /* create anew and remember what it is */
9993 new_SV(dstr);
9994 ptr_table_store(PL_ptr_table, sstr, dstr);
9995
9996 /* clone */
9997 SvFLAGS(dstr) = SvFLAGS(sstr);
9998 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
9999 SvREFCNT(dstr) = 0; /* must be before any other dups! */
10000
10001#ifdef DEBUGGING
10002 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
10003 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
10004 PL_watch_pvx, SvPVX(sstr));
10005#endif
10006
10007 switch (SvTYPE(sstr)) {
10008 case SVt_NULL:
10009 SvANY(dstr) = NULL;
10010 break;
10011 case SVt_IV:
10012 SvANY(dstr) = new_XIV();
10013 SvIVX(dstr) = SvIVX(sstr);
10014 break;
10015 case SVt_NV:
10016 SvANY(dstr) = new_XNV();
10017 SvNVX(dstr) = SvNVX(sstr);
10018 break;
10019 case SVt_RV:
10020 SvANY(dstr) = new_XRV();
83841fad 10021 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10022 break;
10023 case SVt_PV:
10024 SvANY(dstr) = new_XPV();
10025 SvCUR(dstr) = SvCUR(sstr);
10026 SvLEN(dstr) = SvLEN(sstr);
83841fad 10027 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10028 break;
10029 case SVt_PVIV:
10030 SvANY(dstr) = new_XPVIV();
10031 SvCUR(dstr) = SvCUR(sstr);
10032 SvLEN(dstr) = SvLEN(sstr);
10033 SvIVX(dstr) = SvIVX(sstr);
83841fad 10034 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10035 break;
10036 case SVt_PVNV:
10037 SvANY(dstr) = new_XPVNV();
10038 SvCUR(dstr) = SvCUR(sstr);
10039 SvLEN(dstr) = SvLEN(sstr);
10040 SvIVX(dstr) = SvIVX(sstr);
10041 SvNVX(dstr) = SvNVX(sstr);
83841fad 10042 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10043 break;
10044 case SVt_PVMG:
10045 SvANY(dstr) = new_XPVMG();
10046 SvCUR(dstr) = SvCUR(sstr);
10047 SvLEN(dstr) = SvLEN(sstr);
10048 SvIVX(dstr) = SvIVX(sstr);
10049 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10050 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10051 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10052 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10053 break;
10054 case SVt_PVBM:
10055 SvANY(dstr) = new_XPVBM();
10056 SvCUR(dstr) = SvCUR(sstr);
10057 SvLEN(dstr) = SvLEN(sstr);
10058 SvIVX(dstr) = SvIVX(sstr);
10059 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10060 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10061 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10062 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10063 BmRARE(dstr) = BmRARE(sstr);
10064 BmUSEFUL(dstr) = BmUSEFUL(sstr);
10065 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
10066 break;
10067 case SVt_PVLV:
10068 SvANY(dstr) = new_XPVLV();
10069 SvCUR(dstr) = SvCUR(sstr);
10070 SvLEN(dstr) = SvLEN(sstr);
10071 SvIVX(dstr) = SvIVX(sstr);
10072 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10073 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10074 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10075 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10076 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
10077 LvTARGLEN(dstr) = LvTARGLEN(sstr);
dd28f7bb
DM
10078 if (LvTYPE(sstr) == 't') /* for tie: unrefcnted fake (SV**) */
10079 LvTARG(dstr) = dstr;
10080 else if (LvTYPE(sstr) == 'T') /* for tie: fake HE */
10081 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(sstr), 0, param);
10082 else
10083 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr), param);
1d7c1841
GS
10084 LvTYPE(dstr) = LvTYPE(sstr);
10085 break;
10086 case SVt_PVGV:
7fb37951 10087 if (GvUNIQUE((GV*)sstr)) {
5bd07a3d 10088 SV *share;
59b40662 10089 if ((share = gv_share(sstr, param))) {
5bd07a3d
DM
10090 del_SV(dstr);
10091 dstr = share;
37e20706 10092 ptr_table_store(PL_ptr_table, sstr, dstr);
5bd07a3d
DM
10093#if 0
10094 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
10095 HvNAME(GvSTASH(share)), GvNAME(share));
10096#endif
10097 break;
10098 }
10099 }
1d7c1841
GS
10100 SvANY(dstr) = new_XPVGV();
10101 SvCUR(dstr) = SvCUR(sstr);
10102 SvLEN(dstr) = SvLEN(sstr);
10103 SvIVX(dstr) = SvIVX(sstr);
10104 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10105 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10106 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10107 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10108 GvNAMELEN(dstr) = GvNAMELEN(sstr);
10109 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
d2d73c3e 10110 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr), param);
1d7c1841 10111 GvFLAGS(dstr) = GvFLAGS(sstr);
d2d73c3e 10112 GvGP(dstr) = gp_dup(GvGP(sstr), param);
1d7c1841
GS
10113 (void)GpREFCNT_inc(GvGP(dstr));
10114 break;
10115 case SVt_PVIO:
10116 SvANY(dstr) = new_XPVIO();
10117 SvCUR(dstr) = SvCUR(sstr);
10118 SvLEN(dstr) = SvLEN(sstr);
10119 SvIVX(dstr) = SvIVX(sstr);
10120 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10121 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10122 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10123 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
a8fc9800 10124 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10125 if (IoOFP(sstr) == IoIFP(sstr))
10126 IoOFP(dstr) = IoIFP(dstr);
10127 else
a8fc9800 10128 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10129 /* PL_rsfp_filters entries have fake IoDIRP() */
10130 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
10131 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
10132 else
10133 IoDIRP(dstr) = IoDIRP(sstr);
10134 IoLINES(dstr) = IoLINES(sstr);
10135 IoPAGE(dstr) = IoPAGE(sstr);
10136 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
10137 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
5a37521b
AB
10138 if(IoFLAGS(sstr) & IOf_FAKE_DIRP) {
10139 /* I have no idea why fake dirp (rsfps)
10140 should be treaded differently but otherwise
10141 we end up with leaks -- sky*/
10142 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(sstr), param);
10143 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(sstr), param);
10144 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(sstr), param);
10145 } else {
10146 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr), param);
10147 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr), param);
10148 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr), param);
10149 }
1d7c1841 10150 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
1d7c1841 10151 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
1d7c1841 10152 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
1d7c1841
GS
10153 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
10154 IoTYPE(dstr) = IoTYPE(sstr);
10155 IoFLAGS(dstr) = IoFLAGS(sstr);
10156 break;
10157 case SVt_PVAV:
10158 SvANY(dstr) = new_XPVAV();
10159 SvCUR(dstr) = SvCUR(sstr);
10160 SvLEN(dstr) = SvLEN(sstr);
10161 SvIVX(dstr) = SvIVX(sstr);
10162 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10163 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10164 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
10165 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
1d7c1841
GS
10166 AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
10167 if (AvARRAY((AV*)sstr)) {
10168 SV **dst_ary, **src_ary;
10169 SSize_t items = AvFILLp((AV*)sstr) + 1;
10170
10171 src_ary = AvARRAY((AV*)sstr);
10172 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
10173 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
10174 SvPVX(dstr) = (char*)dst_ary;
10175 AvALLOC((AV*)dstr) = dst_ary;
10176 if (AvREAL((AV*)sstr)) {
10177 while (items-- > 0)
d2d73c3e 10178 *dst_ary++ = sv_dup_inc(*src_ary++, param);
1d7c1841
GS
10179 }
10180 else {
10181 while (items-- > 0)
d2d73c3e 10182 *dst_ary++ = sv_dup(*src_ary++, param);
1d7c1841
GS
10183 }
10184 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10185 while (items-- > 0) {
10186 *dst_ary++ = &PL_sv_undef;
10187 }
10188 }
10189 else {
10190 SvPVX(dstr) = Nullch;
10191 AvALLOC((AV*)dstr) = (SV**)NULL;
10192 }
10193 break;
10194 case SVt_PVHV:
10195 SvANY(dstr) = new_XPVHV();
10196 SvCUR(dstr) = SvCUR(sstr);
10197 SvLEN(dstr) = SvLEN(sstr);
10198 SvIVX(dstr) = SvIVX(sstr);
10199 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10200 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10201 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841
GS
10202 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
10203 if (HvARRAY((HV*)sstr)) {
1d7c1841
GS
10204 STRLEN i = 0;
10205 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
10206 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
10207 Newz(0, dxhv->xhv_array,
10208 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
10209 while (i <= sxhv->xhv_max) {
10210 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
eb160463
GS
10211 (bool)!!HvSHAREKEYS(sstr),
10212 param);
1d7c1841
GS
10213 ++i;
10214 }
eb160463
GS
10215 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter,
10216 (bool)!!HvSHAREKEYS(sstr), param);
1d7c1841
GS
10217 }
10218 else {
10219 SvPVX(dstr) = Nullch;
10220 HvEITER((HV*)dstr) = (HE*)NULL;
10221 }
10222 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
10223 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
c43294b8 10224 /* Record stashes for possible cloning in Perl_clone(). */
6676db26 10225 if(HvNAME((HV*)dstr))
d2d73c3e 10226 av_push(param->stashes, dstr);
1d7c1841
GS
10227 break;
10228 case SVt_PVFM:
10229 SvANY(dstr) = new_XPVFM();
10230 FmLINES(dstr) = FmLINES(sstr);
10231 goto dup_pvcv;
10232 /* NOTREACHED */
10233 case SVt_PVCV:
10234 SvANY(dstr) = new_XPVCV();
d2d73c3e 10235 dup_pvcv:
1d7c1841
GS
10236 SvCUR(dstr) = SvCUR(sstr);
10237 SvLEN(dstr) = SvLEN(sstr);
10238 SvIVX(dstr) = SvIVX(sstr);
10239 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10240 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10241 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10242 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
d2d73c3e 10243 CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
1d7c1841
GS
10244 CvSTART(dstr) = CvSTART(sstr);
10245 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
10246 CvXSUB(dstr) = CvXSUB(sstr);
10247 CvXSUBANY(dstr) = CvXSUBANY(sstr);
01485f8b
DM
10248 if (CvCONST(sstr)) {
10249 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
10250 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
10251 sv_dup_inc(CvXSUBANY(sstr).any_ptr, param);
10252 }
d2d73c3e
AB
10253 CvGV(dstr) = gv_dup(CvGV(sstr), param);
10254 if (param->flags & CLONEf_COPY_STACKS) {
10255 CvDEPTH(dstr) = CvDEPTH(sstr);
10256 } else {
10257 CvDEPTH(dstr) = 0;
10258 }
dd2155a4 10259 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
7dafbf52
DM
10260 CvOUTSIDE_SEQ(dstr) = CvOUTSIDE_SEQ(sstr);
10261 CvOUTSIDE(dstr) =
10262 CvWEAKOUTSIDE(sstr)
10263 ? cv_dup( CvOUTSIDE(sstr), param)
10264 : cv_dup_inc(CvOUTSIDE(sstr), param);
1d7c1841 10265 CvFLAGS(dstr) = CvFLAGS(sstr);
54356c7d 10266 CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
1d7c1841
GS
10267 break;
10268 default:
c803eecc 10269 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
1d7c1841
GS
10270 break;
10271 }
10272
10273 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
10274 ++PL_sv_objcount;
10275
10276 return dstr;
d2d73c3e 10277 }
1d7c1841 10278
645c22ef
DM
10279/* duplicate a context */
10280
1d7c1841 10281PERL_CONTEXT *
a8fc9800 10282Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
10283{
10284 PERL_CONTEXT *ncxs;
10285
10286 if (!cxs)
10287 return (PERL_CONTEXT*)NULL;
10288
10289 /* look for it in the table first */
10290 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
10291 if (ncxs)
10292 return ncxs;
10293
10294 /* create anew and remember what it is */
10295 Newz(56, ncxs, max + 1, PERL_CONTEXT);
10296 ptr_table_store(PL_ptr_table, cxs, ncxs);
10297
10298 while (ix >= 0) {
10299 PERL_CONTEXT *cx = &cxs[ix];
10300 PERL_CONTEXT *ncx = &ncxs[ix];
10301 ncx->cx_type = cx->cx_type;
10302 if (CxTYPE(cx) == CXt_SUBST) {
10303 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
10304 }
10305 else {
10306 ncx->blk_oldsp = cx->blk_oldsp;
10307 ncx->blk_oldcop = cx->blk_oldcop;
10308 ncx->blk_oldretsp = cx->blk_oldretsp;
10309 ncx->blk_oldmarksp = cx->blk_oldmarksp;
10310 ncx->blk_oldscopesp = cx->blk_oldscopesp;
10311 ncx->blk_oldpm = cx->blk_oldpm;
10312 ncx->blk_gimme = cx->blk_gimme;
10313 switch (CxTYPE(cx)) {
10314 case CXt_SUB:
10315 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
10316 ? cv_dup_inc(cx->blk_sub.cv, param)
10317 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 10318 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 10319 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 10320 : Nullav);
d2d73c3e 10321 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
10322 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
10323 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10324 ncx->blk_sub.lval = cx->blk_sub.lval;
10325 break;
10326 case CXt_EVAL:
10327 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
10328 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 10329 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 10330 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 10331 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
1d7c1841
GS
10332 break;
10333 case CXt_LOOP:
10334 ncx->blk_loop.label = cx->blk_loop.label;
10335 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
10336 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
10337 ncx->blk_loop.next_op = cx->blk_loop.next_op;
10338 ncx->blk_loop.last_op = cx->blk_loop.last_op;
10339 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
10340 ? cx->blk_loop.iterdata
d2d73c3e 10341 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
10342 ncx->blk_loop.oldcomppad
10343 = (PAD*)ptr_table_fetch(PL_ptr_table,
10344 cx->blk_loop.oldcomppad);
d2d73c3e
AB
10345 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
10346 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
10347 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
10348 ncx->blk_loop.iterix = cx->blk_loop.iterix;
10349 ncx->blk_loop.itermax = cx->blk_loop.itermax;
10350 break;
10351 case CXt_FORMAT:
d2d73c3e
AB
10352 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
10353 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
10354 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841
GS
10355 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10356 break;
10357 case CXt_BLOCK:
10358 case CXt_NULL:
10359 break;
10360 }
10361 }
10362 --ix;
10363 }
10364 return ncxs;
10365}
10366
645c22ef
DM
10367/* duplicate a stack info structure */
10368
1d7c1841 10369PERL_SI *
a8fc9800 10370Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
10371{
10372 PERL_SI *nsi;
10373
10374 if (!si)
10375 return (PERL_SI*)NULL;
10376
10377 /* look for it in the table first */
10378 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
10379 if (nsi)
10380 return nsi;
10381
10382 /* create anew and remember what it is */
10383 Newz(56, nsi, 1, PERL_SI);
10384 ptr_table_store(PL_ptr_table, si, nsi);
10385
d2d73c3e 10386 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
10387 nsi->si_cxix = si->si_cxix;
10388 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 10389 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 10390 nsi->si_type = si->si_type;
d2d73c3e
AB
10391 nsi->si_prev = si_dup(si->si_prev, param);
10392 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
10393 nsi->si_markoff = si->si_markoff;
10394
10395 return nsi;
10396}
10397
10398#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
10399#define TOPINT(ss,ix) ((ss)[ix].any_i32)
10400#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
10401#define TOPLONG(ss,ix) ((ss)[ix].any_long)
10402#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
10403#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
10404#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
10405#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
10406#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
10407#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
10408#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
10409#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
10410#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
10411#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
10412
10413/* XXXXX todo */
10414#define pv_dup_inc(p) SAVEPV(p)
10415#define pv_dup(p) SAVEPV(p)
10416#define svp_dup_inc(p,pp) any_dup(p,pp)
10417
645c22ef
DM
10418/* map any object to the new equivent - either something in the
10419 * ptr table, or something in the interpreter structure
10420 */
10421
1d7c1841
GS
10422void *
10423Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
10424{
10425 void *ret;
10426
10427 if (!v)
10428 return (void*)NULL;
10429
10430 /* look for it in the table first */
10431 ret = ptr_table_fetch(PL_ptr_table, v);
10432 if (ret)
10433 return ret;
10434
10435 /* see if it is part of the interpreter structure */
10436 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 10437 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 10438 else {
1d7c1841 10439 ret = v;
05ec9bb3 10440 }
1d7c1841
GS
10441
10442 return ret;
10443}
10444
645c22ef
DM
10445/* duplicate the save stack */
10446
1d7c1841 10447ANY *
a8fc9800 10448Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841
GS
10449{
10450 ANY *ss = proto_perl->Tsavestack;
10451 I32 ix = proto_perl->Tsavestack_ix;
10452 I32 max = proto_perl->Tsavestack_max;
10453 ANY *nss;
10454 SV *sv;
10455 GV *gv;
10456 AV *av;
10457 HV *hv;
10458 void* ptr;
10459 int intval;
10460 long longval;
10461 GP *gp;
10462 IV iv;
10463 I32 i;
c4e33207 10464 char *c = NULL;
1d7c1841 10465 void (*dptr) (void*);
acfe0abc 10466 void (*dxptr) (pTHX_ void*);
e977893f 10467 OP *o;
1d7c1841
GS
10468
10469 Newz(54, nss, max, ANY);
10470
10471 while (ix > 0) {
10472 i = POPINT(ss,ix);
10473 TOPINT(nss,ix) = i;
10474 switch (i) {
10475 case SAVEt_ITEM: /* normal string */
10476 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10477 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10478 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10479 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10480 break;
10481 case SAVEt_SV: /* scalar reference */
10482 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10483 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10484 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10485 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 10486 break;
f4dd75d9
GS
10487 case SAVEt_GENERIC_PVREF: /* generic char* */
10488 c = (char*)POPPTR(ss,ix);
10489 TOPPTR(nss,ix) = pv_dup(c);
10490 ptr = POPPTR(ss,ix);
10491 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10492 break;
05ec9bb3
NIS
10493 case SAVEt_SHARED_PVREF: /* char* in shared space */
10494 c = (char*)POPPTR(ss,ix);
10495 TOPPTR(nss,ix) = savesharedpv(c);
10496 ptr = POPPTR(ss,ix);
10497 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10498 break;
1d7c1841
GS
10499 case SAVEt_GENERIC_SVREF: /* generic sv */
10500 case SAVEt_SVREF: /* scalar reference */
10501 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10502 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10503 ptr = POPPTR(ss,ix);
10504 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
10505 break;
10506 case SAVEt_AV: /* array reference */
10507 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10508 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 10509 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10510 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10511 break;
10512 case SAVEt_HV: /* hash reference */
10513 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10514 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 10515 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10516 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10517 break;
10518 case SAVEt_INT: /* int reference */
10519 ptr = POPPTR(ss,ix);
10520 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10521 intval = (int)POPINT(ss,ix);
10522 TOPINT(nss,ix) = intval;
10523 break;
10524 case SAVEt_LONG: /* long reference */
10525 ptr = POPPTR(ss,ix);
10526 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10527 longval = (long)POPLONG(ss,ix);
10528 TOPLONG(nss,ix) = longval;
10529 break;
10530 case SAVEt_I32: /* I32 reference */
10531 case SAVEt_I16: /* I16 reference */
10532 case SAVEt_I8: /* I8 reference */
10533 ptr = POPPTR(ss,ix);
10534 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10535 i = POPINT(ss,ix);
10536 TOPINT(nss,ix) = i;
10537 break;
10538 case SAVEt_IV: /* IV reference */
10539 ptr = POPPTR(ss,ix);
10540 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10541 iv = POPIV(ss,ix);
10542 TOPIV(nss,ix) = iv;
10543 break;
10544 case SAVEt_SPTR: /* SV* reference */
10545 ptr = POPPTR(ss,ix);
10546 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10547 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10548 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
10549 break;
10550 case SAVEt_VPTR: /* random* reference */
10551 ptr = POPPTR(ss,ix);
10552 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10553 ptr = POPPTR(ss,ix);
10554 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10555 break;
10556 case SAVEt_PPTR: /* char* reference */
10557 ptr = POPPTR(ss,ix);
10558 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10559 c = (char*)POPPTR(ss,ix);
10560 TOPPTR(nss,ix) = pv_dup(c);
10561 break;
10562 case SAVEt_HPTR: /* HV* reference */
10563 ptr = POPPTR(ss,ix);
10564 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10565 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10566 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
10567 break;
10568 case SAVEt_APTR: /* AV* reference */
10569 ptr = POPPTR(ss,ix);
10570 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10571 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10572 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
10573 break;
10574 case SAVEt_NSTAB:
10575 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10576 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10577 break;
10578 case SAVEt_GP: /* scalar reference */
10579 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 10580 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
10581 (void)GpREFCNT_inc(gp);
10582 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 10583 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
10584 c = (char*)POPPTR(ss,ix);
10585 TOPPTR(nss,ix) = pv_dup(c);
10586 iv = POPIV(ss,ix);
10587 TOPIV(nss,ix) = iv;
10588 iv = POPIV(ss,ix);
10589 TOPIV(nss,ix) = iv;
10590 break;
10591 case SAVEt_FREESV:
26d9b02f 10592 case SAVEt_MORTALIZESV:
1d7c1841 10593 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10594 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10595 break;
10596 case SAVEt_FREEOP:
10597 ptr = POPPTR(ss,ix);
10598 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
10599 /* these are assumed to be refcounted properly */
10600 switch (((OP*)ptr)->op_type) {
10601 case OP_LEAVESUB:
10602 case OP_LEAVESUBLV:
10603 case OP_LEAVEEVAL:
10604 case OP_LEAVE:
10605 case OP_SCOPE:
10606 case OP_LEAVEWRITE:
e977893f
GS
10607 TOPPTR(nss,ix) = ptr;
10608 o = (OP*)ptr;
10609 OpREFCNT_inc(o);
1d7c1841
GS
10610 break;
10611 default:
10612 TOPPTR(nss,ix) = Nullop;
10613 break;
10614 }
10615 }
10616 else
10617 TOPPTR(nss,ix) = Nullop;
10618 break;
10619 case SAVEt_FREEPV:
10620 c = (char*)POPPTR(ss,ix);
10621 TOPPTR(nss,ix) = pv_dup_inc(c);
10622 break;
10623 case SAVEt_CLEARSV:
10624 longval = POPLONG(ss,ix);
10625 TOPLONG(nss,ix) = longval;
10626 break;
10627 case SAVEt_DELETE:
10628 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10629 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10630 c = (char*)POPPTR(ss,ix);
10631 TOPPTR(nss,ix) = pv_dup_inc(c);
10632 i = POPINT(ss,ix);
10633 TOPINT(nss,ix) = i;
10634 break;
10635 case SAVEt_DESTRUCTOR:
10636 ptr = POPPTR(ss,ix);
10637 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10638 dptr = POPDPTR(ss,ix);
ef75a179 10639 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
10640 break;
10641 case SAVEt_DESTRUCTOR_X:
10642 ptr = POPPTR(ss,ix);
10643 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10644 dxptr = POPDXPTR(ss,ix);
acfe0abc 10645 TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
10646 break;
10647 case SAVEt_REGCONTEXT:
10648 case SAVEt_ALLOC:
10649 i = POPINT(ss,ix);
10650 TOPINT(nss,ix) = i;
10651 ix -= i;
10652 break;
10653 case SAVEt_STACK_POS: /* Position on Perl stack */
10654 i = POPINT(ss,ix);
10655 TOPINT(nss,ix) = i;
10656 break;
10657 case SAVEt_AELEM: /* array element */
10658 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10659 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10660 i = POPINT(ss,ix);
10661 TOPINT(nss,ix) = i;
10662 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10663 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
10664 break;
10665 case SAVEt_HELEM: /* hash element */
10666 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10667 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10668 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10669 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10670 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10671 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10672 break;
10673 case SAVEt_OP:
10674 ptr = POPPTR(ss,ix);
10675 TOPPTR(nss,ix) = ptr;
10676 break;
10677 case SAVEt_HINTS:
10678 i = POPINT(ss,ix);
10679 TOPINT(nss,ix) = i;
10680 break;
c4410b1b
GS
10681 case SAVEt_COMPPAD:
10682 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10683 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 10684 break;
c3564e5c
GS
10685 case SAVEt_PADSV:
10686 longval = (long)POPLONG(ss,ix);
10687 TOPLONG(nss,ix) = longval;
10688 ptr = POPPTR(ss,ix);
10689 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10690 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10691 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 10692 break;
a1bb4754 10693 case SAVEt_BOOL:
38d8b13e 10694 ptr = POPPTR(ss,ix);
b9609c01 10695 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 10696 longval = (long)POPBOOL(ss,ix);
b9609c01 10697 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 10698 break;
1d7c1841
GS
10699 default:
10700 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
10701 }
10702 }
10703
10704 return nss;
10705}
10706
645c22ef
DM
10707/*
10708=for apidoc perl_clone
10709
10710Create and return a new interpreter by cloning the current one.
10711
6a78b4db
AB
10712perl_clone takes these flags as paramters:
10713
10714CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
10715without it we only clone the data and zero the stacks,
10716with it we copy the stacks and the new perl interpreter is
10717ready to run at the exact same point as the previous one.
10718The pseudo-fork code uses COPY_STACKS while the
10719threads->new doesn't.
10720
10721CLONEf_KEEP_PTR_TABLE
10722perl_clone keeps a ptr_table with the pointer of the old
10723variable as a key and the new variable as a value,
10724this allows it to check if something has been cloned and not
10725clone it again but rather just use the value and increase the
10726refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
10727the ptr_table using the function
10728C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
10729reason to keep it around is if you want to dup some of your own
10730variable who are outside the graph perl scans, example of this
10731code is in threads.xs create
10732
10733CLONEf_CLONE_HOST
10734This is a win32 thing, it is ignored on unix, it tells perls
10735win32host code (which is c++) to clone itself, this is needed on
10736win32 if you want to run two threads at the same time,
10737if you just want to do some stuff in a separate perl interpreter
10738and then throw it away and return to the original one,
10739you don't need to do anything.
10740
645c22ef
DM
10741=cut
10742*/
10743
10744/* XXX the above needs expanding by someone who actually understands it ! */
3fc56081
NK
10745EXTERN_C PerlInterpreter *
10746perl_clone_host(PerlInterpreter* proto_perl, UV flags);
645c22ef 10747
1d7c1841
GS
10748PerlInterpreter *
10749perl_clone(PerlInterpreter *proto_perl, UV flags)
10750{
1d7c1841 10751#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
10752
10753 /* perlhost.h so we need to call into it
10754 to clone the host, CPerlHost should have a c interface, sky */
10755
10756 if (flags & CLONEf_CLONE_HOST) {
10757 return perl_clone_host(proto_perl,flags);
10758 }
10759 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
10760 proto_perl->IMem,
10761 proto_perl->IMemShared,
10762 proto_perl->IMemParse,
10763 proto_perl->IEnv,
10764 proto_perl->IStdIO,
10765 proto_perl->ILIO,
10766 proto_perl->IDir,
10767 proto_perl->ISock,
10768 proto_perl->IProc);
10769}
10770
10771PerlInterpreter *
10772perl_clone_using(PerlInterpreter *proto_perl, UV flags,
10773 struct IPerlMem* ipM, struct IPerlMem* ipMS,
10774 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
10775 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
10776 struct IPerlDir* ipD, struct IPerlSock* ipS,
10777 struct IPerlProc* ipP)
10778{
10779 /* XXX many of the string copies here can be optimized if they're
10780 * constants; they need to be allocated as common memory and just
10781 * their pointers copied. */
10782
10783 IV i;
64aa0685
GS
10784 CLONE_PARAMS clone_params;
10785 CLONE_PARAMS* param = &clone_params;
d2d73c3e 10786
1d7c1841 10787 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
ba869deb 10788 PERL_SET_THX(my_perl);
1d7c1841 10789
acfe0abc 10790# ifdef DEBUGGING
a4530404 10791 Poison(my_perl, 1, PerlInterpreter);
1d7c1841
GS
10792 PL_markstack = 0;
10793 PL_scopestack = 0;
10794 PL_savestack = 0;
22f7c9c9
JH
10795 PL_savestack_ix = 0;
10796 PL_savestack_max = -1;
1d7c1841 10797 PL_retstack = 0;
66fe0623 10798 PL_sig_pending = 0;
25596c82 10799 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
acfe0abc 10800# else /* !DEBUGGING */
1d7c1841 10801 Zero(my_perl, 1, PerlInterpreter);
acfe0abc 10802# endif /* DEBUGGING */
1d7c1841
GS
10803
10804 /* host pointers */
10805 PL_Mem = ipM;
10806 PL_MemShared = ipMS;
10807 PL_MemParse = ipMP;
10808 PL_Env = ipE;
10809 PL_StdIO = ipStd;
10810 PL_LIO = ipLIO;
10811 PL_Dir = ipD;
10812 PL_Sock = ipS;
10813 PL_Proc = ipP;
1d7c1841
GS
10814#else /* !PERL_IMPLICIT_SYS */
10815 IV i;
64aa0685
GS
10816 CLONE_PARAMS clone_params;
10817 CLONE_PARAMS* param = &clone_params;
1d7c1841 10818 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 10819 PERL_SET_THX(my_perl);
1d7c1841 10820
d2d73c3e
AB
10821
10822
1d7c1841 10823# ifdef DEBUGGING
a4530404 10824 Poison(my_perl, 1, PerlInterpreter);
1d7c1841
GS
10825 PL_markstack = 0;
10826 PL_scopestack = 0;
10827 PL_savestack = 0;
22f7c9c9
JH
10828 PL_savestack_ix = 0;
10829 PL_savestack_max = -1;
1d7c1841 10830 PL_retstack = 0;
66fe0623 10831 PL_sig_pending = 0;
25596c82 10832 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
1d7c1841
GS
10833# else /* !DEBUGGING */
10834 Zero(my_perl, 1, PerlInterpreter);
10835# endif /* DEBUGGING */
10836#endif /* PERL_IMPLICIT_SYS */
83236556 10837 param->flags = flags;
59b40662 10838 param->proto_perl = proto_perl;
1d7c1841
GS
10839
10840 /* arena roots */
10841 PL_xiv_arenaroot = NULL;
10842 PL_xiv_root = NULL;
612f20c3 10843 PL_xnv_arenaroot = NULL;
1d7c1841 10844 PL_xnv_root = NULL;
612f20c3 10845 PL_xrv_arenaroot = NULL;
1d7c1841 10846 PL_xrv_root = NULL;
612f20c3 10847 PL_xpv_arenaroot = NULL;
1d7c1841 10848 PL_xpv_root = NULL;
612f20c3 10849 PL_xpviv_arenaroot = NULL;
1d7c1841 10850 PL_xpviv_root = NULL;
612f20c3 10851 PL_xpvnv_arenaroot = NULL;
1d7c1841 10852 PL_xpvnv_root = NULL;
612f20c3 10853 PL_xpvcv_arenaroot = NULL;
1d7c1841 10854 PL_xpvcv_root = NULL;
612f20c3 10855 PL_xpvav_arenaroot = NULL;
1d7c1841 10856 PL_xpvav_root = NULL;
612f20c3 10857 PL_xpvhv_arenaroot = NULL;
1d7c1841 10858 PL_xpvhv_root = NULL;
612f20c3 10859 PL_xpvmg_arenaroot = NULL;
1d7c1841 10860 PL_xpvmg_root = NULL;
612f20c3 10861 PL_xpvlv_arenaroot = NULL;
1d7c1841 10862 PL_xpvlv_root = NULL;
612f20c3 10863 PL_xpvbm_arenaroot = NULL;
1d7c1841 10864 PL_xpvbm_root = NULL;
612f20c3 10865 PL_he_arenaroot = NULL;
1d7c1841
GS
10866 PL_he_root = NULL;
10867 PL_nice_chunk = NULL;
10868 PL_nice_chunk_size = 0;
10869 PL_sv_count = 0;
10870 PL_sv_objcount = 0;
10871 PL_sv_root = Nullsv;
10872 PL_sv_arenaroot = Nullsv;
10873
10874 PL_debug = proto_perl->Idebug;
10875
e5dd39fc 10876#ifdef USE_REENTRANT_API
59bd0823 10877 Perl_reentrant_init(aTHX);
e5dd39fc
AB
10878#endif
10879
1d7c1841
GS
10880 /* create SV map for pointer relocation */
10881 PL_ptr_table = ptr_table_new();
10882
10883 /* initialize these special pointers as early as possible */
10884 SvANY(&PL_sv_undef) = NULL;
10885 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
10886 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
10887 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
10888
1d7c1841 10889 SvANY(&PL_sv_no) = new_XPVNV();
1d7c1841
GS
10890 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
10891 SvFLAGS(&PL_sv_no) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
10892 SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
10893 SvCUR(&PL_sv_no) = 0;
10894 SvLEN(&PL_sv_no) = 1;
10895 SvNVX(&PL_sv_no) = 0;
10896 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
10897
1d7c1841 10898 SvANY(&PL_sv_yes) = new_XPVNV();
1d7c1841
GS
10899 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
10900 SvFLAGS(&PL_sv_yes) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
10901 SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
10902 SvCUR(&PL_sv_yes) = 1;
10903 SvLEN(&PL_sv_yes) = 2;
10904 SvNVX(&PL_sv_yes) = 1;
10905 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
10906
05ec9bb3 10907 /* create (a non-shared!) shared string table */
1d7c1841
GS
10908 PL_strtab = newHV();
10909 HvSHAREKEYS_off(PL_strtab);
10910 hv_ksplit(PL_strtab, 512);
10911 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
10912
05ec9bb3
NIS
10913 PL_compiling = proto_perl->Icompiling;
10914
10915 /* These two PVs will be free'd special way so must set them same way op.c does */
10916 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
10917 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
10918
10919 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
10920 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
10921
1d7c1841
GS
10922 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
10923 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 10924 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 10925 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 10926 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
10927 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
10928
10929 /* pseudo environmental stuff */
10930 PL_origargc = proto_perl->Iorigargc;
e2975953 10931 PL_origargv = proto_perl->Iorigargv;
d2d73c3e 10932
d2d73c3e
AB
10933 param->stashes = newAV(); /* Setup array of objects to call clone on */
10934
a1ea730d 10935#ifdef PERLIO_LAYERS
3a1ee7e8
NIS
10936 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
10937 PerlIO_clone(aTHX_ proto_perl, param);
a1ea730d 10938#endif
d2d73c3e
AB
10939
10940 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
10941 PL_incgv = gv_dup(proto_perl->Iincgv, param);
10942 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 10943 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
10944 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
10945 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
10946
10947 /* switches */
10948 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 10949 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
10950 PL_localpatches = proto_perl->Ilocalpatches;
10951 PL_splitstr = proto_perl->Isplitstr;
10952 PL_preprocess = proto_perl->Ipreprocess;
10953 PL_minus_n = proto_perl->Iminus_n;
10954 PL_minus_p = proto_perl->Iminus_p;
10955 PL_minus_l = proto_perl->Iminus_l;
10956 PL_minus_a = proto_perl->Iminus_a;
10957 PL_minus_F = proto_perl->Iminus_F;
10958 PL_doswitches = proto_perl->Idoswitches;
10959 PL_dowarn = proto_perl->Idowarn;
10960 PL_doextract = proto_perl->Idoextract;
10961 PL_sawampersand = proto_perl->Isawampersand;
10962 PL_unsafe = proto_perl->Iunsafe;
10963 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 10964 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
10965 PL_perldb = proto_perl->Iperldb;
10966 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
1cbb0781 10967 PL_exit_flags = proto_perl->Iexit_flags;
1d7c1841
GS
10968
10969 /* magical thingies */
10970 /* XXX time(&PL_basetime) when asked for? */
10971 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 10972 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
10973
10974 PL_maxsysfd = proto_perl->Imaxsysfd;
10975 PL_multiline = proto_perl->Imultiline;
10976 PL_statusvalue = proto_perl->Istatusvalue;
10977#ifdef VMS
10978 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
10979#endif
0a378802 10980 PL_encoding = sv_dup(proto_perl->Iencoding, param);
1d7c1841 10981
4a4c6fe3 10982 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
1f483ca1
JH
10983 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
10984 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
4a4c6fe3 10985
d2f185dc
AMS
10986 /* Clone the regex array */
10987 PL_regex_padav = newAV();
10988 {
10989 I32 len = av_len((AV*)proto_perl->Iregex_padav);
10990 SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
0f95fc41
AB
10991 av_push(PL_regex_padav,
10992 sv_dup_inc(regexen[0],param));
10993 for(i = 1; i <= len; i++) {
10994 if(SvREPADTMP(regexen[i])) {
10995 av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
8cf8f3d1 10996 } else {
0f95fc41
AB
10997 av_push(PL_regex_padav,
10998 SvREFCNT_inc(
8cf8f3d1 10999 newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
cbfa9890 11000 SvIVX(regexen[i])), param)))
0f95fc41
AB
11001 ));
11002 }
d2f185dc
AMS
11003 }
11004 }
11005 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 11006
1d7c1841 11007 /* shortcuts to various I/O objects */
d2d73c3e
AB
11008 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
11009 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
11010 PL_defgv = gv_dup(proto_perl->Idefgv, param);
11011 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
11012 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
11013 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
11014
11015 /* shortcuts to regexp stuff */
d2d73c3e 11016 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
11017
11018 /* shortcuts to misc objects */
d2d73c3e 11019 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
11020
11021 /* shortcuts to debugging objects */
d2d73c3e
AB
11022 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
11023 PL_DBline = gv_dup(proto_perl->IDBline, param);
11024 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
11025 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
11026 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
11027 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
06492da6 11028 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
d2d73c3e
AB
11029 PL_lineary = av_dup(proto_perl->Ilineary, param);
11030 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
11031
11032 /* symbol tables */
d2d73c3e
AB
11033 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
11034 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
d2d73c3e
AB
11035 PL_debstash = hv_dup(proto_perl->Idebstash, param);
11036 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
11037 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
11038
11039 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
ee1c5a4e 11040 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
ece599bd 11041 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
d2d73c3e
AB
11042 PL_endav = av_dup_inc(proto_perl->Iendav, param);
11043 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
11044 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
11045
11046 PL_sub_generation = proto_perl->Isub_generation;
11047
11048 /* funky return mechanisms */
11049 PL_forkprocess = proto_perl->Iforkprocess;
11050
11051 /* subprocess state */
d2d73c3e 11052 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
11053
11054 /* internal state */
11055 PL_tainting = proto_perl->Itainting;
7135f00b 11056 PL_taint_warn = proto_perl->Itaint_warn;
1d7c1841
GS
11057 PL_maxo = proto_perl->Imaxo;
11058 if (proto_perl->Iop_mask)
11059 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11060 else
11061 PL_op_mask = Nullch;
06492da6 11062 /* PL_asserting = proto_perl->Iasserting; */
1d7c1841
GS
11063
11064 /* current interpreter roots */
d2d73c3e 11065 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
11066 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
11067 PL_main_start = proto_perl->Imain_start;
e977893f 11068 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
11069 PL_eval_start = proto_perl->Ieval_start;
11070
11071 /* runtime control stuff */
11072 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
11073 PL_copline = proto_perl->Icopline;
11074
11075 PL_filemode = proto_perl->Ifilemode;
11076 PL_lastfd = proto_perl->Ilastfd;
11077 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
11078 PL_Argv = NULL;
11079 PL_Cmd = Nullch;
11080 PL_gensym = proto_perl->Igensym;
11081 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 11082 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
11083 PL_laststatval = proto_perl->Ilaststatval;
11084 PL_laststype = proto_perl->Ilaststype;
11085 PL_mess_sv = Nullsv;
11086
d2d73c3e 11087 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
11088 PL_ofmt = SAVEPV(proto_perl->Iofmt);
11089
11090 /* interpreter atexit processing */
11091 PL_exitlistlen = proto_perl->Iexitlistlen;
11092 if (PL_exitlistlen) {
11093 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11094 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11095 }
11096 else
11097 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 11098 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
19e8ce8e
AB
11099 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
11100 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1d7c1841
GS
11101
11102 PL_profiledata = NULL;
a8fc9800 11103 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
1d7c1841 11104 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 11105 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 11106
d2d73c3e 11107 PL_compcv = cv_dup(proto_perl->Icompcv, param);
dd2155a4
DM
11108
11109 PAD_CLONE_VARS(proto_perl, param);
1d7c1841
GS
11110
11111#ifdef HAVE_INTERP_INTERN
11112 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11113#endif
11114
11115 /* more statics moved here */
11116 PL_generation = proto_perl->Igeneration;
d2d73c3e 11117 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
11118
11119 PL_in_clean_objs = proto_perl->Iin_clean_objs;
11120 PL_in_clean_all = proto_perl->Iin_clean_all;
11121
11122 PL_uid = proto_perl->Iuid;
11123 PL_euid = proto_perl->Ieuid;
11124 PL_gid = proto_perl->Igid;
11125 PL_egid = proto_perl->Iegid;
11126 PL_nomemok = proto_perl->Inomemok;
11127 PL_an = proto_perl->Ian;
1d7c1841
GS
11128 PL_op_seqmax = proto_perl->Iop_seqmax;
11129 PL_evalseq = proto_perl->Ievalseq;
11130 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
11131 PL_origalen = proto_perl->Iorigalen;
11132 PL_pidstatus = newHV(); /* XXX flag for cloning? */
11133 PL_osname = SAVEPV(proto_perl->Iosname);
5c728af0 11134 PL_sh_path_compat = proto_perl->Ish_path_compat; /* XXX never deallocated */
1d7c1841
GS
11135 PL_sighandlerp = proto_perl->Isighandlerp;
11136
11137
11138 PL_runops = proto_perl->Irunops;
11139
11140 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
11141
11142#ifdef CSH
11143 PL_cshlen = proto_perl->Icshlen;
74f1b2b8 11144 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
1d7c1841
GS
11145#endif
11146
11147 PL_lex_state = proto_perl->Ilex_state;
11148 PL_lex_defer = proto_perl->Ilex_defer;
11149 PL_lex_expect = proto_perl->Ilex_expect;
11150 PL_lex_formbrack = proto_perl->Ilex_formbrack;
11151 PL_lex_dojoin = proto_perl->Ilex_dojoin;
11152 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
11153 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
11154 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
11155 PL_lex_op = proto_perl->Ilex_op;
11156 PL_lex_inpat = proto_perl->Ilex_inpat;
11157 PL_lex_inwhat = proto_perl->Ilex_inwhat;
11158 PL_lex_brackets = proto_perl->Ilex_brackets;
11159 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
11160 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
11161 PL_lex_casemods = proto_perl->Ilex_casemods;
11162 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
11163 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
11164
11165 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
11166 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
11167 PL_nexttoke = proto_perl->Inexttoke;
11168
1d773130
TB
11169 /* XXX This is probably masking the deeper issue of why
11170 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
11171 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
11172 * (A little debugging with a watchpoint on it may help.)
11173 */
389edf32
TB
11174 if (SvANY(proto_perl->Ilinestr)) {
11175 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
11176 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
11177 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11178 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
11179 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11180 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
11181 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11182 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
11183 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11184 }
11185 else {
11186 PL_linestr = NEWSV(65,79);
11187 sv_upgrade(PL_linestr,SVt_PVIV);
11188 sv_setpvn(PL_linestr,"",0);
11189 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
11190 }
1d7c1841 11191 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1d7c1841
GS
11192 PL_pending_ident = proto_perl->Ipending_ident;
11193 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
11194
11195 PL_expect = proto_perl->Iexpect;
11196
11197 PL_multi_start = proto_perl->Imulti_start;
11198 PL_multi_end = proto_perl->Imulti_end;
11199 PL_multi_open = proto_perl->Imulti_open;
11200 PL_multi_close = proto_perl->Imulti_close;
11201
11202 PL_error_count = proto_perl->Ierror_count;
11203 PL_subline = proto_perl->Isubline;
d2d73c3e 11204 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841 11205
1d773130 11206 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
389edf32
TB
11207 if (SvANY(proto_perl->Ilinestr)) {
11208 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
11209 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11210 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
11211 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11212 PL_last_lop_op = proto_perl->Ilast_lop_op;
11213 }
11214 else {
11215 PL_last_uni = SvPVX(PL_linestr);
11216 PL_last_lop = SvPVX(PL_linestr);
11217 PL_last_lop_op = 0;
11218 }
1d7c1841 11219 PL_in_my = proto_perl->Iin_my;
d2d73c3e 11220 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
11221#ifdef FCRYPT
11222 PL_cryptseen = proto_perl->Icryptseen;
11223#endif
11224
11225 PL_hints = proto_perl->Ihints;
11226
11227 PL_amagic_generation = proto_perl->Iamagic_generation;
11228
11229#ifdef USE_LOCALE_COLLATE
11230 PL_collation_ix = proto_perl->Icollation_ix;
11231 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
11232 PL_collation_standard = proto_perl->Icollation_standard;
11233 PL_collxfrm_base = proto_perl->Icollxfrm_base;
11234 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
11235#endif /* USE_LOCALE_COLLATE */
11236
11237#ifdef USE_LOCALE_NUMERIC
11238 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
11239 PL_numeric_standard = proto_perl->Inumeric_standard;
11240 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 11241 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
11242#endif /* !USE_LOCALE_NUMERIC */
11243
11244 /* utf8 character classes */
d2d73c3e
AB
11245 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
11246 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
11247 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
11248 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
11249 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
11250 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
11251 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
11252 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
11253 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
11254 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
11255 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
11256 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
11257 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
11258 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
11259 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
11260 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
11261 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
b4e400f9 11262 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
82686b01
JH
11263 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
11264 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 11265
6c3182a5 11266 /* Did the locale setup indicate UTF-8? */
9769094f 11267 PL_utf8locale = proto_perl->Iutf8locale;
6c3182a5
JH
11268 /* Unicode features (see perlrun/-C) */
11269 PL_unicode = proto_perl->Iunicode;
11270
11271 /* Pre-5.8 signals control */
11272 PL_signals = proto_perl->Isignals;
11273
11274 /* times() ticks per second */
11275 PL_clocktick = proto_perl->Iclocktick;
11276
11277 /* Recursion stopper for PerlIO_find_layer */
11278 PL_in_load_module = proto_perl->Iin_load_module;
11279
11280 /* sort() routine */
11281 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
11282
57c6e6d2
JH
11283 /* Not really needed/useful since the reenrant_retint is "volatile",
11284 * but do it for consistency's sake. */
11285 PL_reentrant_retint = proto_perl->Ireentrant_retint;
11286
15a5279a
JH
11287 /* Hooks to shared SVs and locks. */
11288 PL_sharehook = proto_perl->Isharehook;
11289 PL_lockhook = proto_perl->Ilockhook;
11290 PL_unlockhook = proto_perl->Iunlockhook;
11291 PL_threadhook = proto_perl->Ithreadhook;
11292
bce260cd
JH
11293 PL_runops_std = proto_perl->Irunops_std;
11294 PL_runops_dbg = proto_perl->Irunops_dbg;
11295
11296#ifdef THREADS_HAVE_PIDS
11297 PL_ppid = proto_perl->Ippid;
11298#endif
11299
1d7c1841
GS
11300 /* swatch cache */
11301 PL_last_swash_hv = Nullhv; /* reinits on demand */
11302 PL_last_swash_klen = 0;
11303 PL_last_swash_key[0]= '\0';
11304 PL_last_swash_tmps = (U8*)NULL;
11305 PL_last_swash_slen = 0;
11306
11307 /* perly.c globals */
11308 PL_yydebug = proto_perl->Iyydebug;
11309 PL_yynerrs = proto_perl->Iyynerrs;
11310 PL_yyerrflag = proto_perl->Iyyerrflag;
11311 PL_yychar = proto_perl->Iyychar;
11312 PL_yyval = proto_perl->Iyyval;
11313 PL_yylval = proto_perl->Iyylval;
11314
11315 PL_glob_index = proto_perl->Iglob_index;
11316 PL_srand_called = proto_perl->Isrand_called;
504f80c1 11317 PL_hash_seed = proto_perl->Ihash_seed;
1d7c1841
GS
11318 PL_uudmap['M'] = 0; /* reinits on demand */
11319 PL_bitcount = Nullch; /* reinits on demand */
11320
66fe0623
NIS
11321 if (proto_perl->Ipsig_pend) {
11322 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 11323 }
66fe0623
NIS
11324 else {
11325 PL_psig_pend = (int*)NULL;
11326 }
11327
1d7c1841 11328 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
11329 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
11330 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 11331 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
11332 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
11333 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
11334 }
11335 }
11336 else {
11337 PL_psig_ptr = (SV**)NULL;
11338 PL_psig_name = (SV**)NULL;
11339 }
11340
11341 /* thrdvar.h stuff */
11342
a0739874 11343 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
11344 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
11345 PL_tmps_ix = proto_perl->Ttmps_ix;
11346 PL_tmps_max = proto_perl->Ttmps_max;
11347 PL_tmps_floor = proto_perl->Ttmps_floor;
11348 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
11349 i = 0;
11350 while (i <= PL_tmps_ix) {
d2d73c3e 11351 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
11352 ++i;
11353 }
11354
11355 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
11356 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
11357 Newz(54, PL_markstack, i, I32);
11358 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
11359 - proto_perl->Tmarkstack);
11360 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
11361 - proto_perl->Tmarkstack);
11362 Copy(proto_perl->Tmarkstack, PL_markstack,
11363 PL_markstack_ptr - PL_markstack + 1, I32);
11364
11365 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
11366 * NOTE: unlike the others! */
11367 PL_scopestack_ix = proto_perl->Tscopestack_ix;
11368 PL_scopestack_max = proto_perl->Tscopestack_max;
11369 Newz(54, PL_scopestack, PL_scopestack_max, I32);
11370 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
11371
11372 /* next push_return() sets PL_retstack[PL_retstack_ix]
11373 * NOTE: unlike the others! */
11374 PL_retstack_ix = proto_perl->Tretstack_ix;
11375 PL_retstack_max = proto_perl->Tretstack_max;
11376 Newz(54, PL_retstack, PL_retstack_max, OP*);
ce0a1ae0 11377 Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, OP*);
1d7c1841
GS
11378
11379 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 11380 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
11381
11382 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
11383 PL_curstack = av_dup(proto_perl->Tcurstack, param);
11384 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
11385
11386 /* next PUSHs() etc. set *(PL_stack_sp+1) */
11387 PL_stack_base = AvARRAY(PL_curstack);
11388 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
11389 - proto_perl->Tstack_base);
11390 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
11391
11392 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
11393 * NOTE: unlike the others! */
11394 PL_savestack_ix = proto_perl->Tsavestack_ix;
11395 PL_savestack_max = proto_perl->Tsavestack_max;
11396 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 11397 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
11398 }
11399 else {
11400 init_stacks();
985e7056 11401 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
11402 }
11403
11404 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
11405 PL_top_env = &PL_start_env;
11406
11407 PL_op = proto_perl->Top;
11408
11409 PL_Sv = Nullsv;
11410 PL_Xpv = (XPV*)NULL;
11411 PL_na = proto_perl->Tna;
11412
11413 PL_statbuf = proto_perl->Tstatbuf;
11414 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
11415 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
11416 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
11417#ifdef HAS_TIMES
11418 PL_timesbuf = proto_perl->Ttimesbuf;
11419#endif
11420
11421 PL_tainted = proto_perl->Ttainted;
11422 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
11423 PL_rs = sv_dup_inc(proto_perl->Trs, param);
11424 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
11425 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
11426 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 11427 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
11428 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
11429 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
11430 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
11431
11432 PL_restartop = proto_perl->Trestartop;
11433 PL_in_eval = proto_perl->Tin_eval;
11434 PL_delaymagic = proto_perl->Tdelaymagic;
11435 PL_dirty = proto_perl->Tdirty;
11436 PL_localizing = proto_perl->Tlocalizing;
11437
14dd3ad8 11438#ifdef PERL_FLEXIBLE_EXCEPTIONS
1d7c1841 11439 PL_protect = proto_perl->Tprotect;
14dd3ad8 11440#endif
d2d73c3e 11441 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
dd28f7bb 11442 PL_hv_fetch_ent_mh = Nullhe;
1d7c1841
GS
11443 PL_modcount = proto_perl->Tmodcount;
11444 PL_lastgotoprobe = Nullop;
11445 PL_dumpindent = proto_perl->Tdumpindent;
11446
11447 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
11448 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
11449 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
11450 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
11451 PL_sortcxix = proto_perl->Tsortcxix;
11452 PL_efloatbuf = Nullch; /* reinits on demand */
11453 PL_efloatsize = 0; /* reinits on demand */
11454
11455 /* regex stuff */
11456
11457 PL_screamfirst = NULL;
11458 PL_screamnext = NULL;
11459 PL_maxscream = -1; /* reinits on demand */
11460 PL_lastscream = Nullsv;
11461
11462 PL_watchaddr = NULL;
11463 PL_watchok = Nullch;
11464
11465 PL_regdummy = proto_perl->Tregdummy;
1d7c1841
GS
11466 PL_regprecomp = Nullch;
11467 PL_regnpar = 0;
11468 PL_regsize = 0;
1d7c1841
GS
11469 PL_colorset = 0; /* reinits PL_colors[] */
11470 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841
GS
11471 PL_reginput = Nullch;
11472 PL_regbol = Nullch;
11473 PL_regeol = Nullch;
11474 PL_regstartp = (I32*)NULL;
11475 PL_regendp = (I32*)NULL;
11476 PL_reglastparen = (U32*)NULL;
11477 PL_regtill = Nullch;
1d7c1841
GS
11478 PL_reg_start_tmp = (char**)NULL;
11479 PL_reg_start_tmpl = 0;
11480 PL_regdata = (struct reg_data*)NULL;
11481 PL_bostr = Nullch;
11482 PL_reg_flags = 0;
11483 PL_reg_eval_set = 0;
11484 PL_regnarrate = 0;
11485 PL_regprogram = (regnode*)NULL;
11486 PL_regindent = 0;
11487 PL_regcc = (CURCUR*)NULL;
11488 PL_reg_call_cc = (struct re_cc_state*)NULL;
11489 PL_reg_re = (regexp*)NULL;
11490 PL_reg_ganch = Nullch;
11491 PL_reg_sv = Nullsv;
53c4c00c 11492 PL_reg_match_utf8 = FALSE;
1d7c1841
GS
11493 PL_reg_magic = (MAGIC*)NULL;
11494 PL_reg_oldpos = 0;
11495 PL_reg_oldcurpm = (PMOP*)NULL;
11496 PL_reg_curpm = (PMOP*)NULL;
11497 PL_reg_oldsaved = Nullch;
11498 PL_reg_oldsavedlen = 0;
ed252734 11499#ifdef PERL_COPY_ON_WRITE
504cff3b 11500 PL_nrs = Nullsv;
ed252734 11501#endif
1d7c1841
GS
11502 PL_reg_maxiter = 0;
11503 PL_reg_leftiter = 0;
11504 PL_reg_poscache = Nullch;
11505 PL_reg_poscache_size= 0;
11506
11507 /* RE engine - function pointers */
11508 PL_regcompp = proto_perl->Tregcompp;
11509 PL_regexecp = proto_perl->Tregexecp;
11510 PL_regint_start = proto_perl->Tregint_start;
11511 PL_regint_string = proto_perl->Tregint_string;
11512 PL_regfree = proto_perl->Tregfree;
11513
11514 PL_reginterp_cnt = 0;
11515 PL_reg_starttry = 0;
11516
a2efc822
SC
11517 /* Pluggable optimizer */
11518 PL_peepp = proto_perl->Tpeepp;
11519
081fc587
AB
11520 PL_stashcache = newHV();
11521
a0739874
DM
11522 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
11523 ptr_table_free(PL_ptr_table);
11524 PL_ptr_table = NULL;
11525 }
8cf8f3d1 11526
f284b03f
AMS
11527 /* Call the ->CLONE method, if it exists, for each of the stashes
11528 identified by sv_dup() above.
11529 */
d2d73c3e
AB
11530 while(av_len(param->stashes) != -1) {
11531 HV* stash = (HV*) av_shift(param->stashes);
f284b03f
AMS
11532 GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
11533 if (cloner && GvCV(cloner)) {
11534 dSP;
11535 ENTER;
11536 SAVETMPS;
11537 PUSHMARK(SP);
dc507217 11538 XPUSHs(sv_2mortal(newSVpv(HvNAME(stash), 0)));
f284b03f
AMS
11539 PUTBACK;
11540 call_sv((SV*)GvCV(cloner), G_DISCARD);
11541 FREETMPS;
11542 LEAVE;
11543 }
4a09accc 11544 }
a0739874 11545
dc507217 11546 SvREFCNT_dec(param->stashes);
dc507217 11547
1d7c1841 11548 return my_perl;
1d7c1841
GS
11549}
11550
1d7c1841 11551#endif /* USE_ITHREADS */
a0ae6670 11552
9f4817db 11553/*
ccfc67b7
JH
11554=head1 Unicode Support
11555
9f4817db
JH
11556=for apidoc sv_recode_to_utf8
11557
5d170f3a
JH
11558The encoding is assumed to be an Encode object, on entry the PV
11559of the sv is assumed to be octets in that encoding, and the sv
11560will be converted into Unicode (and UTF-8).
9f4817db 11561
5d170f3a
JH
11562If the sv already is UTF-8 (or if it is not POK), or if the encoding
11563is not a reference, nothing is done to the sv. If the encoding is not
1768d7eb
JH
11564an C<Encode::XS> Encoding object, bad things will happen.
11565(See F<lib/encoding.pm> and L<Encode>).
9f4817db 11566
5d170f3a 11567The PV of the sv is returned.
9f4817db 11568
5d170f3a
JH
11569=cut */
11570
11571char *
11572Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
11573{
220e2d4e 11574 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
d0063567
DK
11575 SV *uni;
11576 STRLEN len;
11577 char *s;
11578 dSP;
11579 ENTER;
11580 SAVETMPS;
220e2d4e 11581 save_re_context();
d0063567
DK
11582 PUSHMARK(sp);
11583 EXTEND(SP, 3);
11584 XPUSHs(encoding);
11585 XPUSHs(sv);
f9893866
NIS
11586/*
11587 NI-S 2002/07/09
11588 Passing sv_yes is wrong - it needs to be or'ed set of constants
11589 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
11590 remove converted chars from source.
11591
11592 Both will default the value - let them.
11593
d0063567 11594 XPUSHs(&PL_sv_yes);
f9893866 11595*/
d0063567
DK
11596 PUTBACK;
11597 call_method("decode", G_SCALAR);
11598 SPAGAIN;
11599 uni = POPs;
11600 PUTBACK;
11601 s = SvPV(uni, len);
d0063567
DK
11602 if (s != SvPVX(sv)) {
11603 SvGROW(sv, len + 1);
11604 Move(s, SvPVX(sv), len, char);
11605 SvCUR_set(sv, len);
11606 SvPVX(sv)[len] = 0;
11607 }
11608 FREETMPS;
11609 LEAVE;
d0063567 11610 SvUTF8_on(sv);
f9893866
NIS
11611 }
11612 return SvPVX(sv);
9f4817db
JH
11613}
11614
220e2d4e
IH
11615/*
11616=for apidoc sv_cat_decode
11617
11618The encoding is assumed to be an Encode object, the PV of the ssv is
11619assumed to be octets in that encoding and decoding the input starts
11620from the position which (PV + *offset) pointed to. The dsv will be
11621concatenated the decoded UTF-8 string from ssv. Decoding will terminate
11622when the string tstr appears in decoding output or the input ends on
11623the PV of the ssv. The value which the offset points will be modified
11624to the last input position on the ssv.
68795e93 11625
220e2d4e
IH
11626Returns TRUE if the terminator was found, else returns FALSE.
11627
11628=cut */
11629
11630bool
11631Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
11632 SV *ssv, int *offset, char *tstr, int tlen)
11633{
a73e8557 11634 bool ret = FALSE;
220e2d4e 11635 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
220e2d4e
IH
11636 SV *offsv;
11637 dSP;
11638 ENTER;
11639 SAVETMPS;
11640 save_re_context();
11641 PUSHMARK(sp);
11642 EXTEND(SP, 6);
11643 XPUSHs(encoding);
11644 XPUSHs(dsv);
11645 XPUSHs(ssv);
11646 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
11647 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
11648 PUTBACK;
11649 call_method("cat_decode", G_SCALAR);
11650 SPAGAIN;
11651 ret = SvTRUE(TOPs);
11652 *offset = SvIV(offsv);
11653 PUTBACK;
11654 FREETMPS;
11655 LEAVE;
220e2d4e 11656 }
a73e8557
JH
11657 else
11658 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
11659 return ret;
220e2d4e 11660}
f9893866 11661