This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Finding a way to put "I'm MAINT" in perl -v is a TODO
[perl5.git] / sv.c
CommitLineData
a0d0e21e 1/* sv.c
79072805 2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
b5f8cc5c 4 * 2000, 2001, 2002, 2003, 2004, 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
2f8ed50e
OS
27#ifdef __Lynx__
28/* Missing proto on LynxOS */
29 char *gconvert(double, int, int, char *);
30#endif
31
e23c8137
JH
32#ifdef PERL_UTF8_CACHE_ASSERT
33/* The cache element 0 is the Unicode offset;
34 * the cache element 1 is the byte offset of the element 0;
35 * the cache element 2 is the Unicode length of the substring;
36 * the cache element 3 is the byte length of the substring;
37 * The checking of the substring side would be good
38 * but substr() has enough code paths to make my head spin;
39 * if adding more checks watch out for the following tests:
40 * t/op/index.t t/op/length.t t/op/pat.t t/op/substr.t
41 * lib/utf8.t lib/Unicode/Collate/t/index.t
42 * --jhi
43 */
44#define ASSERT_UTF8_CACHE(cache) \
45 STMT_START { if (cache) { assert((cache)[0] <= (cache)[1]); } } STMT_END
46#else
47#define ASSERT_UTF8_CACHE(cache) NOOP
48#endif
49
765f542d
NC
50#ifdef PERL_COPY_ON_WRITE
51#define SV_COW_NEXT_SV(sv) INT2PTR(SV *,SvUVX(sv))
a29f6d03 52#define SV_COW_NEXT_SV_SET(current,next) SvUVX(current) = PTR2UV(next)
b5ccf5f2 53/* This is a pessimistic view. Scalar must be purely a read-write PV to copy-
765f542d 54 on-write. */
765f542d 55#endif
645c22ef
DM
56
57/* ============================================================================
58
59=head1 Allocation and deallocation of SVs.
60
5e045b90
AMS
61An SV (or AV, HV, etc.) is allocated in two parts: the head (struct sv,
62av, hv...) contains type and reference count information, as well as a
63pointer to the body (struct xrv, xpv, xpviv...), which contains fields
64specific to each type.
65
66Normally, this allocation is done using arenas, which are approximately
671K chunks of memory parcelled up into N heads or bodies. The first slot
68in each arena is reserved, and is used to hold a link to the next arena.
69In the case of heads, the unused first slot also contains some flags and
70a note of the number of slots. Snaked through each arena chain is a
71linked list of free items; when this becomes empty, an extra arena is
72allocated and divided up into N items which are threaded into the free
73list.
645c22ef
DM
74
75The following global variables are associated with arenas:
76
77 PL_sv_arenaroot pointer to list of SV arenas
78 PL_sv_root pointer to list of free SV structures
79
80 PL_foo_arenaroot pointer to list of foo arenas,
81 PL_foo_root pointer to list of free foo bodies
82 ... for foo in xiv, xnv, xrv, xpv etc.
83
84Note that some of the larger and more rarely used body types (eg xpvio)
85are not allocated using arenas, but are instead just malloc()/free()ed as
86required. Also, if PURIFY is defined, arenas are abandoned altogether,
87with all items individually malloc()ed. In addition, a few SV heads are
88not allocated from an arena, but are instead directly created as static
89or auto variables, eg PL_sv_undef.
90
91The SV arena serves the secondary purpose of allowing still-live SVs
92to be located and destroyed during final cleanup.
93
94At the lowest level, the macros new_SV() and del_SV() grab and free
95an SV head. (If debugging with -DD, del_SV() calls the function S_del_sv()
96to return the SV to the free list with error checking.) new_SV() calls
97more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
98SVs in the free list have their SvTYPE field set to all ones.
99
100Similarly, there are macros new_XIV()/del_XIV(), new_XNV()/del_XNV() etc
101that allocate and return individual body types. Normally these are mapped
ff276b08
RG
102to the arena-manipulating functions new_xiv()/del_xiv() etc, but may be
103instead mapped directly to malloc()/free() if PURIFY is defined. The
645c22ef
DM
104new/del functions remove from, or add to, the appropriate PL_foo_root
105list, and call more_xiv() etc to add a new arena if the list is empty.
106
ff276b08 107At the time of very final cleanup, sv_free_arenas() is called from
645c22ef
DM
108perl_destruct() to physically free all the arenas allocated since the
109start of the interpreter. Note that this also clears PL_he_arenaroot,
110which is otherwise dealt with in hv.c.
111
112Manipulation of any of the PL_*root pointers is protected by enclosing
113LOCK_SV_MUTEX; ... UNLOCK_SV_MUTEX calls which should Do the Right Thing
114if threads are enabled.
115
116The function visit() scans the SV arenas list, and calls a specified
117function for each SV it finds which is still live - ie which has an SvTYPE
118other than all 1's, and a non-zero SvREFCNT. visit() is used by the
119following functions (specified as [function that calls visit()] / [function
120called by visit() for each SV]):
121
122 sv_report_used() / do_report_used()
123 dump all remaining SVs (debugging aid)
124
125 sv_clean_objs() / do_clean_objs(),do_clean_named_objs()
126 Attempt to free all objects pointed to by RVs,
127 and, unless DISABLE_DESTRUCTOR_KLUDGE is defined,
128 try to do the same for all objects indirectly
129 referenced by typeglobs too. Called once from
130 perl_destruct(), prior to calling sv_clean_all()
131 below.
132
133 sv_clean_all() / do_clean_all()
134 SvREFCNT_dec(sv) each remaining SV, possibly
135 triggering an sv_free(). It also sets the
136 SVf_BREAK flag on the SV to indicate that the
137 refcnt has been artificially lowered, and thus
138 stopping sv_free() from giving spurious warnings
139 about SVs which unexpectedly have a refcnt
140 of zero. called repeatedly from perl_destruct()
141 until there are no SVs left.
142
143=head2 Summary
144
145Private API to rest of sv.c
146
147 new_SV(), del_SV(),
148
149 new_XIV(), del_XIV(),
150 new_XNV(), del_XNV(),
151 etc
152
153Public API:
154
8cf8f3d1 155 sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
645c22ef
DM
156
157
158=cut
159
160============================================================================ */
161
162
51371543 163
4561caa4
CS
164/*
165 * "A time to plant, and a time to uproot what was planted..."
166 */
167
053fc874
GS
168#define plant_SV(p) \
169 STMT_START { \
170 SvANY(p) = (void *)PL_sv_root; \
171 SvFLAGS(p) = SVTYPEMASK; \
172 PL_sv_root = (p); \
173 --PL_sv_count; \
174 } STMT_END
a0d0e21e 175
fba3b22e 176/* sv_mutex must be held while calling uproot_SV() */
053fc874
GS
177#define uproot_SV(p) \
178 STMT_START { \
179 (p) = PL_sv_root; \
180 PL_sv_root = (SV*)SvANY(p); \
181 ++PL_sv_count; \
182 } STMT_END
183
645c22ef
DM
184
185/* new_SV(): return a new, empty SV head */
186
eba0f806
DM
187#ifdef DEBUG_LEAKING_SCALARS
188/* provide a real function for a debugger to play with */
189STATIC SV*
190S_new_SV(pTHX)
191{
192 SV* sv;
193
194 LOCK_SV_MUTEX;
195 if (PL_sv_root)
196 uproot_SV(sv);
197 else
198 sv = more_sv();
199 UNLOCK_SV_MUTEX;
200 SvANY(sv) = 0;
201 SvREFCNT(sv) = 1;
202 SvFLAGS(sv) = 0;
203 return sv;
204}
205# define new_SV(p) (p)=S_new_SV(aTHX)
206
207#else
208# define new_SV(p) \
053fc874
GS
209 STMT_START { \
210 LOCK_SV_MUTEX; \
211 if (PL_sv_root) \
212 uproot_SV(p); \
213 else \
214 (p) = more_sv(); \
215 UNLOCK_SV_MUTEX; \
216 SvANY(p) = 0; \
217 SvREFCNT(p) = 1; \
218 SvFLAGS(p) = 0; \
219 } STMT_END
eba0f806 220#endif
463ee0b2 221
645c22ef
DM
222
223/* del_SV(): return an empty SV head to the free list */
224
a0d0e21e 225#ifdef DEBUGGING
4561caa4 226
053fc874
GS
227#define del_SV(p) \
228 STMT_START { \
229 LOCK_SV_MUTEX; \
aea4f609 230 if (DEBUG_D_TEST) \
053fc874
GS
231 del_sv(p); \
232 else \
233 plant_SV(p); \
234 UNLOCK_SV_MUTEX; \
235 } STMT_END
a0d0e21e 236
76e3520e 237STATIC void
cea2e8a9 238S_del_sv(pTHX_ SV *p)
463ee0b2 239{
aea4f609 240 if (DEBUG_D_TEST) {
4633a7c4 241 SV* sva;
a0d0e21e
LW
242 SV* sv;
243 SV* svend;
244 int ok = 0;
3280af22 245 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
4633a7c4
LW
246 sv = sva + 1;
247 svend = &sva[SvREFCNT(sva)];
a0d0e21e
LW
248 if (p >= sv && p < svend)
249 ok = 1;
250 }
251 if (!ok) {
0453d815 252 if (ckWARN_d(WARN_INTERNAL))
9014280d 253 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
254 "Attempt to free non-arena SV: 0x%"UVxf
255 pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
a0d0e21e
LW
256 return;
257 }
258 }
4561caa4 259 plant_SV(p);
463ee0b2 260}
a0d0e21e 261
4561caa4
CS
262#else /* ! DEBUGGING */
263
264#define del_SV(p) plant_SV(p)
265
266#endif /* DEBUGGING */
463ee0b2 267
645c22ef
DM
268
269/*
ccfc67b7
JH
270=head1 SV Manipulation Functions
271
645c22ef
DM
272=for apidoc sv_add_arena
273
274Given a chunk of memory, link it to the head of the list of arenas,
275and split it into a list of free SVs.
276
277=cut
278*/
279
4633a7c4 280void
864dbfa3 281Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
463ee0b2 282{
4633a7c4 283 SV* sva = (SV*)ptr;
463ee0b2
LW
284 register SV* sv;
285 register SV* svend;
4633a7c4
LW
286
287 /* The first SV in an arena isn't an SV. */
3280af22 288 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
289 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
290 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
291
3280af22
NIS
292 PL_sv_arenaroot = sva;
293 PL_sv_root = sva + 1;
4633a7c4
LW
294
295 svend = &sva[SvREFCNT(sva) - 1];
296 sv = sva + 1;
463ee0b2 297 while (sv < svend) {
a0d0e21e 298 SvANY(sv) = (void *)(SV*)(sv + 1);
978b032e 299 SvREFCNT(sv) = 0;
8990e307 300 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
301 sv++;
302 }
303 SvANY(sv) = 0;
4633a7c4
LW
304 SvFLAGS(sv) = SVTYPEMASK;
305}
306
645c22ef
DM
307/* make some more SVs by adding another arena */
308
fba3b22e 309/* sv_mutex must be held while calling more_sv() */
76e3520e 310STATIC SV*
cea2e8a9 311S_more_sv(pTHX)
4633a7c4 312{
4561caa4
CS
313 register SV* sv;
314
3280af22
NIS
315 if (PL_nice_chunk) {
316 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
317 PL_nice_chunk = Nullch;
30ad99e7 318 PL_nice_chunk_size = 0;
c07a80fd 319 }
1edc1566 320 else {
321 char *chunk; /* must use New here to match call to */
322 New(704,chunk,1008,char); /* Safefree() in sv_free_arenas() */
323 sv_add_arena(chunk, 1008, 0);
324 }
4561caa4
CS
325 uproot_SV(sv);
326 return sv;
463ee0b2
LW
327}
328
055972dc
DM
329/* visit(): call the named function for each non-free SV in the arenas
330 * whose flags field matches the flags/mask args. */
645c22ef 331
5226ed68 332STATIC I32
055972dc 333S_visit(pTHX_ SVFUNC_t f, U32 flags, U32 mask)
8990e307 334{
4633a7c4 335 SV* sva;
8990e307
LW
336 SV* sv;
337 register SV* svend;
5226ed68 338 I32 visited = 0;
8990e307 339
3280af22 340 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
4633a7c4 341 svend = &sva[SvREFCNT(sva)];
4561caa4 342 for (sv = sva + 1; sv < svend; ++sv) {
055972dc
DM
343 if (SvTYPE(sv) != SVTYPEMASK
344 && (sv->sv_flags & mask) == flags
345 && SvREFCNT(sv))
346 {
acfe0abc 347 (FCALL)(aTHX_ sv);
5226ed68
JH
348 ++visited;
349 }
8990e307
LW
350 }
351 }
5226ed68 352 return visited;
8990e307
LW
353}
354
758a08c3
JH
355#ifdef DEBUGGING
356
645c22ef
DM
357/* called by sv_report_used() for each live SV */
358
359static void
acfe0abc 360do_report_used(pTHX_ SV *sv)
645c22ef
DM
361{
362 if (SvTYPE(sv) != SVTYPEMASK) {
363 PerlIO_printf(Perl_debug_log, "****\n");
364 sv_dump(sv);
365 }
366}
758a08c3 367#endif
645c22ef
DM
368
369/*
370=for apidoc sv_report_used
371
372Dump the contents of all SVs not yet freed. (Debugging aid).
373
374=cut
375*/
376
8990e307 377void
864dbfa3 378Perl_sv_report_used(pTHX)
4561caa4 379{
ff270d3a 380#ifdef DEBUGGING
055972dc 381 visit(do_report_used, 0, 0);
ff270d3a 382#endif
4561caa4
CS
383}
384
645c22ef
DM
385/* called by sv_clean_objs() for each live SV */
386
387static void
acfe0abc 388do_clean_objs(pTHX_ SV *sv)
645c22ef
DM
389{
390 SV* rv;
391
392 if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
393 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv)));
394 if (SvWEAKREF(sv)) {
395 sv_del_backref(sv);
396 SvWEAKREF_off(sv);
397 SvRV(sv) = 0;
398 } else {
399 SvROK_off(sv);
400 SvRV(sv) = 0;
401 SvREFCNT_dec(rv);
402 }
403 }
404
405 /* XXX Might want to check arrays, etc. */
406}
407
408/* called by sv_clean_objs() for each live SV */
409
410#ifndef DISABLE_DESTRUCTOR_KLUDGE
411static void
acfe0abc 412do_clean_named_objs(pTHX_ SV *sv)
645c22ef
DM
413{
414 if (SvTYPE(sv) == SVt_PVGV && GvGP(sv)) {
415 if ( SvOBJECT(GvSV(sv)) ||
416 (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
417 (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
418 (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
419 (GvCV(sv) && SvOBJECT(GvCV(sv))) )
420 {
421 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
ec5f3c78 422 SvFLAGS(sv) |= SVf_BREAK;
645c22ef
DM
423 SvREFCNT_dec(sv);
424 }
425 }
426}
427#endif
428
429/*
430=for apidoc sv_clean_objs
431
432Attempt to destroy all objects not yet freed
433
434=cut
435*/
436
4561caa4 437void
864dbfa3 438Perl_sv_clean_objs(pTHX)
4561caa4 439{
3280af22 440 PL_in_clean_objs = TRUE;
055972dc 441 visit(do_clean_objs, SVf_ROK, SVf_ROK);
4561caa4 442#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 443 /* some barnacles may yet remain, clinging to typeglobs */
055972dc 444 visit(do_clean_named_objs, SVt_PVGV, SVTYPEMASK);
4561caa4 445#endif
3280af22 446 PL_in_clean_objs = FALSE;
4561caa4
CS
447}
448
645c22ef
DM
449/* called by sv_clean_all() for each live SV */
450
451static void
acfe0abc 452do_clean_all(pTHX_ SV *sv)
645c22ef
DM
453{
454 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
455 SvFLAGS(sv) |= SVf_BREAK;
0e705b3b
DM
456 if (PL_comppad == (AV*)sv) {
457 PL_comppad = Nullav;
458 PL_curpad = Null(SV**);
459 }
645c22ef
DM
460 SvREFCNT_dec(sv);
461}
462
463/*
464=for apidoc sv_clean_all
465
466Decrement the refcnt of each remaining SV, possibly triggering a
467cleanup. This function may have to be called multiple times to free
ff276b08 468SVs which are in complex self-referential hierarchies.
645c22ef
DM
469
470=cut
471*/
472
5226ed68 473I32
864dbfa3 474Perl_sv_clean_all(pTHX)
8990e307 475{
5226ed68 476 I32 cleaned;
3280af22 477 PL_in_clean_all = TRUE;
055972dc 478 cleaned = visit(do_clean_all, 0,0);
3280af22 479 PL_in_clean_all = FALSE;
5226ed68 480 return cleaned;
8990e307 481}
463ee0b2 482
645c22ef
DM
483/*
484=for apidoc sv_free_arenas
485
486Deallocate the memory used by all arenas. Note that all the individual SV
487heads and bodies within the arenas must already have been freed.
488
489=cut
490*/
491
4633a7c4 492void
864dbfa3 493Perl_sv_free_arenas(pTHX)
4633a7c4
LW
494{
495 SV* sva;
496 SV* svanext;
612f20c3 497 XPV *arena, *arenanext;
4633a7c4
LW
498
499 /* Free arenas here, but be careful about fake ones. (We assume
500 contiguity of the fake ones with the corresponding real ones.) */
501
3280af22 502 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
503 svanext = (SV*) SvANY(sva);
504 while (svanext && SvFAKE(svanext))
505 svanext = (SV*) SvANY(svanext);
506
507 if (!SvFAKE(sva))
1edc1566 508 Safefree((void *)sva);
4633a7c4 509 }
5f05dabc 510
612f20c3
GS
511 for (arena = PL_xiv_arenaroot; arena; arena = arenanext) {
512 arenanext = (XPV*)arena->xpv_pv;
513 Safefree(arena);
514 }
515 PL_xiv_arenaroot = 0;
bf9cdc68 516 PL_xiv_root = 0;
612f20c3
GS
517
518 for (arena = PL_xnv_arenaroot; arena; arena = arenanext) {
519 arenanext = (XPV*)arena->xpv_pv;
520 Safefree(arena);
521 }
522 PL_xnv_arenaroot = 0;
bf9cdc68 523 PL_xnv_root = 0;
612f20c3
GS
524
525 for (arena = PL_xrv_arenaroot; arena; arena = arenanext) {
526 arenanext = (XPV*)arena->xpv_pv;
527 Safefree(arena);
528 }
529 PL_xrv_arenaroot = 0;
bf9cdc68 530 PL_xrv_root = 0;
612f20c3
GS
531
532 for (arena = PL_xpv_arenaroot; arena; arena = arenanext) {
533 arenanext = (XPV*)arena->xpv_pv;
534 Safefree(arena);
535 }
536 PL_xpv_arenaroot = 0;
bf9cdc68 537 PL_xpv_root = 0;
612f20c3
GS
538
539 for (arena = (XPV*)PL_xpviv_arenaroot; arena; arena = arenanext) {
540 arenanext = (XPV*)arena->xpv_pv;
541 Safefree(arena);
542 }
543 PL_xpviv_arenaroot = 0;
bf9cdc68 544 PL_xpviv_root = 0;
612f20c3
GS
545
546 for (arena = (XPV*)PL_xpvnv_arenaroot; arena; arena = arenanext) {
547 arenanext = (XPV*)arena->xpv_pv;
548 Safefree(arena);
549 }
550 PL_xpvnv_arenaroot = 0;
bf9cdc68 551 PL_xpvnv_root = 0;
612f20c3
GS
552
553 for (arena = (XPV*)PL_xpvcv_arenaroot; arena; arena = arenanext) {
554 arenanext = (XPV*)arena->xpv_pv;
555 Safefree(arena);
556 }
557 PL_xpvcv_arenaroot = 0;
bf9cdc68 558 PL_xpvcv_root = 0;
612f20c3
GS
559
560 for (arena = (XPV*)PL_xpvav_arenaroot; arena; arena = arenanext) {
561 arenanext = (XPV*)arena->xpv_pv;
562 Safefree(arena);
563 }
564 PL_xpvav_arenaroot = 0;
bf9cdc68 565 PL_xpvav_root = 0;
612f20c3
GS
566
567 for (arena = (XPV*)PL_xpvhv_arenaroot; arena; arena = arenanext) {
568 arenanext = (XPV*)arena->xpv_pv;
569 Safefree(arena);
570 }
571 PL_xpvhv_arenaroot = 0;
bf9cdc68 572 PL_xpvhv_root = 0;
612f20c3
GS
573
574 for (arena = (XPV*)PL_xpvmg_arenaroot; arena; arena = arenanext) {
575 arenanext = (XPV*)arena->xpv_pv;
576 Safefree(arena);
577 }
578 PL_xpvmg_arenaroot = 0;
bf9cdc68 579 PL_xpvmg_root = 0;
612f20c3
GS
580
581 for (arena = (XPV*)PL_xpvlv_arenaroot; arena; arena = arenanext) {
582 arenanext = (XPV*)arena->xpv_pv;
583 Safefree(arena);
584 }
585 PL_xpvlv_arenaroot = 0;
bf9cdc68 586 PL_xpvlv_root = 0;
612f20c3
GS
587
588 for (arena = (XPV*)PL_xpvbm_arenaroot; arena; arena = arenanext) {
589 arenanext = (XPV*)arena->xpv_pv;
590 Safefree(arena);
591 }
592 PL_xpvbm_arenaroot = 0;
bf9cdc68 593 PL_xpvbm_root = 0;
612f20c3
GS
594
595 for (arena = (XPV*)PL_he_arenaroot; arena; arena = arenanext) {
596 arenanext = (XPV*)arena->xpv_pv;
597 Safefree(arena);
598 }
599 PL_he_arenaroot = 0;
bf9cdc68 600 PL_he_root = 0;
612f20c3 601
3280af22
NIS
602 if (PL_nice_chunk)
603 Safefree(PL_nice_chunk);
604 PL_nice_chunk = Nullch;
605 PL_nice_chunk_size = 0;
606 PL_sv_arenaroot = 0;
607 PL_sv_root = 0;
4633a7c4
LW
608}
609
29489e7c
DM
610/* ---------------------------------------------------------------------
611 *
612 * support functions for report_uninit()
613 */
614
615/* the maxiumum size of array or hash where we will scan looking
616 * for the undefined element that triggered the warning */
617
618#define FUV_MAX_SEARCH_SIZE 1000
619
620/* Look for an entry in the hash whose value has the same SV as val;
621 * If so, return a mortal copy of the key. */
622
623STATIC SV*
624S_find_hash_subscript(pTHX_ HV *hv, SV* val)
625{
626 register HE **array;
627 register HE *entry;
628 I32 i;
629
630 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
631 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
632 return Nullsv;
633
634 array = HvARRAY(hv);
635
636 for (i=HvMAX(hv); i>0; i--) {
637 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
638 if (HeVAL(entry) != val)
639 continue;
640 if ( HeVAL(entry) == &PL_sv_undef ||
641 HeVAL(entry) == &PL_sv_placeholder)
642 continue;
643 if (!HeKEY(entry))
644 return Nullsv;
645 if (HeKLEN(entry) == HEf_SVKEY)
646 return sv_mortalcopy(HeKEY_sv(entry));
647 return sv_2mortal(newSVpvn(HeKEY(entry), HeKLEN(entry)));
648 }
649 }
650 return Nullsv;
651}
652
653/* Look for an entry in the array whose value has the same SV as val;
654 * If so, return the index, otherwise return -1. */
655
656STATIC I32
657S_find_array_subscript(pTHX_ AV *av, SV* val)
658{
659 SV** svp;
660 I32 i;
661 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
662 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
663 return -1;
664
665 svp = AvARRAY(av);
666 for (i=AvFILLp(av); i>=0; i--) {
667 if (svp[i] == val && svp[i] != &PL_sv_undef)
668 return i;
669 }
670 return -1;
671}
672
673/* S_varname(): return the name of a variable, optionally with a subscript.
674 * If gv is non-zero, use the name of that global, along with gvtype (one
675 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
676 * targ. Depending on the value of the subscript_type flag, return:
677 */
678
679#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
680#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
681#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
682#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
683
684STATIC SV*
685S_varname(pTHX_ GV *gv, char *gvtype, PADOFFSET targ,
686 SV* keyname, I32 aindex, int subscript_type)
687{
688 AV *av;
689
690 SV *sv, *name;
691
692 name = sv_newmortal();
693 if (gv) {
694
695 /* simulate gv_fullname4(), but add literal '^' for $^FOO names
696 * XXX get rid of all this if gv_fullnameX() ever supports this
697 * directly */
698
699 char *p;
700 HV *hv = GvSTASH(gv);
701 sv_setpv(name, gvtype);
702 if (!hv)
703 p = "???";
704 else if (!HvNAME(hv))
705 p = "__ANON__";
706 else
707 p = HvNAME(hv);
708 if (strNE(p, "main")) {
709 sv_catpv(name,p);
710 sv_catpvn(name,"::", 2);
711 }
712 if (GvNAMELEN(gv)>= 1 &&
713 ((unsigned int)*GvNAME(gv)) <= 26)
714 { /* handle $^FOO */
715 Perl_sv_catpvf(aTHX_ name,"^%c", *GvNAME(gv) + 'A' - 1);
716 sv_catpvn(name,GvNAME(gv)+1,GvNAMELEN(gv)-1);
717 }
718 else
719 sv_catpvn(name,GvNAME(gv),GvNAMELEN(gv));
720 }
721 else {
722 U32 u;
723 CV *cv = find_runcv(&u);
724 if (!cv || !CvPADLIST(cv))
725 return Nullsv;;
726 av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
727 sv = *av_fetch(av, targ, FALSE);
728 /* SvLEN in a pad name is not to be trusted */
729 sv_setpv(name, SvPV_nolen(sv));
730 }
731
732 if (subscript_type == FUV_SUBSCRIPT_HASH) {
733 *SvPVX(name) = '$';
734 sv = NEWSV(0,0);
735 Perl_sv_catpvf(aTHX_ name, "{%s}",
736 pv_display(sv,SvPVX(keyname), SvCUR(keyname), 0, 32));
737 SvREFCNT_dec(sv);
738 }
739 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
740 *SvPVX(name) = '$';
265a12b8 741 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
29489e7c
DM
742 }
743 else if (subscript_type == FUV_SUBSCRIPT_WITHIN)
744 sv_insert(name, 0, 0, "within ", 7);
745
746 return name;
747}
748
749
750/*
751=for apidoc find_uninit_var
752
753Find the name of the undefined variable (if any) that caused the operator o
754to issue a "Use of uninitialized value" warning.
755If match is true, only return a name if it's value matches uninit_sv.
756So roughly speaking, if a unary operator (such as OP_COS) generates a
757warning, then following the direct child of the op may yield an
758OP_PADSV or OP_GV that gives the name of the undefined variable. On the
759other hand, with OP_ADD there are two branches to follow, so we only print
760the variable name if we get an exact match.
761
762The name is returned as a mortal SV.
763
764Assumes that PL_op is the op that originally triggered the error, and that
765PL_comppad/PL_curpad points to the currently executing pad.
766
767=cut
768*/
769
770STATIC SV *
771S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
772{
773 SV *sv;
774 AV *av;
775 SV **svp;
776 GV *gv;
777 OP *o, *o2, *kid;
778
779 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
780 uninit_sv == &PL_sv_placeholder)))
781 return Nullsv;
782
783 switch (obase->op_type) {
784
785 case OP_RV2AV:
786 case OP_RV2HV:
787 case OP_PADAV:
788 case OP_PADHV:
789 {
790 bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
791 bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
792 I32 index;
793 SV *keysv;
794 int subscript_type = FUV_SUBSCRIPT_WITHIN;
795
796 if (pad) { /* @lex, %lex */
797 sv = PAD_SVl(obase->op_targ);
798 gv = Nullgv;
799 }
800 else {
801 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
802 /* @global, %global */
803 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
804 if (!gv)
805 break;
806 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
807 }
808 else /* @{expr}, %{expr} */
809 return find_uninit_var(cUNOPx(obase)->op_first,
810 uninit_sv, match);
811 }
812
813 /* attempt to find a match within the aggregate */
814 if (hash) {
815 keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
816 if (keysv)
817 subscript_type = FUV_SUBSCRIPT_HASH;
818 }
819 else {
820 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
821 if (index >= 0)
822 subscript_type = FUV_SUBSCRIPT_ARRAY;
823 }
824
825 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
826 break;
827
828 return S_varname(aTHX_ gv, hash ? "%" : "@", obase->op_targ,
829 keysv, index, subscript_type);
830 }
831
832 case OP_PADSV:
833 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
834 break;
835 return S_varname(aTHX_ Nullgv, "$", obase->op_targ,
836 Nullsv, 0, FUV_SUBSCRIPT_NONE);
837
838 case OP_GVSV:
839 gv = cGVOPx_gv(obase);
840 if (!gv || (match && GvSV(gv) != uninit_sv))
841 break;
842 return S_varname(aTHX_ gv, "$", 0, Nullsv, 0, FUV_SUBSCRIPT_NONE);
843
844 case OP_AELEMFAST:
845 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
846 if (match) {
847 av = (AV*)PAD_SV(obase->op_targ);
848 if (!av || SvRMAGICAL(av))
849 break;
850 svp = av_fetch(av, (I32)obase->op_private, FALSE);
851 if (!svp || *svp != uninit_sv)
852 break;
853 }
854 return S_varname(aTHX_ Nullgv, "$", obase->op_targ,
855 Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
856 }
857 else {
858 gv = cGVOPx_gv(obase);
859 if (!gv)
860 break;
861 if (match) {
862 av = GvAV(gv);
863 if (!av || SvRMAGICAL(av))
864 break;
865 svp = av_fetch(av, (I32)obase->op_private, FALSE);
866 if (!svp || *svp != uninit_sv)
867 break;
868 }
869 return S_varname(aTHX_ gv, "$", 0,
870 Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
871 }
872 break;
873
874 case OP_EXISTS:
875 o = cUNOPx(obase)->op_first;
876 if (!o || o->op_type != OP_NULL ||
877 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
878 break;
879 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
880
881 case OP_AELEM:
882 case OP_HELEM:
883 if (PL_op == obase)
884 /* $a[uninit_expr] or $h{uninit_expr} */
885 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
886
887 gv = Nullgv;
888 o = cBINOPx(obase)->op_first;
889 kid = cBINOPx(obase)->op_last;
890
891 /* get the av or hv, and optionally the gv */
892 sv = Nullsv;
893 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
894 sv = PAD_SV(o->op_targ);
895 }
896 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
897 && cUNOPo->op_first->op_type == OP_GV)
898 {
899 gv = cGVOPx_gv(cUNOPo->op_first);
900 if (!gv)
901 break;
902 sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
903 }
904 if (!sv)
905 break;
906
907 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
908 /* index is constant */
909 if (match) {
910 if (SvMAGICAL(sv))
911 break;
912 if (obase->op_type == OP_HELEM) {
913 HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
914 if (!he || HeVAL(he) != uninit_sv)
915 break;
916 }
917 else {
918 svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
919 if (!svp || *svp != uninit_sv)
920 break;
921 }
922 }
923 if (obase->op_type == OP_HELEM)
924 return S_varname(aTHX_ gv, "%", o->op_targ,
925 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
926 else
927 return S_varname(aTHX_ gv, "@", o->op_targ, Nullsv,
928 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
929 ;
930 }
931 else {
932 /* index is an expression;
933 * attempt to find a match within the aggregate */
934 if (obase->op_type == OP_HELEM) {
935 SV *keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
936 if (keysv)
937 return S_varname(aTHX_ gv, "%", o->op_targ,
938 keysv, 0, FUV_SUBSCRIPT_HASH);
939 }
940 else {
941 I32 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
942 if (index >= 0)
943 return S_varname(aTHX_ gv, "@", o->op_targ,
944 Nullsv, index, FUV_SUBSCRIPT_ARRAY);
945 }
946 if (match)
947 break;
948 return S_varname(aTHX_ gv,
949 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
950 ? "@" : "%",
951 o->op_targ, Nullsv, 0, FUV_SUBSCRIPT_WITHIN);
952 }
953
954 break;
955
956 case OP_AASSIGN:
957 /* only examine RHS */
958 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
959
960 case OP_OPEN:
961 o = cUNOPx(obase)->op_first;
962 if (o->op_type == OP_PUSHMARK)
963 o = o->op_sibling;
964
965 if (!o->op_sibling) {
966 /* one-arg version of open is highly magical */
967
968 if (o->op_type == OP_GV) { /* open FOO; */
969 gv = cGVOPx_gv(o);
970 if (match && GvSV(gv) != uninit_sv)
971 break;
972 return S_varname(aTHX_ gv, "$", 0,
973 Nullsv, 0, FUV_SUBSCRIPT_NONE);
974 }
975 /* other possibilities not handled are:
976 * open $x; or open my $x; should return '${*$x}'
977 * open expr; should return '$'.expr ideally
978 */
979 break;
980 }
981 goto do_op;
982
983 /* ops where $_ may be an implicit arg */
984 case OP_TRANS:
985 case OP_SUBST:
986 case OP_MATCH:
987 if ( !(obase->op_flags & OPf_STACKED)) {
988 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
989 ? PAD_SVl(obase->op_targ)
990 : DEFSV))
991 {
992 sv = sv_newmortal();
993 sv_setpv(sv, "$_");
994 return sv;
995 }
996 }
997 goto do_op;
998
999 case OP_PRTF:
1000 case OP_PRINT:
1001 /* skip filehandle as it can't produce 'undef' warning */
1002 o = cUNOPx(obase)->op_first;
1003 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
1004 o = o->op_sibling->op_sibling;
1005 goto do_op2;
1006
1007
e21bd382 1008 case OP_RV2SV:
29489e7c
DM
1009 case OP_CUSTOM:
1010 case OP_ENTERSUB:
1011 match = 1; /* XS or custom code could trigger random warnings */
1012 goto do_op;
1013
1014 case OP_SCHOMP:
1015 case OP_CHOMP:
1016 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
1017 return sv_2mortal(newSVpv("${$/}", 0));
1018 /* FALL THROUGH */
1019
1020 default:
1021 do_op:
1022 if (!(obase->op_flags & OPf_KIDS))
1023 break;
1024 o = cUNOPx(obase)->op_first;
1025
1026 do_op2:
1027 if (!o)
1028 break;
1029
1030 /* if all except one arg are constant, or have no side-effects,
1031 * or are optimized away, then it's unambiguous */
1032 o2 = Nullop;
1033 for (kid=o; kid; kid = kid->op_sibling) {
1034 if (kid &&
1035 ( (kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid)))
1036 || (kid->op_type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
1037 || (kid->op_type == OP_PUSHMARK)
1038 )
1039 )
1040 continue;
1041 if (o2) { /* more than one found */
1042 o2 = Nullop;
1043 break;
1044 }
1045 o2 = kid;
1046 }
1047 if (o2)
1048 return find_uninit_var(o2, uninit_sv, match);
1049
1050 /* scan all args */
1051 while (o) {
1052 sv = find_uninit_var(o, uninit_sv, 1);
1053 if (sv)
1054 return sv;
1055 o = o->op_sibling;
1056 }
1057 break;
1058 }
1059 return Nullsv;
1060}
1061
1062
645c22ef
DM
1063/*
1064=for apidoc report_uninit
1065
1066Print appropriate "Use of uninitialized variable" warning
1067
1068=cut
1069*/
1070
1d7c1841 1071void
29489e7c
DM
1072Perl_report_uninit(pTHX_ SV* uninit_sv)
1073{
1074 if (PL_op) {
1075 SV* varname;
1076 if (uninit_sv) {
1077 varname = find_uninit_var(PL_op, uninit_sv,0);
1078 if (varname)
1079 sv_insert(varname, 0, 0, " ", 1);
1080 }
9014280d 1081 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
29489e7c
DM
1082 varname ? SvPV_nolen(varname) : "",
1083 " in ", OP_DESC(PL_op));
1084 }
1d7c1841 1085 else
29489e7c
DM
1086 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
1087 "", "", "");
1d7c1841
GS
1088}
1089
645c22ef
DM
1090/* grab a new IV body from the free list, allocating more if necessary */
1091
76e3520e 1092STATIC XPVIV*
cea2e8a9 1093S_new_xiv(pTHX)
463ee0b2 1094{
ea7c11a3 1095 IV* xiv;
cbe51380
GS
1096 LOCK_SV_MUTEX;
1097 if (!PL_xiv_root)
1098 more_xiv();
1099 xiv = PL_xiv_root;
1100 /*
1101 * See comment in more_xiv() -- RAM.
1102 */
1103 PL_xiv_root = *(IV**)xiv;
1104 UNLOCK_SV_MUTEX;
1105 return (XPVIV*)((char*)xiv - STRUCT_OFFSET(XPVIV, xiv_iv));
463ee0b2
LW
1106}
1107
645c22ef
DM
1108/* return an IV body to the free list */
1109
76e3520e 1110STATIC void
cea2e8a9 1111S_del_xiv(pTHX_ XPVIV *p)
463ee0b2 1112{
23e6a22f 1113 IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
cbe51380 1114 LOCK_SV_MUTEX;
3280af22
NIS
1115 *(IV**)xiv = PL_xiv_root;
1116 PL_xiv_root = xiv;
cbe51380 1117 UNLOCK_SV_MUTEX;
463ee0b2
LW
1118}
1119
645c22ef
DM
1120/* allocate another arena's worth of IV bodies */
1121
cbe51380 1122STATIC void
cea2e8a9 1123S_more_xiv(pTHX)
463ee0b2 1124{
ea7c11a3
SM
1125 register IV* xiv;
1126 register IV* xivend;
8c52afec
IZ
1127 XPV* ptr;
1128 New(705, ptr, 1008/sizeof(XPV), XPV);
645c22ef 1129 ptr->xpv_pv = (char*)PL_xiv_arenaroot; /* linked list of xiv arenas */
3280af22 1130 PL_xiv_arenaroot = ptr; /* to keep Purify happy */
a0d0e21e 1131
ea7c11a3
SM
1132 xiv = (IV*) ptr;
1133 xivend = &xiv[1008 / sizeof(IV) - 1];
645c22ef 1134 xiv += (sizeof(XPV) - 1) / sizeof(IV) + 1; /* fudge by size of XPV */
3280af22 1135 PL_xiv_root = xiv;
463ee0b2 1136 while (xiv < xivend) {
ea7c11a3 1137 *(IV**)xiv = (IV *)(xiv + 1);
463ee0b2
LW
1138 xiv++;
1139 }
ea7c11a3 1140 *(IV**)xiv = 0;
463ee0b2
LW
1141}
1142
645c22ef
DM
1143/* grab a new NV body from the free list, allocating more if necessary */
1144
76e3520e 1145STATIC XPVNV*
cea2e8a9 1146S_new_xnv(pTHX)
463ee0b2 1147{
65202027 1148 NV* xnv;
cbe51380
GS
1149 LOCK_SV_MUTEX;
1150 if (!PL_xnv_root)
1151 more_xnv();
1152 xnv = PL_xnv_root;
65202027 1153 PL_xnv_root = *(NV**)xnv;
cbe51380
GS
1154 UNLOCK_SV_MUTEX;
1155 return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
463ee0b2
LW
1156}
1157
645c22ef
DM
1158/* return an NV body to the free list */
1159
76e3520e 1160STATIC void
cea2e8a9 1161S_del_xnv(pTHX_ XPVNV *p)
463ee0b2 1162{
65202027 1163 NV* xnv = (NV*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
cbe51380 1164 LOCK_SV_MUTEX;
65202027 1165 *(NV**)xnv = PL_xnv_root;
3280af22 1166 PL_xnv_root = xnv;
cbe51380 1167 UNLOCK_SV_MUTEX;
463ee0b2
LW
1168}
1169
645c22ef
DM
1170/* allocate another arena's worth of NV bodies */
1171
cbe51380 1172STATIC void
cea2e8a9 1173S_more_xnv(pTHX)
463ee0b2 1174{
65202027
DS
1175 register NV* xnv;
1176 register NV* xnvend;
612f20c3
GS
1177 XPV *ptr;
1178 New(711, ptr, 1008/sizeof(XPV), XPV);
1179 ptr->xpv_pv = (char*)PL_xnv_arenaroot;
1180 PL_xnv_arenaroot = ptr;
1181
1182 xnv = (NV*) ptr;
65202027
DS
1183 xnvend = &xnv[1008 / sizeof(NV) - 1];
1184 xnv += (sizeof(XPVIV) - 1) / sizeof(NV) + 1; /* fudge by sizeof XPVIV */
3280af22 1185 PL_xnv_root = xnv;
463ee0b2 1186 while (xnv < xnvend) {
65202027 1187 *(NV**)xnv = (NV*)(xnv + 1);
463ee0b2
LW
1188 xnv++;
1189 }
65202027 1190 *(NV**)xnv = 0;
463ee0b2
LW
1191}
1192
645c22ef
DM
1193/* grab a new struct xrv from the free list, allocating more if necessary */
1194
76e3520e 1195STATIC XRV*
cea2e8a9 1196S_new_xrv(pTHX)
ed6116ce
LW
1197{
1198 XRV* xrv;
cbe51380
GS
1199 LOCK_SV_MUTEX;
1200 if (!PL_xrv_root)
1201 more_xrv();
1202 xrv = PL_xrv_root;
1203 PL_xrv_root = (XRV*)xrv->xrv_rv;
1204 UNLOCK_SV_MUTEX;
1205 return xrv;
ed6116ce
LW
1206}
1207
645c22ef
DM
1208/* return a struct xrv to the free list */
1209
76e3520e 1210STATIC void
cea2e8a9 1211S_del_xrv(pTHX_ XRV *p)
ed6116ce 1212{
cbe51380 1213 LOCK_SV_MUTEX;
3280af22
NIS
1214 p->xrv_rv = (SV*)PL_xrv_root;
1215 PL_xrv_root = p;
cbe51380 1216 UNLOCK_SV_MUTEX;
ed6116ce
LW
1217}
1218
645c22ef
DM
1219/* allocate another arena's worth of struct xrv */
1220
cbe51380 1221STATIC void
cea2e8a9 1222S_more_xrv(pTHX)
ed6116ce 1223{
ed6116ce
LW
1224 register XRV* xrv;
1225 register XRV* xrvend;
612f20c3
GS
1226 XPV *ptr;
1227 New(712, ptr, 1008/sizeof(XPV), XPV);
1228 ptr->xpv_pv = (char*)PL_xrv_arenaroot;
1229 PL_xrv_arenaroot = ptr;
1230
1231 xrv = (XRV*) ptr;
ed6116ce 1232 xrvend = &xrv[1008 / sizeof(XRV) - 1];
612f20c3
GS
1233 xrv += (sizeof(XPV) - 1) / sizeof(XRV) + 1;
1234 PL_xrv_root = xrv;
ed6116ce
LW
1235 while (xrv < xrvend) {
1236 xrv->xrv_rv = (SV*)(xrv + 1);
1237 xrv++;
1238 }
1239 xrv->xrv_rv = 0;
ed6116ce
LW
1240}
1241
645c22ef
DM
1242/* grab a new struct xpv from the free list, allocating more if necessary */
1243
76e3520e 1244STATIC XPV*
cea2e8a9 1245S_new_xpv(pTHX)
463ee0b2
LW
1246{
1247 XPV* xpv;
cbe51380
GS
1248 LOCK_SV_MUTEX;
1249 if (!PL_xpv_root)
1250 more_xpv();
1251 xpv = PL_xpv_root;
1252 PL_xpv_root = (XPV*)xpv->xpv_pv;
1253 UNLOCK_SV_MUTEX;
1254 return xpv;
463ee0b2
LW
1255}
1256
645c22ef
DM
1257/* return a struct xpv to the free list */
1258
76e3520e 1259STATIC void
cea2e8a9 1260S_del_xpv(pTHX_ XPV *p)
463ee0b2 1261{
cbe51380 1262 LOCK_SV_MUTEX;
3280af22
NIS
1263 p->xpv_pv = (char*)PL_xpv_root;
1264 PL_xpv_root = p;
cbe51380 1265 UNLOCK_SV_MUTEX;
463ee0b2
LW
1266}
1267
645c22ef
DM
1268/* allocate another arena's worth of struct xpv */
1269
cbe51380 1270STATIC void
cea2e8a9 1271S_more_xpv(pTHX)
463ee0b2 1272{
463ee0b2
LW
1273 register XPV* xpv;
1274 register XPV* xpvend;
612f20c3
GS
1275 New(713, xpv, 1008/sizeof(XPV), XPV);
1276 xpv->xpv_pv = (char*)PL_xpv_arenaroot;
1277 PL_xpv_arenaroot = xpv;
1278
463ee0b2 1279 xpvend = &xpv[1008 / sizeof(XPV) - 1];
612f20c3 1280 PL_xpv_root = ++xpv;
463ee0b2
LW
1281 while (xpv < xpvend) {
1282 xpv->xpv_pv = (char*)(xpv + 1);
1283 xpv++;
1284 }
1285 xpv->xpv_pv = 0;
463ee0b2
LW
1286}
1287
645c22ef
DM
1288/* grab a new struct xpviv from the free list, allocating more if necessary */
1289
932e9ff9
VB
1290STATIC XPVIV*
1291S_new_xpviv(pTHX)
1292{
1293 XPVIV* xpviv;
1294 LOCK_SV_MUTEX;
1295 if (!PL_xpviv_root)
1296 more_xpviv();
1297 xpviv = PL_xpviv_root;
1298 PL_xpviv_root = (XPVIV*)xpviv->xpv_pv;
1299 UNLOCK_SV_MUTEX;
1300 return xpviv;
1301}
1302
645c22ef
DM
1303/* return a struct xpviv to the free list */
1304
932e9ff9
VB
1305STATIC void
1306S_del_xpviv(pTHX_ XPVIV *p)
1307{
1308 LOCK_SV_MUTEX;
1309 p->xpv_pv = (char*)PL_xpviv_root;
1310 PL_xpviv_root = p;
1311 UNLOCK_SV_MUTEX;
1312}
1313
645c22ef
DM
1314/* allocate another arena's worth of struct xpviv */
1315
932e9ff9
VB
1316STATIC void
1317S_more_xpviv(pTHX)
1318{
1319 register XPVIV* xpviv;
1320 register XPVIV* xpvivend;
612f20c3
GS
1321 New(714, xpviv, 1008/sizeof(XPVIV), XPVIV);
1322 xpviv->xpv_pv = (char*)PL_xpviv_arenaroot;
1323 PL_xpviv_arenaroot = xpviv;
1324
932e9ff9 1325 xpvivend = &xpviv[1008 / sizeof(XPVIV) - 1];
612f20c3 1326 PL_xpviv_root = ++xpviv;
932e9ff9
VB
1327 while (xpviv < xpvivend) {
1328 xpviv->xpv_pv = (char*)(xpviv + 1);
1329 xpviv++;
1330 }
1331 xpviv->xpv_pv = 0;
1332}
1333
645c22ef
DM
1334/* grab a new struct xpvnv from the free list, allocating more if necessary */
1335
932e9ff9
VB
1336STATIC XPVNV*
1337S_new_xpvnv(pTHX)
1338{
1339 XPVNV* xpvnv;
1340 LOCK_SV_MUTEX;
1341 if (!PL_xpvnv_root)
1342 more_xpvnv();
1343 xpvnv = PL_xpvnv_root;
1344 PL_xpvnv_root = (XPVNV*)xpvnv->xpv_pv;
1345 UNLOCK_SV_MUTEX;
1346 return xpvnv;
1347}
1348
645c22ef
DM
1349/* return a struct xpvnv to the free list */
1350
932e9ff9
VB
1351STATIC void
1352S_del_xpvnv(pTHX_ XPVNV *p)
1353{
1354 LOCK_SV_MUTEX;
1355 p->xpv_pv = (char*)PL_xpvnv_root;
1356 PL_xpvnv_root = p;
1357 UNLOCK_SV_MUTEX;
1358}
1359
645c22ef
DM
1360/* allocate another arena's worth of struct xpvnv */
1361
932e9ff9
VB
1362STATIC void
1363S_more_xpvnv(pTHX)
1364{
1365 register XPVNV* xpvnv;
1366 register XPVNV* xpvnvend;
612f20c3
GS
1367 New(715, xpvnv, 1008/sizeof(XPVNV), XPVNV);
1368 xpvnv->xpv_pv = (char*)PL_xpvnv_arenaroot;
1369 PL_xpvnv_arenaroot = xpvnv;
1370
932e9ff9 1371 xpvnvend = &xpvnv[1008 / sizeof(XPVNV) - 1];
612f20c3 1372 PL_xpvnv_root = ++xpvnv;
932e9ff9
VB
1373 while (xpvnv < xpvnvend) {
1374 xpvnv->xpv_pv = (char*)(xpvnv + 1);
1375 xpvnv++;
1376 }
1377 xpvnv->xpv_pv = 0;
1378}
1379
645c22ef
DM
1380/* grab a new struct xpvcv from the free list, allocating more if necessary */
1381
932e9ff9
VB
1382STATIC XPVCV*
1383S_new_xpvcv(pTHX)
1384{
1385 XPVCV* xpvcv;
1386 LOCK_SV_MUTEX;
1387 if (!PL_xpvcv_root)
1388 more_xpvcv();
1389 xpvcv = PL_xpvcv_root;
1390 PL_xpvcv_root = (XPVCV*)xpvcv->xpv_pv;
1391 UNLOCK_SV_MUTEX;
1392 return xpvcv;
1393}
1394
645c22ef
DM
1395/* return a struct xpvcv to the free list */
1396
932e9ff9
VB
1397STATIC void
1398S_del_xpvcv(pTHX_ XPVCV *p)
1399{
1400 LOCK_SV_MUTEX;
1401 p->xpv_pv = (char*)PL_xpvcv_root;
1402 PL_xpvcv_root = p;
1403 UNLOCK_SV_MUTEX;
1404}
1405
645c22ef
DM
1406/* allocate another arena's worth of struct xpvcv */
1407
932e9ff9
VB
1408STATIC void
1409S_more_xpvcv(pTHX)
1410{
1411 register XPVCV* xpvcv;
1412 register XPVCV* xpvcvend;
612f20c3
GS
1413 New(716, xpvcv, 1008/sizeof(XPVCV), XPVCV);
1414 xpvcv->xpv_pv = (char*)PL_xpvcv_arenaroot;
1415 PL_xpvcv_arenaroot = xpvcv;
1416
932e9ff9 1417 xpvcvend = &xpvcv[1008 / sizeof(XPVCV) - 1];
612f20c3 1418 PL_xpvcv_root = ++xpvcv;
932e9ff9
VB
1419 while (xpvcv < xpvcvend) {
1420 xpvcv->xpv_pv = (char*)(xpvcv + 1);
1421 xpvcv++;
1422 }
1423 xpvcv->xpv_pv = 0;
1424}
1425
645c22ef
DM
1426/* grab a new struct xpvav from the free list, allocating more if necessary */
1427
932e9ff9
VB
1428STATIC XPVAV*
1429S_new_xpvav(pTHX)
1430{
1431 XPVAV* xpvav;
1432 LOCK_SV_MUTEX;
1433 if (!PL_xpvav_root)
1434 more_xpvav();
1435 xpvav = PL_xpvav_root;
1436 PL_xpvav_root = (XPVAV*)xpvav->xav_array;
1437 UNLOCK_SV_MUTEX;
1438 return xpvav;
1439}
1440
645c22ef
DM
1441/* return a struct xpvav to the free list */
1442
932e9ff9
VB
1443STATIC void
1444S_del_xpvav(pTHX_ XPVAV *p)
1445{
1446 LOCK_SV_MUTEX;
1447 p->xav_array = (char*)PL_xpvav_root;
1448 PL_xpvav_root = p;
1449 UNLOCK_SV_MUTEX;
1450}
1451
645c22ef
DM
1452/* allocate another arena's worth of struct xpvav */
1453
932e9ff9
VB
1454STATIC void
1455S_more_xpvav(pTHX)
1456{
1457 register XPVAV* xpvav;
1458 register XPVAV* xpvavend;
612f20c3
GS
1459 New(717, xpvav, 1008/sizeof(XPVAV), XPVAV);
1460 xpvav->xav_array = (char*)PL_xpvav_arenaroot;
1461 PL_xpvav_arenaroot = xpvav;
1462
932e9ff9 1463 xpvavend = &xpvav[1008 / sizeof(XPVAV) - 1];
612f20c3 1464 PL_xpvav_root = ++xpvav;
932e9ff9
VB
1465 while (xpvav < xpvavend) {
1466 xpvav->xav_array = (char*)(xpvav + 1);
1467 xpvav++;
1468 }
1469 xpvav->xav_array = 0;
1470}
1471
645c22ef
DM
1472/* grab a new struct xpvhv from the free list, allocating more if necessary */
1473
932e9ff9
VB
1474STATIC XPVHV*
1475S_new_xpvhv(pTHX)
1476{
1477 XPVHV* xpvhv;
1478 LOCK_SV_MUTEX;
1479 if (!PL_xpvhv_root)
1480 more_xpvhv();
1481 xpvhv = PL_xpvhv_root;
1482 PL_xpvhv_root = (XPVHV*)xpvhv->xhv_array;
1483 UNLOCK_SV_MUTEX;
1484 return xpvhv;
1485}
1486
645c22ef
DM
1487/* return a struct xpvhv to the free list */
1488
932e9ff9
VB
1489STATIC void
1490S_del_xpvhv(pTHX_ XPVHV *p)
1491{
1492 LOCK_SV_MUTEX;
1493 p->xhv_array = (char*)PL_xpvhv_root;
1494 PL_xpvhv_root = p;
1495 UNLOCK_SV_MUTEX;
1496}
1497
645c22ef
DM
1498/* allocate another arena's worth of struct xpvhv */
1499
932e9ff9
VB
1500STATIC void
1501S_more_xpvhv(pTHX)
1502{
1503 register XPVHV* xpvhv;
1504 register XPVHV* xpvhvend;
612f20c3
GS
1505 New(718, xpvhv, 1008/sizeof(XPVHV), XPVHV);
1506 xpvhv->xhv_array = (char*)PL_xpvhv_arenaroot;
1507 PL_xpvhv_arenaroot = xpvhv;
1508
932e9ff9 1509 xpvhvend = &xpvhv[1008 / sizeof(XPVHV) - 1];
612f20c3 1510 PL_xpvhv_root = ++xpvhv;
932e9ff9
VB
1511 while (xpvhv < xpvhvend) {
1512 xpvhv->xhv_array = (char*)(xpvhv + 1);
1513 xpvhv++;
1514 }
1515 xpvhv->xhv_array = 0;
1516}
1517
645c22ef
DM
1518/* grab a new struct xpvmg from the free list, allocating more if necessary */
1519
932e9ff9
VB
1520STATIC XPVMG*
1521S_new_xpvmg(pTHX)
1522{
1523 XPVMG* xpvmg;
1524 LOCK_SV_MUTEX;
1525 if (!PL_xpvmg_root)
1526 more_xpvmg();
1527 xpvmg = PL_xpvmg_root;
1528 PL_xpvmg_root = (XPVMG*)xpvmg->xpv_pv;
1529 UNLOCK_SV_MUTEX;
1530 return xpvmg;
1531}
1532
645c22ef
DM
1533/* return a struct xpvmg to the free list */
1534
932e9ff9
VB
1535STATIC void
1536S_del_xpvmg(pTHX_ XPVMG *p)
1537{
1538 LOCK_SV_MUTEX;
1539 p->xpv_pv = (char*)PL_xpvmg_root;
1540 PL_xpvmg_root = p;
1541 UNLOCK_SV_MUTEX;
1542}
1543
645c22ef
DM
1544/* allocate another arena's worth of struct xpvmg */
1545
932e9ff9
VB
1546STATIC void
1547S_more_xpvmg(pTHX)
1548{
1549 register XPVMG* xpvmg;
1550 register XPVMG* xpvmgend;
612f20c3
GS
1551 New(719, xpvmg, 1008/sizeof(XPVMG), XPVMG);
1552 xpvmg->xpv_pv = (char*)PL_xpvmg_arenaroot;
1553 PL_xpvmg_arenaroot = xpvmg;
1554
932e9ff9 1555 xpvmgend = &xpvmg[1008 / sizeof(XPVMG) - 1];
612f20c3 1556 PL_xpvmg_root = ++xpvmg;
932e9ff9
VB
1557 while (xpvmg < xpvmgend) {
1558 xpvmg->xpv_pv = (char*)(xpvmg + 1);
1559 xpvmg++;
1560 }
1561 xpvmg->xpv_pv = 0;
1562}
1563
645c22ef
DM
1564/* grab a new struct xpvlv from the free list, allocating more if necessary */
1565
932e9ff9
VB
1566STATIC XPVLV*
1567S_new_xpvlv(pTHX)
1568{
1569 XPVLV* xpvlv;
1570 LOCK_SV_MUTEX;
1571 if (!PL_xpvlv_root)
1572 more_xpvlv();
1573 xpvlv = PL_xpvlv_root;
1574 PL_xpvlv_root = (XPVLV*)xpvlv->xpv_pv;
1575 UNLOCK_SV_MUTEX;
1576 return xpvlv;
1577}
1578
645c22ef
DM
1579/* return a struct xpvlv to the free list */
1580
932e9ff9
VB
1581STATIC void
1582S_del_xpvlv(pTHX_ XPVLV *p)
1583{
1584 LOCK_SV_MUTEX;
1585 p->xpv_pv = (char*)PL_xpvlv_root;
1586 PL_xpvlv_root = p;
1587 UNLOCK_SV_MUTEX;
1588}
1589
645c22ef
DM
1590/* allocate another arena's worth of struct xpvlv */
1591
932e9ff9
VB
1592STATIC void
1593S_more_xpvlv(pTHX)
1594{
1595 register XPVLV* xpvlv;
1596 register XPVLV* xpvlvend;
612f20c3
GS
1597 New(720, xpvlv, 1008/sizeof(XPVLV), XPVLV);
1598 xpvlv->xpv_pv = (char*)PL_xpvlv_arenaroot;
1599 PL_xpvlv_arenaroot = xpvlv;
1600
932e9ff9 1601 xpvlvend = &xpvlv[1008 / sizeof(XPVLV) - 1];
612f20c3 1602 PL_xpvlv_root = ++xpvlv;
932e9ff9
VB
1603 while (xpvlv < xpvlvend) {
1604 xpvlv->xpv_pv = (char*)(xpvlv + 1);
1605 xpvlv++;
1606 }
1607 xpvlv->xpv_pv = 0;
1608}
1609
645c22ef
DM
1610/* grab a new struct xpvbm from the free list, allocating more if necessary */
1611
932e9ff9
VB
1612STATIC XPVBM*
1613S_new_xpvbm(pTHX)
1614{
1615 XPVBM* xpvbm;
1616 LOCK_SV_MUTEX;
1617 if (!PL_xpvbm_root)
1618 more_xpvbm();
1619 xpvbm = PL_xpvbm_root;
1620 PL_xpvbm_root = (XPVBM*)xpvbm->xpv_pv;
1621 UNLOCK_SV_MUTEX;
1622 return xpvbm;
1623}
1624
645c22ef
DM
1625/* return a struct xpvbm to the free list */
1626
932e9ff9
VB
1627STATIC void
1628S_del_xpvbm(pTHX_ XPVBM *p)
1629{
1630 LOCK_SV_MUTEX;
1631 p->xpv_pv = (char*)PL_xpvbm_root;
1632 PL_xpvbm_root = p;
1633 UNLOCK_SV_MUTEX;
1634}
1635
645c22ef
DM
1636/* allocate another arena's worth of struct xpvbm */
1637
932e9ff9
VB
1638STATIC void
1639S_more_xpvbm(pTHX)
1640{
1641 register XPVBM* xpvbm;
1642 register XPVBM* xpvbmend;
612f20c3
GS
1643 New(721, xpvbm, 1008/sizeof(XPVBM), XPVBM);
1644 xpvbm->xpv_pv = (char*)PL_xpvbm_arenaroot;
1645 PL_xpvbm_arenaroot = xpvbm;
1646
932e9ff9 1647 xpvbmend = &xpvbm[1008 / sizeof(XPVBM) - 1];
612f20c3 1648 PL_xpvbm_root = ++xpvbm;
932e9ff9
VB
1649 while (xpvbm < xpvbmend) {
1650 xpvbm->xpv_pv = (char*)(xpvbm + 1);
1651 xpvbm++;
1652 }
1653 xpvbm->xpv_pv = 0;
1654}
1655
7bab3ede
MB
1656#define my_safemalloc(s) (void*)safemalloc(s)
1657#define my_safefree(p) safefree((char*)p)
463ee0b2 1658
d33b2eba 1659#ifdef PURIFY
463ee0b2 1660
d33b2eba
GS
1661#define new_XIV() my_safemalloc(sizeof(XPVIV))
1662#define del_XIV(p) my_safefree(p)
ed6116ce 1663
d33b2eba
GS
1664#define new_XNV() my_safemalloc(sizeof(XPVNV))
1665#define del_XNV(p) my_safefree(p)
463ee0b2 1666
d33b2eba
GS
1667#define new_XRV() my_safemalloc(sizeof(XRV))
1668#define del_XRV(p) my_safefree(p)
8c52afec 1669
d33b2eba
GS
1670#define new_XPV() my_safemalloc(sizeof(XPV))
1671#define del_XPV(p) my_safefree(p)
9b94d1dd 1672
d33b2eba
GS
1673#define new_XPVIV() my_safemalloc(sizeof(XPVIV))
1674#define del_XPVIV(p) my_safefree(p)
932e9ff9 1675
d33b2eba
GS
1676#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
1677#define del_XPVNV(p) my_safefree(p)
932e9ff9 1678
d33b2eba
GS
1679#define new_XPVCV() my_safemalloc(sizeof(XPVCV))
1680#define del_XPVCV(p) my_safefree(p)
932e9ff9 1681
d33b2eba
GS
1682#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
1683#define del_XPVAV(p) my_safefree(p)
1684
1685#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
1686#define del_XPVHV(p) my_safefree(p)
1c846c1f 1687
d33b2eba
GS
1688#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
1689#define del_XPVMG(p) my_safefree(p)
1690
1691#define new_XPVLV() my_safemalloc(sizeof(XPVLV))
1692#define del_XPVLV(p) my_safefree(p)
1693
1694#define new_XPVBM() my_safemalloc(sizeof(XPVBM))
1695#define del_XPVBM(p) my_safefree(p)
1696
1697#else /* !PURIFY */
1698
1699#define new_XIV() (void*)new_xiv()
1700#define del_XIV(p) del_xiv((XPVIV*) p)
1701
1702#define new_XNV() (void*)new_xnv()
1703#define del_XNV(p) del_xnv((XPVNV*) p)
9b94d1dd 1704
d33b2eba
GS
1705#define new_XRV() (void*)new_xrv()
1706#define del_XRV(p) del_xrv((XRV*) p)
9b94d1dd 1707
d33b2eba
GS
1708#define new_XPV() (void*)new_xpv()
1709#define del_XPV(p) del_xpv((XPV *)p)
1710
1711#define new_XPVIV() (void*)new_xpviv()
1712#define del_XPVIV(p) del_xpviv((XPVIV *)p)
1713
1714#define new_XPVNV() (void*)new_xpvnv()
1715#define del_XPVNV(p) del_xpvnv((XPVNV *)p)
1716
1717#define new_XPVCV() (void*)new_xpvcv()
1718#define del_XPVCV(p) del_xpvcv((XPVCV *)p)
1719
1720#define new_XPVAV() (void*)new_xpvav()
1721#define del_XPVAV(p) del_xpvav((XPVAV *)p)
1722
1723#define new_XPVHV() (void*)new_xpvhv()
1724#define del_XPVHV(p) del_xpvhv((XPVHV *)p)
1c846c1f 1725
d33b2eba
GS
1726#define new_XPVMG() (void*)new_xpvmg()
1727#define del_XPVMG(p) del_xpvmg((XPVMG *)p)
1728
1729#define new_XPVLV() (void*)new_xpvlv()
1730#define del_XPVLV(p) del_xpvlv((XPVLV *)p)
1731
1732#define new_XPVBM() (void*)new_xpvbm()
1733#define del_XPVBM(p) del_xpvbm((XPVBM *)p)
1734
1735#endif /* PURIFY */
9b94d1dd 1736
d33b2eba
GS
1737#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
1738#define del_XPVGV(p) my_safefree(p)
1c846c1f 1739
d33b2eba
GS
1740#define new_XPVFM() my_safemalloc(sizeof(XPVFM))
1741#define del_XPVFM(p) my_safefree(p)
1c846c1f 1742
d33b2eba
GS
1743#define new_XPVIO() my_safemalloc(sizeof(XPVIO))
1744#define del_XPVIO(p) my_safefree(p)
8990e307 1745
954c1994
GS
1746/*
1747=for apidoc sv_upgrade
1748
ff276b08 1749Upgrade an SV to a more complex form. Generally adds a new body type to the
645c22ef 1750SV, then copies across as much information as possible from the old body.
ff276b08 1751You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
954c1994
GS
1752
1753=cut
1754*/
1755
79072805 1756bool
864dbfa3 1757Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
79072805 1758{
c04a4dfe
JH
1759 char* pv = NULL;
1760 U32 cur = 0;
1761 U32 len = 0;
1762 IV iv = 0;
1763 NV nv = 0.0;
1764 MAGIC* magic = NULL;
1765 HV* stash = Nullhv;
79072805 1766
765f542d
NC
1767 if (mt != SVt_PV && SvIsCOW(sv)) {
1768 sv_force_normal_flags(sv, 0);
f130fd45
NIS
1769 }
1770
79072805
LW
1771 if (SvTYPE(sv) == mt)
1772 return TRUE;
1773
a5f75d66
AD
1774 if (mt < SVt_PVIV)
1775 (void)SvOOK_off(sv);
1776
79072805
LW
1777 switch (SvTYPE(sv)) {
1778 case SVt_NULL:
1779 pv = 0;
1780 cur = 0;
1781 len = 0;
1782 iv = 0;
1783 nv = 0.0;
1784 magic = 0;
1785 stash = 0;
1786 break;
79072805
LW
1787 case SVt_IV:
1788 pv = 0;
1789 cur = 0;
1790 len = 0;
463ee0b2 1791 iv = SvIVX(sv);
65202027 1792 nv = (NV)SvIVX(sv);
79072805
LW
1793 del_XIV(SvANY(sv));
1794 magic = 0;
1795 stash = 0;
ed6116ce 1796 if (mt == SVt_NV)
463ee0b2 1797 mt = SVt_PVNV;
ed6116ce
LW
1798 else if (mt < SVt_PVIV)
1799 mt = SVt_PVIV;
79072805
LW
1800 break;
1801 case SVt_NV:
1802 pv = 0;
1803 cur = 0;
1804 len = 0;
463ee0b2 1805 nv = SvNVX(sv);
1bd302c3 1806 iv = I_V(nv);
79072805
LW
1807 magic = 0;
1808 stash = 0;
1809 del_XNV(SvANY(sv));
1810 SvANY(sv) = 0;
ed6116ce 1811 if (mt < SVt_PVNV)
79072805
LW
1812 mt = SVt_PVNV;
1813 break;
ed6116ce
LW
1814 case SVt_RV:
1815 pv = (char*)SvRV(sv);
1816 cur = 0;
1817 len = 0;
56431972
RB
1818 iv = PTR2IV(pv);
1819 nv = PTR2NV(pv);
ed6116ce
LW
1820 del_XRV(SvANY(sv));
1821 magic = 0;
1822 stash = 0;
1823 break;
79072805 1824 case SVt_PV:
463ee0b2 1825 pv = SvPVX(sv);
79072805
LW
1826 cur = SvCUR(sv);
1827 len = SvLEN(sv);
1828 iv = 0;
1829 nv = 0.0;
1830 magic = 0;
1831 stash = 0;
1832 del_XPV(SvANY(sv));
748a9306
LW
1833 if (mt <= SVt_IV)
1834 mt = SVt_PVIV;
1835 else if (mt == SVt_NV)
1836 mt = SVt_PVNV;
79072805
LW
1837 break;
1838 case SVt_PVIV:
463ee0b2 1839 pv = SvPVX(sv);
79072805
LW
1840 cur = SvCUR(sv);
1841 len = SvLEN(sv);
463ee0b2 1842 iv = SvIVX(sv);
79072805
LW
1843 nv = 0.0;
1844 magic = 0;
1845 stash = 0;
1846 del_XPVIV(SvANY(sv));
1847 break;
1848 case SVt_PVNV:
463ee0b2 1849 pv = SvPVX(sv);
79072805
LW
1850 cur = SvCUR(sv);
1851 len = SvLEN(sv);
463ee0b2
LW
1852 iv = SvIVX(sv);
1853 nv = SvNVX(sv);
79072805
LW
1854 magic = 0;
1855 stash = 0;
1856 del_XPVNV(SvANY(sv));
1857 break;
1858 case SVt_PVMG:
463ee0b2 1859 pv = SvPVX(sv);
79072805
LW
1860 cur = SvCUR(sv);
1861 len = SvLEN(sv);
463ee0b2
LW
1862 iv = SvIVX(sv);
1863 nv = SvNVX(sv);
79072805
LW
1864 magic = SvMAGIC(sv);
1865 stash = SvSTASH(sv);
1866 del_XPVMG(SvANY(sv));
1867 break;
1868 default:
cea2e8a9 1869 Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
79072805
LW
1870 }
1871
ffb05e06
NC
1872 SvFLAGS(sv) &= ~SVTYPEMASK;
1873 SvFLAGS(sv) |= mt;
1874
79072805
LW
1875 switch (mt) {
1876 case SVt_NULL:
cea2e8a9 1877 Perl_croak(aTHX_ "Can't upgrade to undef");
79072805
LW
1878 case SVt_IV:
1879 SvANY(sv) = new_XIV();
463ee0b2 1880 SvIVX(sv) = iv;
79072805
LW
1881 break;
1882 case SVt_NV:
1883 SvANY(sv) = new_XNV();
463ee0b2 1884 SvNVX(sv) = nv;
79072805 1885 break;
ed6116ce
LW
1886 case SVt_RV:
1887 SvANY(sv) = new_XRV();
1888 SvRV(sv) = (SV*)pv;
ed6116ce 1889 break;
79072805
LW
1890 case SVt_PV:
1891 SvANY(sv) = new_XPV();
463ee0b2 1892 SvPVX(sv) = pv;
79072805
LW
1893 SvCUR(sv) = cur;
1894 SvLEN(sv) = len;
1895 break;
1896 case SVt_PVIV:
1897 SvANY(sv) = new_XPVIV();
463ee0b2 1898 SvPVX(sv) = pv;
79072805
LW
1899 SvCUR(sv) = cur;
1900 SvLEN(sv) = len;
463ee0b2 1901 SvIVX(sv) = iv;
79072805 1902 if (SvNIOK(sv))
a0d0e21e 1903 (void)SvIOK_on(sv);
79072805
LW
1904 SvNOK_off(sv);
1905 break;
1906 case SVt_PVNV:
1907 SvANY(sv) = new_XPVNV();
463ee0b2 1908 SvPVX(sv) = pv;
79072805
LW
1909 SvCUR(sv) = cur;
1910 SvLEN(sv) = len;
463ee0b2
LW
1911 SvIVX(sv) = iv;
1912 SvNVX(sv) = nv;
79072805
LW
1913 break;
1914 case SVt_PVMG:
1915 SvANY(sv) = new_XPVMG();
463ee0b2 1916 SvPVX(sv) = pv;
79072805
LW
1917 SvCUR(sv) = cur;
1918 SvLEN(sv) = len;
463ee0b2
LW
1919 SvIVX(sv) = iv;
1920 SvNVX(sv) = nv;
79072805
LW
1921 SvMAGIC(sv) = magic;
1922 SvSTASH(sv) = stash;
1923 break;
1924 case SVt_PVLV:
1925 SvANY(sv) = new_XPVLV();
463ee0b2 1926 SvPVX(sv) = pv;
79072805
LW
1927 SvCUR(sv) = cur;
1928 SvLEN(sv) = len;
463ee0b2
LW
1929 SvIVX(sv) = iv;
1930 SvNVX(sv) = nv;
79072805
LW
1931 SvMAGIC(sv) = magic;
1932 SvSTASH(sv) = stash;
1933 LvTARGOFF(sv) = 0;
1934 LvTARGLEN(sv) = 0;
1935 LvTARG(sv) = 0;
1936 LvTYPE(sv) = 0;
b76195c2
DM
1937 GvGP(sv) = 0;
1938 GvNAME(sv) = 0;
1939 GvNAMELEN(sv) = 0;
1940 GvSTASH(sv) = 0;
1941 GvFLAGS(sv) = 0;
79072805
LW
1942 break;
1943 case SVt_PVAV:
1944 SvANY(sv) = new_XPVAV();
463ee0b2
LW
1945 if (pv)
1946 Safefree(pv);
2304df62 1947 SvPVX(sv) = 0;
d1bf51dd 1948 AvMAX(sv) = -1;
93965878 1949 AvFILLp(sv) = -1;
463ee0b2
LW
1950 SvIVX(sv) = 0;
1951 SvNVX(sv) = 0.0;
1952 SvMAGIC(sv) = magic;
1953 SvSTASH(sv) = stash;
1954 AvALLOC(sv) = 0;
79072805
LW
1955 AvARYLEN(sv) = 0;
1956 AvFLAGS(sv) = 0;
1957 break;
1958 case SVt_PVHV:
1959 SvANY(sv) = new_XPVHV();
463ee0b2
LW
1960 if (pv)
1961 Safefree(pv);
1962 SvPVX(sv) = 0;
1963 HvFILL(sv) = 0;
1964 HvMAX(sv) = 0;
8aacddc1
NIS
1965 HvTOTALKEYS(sv) = 0;
1966 HvPLACEHOLDERS(sv) = 0;
79072805
LW
1967 SvMAGIC(sv) = magic;
1968 SvSTASH(sv) = stash;
79072805
LW
1969 HvRITER(sv) = 0;
1970 HvEITER(sv) = 0;
1971 HvPMROOT(sv) = 0;
1972 HvNAME(sv) = 0;
79072805
LW
1973 break;
1974 case SVt_PVCV:
1975 SvANY(sv) = new_XPVCV();
748a9306 1976 Zero(SvANY(sv), 1, XPVCV);
463ee0b2 1977 SvPVX(sv) = pv;
79072805
LW
1978 SvCUR(sv) = cur;
1979 SvLEN(sv) = len;
463ee0b2
LW
1980 SvIVX(sv) = iv;
1981 SvNVX(sv) = nv;
79072805
LW
1982 SvMAGIC(sv) = magic;
1983 SvSTASH(sv) = stash;
79072805
LW
1984 break;
1985 case SVt_PVGV:
1986 SvANY(sv) = new_XPVGV();
463ee0b2 1987 SvPVX(sv) = pv;
79072805
LW
1988 SvCUR(sv) = cur;
1989 SvLEN(sv) = len;
463ee0b2
LW
1990 SvIVX(sv) = iv;
1991 SvNVX(sv) = nv;
79072805
LW
1992 SvMAGIC(sv) = magic;
1993 SvSTASH(sv) = stash;
93a17b20 1994 GvGP(sv) = 0;
79072805
LW
1995 GvNAME(sv) = 0;
1996 GvNAMELEN(sv) = 0;
1997 GvSTASH(sv) = 0;
a5f75d66 1998 GvFLAGS(sv) = 0;
79072805
LW
1999 break;
2000 case SVt_PVBM:
2001 SvANY(sv) = new_XPVBM();
463ee0b2 2002 SvPVX(sv) = pv;
79072805
LW
2003 SvCUR(sv) = cur;
2004 SvLEN(sv) = len;
463ee0b2
LW
2005 SvIVX(sv) = iv;
2006 SvNVX(sv) = nv;
79072805
LW
2007 SvMAGIC(sv) = magic;
2008 SvSTASH(sv) = stash;
2009 BmRARE(sv) = 0;
2010 BmUSEFUL(sv) = 0;
2011 BmPREVIOUS(sv) = 0;
2012 break;
2013 case SVt_PVFM:
2014 SvANY(sv) = new_XPVFM();
748a9306 2015 Zero(SvANY(sv), 1, XPVFM);
463ee0b2 2016 SvPVX(sv) = pv;
79072805
LW
2017 SvCUR(sv) = cur;
2018 SvLEN(sv) = len;
463ee0b2
LW
2019 SvIVX(sv) = iv;
2020 SvNVX(sv) = nv;
79072805
LW
2021 SvMAGIC(sv) = magic;
2022 SvSTASH(sv) = stash;
79072805 2023 break;
8990e307
LW
2024 case SVt_PVIO:
2025 SvANY(sv) = new_XPVIO();
748a9306 2026 Zero(SvANY(sv), 1, XPVIO);
8990e307
LW
2027 SvPVX(sv) = pv;
2028 SvCUR(sv) = cur;
2029 SvLEN(sv) = len;
2030 SvIVX(sv) = iv;
2031 SvNVX(sv) = nv;
2032 SvMAGIC(sv) = magic;
2033 SvSTASH(sv) = stash;
85e6fe83 2034 IoPAGE_LEN(sv) = 60;
8990e307
LW
2035 break;
2036 }
79072805
LW
2037 return TRUE;
2038}
2039
645c22ef
DM
2040/*
2041=for apidoc sv_backoff
2042
2043Remove any string offset. You should normally use the C<SvOOK_off> macro
2044wrapper instead.
2045
2046=cut
2047*/
2048
79072805 2049int
864dbfa3 2050Perl_sv_backoff(pTHX_ register SV *sv)
79072805
LW
2051{
2052 assert(SvOOK(sv));
463ee0b2
LW
2053 if (SvIVX(sv)) {
2054 char *s = SvPVX(sv);
2055 SvLEN(sv) += SvIVX(sv);
2056 SvPVX(sv) -= SvIVX(sv);
79072805 2057 SvIV_set(sv, 0);
463ee0b2 2058 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
79072805
LW
2059 }
2060 SvFLAGS(sv) &= ~SVf_OOK;
a0d0e21e 2061 return 0;
79072805
LW
2062}
2063
954c1994
GS
2064/*
2065=for apidoc sv_grow
2066
645c22ef
DM
2067Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
2068upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
2069Use the C<SvGROW> wrapper instead.
954c1994
GS
2070
2071=cut
2072*/
2073
79072805 2074char *
864dbfa3 2075Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
79072805
LW
2076{
2077 register char *s;
2078
55497cff 2079#ifdef HAS_64K_LIMIT
79072805 2080 if (newlen >= 0x10000) {
1d7c1841
GS
2081 PerlIO_printf(Perl_debug_log,
2082 "Allocation too large: %"UVxf"\n", (UV)newlen);
79072805
LW
2083 my_exit(1);
2084 }
55497cff 2085#endif /* HAS_64K_LIMIT */
a0d0e21e
LW
2086 if (SvROK(sv))
2087 sv_unref(sv);
79072805
LW
2088 if (SvTYPE(sv) < SVt_PV) {
2089 sv_upgrade(sv, SVt_PV);
463ee0b2 2090 s = SvPVX(sv);
79072805
LW
2091 }
2092 else if (SvOOK(sv)) { /* pv is offset? */
2093 sv_backoff(sv);
463ee0b2 2094 s = SvPVX(sv);
79072805
LW
2095 if (newlen > SvLEN(sv))
2096 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
c6f8c383
GA
2097#ifdef HAS_64K_LIMIT
2098 if (newlen >= 0x10000)
2099 newlen = 0xFFFF;
2100#endif
79072805 2101 }
bc44a8a2 2102 else
463ee0b2 2103 s = SvPVX(sv);
54f0641b 2104
79072805 2105 if (newlen > SvLEN(sv)) { /* need more room? */
8d6dde3e 2106 if (SvLEN(sv) && s) {
7bab3ede 2107#ifdef MYMALLOC
8d6dde3e
IZ
2108 STRLEN l = malloced_size((void*)SvPVX(sv));
2109 if (newlen <= l) {
2110 SvLEN_set(sv, l);
2111 return s;
2112 } else
c70c8a0a 2113#endif
79072805 2114 Renew(s,newlen,char);
8d6dde3e 2115 }
4e83176d 2116 else {
4e83176d 2117 New(703, s, newlen, char);
40565179 2118 if (SvPVX(sv) && SvCUR(sv)) {
54f0641b 2119 Move(SvPVX(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
40565179 2120 }
4e83176d 2121 }
79072805
LW
2122 SvPV_set(sv, s);
2123 SvLEN_set(sv, newlen);
2124 }
2125 return s;
2126}
2127
954c1994
GS
2128/*
2129=for apidoc sv_setiv
2130
645c22ef
DM
2131Copies an integer into the given SV, upgrading first if necessary.
2132Does not handle 'set' magic. See also C<sv_setiv_mg>.
954c1994
GS
2133
2134=cut
2135*/
2136
79072805 2137void
864dbfa3 2138Perl_sv_setiv(pTHX_ register SV *sv, IV i)
79072805 2139{
765f542d 2140 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2
LW
2141 switch (SvTYPE(sv)) {
2142 case SVt_NULL:
79072805 2143 sv_upgrade(sv, SVt_IV);
463ee0b2
LW
2144 break;
2145 case SVt_NV:
2146 sv_upgrade(sv, SVt_PVNV);
2147 break;
ed6116ce 2148 case SVt_RV:
463ee0b2 2149 case SVt_PV:
79072805 2150 sv_upgrade(sv, SVt_PVIV);
463ee0b2 2151 break;
a0d0e21e
LW
2152
2153 case SVt_PVGV:
a0d0e21e
LW
2154 case SVt_PVAV:
2155 case SVt_PVHV:
2156 case SVt_PVCV:
2157 case SVt_PVFM:
2158 case SVt_PVIO:
411caa50 2159 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
53e06cf0 2160 OP_DESC(PL_op));
463ee0b2 2161 }
a0d0e21e 2162 (void)SvIOK_only(sv); /* validate number */
a5f75d66 2163 SvIVX(sv) = i;
463ee0b2 2164 SvTAINT(sv);
79072805
LW
2165}
2166
954c1994
GS
2167/*
2168=for apidoc sv_setiv_mg
2169
2170Like C<sv_setiv>, but also handles 'set' magic.
2171
2172=cut
2173*/
2174
79072805 2175void
864dbfa3 2176Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
ef50df4b
GS
2177{
2178 sv_setiv(sv,i);
2179 SvSETMAGIC(sv);
2180}
2181
954c1994
GS
2182/*
2183=for apidoc sv_setuv
2184
645c22ef
DM
2185Copies an unsigned integer into the given SV, upgrading first if necessary.
2186Does not handle 'set' magic. See also C<sv_setuv_mg>.
954c1994
GS
2187
2188=cut
2189*/
2190
ef50df4b 2191void
864dbfa3 2192Perl_sv_setuv(pTHX_ register SV *sv, UV u)
55497cff 2193{
55ada374
NC
2194 /* With these two if statements:
2195 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 2196
55ada374
NC
2197 without
2198 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 2199
55ada374
NC
2200 If you wish to remove them, please benchmark to see what the effect is
2201 */
28e5dec8
JH
2202 if (u <= (UV)IV_MAX) {
2203 sv_setiv(sv, (IV)u);
2204 return;
2205 }
25da4f38
IZ
2206 sv_setiv(sv, 0);
2207 SvIsUV_on(sv);
2208 SvUVX(sv) = u;
55497cff 2209}
2210
954c1994
GS
2211/*
2212=for apidoc sv_setuv_mg
2213
2214Like C<sv_setuv>, but also handles 'set' magic.
2215
2216=cut
2217*/
2218
55497cff 2219void
864dbfa3 2220Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
ef50df4b 2221{
55ada374
NC
2222 /* With these two if statements:
2223 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 2224
55ada374
NC
2225 without
2226 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 2227
55ada374
NC
2228 If you wish to remove them, please benchmark to see what the effect is
2229 */
28e5dec8
JH
2230 if (u <= (UV)IV_MAX) {
2231 sv_setiv(sv, (IV)u);
2232 } else {
2233 sv_setiv(sv, 0);
2234 SvIsUV_on(sv);
2235 sv_setuv(sv,u);
2236 }
ef50df4b
GS
2237 SvSETMAGIC(sv);
2238}
2239
954c1994
GS
2240/*
2241=for apidoc sv_setnv
2242
645c22ef
DM
2243Copies a double into the given SV, upgrading first if necessary.
2244Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
2245
2246=cut
2247*/
2248
ef50df4b 2249void
65202027 2250Perl_sv_setnv(pTHX_ register SV *sv, NV num)
79072805 2251{
765f542d 2252 SV_CHECK_THINKFIRST_COW_DROP(sv);
a0d0e21e
LW
2253 switch (SvTYPE(sv)) {
2254 case SVt_NULL:
2255 case SVt_IV:
79072805 2256 sv_upgrade(sv, SVt_NV);
a0d0e21e 2257 break;
a0d0e21e
LW
2258 case SVt_RV:
2259 case SVt_PV:
2260 case SVt_PVIV:
79072805 2261 sv_upgrade(sv, SVt_PVNV);
a0d0e21e 2262 break;
827b7e14 2263
a0d0e21e 2264 case SVt_PVGV:
a0d0e21e
LW
2265 case SVt_PVAV:
2266 case SVt_PVHV:
2267 case SVt_PVCV:
2268 case SVt_PVFM:
2269 case SVt_PVIO:
411caa50 2270 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
53e06cf0 2271 OP_NAME(PL_op));
79072805 2272 }
463ee0b2 2273 SvNVX(sv) = num;
a0d0e21e 2274 (void)SvNOK_only(sv); /* validate number */
463ee0b2 2275 SvTAINT(sv);
79072805
LW
2276}
2277
954c1994
GS
2278/*
2279=for apidoc sv_setnv_mg
2280
2281Like C<sv_setnv>, but also handles 'set' magic.
2282
2283=cut
2284*/
2285
ef50df4b 2286void
65202027 2287Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
ef50df4b
GS
2288{
2289 sv_setnv(sv,num);
2290 SvSETMAGIC(sv);
2291}
2292
645c22ef
DM
2293/* Print an "isn't numeric" warning, using a cleaned-up,
2294 * printable version of the offending string
2295 */
2296
76e3520e 2297STATIC void
cea2e8a9 2298S_not_a_number(pTHX_ SV *sv)
a0d0e21e 2299{
94463019
JH
2300 SV *dsv;
2301 char tmpbuf[64];
2302 char *pv;
2303
2304 if (DO_UTF8(sv)) {
2305 dsv = sv_2mortal(newSVpv("", 0));
2306 pv = sv_uni_display(dsv, sv, 10, 0);
2307 } else {
2308 char *d = tmpbuf;
2309 char *limit = tmpbuf + sizeof(tmpbuf) - 8;
2310 /* each *s can expand to 4 chars + "...\0",
2311 i.e. need room for 8 chars */
ecdeb87c 2312
94463019
JH
2313 char *s, *end;
2314 for (s = SvPVX(sv), end = s + SvCUR(sv); s < end && d < limit; s++) {
2315 int ch = *s & 0xFF;
2316 if (ch & 128 && !isPRINT_LC(ch)) {
2317 *d++ = 'M';
2318 *d++ = '-';
2319 ch &= 127;
2320 }
2321 if (ch == '\n') {
2322 *d++ = '\\';
2323 *d++ = 'n';
2324 }
2325 else if (ch == '\r') {
2326 *d++ = '\\';
2327 *d++ = 'r';
2328 }
2329 else if (ch == '\f') {
2330 *d++ = '\\';
2331 *d++ = 'f';
2332 }
2333 else if (ch == '\\') {
2334 *d++ = '\\';
2335 *d++ = '\\';
2336 }
2337 else if (ch == '\0') {
2338 *d++ = '\\';
2339 *d++ = '0';
2340 }
2341 else if (isPRINT_LC(ch))
2342 *d++ = ch;
2343 else {
2344 *d++ = '^';
2345 *d++ = toCTRL(ch);
2346 }
2347 }
2348 if (s < end) {
2349 *d++ = '.';
2350 *d++ = '.';
2351 *d++ = '.';
2352 }
2353 *d = '\0';
2354 pv = tmpbuf;
a0d0e21e 2355 }
a0d0e21e 2356
533c011a 2357 if (PL_op)
9014280d 2358 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
2359 "Argument \"%s\" isn't numeric in %s", pv,
2360 OP_DESC(PL_op));
a0d0e21e 2361 else
9014280d 2362 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 2363 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
2364}
2365
c2988b20
NC
2366/*
2367=for apidoc looks_like_number
2368
645c22ef
DM
2369Test if the content of an SV looks like a number (or is a number).
2370C<Inf> and C<Infinity> are treated as numbers (so will not issue a
2371non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
2372
2373=cut
2374*/
2375
2376I32
2377Perl_looks_like_number(pTHX_ SV *sv)
2378{
2379 register char *sbegin;
2380 STRLEN len;
2381
2382 if (SvPOK(sv)) {
2383 sbegin = SvPVX(sv);
2384 len = SvCUR(sv);
2385 }
2386 else if (SvPOKp(sv))
2387 sbegin = SvPV(sv, len);
2388 else
e0ab1c0e 2389 return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
c2988b20
NC
2390 return grok_number(sbegin, len, NULL);
2391}
25da4f38
IZ
2392
2393/* Actually, ISO C leaves conversion of UV to IV undefined, but
2394 until proven guilty, assume that things are not that bad... */
2395
645c22ef
DM
2396/*
2397 NV_PRESERVES_UV:
2398
2399 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
2400 an IV (an assumption perl has been based on to date) it becomes necessary
2401 to remove the assumption that the NV always carries enough precision to
2402 recreate the IV whenever needed, and that the NV is the canonical form.
2403 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 2404 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
2405 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
2406 1) to distinguish between IV/UV/NV slots that have cached a valid
2407 conversion where precision was lost and IV/UV/NV slots that have a
2408 valid conversion which has lost no precision
645c22ef 2409 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
2410 would lose precision, the precise conversion (or differently
2411 imprecise conversion) is also performed and cached, to prevent
2412 requests for different numeric formats on the same SV causing
2413 lossy conversion chains. (lossless conversion chains are perfectly
2414 acceptable (still))
2415
2416
2417 flags are used:
2418 SvIOKp is true if the IV slot contains a valid value
2419 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
2420 SvNOKp is true if the NV slot contains a valid value
2421 SvNOK is true only if the NV value is accurate
2422
2423 so
645c22ef 2424 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
2425 IV(or UV) would lose accuracy over a direct conversion from PV to
2426 IV(or UV). If it would, cache both conversions, return NV, but mark
2427 SV as IOK NOKp (ie not NOK).
2428
645c22ef 2429 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
2430 NV would lose accuracy over a direct conversion from PV to NV. If it
2431 would, cache both conversions, flag similarly.
2432
2433 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
2434 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
2435 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
2436 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 2437 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 2438
645c22ef
DM
2439 The benefit of this is that operations such as pp_add know that if
2440 SvIOK is true for both left and right operands, then integer addition
2441 can be used instead of floating point (for cases where the result won't
2442 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
2443 loss of precision compared with integer addition.
2444
2445 * making IV and NV equal status should make maths accurate on 64 bit
2446 platforms
2447 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 2448 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
2449 looking for SvIOK and checking for overflow will not outweigh the
2450 fp to integer speedup)
2451 * will slow down integer operations (callers of SvIV) on "inaccurate"
2452 values, as the change from SvIOK to SvIOKp will cause a call into
2453 sv_2iv each time rather than a macro access direct to the IV slot
2454 * should speed up number->string conversion on integers as IV is
645c22ef 2455 favoured when IV and NV are equally accurate
28e5dec8
JH
2456
2457 ####################################################################
645c22ef
DM
2458 You had better be using SvIOK_notUV if you want an IV for arithmetic:
2459 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
2460 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
2461 ####################################################################
2462
645c22ef 2463 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
2464 performance ratio.
2465*/
2466
2467#ifndef NV_PRESERVES_UV
645c22ef
DM
2468# define IS_NUMBER_UNDERFLOW_IV 1
2469# define IS_NUMBER_UNDERFLOW_UV 2
2470# define IS_NUMBER_IV_AND_UV 2
2471# define IS_NUMBER_OVERFLOW_IV 4
2472# define IS_NUMBER_OVERFLOW_UV 5
2473
2474/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
2475
2476/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
2477STATIC int
645c22ef 2478S_sv_2iuv_non_preserve(pTHX_ register SV *sv, I32 numtype)
28e5dec8 2479{
1779d84d 2480 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
2481 if (SvNVX(sv) < (NV)IV_MIN) {
2482 (void)SvIOKp_on(sv);
2483 (void)SvNOK_on(sv);
2484 SvIVX(sv) = IV_MIN;
2485 return IS_NUMBER_UNDERFLOW_IV;
2486 }
2487 if (SvNVX(sv) > (NV)UV_MAX) {
2488 (void)SvIOKp_on(sv);
2489 (void)SvNOK_on(sv);
2490 SvIsUV_on(sv);
2491 SvUVX(sv) = UV_MAX;
2492 return IS_NUMBER_OVERFLOW_UV;
2493 }
c2988b20
NC
2494 (void)SvIOKp_on(sv);
2495 (void)SvNOK_on(sv);
2496 /* Can't use strtol etc to convert this string. (See truth table in
2497 sv_2iv */
2498 if (SvNVX(sv) <= (UV)IV_MAX) {
2499 SvIVX(sv) = I_V(SvNVX(sv));
2500 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2501 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
2502 } else {
2503 /* Integer is imprecise. NOK, IOKp */
2504 }
2505 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
2506 }
2507 SvIsUV_on(sv);
2508 SvUVX(sv) = U_V(SvNVX(sv));
2509 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2510 if (SvUVX(sv) == UV_MAX) {
2511 /* As we know that NVs don't preserve UVs, UV_MAX cannot
2512 possibly be preserved by NV. Hence, it must be overflow.
2513 NOK, IOKp */
2514 return IS_NUMBER_OVERFLOW_UV;
2515 }
2516 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
2517 } else {
2518 /* Integer is imprecise. NOK, IOKp */
28e5dec8 2519 }
c2988b20 2520 return IS_NUMBER_OVERFLOW_IV;
28e5dec8 2521}
645c22ef
DM
2522#endif /* !NV_PRESERVES_UV*/
2523
891f9566
YST
2524/* sv_2iv() is now a macro using Perl_sv_2iv_flags();
2525 * this function provided for binary compatibility only
2526 */
2527
2528IV
2529Perl_sv_2iv(pTHX_ register SV *sv)
2530{
2531 return sv_2iv_flags(sv, SV_GMAGIC);
2532}
2533
645c22ef 2534/*
891f9566 2535=for apidoc sv_2iv_flags
645c22ef 2536
891f9566
YST
2537Return the integer value of an SV, doing any necessary string
2538conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2539Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
645c22ef
DM
2540
2541=cut
2542*/
28e5dec8 2543
a0d0e21e 2544IV
891f9566 2545Perl_sv_2iv_flags(pTHX_ register SV *sv, I32 flags)
79072805
LW
2546{
2547 if (!sv)
2548 return 0;
8990e307 2549 if (SvGMAGICAL(sv)) {
891f9566
YST
2550 if (flags & SV_GMAGIC)
2551 mg_get(sv);
463ee0b2
LW
2552 if (SvIOKp(sv))
2553 return SvIVX(sv);
748a9306 2554 if (SvNOKp(sv)) {
25da4f38 2555 return I_V(SvNVX(sv));
748a9306 2556 }
36477c24 2557 if (SvPOKp(sv) && SvLEN(sv))
2558 return asIV(sv);
3fe9a6f1 2559 if (!SvROK(sv)) {
d008e5eb 2560 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2561 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 2562 report_uninit(sv);
c6ee37c5 2563 }
36477c24 2564 return 0;
3fe9a6f1 2565 }
463ee0b2 2566 }
ed6116ce 2567 if (SvTHINKFIRST(sv)) {
a0d0e21e 2568 if (SvROK(sv)) {
a0d0e21e 2569 SV* tmpstr;
1554e226 2570 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2571 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2572 return SvIV(tmpstr);
56431972 2573 return PTR2IV(SvRV(sv));
a0d0e21e 2574 }
765f542d
NC
2575 if (SvIsCOW(sv)) {
2576 sv_force_normal_flags(sv, 0);
47deb5e7 2577 }
0336b60e 2578 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2579 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2580 report_uninit(sv);
ed6116ce
LW
2581 return 0;
2582 }
79072805 2583 }
25da4f38
IZ
2584 if (SvIOKp(sv)) {
2585 if (SvIsUV(sv)) {
2586 return (IV)(SvUVX(sv));
2587 }
2588 else {
2589 return SvIVX(sv);
2590 }
463ee0b2 2591 }
748a9306 2592 if (SvNOKp(sv)) {
28e5dec8
JH
2593 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2594 * without also getting a cached IV/UV from it at the same time
2595 * (ie PV->NV conversion should detect loss of accuracy and cache
2596 * IV or UV at same time to avoid this. NWC */
25da4f38
IZ
2597
2598 if (SvTYPE(sv) == SVt_NV)
2599 sv_upgrade(sv, SVt_PVNV);
2600
28e5dec8
JH
2601 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2602 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
2603 certainly cast into the IV range at IV_MAX, whereas the correct
2604 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
2605 cases go to UV */
2606 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
748a9306 2607 SvIVX(sv) = I_V(SvNVX(sv));
28e5dec8
JH
2608 if (SvNVX(sv) == (NV) SvIVX(sv)
2609#ifndef NV_PRESERVES_UV
2610 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2611 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2612 /* Don't flag it as "accurately an integer" if the number
2613 came from a (by definition imprecise) NV operation, and
2614 we're outside the range of NV integer precision */
2615#endif
2616 ) {
2617 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2618 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2619 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2620 PTR2UV(sv),
2621 SvNVX(sv),
2622 SvIVX(sv)));
2623
2624 } else {
2625 /* IV not precise. No need to convert from PV, as NV
2626 conversion would already have cached IV if it detected
2627 that PV->IV would be better than PV->NV->IV
2628 flags already correct - don't set public IOK. */
2629 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2630 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2631 PTR2UV(sv),
2632 SvNVX(sv),
2633 SvIVX(sv)));
2634 }
2635 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2636 but the cast (NV)IV_MIN rounds to a the value less (more
2637 negative) than IV_MIN which happens to be equal to SvNVX ??
2638 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2639 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2640 (NV)UVX == NVX are both true, but the values differ. :-(
2641 Hopefully for 2s complement IV_MIN is something like
2642 0x8000000000000000 which will be exact. NWC */
d460ef45 2643 }
25da4f38 2644 else {
ff68c719 2645 SvUVX(sv) = U_V(SvNVX(sv));
28e5dec8
JH
2646 if (
2647 (SvNVX(sv) == (NV) SvUVX(sv))
2648#ifndef NV_PRESERVES_UV
2649 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2650 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2651 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2652 /* Don't flag it as "accurately an integer" if the number
2653 came from a (by definition imprecise) NV operation, and
2654 we're outside the range of NV integer precision */
2655#endif
2656 )
2657 SvIOK_on(sv);
25da4f38
IZ
2658 SvIsUV_on(sv);
2659 ret_iv_max:
1c846c1f 2660 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 2661 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 2662 PTR2UV(sv),
57def98f
JH
2663 SvUVX(sv),
2664 SvUVX(sv)));
25da4f38
IZ
2665 return (IV)SvUVX(sv);
2666 }
748a9306
LW
2667 }
2668 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20
NC
2669 UV value;
2670 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
25da4f38
IZ
2671 /* We want to avoid a possible problem when we cache an IV which
2672 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
2673 the same as the direct translation of the initial string
2674 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2675 be careful to ensure that the value with the .456 is around if the
2676 NV value is requested in the future).
1c846c1f 2677
25da4f38
IZ
2678 This means that if we cache such an IV, we need to cache the
2679 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 2680 cache the NV if we are sure it's not needed.
25da4f38 2681 */
16b7a9a4 2682
c2988b20
NC
2683 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2684 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2685 == IS_NUMBER_IN_UV) {
5e045b90 2686 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
2687 if (SvTYPE(sv) < SVt_PVIV)
2688 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 2689 (void)SvIOK_on(sv);
c2988b20
NC
2690 } else if (SvTYPE(sv) < SVt_PVNV)
2691 sv_upgrade(sv, SVt_PVNV);
28e5dec8 2692
c2988b20
NC
2693 /* If NV preserves UV then we only use the UV value if we know that
2694 we aren't going to call atof() below. If NVs don't preserve UVs
2695 then the value returned may have more precision than atof() will
2696 return, even though value isn't perfectly accurate. */
2697 if ((numtype & (IS_NUMBER_IN_UV
2698#ifdef NV_PRESERVES_UV
2699 | IS_NUMBER_NOT_INT
2700#endif
2701 )) == IS_NUMBER_IN_UV) {
2702 /* This won't turn off the public IOK flag if it was set above */
2703 (void)SvIOKp_on(sv);
2704
2705 if (!(numtype & IS_NUMBER_NEG)) {
2706 /* positive */;
2707 if (value <= (UV)IV_MAX) {
2708 SvIVX(sv) = (IV)value;
2709 } else {
2710 SvUVX(sv) = value;
2711 SvIsUV_on(sv);
2712 }
2713 } else {
2714 /* 2s complement assumption */
2715 if (value <= (UV)IV_MIN) {
2716 SvIVX(sv) = -(IV)value;
2717 } else {
2718 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2719 I'm assuming it will be rare. */
c2988b20
NC
2720 if (SvTYPE(sv) < SVt_PVNV)
2721 sv_upgrade(sv, SVt_PVNV);
2722 SvNOK_on(sv);
2723 SvIOK_off(sv);
2724 SvIOKp_on(sv);
2725 SvNVX(sv) = -(NV)value;
2726 SvIVX(sv) = IV_MIN;
2727 }
2728 }
2729 }
2730 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2731 will be in the previous block to set the IV slot, and the next
2732 block to set the NV slot. So no else here. */
2733
2734 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2735 != IS_NUMBER_IN_UV) {
2736 /* It wasn't an (integer that doesn't overflow the UV). */
2737 SvNVX(sv) = Atof(SvPVX(sv));
28e5dec8 2738
c2988b20
NC
2739 if (! numtype && ckWARN(WARN_NUMERIC))
2740 not_a_number(sv);
28e5dec8 2741
65202027 2742#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2743 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2744 PTR2UV(sv), SvNVX(sv)));
65202027 2745#else
1779d84d 2746 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 2747 PTR2UV(sv), SvNVX(sv)));
65202027 2748#endif
28e5dec8
JH
2749
2750
2751#ifdef NV_PRESERVES_UV
c2988b20
NC
2752 (void)SvIOKp_on(sv);
2753 (void)SvNOK_on(sv);
2754 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2755 SvIVX(sv) = I_V(SvNVX(sv));
2756 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2757 SvIOK_on(sv);
28e5dec8 2758 } else {
c2988b20
NC
2759 /* Integer is imprecise. NOK, IOKp */
2760 }
2761 /* UV will not work better than IV */
2762 } else {
2763 if (SvNVX(sv) > (NV)UV_MAX) {
2764 SvIsUV_on(sv);
2765 /* Integer is inaccurate. NOK, IOKp, is UV */
2766 SvUVX(sv) = UV_MAX;
2767 SvIsUV_on(sv);
2768 } else {
2769 SvUVX(sv) = U_V(SvNVX(sv));
2770 /* 0xFFFFFFFFFFFFFFFF not an issue in here */
2771 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2772 SvIOK_on(sv);
28e5dec8
JH
2773 SvIsUV_on(sv);
2774 } else {
c2988b20
NC
2775 /* Integer is imprecise. NOK, IOKp, is UV */
2776 SvIsUV_on(sv);
28e5dec8 2777 }
28e5dec8 2778 }
c2988b20
NC
2779 goto ret_iv_max;
2780 }
28e5dec8 2781#else /* NV_PRESERVES_UV */
c2988b20
NC
2782 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2783 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2784 /* The IV slot will have been set from value returned by
2785 grok_number above. The NV slot has just been set using
2786 Atof. */
560b0c46 2787 SvNOK_on(sv);
c2988b20
NC
2788 assert (SvIOKp(sv));
2789 } else {
2790 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2791 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2792 /* Small enough to preserve all bits. */
2793 (void)SvIOKp_on(sv);
2794 SvNOK_on(sv);
2795 SvIVX(sv) = I_V(SvNVX(sv));
2796 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2797 SvIOK_on(sv);
2798 /* Assumption: first non-preserved integer is < IV_MAX,
2799 this NV is in the preserved range, therefore: */
2800 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2801 < (UV)IV_MAX)) {
32fdb065 2802 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
2803 }
2804 } else {
2805 /* IN_UV NOT_INT
2806 0 0 already failed to read UV.
2807 0 1 already failed to read UV.
2808 1 0 you won't get here in this case. IV/UV
2809 slot set, public IOK, Atof() unneeded.
2810 1 1 already read UV.
2811 so there's no point in sv_2iuv_non_preserve() attempting
2812 to use atol, strtol, strtoul etc. */
2813 if (sv_2iuv_non_preserve (sv, numtype)
2814 >= IS_NUMBER_OVERFLOW_IV)
2815 goto ret_iv_max;
2816 }
2817 }
28e5dec8 2818#endif /* NV_PRESERVES_UV */
25da4f38 2819 }
28e5dec8 2820 } else {
599cee73 2821 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 2822 report_uninit(sv);
25da4f38
IZ
2823 if (SvTYPE(sv) < SVt_IV)
2824 /* Typically the caller expects that sv_any is not NULL now. */
2825 sv_upgrade(sv, SVt_IV);
a0d0e21e 2826 return 0;
79072805 2827 }
1d7c1841
GS
2828 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2829 PTR2UV(sv),SvIVX(sv)));
25da4f38 2830 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
2831}
2832
891f9566
YST
2833/* sv_2uv() is now a macro using Perl_sv_2uv_flags();
2834 * this function provided for binary compatibility only
2835 */
2836
2837UV
2838Perl_sv_2uv(pTHX_ register SV *sv)
2839{
2840 return sv_2uv_flags(sv, SV_GMAGIC);
2841}
2842
645c22ef 2843/*
891f9566 2844=for apidoc sv_2uv_flags
645c22ef
DM
2845
2846Return the unsigned integer value of an SV, doing any necessary string
891f9566
YST
2847conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2848Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
645c22ef
DM
2849
2850=cut
2851*/
2852
ff68c719 2853UV
891f9566 2854Perl_sv_2uv_flags(pTHX_ register SV *sv, I32 flags)
ff68c719 2855{
2856 if (!sv)
2857 return 0;
2858 if (SvGMAGICAL(sv)) {
891f9566
YST
2859 if (flags & SV_GMAGIC)
2860 mg_get(sv);
ff68c719 2861 if (SvIOKp(sv))
2862 return SvUVX(sv);
2863 if (SvNOKp(sv))
2864 return U_V(SvNVX(sv));
36477c24 2865 if (SvPOKp(sv) && SvLEN(sv))
2866 return asUV(sv);
3fe9a6f1 2867 if (!SvROK(sv)) {
d008e5eb 2868 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2869 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 2870 report_uninit(sv);
c6ee37c5 2871 }
36477c24 2872 return 0;
3fe9a6f1 2873 }
ff68c719 2874 }
2875 if (SvTHINKFIRST(sv)) {
2876 if (SvROK(sv)) {
ff68c719 2877 SV* tmpstr;
1554e226 2878 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2879 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2880 return SvUV(tmpstr);
56431972 2881 return PTR2UV(SvRV(sv));
ff68c719 2882 }
765f542d
NC
2883 if (SvIsCOW(sv)) {
2884 sv_force_normal_flags(sv, 0);
8a818333 2885 }
0336b60e 2886 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2887 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2888 report_uninit(sv);
ff68c719 2889 return 0;
2890 }
2891 }
25da4f38
IZ
2892 if (SvIOKp(sv)) {
2893 if (SvIsUV(sv)) {
2894 return SvUVX(sv);
2895 }
2896 else {
2897 return (UV)SvIVX(sv);
2898 }
ff68c719 2899 }
2900 if (SvNOKp(sv)) {
28e5dec8
JH
2901 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2902 * without also getting a cached IV/UV from it at the same time
2903 * (ie PV->NV conversion should detect loss of accuracy and cache
2904 * IV or UV at same time to avoid this. */
2905 /* IV-over-UV optimisation - choose to cache IV if possible */
2906
25da4f38
IZ
2907 if (SvTYPE(sv) == SVt_NV)
2908 sv_upgrade(sv, SVt_PVNV);
28e5dec8
JH
2909
2910 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2911 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
f7bbb42a 2912 SvIVX(sv) = I_V(SvNVX(sv));
28e5dec8
JH
2913 if (SvNVX(sv) == (NV) SvIVX(sv)
2914#ifndef NV_PRESERVES_UV
2915 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2916 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2917 /* Don't flag it as "accurately an integer" if the number
2918 came from a (by definition imprecise) NV operation, and
2919 we're outside the range of NV integer precision */
2920#endif
2921 ) {
2922 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2923 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2924 "0x%"UVxf" uv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2925 PTR2UV(sv),
2926 SvNVX(sv),
2927 SvIVX(sv)));
2928
2929 } else {
2930 /* IV not precise. No need to convert from PV, as NV
2931 conversion would already have cached IV if it detected
2932 that PV->IV would be better than PV->NV->IV
2933 flags already correct - don't set public IOK. */
2934 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2935 "0x%"UVxf" uv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2936 PTR2UV(sv),
2937 SvNVX(sv),
2938 SvIVX(sv)));
2939 }
2940 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2941 but the cast (NV)IV_MIN rounds to a the value less (more
2942 negative) than IV_MIN which happens to be equal to SvNVX ??
2943 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2944 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2945 (NV)UVX == NVX are both true, but the values differ. :-(
2946 Hopefully for 2s complement IV_MIN is something like
2947 0x8000000000000000 which will be exact. NWC */
d460ef45 2948 }
28e5dec8
JH
2949 else {
2950 SvUVX(sv) = U_V(SvNVX(sv));
2951 if (
2952 (SvNVX(sv) == (NV) SvUVX(sv))
2953#ifndef NV_PRESERVES_UV
2954 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2955 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2956 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2957 /* Don't flag it as "accurately an integer" if the number
2958 came from a (by definition imprecise) NV operation, and
2959 we're outside the range of NV integer precision */
2960#endif
2961 )
2962 SvIOK_on(sv);
2963 SvIsUV_on(sv);
1c846c1f 2964 DEBUG_c(PerlIO_printf(Perl_debug_log,
28e5dec8 2965 "0x%"UVxf" 2uv(%"UVuf" => %"IVdf") (as unsigned)\n",
57def98f 2966 PTR2UV(sv),
28e5dec8
JH
2967 SvUVX(sv),
2968 SvUVX(sv)));
25da4f38 2969 }
ff68c719 2970 }
2971 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20
NC
2972 UV value;
2973 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
25da4f38
IZ
2974
2975 /* We want to avoid a possible problem when we cache a UV which
2976 may be later translated to an NV, and the resulting NV is not
2977 the translation of the initial data.
1c846c1f 2978
25da4f38
IZ
2979 This means that if we cache such a UV, we need to cache the
2980 NV as well. Moreover, we trade speed for space, and do not
2981 cache the NV if not needed.
2982 */
16b7a9a4 2983
c2988b20
NC
2984 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2985 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2986 == IS_NUMBER_IN_UV) {
5e045b90 2987 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8 2988 if (SvTYPE(sv) < SVt_PVIV)
f7bbb42a
JH
2989 sv_upgrade(sv, SVt_PVIV);
2990 (void)SvIOK_on(sv);
c2988b20
NC
2991 } else if (SvTYPE(sv) < SVt_PVNV)
2992 sv_upgrade(sv, SVt_PVNV);
d460ef45 2993
c2988b20
NC
2994 /* If NV preserves UV then we only use the UV value if we know that
2995 we aren't going to call atof() below. If NVs don't preserve UVs
2996 then the value returned may have more precision than atof() will
2997 return, even though it isn't accurate. */
2998 if ((numtype & (IS_NUMBER_IN_UV
2999#ifdef NV_PRESERVES_UV
3000 | IS_NUMBER_NOT_INT
3001#endif
3002 )) == IS_NUMBER_IN_UV) {
3003 /* This won't turn off the public IOK flag if it was set above */
3004 (void)SvIOKp_on(sv);
3005
3006 if (!(numtype & IS_NUMBER_NEG)) {
3007 /* positive */;
3008 if (value <= (UV)IV_MAX) {
3009 SvIVX(sv) = (IV)value;
28e5dec8
JH
3010 } else {
3011 /* it didn't overflow, and it was positive. */
c2988b20 3012 SvUVX(sv) = value;
28e5dec8
JH
3013 SvIsUV_on(sv);
3014 }
c2988b20
NC
3015 } else {
3016 /* 2s complement assumption */
3017 if (value <= (UV)IV_MIN) {
3018 SvIVX(sv) = -(IV)value;
3019 } else {
3020 /* Too negative for an IV. This is a double upgrade, but
d1be9408 3021 I'm assuming it will be rare. */
c2988b20
NC
3022 if (SvTYPE(sv) < SVt_PVNV)
3023 sv_upgrade(sv, SVt_PVNV);
3024 SvNOK_on(sv);
3025 SvIOK_off(sv);
3026 SvIOKp_on(sv);
3027 SvNVX(sv) = -(NV)value;
3028 SvIVX(sv) = IV_MIN;
3029 }
3030 }
3031 }
3032
3033 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3034 != IS_NUMBER_IN_UV) {
3035 /* It wasn't an integer, or it overflowed the UV. */
3036 SvNVX(sv) = Atof(SvPVX(sv));
28e5dec8 3037
c2988b20 3038 if (! numtype && ckWARN(WARN_NUMERIC))
28e5dec8
JH
3039 not_a_number(sv);
3040
3041#if defined(USE_LONG_DOUBLE)
c2988b20
NC
3042 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%" PERL_PRIgldbl ")\n",
3043 PTR2UV(sv), SvNVX(sv)));
28e5dec8 3044#else
1779d84d 3045 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"NVgf")\n",
c2988b20 3046 PTR2UV(sv), SvNVX(sv)));
28e5dec8
JH
3047#endif
3048
3049#ifdef NV_PRESERVES_UV
c2988b20
NC
3050 (void)SvIOKp_on(sv);
3051 (void)SvNOK_on(sv);
3052 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
3053 SvIVX(sv) = I_V(SvNVX(sv));
3054 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
3055 SvIOK_on(sv);
3056 } else {
3057 /* Integer is imprecise. NOK, IOKp */
3058 }
3059 /* UV will not work better than IV */
3060 } else {
3061 if (SvNVX(sv) > (NV)UV_MAX) {
3062 SvIsUV_on(sv);
3063 /* Integer is inaccurate. NOK, IOKp, is UV */
3064 SvUVX(sv) = UV_MAX;
3065 SvIsUV_on(sv);
3066 } else {
3067 SvUVX(sv) = U_V(SvNVX(sv));
3068 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
3069 NV preservse UV so can do correct comparison. */
3070 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
3071 SvIOK_on(sv);
3072 SvIsUV_on(sv);
3073 } else {
3074 /* Integer is imprecise. NOK, IOKp, is UV */
3075 SvIsUV_on(sv);
3076 }
3077 }
3078 }
28e5dec8 3079#else /* NV_PRESERVES_UV */
c2988b20
NC
3080 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3081 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
3082 /* The UV slot will have been set from value returned by
3083 grok_number above. The NV slot has just been set using
3084 Atof. */
560b0c46 3085 SvNOK_on(sv);
c2988b20
NC
3086 assert (SvIOKp(sv));
3087 } else {
3088 if (((UV)1 << NV_PRESERVES_UV_BITS) >
3089 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
3090 /* Small enough to preserve all bits. */
3091 (void)SvIOKp_on(sv);
3092 SvNOK_on(sv);
3093 SvIVX(sv) = I_V(SvNVX(sv));
3094 if ((NV)(SvIVX(sv)) == SvNVX(sv))
3095 SvIOK_on(sv);
3096 /* Assumption: first non-preserved integer is < IV_MAX,
3097 this NV is in the preserved range, therefore: */
3098 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
3099 < (UV)IV_MAX)) {
32fdb065 3100 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
3101 }
3102 } else
3103 sv_2iuv_non_preserve (sv, numtype);
3104 }
28e5dec8 3105#endif /* NV_PRESERVES_UV */
f7bbb42a 3106 }
ff68c719 3107 }
3108 else {
d008e5eb 3109 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3110 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3111 report_uninit(sv);
c6ee37c5 3112 }
25da4f38
IZ
3113 if (SvTYPE(sv) < SVt_IV)
3114 /* Typically the caller expects that sv_any is not NULL now. */
3115 sv_upgrade(sv, SVt_IV);
ff68c719 3116 return 0;
3117 }
25da4f38 3118
1d7c1841
GS
3119 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
3120 PTR2UV(sv),SvUVX(sv)));
25da4f38 3121 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 3122}
3123
645c22ef
DM
3124/*
3125=for apidoc sv_2nv
3126
3127Return the num value of an SV, doing any necessary string or integer
3128conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
3129macros.
3130
3131=cut
3132*/
3133
65202027 3134NV
864dbfa3 3135Perl_sv_2nv(pTHX_ register SV *sv)
79072805
LW
3136{
3137 if (!sv)
3138 return 0.0;
8990e307 3139 if (SvGMAGICAL(sv)) {
463ee0b2
LW
3140 mg_get(sv);
3141 if (SvNOKp(sv))
3142 return SvNVX(sv);
a0d0e21e 3143 if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20
NC
3144 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) &&
3145 !grok_number(SvPVX(sv), SvCUR(sv), NULL))
a0d0e21e 3146 not_a_number(sv);
097ee67d 3147 return Atof(SvPVX(sv));
a0d0e21e 3148 }
25da4f38 3149 if (SvIOKp(sv)) {
1c846c1f 3150 if (SvIsUV(sv))
65202027 3151 return (NV)SvUVX(sv);
25da4f38 3152 else
65202027 3153 return (NV)SvIVX(sv);
25da4f38 3154 }
16d20bd9 3155 if (!SvROK(sv)) {
d008e5eb 3156 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3157 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3158 report_uninit(sv);
c6ee37c5 3159 }
16d20bd9
AD
3160 return 0;
3161 }
463ee0b2 3162 }
ed6116ce 3163 if (SvTHINKFIRST(sv)) {
a0d0e21e 3164 if (SvROK(sv)) {
a0d0e21e 3165 SV* tmpstr;
1554e226 3166 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 3167 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 3168 return SvNV(tmpstr);
56431972 3169 return PTR2NV(SvRV(sv));
a0d0e21e 3170 }
765f542d
NC
3171 if (SvIsCOW(sv)) {
3172 sv_force_normal_flags(sv, 0);
8a818333 3173 }
0336b60e 3174 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 3175 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 3176 report_uninit(sv);
ed6116ce
LW
3177 return 0.0;
3178 }
79072805
LW
3179 }
3180 if (SvTYPE(sv) < SVt_NV) {
463ee0b2
LW
3181 if (SvTYPE(sv) == SVt_IV)
3182 sv_upgrade(sv, SVt_PVNV);
3183 else
3184 sv_upgrade(sv, SVt_NV);
906f284f 3185#ifdef USE_LONG_DOUBLE
097ee67d 3186 DEBUG_c({
f93f4e46 3187 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
3188 PerlIO_printf(Perl_debug_log,
3189 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
3190 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
3191 RESTORE_NUMERIC_LOCAL();
3192 });
65202027 3193#else
572bbb43 3194 DEBUG_c({
f93f4e46 3195 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 3196 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 3197 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
3198 RESTORE_NUMERIC_LOCAL();
3199 });
572bbb43 3200#endif
79072805
LW
3201 }
3202 else if (SvTYPE(sv) < SVt_PVNV)
3203 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
3204 if (SvNOKp(sv)) {
3205 return SvNVX(sv);
61604483 3206 }
59d8ce62 3207 if (SvIOKp(sv)) {
65202027 3208 SvNVX(sv) = SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv);
28e5dec8
JH
3209#ifdef NV_PRESERVES_UV
3210 SvNOK_on(sv);
3211#else
3212 /* Only set the public NV OK flag if this NV preserves the IV */
3213 /* Check it's not 0xFFFFFFFFFFFFFFFF */
3214 if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
3215 : (SvIVX(sv) == I_V(SvNVX(sv))))
3216 SvNOK_on(sv);
3217 else
3218 SvNOKp_on(sv);
3219#endif
93a17b20 3220 }
748a9306 3221 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20
NC
3222 UV value;
3223 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
3224 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !numtype)
a0d0e21e 3225 not_a_number(sv);
28e5dec8 3226#ifdef NV_PRESERVES_UV
c2988b20
NC
3227 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3228 == IS_NUMBER_IN_UV) {
5e045b90 3229 /* It's definitely an integer */
c2988b20
NC
3230 SvNVX(sv) = (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value;
3231 } else
3232 SvNVX(sv) = Atof(SvPVX(sv));
28e5dec8
JH
3233 SvNOK_on(sv);
3234#else
c2988b20 3235 SvNVX(sv) = Atof(SvPVX(sv));
28e5dec8
JH
3236 /* Only set the public NV OK flag if this NV preserves the value in
3237 the PV at least as well as an IV/UV would.
3238 Not sure how to do this 100% reliably. */
3239 /* if that shift count is out of range then Configure's test is
3240 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
3241 UV_BITS */
3242 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 3243 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 3244 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
3245 } else if (!(numtype & IS_NUMBER_IN_UV)) {
3246 /* Can't use strtol etc to convert this string, so don't try.
3247 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
3248 SvNOK_on(sv);
3249 } else {
3250 /* value has been set. It may not be precise. */
3251 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
3252 /* 2s complement assumption for (UV)IV_MIN */
3253 SvNOK_on(sv); /* Integer is too negative. */
3254 } else {
3255 SvNOKp_on(sv);
3256 SvIOKp_on(sv);
6fa402ec 3257
c2988b20
NC
3258 if (numtype & IS_NUMBER_NEG) {
3259 SvIVX(sv) = -(IV)value;
3260 } else if (value <= (UV)IV_MAX) {
3261 SvIVX(sv) = (IV)value;
3262 } else {
3263 SvUVX(sv) = value;
3264 SvIsUV_on(sv);
3265 }
3266
3267 if (numtype & IS_NUMBER_NOT_INT) {
3268 /* I believe that even if the original PV had decimals,
3269 they are lost beyond the limit of the FP precision.
3270 However, neither is canonical, so both only get p
3271 flags. NWC, 2000/11/25 */
3272 /* Both already have p flags, so do nothing */
3273 } else {
3274 NV nv = SvNVX(sv);
3275 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
3276 if (SvIVX(sv) == I_V(nv)) {
3277 SvNOK_on(sv);
3278 SvIOK_on(sv);
3279 } else {
3280 SvIOK_on(sv);
3281 /* It had no "." so it must be integer. */
3282 }
3283 } else {
3284 /* between IV_MAX and NV(UV_MAX).
3285 Could be slightly > UV_MAX */
6fa402ec 3286
c2988b20
NC
3287 if (numtype & IS_NUMBER_NOT_INT) {
3288 /* UV and NV both imprecise. */
3289 } else {
3290 UV nv_as_uv = U_V(nv);
3291
3292 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
3293 SvNOK_on(sv);
3294 SvIOK_on(sv);
3295 } else {
3296 SvIOK_on(sv);
3297 }
3298 }
3299 }
3300 }
3301 }
3302 }
28e5dec8 3303#endif /* NV_PRESERVES_UV */
93a17b20 3304 }
79072805 3305 else {
599cee73 3306 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 3307 report_uninit(sv);
25da4f38
IZ
3308 if (SvTYPE(sv) < SVt_NV)
3309 /* Typically the caller expects that sv_any is not NULL now. */
28e5dec8
JH
3310 /* XXX Ilya implies that this is a bug in callers that assume this
3311 and ideally should be fixed. */
25da4f38 3312 sv_upgrade(sv, SVt_NV);
a0d0e21e 3313 return 0.0;
79072805 3314 }
572bbb43 3315#if defined(USE_LONG_DOUBLE)
097ee67d 3316 DEBUG_c({
f93f4e46 3317 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
3318 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
3319 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
3320 RESTORE_NUMERIC_LOCAL();
3321 });
65202027 3322#else
572bbb43 3323 DEBUG_c({
f93f4e46 3324 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 3325 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 3326 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
3327 RESTORE_NUMERIC_LOCAL();
3328 });
572bbb43 3329#endif
463ee0b2 3330 return SvNVX(sv);
79072805
LW
3331}
3332
645c22ef
DM
3333/* asIV(): extract an integer from the string value of an SV.
3334 * Caller must validate PVX */
3335
76e3520e 3336STATIC IV
cea2e8a9 3337S_asIV(pTHX_ SV *sv)
36477c24 3338{
c2988b20
NC
3339 UV value;
3340 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
3341
3342 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3343 == IS_NUMBER_IN_UV) {
645c22ef 3344 /* It's definitely an integer */
c2988b20
NC
3345 if (numtype & IS_NUMBER_NEG) {
3346 if (value < (UV)IV_MIN)
3347 return -(IV)value;
3348 } else {
3349 if (value < (UV)IV_MAX)
3350 return (IV)value;
3351 }
3352 }
d008e5eb 3353 if (!numtype) {
d008e5eb
GS
3354 if (ckWARN(WARN_NUMERIC))
3355 not_a_number(sv);
3356 }
c2988b20 3357 return I_V(Atof(SvPVX(sv)));
36477c24 3358}
3359
645c22ef
DM
3360/* asUV(): extract an unsigned integer from the string value of an SV
3361 * Caller must validate PVX */
3362
76e3520e 3363STATIC UV
cea2e8a9 3364S_asUV(pTHX_ SV *sv)
36477c24 3365{
c2988b20
NC
3366 UV value;
3367 int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
36477c24 3368
c2988b20
NC
3369 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3370 == IS_NUMBER_IN_UV) {
645c22ef 3371 /* It's definitely an integer */
6fa402ec 3372 if (!(numtype & IS_NUMBER_NEG))
c2988b20
NC
3373 return value;
3374 }
d008e5eb 3375 if (!numtype) {
d008e5eb
GS
3376 if (ckWARN(WARN_NUMERIC))
3377 not_a_number(sv);
3378 }
097ee67d 3379 return U_V(Atof(SvPVX(sv)));
36477c24 3380}
3381
645c22ef
DM
3382/*
3383=for apidoc sv_2pv_nolen
3384
3385Like C<sv_2pv()>, but doesn't return the length too. You should usually
3386use the macro wrapper C<SvPV_nolen(sv)> instead.
3387=cut
3388*/
3389
79072805 3390char *
864dbfa3 3391Perl_sv_2pv_nolen(pTHX_ register SV *sv)
1fa8b10d
JD
3392{
3393 STRLEN n_a;
3394 return sv_2pv(sv, &n_a);
3395}
3396
645c22ef
DM
3397/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
3398 * UV as a string towards the end of buf, and return pointers to start and
3399 * end of it.
3400 *
3401 * We assume that buf is at least TYPE_CHARS(UV) long.
3402 */
3403
864dbfa3 3404static char *
25da4f38
IZ
3405uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
3406{
25da4f38
IZ
3407 char *ptr = buf + TYPE_CHARS(UV);
3408 char *ebuf = ptr;
3409 int sign;
25da4f38
IZ
3410
3411 if (is_uv)
3412 sign = 0;
3413 else if (iv >= 0) {
3414 uv = iv;
3415 sign = 0;
3416 } else {
3417 uv = -iv;
3418 sign = 1;
3419 }
3420 do {
eb160463 3421 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
3422 } while (uv /= 10);
3423 if (sign)
3424 *--ptr = '-';
3425 *peob = ebuf;
3426 return ptr;
3427}
3428
09540bc3
JH
3429/* sv_2pv() is now a macro using Perl_sv_2pv_flags();
3430 * this function provided for binary compatibility only
3431 */
3432
3433char *
3434Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
3435{
3436 return sv_2pv_flags(sv, lp, SV_GMAGIC);
3437}
3438
645c22ef
DM
3439/*
3440=for apidoc sv_2pv_flags
3441
ff276b08 3442Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
3443If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
3444if necessary.
3445Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
3446usually end up here too.
3447
3448=cut
3449*/
3450
8d6d96c1
HS
3451char *
3452Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
3453{
79072805
LW
3454 register char *s;
3455 int olderrno;
cb50f42d 3456 SV *tsv, *origsv;
25da4f38
IZ
3457 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
3458 char *tmpbuf = tbuf;
79072805 3459
463ee0b2
LW
3460 if (!sv) {
3461 *lp = 0;
3462 return "";
3463 }
8990e307 3464 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
3465 if (flags & SV_GMAGIC)
3466 mg_get(sv);
463ee0b2
LW
3467 if (SvPOKp(sv)) {
3468 *lp = SvCUR(sv);
3469 return SvPVX(sv);
3470 }
cf2093f6 3471 if (SvIOKp(sv)) {
1c846c1f 3472 if (SvIsUV(sv))
57def98f 3473 (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
cf2093f6 3474 else
57def98f 3475 (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
46fc3d4c 3476 tsv = Nullsv;
a0d0e21e 3477 goto tokensave;
463ee0b2
LW
3478 }
3479 if (SvNOKp(sv)) {
2d4389e4 3480 Gconvert(SvNVX(sv), NV_DIG, 0, tmpbuf);
46fc3d4c 3481 tsv = Nullsv;
a0d0e21e 3482 goto tokensave;
463ee0b2 3483 }
16d20bd9 3484 if (!SvROK(sv)) {
d008e5eb 3485 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3486 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3487 report_uninit(sv);
c6ee37c5 3488 }
16d20bd9
AD
3489 *lp = 0;
3490 return "";
3491 }
463ee0b2 3492 }
ed6116ce
LW
3493 if (SvTHINKFIRST(sv)) {
3494 if (SvROK(sv)) {
a0d0e21e 3495 SV* tmpstr;
1554e226 3496 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)) &&
b4b9a328 3497 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
446eaa42
YST
3498 char *pv = SvPV(tmpstr, *lp);
3499 if (SvUTF8(tmpstr))
3500 SvUTF8_on(sv);
3501 else
3502 SvUTF8_off(sv);
3503 return pv;
3504 }
cb50f42d 3505 origsv = sv;
ed6116ce
LW
3506 sv = (SV*)SvRV(sv);
3507 if (!sv)
3508 s = "NULLREF";
3509 else {
f9277f47
IZ
3510 MAGIC *mg;
3511
ed6116ce 3512 switch (SvTYPE(sv)) {
f9277f47
IZ
3513 case SVt_PVMG:
3514 if ( ((SvFLAGS(sv) &
1c846c1f 3515 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
faf82a0b 3516 == (SVs_OBJECT|SVs_SMG))
14befaf4 3517 && (mg = mg_find(sv, PERL_MAGIC_qr))) {
2cd61cdb 3518 regexp *re = (regexp *)mg->mg_obj;
1bd3ad17 3519
2cd61cdb 3520 if (!mg->mg_ptr) {
8782bef2
GB
3521 char *fptr = "msix";
3522 char reflags[6];
3523 char ch;
3524 int left = 0;
3525 int right = 4;
ff385a1b 3526 char need_newline = 0;
eb160463 3527 U16 reganch = (U16)((re->reganch & PMf_COMPILETIME) >> 12);
8782bef2 3528
155aba94 3529 while((ch = *fptr++)) {
8782bef2
GB
3530 if(reganch & 1) {
3531 reflags[left++] = ch;
3532 }
3533 else {
3534 reflags[right--] = ch;
3535 }
3536 reganch >>= 1;
3537 }
3538 if(left != 4) {
3539 reflags[left] = '-';
3540 left = 5;
3541 }
3542
3543 mg->mg_len = re->prelen + 4 + left;
ff385a1b
JF
3544 /*
3545 * If /x was used, we have to worry about a regex
3546 * ending with a comment later being embedded
3547 * within another regex. If so, we don't want this
3548 * regex's "commentization" to leak out to the
3549 * right part of the enclosing regex, we must cap
3550 * it with a newline.
3551 *
3552 * So, if /x was used, we scan backwards from the
3553 * end of the regex. If we find a '#' before we
3554 * find a newline, we need to add a newline
3555 * ourself. If we find a '\n' first (or if we
3556 * don't find '#' or '\n'), we don't need to add
3557 * anything. -jfriedl
3558 */
3559 if (PMf_EXTENDED & re->reganch)
3560 {
3561 char *endptr = re->precomp + re->prelen;
3562 while (endptr >= re->precomp)
3563 {
3564 char c = *(endptr--);
3565 if (c == '\n')
3566 break; /* don't need another */
3567 if (c == '#') {
3568 /* we end while in a comment, so we
3569 need a newline */
3570 mg->mg_len++; /* save space for it */
3571 need_newline = 1; /* note to add it */
ab01544f 3572 break;
ff385a1b
JF
3573 }
3574 }
3575 }
3576
8782bef2
GB
3577 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
3578 Copy("(?", mg->mg_ptr, 2, char);
3579 Copy(reflags, mg->mg_ptr+2, left, char);
3580 Copy(":", mg->mg_ptr+left+2, 1, char);
3581 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
ff385a1b
JF
3582 if (need_newline)
3583 mg->mg_ptr[mg->mg_len - 2] = '\n';
1bd3ad17
IZ
3584 mg->mg_ptr[mg->mg_len - 1] = ')';
3585 mg->mg_ptr[mg->mg_len] = 0;
3586 }
3280af22 3587 PL_reginterp_cnt += re->program[0].next_off;
cb50f42d
YST
3588
3589 if (re->reganch & ROPT_UTF8)
3590 SvUTF8_on(origsv);
3591 else
3592 SvUTF8_off(origsv);
1bd3ad17
IZ
3593 *lp = mg->mg_len;
3594 return mg->mg_ptr;
f9277f47
IZ
3595 }
3596 /* Fall through */
ed6116ce
LW
3597 case SVt_NULL:
3598 case SVt_IV:
3599 case SVt_NV:
3600 case SVt_RV:
3601 case SVt_PV:
3602 case SVt_PVIV:
3603 case SVt_PVNV:
81689caa
HS
3604 case SVt_PVBM: if (SvROK(sv))
3605 s = "REF";
3606 else
3607 s = "SCALAR"; break;
be65207d
DM
3608 case SVt_PVLV: s = SvROK(sv) ? "REF"
3609 /* tied lvalues should appear to be
3610 * scalars for backwards compatitbility */
3611 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
3612 ? "SCALAR" : "LVALUE"; break;
ed6116ce
LW
3613 case SVt_PVAV: s = "ARRAY"; break;
3614 case SVt_PVHV: s = "HASH"; break;
3615 case SVt_PVCV: s = "CODE"; break;
3616 case SVt_PVGV: s = "GLOB"; break;
1d2dff63 3617 case SVt_PVFM: s = "FORMAT"; break;
36477c24 3618 case SVt_PVIO: s = "IO"; break;
ed6116ce
LW
3619 default: s = "UNKNOWN"; break;
3620 }
46fc3d4c 3621 tsv = NEWSV(0,0);
de11ba31 3622 if (SvOBJECT(sv))
e27ad1f2
AV
3623 if (HvNAME(SvSTASH(sv)))
3624 Perl_sv_setpvf(aTHX_ tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
3625 else
3626 Perl_sv_setpvf(aTHX_ tsv, "__ANON__=%s", s);
ed6116ce 3627 else
46fc3d4c 3628 sv_setpv(tsv, s);
57def98f 3629 Perl_sv_catpvf(aTHX_ tsv, "(0x%"UVxf")", PTR2UV(sv));
a0d0e21e 3630 goto tokensaveref;
463ee0b2 3631 }
ed6116ce
LW
3632 *lp = strlen(s);
3633 return s;
79072805 3634 }
0336b60e 3635 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 3636 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 3637 report_uninit(sv);
ed6116ce
LW
3638 *lp = 0;
3639 return "";
79072805 3640 }
79072805 3641 }
28e5dec8
JH
3642 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
3643 /* I'm assuming that if both IV and NV are equally valid then
3644 converting the IV is going to be more efficient */
3645 U32 isIOK = SvIOK(sv);
3646 U32 isUIOK = SvIsUV(sv);
3647 char buf[TYPE_CHARS(UV)];
3648 char *ebuf, *ptr;
3649
3650 if (SvTYPE(sv) < SVt_PVIV)
3651 sv_upgrade(sv, SVt_PVIV);
3652 if (isUIOK)
3653 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
3654 else
3655 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
eb160463 3656 SvGROW(sv, (STRLEN)(ebuf - ptr + 1)); /* inlined from sv_setpvn */
28e5dec8
JH
3657 Move(ptr,SvPVX(sv),ebuf - ptr,char);
3658 SvCUR_set(sv, ebuf - ptr);
3659 s = SvEND(sv);
3660 *s = '\0';
3661 if (isIOK)
3662 SvIOK_on(sv);
3663 else
3664 SvIOKp_on(sv);
3665 if (isUIOK)
3666 SvIsUV_on(sv);
3667 }
3668 else if (SvNOKp(sv)) {
79072805
LW
3669 if (SvTYPE(sv) < SVt_PVNV)
3670 sv_upgrade(sv, SVt_PVNV);
1c846c1f 3671 /* The +20 is pure guesswork. Configure test needed. --jhi */
59155cc0 3672 SvGROW(sv, NV_DIG + 20);
463ee0b2 3673 s = SvPVX(sv);
79072805 3674 olderrno = errno; /* some Xenix systems wipe out errno here */
79072805 3675#ifdef apollo
463ee0b2 3676 if (SvNVX(sv) == 0.0)
79072805
LW
3677 (void)strcpy(s,"0");
3678 else
3679#endif /*apollo*/
bbce6d69 3680 {
2d4389e4 3681 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 3682 }
79072805 3683 errno = olderrno;
a0d0e21e
LW
3684#ifdef FIXNEGATIVEZERO
3685 if (*s == '-' && s[1] == '0' && !s[2])
3686 strcpy(s,"0");
3687#endif
79072805
LW
3688 while (*s) s++;
3689#ifdef hcx
3690 if (s[-1] == '.')
46fc3d4c 3691 *--s = '\0';
79072805
LW
3692#endif
3693 }
79072805 3694 else {
0336b60e
IZ
3695 if (ckWARN(WARN_UNINITIALIZED)
3696 && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 3697 report_uninit(sv);
a0d0e21e 3698 *lp = 0;
25da4f38
IZ
3699 if (SvTYPE(sv) < SVt_PV)
3700 /* Typically the caller expects that sv_any is not NULL now. */
3701 sv_upgrade(sv, SVt_PV);
a0d0e21e 3702 return "";
79072805 3703 }
463ee0b2
LW
3704 *lp = s - SvPVX(sv);
3705 SvCUR_set(sv, *lp);
79072805 3706 SvPOK_on(sv);
1d7c1841
GS
3707 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3708 PTR2UV(sv),SvPVX(sv)));
463ee0b2 3709 return SvPVX(sv);
a0d0e21e
LW
3710
3711 tokensave:
3712 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
3713 /* Sneaky stuff here */
3714
3715 tokensaveref:
46fc3d4c 3716 if (!tsv)
96827780 3717 tsv = newSVpv(tmpbuf, 0);
46fc3d4c 3718 sv_2mortal(tsv);
3719 *lp = SvCUR(tsv);
3720 return SvPVX(tsv);
a0d0e21e
LW
3721 }
3722 else {
3723 STRLEN len;
46fc3d4c 3724 char *t;
3725
3726 if (tsv) {
3727 sv_2mortal(tsv);
3728 t = SvPVX(tsv);
3729 len = SvCUR(tsv);
3730 }
3731 else {
96827780
MB
3732 t = tmpbuf;
3733 len = strlen(tmpbuf);
46fc3d4c 3734 }
a0d0e21e 3735#ifdef FIXNEGATIVEZERO
46fc3d4c 3736 if (len == 2 && t[0] == '-' && t[1] == '0') {
3737 t = "0";
3738 len = 1;
3739 }
a0d0e21e
LW
3740#endif
3741 (void)SvUPGRADE(sv, SVt_PV);
46fc3d4c 3742 *lp = len;
a0d0e21e
LW
3743 s = SvGROW(sv, len + 1);
3744 SvCUR_set(sv, len);
46fc3d4c 3745 (void)strcpy(s, t);
6bf554b4 3746 SvPOKp_on(sv);
a0d0e21e
LW
3747 return s;
3748 }
463ee0b2
LW
3749}
3750
645c22ef 3751/*
6050d10e
JP
3752=for apidoc sv_copypv
3753
3754Copies a stringified representation of the source SV into the
3755destination SV. Automatically performs any necessary mg_get and
54f0641b 3756coercion of numeric values into strings. Guaranteed to preserve
6050d10e 3757UTF-8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
3758sv_2pv[_flags] but operates directly on an SV instead of just the
3759string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
3760would lose the UTF-8'ness of the PV.
3761
3762=cut
3763*/
3764
3765void
3766Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
3767{
446eaa42
YST
3768 STRLEN len;
3769 char *s;
3770 s = SvPV(ssv,len);
cb50f42d 3771 sv_setpvn(dsv,s,len);
446eaa42 3772 if (SvUTF8(ssv))
cb50f42d 3773 SvUTF8_on(dsv);
446eaa42 3774 else
cb50f42d 3775 SvUTF8_off(dsv);
6050d10e
JP
3776}
3777
3778/*
645c22ef
DM
3779=for apidoc sv_2pvbyte_nolen
3780
3781Return a pointer to the byte-encoded representation of the SV.
1e54db1a 3782May cause the SV to be downgraded from UTF-8 as a side-effect.
645c22ef
DM
3783
3784Usually accessed via the C<SvPVbyte_nolen> macro.
3785
3786=cut
3787*/
3788
7340a771
GS
3789char *
3790Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
3791{
560a288e
GS
3792 STRLEN n_a;
3793 return sv_2pvbyte(sv, &n_a);
7340a771
GS
3794}
3795
645c22ef
DM
3796/*
3797=for apidoc sv_2pvbyte
3798
3799Return a pointer to the byte-encoded representation of the SV, and set *lp
1e54db1a 3800to its length. May cause the SV to be downgraded from UTF-8 as a
645c22ef
DM
3801side-effect.
3802
3803Usually accessed via the C<SvPVbyte> macro.
3804
3805=cut
3806*/
3807
7340a771
GS
3808char *
3809Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
3810{
0875d2fe
NIS
3811 sv_utf8_downgrade(sv,0);
3812 return SvPV(sv,*lp);
7340a771
GS
3813}
3814
645c22ef
DM
3815/*
3816=for apidoc sv_2pvutf8_nolen
3817
1e54db1a
JH
3818Return a pointer to the UTF-8-encoded representation of the SV.
3819May cause the SV to be upgraded to UTF-8 as a side-effect.
645c22ef
DM
3820
3821Usually accessed via the C<SvPVutf8_nolen> macro.
3822
3823=cut
3824*/
3825
7340a771
GS
3826char *
3827Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
3828{
560a288e
GS
3829 STRLEN n_a;
3830 return sv_2pvutf8(sv, &n_a);
7340a771
GS
3831}
3832
645c22ef
DM
3833/*
3834=for apidoc sv_2pvutf8
3835
1e54db1a
JH
3836Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3837to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
645c22ef
DM
3838
3839Usually accessed via the C<SvPVutf8> macro.
3840
3841=cut
3842*/
3843
7340a771
GS
3844char *
3845Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
3846{
560a288e 3847 sv_utf8_upgrade(sv);
7d59b7e4 3848 return SvPV(sv,*lp);
7340a771 3849}
1c846c1f 3850
645c22ef
DM
3851/*
3852=for apidoc sv_2bool
3853
3854This function is only called on magical items, and is only used by
8cf8f3d1 3855sv_true() or its macro equivalent.
645c22ef
DM
3856
3857=cut
3858*/
3859
463ee0b2 3860bool
864dbfa3 3861Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 3862{
8990e307 3863 if (SvGMAGICAL(sv))
463ee0b2
LW
3864 mg_get(sv);
3865
a0d0e21e
LW
3866 if (!SvOK(sv))
3867 return 0;
3868 if (SvROK(sv)) {
a0d0e21e 3869 SV* tmpsv;
1554e226 3870 if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
9e3013b1 3871 (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
8a31060d 3872 return (bool)SvTRUE(tmpsv);
a0d0e21e
LW
3873 return SvRV(sv) != 0;
3874 }
463ee0b2 3875 if (SvPOKp(sv)) {
11343788
MB
3876 register XPV* Xpvtmp;
3877 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
3878 (*Xpvtmp->xpv_pv > '0' ||
3879 Xpvtmp->xpv_cur > 1 ||
3880 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
463ee0b2
LW
3881 return 1;
3882 else
3883 return 0;
3884 }
3885 else {
3886 if (SvIOKp(sv))
3887 return SvIVX(sv) != 0;
3888 else {
3889 if (SvNOKp(sv))
3890 return SvNVX(sv) != 0.0;
3891 else
3892 return FALSE;
3893 }
3894 }
79072805
LW
3895}
3896
09540bc3
JH
3897/* sv_utf8_upgrade() is now a macro using sv_utf8_upgrade_flags();
3898 * this function provided for binary compatibility only
3899 */
3900
3901
3902STRLEN
3903Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
3904{
3905 return sv_utf8_upgrade_flags(sv, SV_GMAGIC);
3906}
3907
c461cf8f
JH
3908/*
3909=for apidoc sv_utf8_upgrade
3910
78ea37eb 3911Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3912Forces the SV to string form if it is not already.
4411f3b6
NIS
3913Always sets the SvUTF8 flag to avoid future validity checks even
3914if all the bytes have hibit clear.
c461cf8f 3915
13a6c0e0
JH
3916This is not as a general purpose byte encoding to Unicode interface:
3917use the Encode extension for that.
3918
8d6d96c1
HS
3919=for apidoc sv_utf8_upgrade_flags
3920
78ea37eb 3921Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3922Forces the SV to string form if it is not already.
8d6d96c1
HS
3923Always sets the SvUTF8 flag to avoid future validity checks even
3924if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
3925will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
3926C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3927
13a6c0e0
JH
3928This is not as a general purpose byte encoding to Unicode interface:
3929use the Encode extension for that.
3930
8d6d96c1
HS
3931=cut
3932*/
3933
3934STRLEN
3935Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
3936{
db42d148 3937 U8 *s, *t, *e;
511c2ff0 3938 int hibit = 0;
560a288e 3939
808c356f
RGS
3940 if (sv == &PL_sv_undef)
3941 return 0;
e0e62c2a
NIS
3942 if (!SvPOK(sv)) {
3943 STRLEN len = 0;
f5cee72b 3944 (void) SvPV_force(sv,len);
e0e62c2a 3945 }
4411f3b6 3946
f5cee72b
TS
3947 if (SvUTF8(sv)) {
3948 SvSETMAGIC(sv);
5fec3b1d 3949 return SvCUR(sv);
f5cee72b 3950 }
5fec3b1d 3951
765f542d
NC
3952 if (SvIsCOW(sv)) {
3953 sv_force_normal_flags(sv, 0);
db42d148
NIS
3954 }
3955
88632417 3956 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
799ef3cb 3957 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 3958 else { /* Assume Latin-1/EBCDIC */
0a378802
JH
3959 /* This function could be much more efficient if we
3960 * had a FLAG in SVs to signal if there are any hibit
3961 * chars in the PV. Given that there isn't such a flag
3962 * make the loop as fast as possible. */
3963 s = (U8 *) SvPVX(sv);
3964 e = (U8 *) SvEND(sv);
3965 t = s;
3966 while (t < e) {
3967 U8 ch = *t++;
3968 if ((hibit = !NATIVE_IS_INVARIANT(ch)))
3969 break;
3970 }
3971 if (hibit) {
3972 STRLEN len;
cc2578a4 3973 (void)SvOOK_off(sv);
06a45632 3974 s = (U8*)SvPVX(sv);
0a378802
JH
3975 len = SvCUR(sv) + 1; /* Plus the \0 */
3976 SvPVX(sv) = (char*)bytes_to_utf8((U8*)s, &len);
3977 SvCUR(sv) = len - 1;
3978 if (SvLEN(sv) != 0)
3979 Safefree(s); /* No longer using what was there before. */
3980 SvLEN(sv) = len; /* No longer know the real size. */
3981 }
9f4817db
JH
3982 /* Mark as UTF-8 even if no hibit - saves scanning loop */
3983 SvUTF8_on(sv);
560a288e 3984 }
f5cee72b 3985 SvSETMAGIC(sv);
4411f3b6 3986 return SvCUR(sv);
560a288e
GS
3987}
3988
c461cf8f
JH
3989/*
3990=for apidoc sv_utf8_downgrade
3991
78ea37eb
TS
3992Attempts to convert the PV of an SV from characters to bytes.
3993If the PV contains a character beyond byte, this conversion will fail;
3994in this case, either returns false or, if C<fail_ok> is not
c461cf8f
JH
3995true, croaks.
3996
13a6c0e0
JH
3997This is not as a general purpose Unicode to byte encoding interface:
3998use the Encode extension for that.
3999
c461cf8f
JH
4000=cut
4001*/
4002
560a288e
GS
4003bool
4004Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
4005{
78ea37eb 4006 if (SvPOKp(sv) && SvUTF8(sv)) {
fa301091 4007 if (SvCUR(sv)) {
03cfe0ae 4008 U8 *s;
652088fc 4009 STRLEN len;
fa301091 4010
765f542d
NC
4011 if (SvIsCOW(sv)) {
4012 sv_force_normal_flags(sv, 0);
4013 }
03cfe0ae
NIS
4014 s = (U8 *) SvPV(sv, len);
4015 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
4016 if (fail_ok)
4017 return FALSE;
4018 else {
4019 if (PL_op)
4020 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 4021 OP_DESC(PL_op));
fa301091
JH
4022 else
4023 Perl_croak(aTHX_ "Wide character");
4024 }
4b3603a4 4025 }
fa301091 4026 SvCUR(sv) = len;
67e989fb 4027 }
560a288e 4028 }
ffebcc3e 4029 SvUTF8_off(sv);
560a288e
GS
4030 return TRUE;
4031}
4032
c461cf8f
JH
4033/*
4034=for apidoc sv_utf8_encode
4035
78ea37eb
TS
4036Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
4037flag off so that it looks like octets again.
c461cf8f
JH
4038
4039=cut
4040*/
4041
560a288e
GS
4042void
4043Perl_sv_utf8_encode(pTHX_ register SV *sv)
4044{
4411f3b6 4045 (void) sv_utf8_upgrade(sv);
4c94c214
NC
4046 if (SvIsCOW(sv)) {
4047 sv_force_normal_flags(sv, 0);
4048 }
4049 if (SvREADONLY(sv)) {
4050 Perl_croak(aTHX_ PL_no_modify);
4051 }
560a288e
GS
4052 SvUTF8_off(sv);
4053}
4054
4411f3b6
NIS
4055/*
4056=for apidoc sv_utf8_decode
4057
78ea37eb
TS
4058If the PV of the SV is an octet sequence in UTF-8
4059and contains a multiple-byte character, the C<SvUTF8> flag is turned on
4060so that it looks like a character. If the PV contains only single-byte
4061characters, the C<SvUTF8> flag stays being off.
4062Scans PV for validity and returns false if the PV is invalid UTF-8.
4411f3b6
NIS
4063
4064=cut
4065*/
4066
560a288e
GS
4067bool
4068Perl_sv_utf8_decode(pTHX_ register SV *sv)
4069{
78ea37eb 4070 if (SvPOKp(sv)) {
63cd0674
NIS
4071 U8 *c;
4072 U8 *e;
9cbac4c7 4073
645c22ef
DM
4074 /* The octets may have got themselves encoded - get them back as
4075 * bytes
4076 */
4077 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
4078 return FALSE;
4079
4080 /* it is actually just a matter of turning the utf8 flag on, but
4081 * we want to make sure everything inside is valid utf8 first.
4082 */
63cd0674
NIS
4083 c = (U8 *) SvPVX(sv);
4084 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 4085 return FALSE;
63cd0674 4086 e = (U8 *) SvEND(sv);
511c2ff0 4087 while (c < e) {
c4d5f83a
NIS
4088 U8 ch = *c++;
4089 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
4090 SvUTF8_on(sv);
4091 break;
4092 }
560a288e 4093 }
560a288e
GS
4094 }
4095 return TRUE;
4096}
4097
09540bc3
JH
4098/* sv_setsv() is now a macro using Perl_sv_setsv_flags();
4099 * this function provided for binary compatibility only
4100 */
4101
4102void
4103Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
4104{
4105 sv_setsv_flags(dstr, sstr, SV_GMAGIC);
4106}
4107
954c1994
GS
4108/*
4109=for apidoc sv_setsv
4110
645c22ef
DM
4111Copies the contents of the source SV C<ssv> into the destination SV
4112C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
4113function if the source SV needs to be reused. Does not handle 'set' magic.
4114Loosely speaking, it performs a copy-by-value, obliterating any previous
4115content of the destination.
4116
4117You probably want to use one of the assortment of wrappers, such as
4118C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
4119C<SvSetMagicSV_nosteal>.
4120
8d6d96c1
HS
4121=for apidoc sv_setsv_flags
4122
645c22ef
DM
4123Copies the contents of the source SV C<ssv> into the destination SV
4124C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
4125function if the source SV needs to be reused. Does not handle 'set' magic.
4126Loosely speaking, it performs a copy-by-value, obliterating any previous
4127content of the destination.
4128If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
4129C<ssv> if appropriate, else not. C<sv_setsv> and C<sv_setsv_nomg> are
4130implemented in terms of this function.
4131
4132You probably want to use one of the assortment of wrappers, such as
4133C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
4134C<SvSetMagicSV_nosteal>.
4135
4136This is the primary function for copying scalars, and most other
4137copy-ish functions and macros use this underneath.
8d6d96c1
HS
4138
4139=cut
4140*/
4141
4142void
4143Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
4144{
8990e307
LW
4145 register U32 sflags;
4146 register int dtype;
4147 register int stype;
463ee0b2 4148
79072805
LW
4149 if (sstr == dstr)
4150 return;
765f542d 4151 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 4152 if (!sstr)
3280af22 4153 sstr = &PL_sv_undef;
8990e307
LW
4154 stype = SvTYPE(sstr);
4155 dtype = SvTYPE(dstr);
79072805 4156
a0d0e21e 4157 SvAMAGIC_off(dstr);
ece467f9
JP
4158 if ( SvVOK(dstr) )
4159 {
4160 /* need to nuke the magic */
4161 mg_free(dstr);
4162 SvRMAGICAL_off(dstr);
4163 }
9e7bc3e8 4164
463ee0b2 4165 /* There's a lot of redundancy below but we're going for speed here */
79072805 4166
8990e307 4167 switch (stype) {
79072805 4168 case SVt_NULL:
aece5585 4169 undef_sstr:
20408e3c
GS
4170 if (dtype != SVt_PVGV) {
4171 (void)SvOK_off(dstr);
4172 return;
4173 }
4174 break;
463ee0b2 4175 case SVt_IV:
aece5585
GA
4176 if (SvIOK(sstr)) {
4177 switch (dtype) {
4178 case SVt_NULL:
8990e307 4179 sv_upgrade(dstr, SVt_IV);
aece5585
GA
4180 break;
4181 case SVt_NV:
8990e307 4182 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
4183 break;
4184 case SVt_RV:
4185 case SVt_PV:
a0d0e21e 4186 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
4187 break;
4188 }
4189 (void)SvIOK_only(dstr);
4190 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
4191 if (SvIsUV(sstr))
4192 SvIsUV_on(dstr);
27c9684d
AP
4193 if (SvTAINTED(sstr))
4194 SvTAINT(dstr);
aece5585 4195 return;
8990e307 4196 }
aece5585
GA
4197 goto undef_sstr;
4198
463ee0b2 4199 case SVt_NV:
aece5585
GA
4200 if (SvNOK(sstr)) {
4201 switch (dtype) {
4202 case SVt_NULL:
4203 case SVt_IV:
8990e307 4204 sv_upgrade(dstr, SVt_NV);
aece5585
GA
4205 break;
4206 case SVt_RV:
4207 case SVt_PV:
4208 case SVt_PVIV:
a0d0e21e 4209 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
4210 break;
4211 }
4212 SvNVX(dstr) = SvNVX(sstr);
4213 (void)SvNOK_only(dstr);
27c9684d
AP
4214 if (SvTAINTED(sstr))
4215 SvTAINT(dstr);
aece5585 4216 return;
8990e307 4217 }
aece5585
GA
4218 goto undef_sstr;
4219
ed6116ce 4220 case SVt_RV:
8990e307 4221 if (dtype < SVt_RV)
ed6116ce 4222 sv_upgrade(dstr, SVt_RV);
c07a80fd 4223 else if (dtype == SVt_PVGV &&
23bb1b96 4224 SvROK(sstr) && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
c07a80fd 4225 sstr = SvRV(sstr);
a5f75d66 4226 if (sstr == dstr) {
1d7c1841
GS
4227 if (GvIMPORTED(dstr) != GVf_IMPORTED
4228 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4229 {
a5f75d66 4230 GvIMPORTED_on(dstr);
1d7c1841 4231 }
a5f75d66
AD
4232 GvMULTI_on(dstr);
4233 return;
4234 }
c07a80fd 4235 goto glob_assign;
4236 }
ed6116ce 4237 break;
fc36a67e 4238 case SVt_PVFM:
d89fc664
NC
4239#ifdef PERL_COPY_ON_WRITE
4240 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
4241 if (dtype < SVt_PVIV)
4242 sv_upgrade(dstr, SVt_PVIV);
4243 break;
4244 }
4245 /* Fall through */
4246#endif
4247 case SVt_PV:
8990e307 4248 if (dtype < SVt_PV)
463ee0b2 4249 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
4250 break;
4251 case SVt_PVIV:
8990e307 4252 if (dtype < SVt_PVIV)
463ee0b2 4253 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
4254 break;
4255 case SVt_PVNV:
8990e307 4256 if (dtype < SVt_PVNV)
463ee0b2 4257 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 4258 break;
4633a7c4
LW
4259 case SVt_PVAV:
4260 case SVt_PVHV:
4261 case SVt_PVCV:
4633a7c4 4262 case SVt_PVIO:
533c011a 4263 if (PL_op)
cea2e8a9 4264 Perl_croak(aTHX_ "Bizarre copy of %s in %s", sv_reftype(sstr, 0),
53e06cf0 4265 OP_NAME(PL_op));
4633a7c4 4266 else
cea2e8a9 4267 Perl_croak(aTHX_ "Bizarre copy of %s", sv_reftype(sstr, 0));
4633a7c4
LW
4268 break;
4269
79072805 4270 case SVt_PVGV:
8990e307 4271 if (dtype <= SVt_PVGV) {
c07a80fd 4272 glob_assign:
a5f75d66 4273 if (dtype != SVt_PVGV) {
a0d0e21e
LW
4274 char *name = GvNAME(sstr);
4275 STRLEN len = GvNAMELEN(sstr);
b76195c2
DM
4276 /* don't upgrade SVt_PVLV: it can hold a glob */
4277 if (dtype != SVt_PVLV)
4278 sv_upgrade(dstr, SVt_PVGV);
14befaf4 4279 sv_magic(dstr, dstr, PERL_MAGIC_glob, Nullch, 0);
85aff577 4280 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
4281 GvNAME(dstr) = savepvn(name, len);
4282 GvNAMELEN(dstr) = len;
4283 SvFAKE_on(dstr); /* can coerce to non-glob */
4284 }
7bac28a0 4285 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
4286 else if (PL_curstackinfo->si_type == PERLSI_SORT
4287 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
cea2e8a9 4288 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
7bac28a0 4289 GvNAME(dstr));
5bd07a3d 4290
7fb37951
AMS
4291#ifdef GV_UNIQUE_CHECK
4292 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
4293 Perl_croak(aTHX_ PL_no_modify);
4294 }
4295#endif
4296
a0d0e21e 4297 (void)SvOK_off(dstr);
a5f75d66 4298 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 4299 gp_free((GV*)dstr);
79072805 4300 GvGP(dstr) = gp_ref(GvGP(sstr));
27c9684d
AP
4301 if (SvTAINTED(sstr))
4302 SvTAINT(dstr);
1d7c1841
GS
4303 if (GvIMPORTED(dstr) != GVf_IMPORTED
4304 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4305 {
a5f75d66 4306 GvIMPORTED_on(dstr);
1d7c1841 4307 }
a5f75d66 4308 GvMULTI_on(dstr);
79072805
LW
4309 return;
4310 }
4311 /* FALL THROUGH */
4312
4313 default:
8d6d96c1 4314 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 4315 mg_get(sstr);
eb160463 4316 if ((int)SvTYPE(sstr) != stype) {
973f89ab
CS
4317 stype = SvTYPE(sstr);
4318 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
4319 goto glob_assign;
4320 }
4321 }
ded42b9f 4322 if (stype == SVt_PVLV)
6fc92669 4323 (void)SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 4324 else
eb160463 4325 (void)SvUPGRADE(dstr, (U32)stype);
79072805
LW
4326 }
4327
8990e307
LW
4328 sflags = SvFLAGS(sstr);
4329
4330 if (sflags & SVf_ROK) {
4331 if (dtype >= SVt_PV) {
4332 if (dtype == SVt_PVGV) {
4333 SV *sref = SvREFCNT_inc(SvRV(sstr));
4334 SV *dref = 0;
a5f75d66 4335 int intro = GvINTRO(dstr);
a0d0e21e 4336
7fb37951
AMS
4337#ifdef GV_UNIQUE_CHECK
4338 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
4339 Perl_croak(aTHX_ PL_no_modify);
4340 }
4341#endif
4342
a0d0e21e 4343 if (intro) {
a5f75d66 4344 GvINTRO_off(dstr); /* one-shot flag */
1d7c1841 4345 GvLINE(dstr) = CopLINE(PL_curcop);
1edc1566 4346 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 4347 }
a5f75d66 4348 GvMULTI_on(dstr);
8990e307
LW
4349 switch (SvTYPE(sref)) {
4350 case SVt_PVAV:
a0d0e21e 4351 if (intro)
890ed176 4352 SAVEGENERICSV(GvAV(dstr));
a0d0e21e
LW
4353 else
4354 dref = (SV*)GvAV(dstr);
8990e307 4355 GvAV(dstr) = (AV*)sref;
39bac7f7 4356 if (!GvIMPORTED_AV(dstr)
1d7c1841
GS
4357 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4358 {
a5f75d66 4359 GvIMPORTED_AV_on(dstr);
1d7c1841 4360 }
8990e307
LW
4361 break;
4362 case SVt_PVHV:
a0d0e21e 4363 if (intro)
890ed176 4364 SAVEGENERICSV(GvHV(dstr));
a0d0e21e
LW
4365 else
4366 dref = (SV*)GvHV(dstr);
8990e307 4367 GvHV(dstr) = (HV*)sref;
39bac7f7 4368 if (!GvIMPORTED_HV(dstr)
1d7c1841
GS
4369 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4370 {
a5f75d66 4371 GvIMPORTED_HV_on(dstr);
1d7c1841 4372 }
8990e307
LW
4373 break;
4374 case SVt_PVCV:
8ebc5c01 4375 if (intro) {
4376 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
4377 SvREFCNT_dec(GvCV(dstr));
4378 GvCV(dstr) = Nullcv;
68dc0745 4379 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 4380 PL_sub_generation++;
8ebc5c01 4381 }
890ed176 4382 SAVEGENERICSV(GvCV(dstr));
8ebc5c01 4383 }
68dc0745 4384 else
4385 dref = (SV*)GvCV(dstr);
4386 if (GvCV(dstr) != (CV*)sref) {
748a9306 4387 CV* cv = GvCV(dstr);
4633a7c4 4388 if (cv) {
68dc0745 4389 if (!GvCVGEN((GV*)dstr) &&
4390 (CvROOT(cv) || CvXSUB(cv)))
4391 {
7bac28a0 4392 /* ahem, death to those who redefine
4393 * active sort subs */
3280af22
NIS
4394 if (PL_curstackinfo->si_type == PERLSI_SORT &&
4395 PL_sortcop == CvSTART(cv))
1c846c1f 4396 Perl_croak(aTHX_
7bac28a0 4397 "Can't redefine active sort subroutine %s",
4398 GvENAME((GV*)dstr));
beab0874
JT
4399 /* Redefining a sub - warning is mandatory if
4400 it was a const and its value changed. */
4401 if (ckWARN(WARN_REDEFINE)
4402 || (CvCONST(cv)
4403 && (!CvCONST((CV*)sref)
4404 || sv_cmp(cv_const_sv(cv),
4405 cv_const_sv((CV*)sref)))))
4406 {
9014280d 4407 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
beab0874 4408 CvCONST(cv)
910764e6
RGS
4409 ? "Constant subroutine %s::%s redefined"
4410 : "Subroutine %s::%s redefined",
4411 HvNAME(GvSTASH((GV*)dstr)),
beab0874
JT
4412 GvENAME((GV*)dstr));
4413 }
9607fc9c 4414 }
fb24441d
RGS
4415 if (!intro)
4416 cv_ckproto(cv, (GV*)dstr,
4417 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 4418 }
a5f75d66 4419 GvCV(dstr) = (CV*)sref;
7a4c00b4 4420 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 4421 GvASSUMECV_on(dstr);
3280af22 4422 PL_sub_generation++;
a5f75d66 4423 }
39bac7f7 4424 if (!GvIMPORTED_CV(dstr)
1d7c1841
GS
4425 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4426 {
a5f75d66 4427 GvIMPORTED_CV_on(dstr);
1d7c1841 4428 }
8990e307 4429 break;
91bba347
LW
4430 case SVt_PVIO:
4431 if (intro)
890ed176 4432 SAVEGENERICSV(GvIOp(dstr));
91bba347
LW
4433 else
4434 dref = (SV*)GvIOp(dstr);
4435 GvIOp(dstr) = (IO*)sref;
4436 break;
f4d13ee9
JH
4437 case SVt_PVFM:
4438 if (intro)
890ed176 4439 SAVEGENERICSV(GvFORM(dstr));
f4d13ee9
JH
4440 else
4441 dref = (SV*)GvFORM(dstr);
4442 GvFORM(dstr) = (CV*)sref;
4443 break;
8990e307 4444 default:
a0d0e21e 4445 if (intro)
890ed176 4446 SAVEGENERICSV(GvSV(dstr));
a0d0e21e
LW
4447 else
4448 dref = (SV*)GvSV(dstr);
8990e307 4449 GvSV(dstr) = sref;
39bac7f7 4450 if (!GvIMPORTED_SV(dstr)
1d7c1841
GS
4451 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4452 {
a5f75d66 4453 GvIMPORTED_SV_on(dstr);
1d7c1841 4454 }
8990e307
LW
4455 break;
4456 }
4457 if (dref)
4458 SvREFCNT_dec(dref);
27c9684d
AP
4459 if (SvTAINTED(sstr))
4460 SvTAINT(dstr);
8990e307
LW
4461 return;
4462 }
a0d0e21e 4463 if (SvPVX(dstr)) {
760ac839 4464 (void)SvOOK_off(dstr); /* backoff */
50483b2c
JD
4465 if (SvLEN(dstr))
4466 Safefree(SvPVX(dstr));
a0d0e21e
LW
4467 SvLEN(dstr)=SvCUR(dstr)=0;
4468 }
8990e307 4469 }
a0d0e21e 4470 (void)SvOK_off(dstr);
8990e307 4471 SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
ed6116ce 4472 SvROK_on(dstr);
8990e307 4473 if (sflags & SVp_NOK) {
3332b3c1
JH
4474 SvNOKp_on(dstr);
4475 /* Only set the public OK flag if the source has public OK. */
4476 if (sflags & SVf_NOK)
4477 SvFLAGS(dstr) |= SVf_NOK;
ed6116ce
LW
4478 SvNVX(dstr) = SvNVX(sstr);
4479 }
8990e307 4480 if (sflags & SVp_IOK) {
3332b3c1
JH
4481 (void)SvIOKp_on(dstr);
4482 if (sflags & SVf_IOK)
4483 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4484 if (sflags & SVf_IVisUV)
25da4f38 4485 SvIsUV_on(dstr);
3332b3c1 4486 SvIVX(dstr) = SvIVX(sstr);
ed6116ce 4487 }
a0d0e21e
LW
4488 if (SvAMAGIC(sstr)) {
4489 SvAMAGIC_on(dstr);
4490 }
ed6116ce 4491 }
8990e307 4492 else if (sflags & SVp_POK) {
765f542d 4493 bool isSwipe = 0;
79072805
LW
4494
4495 /*
4496 * Check to see if we can just swipe the string. If so, it's a
4497 * possible small lose on short strings, but a big win on long ones.
463ee0b2
LW
4498 * It might even be a win on short strings if SvPVX(dstr)
4499 * has to be allocated and SvPVX(sstr) has to be freed.
79072805
LW
4500 */
4501
120fac95
NC
4502 /* Whichever path we take through the next code, we want this true,
4503 and doing it now facilitates the COW check. */
4504 (void)SvPOK_only(dstr);
4505
765f542d
NC
4506 if (
4507#ifdef PERL_COPY_ON_WRITE
4508 (sflags & (SVf_FAKE | SVf_READONLY)) != (SVf_FAKE | SVf_READONLY)
4509 &&
4510#endif
4511 !(isSwipe =
4512 (sflags & SVs_TEMP) && /* slated for free anyway? */
4513 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
4514 SvREFCNT(sstr) == 1 && /* and no other references to it? */
4515 SvLEN(sstr) && /* and really is a string */
645c22ef 4516 /* and won't be needed again, potentially */
765f542d
NC
4517 !(PL_op && PL_op->op_type == OP_AASSIGN))
4518#ifdef PERL_COPY_ON_WRITE
4519 && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
120fac95 4520 && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
765f542d
NC
4521 && SvTYPE(sstr) >= SVt_PVIV)
4522#endif
4523 ) {
4524 /* Failed the swipe test, and it's not a shared hash key either.
4525 Have to copy the string. */
4526 STRLEN len = SvCUR(sstr);
4527 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
4528 Move(SvPVX(sstr),SvPVX(dstr),len,char);
4529 SvCUR_set(dstr, len);
4530 *SvEND(dstr) = '\0';
765f542d
NC
4531 } else {
4532 /* If PERL_COPY_ON_WRITE is not defined, then isSwipe will always
4533 be true in here. */
4534#ifdef PERL_COPY_ON_WRITE
4535 /* Either it's a shared hash key, or it's suitable for
4536 copy-on-write or we can swipe the string. */
46187eeb 4537 if (DEBUG_C_TEST) {
ed252734 4538 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
4539 sv_dump(sstr);
4540 sv_dump(dstr);
46187eeb 4541 }
765f542d
NC
4542 if (!isSwipe) {
4543 /* I believe I should acquire a global SV mutex if
4544 it's a COW sv (not a shared hash key) to stop
4545 it going un copy-on-write.
4546 If the source SV has gone un copy on write between up there
4547 and down here, then (assert() that) it is of the correct
4548 form to make it copy on write again */
4549 if ((sflags & (SVf_FAKE | SVf_READONLY))
4550 != (SVf_FAKE | SVf_READONLY)) {
4551 SvREADONLY_on(sstr);
4552 SvFAKE_on(sstr);
4553 /* Make the source SV into a loop of 1.
4554 (about to become 2) */
a29f6d03 4555 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
4556 }
4557 }
4558#endif
4559 /* Initial code is common. */
adbc6bb1 4560 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
4561 if (SvOOK(dstr)) {
4562 SvFLAGS(dstr) &= ~SVf_OOK;
4563 Safefree(SvPVX(dstr) - SvIVX(dstr));
4564 }
50483b2c 4565 else if (SvLEN(dstr))
a5f75d66 4566 Safefree(SvPVX(dstr));
79072805 4567 }
765f542d
NC
4568
4569#ifdef PERL_COPY_ON_WRITE
4570 if (!isSwipe) {
4571 /* making another shared SV. */
4572 STRLEN cur = SvCUR(sstr);
4573 STRLEN len = SvLEN(sstr);
d89fc664 4574 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
4575 if (len) {
4576 /* SvIsCOW_normal */
4577 /* splice us in between source and next-after-source. */
a29f6d03
NC
4578 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4579 SV_COW_NEXT_SV_SET(sstr, dstr);
765f542d
NC
4580 SvPV_set(dstr, SvPVX(sstr));
4581 } else {
4582 /* SvIsCOW_shared_hash */
4583 UV hash = SvUVX(sstr);
46187eeb
NC
4584 DEBUG_C(PerlIO_printf(Perl_debug_log,
4585 "Copy on write: Sharing hash\n"));
765f542d
NC
4586 SvPV_set(dstr,
4587 sharepvn(SvPVX(sstr),
4588 (sflags & SVf_UTF8?-cur:cur), hash));
4589 SvUVX(dstr) = hash;
4590 }
4591 SvLEN(dstr) = len;
4592 SvCUR(dstr) = cur;
4593 SvREADONLY_on(dstr);
4594 SvFAKE_on(dstr);
4595 /* Relesase a global SV mutex. */
4596 }
4597 else
4598#endif
4599 { /* Passes the swipe test. */
4600 SvPV_set(dstr, SvPVX(sstr));
4601 SvLEN_set(dstr, SvLEN(sstr));
4602 SvCUR_set(dstr, SvCUR(sstr));
4603
4604 SvTEMP_off(dstr);
4605 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
4606 SvPV_set(sstr, Nullch);
4607 SvLEN_set(sstr, 0);
4608 SvCUR_set(sstr, 0);
4609 SvTEMP_off(sstr);
4610 }
4611 }
9aa983d2 4612 if (sflags & SVf_UTF8)
a7cb1f99 4613 SvUTF8_on(dstr);
79072805 4614 /*SUPPRESS 560*/
8990e307 4615 if (sflags & SVp_NOK) {
3332b3c1
JH
4616 SvNOKp_on(dstr);
4617 if (sflags & SVf_NOK)
4618 SvFLAGS(dstr) |= SVf_NOK;
463ee0b2 4619 SvNVX(dstr) = SvNVX(sstr);
79072805 4620 }
8990e307 4621 if (sflags & SVp_IOK) {
3332b3c1
JH
4622 (void)SvIOKp_on(dstr);
4623 if (sflags & SVf_IOK)
4624 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4625 if (sflags & SVf_IVisUV)
25da4f38 4626 SvIsUV_on(dstr);
463ee0b2 4627 SvIVX(dstr) = SvIVX(sstr);
79072805 4628 }
92f0c265 4629 if (SvVOK(sstr)) {
ece467f9
JP
4630 MAGIC *smg = mg_find(sstr,PERL_MAGIC_vstring);
4631 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4632 smg->mg_ptr, smg->mg_len);
439cb1c4 4633 SvRMAGICAL_on(dstr);
92f0c265 4634 }
79072805 4635 }
8990e307 4636 else if (sflags & SVp_IOK) {
3332b3c1
JH
4637 if (sflags & SVf_IOK)
4638 (void)SvIOK_only(dstr);
4639 else {
9cbac4c7
DM
4640 (void)SvOK_off(dstr);
4641 (void)SvIOKp_on(dstr);
3332b3c1
JH
4642 }
4643 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2b1c7e3e 4644 if (sflags & SVf_IVisUV)
25da4f38 4645 SvIsUV_on(dstr);
3332b3c1
JH
4646 SvIVX(dstr) = SvIVX(sstr);
4647 if (sflags & SVp_NOK) {
4648 if (sflags & SVf_NOK)
4649 (void)SvNOK_on(dstr);
4650 else
4651 (void)SvNOKp_on(dstr);
4652 SvNVX(dstr) = SvNVX(sstr);
4653 }
4654 }
4655 else if (sflags & SVp_NOK) {
4656 if (sflags & SVf_NOK)
4657 (void)SvNOK_only(dstr);
4658 else {
9cbac4c7 4659 (void)SvOK_off(dstr);
3332b3c1
JH
4660 SvNOKp_on(dstr);
4661 }
4662 SvNVX(dstr) = SvNVX(sstr);
79072805
LW
4663 }
4664 else {
20408e3c 4665 if (dtype == SVt_PVGV) {
e476b1b5 4666 if (ckWARN(WARN_MISC))
9014280d 4667 Perl_warner(aTHX_ packWARN(WARN_MISC), "Undefined value assigned to typeglob");
20408e3c
GS
4668 }
4669 else
4670 (void)SvOK_off(dstr);
a0d0e21e 4671 }
27c9684d
AP
4672 if (SvTAINTED(sstr))
4673 SvTAINT(dstr);
79072805
LW
4674}
4675
954c1994
GS
4676/*
4677=for apidoc sv_setsv_mg
4678
4679Like C<sv_setsv>, but also handles 'set' magic.
4680
4681=cut
4682*/
4683
79072805 4684void
864dbfa3 4685Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
4686{
4687 sv_setsv(dstr,sstr);
4688 SvSETMAGIC(dstr);
4689}
4690
ed252734
NC
4691#ifdef PERL_COPY_ON_WRITE
4692SV *
4693Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4694{
4695 STRLEN cur = SvCUR(sstr);
4696 STRLEN len = SvLEN(sstr);
4697 register char *new_pv;
4698
4699 if (DEBUG_C_TEST) {
4700 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4701 sstr, dstr);
4702 sv_dump(sstr);
4703 if (dstr)
4704 sv_dump(dstr);
4705 }
4706
4707 if (dstr) {
4708 if (SvTHINKFIRST(dstr))
4709 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
4710 else if (SvPVX(dstr))
4711 Safefree(SvPVX(dstr));
4712 }
4713 else
4714 new_SV(dstr);
b988aa42 4715 (void)SvUPGRADE (dstr, SVt_PVIV);
ed252734
NC
4716
4717 assert (SvPOK(sstr));
4718 assert (SvPOKp(sstr));
4719 assert (!SvIOK(sstr));
4720 assert (!SvIOKp(sstr));
4721 assert (!SvNOK(sstr));
4722 assert (!SvNOKp(sstr));
4723
4724 if (SvIsCOW(sstr)) {
4725
4726 if (SvLEN(sstr) == 0) {
4727 /* source is a COW shared hash key. */
4728 UV hash = SvUVX(sstr);
4729 DEBUG_C(PerlIO_printf(Perl_debug_log,
4730 "Fast copy on write: Sharing hash\n"));
4731 SvUVX(dstr) = hash;
4732 new_pv = sharepvn(SvPVX(sstr), (SvUTF8(sstr)?-cur:cur), hash);
4733 goto common_exit;
4734 }
4735 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4736 } else {
4737 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
b988aa42 4738 (void)SvUPGRADE (sstr, SVt_PVIV);
ed252734
NC
4739 SvREADONLY_on(sstr);
4740 SvFAKE_on(sstr);
4741 DEBUG_C(PerlIO_printf(Perl_debug_log,
4742 "Fast copy on write: Converting sstr to COW\n"));
4743 SV_COW_NEXT_SV_SET(dstr, sstr);
4744 }
4745 SV_COW_NEXT_SV_SET(sstr, dstr);
4746 new_pv = SvPVX(sstr);
4747
4748 common_exit:
4749 SvPV_set(dstr, new_pv);
4750 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4751 if (SvUTF8(sstr))
4752 SvUTF8_on(dstr);
4753 SvLEN(dstr) = len;
4754 SvCUR(dstr) = cur;
4755 if (DEBUG_C_TEST) {
4756 sv_dump(dstr);
4757 }
4758 return dstr;
4759}
4760#endif
4761
954c1994
GS
4762/*
4763=for apidoc sv_setpvn
4764
4765Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
4766bytes to be copied. If the C<ptr> argument is NULL the SV will become
4767undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
4768
4769=cut
4770*/
4771
ef50df4b 4772void
864dbfa3 4773Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 4774{
c6f8c383 4775 register char *dptr;
22c522df 4776
765f542d 4777 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4778 if (!ptr) {
a0d0e21e 4779 (void)SvOK_off(sv);
463ee0b2
LW
4780 return;
4781 }
22c522df
JH
4782 else {
4783 /* len is STRLEN which is unsigned, need to copy to signed */
4784 IV iv = len;
9c5ffd7c
JH
4785 if (iv < 0)
4786 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 4787 }
6fc92669 4788 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4789
79072805 4790 SvGROW(sv, len + 1);
c6f8c383
GA
4791 dptr = SvPVX(sv);
4792 Move(ptr,dptr,len,char);
4793 dptr[len] = '\0';
79072805 4794 SvCUR_set(sv, len);
1aa99e6b 4795 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4796 SvTAINT(sv);
79072805
LW
4797}
4798
954c1994
GS
4799/*
4800=for apidoc sv_setpvn_mg
4801
4802Like C<sv_setpvn>, but also handles 'set' magic.
4803
4804=cut
4805*/
4806
79072805 4807void
864dbfa3 4808Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4809{
4810 sv_setpvn(sv,ptr,len);
4811 SvSETMAGIC(sv);
4812}
4813
954c1994
GS
4814/*
4815=for apidoc sv_setpv
4816
4817Copies a string into an SV. The string must be null-terminated. Does not
4818handle 'set' magic. See C<sv_setpv_mg>.
4819
4820=cut
4821*/
4822
ef50df4b 4823void
864dbfa3 4824Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4825{
4826 register STRLEN len;
4827
765f542d 4828 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4829 if (!ptr) {
a0d0e21e 4830 (void)SvOK_off(sv);
463ee0b2
LW
4831 return;
4832 }
79072805 4833 len = strlen(ptr);
6fc92669 4834 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4835
79072805 4836 SvGROW(sv, len + 1);
463ee0b2 4837 Move(ptr,SvPVX(sv),len+1,char);
79072805 4838 SvCUR_set(sv, len);
1aa99e6b 4839 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
4840 SvTAINT(sv);
4841}
4842
954c1994
GS
4843/*
4844=for apidoc sv_setpv_mg
4845
4846Like C<sv_setpv>, but also handles 'set' magic.
4847
4848=cut
4849*/
4850
463ee0b2 4851void
864dbfa3 4852Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
4853{
4854 sv_setpv(sv,ptr);
4855 SvSETMAGIC(sv);
4856}
4857
954c1994
GS
4858/*
4859=for apidoc sv_usepvn
4860
4861Tells an SV to use C<ptr> to find its string value. Normally the string is
1c846c1f 4862stored inside the SV but sv_usepvn allows the SV to use an outside string.
954c1994
GS
4863The C<ptr> should point to memory that was allocated by C<malloc>. The
4864string length, C<len>, must be supplied. This function will realloc the
4865memory pointed to by C<ptr>, so that pointer should not be freed or used by
4866the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
4867See C<sv_usepvn_mg>.
4868
4869=cut
4870*/
4871
ef50df4b 4872void
864dbfa3 4873Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 4874{
765f542d 4875 SV_CHECK_THINKFIRST_COW_DROP(sv);
c6f8c383 4876 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 4877 if (!ptr) {
a0d0e21e 4878 (void)SvOK_off(sv);
463ee0b2
LW
4879 return;
4880 }
a0ed51b3 4881 (void)SvOOK_off(sv);
50483b2c 4882 if (SvPVX(sv) && SvLEN(sv))
463ee0b2
LW
4883 Safefree(SvPVX(sv));
4884 Renew(ptr, len+1, char);
4885 SvPVX(sv) = ptr;
4886 SvCUR_set(sv, len);
4887 SvLEN_set(sv, len+1);
4888 *SvEND(sv) = '\0';
1aa99e6b 4889 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4890 SvTAINT(sv);
79072805
LW
4891}
4892
954c1994
GS
4893/*
4894=for apidoc sv_usepvn_mg
4895
4896Like C<sv_usepvn>, but also handles 'set' magic.
4897
4898=cut
4899*/
4900
ef50df4b 4901void
864dbfa3 4902Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 4903{
51c1089b 4904 sv_usepvn(sv,ptr,len);
ef50df4b
GS
4905 SvSETMAGIC(sv);
4906}
4907
765f542d
NC
4908#ifdef PERL_COPY_ON_WRITE
4909/* Need to do this *after* making the SV normal, as we need the buffer
4910 pointer to remain valid until after we've copied it. If we let go too early,
4911 another thread could invalidate it by unsharing last of the same hash key
4912 (which it can do by means other than releasing copy-on-write Svs)
4913 or by changing the other copy-on-write SVs in the loop. */
4914STATIC void
4915S_sv_release_COW(pTHX_ register SV *sv, char *pvx, STRLEN cur, STRLEN len,
4916 U32 hash, SV *after)
4917{
4918 if (len) { /* this SV was SvIsCOW_normal(sv) */
4919 /* we need to find the SV pointing to us. */
4920 SV *current = SV_COW_NEXT_SV(after);
4921
4922 if (current == sv) {
4923 /* The SV we point to points back to us (there were only two of us
4924 in the loop.)
4925 Hence other SV is no longer copy on write either. */
4926 SvFAKE_off(after);
4927 SvREADONLY_off(after);
4928 } else {
4929 /* We need to follow the pointers around the loop. */
4930 SV *next;
4931 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4932 assert (next);
4933 current = next;
4934 /* don't loop forever if the structure is bust, and we have
4935 a pointer into a closed loop. */
4936 assert (current != after);
e419cbc5 4937 assert (SvPVX(current) == pvx);
765f542d
NC
4938 }
4939 /* Make the SV before us point to the SV after us. */
a29f6d03 4940 SV_COW_NEXT_SV_SET(current, after);
765f542d
NC
4941 }
4942 } else {
4943 unsharepvn(pvx, SvUTF8(sv) ? -(I32)cur : cur, hash);
4944 }
4945}
4946
4947int
4948Perl_sv_release_IVX(pTHX_ register SV *sv)
4949{
4950 if (SvIsCOW(sv))
4951 sv_force_normal_flags(sv, 0);
4952 return SvOOK_off(sv);
4953}
4954#endif
645c22ef
DM
4955/*
4956=for apidoc sv_force_normal_flags
4957
4958Undo various types of fakery on an SV: if the PV is a shared string, make
4959a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4960an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4961we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4962then a copy-on-write scalar drops its PV buffer (if any) and becomes
4963SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 4964set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
4965C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4966with flags set to 0.
645c22ef
DM
4967
4968=cut
4969*/
4970
6fc92669 4971void
840a7b70 4972Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 4973{
765f542d
NC
4974#ifdef PERL_COPY_ON_WRITE
4975 if (SvREADONLY(sv)) {
4976 /* At this point I believe I should acquire a global SV mutex. */
4977 if (SvFAKE(sv)) {
4978 char *pvx = SvPVX(sv);
4979 STRLEN len = SvLEN(sv);
4980 STRLEN cur = SvCUR(sv);
4981 U32 hash = SvUVX(sv);
4982 SV *next = SV_COW_NEXT_SV(sv); /* next COW sv in the loop. */
46187eeb
NC
4983 if (DEBUG_C_TEST) {
4984 PerlIO_printf(Perl_debug_log,
4985 "Copy on write: Force normal %ld\n",
4986 (long) flags);
e419cbc5 4987 sv_dump(sv);
46187eeb 4988 }
765f542d
NC
4989 SvFAKE_off(sv);
4990 SvREADONLY_off(sv);
4991 /* This SV doesn't own the buffer, so need to New() a new one: */
4992 SvPVX(sv) = 0;
4993 SvLEN(sv) = 0;
4994 if (flags & SV_COW_DROP_PV) {
4995 /* OK, so we don't need to copy our buffer. */
4996 SvPOK_off(sv);
4997 } else {
4998 SvGROW(sv, cur + 1);
4999 Move(pvx,SvPVX(sv),cur,char);
5000 SvCUR(sv) = cur;
5001 *SvEND(sv) = '\0';
5002 }
e419cbc5 5003 sv_release_COW(sv, pvx, cur, len, hash, next);
46187eeb 5004 if (DEBUG_C_TEST) {
e419cbc5 5005 sv_dump(sv);
46187eeb 5006 }
765f542d 5007 }
923e4eb5 5008 else if (IN_PERL_RUNTIME)
765f542d
NC
5009 Perl_croak(aTHX_ PL_no_modify);
5010 /* At this point I believe that I can drop the global SV mutex. */
5011 }
5012#else
2213622d 5013 if (SvREADONLY(sv)) {
1c846c1f
NIS
5014 if (SvFAKE(sv)) {
5015 char *pvx = SvPVX(sv);
5c98da1c 5016 int is_utf8 = SvUTF8(sv);
1c846c1f
NIS
5017 STRLEN len = SvCUR(sv);
5018 U32 hash = SvUVX(sv);
10bcdfd6
NC
5019 SvFAKE_off(sv);
5020 SvREADONLY_off(sv);
5c98da1c
NC
5021 SvPVX(sv) = 0;
5022 SvLEN(sv) = 0;
1c846c1f
NIS
5023 SvGROW(sv, len + 1);
5024 Move(pvx,SvPVX(sv),len,char);
5025 *SvEND(sv) = '\0';
5c98da1c 5026 unsharepvn(pvx, is_utf8 ? -(I32)len : len, hash);
1c846c1f 5027 }
923e4eb5 5028 else if (IN_PERL_RUNTIME)
cea2e8a9 5029 Perl_croak(aTHX_ PL_no_modify);
0f15f207 5030 }
765f542d 5031#endif
2213622d 5032 if (SvROK(sv))
840a7b70 5033 sv_unref_flags(sv, flags);
6fc92669
GS
5034 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
5035 sv_unglob(sv);
0f15f207 5036}
1c846c1f 5037
645c22ef
DM
5038/*
5039=for apidoc sv_force_normal
5040
5041Undo various types of fakery on an SV: if the PV is a shared string, make
5042a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
5043an xpvmg. See also C<sv_force_normal_flags>.
5044
5045=cut
5046*/
5047
840a7b70
IZ
5048void
5049Perl_sv_force_normal(pTHX_ register SV *sv)
5050{
5051 sv_force_normal_flags(sv, 0);
5052}
5053
954c1994
GS
5054/*
5055=for apidoc sv_chop
5056
1c846c1f 5057Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
5058SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
5059the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 5060string. Uses the "OOK hack".
31869a79
AE
5061Beware: after this function returns, C<ptr> and SvPVX(sv) may no longer
5062refer to the same chunk of data.
954c1994
GS
5063
5064=cut
5065*/
5066
79072805 5067void
645c22ef 5068Perl_sv_chop(pTHX_ register SV *sv, register char *ptr)
79072805
LW
5069{
5070 register STRLEN delta;
a0d0e21e 5071 if (!ptr || !SvPOKp(sv))
79072805 5072 return;
31869a79 5073 delta = ptr - SvPVX(sv);
2213622d 5074 SV_CHECK_THINKFIRST(sv);
79072805
LW
5075 if (SvTYPE(sv) < SVt_PVIV)
5076 sv_upgrade(sv,SVt_PVIV);
5077
5078 if (!SvOOK(sv)) {
50483b2c
JD
5079 if (!SvLEN(sv)) { /* make copy of shared string */
5080 char *pvx = SvPVX(sv);
5081 STRLEN len = SvCUR(sv);
5082 SvGROW(sv, len + 1);
5083 Move(pvx,SvPVX(sv),len,char);
5084 *SvEND(sv) = '\0';
5085 }
463ee0b2 5086 SvIVX(sv) = 0;
a4bfb290
AB
5087 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
5088 and we do that anyway inside the SvNIOK_off
5089 */
5090 SvFLAGS(sv) |= SVf_OOK;
79072805 5091 }
a4bfb290 5092 SvNIOK_off(sv);
79072805
LW
5093 SvLEN(sv) -= delta;
5094 SvCUR(sv) -= delta;
463ee0b2
LW
5095 SvPVX(sv) += delta;
5096 SvIVX(sv) += delta;
79072805
LW
5097}
5098
09540bc3
JH
5099/* sv_catpvn() is now a macro using Perl_sv_catpvn_flags();
5100 * this function provided for binary compatibility only
5101 */
5102
5103void
5104Perl_sv_catpvn(pTHX_ SV *dsv, const char* sstr, STRLEN slen)
5105{
5106 sv_catpvn_flags(dsv, sstr, slen, SV_GMAGIC);
5107}
5108
954c1994
GS
5109/*
5110=for apidoc sv_catpvn
5111
5112Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
5113C<len> indicates number of bytes to copy. If the SV has the UTF-8
5114status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 5115Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 5116
8d6d96c1
HS
5117=for apidoc sv_catpvn_flags
5118
5119Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
5120C<len> indicates number of bytes to copy. If the SV has the UTF-8
5121status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
5122If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
5123appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
5124in terms of this function.
5125
5126=cut
5127*/
5128
5129void
5130Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
5131{
5132 STRLEN dlen;
5133 char *dstr;
5134
5135 dstr = SvPV_force_flags(dsv, dlen, flags);
5136 SvGROW(dsv, dlen + slen + 1);
5137 if (sstr == dstr)
5138 sstr = SvPVX(dsv);
5139 Move(sstr, SvPVX(dsv) + dlen, slen, char);
5140 SvCUR(dsv) += slen;
5141 *SvEND(dsv) = '\0';
5142 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
5143 SvTAINT(dsv);
79072805
LW
5144}
5145
954c1994
GS
5146/*
5147=for apidoc sv_catpvn_mg
5148
5149Like C<sv_catpvn>, but also handles 'set' magic.
5150
5151=cut
5152*/
5153
79072805 5154void
864dbfa3 5155Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
5156{
5157 sv_catpvn(sv,ptr,len);
5158 SvSETMAGIC(sv);
5159}
5160
09540bc3
JH
5161/* sv_catsv() is now a macro using Perl_sv_catsv_flags();
5162 * this function provided for binary compatibility only
5163 */
5164
5165void
5166Perl_sv_catsv(pTHX_ SV *dstr, register SV *sstr)
5167{
5168 sv_catsv_flags(dstr, sstr, SV_GMAGIC);
5169}
5170
954c1994
GS
5171/*
5172=for apidoc sv_catsv
5173
13e8c8e3
JH
5174Concatenates the string from SV C<ssv> onto the end of the string in
5175SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
5176not 'set' magic. See C<sv_catsv_mg>.
954c1994 5177
8d6d96c1
HS
5178=for apidoc sv_catsv_flags
5179
5180Concatenates the string from SV C<ssv> onto the end of the string in
5181SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
5182bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
5183and C<sv_catsv_nomg> are implemented in terms of this function.
5184
5185=cut */
5186
ef50df4b 5187void
8d6d96c1 5188Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 5189{
13e8c8e3
JH
5190 char *spv;
5191 STRLEN slen;
46199a12 5192 if (!ssv)
79072805 5193 return;
46199a12 5194 if ((spv = SvPV(ssv, slen))) {
4fd84b44
AD
5195 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
5196 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
8cf8f3d1
NIS
5197 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
5198 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4fd84b44
AD
5199 dsv->sv_flags doesn't have that bit set.
5200 Andy Dougherty 12 Oct 2001
5201 */
5202 I32 sutf8 = DO_UTF8(ssv);
5203 I32 dutf8;
13e8c8e3 5204
8d6d96c1
HS
5205 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
5206 mg_get(dsv);
5207 dutf8 = DO_UTF8(dsv);
5208
5209 if (dutf8 != sutf8) {
13e8c8e3 5210 if (dutf8) {
46199a12 5211 /* Not modifying source SV, so taking a temporary copy. */
8d6d96c1 5212 SV* csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 5213
46199a12 5214 sv_utf8_upgrade(csv);
8d6d96c1 5215 spv = SvPV(csv, slen);
13e8c8e3 5216 }
8d6d96c1
HS
5217 else
5218 sv_utf8_upgrade_nomg(dsv);
e84ff256 5219 }
8d6d96c1 5220 sv_catpvn_nomg(dsv, spv, slen);
560a288e 5221 }
79072805
LW
5222}
5223
954c1994
GS
5224/*
5225=for apidoc sv_catsv_mg
5226
5227Like C<sv_catsv>, but also handles 'set' magic.
5228
5229=cut
5230*/
5231
79072805 5232void
46199a12 5233Perl_sv_catsv_mg(pTHX_ SV *dsv, register SV *ssv)
ef50df4b 5234{
46199a12
JH
5235 sv_catsv(dsv,ssv);
5236 SvSETMAGIC(dsv);
ef50df4b
GS
5237}
5238
954c1994
GS
5239/*
5240=for apidoc sv_catpv
5241
5242Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
5243If the SV has the UTF-8 status set, then the bytes appended should be
5244valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 5245
d5ce4a7c 5246=cut */
954c1994 5247
ef50df4b 5248void
0c981600 5249Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
5250{
5251 register STRLEN len;
463ee0b2 5252 STRLEN tlen;
748a9306 5253 char *junk;
79072805 5254
0c981600 5255 if (!ptr)
79072805 5256 return;
748a9306 5257 junk = SvPV_force(sv, tlen);
0c981600 5258 len = strlen(ptr);
463ee0b2 5259 SvGROW(sv, tlen + len + 1);
0c981600
JH
5260 if (ptr == junk)
5261 ptr = SvPVX(sv);
5262 Move(ptr,SvPVX(sv)+tlen,len+1,char);
79072805 5263 SvCUR(sv) += len;
d41ff1b8 5264 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 5265 SvTAINT(sv);
79072805
LW
5266}
5267
954c1994
GS
5268/*
5269=for apidoc sv_catpv_mg
5270
5271Like C<sv_catpv>, but also handles 'set' magic.
5272
5273=cut
5274*/
5275
ef50df4b 5276void
0c981600 5277Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 5278{
0c981600 5279 sv_catpv(sv,ptr);
ef50df4b
GS
5280 SvSETMAGIC(sv);
5281}
5282
645c22ef
DM
5283/*
5284=for apidoc newSV
5285
5286Create a new null SV, or if len > 0, create a new empty SVt_PV type SV
5287with an initial PV allocation of len+1. Normally accessed via the C<NEWSV>
5288macro.
5289
5290=cut
5291*/
5292
79072805 5293SV *
864dbfa3 5294Perl_newSV(pTHX_ STRLEN len)
79072805
LW
5295{
5296 register SV *sv;
1c846c1f 5297
4561caa4 5298 new_SV(sv);
79072805
LW
5299 if (len) {
5300 sv_upgrade(sv, SVt_PV);
5301 SvGROW(sv, len + 1);
5302 }
5303 return sv;
5304}
954c1994 5305/*
92110913 5306=for apidoc sv_magicext
954c1994 5307
68795e93 5308Adds magic to an SV, upgrading it if necessary. Applies the
92110913
NIS
5309supplied vtable and returns pointer to the magic added.
5310
5311Note that sv_magicext will allow things that sv_magic will not.
68795e93 5312In particular you can add magic to SvREADONLY SVs and and more than
92110913 5313one instance of the same 'how'
645c22ef 5314
92110913 5315I C<namelen> is greater then zero then a savepvn() I<copy> of C<name> is stored,
68795e93
NIS
5316if C<namelen> is zero then C<name> is stored as-is and - as another special
5317case - if C<(name && namelen == HEf_SVKEY)> then C<name> is assumed to contain
92110913
NIS
5318an C<SV*> and has its REFCNT incremented
5319
5320(This is now used as a subroutine by sv_magic.)
954c1994
GS
5321
5322=cut
5323*/
92110913
NIS
5324MAGIC *
5325Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, MGVTBL *vtable,
5326 const char* name, I32 namlen)
79072805
LW
5327{
5328 MAGIC* mg;
68795e93 5329
92110913
NIS
5330 if (SvTYPE(sv) < SVt_PVMG) {
5331 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 5332 }
79072805
LW
5333 Newz(702,mg, 1, MAGIC);
5334 mg->mg_moremagic = SvMAGIC(sv);
79072805 5335 SvMAGIC(sv) = mg;
75f9d97a 5336
18808301 5337 /* Some magic sontains a reference loop, where the sv and object refer to
bb03859b
RS
5338 each other. To prevent a reference loop that would prevent such
5339 objects being freed, we look for such loops and if we find one we
87f0b213
JH
5340 avoid incrementing the object refcount.
5341
5342 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 5343 have its REFCNT incremented to keep it in existence.
87f0b213
JH
5344
5345 */
14befaf4
DM
5346 if (!obj || obj == sv ||
5347 how == PERL_MAGIC_arylen ||
5348 how == PERL_MAGIC_qr ||
75f9d97a
JH
5349 (SvTYPE(obj) == SVt_PVGV &&
5350 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
5351 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 5352 GvFORM(obj) == (CV*)sv)))
75f9d97a 5353 {
8990e307 5354 mg->mg_obj = obj;
75f9d97a 5355 }
85e6fe83 5356 else {
8990e307 5357 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
5358 mg->mg_flags |= MGf_REFCOUNTED;
5359 }
b5ccf5f2
YST
5360
5361 /* Normal self-ties simply pass a null object, and instead of
5362 using mg_obj directly, use the SvTIED_obj macro to produce a
5363 new RV as needed. For glob "self-ties", we are tieing the PVIO
5364 with an RV obj pointing to the glob containing the PVIO. In
5365 this case, to avoid a reference loop, we need to weaken the
5366 reference.
5367 */
5368
5369 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
5370 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
5371 {
5372 sv_rvweaken(obj);
5373 }
5374
79072805 5375 mg->mg_type = how;
565764a8 5376 mg->mg_len = namlen;
9cbac4c7 5377 if (name) {
92110913 5378 if (namlen > 0)
1edc1566 5379 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 5380 else if (namlen == HEf_SVKEY)
1edc1566 5381 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
68795e93 5382 else
92110913 5383 mg->mg_ptr = (char *) name;
9cbac4c7 5384 }
92110913 5385 mg->mg_virtual = vtable;
68795e93 5386
92110913
NIS
5387 mg_magical(sv);
5388 if (SvGMAGICAL(sv))
5389 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
5390 return mg;
5391}
5392
5393/*
5394=for apidoc sv_magic
1c846c1f 5395
92110913
NIS
5396Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
5397then adds a new magic item of type C<how> to the head of the magic list.
5398
5399=cut
5400*/
5401
5402void
5403Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 5404{
92110913
NIS
5405 MAGIC* mg;
5406 MGVTBL *vtable = 0;
5407
765f542d
NC
5408#ifdef PERL_COPY_ON_WRITE
5409 if (SvIsCOW(sv))
5410 sv_force_normal_flags(sv, 0);
5411#endif
92110913 5412 if (SvREADONLY(sv)) {
923e4eb5 5413 if (IN_PERL_RUNTIME
92110913
NIS
5414 && how != PERL_MAGIC_regex_global
5415 && how != PERL_MAGIC_bm
5416 && how != PERL_MAGIC_fm
5417 && how != PERL_MAGIC_sv
e6469971 5418 && how != PERL_MAGIC_backref
92110913
NIS
5419 )
5420 {
5421 Perl_croak(aTHX_ PL_no_modify);
5422 }
5423 }
5424 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
5425 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
5426 /* sv_magic() refuses to add a magic of the same 'how' as an
5427 existing one
92110913
NIS
5428 */
5429 if (how == PERL_MAGIC_taint)
5430 mg->mg_len |= 1;
5431 return;
5432 }
5433 }
68795e93 5434
79072805 5435 switch (how) {
14befaf4 5436 case PERL_MAGIC_sv:
92110913 5437 vtable = &PL_vtbl_sv;
79072805 5438 break;
14befaf4 5439 case PERL_MAGIC_overload:
92110913 5440 vtable = &PL_vtbl_amagic;
a0d0e21e 5441 break;
14befaf4 5442 case PERL_MAGIC_overload_elem:
92110913 5443 vtable = &PL_vtbl_amagicelem;
a0d0e21e 5444 break;
14befaf4 5445 case PERL_MAGIC_overload_table:
92110913 5446 vtable = &PL_vtbl_ovrld;
a0d0e21e 5447 break;
14befaf4 5448 case PERL_MAGIC_bm:
92110913 5449 vtable = &PL_vtbl_bm;
79072805 5450 break;
14befaf4 5451 case PERL_MAGIC_regdata:
92110913 5452 vtable = &PL_vtbl_regdata;
6cef1e77 5453 break;
14befaf4 5454 case PERL_MAGIC_regdatum:
92110913 5455 vtable = &PL_vtbl_regdatum;
6cef1e77 5456 break;
14befaf4 5457 case PERL_MAGIC_env:
92110913 5458 vtable = &PL_vtbl_env;
79072805 5459 break;
14befaf4 5460 case PERL_MAGIC_fm:
92110913 5461 vtable = &PL_vtbl_fm;
55497cff 5462 break;
14befaf4 5463 case PERL_MAGIC_envelem:
92110913 5464 vtable = &PL_vtbl_envelem;
79072805 5465 break;
14befaf4 5466 case PERL_MAGIC_regex_global:
92110913 5467 vtable = &PL_vtbl_mglob;
93a17b20 5468 break;
14befaf4 5469 case PERL_MAGIC_isa:
92110913 5470 vtable = &PL_vtbl_isa;
463ee0b2 5471 break;
14befaf4 5472 case PERL_MAGIC_isaelem:
92110913 5473 vtable = &PL_vtbl_isaelem;
463ee0b2 5474 break;
14befaf4 5475 case PERL_MAGIC_nkeys:
92110913 5476 vtable = &PL_vtbl_nkeys;
16660edb 5477 break;
14befaf4 5478 case PERL_MAGIC_dbfile:
92110913 5479 vtable = 0;
93a17b20 5480 break;
14befaf4 5481 case PERL_MAGIC_dbline:
92110913 5482 vtable = &PL_vtbl_dbline;
79072805 5483 break;
36477c24 5484#ifdef USE_LOCALE_COLLATE
14befaf4 5485 case PERL_MAGIC_collxfrm:
92110913 5486 vtable = &PL_vtbl_collxfrm;
bbce6d69 5487 break;
36477c24 5488#endif /* USE_LOCALE_COLLATE */
14befaf4 5489 case PERL_MAGIC_tied:
92110913 5490 vtable = &PL_vtbl_pack;
463ee0b2 5491 break;
14befaf4
DM
5492 case PERL_MAGIC_tiedelem:
5493 case PERL_MAGIC_tiedscalar:
92110913 5494 vtable = &PL_vtbl_packelem;
463ee0b2 5495 break;
14befaf4 5496 case PERL_MAGIC_qr:
92110913 5497 vtable = &PL_vtbl_regexp;
c277df42 5498 break;
14befaf4 5499 case PERL_MAGIC_sig:
92110913 5500 vtable = &PL_vtbl_sig;
79072805 5501 break;
14befaf4 5502 case PERL_MAGIC_sigelem:
92110913 5503 vtable = &PL_vtbl_sigelem;
79072805 5504 break;
14befaf4 5505 case PERL_MAGIC_taint:
92110913 5506 vtable = &PL_vtbl_taint;
463ee0b2 5507 break;
14befaf4 5508 case PERL_MAGIC_uvar:
92110913 5509 vtable = &PL_vtbl_uvar;
79072805 5510 break;
14befaf4 5511 case PERL_MAGIC_vec:
92110913 5512 vtable = &PL_vtbl_vec;
79072805 5513 break;
ece467f9
JP
5514 case PERL_MAGIC_vstring:
5515 vtable = 0;
5516 break;
7e8c5dac
HS
5517 case PERL_MAGIC_utf8:
5518 vtable = &PL_vtbl_utf8;
5519 break;
14befaf4 5520 case PERL_MAGIC_substr:
92110913 5521 vtable = &PL_vtbl_substr;
79072805 5522 break;
14befaf4 5523 case PERL_MAGIC_defelem:
92110913 5524 vtable = &PL_vtbl_defelem;
5f05dabc 5525 break;
14befaf4 5526 case PERL_MAGIC_glob:
92110913 5527 vtable = &PL_vtbl_glob;
79072805 5528 break;
14befaf4 5529 case PERL_MAGIC_arylen:
92110913 5530 vtable = &PL_vtbl_arylen;
79072805 5531 break;
14befaf4 5532 case PERL_MAGIC_pos:
92110913 5533 vtable = &PL_vtbl_pos;
a0d0e21e 5534 break;
14befaf4 5535 case PERL_MAGIC_backref:
92110913 5536 vtable = &PL_vtbl_backref;
810b8aa5 5537 break;
14befaf4
DM
5538 case PERL_MAGIC_ext:
5539 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
5540 /* Useful for attaching extension internal data to perl vars. */
5541 /* Note that multiple extensions may clash if magical scalars */
5542 /* etc holding private data from one are passed to another. */
a0d0e21e 5543 break;
79072805 5544 default:
14befaf4 5545 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 5546 }
68795e93 5547
92110913
NIS
5548 /* Rest of work is done else where */
5549 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 5550
92110913
NIS
5551 switch (how) {
5552 case PERL_MAGIC_taint:
5553 mg->mg_len = 1;
5554 break;
5555 case PERL_MAGIC_ext:
5556 case PERL_MAGIC_dbfile:
5557 SvRMAGICAL_on(sv);
5558 break;
5559 }
463ee0b2
LW
5560}
5561
c461cf8f
JH
5562/*
5563=for apidoc sv_unmagic
5564
645c22ef 5565Removes all magic of type C<type> from an SV.
c461cf8f
JH
5566
5567=cut
5568*/
5569
463ee0b2 5570int
864dbfa3 5571Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
5572{
5573 MAGIC* mg;
5574 MAGIC** mgp;
91bba347 5575 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
5576 return 0;
5577 mgp = &SvMAGIC(sv);
5578 for (mg = *mgp; mg; mg = *mgp) {
5579 if (mg->mg_type == type) {
5580 MGVTBL* vtbl = mg->mg_virtual;
5581 *mgp = mg->mg_moremagic;
1d7c1841 5582 if (vtbl && vtbl->svt_free)
fc0dc3b3 5583 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 5584 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 5585 if (mg->mg_len > 0)
1edc1566 5586 Safefree(mg->mg_ptr);
565764a8 5587 else if (mg->mg_len == HEf_SVKEY)
1edc1566 5588 SvREFCNT_dec((SV*)mg->mg_ptr);
7e8c5dac
HS
5589 else if (mg->mg_type == PERL_MAGIC_utf8 && mg->mg_ptr)
5590 Safefree(mg->mg_ptr);
9cbac4c7 5591 }
a0d0e21e
LW
5592 if (mg->mg_flags & MGf_REFCOUNTED)
5593 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
5594 Safefree(mg);
5595 }
5596 else
5597 mgp = &mg->mg_moremagic;
79072805 5598 }
91bba347 5599 if (!SvMAGIC(sv)) {
463ee0b2 5600 SvMAGICAL_off(sv);
06759ea0 5601 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
5602 }
5603
5604 return 0;
79072805
LW
5605}
5606
c461cf8f
JH
5607/*
5608=for apidoc sv_rvweaken
5609
645c22ef
DM
5610Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5611referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5612push a back-reference to this RV onto the array of backreferences
5613associated with that magic.
c461cf8f
JH
5614
5615=cut
5616*/
5617
810b8aa5 5618SV *
864dbfa3 5619Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
5620{
5621 SV *tsv;
5622 if (!SvOK(sv)) /* let undefs pass */
5623 return sv;
5624 if (!SvROK(sv))
cea2e8a9 5625 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 5626 else if (SvWEAKREF(sv)) {
810b8aa5 5627 if (ckWARN(WARN_MISC))
9014280d 5628 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
5629 return sv;
5630 }
5631 tsv = SvRV(sv);
5632 sv_add_backref(tsv, sv);
5633 SvWEAKREF_on(sv);
1c846c1f 5634 SvREFCNT_dec(tsv);
810b8aa5
GS
5635 return sv;
5636}
5637
645c22ef
DM
5638/* Give tsv backref magic if it hasn't already got it, then push a
5639 * back-reference to sv onto the array associated with the backref magic.
5640 */
5641
810b8aa5 5642STATIC void
cea2e8a9 5643S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
5644{
5645 AV *av;
5646 MAGIC *mg;
14befaf4 5647 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, PERL_MAGIC_backref)))
810b8aa5
GS
5648 av = (AV*)mg->mg_obj;
5649 else {
5650 av = newAV();
14befaf4 5651 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
d99b02a1
DM
5652 /* av now has a refcnt of 2, which avoids it getting freed
5653 * before us during global cleanup. The extra ref is removed
5654 * by magic_killbackrefs() when tsv is being freed */
810b8aa5 5655 }
d91d49e8 5656 if (AvFILLp(av) >= AvMAX(av)) {
fdc9a813 5657 I32 i;
d91d49e8 5658 SV **svp = AvARRAY(av);
fdc9a813
AE
5659 for (i = AvFILLp(av); i >= 0; i--)
5660 if (!svp[i]) {
d91d49e8
MM
5661 svp[i] = sv; /* reuse the slot */
5662 return;
5663 }
d91d49e8
MM
5664 av_extend(av, AvFILLp(av)+1);
5665 }
5666 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
5667}
5668
645c22ef
DM
5669/* delete a back-reference to ourselves from the backref magic associated
5670 * with the SV we point to.
5671 */
5672
1c846c1f 5673STATIC void
cea2e8a9 5674S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
5675{
5676 AV *av;
5677 SV **svp;
5678 I32 i;
5679 SV *tsv = SvRV(sv);
c04a4dfe 5680 MAGIC *mg = NULL;
14befaf4 5681 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, PERL_MAGIC_backref)))
cea2e8a9 5682 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
5683 av = (AV *)mg->mg_obj;
5684 svp = AvARRAY(av);
fdc9a813
AE
5685 for (i = AvFILLp(av); i >= 0; i--)
5686 if (svp[i] == sv) svp[i] = Nullsv;
810b8aa5
GS
5687}
5688
954c1994
GS
5689/*
5690=for apidoc sv_insert
5691
5692Inserts a string at the specified offset/length within the SV. Similar to
5693the Perl substr() function.
5694
5695=cut
5696*/
5697
79072805 5698void
864dbfa3 5699Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
79072805
LW
5700{
5701 register char *big;
5702 register char *mid;
5703 register char *midend;
5704 register char *bigend;
5705 register I32 i;
6ff81951 5706 STRLEN curlen;
1c846c1f 5707
79072805 5708
8990e307 5709 if (!bigstr)
cea2e8a9 5710 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 5711 SvPV_force(bigstr, curlen);
60fa28ff 5712 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
5713 if (offset + len > curlen) {
5714 SvGROW(bigstr, offset+len+1);
5715 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
5716 SvCUR_set(bigstr, offset+len);
5717 }
79072805 5718
69b47968 5719 SvTAINT(bigstr);
79072805
LW
5720 i = littlelen - len;
5721 if (i > 0) { /* string might grow */
a0d0e21e 5722 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
5723 mid = big + offset + len;
5724 midend = bigend = big + SvCUR(bigstr);
5725 bigend += i;
5726 *bigend = '\0';
5727 while (midend > mid) /* shove everything down */
5728 *--bigend = *--midend;
5729 Move(little,big+offset,littlelen,char);
5730 SvCUR(bigstr) += i;
5731 SvSETMAGIC(bigstr);
5732 return;
5733 }
5734 else if (i == 0) {
463ee0b2 5735 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
5736 SvSETMAGIC(bigstr);
5737 return;
5738 }
5739
463ee0b2 5740 big = SvPVX(bigstr);
79072805
LW
5741 mid = big + offset;
5742 midend = mid + len;
5743 bigend = big + SvCUR(bigstr);
5744
5745 if (midend > bigend)
cea2e8a9 5746 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5747
5748 if (mid - big > bigend - midend) { /* faster to shorten from end */
5749 if (littlelen) {
5750 Move(little, mid, littlelen,char);
5751 mid += littlelen;
5752 }
5753 i = bigend - midend;
5754 if (i > 0) {
5755 Move(midend, mid, i,char);
5756 mid += i;
5757 }
5758 *mid = '\0';
5759 SvCUR_set(bigstr, mid - big);
5760 }
5761 /*SUPPRESS 560*/
155aba94 5762 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5763 midend -= littlelen;
5764 mid = midend;
5765 sv_chop(bigstr,midend-i);
5766 big += i;
5767 while (i--)
5768 *--midend = *--big;
5769 if (littlelen)
5770 Move(little, mid, littlelen,char);
5771 }
5772 else if (littlelen) {
5773 midend -= littlelen;
5774 sv_chop(bigstr,midend);
5775 Move(little,midend,littlelen,char);
5776 }
5777 else {
5778 sv_chop(bigstr,midend);
5779 }
5780 SvSETMAGIC(bigstr);
5781}
5782
c461cf8f
JH
5783/*
5784=for apidoc sv_replace
5785
5786Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5787The target SV physically takes over ownership of the body of the source SV
5788and inherits its flags; however, the target keeps any magic it owns,
5789and any magic in the source is discarded.
ff276b08 5790Note that this is a rather specialist SV copying operation; most of the
645c22ef 5791time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5792
5793=cut
5794*/
79072805
LW
5795
5796void
864dbfa3 5797Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805
LW
5798{
5799 U32 refcnt = SvREFCNT(sv);
765f542d 5800 SV_CHECK_THINKFIRST_COW_DROP(sv);
0453d815 5801 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
9014280d 5802 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
93a17b20 5803 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5804 if (SvMAGICAL(nsv))
5805 mg_free(nsv);
5806 else
5807 sv_upgrade(nsv, SVt_PVMG);
93a17b20 5808 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 5809 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
5810 SvMAGICAL_off(sv);
5811 SvMAGIC(sv) = 0;
5812 }
79072805
LW
5813 SvREFCNT(sv) = 0;
5814 sv_clear(sv);
477f5d66 5815 assert(!SvREFCNT(sv));
79072805 5816 StructCopy(nsv,sv,SV);
d3d0e6f1
NC
5817#ifdef PERL_COPY_ON_WRITE
5818 if (SvIsCOW_normal(nsv)) {
5819 /* We need to follow the pointers around the loop to make the
5820 previous SV point to sv, rather than nsv. */
5821 SV *next;
5822 SV *current = nsv;
5823 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5824 assert(next);
5825 current = next;
5826 assert(SvPVX(current) == SvPVX(nsv));
5827 }
5828 /* Make the SV before us point to the SV after us. */
5829 if (DEBUG_C_TEST) {
5830 PerlIO_printf(Perl_debug_log, "previous is\n");
5831 sv_dump(current);
a29f6d03
NC
5832 PerlIO_printf(Perl_debug_log,
5833 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5834 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5835 }
a29f6d03 5836 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5837 }
5838#endif
79072805 5839 SvREFCNT(sv) = refcnt;
1edc1566 5840 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 5841 SvREFCNT(nsv) = 0;
463ee0b2 5842 del_SV(nsv);
79072805
LW
5843}
5844
c461cf8f
JH
5845/*
5846=for apidoc sv_clear
5847
645c22ef
DM
5848Clear an SV: call any destructors, free up any memory used by the body,
5849and free the body itself. The SV's head is I<not> freed, although
5850its type is set to all 1's so that it won't inadvertently be assumed
5851to be live during global destruction etc.
5852This function should only be called when REFCNT is zero. Most of the time
5853you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5854instead.
c461cf8f
JH
5855
5856=cut
5857*/
5858
79072805 5859void
864dbfa3 5860Perl_sv_clear(pTHX_ register SV *sv)
79072805 5861{
ec12f114 5862 HV* stash;
79072805
LW
5863 assert(sv);
5864 assert(SvREFCNT(sv) == 0);
5865
ed6116ce 5866 if (SvOBJECT(sv)) {
3280af22 5867 if (PL_defstash) { /* Still have a symbol table? */
39644a26 5868 dSP;
32251b26 5869 CV* destructor;
a0d0e21e 5870
5cc433a6 5871
8ebc5c01 5872
d460ef45 5873 do {
4e8e7886 5874 stash = SvSTASH(sv);
32251b26 5875 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 5876 if (destructor) {
5cc433a6
AB
5877 SV* tmpref = newRV(sv);
5878 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 5879 ENTER;
e788e7d3 5880 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
5881 EXTEND(SP, 2);
5882 PUSHMARK(SP);
5cc433a6 5883 PUSHs(tmpref);
4e8e7886 5884 PUTBACK;
44389ee9 5885 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
5cc433a6
AB
5886
5887
d3acc0f7 5888 POPSTACK;
3095d977 5889 SPAGAIN;
4e8e7886 5890 LEAVE;
5cc433a6
AB
5891 if(SvREFCNT(tmpref) < 2) {
5892 /* tmpref is not kept alive! */
5893 SvREFCNT(sv)--;
5894 SvRV(tmpref) = 0;
5895 SvROK_off(tmpref);
5896 }
5897 SvREFCNT_dec(tmpref);
4e8e7886
GS
5898 }
5899 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5900
6f44e0a4
JP
5901
5902 if (SvREFCNT(sv)) {
5903 if (PL_in_clean_objs)
cea2e8a9 5904 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
6f44e0a4
JP
5905 HvNAME(stash));
5906 /* DESTROY gave object new lease on life */
5907 return;
5908 }
a0d0e21e 5909 }
4e8e7886 5910
a0d0e21e 5911 if (SvOBJECT(sv)) {
4e8e7886 5912 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
5913 SvOBJECT_off(sv); /* Curse the object. */
5914 if (SvTYPE(sv) != SVt_PVIO)
3280af22 5915 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5916 }
463ee0b2 5917 }
524189f1
JH
5918 if (SvTYPE(sv) >= SVt_PVMG) {
5919 if (SvMAGIC(sv))
5920 mg_free(sv);
5921 if (SvFLAGS(sv) & SVpad_TYPED)
5922 SvREFCNT_dec(SvSTASH(sv));
5923 }
ec12f114 5924 stash = NULL;
79072805 5925 switch (SvTYPE(sv)) {
8990e307 5926 case SVt_PVIO:
df0bd2f4
GS
5927 if (IoIFP(sv) &&
5928 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5929 IoIFP(sv) != PerlIO_stdout() &&
5930 IoIFP(sv) != PerlIO_stderr())
93578b34 5931 {
f2b5be74 5932 io_close((IO*)sv, FALSE);
93578b34 5933 }
1d7c1841 5934 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5935 PerlDir_close(IoDIRP(sv));
1d7c1841 5936 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5937 Safefree(IoTOP_NAME(sv));
5938 Safefree(IoFMT_NAME(sv));
5939 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 5940 /* FALL THROUGH */
79072805 5941 case SVt_PVBM:
a0d0e21e 5942 goto freescalar;
79072805 5943 case SVt_PVCV:
748a9306 5944 case SVt_PVFM:
85e6fe83 5945 cv_undef((CV*)sv);
a0d0e21e 5946 goto freescalar;
79072805 5947 case SVt_PVHV:
85e6fe83 5948 hv_undef((HV*)sv);
a0d0e21e 5949 break;
79072805 5950 case SVt_PVAV:
85e6fe83 5951 av_undef((AV*)sv);
a0d0e21e 5952 break;
02270b4e 5953 case SVt_PVLV:
dd28f7bb
DM
5954 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5955 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5956 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5957 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5958 }
5959 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
5960 SvREFCNT_dec(LvTARG(sv));
02270b4e 5961 goto freescalar;
a0d0e21e 5962 case SVt_PVGV:
1edc1566 5963 gp_free((GV*)sv);
a0d0e21e 5964 Safefree(GvNAME(sv));
ec12f114
JPC
5965 /* cannot decrease stash refcount yet, as we might recursively delete
5966 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
5967 of stash until current sv is completely gone.
5968 -- JohnPC, 27 Mar 1998 */
5969 stash = GvSTASH(sv);
a0d0e21e 5970 /* FALL THROUGH */
79072805 5971 case SVt_PVMG:
79072805
LW
5972 case SVt_PVNV:
5973 case SVt_PVIV:
a0d0e21e
LW
5974 freescalar:
5975 (void)SvOOK_off(sv);
79072805
LW
5976 /* FALL THROUGH */
5977 case SVt_PV:
a0d0e21e 5978 case SVt_RV:
810b8aa5
GS
5979 if (SvROK(sv)) {
5980 if (SvWEAKREF(sv))
5981 sv_del_backref(sv);
5982 else
5983 SvREFCNT_dec(SvRV(sv));
5984 }
765f542d
NC
5985#ifdef PERL_COPY_ON_WRITE
5986 else if (SvPVX(sv)) {
5987 if (SvIsCOW(sv)) {
5988 /* I believe I need to grab the global SV mutex here and
5989 then recheck the COW status. */
46187eeb
NC
5990 if (DEBUG_C_TEST) {
5991 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5992 sv_dump(sv);
46187eeb 5993 }
e419cbc5 5994 sv_release_COW(sv, SvPVX(sv), SvCUR(sv), SvLEN(sv),
765f542d
NC
5995 SvUVX(sv), SV_COW_NEXT_SV(sv));
5996 /* And drop it here. */
5997 SvFAKE_off(sv);
5998 } else if (SvLEN(sv)) {
5999 Safefree(SvPVX(sv));
6000 }
6001 }
6002#else
1edc1566 6003 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 6004 Safefree(SvPVX(sv));
1c846c1f 6005 else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
25716404
GS
6006 unsharepvn(SvPVX(sv),
6007 SvUTF8(sv) ? -(I32)SvCUR(sv) : SvCUR(sv),
6008 SvUVX(sv));
1c846c1f
NIS
6009 SvFAKE_off(sv);
6010 }
765f542d 6011#endif
79072805 6012 break;
a0d0e21e 6013/*
79072805 6014 case SVt_NV:
79072805 6015 case SVt_IV:
79072805
LW
6016 case SVt_NULL:
6017 break;
a0d0e21e 6018*/
79072805
LW
6019 }
6020
6021 switch (SvTYPE(sv)) {
6022 case SVt_NULL:
6023 break;
79072805
LW
6024 case SVt_IV:
6025 del_XIV(SvANY(sv));
6026 break;
6027 case SVt_NV:
6028 del_XNV(SvANY(sv));
6029 break;
ed6116ce
LW
6030 case SVt_RV:
6031 del_XRV(SvANY(sv));
6032 break;
79072805
LW
6033 case SVt_PV:
6034 del_XPV(SvANY(sv));
6035 break;
6036 case SVt_PVIV:
6037 del_XPVIV(SvANY(sv));
6038 break;
6039 case SVt_PVNV:
6040 del_XPVNV(SvANY(sv));
6041 break;
6042 case SVt_PVMG:
6043 del_XPVMG(SvANY(sv));
6044 break;
6045 case SVt_PVLV:
6046 del_XPVLV(SvANY(sv));
6047 break;
6048 case SVt_PVAV:
6049 del_XPVAV(SvANY(sv));
6050 break;
6051 case SVt_PVHV:
6052 del_XPVHV(SvANY(sv));
6053 break;
6054 case SVt_PVCV:
6055 del_XPVCV(SvANY(sv));
6056 break;
6057 case SVt_PVGV:
6058 del_XPVGV(SvANY(sv));
ec12f114
JPC
6059 /* code duplication for increased performance. */
6060 SvFLAGS(sv) &= SVf_BREAK;
6061 SvFLAGS(sv) |= SVTYPEMASK;
6062 /* decrease refcount of the stash that owns this GV, if any */
6063 if (stash)
6064 SvREFCNT_dec(stash);
6065 return; /* not break, SvFLAGS reset already happened */
79072805
LW
6066 case SVt_PVBM:
6067 del_XPVBM(SvANY(sv));
6068 break;
6069 case SVt_PVFM:
6070 del_XPVFM(SvANY(sv));
6071 break;
8990e307
LW
6072 case SVt_PVIO:
6073 del_XPVIO(SvANY(sv));
6074 break;
79072805 6075 }
a0d0e21e 6076 SvFLAGS(sv) &= SVf_BREAK;
8990e307 6077 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
6078}
6079
645c22ef
DM
6080/*
6081=for apidoc sv_newref
6082
6083Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
6084instead.
6085
6086=cut
6087*/
6088
79072805 6089SV *
864dbfa3 6090Perl_sv_newref(pTHX_ SV *sv)
79072805 6091{
463ee0b2 6092 if (sv)
4db098f4 6093 (SvREFCNT(sv))++;
79072805
LW
6094 return sv;
6095}
6096
c461cf8f
JH
6097/*
6098=for apidoc sv_free
6099
645c22ef
DM
6100Decrement an SV's reference count, and if it drops to zero, call
6101C<sv_clear> to invoke destructors and free up any memory used by
6102the body; finally, deallocate the SV's head itself.
6103Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
6104
6105=cut
6106*/
6107
79072805 6108void
864dbfa3 6109Perl_sv_free(pTHX_ SV *sv)
79072805
LW
6110{
6111 if (!sv)
6112 return;
a0d0e21e
LW
6113 if (SvREFCNT(sv) == 0) {
6114 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
6115 /* this SV's refcnt has been artificially decremented to
6116 * trigger cleanup */
a0d0e21e 6117 return;
3280af22 6118 if (PL_in_clean_all) /* All is fair */
1edc1566 6119 return;
d689ffdd
JP
6120 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6121 /* make sure SvREFCNT(sv)==0 happens very seldom */
6122 SvREFCNT(sv) = (~(U32)0)/2;
6123 return;
6124 }
0453d815 6125 if (ckWARN_d(WARN_INTERNAL))
d5dede04 6126 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
6127 "Attempt to free unreferenced scalar: SV 0x%"UVxf
6128 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805
LW
6129 return;
6130 }
4db098f4 6131 if (--(SvREFCNT(sv)) > 0)
8990e307 6132 return;
8c4d3c90
NC
6133 Perl_sv_free2(aTHX_ sv);
6134}
6135
6136void
6137Perl_sv_free2(pTHX_ SV *sv)
6138{
463ee0b2
LW
6139#ifdef DEBUGGING
6140 if (SvTEMP(sv)) {
0453d815 6141 if (ckWARN_d(WARN_DEBUGGING))
9014280d 6142 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
472d47bc
SB
6143 "Attempt to free temp prematurely: SV 0x%"UVxf
6144 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 6145 return;
79072805 6146 }
463ee0b2 6147#endif
d689ffdd
JP
6148 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6149 /* make sure SvREFCNT(sv)==0 happens very seldom */
6150 SvREFCNT(sv) = (~(U32)0)/2;
6151 return;
6152 }
79072805 6153 sv_clear(sv);
477f5d66
CS
6154 if (! SvREFCNT(sv))
6155 del_SV(sv);
79072805
LW
6156}
6157
954c1994
GS
6158/*
6159=for apidoc sv_len
6160
645c22ef
DM
6161Returns the length of the string in the SV. Handles magic and type
6162coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
6163
6164=cut
6165*/
6166
79072805 6167STRLEN
864dbfa3 6168Perl_sv_len(pTHX_ register SV *sv)
79072805 6169{
463ee0b2 6170 STRLEN len;
79072805
LW
6171
6172 if (!sv)
6173 return 0;
6174
8990e307 6175 if (SvGMAGICAL(sv))
565764a8 6176 len = mg_length(sv);
8990e307 6177 else
497b47a8 6178 (void)SvPV(sv, len);
463ee0b2 6179 return len;
79072805
LW
6180}
6181
c461cf8f
JH
6182/*
6183=for apidoc sv_len_utf8
6184
6185Returns the number of characters in the string in an SV, counting wide
1e54db1a 6186UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
6187
6188=cut
6189*/
6190
7e8c5dac
HS
6191/*
6192 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
6193 * mg_ptr is used, by sv_pos_u2b(), see the comments of S_utf8_mg_pos_init().
6194 * (Note that the mg_len is not the length of the mg_ptr field.)
6195 *
6196 */
6197
a0ed51b3 6198STRLEN
864dbfa3 6199Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 6200{
a0ed51b3
LW
6201 if (!sv)
6202 return 0;
6203
a0ed51b3 6204 if (SvGMAGICAL(sv))
b76347f2 6205 return mg_length(sv);
a0ed51b3 6206 else
b76347f2 6207 {
7e8c5dac 6208 STRLEN len, ulen;
b76347f2 6209 U8 *s = (U8*)SvPV(sv, len);
7e8c5dac
HS
6210 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
6211
e23c8137 6212 if (mg && mg->mg_len != -1 && (mg->mg_len > 0 || len == 0)) {
7e8c5dac 6213 ulen = mg->mg_len;
e23c8137
JH
6214#ifdef PERL_UTF8_CACHE_ASSERT
6215 assert(ulen == Perl_utf8_length(aTHX_ s, s + len));
6216#endif
6217 }
7e8c5dac
HS
6218 else {
6219 ulen = Perl_utf8_length(aTHX_ s, s + len);
6220 if (!mg && !SvREADONLY(sv)) {
6221 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
6222 mg = mg_find(sv, PERL_MAGIC_utf8);
6223 assert(mg);
6224 }
6225 if (mg)
6226 mg->mg_len = ulen;
6227 }
6228 return ulen;
6229 }
6230}
6231
6232/* S_utf8_mg_pos_init() is used to initialize the mg_ptr field of
6233 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
6234 * between UTF-8 and byte offsets. There are two (substr offset and substr
6235 * length, the i offset, PERL_MAGIC_UTF8_CACHESIZE) times two (UTF-8 offset
6236 * and byte offset) cache positions.
6237 *
6238 * The mg_len field is used by sv_len_utf8(), see its comments.
6239 * Note that the mg_len is not the length of the mg_ptr field.
6240 *
6241 */
6242STATIC bool
6e551876 6243S_utf8_mg_pos_init(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, U8 *s, U8 *start)
7e8c5dac
HS
6244{
6245 bool found = FALSE;
6246
6247 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
8f78557a
AE
6248 if (!*mgp)
6249 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, &PL_vtbl_utf8, 0, 0);
7e8c5dac 6250 assert(*mgp);
b76347f2 6251
7e8c5dac
HS
6252 if ((*mgp)->mg_ptr)
6253 *cachep = (STRLEN *) (*mgp)->mg_ptr;
6254 else {
6255 Newz(0, *cachep, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
6256 (*mgp)->mg_ptr = (char *) *cachep;
6257 }
6258 assert(*cachep);
6259
6260 (*cachep)[i] = *offsetp;
6261 (*cachep)[i+1] = s - start;
6262 found = TRUE;
a0ed51b3 6263 }
7e8c5dac
HS
6264
6265 return found;
a0ed51b3
LW
6266}
6267
645c22ef 6268/*
7e8c5dac
HS
6269 * S_utf8_mg_pos() is used to query and update mg_ptr field of
6270 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
6271 * between UTF-8 and byte offsets. See also the comments of
6272 * S_utf8_mg_pos_init().
6273 *
6274 */
6275STATIC bool
6e551876 6276S_utf8_mg_pos(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, I32 uoff, U8 **sp, U8 *start, U8 *send)
7e8c5dac
HS
6277{
6278 bool found = FALSE;
6279
6280 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
6281 if (!*mgp)
6282 *mgp = mg_find(sv, PERL_MAGIC_utf8);
6283 if (*mgp && (*mgp)->mg_ptr) {
6284 *cachep = (STRLEN *) (*mgp)->mg_ptr;
e23c8137 6285 ASSERT_UTF8_CACHE(*cachep);
667208dd 6286 if ((*cachep)[i] == (STRLEN)uoff) /* An exact match. */
e23c8137 6287 found = TRUE;
7e8c5dac
HS
6288 else { /* We will skip to the right spot. */
6289 STRLEN forw = 0;
6290 STRLEN backw = 0;
6291 U8* p = NULL;
6292
6293 /* The assumption is that going backward is half
6294 * the speed of going forward (that's where the
6295 * 2 * backw in the below comes from). (The real
6296 * figure of course depends on the UTF-8 data.) */
6297
667208dd 6298 if ((*cachep)[i] > (STRLEN)uoff) {
7e8c5dac 6299 forw = uoff;
667208dd 6300 backw = (*cachep)[i] - (STRLEN)uoff;
7e8c5dac
HS
6301
6302 if (forw < 2 * backw)
6303 p = start;
6304 else
6305 p = start + (*cachep)[i+1];
6306 }
6307 /* Try this only for the substr offset (i == 0),
6308 * not for the substr length (i == 2). */
6309 else if (i == 0) { /* (*cachep)[i] < uoff */
6310 STRLEN ulen = sv_len_utf8(sv);
6311
667208dd
JH
6312 if ((STRLEN)uoff < ulen) {
6313 forw = (STRLEN)uoff - (*cachep)[i];
6314 backw = ulen - (STRLEN)uoff;
7e8c5dac
HS
6315
6316 if (forw < 2 * backw)
6317 p = start + (*cachep)[i+1];
6318 else
6319 p = send;
6320 }
6321
6322 /* If the string is not long enough for uoff,
6323 * we could extend it, but not at this low a level. */
6324 }
6325
6326 if (p) {
6327 if (forw < 2 * backw) {
6328 while (forw--)
6329 p += UTF8SKIP(p);
6330 }
6331 else {
6332 while (backw--) {
6333 p--;
6334 while (UTF8_IS_CONTINUATION(*p))
6335 p--;
6336 }
6337 }
6338
6339 /* Update the cache. */
667208dd 6340 (*cachep)[i] = (STRLEN)uoff;
7e8c5dac 6341 (*cachep)[i+1] = p - start;
8f78557a
AE
6342
6343 /* Drop the stale "length" cache */
6344 if (i == 0) {
6345 (*cachep)[2] = 0;
6346 (*cachep)[3] = 0;
6347 }
7e8c5dac
HS
6348
6349 found = TRUE;
6350 }
6351 }
6352 if (found) { /* Setup the return values. */
6353 *offsetp = (*cachep)[i+1];
6354 *sp = start + *offsetp;
6355 if (*sp >= send) {
6356 *sp = send;
6357 *offsetp = send - start;
6358 }
6359 else if (*sp < start) {
6360 *sp = start;
6361 *offsetp = 0;
6362 }
6363 }
6364 }
e23c8137
JH
6365#ifdef PERL_UTF8_CACHE_ASSERT
6366 if (found) {
6367 U8 *s = start;
6368 I32 n = uoff;
6369
6370 while (n-- && s < send)
6371 s += UTF8SKIP(s);
6372
6373 if (i == 0) {
6374 assert(*offsetp == s - start);
6375 assert((*cachep)[0] == (STRLEN)uoff);
6376 assert((*cachep)[1] == *offsetp);
6377 }
6378 ASSERT_UTF8_CACHE(*cachep);
6379 }
6380#endif
7e8c5dac 6381 }
e23c8137 6382
7e8c5dac
HS
6383 return found;
6384}
6385
6386/*
645c22ef
DM
6387=for apidoc sv_pos_u2b
6388
1e54db1a 6389Converts the value pointed to by offsetp from a count of UTF-8 chars from
645c22ef
DM
6390the start of the string, to a count of the equivalent number of bytes; if
6391lenp is non-zero, it does the same to lenp, but this time starting from
6392the offset, rather than from the start of the string. Handles magic and
6393type coercion.
6394
6395=cut
6396*/
6397
7e8c5dac
HS
6398/*
6399 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
6400 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
6401 * byte offsets. See also the comments of S_utf8_mg_pos().
6402 *
6403 */
6404
a0ed51b3 6405void
864dbfa3 6406Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 6407{
dfe13c55
GS
6408 U8 *start;
6409 U8 *s;
a0ed51b3 6410 STRLEN len;
7e8c5dac
HS
6411 STRLEN *cache = 0;
6412 STRLEN boffset = 0;
a0ed51b3
LW
6413
6414 if (!sv)
6415 return;
6416
dfe13c55 6417 start = s = (U8*)SvPV(sv, len);
7e8c5dac
HS
6418 if (len) {
6419 I32 uoffset = *offsetp;
6420 U8 *send = s + len;
6421 MAGIC *mg = 0;
6422 bool found = FALSE;
6423
bdf77a2a 6424 if (utf8_mg_pos(sv, &mg, &cache, 0, offsetp, *offsetp, &s, start, send))
7e8c5dac
HS
6425 found = TRUE;
6426 if (!found && uoffset > 0) {
6427 while (s < send && uoffset--)
6428 s += UTF8SKIP(s);
6429 if (s >= send)
6430 s = send;
bdf77a2a 6431 if (utf8_mg_pos_init(sv, &mg, &cache, 0, offsetp, s, start))
7e8c5dac
HS
6432 boffset = cache[1];
6433 *offsetp = s - start;
6434 }
6435 if (lenp) {
6436 found = FALSE;
6437 start = s;
bdf77a2a 6438 if (utf8_mg_pos(sv, &mg, &cache, 2, lenp, *lenp + *offsetp, &s, start, send)) {
7e8c5dac
HS
6439 *lenp -= boffset;
6440 found = TRUE;
6441 }
6442 if (!found && *lenp > 0) {
6443 I32 ulen = *lenp;
6444 if (ulen > 0)
6445 while (s < send && ulen--)
6446 s += UTF8SKIP(s);
6447 if (s >= send)
6448 s = send;
a67d7df9 6449 utf8_mg_pos_init(sv, &mg, &cache, 2, lenp, s, start);
7e8c5dac
HS
6450 }
6451 *lenp = s - start;
6452 }
e23c8137 6453 ASSERT_UTF8_CACHE(cache);
7e8c5dac
HS
6454 }
6455 else {
6456 *offsetp = 0;
6457 if (lenp)
6458 *lenp = 0;
a0ed51b3 6459 }
e23c8137 6460
a0ed51b3
LW
6461 return;
6462}
6463
645c22ef
DM
6464/*
6465=for apidoc sv_pos_b2u
6466
6467Converts the value pointed to by offsetp from a count of bytes from the
1e54db1a 6468start of the string, to a count of the equivalent number of UTF-8 chars.
645c22ef
DM
6469Handles magic and type coercion.
6470
6471=cut
6472*/
6473
7e8c5dac
HS
6474/*
6475 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
6476 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
6477 * byte offsets. See also the comments of S_utf8_mg_pos().
6478 *
6479 */
6480
a0ed51b3 6481void
7e8c5dac 6482Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 6483{
7e8c5dac 6484 U8* s;
a0ed51b3
LW
6485 STRLEN len;
6486
6487 if (!sv)
6488 return;
6489
dfe13c55 6490 s = (U8*)SvPV(sv, len);
eb160463 6491 if ((I32)len < *offsetp)
a0dbb045 6492 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac
HS
6493 else {
6494 U8* send = s + *offsetp;
6495 MAGIC* mg = NULL;
6496 STRLEN *cache = NULL;
6497
6498 len = 0;
6499
6500 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
6501 mg = mg_find(sv, PERL_MAGIC_utf8);
6502 if (mg && mg->mg_ptr) {
6503 cache = (STRLEN *) mg->mg_ptr;
c5661c80 6504 if (cache[1] == (STRLEN)*offsetp) {
7e8c5dac
HS
6505 /* An exact match. */
6506 *offsetp = cache[0];
6507
6508 return;
6509 }
c5661c80 6510 else if (cache[1] < (STRLEN)*offsetp) {
7e8c5dac
HS
6511 /* We already know part of the way. */
6512 len = cache[0];
6513 s += cache[1];
6514 /* Let the below loop do the rest. */
6515 }
6516 else { /* cache[1] > *offsetp */
6517 /* We already know all of the way, now we may
6518 * be able to walk back. The same assumption
6519 * is made as in S_utf8_mg_pos(), namely that
6520 * walking backward is twice slower than
6521 * walking forward. */
6522 STRLEN forw = *offsetp;
6523 STRLEN backw = cache[1] - *offsetp;
6524
6525 if (!(forw < 2 * backw)) {
6526 U8 *p = s + cache[1];
6527 STRLEN ubackw = 0;
6528
a5b510f2
AE
6529 cache[1] -= backw;
6530
7e8c5dac
HS
6531 while (backw--) {
6532 p--;
0aeb64d0 6533 while (UTF8_IS_CONTINUATION(*p)) {
7e8c5dac 6534 p--;
0aeb64d0
JH
6535 backw--;
6536 }
7e8c5dac
HS
6537 ubackw++;
6538 }
6539
6540 cache[0] -= ubackw;
0aeb64d0 6541 *offsetp = cache[0];
a67d7df9
TS
6542
6543 /* Drop the stale "length" cache */
6544 cache[2] = 0;
6545 cache[3] = 0;
6546
0aeb64d0 6547 return;
7e8c5dac
HS
6548 }
6549 }
6550 }
e23c8137 6551 ASSERT_UTF8_CACHE(cache);
a0dbb045 6552 }
7e8c5dac
HS
6553
6554 while (s < send) {
6555 STRLEN n = 1;
6556
6557 /* Call utf8n_to_uvchr() to validate the sequence
6558 * (unless a simple non-UTF character) */
6559 if (!UTF8_IS_INVARIANT(*s))
6560 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
6561 if (n > 0) {
6562 s += n;
6563 len++;
6564 }
6565 else
6566 break;
6567 }
6568
6569 if (!SvREADONLY(sv)) {
6570 if (!mg) {
6571 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
6572 mg = mg_find(sv, PERL_MAGIC_utf8);
6573 }
6574 assert(mg);
6575
6576 if (!mg->mg_ptr) {
979acdb5 6577 Newz(0, cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7e8c5dac
HS
6578 mg->mg_ptr = (char *) cache;
6579 }
6580 assert(cache);
6581
6582 cache[0] = len;
6583 cache[1] = *offsetp;
a67d7df9
TS
6584 /* Drop the stale "length" cache */
6585 cache[2] = 0;
6586 cache[3] = 0;
7e8c5dac
HS
6587 }
6588
6589 *offsetp = len;
a0ed51b3 6590 }
a0ed51b3
LW
6591 return;
6592}
6593
954c1994
GS
6594/*
6595=for apidoc sv_eq
6596
6597Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
6598identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6599coerce its args to strings if necessary.
954c1994
GS
6600
6601=cut
6602*/
6603
79072805 6604I32
e01b9e88 6605Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805
LW
6606{
6607 char *pv1;
463ee0b2 6608 STRLEN cur1;
79072805 6609 char *pv2;
463ee0b2 6610 STRLEN cur2;
e01b9e88 6611 I32 eq = 0;
553e1bcc
AT
6612 char *tpv = Nullch;
6613 SV* svrecode = Nullsv;
79072805 6614
e01b9e88 6615 if (!sv1) {
79072805
LW
6616 pv1 = "";
6617 cur1 = 0;
6618 }
463ee0b2 6619 else
e01b9e88 6620 pv1 = SvPV(sv1, cur1);
79072805 6621
e01b9e88
SC
6622 if (!sv2){
6623 pv2 = "";
6624 cur2 = 0;
92d29cee 6625 }
e01b9e88
SC
6626 else
6627 pv2 = SvPV(sv2, cur2);
79072805 6628
cf48d248 6629 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6630 /* Differing utf8ness.
6631 * Do not UTF8size the comparands as a side-effect. */
6632 if (PL_encoding) {
6633 if (SvUTF8(sv1)) {
553e1bcc
AT
6634 svrecode = newSVpvn(pv2, cur2);
6635 sv_recode_to_utf8(svrecode, PL_encoding);
6636 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6637 }
6638 else {
553e1bcc
AT
6639 svrecode = newSVpvn(pv1, cur1);
6640 sv_recode_to_utf8(svrecode, PL_encoding);
6641 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6642 }
6643 /* Now both are in UTF-8. */
0a1bd7ac
DM
6644 if (cur1 != cur2) {
6645 SvREFCNT_dec(svrecode);
799ef3cb 6646 return FALSE;
0a1bd7ac 6647 }
799ef3cb
JH
6648 }
6649 else {
6650 bool is_utf8 = TRUE;
6651
6652 if (SvUTF8(sv1)) {
6653 /* sv1 is the UTF-8 one,
6654 * if is equal it must be downgrade-able */
6655 char *pv = (char*)bytes_from_utf8((U8*)pv1,
6656 &cur1, &is_utf8);
6657 if (pv != pv1)
553e1bcc 6658 pv1 = tpv = pv;
799ef3cb
JH
6659 }
6660 else {
6661 /* sv2 is the UTF-8 one,
6662 * if is equal it must be downgrade-able */
6663 char *pv = (char *)bytes_from_utf8((U8*)pv2,
6664 &cur2, &is_utf8);
6665 if (pv != pv2)
553e1bcc 6666 pv2 = tpv = pv;
799ef3cb
JH
6667 }
6668 if (is_utf8) {
6669 /* Downgrade not possible - cannot be eq */
bf694877 6670 assert (tpv == 0);
799ef3cb
JH
6671 return FALSE;
6672 }
6673 }
cf48d248
JH
6674 }
6675
6676 if (cur1 == cur2)
765f542d 6677 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 6678
553e1bcc
AT
6679 if (svrecode)
6680 SvREFCNT_dec(svrecode);
799ef3cb 6681
553e1bcc
AT
6682 if (tpv)
6683 Safefree(tpv);
cf48d248 6684
e01b9e88 6685 return eq;
79072805
LW
6686}
6687
954c1994
GS
6688/*
6689=for apidoc sv_cmp
6690
6691Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
6692string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
6693C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6694coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
6695
6696=cut
6697*/
6698
79072805 6699I32
e01b9e88 6700Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 6701{
560a288e 6702 STRLEN cur1, cur2;
553e1bcc 6703 char *pv1, *pv2, *tpv = Nullch;
cf48d248 6704 I32 cmp;
553e1bcc 6705 SV *svrecode = Nullsv;
560a288e 6706
e01b9e88
SC
6707 if (!sv1) {
6708 pv1 = "";
560a288e
GS
6709 cur1 = 0;
6710 }
e01b9e88
SC
6711 else
6712 pv1 = SvPV(sv1, cur1);
560a288e 6713
553e1bcc 6714 if (!sv2) {
e01b9e88 6715 pv2 = "";
560a288e
GS
6716 cur2 = 0;
6717 }
e01b9e88
SC
6718 else
6719 pv2 = SvPV(sv2, cur2);
79072805 6720
cf48d248 6721 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6722 /* Differing utf8ness.
6723 * Do not UTF8size the comparands as a side-effect. */
cf48d248 6724 if (SvUTF8(sv1)) {
799ef3cb 6725 if (PL_encoding) {
553e1bcc
AT
6726 svrecode = newSVpvn(pv2, cur2);
6727 sv_recode_to_utf8(svrecode, PL_encoding);
6728 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6729 }
6730 else {
553e1bcc 6731 pv2 = tpv = (char*)bytes_to_utf8((U8*)pv2, &cur2);
799ef3cb 6732 }
cf48d248
JH
6733 }
6734 else {
799ef3cb 6735 if (PL_encoding) {
553e1bcc
AT
6736 svrecode = newSVpvn(pv1, cur1);
6737 sv_recode_to_utf8(svrecode, PL_encoding);
6738 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6739 }
6740 else {
553e1bcc 6741 pv1 = tpv = (char*)bytes_to_utf8((U8*)pv1, &cur1);
799ef3cb 6742 }
cf48d248
JH
6743 }
6744 }
6745
e01b9e88 6746 if (!cur1) {
cf48d248 6747 cmp = cur2 ? -1 : 0;
e01b9e88 6748 } else if (!cur2) {
cf48d248
JH
6749 cmp = 1;
6750 } else {
6751 I32 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
6752
6753 if (retval) {
cf48d248 6754 cmp = retval < 0 ? -1 : 1;
e01b9e88 6755 } else if (cur1 == cur2) {
cf48d248
JH
6756 cmp = 0;
6757 } else {
6758 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 6759 }
cf48d248 6760 }
16660edb 6761
553e1bcc
AT
6762 if (svrecode)
6763 SvREFCNT_dec(svrecode);
799ef3cb 6764
553e1bcc
AT
6765 if (tpv)
6766 Safefree(tpv);
cf48d248
JH
6767
6768 return cmp;
bbce6d69 6769}
16660edb 6770
c461cf8f
JH
6771/*
6772=for apidoc sv_cmp_locale
6773
645c22ef
DM
6774Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6775'use bytes' aware, handles get magic, and will coerce its args to strings
6776if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
6777
6778=cut
6779*/
6780
bbce6d69 6781I32
864dbfa3 6782Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 6783{
36477c24 6784#ifdef USE_LOCALE_COLLATE
16660edb 6785
bbce6d69 6786 char *pv1, *pv2;
6787 STRLEN len1, len2;
6788 I32 retval;
16660edb 6789
3280af22 6790 if (PL_collation_standard)
bbce6d69 6791 goto raw_compare;
16660edb 6792
bbce6d69 6793 len1 = 0;
8ac85365 6794 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 6795 len2 = 0;
8ac85365 6796 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 6797
bbce6d69 6798 if (!pv1 || !len1) {
6799 if (pv2 && len2)
6800 return -1;
6801 else
6802 goto raw_compare;
6803 }
6804 else {
6805 if (!pv2 || !len2)
6806 return 1;
6807 }
16660edb 6808
bbce6d69 6809 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 6810
bbce6d69 6811 if (retval)
16660edb 6812 return retval < 0 ? -1 : 1;
6813
bbce6d69 6814 /*
6815 * When the result of collation is equality, that doesn't mean
6816 * that there are no differences -- some locales exclude some
6817 * characters from consideration. So to avoid false equalities,
6818 * we use the raw string as a tiebreaker.
6819 */
16660edb 6820
bbce6d69 6821 raw_compare:
6822 /* FALL THROUGH */
16660edb 6823
36477c24 6824#endif /* USE_LOCALE_COLLATE */
16660edb 6825
bbce6d69 6826 return sv_cmp(sv1, sv2);
6827}
79072805 6828
645c22ef 6829
36477c24 6830#ifdef USE_LOCALE_COLLATE
645c22ef 6831
7a4c00b4 6832/*
645c22ef
DM
6833=for apidoc sv_collxfrm
6834
6835Add Collate Transform magic to an SV if it doesn't already have it.
6836
6837Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6838scalar data of the variable, but transformed to such a format that a normal
6839memory comparison can be used to compare the data according to the locale
6840settings.
6841
6842=cut
6843*/
6844
bbce6d69 6845char *
864dbfa3 6846Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 6847{
7a4c00b4 6848 MAGIC *mg;
16660edb 6849
14befaf4 6850 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 6851 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 6852 char *s, *xf;
6853 STRLEN len, xlen;
6854
7a4c00b4 6855 if (mg)
6856 Safefree(mg->mg_ptr);
bbce6d69 6857 s = SvPV(sv, len);
6858 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 6859 if (SvREADONLY(sv)) {
6860 SAVEFREEPV(xf);
6861 *nxp = xlen;
3280af22 6862 return xf + sizeof(PL_collation_ix);
ff0cee69 6863 }
7a4c00b4 6864 if (! mg) {
14befaf4
DM
6865 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
6866 mg = mg_find(sv, PERL_MAGIC_collxfrm);
7a4c00b4 6867 assert(mg);
bbce6d69 6868 }
7a4c00b4 6869 mg->mg_ptr = xf;
565764a8 6870 mg->mg_len = xlen;
7a4c00b4 6871 }
6872 else {
ff0cee69 6873 if (mg) {
6874 mg->mg_ptr = NULL;
565764a8 6875 mg->mg_len = -1;
ff0cee69 6876 }
bbce6d69 6877 }
6878 }
7a4c00b4 6879 if (mg && mg->mg_ptr) {
565764a8 6880 *nxp = mg->mg_len;
3280af22 6881 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 6882 }
6883 else {
6884 *nxp = 0;
6885 return NULL;
16660edb 6886 }
79072805
LW
6887}
6888
36477c24 6889#endif /* USE_LOCALE_COLLATE */
bbce6d69 6890
c461cf8f
JH
6891/*
6892=for apidoc sv_gets
6893
6894Get a line from the filehandle and store it into the SV, optionally
6895appending to the currently-stored string.
6896
6897=cut
6898*/
6899
79072805 6900char *
864dbfa3 6901Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 6902{
c07a80fd 6903 char *rsptr;
6904 STRLEN rslen;
6905 register STDCHAR rslast;
6906 register STDCHAR *bp;
6907 register I32 cnt;
9c5ffd7c 6908 I32 i = 0;
8bfdd7d9 6909 I32 rspara = 0;
e311fd51 6910 I32 recsize;
c07a80fd 6911
bc44a8a2
NC
6912 if (SvTHINKFIRST(sv))
6913 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
6914 /* XXX. If you make this PVIV, then copy on write can copy scalars read
6915 from <>.
6916 However, perlbench says it's slower, because the existing swipe code
6917 is faster than copy on write.
6918 Swings and roundabouts. */
6fc92669 6919 (void)SvUPGRADE(sv, SVt_PV);
99491443 6920
ff68c719 6921 SvSCREAM_off(sv);
efd8b2ba
AE
6922
6923 if (append) {
6924 if (PerlIO_isutf8(fp)) {
6925 if (!SvUTF8(sv)) {
6926 sv_utf8_upgrade_nomg(sv);
6927 sv_pos_u2b(sv,&append,0);
6928 }
6929 } else if (SvUTF8(sv)) {
6930 SV *tsv = NEWSV(0,0);
6931 sv_gets(tsv, fp, 0);
6932 sv_utf8_upgrade_nomg(tsv);
6933 SvCUR_set(sv,append);
6934 sv_catsv(sv,tsv);
6935 sv_free(tsv);
6936 goto return_string_or_null;
6937 }
6938 }
6939
6940 SvPOK_only(sv);
6941 if (PerlIO_isutf8(fp))
6942 SvUTF8_on(sv);
c07a80fd 6943
923e4eb5 6944 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
6945 /* we always read code in line mode */
6946 rsptr = "\n";
6947 rslen = 1;
6948 }
6949 else if (RsSNARF(PL_rs)) {
e468d35b
NIS
6950 /* If it is a regular disk file use size from stat() as estimate
6951 of amount we are going to read - may result in malloc-ing
6952 more memory than we realy need if layers bellow reduce
6953 size we read (e.g. CRLF or a gzip layer)
6954 */
e311fd51 6955 Stat_t st;
e468d35b
NIS
6956 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
6957 Off_t offset = PerlIO_tell(fp);
58f1856e 6958 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
6959 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6960 }
6961 }
c07a80fd 6962 rsptr = NULL;
6963 rslen = 0;
6964 }
3280af22 6965 else if (RsRECORD(PL_rs)) {
e311fd51 6966 I32 bytesread;
5b2b9c68
HM
6967 char *buffer;
6968
6969 /* Grab the size of the record we're getting */
3280af22 6970 recsize = SvIV(SvRV(PL_rs));
e311fd51 6971 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
6972 /* Go yank in */
6973#ifdef VMS
6974 /* VMS wants read instead of fread, because fread doesn't respect */
6975 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
6976 /* doing, but we've got no other real choice - except avoid stdio
6977 as implementation - perhaps write a :vms layer ?
6978 */
5b2b9c68
HM
6979 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
6980#else
6981 bytesread = PerlIO_read(fp, buffer, recsize);
6982#endif
27e6ca2d
AE
6983 if (bytesread < 0)
6984 bytesread = 0;
e311fd51 6985 SvCUR_set(sv, bytesread += append);
e670df4e 6986 buffer[bytesread] = '\0';
efd8b2ba 6987 goto return_string_or_null;
5b2b9c68 6988 }
3280af22 6989 else if (RsPARA(PL_rs)) {
c07a80fd 6990 rsptr = "\n\n";
6991 rslen = 2;
8bfdd7d9 6992 rspara = 1;
c07a80fd 6993 }
7d59b7e4
NIS
6994 else {
6995 /* Get $/ i.e. PL_rs into same encoding as stream wants */
6996 if (PerlIO_isutf8(fp)) {
6997 rsptr = SvPVutf8(PL_rs, rslen);
6998 }
6999 else {
7000 if (SvUTF8(PL_rs)) {
7001 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
7002 Perl_croak(aTHX_ "Wide character in $/");
7003 }
7004 }
7005 rsptr = SvPV(PL_rs, rslen);
7006 }
7007 }
7008
c07a80fd 7009 rslast = rslen ? rsptr[rslen - 1] : '\0';
7010
8bfdd7d9 7011 if (rspara) { /* have to do this both before and after */
79072805 7012 do { /* to make sure file boundaries work right */
760ac839 7013 if (PerlIO_eof(fp))
a0d0e21e 7014 return 0;
760ac839 7015 i = PerlIO_getc(fp);
79072805 7016 if (i != '\n') {
a0d0e21e
LW
7017 if (i == -1)
7018 return 0;
760ac839 7019 PerlIO_ungetc(fp,i);
79072805
LW
7020 break;
7021 }
7022 } while (i != EOF);
7023 }
c07a80fd 7024
760ac839
LW
7025 /* See if we know enough about I/O mechanism to cheat it ! */
7026
7027 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 7028 of abstracting out stdio interface. One call should be cheap
760ac839
LW
7029 enough here - and may even be a macro allowing compile
7030 time optimization.
7031 */
7032
7033 if (PerlIO_fast_gets(fp)) {
7034
7035 /*
7036 * We're going to steal some values from the stdio struct
7037 * and put EVERYTHING in the innermost loop into registers.
7038 */
7039 register STDCHAR *ptr;
7040 STRLEN bpx;
7041 I32 shortbuffered;
7042
16660edb 7043#if defined(VMS) && defined(PERLIO_IS_STDIO)
7044 /* An ungetc()d char is handled separately from the regular
7045 * buffer, so we getc() it back out and stuff it in the buffer.
7046 */
7047 i = PerlIO_getc(fp);
7048 if (i == EOF) return 0;
7049 *(--((*fp)->_ptr)) = (unsigned char) i;
7050 (*fp)->_cnt++;
7051#endif
c07a80fd 7052
c2960299 7053 /* Here is some breathtakingly efficient cheating */
c07a80fd 7054
a20bf0c3 7055 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b
NIS
7056 /* make sure we have the room */
7057 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
7058 /* Not room for all of it
7059 if we are looking for a separator and room for some
7060 */
7061 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7062 /* just process what we have room for */
79072805
LW
7063 shortbuffered = cnt - SvLEN(sv) + append + 1;
7064 cnt -= shortbuffered;
7065 }
7066 else {
7067 shortbuffered = 0;
bbce6d69 7068 /* remember that cnt can be negative */
eb160463 7069 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
7070 }
7071 }
e468d35b 7072 else
79072805 7073 shortbuffered = 0;
c07a80fd 7074 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
a20bf0c3 7075 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 7076 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7077 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 7078 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 7079 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7080 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7081 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
7082 for (;;) {
7083 screamer:
93a17b20 7084 if (cnt > 0) {
c07a80fd 7085 if (rslen) {
760ac839
LW
7086 while (cnt > 0) { /* this | eat */
7087 cnt--;
c07a80fd 7088 if ((*bp++ = *ptr++) == rslast) /* really | dust */
7089 goto thats_all_folks; /* screams | sed :-) */
7090 }
7091 }
7092 else {
1c846c1f
NIS
7093 Copy(ptr, bp, cnt, char); /* this | eat */
7094 bp += cnt; /* screams | dust */
c07a80fd 7095 ptr += cnt; /* louder | sed :-) */
a5f75d66 7096 cnt = 0;
93a17b20 7097 }
79072805
LW
7098 }
7099
748a9306 7100 if (shortbuffered) { /* oh well, must extend */
79072805
LW
7101 cnt = shortbuffered;
7102 shortbuffered = 0;
c07a80fd 7103 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
7104 SvCUR_set(sv, bpx);
7105 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 7106 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
7107 continue;
7108 }
7109
16660edb 7110 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
7111 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
7112 PTR2UV(ptr),(long)cnt));
cc00df79 7113 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 7114#if 0
16660edb 7115 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7116 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7117 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7118 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 7119#endif
1c846c1f 7120 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 7121 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
7122 another abstraction. */
760ac839 7123 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 7124#if 0
16660edb 7125 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7126 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7127 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7128 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 7129#endif
a20bf0c3
JH
7130 cnt = PerlIO_get_cnt(fp);
7131 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 7132 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7133 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 7134
748a9306
LW
7135 if (i == EOF) /* all done for ever? */
7136 goto thats_really_all_folks;
7137
c07a80fd 7138 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
7139 SvCUR_set(sv, bpx);
7140 SvGROW(sv, bpx + cnt + 2);
c07a80fd 7141 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
7142
eb160463 7143 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 7144
c07a80fd 7145 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 7146 goto thats_all_folks;
79072805
LW
7147 }
7148
7149thats_all_folks:
eb160463 7150 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX(sv)) < rslen) ||
36477c24 7151 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 7152 goto screamer; /* go back to the fray */
79072805
LW
7153thats_really_all_folks:
7154 if (shortbuffered)
7155 cnt += shortbuffered;
16660edb 7156 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7157 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 7158 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 7159 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7160 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7161 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7162 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 7163 *bp = '\0';
760ac839 7164 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 7165 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 7166 "Screamer: done, len=%ld, string=|%.*s|\n",
7167 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
7168 }
7169 else
79072805 7170 {
6edd2cd5
JH
7171 /*The big, slow, and stupid way. */
7172
7173 /* Any stack-challenged places. */
33d5f59c 7174#if defined(EPOC)
6edd2cd5
JH
7175 /* EPOC: need to work around SDK features. *
7176 * On WINS: MS VC5 generates calls to _chkstk, *
7177 * if a "large" stack frame is allocated. *
7178 * gcc on MARM does not generate calls like these. */
7179# define USEHEAPINSTEADOFSTACK
7180#endif
7181
7182#ifdef USEHEAPINSTEADOFSTACK
7183 STDCHAR *buf = 0;
7184 New(0, buf, 8192, STDCHAR);
7185 assert(buf);
4d2c4e07 7186#else
6edd2cd5 7187 STDCHAR buf[8192];
4d2c4e07 7188#endif
79072805 7189
760ac839 7190screamer2:
c07a80fd 7191 if (rslen) {
760ac839
LW
7192 register STDCHAR *bpe = buf + sizeof(buf);
7193 bp = buf;
eb160463 7194 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
7195 ; /* keep reading */
7196 cnt = bp - buf;
c07a80fd 7197 }
7198 else {
760ac839 7199 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 7200 /* Accomodate broken VAXC compiler, which applies U8 cast to
7201 * both args of ?: operator, causing EOF to change into 255
7202 */
37be0adf 7203 if (cnt > 0)
cbe9e203
JH
7204 i = (U8)buf[cnt - 1];
7205 else
37be0adf 7206 i = EOF;
c07a80fd 7207 }
79072805 7208
cbe9e203
JH
7209 if (cnt < 0)
7210 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
7211 if (append)
7212 sv_catpvn(sv, (char *) buf, cnt);
7213 else
7214 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 7215
7216 if (i != EOF && /* joy */
7217 (!rslen ||
7218 SvCUR(sv) < rslen ||
36477c24 7219 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
7220 {
7221 append = -1;
63e4d877
CS
7222 /*
7223 * If we're reading from a TTY and we get a short read,
7224 * indicating that the user hit his EOF character, we need
7225 * to notice it now, because if we try to read from the TTY
7226 * again, the EOF condition will disappear.
7227 *
7228 * The comparison of cnt to sizeof(buf) is an optimization
7229 * that prevents unnecessary calls to feof().
7230 *
7231 * - jik 9/25/96
7232 */
7233 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
7234 goto screamer2;
79072805 7235 }
6edd2cd5
JH
7236
7237#ifdef USEHEAPINSTEADOFSTACK
7238 Safefree(buf);
7239#endif
79072805
LW
7240 }
7241
8bfdd7d9 7242 if (rspara) { /* have to do this both before and after */
c07a80fd 7243 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 7244 i = PerlIO_getc(fp);
79072805 7245 if (i != '\n') {
760ac839 7246 PerlIO_ungetc(fp,i);
79072805
LW
7247 break;
7248 }
7249 }
7250 }
c07a80fd 7251
efd8b2ba 7252return_string_or_null:
c07a80fd 7253 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
7254}
7255
954c1994
GS
7256/*
7257=for apidoc sv_inc
7258
645c22ef
DM
7259Auto-increment of the value in the SV, doing string to numeric conversion
7260if necessary. Handles 'get' magic.
954c1994
GS
7261
7262=cut
7263*/
7264
79072805 7265void
864dbfa3 7266Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
7267{
7268 register char *d;
463ee0b2 7269 int flags;
79072805
LW
7270
7271 if (!sv)
7272 return;
b23a5f78
GB
7273 if (SvGMAGICAL(sv))
7274 mg_get(sv);
ed6116ce 7275 if (SvTHINKFIRST(sv)) {
765f542d
NC
7276 if (SvIsCOW(sv))
7277 sv_force_normal_flags(sv, 0);
0f15f207 7278 if (SvREADONLY(sv)) {
923e4eb5 7279 if (IN_PERL_RUNTIME)
cea2e8a9 7280 Perl_croak(aTHX_ PL_no_modify);
0f15f207 7281 }
a0d0e21e 7282 if (SvROK(sv)) {
b5be31e9 7283 IV i;
9e7bc3e8
JD
7284 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
7285 return;
56431972 7286 i = PTR2IV(SvRV(sv));
b5be31e9
SM
7287 sv_unref(sv);
7288 sv_setiv(sv, i);
a0d0e21e 7289 }
ed6116ce 7290 }
8990e307 7291 flags = SvFLAGS(sv);
28e5dec8
JH
7292 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
7293 /* It's (privately or publicly) a float, but not tested as an
7294 integer, so test it to see. */
d460ef45 7295 (void) SvIV(sv);
28e5dec8
JH
7296 flags = SvFLAGS(sv);
7297 }
7298 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7299 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 7300#ifdef PERL_PRESERVE_IVUV
28e5dec8 7301 oops_its_int:
59d8ce62 7302#endif
25da4f38
IZ
7303 if (SvIsUV(sv)) {
7304 if (SvUVX(sv) == UV_MAX)
a1e868e7 7305 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
7306 else
7307 (void)SvIOK_only_UV(sv);
7308 ++SvUVX(sv);
7309 } else {
7310 if (SvIVX(sv) == IV_MAX)
28e5dec8 7311 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
7312 else {
7313 (void)SvIOK_only(sv);
7314 ++SvIVX(sv);
1c846c1f 7315 }
55497cff 7316 }
79072805
LW
7317 return;
7318 }
28e5dec8
JH
7319 if (flags & SVp_NOK) {
7320 (void)SvNOK_only(sv);
7321 SvNVX(sv) += 1.0;
7322 return;
7323 }
7324
8990e307 7325 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
28e5dec8
JH
7326 if ((flags & SVTYPEMASK) < SVt_PVIV)
7327 sv_upgrade(sv, SVt_IV);
7328 (void)SvIOK_only(sv);
7329 SvIVX(sv) = 1;
79072805
LW
7330 return;
7331 }
463ee0b2 7332 d = SvPVX(sv);
79072805
LW
7333 while (isALPHA(*d)) d++;
7334 while (isDIGIT(*d)) d++;
7335 if (*d) {
28e5dec8 7336#ifdef PERL_PRESERVE_IVUV
d1be9408 7337 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
7338 warnings. Probably ought to make the sv_iv_please() that does
7339 the conversion if possible, and silently. */
c2988b20 7340 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
7341 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7342 /* Need to try really hard to see if it's an integer.
7343 9.22337203685478e+18 is an integer.
7344 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7345 so $a="9.22337203685478e+18"; $a+0; $a++
7346 needs to be the same as $a="9.22337203685478e+18"; $a++
7347 or we go insane. */
d460ef45 7348
28e5dec8
JH
7349 (void) sv_2iv(sv);
7350 if (SvIOK(sv))
7351 goto oops_its_int;
7352
7353 /* sv_2iv *should* have made this an NV */
7354 if (flags & SVp_NOK) {
7355 (void)SvNOK_only(sv);
7356 SvNVX(sv) += 1.0;
7357 return;
7358 }
7359 /* I don't think we can get here. Maybe I should assert this
7360 And if we do get here I suspect that sv_setnv will croak. NWC
7361 Fall through. */
7362#if defined(USE_LONG_DOUBLE)
7363 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",
7364 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7365#else
1779d84d 7366 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
7367 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7368#endif
7369 }
7370#endif /* PERL_PRESERVE_IVUV */
7371 sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
79072805
LW
7372 return;
7373 }
7374 d--;
463ee0b2 7375 while (d >= SvPVX(sv)) {
79072805
LW
7376 if (isDIGIT(*d)) {
7377 if (++*d <= '9')
7378 return;
7379 *(d--) = '0';
7380 }
7381 else {
9d116dd7
JH
7382#ifdef EBCDIC
7383 /* MKS: The original code here died if letters weren't consecutive.
7384 * at least it didn't have to worry about non-C locales. The
7385 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 7386 * arranged in order (although not consecutively) and that only
9d116dd7
JH
7387 * [A-Za-z] are accepted by isALPHA in the C locale.
7388 */
7389 if (*d != 'z' && *d != 'Z') {
7390 do { ++*d; } while (!isALPHA(*d));
7391 return;
7392 }
7393 *(d--) -= 'z' - 'a';
7394#else
79072805
LW
7395 ++*d;
7396 if (isALPHA(*d))
7397 return;
7398 *(d--) -= 'z' - 'a' + 1;
9d116dd7 7399#endif
79072805
LW
7400 }
7401 }
7402 /* oh,oh, the number grew */
7403 SvGROW(sv, SvCUR(sv) + 2);
7404 SvCUR(sv)++;
463ee0b2 7405 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
7406 *d = d[-1];
7407 if (isDIGIT(d[1]))
7408 *d = '1';
7409 else
7410 *d = d[1];
7411}
7412
954c1994
GS
7413/*
7414=for apidoc sv_dec
7415
645c22ef
DM
7416Auto-decrement of the value in the SV, doing string to numeric conversion
7417if necessary. Handles 'get' magic.
954c1994
GS
7418
7419=cut
7420*/
7421
79072805 7422void
864dbfa3 7423Perl_sv_dec(pTHX_ register SV *sv)
79072805 7424{
463ee0b2
LW
7425 int flags;
7426
79072805
LW
7427 if (!sv)
7428 return;
b23a5f78
GB
7429 if (SvGMAGICAL(sv))
7430 mg_get(sv);
ed6116ce 7431 if (SvTHINKFIRST(sv)) {
765f542d
NC
7432 if (SvIsCOW(sv))
7433 sv_force_normal_flags(sv, 0);
0f15f207 7434 if (SvREADONLY(sv)) {
923e4eb5 7435 if (IN_PERL_RUNTIME)
cea2e8a9 7436 Perl_croak(aTHX_ PL_no_modify);
0f15f207 7437 }
a0d0e21e 7438 if (SvROK(sv)) {
b5be31e9 7439 IV i;
9e7bc3e8
JD
7440 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
7441 return;
56431972 7442 i = PTR2IV(SvRV(sv));
b5be31e9
SM
7443 sv_unref(sv);
7444 sv_setiv(sv, i);
a0d0e21e 7445 }
ed6116ce 7446 }
28e5dec8
JH
7447 /* Unlike sv_inc we don't have to worry about string-never-numbers
7448 and keeping them magic. But we mustn't warn on punting */
8990e307 7449 flags = SvFLAGS(sv);
28e5dec8
JH
7450 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7451 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 7452#ifdef PERL_PRESERVE_IVUV
28e5dec8 7453 oops_its_int:
59d8ce62 7454#endif
25da4f38
IZ
7455 if (SvIsUV(sv)) {
7456 if (SvUVX(sv) == 0) {
7457 (void)SvIOK_only(sv);
7458 SvIVX(sv) = -1;
7459 }
7460 else {
7461 (void)SvIOK_only_UV(sv);
7462 --SvUVX(sv);
1c846c1f 7463 }
25da4f38
IZ
7464 } else {
7465 if (SvIVX(sv) == IV_MIN)
65202027 7466 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
7467 else {
7468 (void)SvIOK_only(sv);
7469 --SvIVX(sv);
1c846c1f 7470 }
55497cff 7471 }
7472 return;
7473 }
28e5dec8
JH
7474 if (flags & SVp_NOK) {
7475 SvNVX(sv) -= 1.0;
7476 (void)SvNOK_only(sv);
7477 return;
7478 }
8990e307 7479 if (!(flags & SVp_POK)) {
4633a7c4
LW
7480 if ((flags & SVTYPEMASK) < SVt_PVNV)
7481 sv_upgrade(sv, SVt_NV);
463ee0b2 7482 SvNVX(sv) = -1.0;
a0d0e21e 7483 (void)SvNOK_only(sv);
79072805
LW
7484 return;
7485 }
28e5dec8
JH
7486#ifdef PERL_PRESERVE_IVUV
7487 {
c2988b20 7488 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
7489 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7490 /* Need to try really hard to see if it's an integer.
7491 9.22337203685478e+18 is an integer.
7492 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7493 so $a="9.22337203685478e+18"; $a+0; $a--
7494 needs to be the same as $a="9.22337203685478e+18"; $a--
7495 or we go insane. */
d460ef45 7496
28e5dec8
JH
7497 (void) sv_2iv(sv);
7498 if (SvIOK(sv))
7499 goto oops_its_int;
7500
7501 /* sv_2iv *should* have made this an NV */
7502 if (flags & SVp_NOK) {
7503 (void)SvNOK_only(sv);
7504 SvNVX(sv) -= 1.0;
7505 return;
7506 }
7507 /* I don't think we can get here. Maybe I should assert this
7508 And if we do get here I suspect that sv_setnv will croak. NWC
7509 Fall through. */
7510#if defined(USE_LONG_DOUBLE)
7511 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",
7512 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7513#else
1779d84d 7514 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
7515 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
7516#endif
7517 }
7518 }
7519#endif /* PERL_PRESERVE_IVUV */
097ee67d 7520 sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
7521}
7522
954c1994
GS
7523/*
7524=for apidoc sv_mortalcopy
7525
645c22ef 7526Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
7527The new SV is marked as mortal. It will be destroyed "soon", either by an
7528explicit call to FREETMPS, or by an implicit call at places such as
7529statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
7530
7531=cut
7532*/
7533
79072805
LW
7534/* Make a string that will exist for the duration of the expression
7535 * evaluation. Actually, it may have to last longer than that, but
7536 * hopefully we won't free it until it has been assigned to a
7537 * permanent location. */
7538
7539SV *
864dbfa3 7540Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 7541{
463ee0b2 7542 register SV *sv;
b881518d 7543
4561caa4 7544 new_SV(sv);
79072805 7545 sv_setsv(sv,oldstr);
677b06e3
GS
7546 EXTEND_MORTAL(1);
7547 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
7548 SvTEMP_on(sv);
7549 return sv;
7550}
7551
954c1994
GS
7552/*
7553=for apidoc sv_newmortal
7554
645c22ef 7555Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
7556set to 1. It will be destroyed "soon", either by an explicit call to
7557FREETMPS, or by an implicit call at places such as statement boundaries.
7558See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
7559
7560=cut
7561*/
7562
8990e307 7563SV *
864dbfa3 7564Perl_sv_newmortal(pTHX)
8990e307
LW
7565{
7566 register SV *sv;
7567
4561caa4 7568 new_SV(sv);
8990e307 7569 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
7570 EXTEND_MORTAL(1);
7571 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
7572 return sv;
7573}
7574
954c1994
GS
7575/*
7576=for apidoc sv_2mortal
7577
d4236ebc
DM
7578Marks an existing SV as mortal. The SV will be destroyed "soon", either
7579by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
7580statement boundaries. SvTEMP() is turned on which means that the SV's
7581string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
7582and C<sv_mortalcopy>.
954c1994
GS
7583
7584=cut
7585*/
7586
79072805 7587SV *
864dbfa3 7588Perl_sv_2mortal(pTHX_ register SV *sv)
79072805
LW
7589{
7590 if (!sv)
7591 return sv;
d689ffdd 7592 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 7593 return sv;
677b06e3
GS
7594 EXTEND_MORTAL(1);
7595 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 7596 SvTEMP_on(sv);
79072805
LW
7597 return sv;
7598}
7599
954c1994
GS
7600/*
7601=for apidoc newSVpv
7602
7603Creates a new SV and copies a string into it. The reference count for the
7604SV is set to 1. If C<len> is zero, Perl will compute the length using
7605strlen(). For efficiency, consider using C<newSVpvn> instead.
7606
7607=cut
7608*/
7609
79072805 7610SV *
864dbfa3 7611Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 7612{
463ee0b2 7613 register SV *sv;
79072805 7614
4561caa4 7615 new_SV(sv);
79072805
LW
7616 if (!len)
7617 len = strlen(s);
7618 sv_setpvn(sv,s,len);
7619 return sv;
7620}
7621
954c1994
GS
7622/*
7623=for apidoc newSVpvn
7624
7625Creates a new SV and copies a string into it. The reference count for the
1c846c1f 7626SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 7627string. You are responsible for ensuring that the source string is at least
9e09f5f2 7628C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
7629
7630=cut
7631*/
7632
9da1e3b5 7633SV *
864dbfa3 7634Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
7635{
7636 register SV *sv;
7637
7638 new_SV(sv);
9da1e3b5
MUN
7639 sv_setpvn(sv,s,len);
7640 return sv;
7641}
7642
1c846c1f
NIS
7643/*
7644=for apidoc newSVpvn_share
7645
645c22ef
DM
7646Creates a new SV with its SvPVX pointing to a shared string in the string
7647table. If the string does not already exist in the table, it is created
7648first. Turns on READONLY and FAKE. The string's hash is stored in the UV
7649slot of the SV; if the C<hash> parameter is non-zero, that value is used;
7650otherwise the hash is computed. The idea here is that as the string table
7651is used for shared hash keys these strings will have SvPVX == HeKEY and
7652hash lookup will avoid string compare.
1c846c1f
NIS
7653
7654=cut
7655*/
7656
7657SV *
c3654f1a 7658Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
7659{
7660 register SV *sv;
c3654f1a
IH
7661 bool is_utf8 = FALSE;
7662 if (len < 0) {
77caf834 7663 STRLEN tmplen = -len;
c3654f1a 7664 is_utf8 = TRUE;
75a54232
JH
7665 /* See the note in hv.c:hv_fetch() --jhi */
7666 src = (char*)bytes_from_utf8((U8*)src, &tmplen, &is_utf8);
7667 len = tmplen;
7668 }
1c846c1f 7669 if (!hash)
5afd6d42 7670 PERL_HASH(hash, src, len);
1c846c1f
NIS
7671 new_SV(sv);
7672 sv_upgrade(sv, SVt_PVIV);
c3654f1a 7673 SvPVX(sv) = sharepvn(src, is_utf8?-len:len, hash);
1c846c1f
NIS
7674 SvCUR(sv) = len;
7675 SvUVX(sv) = hash;
7676 SvLEN(sv) = 0;
7677 SvREADONLY_on(sv);
7678 SvFAKE_on(sv);
7679 SvPOK_on(sv);
c3654f1a
IH
7680 if (is_utf8)
7681 SvUTF8_on(sv);
1c846c1f
NIS
7682 return sv;
7683}
7684
645c22ef 7685
cea2e8a9 7686#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7687
7688/* pTHX_ magic can't cope with varargs, so this is a no-context
7689 * version of the main function, (which may itself be aliased to us).
7690 * Don't access this version directly.
7691 */
7692
46fc3d4c 7693SV *
cea2e8a9 7694Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 7695{
cea2e8a9 7696 dTHX;
46fc3d4c 7697 register SV *sv;
7698 va_list args;
46fc3d4c 7699 va_start(args, pat);
c5be433b 7700 sv = vnewSVpvf(pat, &args);
46fc3d4c 7701 va_end(args);
7702 return sv;
7703}
cea2e8a9 7704#endif
46fc3d4c 7705
954c1994
GS
7706/*
7707=for apidoc newSVpvf
7708
645c22ef 7709Creates a new SV and initializes it with the string formatted like
954c1994
GS
7710C<sprintf>.
7711
7712=cut
7713*/
7714
cea2e8a9
GS
7715SV *
7716Perl_newSVpvf(pTHX_ const char* pat, ...)
7717{
7718 register SV *sv;
7719 va_list args;
cea2e8a9 7720 va_start(args, pat);
c5be433b 7721 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
7722 va_end(args);
7723 return sv;
7724}
46fc3d4c 7725
645c22ef
DM
7726/* backend for newSVpvf() and newSVpvf_nocontext() */
7727
79072805 7728SV *
c5be433b
GS
7729Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
7730{
7731 register SV *sv;
7732 new_SV(sv);
7733 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7734 return sv;
7735}
7736
954c1994
GS
7737/*
7738=for apidoc newSVnv
7739
7740Creates a new SV and copies a floating point value into it.
7741The reference count for the SV is set to 1.
7742
7743=cut
7744*/
7745
c5be433b 7746SV *
65202027 7747Perl_newSVnv(pTHX_ NV n)
79072805 7748{
463ee0b2 7749 register SV *sv;
79072805 7750
4561caa4 7751 new_SV(sv);
79072805
LW
7752 sv_setnv(sv,n);
7753 return sv;
7754}
7755
954c1994
GS
7756/*
7757=for apidoc newSViv
7758
7759Creates a new SV and copies an integer into it. The reference count for the
7760SV is set to 1.
7761
7762=cut
7763*/
7764
79072805 7765SV *
864dbfa3 7766Perl_newSViv(pTHX_ IV i)
79072805 7767{
463ee0b2 7768 register SV *sv;
79072805 7769
4561caa4 7770 new_SV(sv);
79072805
LW
7771 sv_setiv(sv,i);
7772 return sv;
7773}
7774
954c1994 7775/*
1a3327fb
JH
7776=for apidoc newSVuv
7777
7778Creates a new SV and copies an unsigned integer into it.
7779The reference count for the SV is set to 1.
7780
7781=cut
7782*/
7783
7784SV *
7785Perl_newSVuv(pTHX_ UV u)
7786{
7787 register SV *sv;
7788
7789 new_SV(sv);
7790 sv_setuv(sv,u);
7791 return sv;
7792}
7793
7794/*
954c1994
GS
7795=for apidoc newRV_noinc
7796
7797Creates an RV wrapper for an SV. The reference count for the original
7798SV is B<not> incremented.
7799
7800=cut
7801*/
7802
2304df62 7803SV *
864dbfa3 7804Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
7805{
7806 register SV *sv;
7807
4561caa4 7808 new_SV(sv);
2304df62 7809 sv_upgrade(sv, SVt_RV);
76e3520e 7810 SvTEMP_off(tmpRef);
d689ffdd 7811 SvRV(sv) = tmpRef;
2304df62 7812 SvROK_on(sv);
2304df62
AD
7813 return sv;
7814}
7815
ff276b08 7816/* newRV_inc is the official function name to use now.
645c22ef
DM
7817 * newRV_inc is in fact #defined to newRV in sv.h
7818 */
7819
5f05dabc 7820SV *
864dbfa3 7821Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 7822{
5f6447b6 7823 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 7824}
5f05dabc 7825
954c1994
GS
7826/*
7827=for apidoc newSVsv
7828
7829Creates a new SV which is an exact duplicate of the original SV.
645c22ef 7830(Uses C<sv_setsv>).
954c1994
GS
7831
7832=cut
7833*/
7834
79072805 7835SV *
864dbfa3 7836Perl_newSVsv(pTHX_ register SV *old)
79072805 7837{
463ee0b2 7838 register SV *sv;
79072805
LW
7839
7840 if (!old)
7841 return Nullsv;
8990e307 7842 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 7843 if (ckWARN_d(WARN_INTERNAL))
9014280d 7844 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
79072805
LW
7845 return Nullsv;
7846 }
4561caa4 7847 new_SV(sv);
ff68c719 7848 if (SvTEMP(old)) {
7849 SvTEMP_off(old);
463ee0b2 7850 sv_setsv(sv,old);
ff68c719 7851 SvTEMP_on(old);
79072805
LW
7852 }
7853 else
463ee0b2
LW
7854 sv_setsv(sv,old);
7855 return sv;
79072805
LW
7856}
7857
645c22ef
DM
7858/*
7859=for apidoc sv_reset
7860
7861Underlying implementation for the C<reset> Perl function.
7862Note that the perl-level function is vaguely deprecated.
7863
7864=cut
7865*/
7866
79072805 7867void
864dbfa3 7868Perl_sv_reset(pTHX_ register char *s, HV *stash)
79072805
LW
7869{
7870 register HE *entry;
7871 register GV *gv;
7872 register SV *sv;
7873 register I32 i;
7874 register PMOP *pm;
7875 register I32 max;
4802d5d7 7876 char todo[PERL_UCHAR_MAX+1];
79072805 7877
49d8d3a1
MB
7878 if (!stash)
7879 return;
7880
79072805
LW
7881 if (!*s) { /* reset ?? searches */
7882 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
48c036b1 7883 pm->op_pmdynflags &= ~PMdf_USED;
79072805
LW
7884 }
7885 return;
7886 }
7887
7888 /* reset variables */
7889
7890 if (!HvARRAY(stash))
7891 return;
463ee0b2
LW
7892
7893 Zero(todo, 256, char);
79072805 7894 while (*s) {
4802d5d7 7895 i = (unsigned char)*s;
79072805
LW
7896 if (s[1] == '-') {
7897 s += 2;
7898 }
4802d5d7 7899 max = (unsigned char)*s++;
79072805 7900 for ( ; i <= max; i++) {
463ee0b2
LW
7901 todo[i] = 1;
7902 }
a0d0e21e 7903 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 7904 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7905 entry;
7906 entry = HeNEXT(entry))
7907 {
1edc1566 7908 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7909 continue;
1edc1566 7910 gv = (GV*)HeVAL(entry);
79072805 7911 sv = GvSV(gv);
9e35f4b3
GS
7912 if (SvTHINKFIRST(sv)) {
7913 if (!SvREADONLY(sv) && SvROK(sv))
7914 sv_unref(sv);
7915 continue;
7916 }
a0d0e21e 7917 (void)SvOK_off(sv);
79072805
LW
7918 if (SvTYPE(sv) >= SVt_PV) {
7919 SvCUR_set(sv, 0);
463ee0b2
LW
7920 if (SvPVX(sv) != Nullch)
7921 *SvPVX(sv) = '\0';
44a8e56a 7922 SvTAINT(sv);
79072805
LW
7923 }
7924 if (GvAV(gv)) {
7925 av_clear(GvAV(gv));
7926 }
44a8e56a 7927 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
463ee0b2 7928 hv_clear(GvHV(gv));
2f42fcb0 7929#ifndef PERL_MICRO
fa6a1c44 7930#ifdef USE_ENVIRON_ARRAY
4efc5df6
GS
7931 if (gv == PL_envgv
7932# ifdef USE_ITHREADS
7933 && PL_curinterp == aTHX
7934# endif
7935 )
7936 {
79072805 7937 environ[0] = Nullch;
4efc5df6 7938 }
a0d0e21e 7939#endif
2f42fcb0 7940#endif /* !PERL_MICRO */
79072805
LW
7941 }
7942 }
7943 }
7944 }
7945}
7946
645c22ef
DM
7947/*
7948=for apidoc sv_2io
7949
7950Using various gambits, try to get an IO from an SV: the IO slot if its a
7951GV; or the recursive result if we're an RV; or the IO slot of the symbol
7952named after the PV if we're a string.
7953
7954=cut
7955*/
7956
46fc3d4c 7957IO*
864dbfa3 7958Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 7959{
7960 IO* io;
7961 GV* gv;
2d8e6c8d 7962 STRLEN n_a;
46fc3d4c 7963
7964 switch (SvTYPE(sv)) {
7965 case SVt_PVIO:
7966 io = (IO*)sv;
7967 break;
7968 case SVt_PVGV:
7969 gv = (GV*)sv;
7970 io = GvIO(gv);
7971 if (!io)
cea2e8a9 7972 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 7973 break;
7974 default:
7975 if (!SvOK(sv))
cea2e8a9 7976 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 7977 if (SvROK(sv))
7978 return sv_2io(SvRV(sv));
2d8e6c8d 7979 gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
46fc3d4c 7980 if (gv)
7981 io = GvIO(gv);
7982 else
7983 io = 0;
7984 if (!io)
35c1215d 7985 Perl_croak(aTHX_ "Bad filehandle: %"SVf, sv);
46fc3d4c 7986 break;
7987 }
7988 return io;
7989}
7990
645c22ef
DM
7991/*
7992=for apidoc sv_2cv
7993
7994Using various gambits, try to get a CV from an SV; in addition, try if
7995possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
7996
7997=cut
7998*/
7999
79072805 8000CV *
864dbfa3 8001Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 8002{
c04a4dfe
JH
8003 GV *gv = Nullgv;
8004 CV *cv = Nullcv;
2d8e6c8d 8005 STRLEN n_a;
79072805
LW
8006
8007 if (!sv)
93a17b20 8008 return *gvp = Nullgv, Nullcv;
79072805 8009 switch (SvTYPE(sv)) {
79072805
LW
8010 case SVt_PVCV:
8011 *st = CvSTASH(sv);
8012 *gvp = Nullgv;
8013 return (CV*)sv;
8014 case SVt_PVHV:
8015 case SVt_PVAV:
8016 *gvp = Nullgv;
8017 return Nullcv;
8990e307
LW
8018 case SVt_PVGV:
8019 gv = (GV*)sv;
a0d0e21e 8020 *gvp = gv;
8990e307
LW
8021 *st = GvESTASH(gv);
8022 goto fix_gv;
8023
79072805 8024 default:
a0d0e21e
LW
8025 if (SvGMAGICAL(sv))
8026 mg_get(sv);
8027 if (SvROK(sv)) {
f5284f61
IZ
8028 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
8029 tryAMAGICunDEREF(to_cv);
8030
62f274bf
GS
8031 sv = SvRV(sv);
8032 if (SvTYPE(sv) == SVt_PVCV) {
8033 cv = (CV*)sv;
8034 *gvp = Nullgv;
8035 *st = CvSTASH(cv);
8036 return cv;
8037 }
8038 else if(isGV(sv))
8039 gv = (GV*)sv;
8040 else
cea2e8a9 8041 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 8042 }
62f274bf 8043 else if (isGV(sv))
79072805
LW
8044 gv = (GV*)sv;
8045 else
2d8e6c8d 8046 gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
79072805
LW
8047 *gvp = gv;
8048 if (!gv)
8049 return Nullcv;
8050 *st = GvESTASH(gv);
8990e307 8051 fix_gv:
8ebc5c01 8052 if (lref && !GvCVu(gv)) {
4633a7c4 8053 SV *tmpsv;
748a9306 8054 ENTER;
4633a7c4 8055 tmpsv = NEWSV(704,0);
16660edb 8056 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
8057 /* XXX this is probably not what they think they're getting.
8058 * It has the same effect as "sub name;", i.e. just a forward
8059 * declaration! */
774d564b 8060 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
8061 newSVOP(OP_CONST, 0, tmpsv),
8062 Nullop,
8990e307 8063 Nullop);
748a9306 8064 LEAVE;
8ebc5c01 8065 if (!GvCVu(gv))
35c1215d
NC
8066 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
8067 sv);
8990e307 8068 }
8ebc5c01 8069 return GvCVu(gv);
79072805
LW
8070 }
8071}
8072
c461cf8f
JH
8073/*
8074=for apidoc sv_true
8075
8076Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
8077Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
8078instead use an in-line version.
c461cf8f
JH
8079
8080=cut
8081*/
8082
79072805 8083I32
864dbfa3 8084Perl_sv_true(pTHX_ register SV *sv)
79072805 8085{
8990e307
LW
8086 if (!sv)
8087 return 0;
79072805 8088 if (SvPOK(sv)) {
4e35701f
NIS
8089 register XPV* tXpv;
8090 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 8091 (tXpv->xpv_cur > 1 ||
4e35701f 8092 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
79072805
LW
8093 return 1;
8094 else
8095 return 0;
8096 }
8097 else {
8098 if (SvIOK(sv))
463ee0b2 8099 return SvIVX(sv) != 0;
79072805
LW
8100 else {
8101 if (SvNOK(sv))
463ee0b2 8102 return SvNVX(sv) != 0.0;
79072805 8103 else
463ee0b2 8104 return sv_2bool(sv);
79072805
LW
8105 }
8106 }
8107}
79072805 8108
645c22ef
DM
8109/*
8110=for apidoc sv_iv
8111
8112A private implementation of the C<SvIVx> macro for compilers which can't
8113cope with complex macro expressions. Always use the macro instead.
8114
8115=cut
8116*/
8117
ff68c719 8118IV
864dbfa3 8119Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 8120{
25da4f38
IZ
8121 if (SvIOK(sv)) {
8122 if (SvIsUV(sv))
8123 return (IV)SvUVX(sv);
ff68c719 8124 return SvIVX(sv);
25da4f38 8125 }
ff68c719 8126 return sv_2iv(sv);
85e6fe83 8127}
85e6fe83 8128
645c22ef
DM
8129/*
8130=for apidoc sv_uv
8131
8132A private implementation of the C<SvUVx> macro for compilers which can't
8133cope with complex macro expressions. Always use the macro instead.
8134
8135=cut
8136*/
8137
ff68c719 8138UV
864dbfa3 8139Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 8140{
25da4f38
IZ
8141 if (SvIOK(sv)) {
8142 if (SvIsUV(sv))
8143 return SvUVX(sv);
8144 return (UV)SvIVX(sv);
8145 }
ff68c719 8146 return sv_2uv(sv);
8147}
85e6fe83 8148
645c22ef
DM
8149/*
8150=for apidoc sv_nv
8151
8152A private implementation of the C<SvNVx> macro for compilers which can't
8153cope with complex macro expressions. Always use the macro instead.
8154
8155=cut
8156*/
8157
65202027 8158NV
864dbfa3 8159Perl_sv_nv(pTHX_ register SV *sv)
79072805 8160{
ff68c719 8161 if (SvNOK(sv))
8162 return SvNVX(sv);
8163 return sv_2nv(sv);
79072805 8164}
79072805 8165
09540bc3
JH
8166/* sv_pv() is now a macro using SvPV_nolen();
8167 * this function provided for binary compatibility only
8168 */
8169
8170char *
8171Perl_sv_pv(pTHX_ SV *sv)
8172{
8173 STRLEN n_a;
8174
8175 if (SvPOK(sv))
8176 return SvPVX(sv);
8177
8178 return sv_2pv(sv, &n_a);
8179}
8180
645c22ef
DM
8181/*
8182=for apidoc sv_pv
8183
baca2b92 8184Use the C<SvPV_nolen> macro instead
645c22ef 8185
645c22ef
DM
8186=for apidoc sv_pvn
8187
8188A private implementation of the C<SvPV> macro for compilers which can't
8189cope with complex macro expressions. Always use the macro instead.
8190
8191=cut
8192*/
8193
1fa8b10d 8194char *
864dbfa3 8195Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 8196{
85e6fe83
LW
8197 if (SvPOK(sv)) {
8198 *lp = SvCUR(sv);
a0d0e21e 8199 return SvPVX(sv);
85e6fe83 8200 }
463ee0b2 8201 return sv_2pv(sv, lp);
79072805 8202}
79072805 8203
6e9d1081
NC
8204
8205char *
8206Perl_sv_pvn_nomg(pTHX_ register SV *sv, STRLEN *lp)
8207{
8208 if (SvPOK(sv)) {
8209 *lp = SvCUR(sv);
8210 return SvPVX(sv);
8211 }
8212 return sv_2pv_flags(sv, lp, 0);
8213}
8214
09540bc3
JH
8215/* sv_pvn_force() is now a macro using Perl_sv_pvn_force_flags();
8216 * this function provided for binary compatibility only
8217 */
8218
8219char *
8220Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
8221{
8222 return sv_pvn_force_flags(sv, lp, SV_GMAGIC);
8223}
8224
c461cf8f
JH
8225/*
8226=for apidoc sv_pvn_force
8227
8228Get a sensible string out of the SV somehow.
645c22ef
DM
8229A private implementation of the C<SvPV_force> macro for compilers which
8230can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 8231
8d6d96c1
HS
8232=for apidoc sv_pvn_force_flags
8233
8234Get a sensible string out of the SV somehow.
8235If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
8236appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
8237implemented in terms of this function.
645c22ef
DM
8238You normally want to use the various wrapper macros instead: see
8239C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
8240
8241=cut
8242*/
8243
8244char *
8245Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
8246{
c04a4dfe 8247 char *s = NULL;
a0d0e21e 8248
6fc92669 8249 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 8250 sv_force_normal_flags(sv, 0);
1c846c1f 8251
a0d0e21e
LW
8252 if (SvPOK(sv)) {
8253 *lp = SvCUR(sv);
8254 }
8255 else {
748a9306 8256 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 8257 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 8258 OP_NAME(PL_op));
a0d0e21e 8259 }
4633a7c4 8260 else
8d6d96c1 8261 s = sv_2pv_flags(sv, lp, flags);
a0d0e21e
LW
8262 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
8263 STRLEN len = *lp;
1c846c1f 8264
a0d0e21e
LW
8265 if (SvROK(sv))
8266 sv_unref(sv);
8267 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
8268 SvGROW(sv, len + 1);
8269 Move(s,SvPVX(sv),len,char);
8270 SvCUR_set(sv, len);
8271 *SvEND(sv) = '\0';
8272 }
8273 if (!SvPOK(sv)) {
8274 SvPOK_on(sv); /* validate pointer */
8275 SvTAINT(sv);
1d7c1841
GS
8276 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
8277 PTR2UV(sv),SvPVX(sv)));
a0d0e21e
LW
8278 }
8279 }
8280 return SvPVX(sv);
8281}
8282
09540bc3
JH
8283/* sv_pvbyte () is now a macro using Perl_sv_2pv_flags();
8284 * this function provided for binary compatibility only
8285 */
8286
8287char *
8288Perl_sv_pvbyte(pTHX_ SV *sv)
8289{
8290 sv_utf8_downgrade(sv,0);
8291 return sv_pv(sv);
8292}
8293
645c22ef
DM
8294/*
8295=for apidoc sv_pvbyte
8296
baca2b92 8297Use C<SvPVbyte_nolen> instead.
645c22ef 8298
645c22ef
DM
8299=for apidoc sv_pvbyten
8300
8301A private implementation of the C<SvPVbyte> macro for compilers
8302which can't cope with complex macro expressions. Always use the macro
8303instead.
8304
8305=cut
8306*/
8307
7340a771
GS
8308char *
8309Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
8310{
ffebcc3e 8311 sv_utf8_downgrade(sv,0);
7340a771
GS
8312 return sv_pvn(sv,lp);
8313}
8314
645c22ef
DM
8315/*
8316=for apidoc sv_pvbyten_force
8317
8318A private implementation of the C<SvPVbytex_force> macro for compilers
8319which can't cope with complex macro expressions. Always use the macro
8320instead.
8321
8322=cut
8323*/
8324
7340a771
GS
8325char *
8326Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
8327{
46ec2f14 8328 sv_pvn_force(sv,lp);
ffebcc3e 8329 sv_utf8_downgrade(sv,0);
46ec2f14
TS
8330 *lp = SvCUR(sv);
8331 return SvPVX(sv);
7340a771
GS
8332}
8333
09540bc3
JH
8334/* sv_pvutf8 () is now a macro using Perl_sv_2pv_flags();
8335 * this function provided for binary compatibility only
8336 */
8337
8338char *
8339Perl_sv_pvutf8(pTHX_ SV *sv)
8340{
8341 sv_utf8_upgrade(sv);
8342 return sv_pv(sv);
8343}
8344
645c22ef
DM
8345/*
8346=for apidoc sv_pvutf8
8347
baca2b92 8348Use the C<SvPVutf8_nolen> macro instead
645c22ef 8349
645c22ef
DM
8350=for apidoc sv_pvutf8n
8351
8352A private implementation of the C<SvPVutf8> macro for compilers
8353which can't cope with complex macro expressions. Always use the macro
8354instead.
8355
8356=cut
8357*/
8358
7340a771
GS
8359char *
8360Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
8361{
560a288e 8362 sv_utf8_upgrade(sv);
7340a771
GS
8363 return sv_pvn(sv,lp);
8364}
8365
c461cf8f
JH
8366/*
8367=for apidoc sv_pvutf8n_force
8368
645c22ef
DM
8369A private implementation of the C<SvPVutf8_force> macro for compilers
8370which can't cope with complex macro expressions. Always use the macro
8371instead.
c461cf8f
JH
8372
8373=cut
8374*/
8375
7340a771
GS
8376char *
8377Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
8378{
46ec2f14 8379 sv_pvn_force(sv,lp);
560a288e 8380 sv_utf8_upgrade(sv);
46ec2f14
TS
8381 *lp = SvCUR(sv);
8382 return SvPVX(sv);
7340a771
GS
8383}
8384
c461cf8f
JH
8385/*
8386=for apidoc sv_reftype
8387
8388Returns a string describing what the SV is a reference to.
8389
8390=cut
8391*/
8392
7340a771 8393char *
864dbfa3 8394Perl_sv_reftype(pTHX_ SV *sv, int ob)
a0d0e21e 8395{
c86bf373 8396 if (ob && SvOBJECT(sv)) {
e27ad1f2
AV
8397 if (HvNAME(SvSTASH(sv)))
8398 return HvNAME(SvSTASH(sv));
8399 else
8400 return "__ANON__";
c86bf373 8401 }
a0d0e21e
LW
8402 else {
8403 switch (SvTYPE(sv)) {
8404 case SVt_NULL:
8405 case SVt_IV:
8406 case SVt_NV:
8407 case SVt_RV:
8408 case SVt_PV:
8409 case SVt_PVIV:
8410 case SVt_PVNV:
8411 case SVt_PVMG:
8412 case SVt_PVBM:
439cb1c4
JP
8413 if (SvVOK(sv))
8414 return "VSTRING";
a0d0e21e
LW
8415 if (SvROK(sv))
8416 return "REF";
8417 else
8418 return "SCALAR";
be65207d
DM
8419
8420 case SVt_PVLV: return SvROK(sv) ? "REF"
8421 /* tied lvalues should appear to be
8422 * scalars for backwards compatitbility */
8423 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
8424 ? "SCALAR" : "LVALUE";
a0d0e21e
LW
8425 case SVt_PVAV: return "ARRAY";
8426 case SVt_PVHV: return "HASH";
8427 case SVt_PVCV: return "CODE";
8428 case SVt_PVGV: return "GLOB";
1d2dff63 8429 case SVt_PVFM: return "FORMAT";
27f9d8f3 8430 case SVt_PVIO: return "IO";
a0d0e21e
LW
8431 default: return "UNKNOWN";
8432 }
8433 }
8434}
8435
954c1994
GS
8436/*
8437=for apidoc sv_isobject
8438
8439Returns a boolean indicating whether the SV is an RV pointing to a blessed
8440object. If the SV is not an RV, or if the object is not blessed, then this
8441will return false.
8442
8443=cut
8444*/
8445
463ee0b2 8446int
864dbfa3 8447Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 8448{
68dc0745 8449 if (!sv)
8450 return 0;
8451 if (SvGMAGICAL(sv))
8452 mg_get(sv);
85e6fe83
LW
8453 if (!SvROK(sv))
8454 return 0;
8455 sv = (SV*)SvRV(sv);
8456 if (!SvOBJECT(sv))
8457 return 0;
8458 return 1;
8459}
8460
954c1994
GS
8461/*
8462=for apidoc sv_isa
8463
8464Returns a boolean indicating whether the SV is blessed into the specified
8465class. This does not check for subtypes; use C<sv_derived_from> to verify
8466an inheritance relationship.
8467
8468=cut
8469*/
8470
85e6fe83 8471int
864dbfa3 8472Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 8473{
68dc0745 8474 if (!sv)
8475 return 0;
8476 if (SvGMAGICAL(sv))
8477 mg_get(sv);
ed6116ce 8478 if (!SvROK(sv))
463ee0b2 8479 return 0;
ed6116ce
LW
8480 sv = (SV*)SvRV(sv);
8481 if (!SvOBJECT(sv))
463ee0b2 8482 return 0;
e27ad1f2
AV
8483 if (!HvNAME(SvSTASH(sv)))
8484 return 0;
463ee0b2
LW
8485
8486 return strEQ(HvNAME(SvSTASH(sv)), name);
8487}
8488
954c1994
GS
8489/*
8490=for apidoc newSVrv
8491
8492Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
8493it will be upgraded to one. If C<classname> is non-null then the new SV will
8494be blessed in the specified package. The new SV is returned and its
8495reference count is 1.
8496
8497=cut
8498*/
8499
463ee0b2 8500SV*
864dbfa3 8501Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 8502{
463ee0b2
LW
8503 SV *sv;
8504
4561caa4 8505 new_SV(sv);
51cf62d8 8506
765f542d 8507 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 8508 SvAMAGIC_off(rv);
51cf62d8 8509
0199fce9
JD
8510 if (SvTYPE(rv) >= SVt_PVMG) {
8511 U32 refcnt = SvREFCNT(rv);
8512 SvREFCNT(rv) = 0;
8513 sv_clear(rv);
8514 SvFLAGS(rv) = 0;
8515 SvREFCNT(rv) = refcnt;
8516 }
8517
51cf62d8 8518 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
8519 sv_upgrade(rv, SVt_RV);
8520 else if (SvTYPE(rv) > SVt_RV) {
8521 (void)SvOOK_off(rv);
8522 if (SvPVX(rv) && SvLEN(rv))
8523 Safefree(SvPVX(rv));
8524 SvCUR_set(rv, 0);
8525 SvLEN_set(rv, 0);
8526 }
51cf62d8
OT
8527
8528 (void)SvOK_off(rv);
053fc874 8529 SvRV(rv) = sv;
ed6116ce 8530 SvROK_on(rv);
463ee0b2 8531
a0d0e21e
LW
8532 if (classname) {
8533 HV* stash = gv_stashpv(classname, TRUE);
8534 (void)sv_bless(rv, stash);
8535 }
8536 return sv;
8537}
8538
954c1994
GS
8539/*
8540=for apidoc sv_setref_pv
8541
8542Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
8543argument will be upgraded to an RV. That RV will be modified to point to
8544the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
8545into the SV. The C<classname> argument indicates the package for the
8546blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8547will have a reference count of 1, and the RV will be returned.
954c1994
GS
8548
8549Do not use with other Perl types such as HV, AV, SV, CV, because those
8550objects will become corrupted by the pointer copy process.
8551
8552Note that C<sv_setref_pvn> copies the string while this copies the pointer.
8553
8554=cut
8555*/
8556
a0d0e21e 8557SV*
864dbfa3 8558Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 8559{
189b2af5 8560 if (!pv) {
3280af22 8561 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
8562 SvSETMAGIC(rv);
8563 }
a0d0e21e 8564 else
56431972 8565 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
8566 return rv;
8567}
8568
954c1994
GS
8569/*
8570=for apidoc sv_setref_iv
8571
8572Copies an integer into a new SV, optionally blessing the SV. The C<rv>
8573argument will be upgraded to an RV. That RV will be modified to point to
8574the new SV. The C<classname> argument indicates the package for the
8575blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8576will have a reference count of 1, and the RV will be returned.
954c1994
GS
8577
8578=cut
8579*/
8580
a0d0e21e 8581SV*
864dbfa3 8582Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
8583{
8584 sv_setiv(newSVrv(rv,classname), iv);
8585 return rv;
8586}
8587
954c1994 8588/*
e1c57cef
JH
8589=for apidoc sv_setref_uv
8590
8591Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
8592argument will be upgraded to an RV. That RV will be modified to point to
8593the new SV. The C<classname> argument indicates the package for the
8594blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8595will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
8596
8597=cut
8598*/
8599
8600SV*
8601Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
8602{
8603 sv_setuv(newSVrv(rv,classname), uv);
8604 return rv;
8605}
8606
8607/*
954c1994
GS
8608=for apidoc sv_setref_nv
8609
8610Copies a double into a new SV, optionally blessing the SV. The C<rv>
8611argument will be upgraded to an RV. That RV will be modified to point to
8612the new SV. The C<classname> argument indicates the package for the
8613blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8614will have a reference count of 1, and the RV will be returned.
954c1994
GS
8615
8616=cut
8617*/
8618
a0d0e21e 8619SV*
65202027 8620Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
8621{
8622 sv_setnv(newSVrv(rv,classname), nv);
8623 return rv;
8624}
463ee0b2 8625
954c1994
GS
8626/*
8627=for apidoc sv_setref_pvn
8628
8629Copies a string into a new SV, optionally blessing the SV. The length of the
8630string must be specified with C<n>. The C<rv> argument will be upgraded to
8631an RV. That RV will be modified to point to the new SV. The C<classname>
8632argument indicates the package for the blessing. Set C<classname> to
d34c2299
JS
8633C<Nullch> to avoid the blessing. The new SV will have a reference count
8634of 1, and the RV will be returned.
954c1994
GS
8635
8636Note that C<sv_setref_pv> copies the pointer while this copies the string.
8637
8638=cut
8639*/
8640
a0d0e21e 8641SV*
864dbfa3 8642Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
8643{
8644 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
8645 return rv;
8646}
8647
954c1994
GS
8648/*
8649=for apidoc sv_bless
8650
8651Blesses an SV into a specified package. The SV must be an RV. The package
8652must be designated by its stash (see C<gv_stashpv()>). The reference count
8653of the SV is unaffected.
8654
8655=cut
8656*/
8657
a0d0e21e 8658SV*
864dbfa3 8659Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 8660{
76e3520e 8661 SV *tmpRef;
a0d0e21e 8662 if (!SvROK(sv))
cea2e8a9 8663 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
8664 tmpRef = SvRV(sv);
8665 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
8666 if (SvREADONLY(tmpRef))
cea2e8a9 8667 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
8668 if (SvOBJECT(tmpRef)) {
8669 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8670 --PL_sv_objcount;
76e3520e 8671 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 8672 }
a0d0e21e 8673 }
76e3520e
GS
8674 SvOBJECT_on(tmpRef);
8675 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8676 ++PL_sv_objcount;
76e3520e
GS
8677 (void)SvUPGRADE(tmpRef, SVt_PVMG);
8678 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
a0d0e21e 8679
2e3febc6
CS
8680 if (Gv_AMG(stash))
8681 SvAMAGIC_on(sv);
8682 else
8683 SvAMAGIC_off(sv);
a0d0e21e 8684
1edbfb88
AB
8685 if(SvSMAGICAL(tmpRef))
8686 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8687 mg_set(tmpRef);
8688
8689
ecdeb87c 8690
a0d0e21e
LW
8691 return sv;
8692}
8693
645c22ef 8694/* Downgrades a PVGV to a PVMG.
645c22ef
DM
8695 */
8696
76e3520e 8697STATIC void
cea2e8a9 8698S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 8699{
850fabdf
GS
8700 void *xpvmg;
8701
a0d0e21e
LW
8702 assert(SvTYPE(sv) == SVt_PVGV);
8703 SvFAKE_off(sv);
8704 if (GvGP(sv))
1edc1566 8705 gp_free((GV*)sv);
e826b3c7
GS
8706 if (GvSTASH(sv)) {
8707 SvREFCNT_dec(GvSTASH(sv));
8708 GvSTASH(sv) = Nullhv;
8709 }
14befaf4 8710 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 8711 Safefree(GvNAME(sv));
a5f75d66 8712 GvMULTI_off(sv);
850fabdf
GS
8713
8714 /* need to keep SvANY(sv) in the right arena */
8715 xpvmg = new_XPVMG();
8716 StructCopy(SvANY(sv), xpvmg, XPVMG);
8717 del_XPVGV(SvANY(sv));
8718 SvANY(sv) = xpvmg;
8719
a0d0e21e
LW
8720 SvFLAGS(sv) &= ~SVTYPEMASK;
8721 SvFLAGS(sv) |= SVt_PVMG;
8722}
8723
954c1994 8724/*
840a7b70 8725=for apidoc sv_unref_flags
954c1994
GS
8726
8727Unsets the RV status of the SV, and decrements the reference count of
8728whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
8729as a reversal of C<newSVrv>. The C<cflags> argument can contain
8730C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8731(otherwise the decrementing is conditional on the reference count being
8732different from one or the reference being a readonly SV).
7889fe52 8733See C<SvROK_off>.
954c1994
GS
8734
8735=cut
8736*/
8737
ed6116ce 8738void
840a7b70 8739Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 8740{
a0d0e21e 8741 SV* rv = SvRV(sv);
810b8aa5
GS
8742
8743 if (SvWEAKREF(sv)) {
8744 sv_del_backref(sv);
8745 SvWEAKREF_off(sv);
8746 SvRV(sv) = 0;
8747 return;
8748 }
ed6116ce
LW
8749 SvRV(sv) = 0;
8750 SvROK_off(sv);
04ca4930
NC
8751 /* You can't have a || SvREADONLY(rv) here, as $a = $$a, where $a was
8752 assigned to as BEGIN {$a = \"Foo"} will fail. */
8753 if (SvREFCNT(rv) != 1 || (flags & SV_IMMEDIATE_UNREF))
4633a7c4 8754 SvREFCNT_dec(rv);
840a7b70 8755 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 8756 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 8757}
8990e307 8758
840a7b70
IZ
8759/*
8760=for apidoc sv_unref
8761
8762Unsets the RV status of the SV, and decrements the reference count of
8763whatever was being referenced by the RV. This can almost be thought of
8764as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 8765being zero. See C<SvROK_off>.
840a7b70
IZ
8766
8767=cut
8768*/
8769
8770void
8771Perl_sv_unref(pTHX_ SV *sv)
8772{
8773 sv_unref_flags(sv, 0);
8774}
8775
645c22ef
DM
8776/*
8777=for apidoc sv_taint
8778
8779Taint an SV. Use C<SvTAINTED_on> instead.
8780=cut
8781*/
8782
bbce6d69 8783void
864dbfa3 8784Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 8785{
14befaf4 8786 sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
bbce6d69 8787}
8788
645c22ef
DM
8789/*
8790=for apidoc sv_untaint
8791
8792Untaint an SV. Use C<SvTAINTED_off> instead.
8793=cut
8794*/
8795
bbce6d69 8796void
864dbfa3 8797Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 8798{
13f57bf8 8799 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8800 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 8801 if (mg)
565764a8 8802 mg->mg_len &= ~1;
36477c24 8803 }
bbce6d69 8804}
8805
645c22ef
DM
8806/*
8807=for apidoc sv_tainted
8808
8809Test an SV for taintedness. Use C<SvTAINTED> instead.
8810=cut
8811*/
8812
bbce6d69 8813bool
864dbfa3 8814Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 8815{
13f57bf8 8816 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8817 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
155aba94 8818 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 8819 return TRUE;
8820 }
8821 return FALSE;
bbce6d69 8822}
8823
09540bc3
JH
8824/*
8825=for apidoc sv_setpviv
8826
8827Copies an integer into the given SV, also updating its string value.
8828Does not handle 'set' magic. See C<sv_setpviv_mg>.
8829
8830=cut
8831*/
8832
8833void
8834Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
8835{
8836 char buf[TYPE_CHARS(UV)];
8837 char *ebuf;
8838 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8839
8840 sv_setpvn(sv, ptr, ebuf - ptr);
8841}
8842
8843/*
8844=for apidoc sv_setpviv_mg
8845
8846Like C<sv_setpviv>, but also handles 'set' magic.
8847
8848=cut
8849*/
8850
8851void
8852Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
8853{
8854 char buf[TYPE_CHARS(UV)];
8855 char *ebuf;
8856 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8857
8858 sv_setpvn(sv, ptr, ebuf - ptr);
8859 SvSETMAGIC(sv);
8860}
8861
cea2e8a9 8862#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8863
8864/* pTHX_ magic can't cope with varargs, so this is a no-context
8865 * version of the main function, (which may itself be aliased to us).
8866 * Don't access this version directly.
8867 */
8868
cea2e8a9
GS
8869void
8870Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
8871{
8872 dTHX;
8873 va_list args;
8874 va_start(args, pat);
c5be433b 8875 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
8876 va_end(args);
8877}
8878
645c22ef
DM
8879/* pTHX_ magic can't cope with varargs, so this is a no-context
8880 * version of the main function, (which may itself be aliased to us).
8881 * Don't access this version directly.
8882 */
cea2e8a9
GS
8883
8884void
8885Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
8886{
8887 dTHX;
8888 va_list args;
8889 va_start(args, pat);
c5be433b 8890 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 8891 va_end(args);
cea2e8a9
GS
8892}
8893#endif
8894
954c1994
GS
8895/*
8896=for apidoc sv_setpvf
8897
8898Processes its arguments like C<sprintf> and sets an SV to the formatted
8899output. Does not handle 'set' magic. See C<sv_setpvf_mg>.
8900
8901=cut
8902*/
8903
46fc3d4c 8904void
864dbfa3 8905Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8906{
8907 va_list args;
46fc3d4c 8908 va_start(args, pat);
c5be433b 8909 sv_vsetpvf(sv, pat, &args);
46fc3d4c 8910 va_end(args);
8911}
8912
645c22ef
DM
8913/* backend for C<sv_setpvf> and C<sv_setpvf_nocontext> */
8914
c5be433b
GS
8915void
8916Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8917{
8918 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8919}
ef50df4b 8920
954c1994
GS
8921/*
8922=for apidoc sv_setpvf_mg
8923
8924Like C<sv_setpvf>, but also handles 'set' magic.
8925
8926=cut
8927*/
8928
ef50df4b 8929void
864dbfa3 8930Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8931{
8932 va_list args;
ef50df4b 8933 va_start(args, pat);
c5be433b 8934 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 8935 va_end(args);
c5be433b
GS
8936}
8937
645c22ef
DM
8938/* backend for C<sv_setpvf_mg> C<setpvf_mg_nocontext> */
8939
c5be433b
GS
8940void
8941Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8942{
8943 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
8944 SvSETMAGIC(sv);
8945}
8946
cea2e8a9 8947#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8948
8949/* pTHX_ magic can't cope with varargs, so this is a no-context
8950 * version of the main function, (which may itself be aliased to us).
8951 * Don't access this version directly.
8952 */
8953
cea2e8a9
GS
8954void
8955Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
8956{
8957 dTHX;
8958 va_list args;
8959 va_start(args, pat);
c5be433b 8960 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
8961 va_end(args);
8962}
8963
645c22ef
DM
8964/* pTHX_ magic can't cope with varargs, so this is a no-context
8965 * version of the main function, (which may itself be aliased to us).
8966 * Don't access this version directly.
8967 */
8968
cea2e8a9
GS
8969void
8970Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
8971{
8972 dTHX;
8973 va_list args;
8974 va_start(args, pat);
c5be433b 8975 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 8976 va_end(args);
cea2e8a9
GS
8977}
8978#endif
8979
954c1994
GS
8980/*
8981=for apidoc sv_catpvf
8982
d5ce4a7c
GA
8983Processes its arguments like C<sprintf> and appends the formatted
8984output to an SV. If the appended data contains "wide" characters
8985(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
8986and characters >255 formatted with %c), the original SV might get
8987upgraded to UTF-8. Handles 'get' magic, but not 'set' magic.
8988C<SvSETMAGIC()> must typically be called after calling this function
8989to handle 'set' magic.
954c1994 8990
d5ce4a7c 8991=cut */
954c1994 8992
46fc3d4c 8993void
864dbfa3 8994Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8995{
8996 va_list args;
46fc3d4c 8997 va_start(args, pat);
c5be433b 8998 sv_vcatpvf(sv, pat, &args);
46fc3d4c 8999 va_end(args);
9000}
9001
645c22ef
DM
9002/* backend for C<sv_catpvf> and C<catpvf_mg_nocontext> */
9003
ef50df4b 9004void
c5be433b
GS
9005Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
9006{
9007 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
9008}
9009
954c1994
GS
9010/*
9011=for apidoc sv_catpvf_mg
9012
9013Like C<sv_catpvf>, but also handles 'set' magic.
9014
9015=cut
9016*/
9017
c5be433b 9018void
864dbfa3 9019Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
9020{
9021 va_list args;
ef50df4b 9022 va_start(args, pat);
c5be433b 9023 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 9024 va_end(args);
c5be433b
GS
9025}
9026
645c22ef
DM
9027/* backend for C<catpvf_mg> and C<catpvf_mg_nocontext> */
9028
c5be433b
GS
9029void
9030Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
9031{
9032 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
9033 SvSETMAGIC(sv);
9034}
9035
954c1994
GS
9036/*
9037=for apidoc sv_vsetpvfn
9038
9039Works like C<vcatpvfn> but copies the text into the SV instead of
9040appending it.
9041
645c22ef
DM
9042Usually used via one of its frontends C<sv_setpvf> and C<sv_setpvf_mg>.
9043
954c1994
GS
9044=cut
9045*/
9046
46fc3d4c 9047void
7d5ea4e7 9048Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 9049{
9050 sv_setpvn(sv, "", 0);
7d5ea4e7 9051 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 9052}
9053
645c22ef
DM
9054/* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
9055
2d00ba3b 9056STATIC I32
9dd79c3f 9057S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
9058{
9059 I32 var = 0;
9060 switch (**pattern) {
9061 case '1': case '2': case '3':
9062 case '4': case '5': case '6':
9063 case '7': case '8': case '9':
9064 while (isDIGIT(**pattern))
9065 var = var * 10 + (*(*pattern)++ - '0');
9066 }
9067 return var;
9068}
9dd79c3f 9069#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 9070
4151a5fe
IZ
9071static char *
9072F0convert(NV nv, char *endbuf, STRLEN *len)
9073{
9074 int neg = nv < 0;
9075 UV uv;
9076 char *p = endbuf;
9077
9078 if (neg)
9079 nv = -nv;
9080 if (nv < UV_MAX) {
9081 nv += 0.5;
028f8eaa 9082 uv = (UV)nv;
4151a5fe
IZ
9083 if (uv & 1 && uv == nv)
9084 uv--; /* Round to even */
9085 do {
9086 unsigned dig = uv % 10;
9087 *--p = '0' + dig;
9088 } while (uv /= 10);
9089 if (neg)
9090 *--p = '-';
9091 *len = endbuf - p;
9092 return p;
9093 }
9094 return Nullch;
9095}
9096
9097
954c1994
GS
9098/*
9099=for apidoc sv_vcatpvfn
9100
9101Processes its arguments like C<vsprintf> and appends the formatted output
9102to an SV. Uses an array of SVs if the C style variable argument list is
9103missing (NULL). When running with taint checks enabled, indicates via
9104C<maybe_tainted> if results are untrustworthy (often due to the use of
9105locales).
9106
645c22ef
DM
9107Usually used via one of its frontends C<sv_catpvf> and C<sv_catpvf_mg>.
9108
954c1994
GS
9109=cut
9110*/
9111
46fc3d4c 9112void
7d5ea4e7 9113Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 9114{
9115 char *p;
9116 char *q;
9117 char *patend;
fc36a67e 9118 STRLEN origlen;
46fc3d4c 9119 I32 svix = 0;
c635e13b 9120 static char nullstr[] = "(null)";
9c5ffd7c 9121 SV *argsv = Nullsv;
db79b45b
JH
9122 bool has_utf8; /* has the result utf8? */
9123 bool pat_utf8; /* the pattern is in utf8? */
9124 SV *nsv = Nullsv;
4151a5fe
IZ
9125 /* Times 4: a decimal digit takes more than 3 binary digits.
9126 * NV_DIG: mantissa takes than many decimal digits.
9127 * Plus 32: Playing safe. */
9128 char ebuf[IV_DIG * 4 + NV_DIG + 32];
9129 /* large enough for "%#.#f" --chip */
9130 /* what about long double NVs? --jhi */
db79b45b
JH
9131
9132 has_utf8 = pat_utf8 = DO_UTF8(sv);
46fc3d4c 9133
9134 /* no matter what, this is a string now */
fc36a67e 9135 (void)SvPV_force(sv, origlen);
46fc3d4c 9136
fc36a67e 9137 /* special-case "", "%s", and "%_" */
46fc3d4c 9138 if (patlen == 0)
9139 return;
fc36a67e 9140 if (patlen == 2 && pat[0] == '%') {
9141 switch (pat[1]) {
9142 case 's':
c635e13b 9143 if (args) {
9144 char *s = va_arg(*args, char*);
9145 sv_catpv(sv, s ? s : nullstr);
9146 }
7e2040f0 9147 else if (svix < svmax) {
fc36a67e 9148 sv_catsv(sv, *svargs);
7e2040f0
GS
9149 if (DO_UTF8(*svargs))
9150 SvUTF8_on(sv);
9151 }
fc36a67e 9152 return;
9153 case '_':
9154 if (args) {
7e2040f0
GS
9155 argsv = va_arg(*args, SV*);
9156 sv_catsv(sv, argsv);
9157 if (DO_UTF8(argsv))
9158 SvUTF8_on(sv);
fc36a67e 9159 return;
9160 }
9161 /* See comment on '_' below */
9162 break;
9163 }
46fc3d4c 9164 }
9165
1d917b39 9166#ifndef USE_LONG_DOUBLE
4151a5fe
IZ
9167 /* special-case "%.<number>[gf]" */
9168 if ( patlen <= 5 && pat[0] == '%' && pat[1] == '.'
9169 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
9170 unsigned digits = 0;
9171 const char *pp;
9172
9173 pp = pat + 2;
9174 while (*pp >= '0' && *pp <= '9')
9175 digits = 10 * digits + (*pp++ - '0');
028f8eaa 9176 if (pp - pat == (int)patlen - 1) {
4151a5fe
IZ
9177 NV nv;
9178
9179 if (args)
9180 nv = (NV)va_arg(*args, double);
9181 else if (svix < svmax)
9182 nv = SvNV(*svargs);
9183 else
9184 return;
9185 if (*pp == 'g') {
2873255c
NC
9186 /* Add check for digits != 0 because it seems that some
9187 gconverts are buggy in this case, and we don't yet have
9188 a Configure test for this. */
9189 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
9190 /* 0, point, slack */
2e59c212 9191 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
9192 sv_catpv(sv, ebuf);
9193 if (*ebuf) /* May return an empty string for digits==0 */
9194 return;
9195 }
9196 } else if (!digits) {
9197 STRLEN l;
9198
9199 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
9200 sv_catpvn(sv, p, l);
9201 return;
9202 }
9203 }
9204 }
9205 }
1d917b39 9206#endif /* !USE_LONG_DOUBLE */
4151a5fe 9207
2cf2cfc6 9208 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 9209 has_utf8 = TRUE;
2cf2cfc6 9210
46fc3d4c 9211 patend = (char*)pat + patlen;
9212 for (p = (char*)pat; p < patend; p = q) {
9213 bool alt = FALSE;
9214 bool left = FALSE;
b22c7a20 9215 bool vectorize = FALSE;
211dfcf1 9216 bool vectorarg = FALSE;
2cf2cfc6 9217 bool vec_utf8 = FALSE;
46fc3d4c 9218 char fill = ' ';
9219 char plus = 0;
9220 char intsize = 0;
9221 STRLEN width = 0;
fc36a67e 9222 STRLEN zeros = 0;
46fc3d4c 9223 bool has_precis = FALSE;
9224 STRLEN precis = 0;
58e33a90 9225 I32 osvix = svix;
2cf2cfc6 9226 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
9227#ifdef HAS_LDBL_SPRINTF_BUG
9228 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 9229 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
9230 bool fix_ldbl_sprintf_bug = FALSE;
9231#endif
205f51d8 9232
46fc3d4c 9233 char esignbuf[4];
ad391ad9 9234 U8 utf8buf[UTF8_MAXLEN+1];
46fc3d4c 9235 STRLEN esignlen = 0;
9236
9237 char *eptr = Nullch;
fc36a67e 9238 STRLEN elen = 0;
81f715da 9239 SV *vecsv = Nullsv;
a05b299f 9240 U8 *vecstr = Null(U8*);
b22c7a20 9241 STRLEN veclen = 0;
934abaf1 9242 char c = 0;
46fc3d4c 9243 int i;
9c5ffd7c 9244 unsigned base = 0;
8c8eb53c
RB
9245 IV iv = 0;
9246 UV uv = 0;
9e5b023a
JH
9247 /* we need a long double target in case HAS_LONG_DOUBLE but
9248 not USE_LONG_DOUBLE
9249 */
35fff930 9250#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
9251 long double nv;
9252#else
65202027 9253 NV nv;
9e5b023a 9254#endif
46fc3d4c 9255 STRLEN have;
9256 STRLEN need;
9257 STRLEN gap;
b22c7a20
GS
9258 char *dotstr = ".";
9259 STRLEN dotstrlen = 1;
211dfcf1 9260 I32 efix = 0; /* explicit format parameter index */
eb3fce90 9261 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
9262 I32 epix = 0; /* explicit precision index */
9263 I32 evix = 0; /* explicit vector index */
eb3fce90 9264 bool asterisk = FALSE;
46fc3d4c 9265
211dfcf1 9266 /* echo everything up to the next format specification */
46fc3d4c 9267 for (q = p; q < patend && *q != '%'; ++q) ;
9268 if (q > p) {
db79b45b
JH
9269 if (has_utf8 && !pat_utf8)
9270 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
9271 else
9272 sv_catpvn(sv, p, q - p);
46fc3d4c 9273 p = q;
9274 }
9275 if (q++ >= patend)
9276 break;
9277
211dfcf1
HS
9278/*
9279 We allow format specification elements in this order:
9280 \d+\$ explicit format parameter index
9281 [-+ 0#]+ flags
a472f209 9282 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 9283 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
9284 \d+|\*(\d+\$)? width using optional (optionally specified) arg
9285 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
9286 [hlqLV] size
9287 [%bcdefginopsux_DFOUX] format (mandatory)
9288*/
9289 if (EXPECT_NUMBER(q, width)) {
9290 if (*q == '$') {
9291 ++q;
9292 efix = width;
9293 } else {
9294 goto gotwidth;
9295 }
9296 }
9297
fc36a67e 9298 /* FLAGS */
9299
46fc3d4c 9300 while (*q) {
9301 switch (*q) {
9302 case ' ':
9303 case '+':
9304 plus = *q++;
9305 continue;
9306
9307 case '-':
9308 left = TRUE;
9309 q++;
9310 continue;
9311
9312 case '0':
9313 fill = *q++;
9314 continue;
9315
9316 case '#':
9317 alt = TRUE;
9318 q++;
9319 continue;
9320
fc36a67e 9321 default:
9322 break;
9323 }
9324 break;
9325 }
46fc3d4c 9326
211dfcf1 9327 tryasterisk:
eb3fce90 9328 if (*q == '*') {
211dfcf1
HS
9329 q++;
9330 if (EXPECT_NUMBER(q, ewix))
9331 if (*q++ != '$')
9332 goto unknown;
eb3fce90 9333 asterisk = TRUE;
211dfcf1
HS
9334 }
9335 if (*q == 'v') {
eb3fce90 9336 q++;
211dfcf1
HS
9337 if (vectorize)
9338 goto unknown;
9cbac4c7 9339 if ((vectorarg = asterisk)) {
211dfcf1
HS
9340 evix = ewix;
9341 ewix = 0;
9342 asterisk = FALSE;
9343 }
9344 vectorize = TRUE;
9345 goto tryasterisk;
eb3fce90
JH
9346 }
9347
211dfcf1 9348 if (!asterisk)
f3583277
RB
9349 if( *q == '0' )
9350 fill = *q++;
211dfcf1
HS
9351 EXPECT_NUMBER(q, width);
9352
9353 if (vectorize) {
9354 if (vectorarg) {
9355 if (args)
9356 vecsv = va_arg(*args, SV*);
9357 else
9358 vecsv = (evix ? evix <= svmax : svix < svmax) ?
3a7a539e 9359 svargs[evix ? evix-1 : svix++] : &PL_sv_undef;
4459522c 9360 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1 9361 if (DO_UTF8(vecsv))
2cf2cfc6 9362 is_utf8 = TRUE;
211dfcf1
HS
9363 }
9364 if (args) {
9365 vecsv = va_arg(*args, SV*);
9366 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 9367 vec_utf8 = DO_UTF8(vecsv);
eb3fce90 9368 }
211dfcf1
HS
9369 else if (efix ? efix <= svmax : svix < svmax) {
9370 vecsv = svargs[efix ? efix-1 : svix++];
9371 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 9372 vec_utf8 = DO_UTF8(vecsv);
211dfcf1
HS
9373 }
9374 else {
9375 vecstr = (U8*)"";
9376 veclen = 0;
9377 }
eb3fce90 9378 }
fc36a67e 9379
eb3fce90 9380 if (asterisk) {
fc36a67e 9381 if (args)
9382 i = va_arg(*args, int);
9383 else
eb3fce90
JH
9384 i = (ewix ? ewix <= svmax : svix < svmax) ?
9385 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 9386 left |= (i < 0);
9387 width = (i < 0) ? -i : i;
fc36a67e 9388 }
211dfcf1 9389 gotwidth:
fc36a67e 9390
9391 /* PRECISION */
46fc3d4c 9392
fc36a67e 9393 if (*q == '.') {
9394 q++;
9395 if (*q == '*') {
211dfcf1 9396 q++;
7b8dd722
HS
9397 if (EXPECT_NUMBER(q, epix) && *q++ != '$')
9398 goto unknown;
9399 /* XXX: todo, support specified precision parameter */
9400 if (epix)
211dfcf1 9401 goto unknown;
46fc3d4c 9402 if (args)
9403 i = va_arg(*args, int);
9404 else
eb3fce90
JH
9405 i = (ewix ? ewix <= svmax : svix < svmax)
9406 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 9407 precis = (i < 0) ? 0 : i;
fc36a67e 9408 }
9409 else {
9410 precis = 0;
9411 while (isDIGIT(*q))
9412 precis = precis * 10 + (*q++ - '0');
9413 }
9414 has_precis = TRUE;
9415 }
46fc3d4c 9416
fc36a67e 9417 /* SIZE */
46fc3d4c 9418
fc36a67e 9419 switch (*q) {
c623ac67
GS
9420#ifdef WIN32
9421 case 'I': /* Ix, I32x, and I64x */
9422# ifdef WIN64
9423 if (q[1] == '6' && q[2] == '4') {
9424 q += 3;
9425 intsize = 'q';
9426 break;
9427 }
9428# endif
9429 if (q[1] == '3' && q[2] == '2') {
9430 q += 3;
9431 break;
9432 }
9433# ifdef WIN64
9434 intsize = 'q';
9435# endif
9436 q++;
9437 break;
9438#endif
9e5b023a 9439#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 9440 case 'L': /* Ld */
e5c81feb 9441 /* FALL THROUGH */
e5c81feb 9442#ifdef HAS_QUAD
6f9bb7fd 9443 case 'q': /* qd */
9e5b023a 9444#endif
6f9bb7fd
GS
9445 intsize = 'q';
9446 q++;
9447 break;
9448#endif
fc36a67e 9449 case 'l':
9e5b023a 9450#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 9451 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 9452 intsize = 'q';
9453 q += 2;
46fc3d4c 9454 break;
cf2093f6 9455 }
fc36a67e 9456#endif
6f9bb7fd 9457 /* FALL THROUGH */
fc36a67e 9458 case 'h':
cf2093f6 9459 /* FALL THROUGH */
fc36a67e 9460 case 'V':
9461 intsize = *q++;
46fc3d4c 9462 break;
9463 }
9464
fc36a67e 9465 /* CONVERSION */
9466
211dfcf1
HS
9467 if (*q == '%') {
9468 eptr = q++;
9469 elen = 1;
9470 goto string;
9471 }
9472
be75b157
HS
9473 if (vectorize)
9474 argsv = vecsv;
9475 else if (!args)
211dfcf1
HS
9476 argsv = (efix ? efix <= svmax : svix < svmax) ?
9477 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
9478
46fc3d4c 9479 switch (c = *q++) {
9480
9481 /* STRINGS */
9482
46fc3d4c 9483 case 'c':
be75b157 9484 uv = (args && !vectorize) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
9485 if ((uv > 255 ||
9486 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 9487 && !IN_BYTES) {
dfe13c55 9488 eptr = (char*)utf8buf;
9041c2e3 9489 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 9490 is_utf8 = TRUE;
7e2040f0
GS
9491 }
9492 else {
9493 c = (char)uv;
9494 eptr = &c;
9495 elen = 1;
a0ed51b3 9496 }
46fc3d4c 9497 goto string;
9498
46fc3d4c 9499 case 's':
be75b157 9500 if (args && !vectorize) {
fc36a67e 9501 eptr = va_arg(*args, char*);
c635e13b 9502 if (eptr)
1d7c1841
GS
9503#ifdef MACOS_TRADITIONAL
9504 /* On MacOS, %#s format is used for Pascal strings */
9505 if (alt)
9506 elen = *eptr++;
9507 else
9508#endif
c635e13b 9509 elen = strlen(eptr);
9510 else {
9511 eptr = nullstr;
9512 elen = sizeof nullstr - 1;
9513 }
46fc3d4c 9514 }
211dfcf1 9515 else {
7e2040f0
GS
9516 eptr = SvPVx(argsv, elen);
9517 if (DO_UTF8(argsv)) {
a0ed51b3
LW
9518 if (has_precis && precis < elen) {
9519 I32 p = precis;
7e2040f0 9520 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
9521 precis = p;
9522 }
9523 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 9524 width += elen - sv_len_utf8(argsv);
a0ed51b3 9525 }
2cf2cfc6 9526 is_utf8 = TRUE;
a0ed51b3
LW
9527 }
9528 }
46fc3d4c 9529 goto string;
9530
fc36a67e 9531 case '_':
9532 /*
9533 * The "%_" hack might have to be changed someday,
9534 * if ISO or ANSI decide to use '_' for something.
9535 * So we keep it hidden from users' code.
9536 */
be75b157 9537 if (!args || vectorize)
fc36a67e 9538 goto unknown;
211dfcf1 9539 argsv = va_arg(*args, SV*);
7e2040f0
GS
9540 eptr = SvPVx(argsv, elen);
9541 if (DO_UTF8(argsv))
2cf2cfc6 9542 is_utf8 = TRUE;
fc36a67e 9543
46fc3d4c 9544 string:
b22c7a20 9545 vectorize = FALSE;
46fc3d4c 9546 if (has_precis && elen > precis)
9547 elen = precis;
9548 break;
9549
9550 /* INTEGERS */
9551
fc36a67e 9552 case 'p':
be75b157 9553 if (alt || vectorize)
c2e66d9e 9554 goto unknown;
211dfcf1 9555 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 9556 base = 16;
9557 goto integer;
9558
46fc3d4c 9559 case 'D':
29fe7a80 9560#ifdef IV_IS_QUAD
22f3ae8c 9561 intsize = 'q';
29fe7a80 9562#else
46fc3d4c 9563 intsize = 'l';
29fe7a80 9564#endif
46fc3d4c 9565 /* FALL THROUGH */
9566 case 'd':
9567 case 'i':
b22c7a20 9568 if (vectorize) {
ba210ebe 9569 STRLEN ulen;
211dfcf1
HS
9570 if (!veclen)
9571 continue;
2cf2cfc6
A
9572 if (vec_utf8)
9573 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9574 UTF8_ALLOW_ANYUV);
b22c7a20 9575 else {
e83d50c9 9576 uv = *vecstr;
b22c7a20
GS
9577 ulen = 1;
9578 }
9579 vecstr += ulen;
9580 veclen -= ulen;
e83d50c9
JP
9581 if (plus)
9582 esignbuf[esignlen++] = plus;
b22c7a20
GS
9583 }
9584 else if (args) {
46fc3d4c 9585 switch (intsize) {
9586 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 9587 case 'l': iv = va_arg(*args, long); break;
fc36a67e 9588 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 9589 default: iv = va_arg(*args, int); break;
cf2093f6
JH
9590#ifdef HAS_QUAD
9591 case 'q': iv = va_arg(*args, Quad_t); break;
9592#endif
46fc3d4c 9593 }
9594 }
9595 else {
b10c0dba 9596 IV tiv = SvIVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 9597 switch (intsize) {
b10c0dba
MHM
9598 case 'h': iv = (short)tiv; break;
9599 case 'l': iv = (long)tiv; break;
9600 case 'V':
9601 default: iv = tiv; break;
cf2093f6 9602#ifdef HAS_QUAD
b10c0dba 9603 case 'q': iv = (Quad_t)tiv; break;
cf2093f6 9604#endif
46fc3d4c 9605 }
9606 }
e83d50c9
JP
9607 if ( !vectorize ) /* we already set uv above */
9608 {
9609 if (iv >= 0) {
9610 uv = iv;
9611 if (plus)
9612 esignbuf[esignlen++] = plus;
9613 }
9614 else {
9615 uv = -iv;
9616 esignbuf[esignlen++] = '-';
9617 }
46fc3d4c 9618 }
9619 base = 10;
9620 goto integer;
9621
fc36a67e 9622 case 'U':
29fe7a80 9623#ifdef IV_IS_QUAD
22f3ae8c 9624 intsize = 'q';
29fe7a80 9625#else
fc36a67e 9626 intsize = 'l';
29fe7a80 9627#endif
fc36a67e 9628 /* FALL THROUGH */
9629 case 'u':
9630 base = 10;
9631 goto uns_integer;
9632
4f19785b
WSI
9633 case 'b':
9634 base = 2;
9635 goto uns_integer;
9636
46fc3d4c 9637 case 'O':
29fe7a80 9638#ifdef IV_IS_QUAD
22f3ae8c 9639 intsize = 'q';
29fe7a80 9640#else
46fc3d4c 9641 intsize = 'l';
29fe7a80 9642#endif
46fc3d4c 9643 /* FALL THROUGH */
9644 case 'o':
9645 base = 8;
9646 goto uns_integer;
9647
9648 case 'X':
46fc3d4c 9649 case 'x':
9650 base = 16;
46fc3d4c 9651
9652 uns_integer:
b22c7a20 9653 if (vectorize) {
ba210ebe 9654 STRLEN ulen;
b22c7a20 9655 vector:
211dfcf1
HS
9656 if (!veclen)
9657 continue;
2cf2cfc6
A
9658 if (vec_utf8)
9659 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9660 UTF8_ALLOW_ANYUV);
b22c7a20 9661 else {
a05b299f 9662 uv = *vecstr;
b22c7a20
GS
9663 ulen = 1;
9664 }
9665 vecstr += ulen;
9666 veclen -= ulen;
9667 }
9668 else if (args) {
46fc3d4c 9669 switch (intsize) {
9670 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 9671 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 9672 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 9673 default: uv = va_arg(*args, unsigned); break;
cf2093f6 9674#ifdef HAS_QUAD
9e3321a5 9675 case 'q': uv = va_arg(*args, Uquad_t); break;
cf2093f6 9676#endif
46fc3d4c 9677 }
9678 }
9679 else {
b10c0dba 9680 UV tuv = SvUVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 9681 switch (intsize) {
b10c0dba
MHM
9682 case 'h': uv = (unsigned short)tuv; break;
9683 case 'l': uv = (unsigned long)tuv; break;
9684 case 'V':
9685 default: uv = tuv; break;
cf2093f6 9686#ifdef HAS_QUAD
b10c0dba 9687 case 'q': uv = (Uquad_t)tuv; break;
cf2093f6 9688#endif
46fc3d4c 9689 }
9690 }
9691
9692 integer:
46fc3d4c 9693 eptr = ebuf + sizeof ebuf;
fc36a67e 9694 switch (base) {
9695 unsigned dig;
9696 case 16:
c10ed8b9
HS
9697 if (!uv)
9698 alt = FALSE;
1d7c1841
GS
9699 p = (char*)((c == 'X')
9700 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 9701 do {
9702 dig = uv & 15;
9703 *--eptr = p[dig];
9704 } while (uv >>= 4);
9705 if (alt) {
46fc3d4c 9706 esignbuf[esignlen++] = '0';
fc36a67e 9707 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 9708 }
fc36a67e 9709 break;
9710 case 8:
9711 do {
9712 dig = uv & 7;
9713 *--eptr = '0' + dig;
9714 } while (uv >>= 3);
9715 if (alt && *eptr != '0')
9716 *--eptr = '0';
9717 break;
4f19785b
WSI
9718 case 2:
9719 do {
9720 dig = uv & 1;
9721 *--eptr = '0' + dig;
9722 } while (uv >>= 1);
eda88b6d
JH
9723 if (alt) {
9724 esignbuf[esignlen++] = '0';
7481bb52 9725 esignbuf[esignlen++] = 'b';
eda88b6d 9726 }
4f19785b 9727 break;
fc36a67e 9728 default: /* it had better be ten or less */
6bc102ca 9729#if defined(PERL_Y2KWARN)
e476b1b5 9730 if (ckWARN(WARN_Y2K)) {
6bc102ca
GS
9731 STRLEN n;
9732 char *s = SvPV(sv,n);
9733 if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
9734 && (n == 2 || !isDIGIT(s[n-3])))
9735 {
9014280d 9736 Perl_warner(aTHX_ packWARN(WARN_Y2K),
6bc102ca
GS
9737 "Possible Y2K bug: %%%c %s",
9738 c, "format string following '19'");
9739 }
9740 }
9741#endif
fc36a67e 9742 do {
9743 dig = uv % base;
9744 *--eptr = '0' + dig;
9745 } while (uv /= base);
9746 break;
46fc3d4c 9747 }
9748 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
9749 if (has_precis) {
9750 if (precis > elen)
9751 zeros = precis - elen;
9752 else if (precis == 0 && elen == 1 && *eptr == '0')
9753 elen = 0;
9754 }
46fc3d4c 9755 break;
9756
9757 /* FLOATING POINT */
9758
fc36a67e 9759 case 'F':
9760 c = 'f'; /* maybe %F isn't supported here */
9761 /* FALL THROUGH */
46fc3d4c 9762 case 'e': case 'E':
fc36a67e 9763 case 'f':
46fc3d4c 9764 case 'g': case 'G':
9765
9766 /* This is evil, but floating point is even more evil */
9767
9e5b023a
JH
9768 /* for SV-style calling, we can only get NV
9769 for C-style calling, we assume %f is double;
9770 for simplicity we allow any of %Lf, %llf, %qf for long double
9771 */
9772 switch (intsize) {
9773 case 'V':
9774#if defined(USE_LONG_DOUBLE)
9775 intsize = 'q';
9776#endif
9777 break;
8a2e3f14 9778/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364
HS
9779 case 'l':
9780 /* FALL THROUGH */
9e5b023a
JH
9781 default:
9782#if defined(USE_LONG_DOUBLE)
9783 intsize = args ? 0 : 'q';
9784#endif
9785 break;
9786 case 'q':
9787#if defined(HAS_LONG_DOUBLE)
9788 break;
9789#else
9790 /* FALL THROUGH */
9791#endif
9792 case 'h':
9e5b023a
JH
9793 goto unknown;
9794 }
9795
9796 /* now we need (long double) if intsize == 'q', else (double) */
be75b157 9797 nv = (args && !vectorize) ?
35fff930
JH
9798#if LONG_DOUBLESIZE > DOUBLESIZE
9799 intsize == 'q' ?
205f51d8
AS
9800 va_arg(*args, long double) :
9801 va_arg(*args, double)
35fff930 9802#else
205f51d8 9803 va_arg(*args, double)
35fff930 9804#endif
9e5b023a 9805 : SvNVx(argsv);
fc36a67e 9806
9807 need = 0;
be75b157 9808 vectorize = FALSE;
fc36a67e 9809 if (c != 'e' && c != 'E') {
9810 i = PERL_INT_MIN;
9e5b023a
JH
9811 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9812 will cast our (long double) to (double) */
73b309ea 9813 (void)Perl_frexp(nv, &i);
fc36a67e 9814 if (i == PERL_INT_MIN)
cea2e8a9 9815 Perl_die(aTHX_ "panic: frexp");
c635e13b 9816 if (i > 0)
fc36a67e 9817 need = BIT_DIGITS(i);
9818 }
9819 need += has_precis ? precis : 6; /* known default */
20f6aaab 9820
fc36a67e 9821 if (need < width)
9822 need = width;
9823
20f6aaab
AS
9824#ifdef HAS_LDBL_SPRINTF_BUG
9825 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9826 with sfio - Allen <allens@cpan.org> */
9827
9828# ifdef DBL_MAX
9829# define MY_DBL_MAX DBL_MAX
9830# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9831# if DOUBLESIZE >= 8
9832# define MY_DBL_MAX 1.7976931348623157E+308L
9833# else
9834# define MY_DBL_MAX 3.40282347E+38L
9835# endif
9836# endif
9837
9838# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9839# define MY_DBL_MAX_BUG 1L
20f6aaab 9840# else
205f51d8 9841# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9842# endif
20f6aaab 9843
205f51d8
AS
9844# ifdef DBL_MIN
9845# define MY_DBL_MIN DBL_MIN
9846# else /* XXX guessing! -Allen */
9847# if DOUBLESIZE >= 8
9848# define MY_DBL_MIN 2.2250738585072014E-308L
9849# else
9850# define MY_DBL_MIN 1.17549435E-38L
9851# endif
9852# endif
20f6aaab 9853
205f51d8
AS
9854 if ((intsize == 'q') && (c == 'f') &&
9855 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9856 (need < DBL_DIG)) {
9857 /* it's going to be short enough that
9858 * long double precision is not needed */
9859
9860 if ((nv <= 0L) && (nv >= -0L))
9861 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9862 else {
9863 /* would use Perl_fp_class as a double-check but not
9864 * functional on IRIX - see perl.h comments */
9865
9866 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9867 /* It's within the range that a double can represent */
9868#if defined(DBL_MAX) && !defined(DBL_MIN)
9869 if ((nv >= ((long double)1/DBL_MAX)) ||
9870 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9871#endif
205f51d8 9872 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9873 }
205f51d8
AS
9874 }
9875 if (fix_ldbl_sprintf_bug == TRUE) {
9876 double temp;
9877
9878 intsize = 0;
9879 temp = (double)nv;
9880 nv = (NV)temp;
9881 }
20f6aaab 9882 }
205f51d8
AS
9883
9884# undef MY_DBL_MAX
9885# undef MY_DBL_MAX_BUG
9886# undef MY_DBL_MIN
9887
20f6aaab
AS
9888#endif /* HAS_LDBL_SPRINTF_BUG */
9889
46fc3d4c 9890 need += 20; /* fudge factor */
80252599
GS
9891 if (PL_efloatsize < need) {
9892 Safefree(PL_efloatbuf);
9893 PL_efloatsize = need + 20; /* more fudge */
9894 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9895 PL_efloatbuf[0] = '\0';
46fc3d4c 9896 }
9897
4151a5fe
IZ
9898 if ( !(width || left || plus || alt) && fill != '0'
9899 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
9900 /* See earlier comment about buggy Gconvert when digits,
9901 aka precis is 0 */
9902 if ( c == 'g' && precis) {
2e59c212 9903 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4151a5fe
IZ
9904 if (*PL_efloatbuf) /* May return an empty string for digits==0 */
9905 goto float_converted;
9906 } else if ( c == 'f' && !precis) {
9907 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9908 break;
9909 }
9910 }
46fc3d4c 9911 eptr = ebuf + sizeof ebuf;
9912 *--eptr = '\0';
9913 *--eptr = c;
9e5b023a
JH
9914 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9915#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
9916 if (intsize == 'q') {
e5c81feb
JH
9917 /* Copy the one or more characters in a long double
9918 * format before the 'base' ([efgEFG]) character to
9919 * the format string. */
9920 static char const prifldbl[] = PERL_PRIfldbl;
9921 char const *p = prifldbl + sizeof(prifldbl) - 3;
9922 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 9923 }
65202027 9924#endif
46fc3d4c 9925 if (has_precis) {
9926 base = precis;
9927 do { *--eptr = '0' + (base % 10); } while (base /= 10);
9928 *--eptr = '.';
9929 }
9930 if (width) {
9931 base = width;
9932 do { *--eptr = '0' + (base % 10); } while (base /= 10);
9933 }
9934 if (fill == '0')
9935 *--eptr = fill;
84902520
TB
9936 if (left)
9937 *--eptr = '-';
46fc3d4c 9938 if (plus)
9939 *--eptr = plus;
9940 if (alt)
9941 *--eptr = '#';
9942 *--eptr = '%';
9943
ff9121f8
JH
9944 /* No taint. Otherwise we are in the strange situation
9945 * where printf() taints but print($float) doesn't.
bda0f7a5 9946 * --jhi */
9e5b023a
JH
9947#if defined(HAS_LONG_DOUBLE)
9948 if (intsize == 'q')
9949 (void)sprintf(PL_efloatbuf, eptr, nv);
9950 else
9951 (void)sprintf(PL_efloatbuf, eptr, (double)nv);
9952#else
dd8482fc 9953 (void)sprintf(PL_efloatbuf, eptr, nv);
9e5b023a 9954#endif
4151a5fe 9955 float_converted:
80252599
GS
9956 eptr = PL_efloatbuf;
9957 elen = strlen(PL_efloatbuf);
46fc3d4c 9958 break;
9959
fc36a67e 9960 /* SPECIAL */
9961
9962 case 'n':
9963 i = SvCUR(sv) - origlen;
be75b157 9964 if (args && !vectorize) {
c635e13b 9965 switch (intsize) {
9966 case 'h': *(va_arg(*args, short*)) = i; break;
9967 default: *(va_arg(*args, int*)) = i; break;
9968 case 'l': *(va_arg(*args, long*)) = i; break;
9969 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
9970#ifdef HAS_QUAD
9971 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
9972#endif
c635e13b 9973 }
fc36a67e 9974 }
9dd79c3f 9975 else
211dfcf1 9976 sv_setuv_mg(argsv, (UV)i);
be75b157 9977 vectorize = FALSE;
fc36a67e 9978 continue; /* not "break" */
9979
9980 /* UNKNOWN */
9981
46fc3d4c 9982 default:
fc36a67e 9983 unknown:
599cee73 9984 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 9985 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 9986 SV *msg = sv_newmortal();
35c1215d
NC
9987 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9988 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 9989 if (c) {
0f4b6630 9990 if (isPRINT(c))
1c846c1f 9991 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
9992 "\"%%%c\"", c & 0xFF);
9993 else
9994 Perl_sv_catpvf(aTHX_ msg,
57def98f 9995 "\"%%\\%03"UVof"\"",
0f4b6630 9996 (UV)c & 0xFF);
0f4b6630 9997 } else
c635e13b 9998 sv_catpv(msg, "end of string");
9014280d 9999 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 10000 }
fb73857a 10001
10002 /* output mangled stuff ... */
10003 if (c == '\0')
10004 --q;
46fc3d4c 10005 eptr = p;
10006 elen = q - p;
fb73857a 10007
10008 /* ... right here, because formatting flags should not apply */
10009 SvGROW(sv, SvCUR(sv) + elen + 1);
10010 p = SvEND(sv);
4459522c 10011 Copy(eptr, p, elen, char);
fb73857a 10012 p += elen;
10013 *p = '\0';
10014 SvCUR(sv) = p - SvPVX(sv);
58e33a90 10015 svix = osvix;
fb73857a 10016 continue; /* not "break" */
46fc3d4c 10017 }
10018
6c94ec8b
HS
10019 /* calculate width before utf8_upgrade changes it */
10020 have = esignlen + zeros + elen;
10021
d2876be5
JH
10022 if (is_utf8 != has_utf8) {
10023 if (is_utf8) {
10024 if (SvCUR(sv))
10025 sv_utf8_upgrade(sv);
10026 }
10027 else {
10028 SV *nsv = sv_2mortal(newSVpvn(eptr, elen));
10029 sv_utf8_upgrade(nsv);
10030 eptr = SvPVX(nsv);
10031 elen = SvCUR(nsv);
10032 }
10033 SvGROW(sv, SvCUR(sv) + elen + 1);
10034 p = SvEND(sv);
10035 *p = '\0';
10036 }
94330da2
MHM
10037 /* Use memchr() instead of strchr(), as eptr is not guaranteed */
10038 /* to point to a null-terminated string. */
10039 if (left && ckWARN(WARN_PRINTF) && memchr(eptr, '\n', elen) &&
dca6e23f
RB
10040 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF))
10041 Perl_warner(aTHX_ packWARN(WARN_PRINTF),
10042 "Newline in left-justified string for %sprintf",
10043 (PL_op->op_type == OP_PRTF) ? "" : "s");
d2876be5 10044
46fc3d4c 10045 need = (have > width ? have : width);
10046 gap = need - have;
10047
b22c7a20 10048 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 10049 p = SvEND(sv);
10050 if (esignlen && fill == '0') {
eb160463 10051 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10052 *p++ = esignbuf[i];
10053 }
10054 if (gap && !left) {
10055 memset(p, fill, gap);
10056 p += gap;
10057 }
10058 if (esignlen && fill != '0') {
eb160463 10059 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10060 *p++ = esignbuf[i];
10061 }
fc36a67e 10062 if (zeros) {
10063 for (i = zeros; i; i--)
10064 *p++ = '0';
10065 }
46fc3d4c 10066 if (elen) {
4459522c 10067 Copy(eptr, p, elen, char);
46fc3d4c 10068 p += elen;
10069 }
10070 if (gap && left) {
10071 memset(p, ' ', gap);
10072 p += gap;
10073 }
b22c7a20
GS
10074 if (vectorize) {
10075 if (veclen) {
4459522c 10076 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
10077 p += dotstrlen;
10078 }
10079 else
10080 vectorize = FALSE; /* done iterating over vecstr */
10081 }
2cf2cfc6
A
10082 if (is_utf8)
10083 has_utf8 = TRUE;
10084 if (has_utf8)
7e2040f0 10085 SvUTF8_on(sv);
46fc3d4c 10086 *p = '\0';
10087 SvCUR(sv) = p - SvPVX(sv);
b22c7a20
GS
10088 if (vectorize) {
10089 esignlen = 0;
10090 goto vector;
10091 }
46fc3d4c 10092 }
10093}
51371543 10094
645c22ef
DM
10095/* =========================================================================
10096
10097=head1 Cloning an interpreter
10098
10099All the macros and functions in this section are for the private use of
10100the main function, perl_clone().
10101
10102The foo_dup() functions make an exact copy of an existing foo thinngy.
10103During the course of a cloning, a hash table is used to map old addresses
10104to new addresses. The table is created and manipulated with the
10105ptr_table_* functions.
10106
10107=cut
10108
10109============================================================================*/
10110
10111
1d7c1841
GS
10112#if defined(USE_ITHREADS)
10113
1d7c1841
GS
10114#ifndef GpREFCNT_inc
10115# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
10116#endif
10117
10118
d2d73c3e
AB
10119#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
10120#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
10121#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10122#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
10123#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10124#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
10125#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10126#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
10127#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
10128#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
10129#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
10130#define SAVEPV(p) (p ? savepv(p) : Nullch)
10131#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 10132
d2d73c3e 10133
d2f185dc
AMS
10134/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
10135 regcomp.c. AMS 20010712 */
645c22ef 10136
1d7c1841 10137REGEXP *
a8fc9800 10138Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
1d7c1841 10139{
d2f185dc
AMS
10140 REGEXP *ret;
10141 int i, len, npar;
10142 struct reg_substr_datum *s;
10143
10144 if (!r)
10145 return (REGEXP *)NULL;
10146
10147 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
10148 return ret;
10149
10150 len = r->offsets[0];
10151 npar = r->nparens+1;
10152
10153 Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
10154 Copy(r->program, ret->program, len+1, regnode);
10155
10156 New(0, ret->startp, npar, I32);
10157 Copy(r->startp, ret->startp, npar, I32);
10158 New(0, ret->endp, npar, I32);
10159 Copy(r->startp, ret->startp, npar, I32);
10160
d2f185dc
AMS
10161 New(0, ret->substrs, 1, struct reg_substr_data);
10162 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
10163 s->min_offset = r->substrs->data[i].min_offset;
10164 s->max_offset = r->substrs->data[i].max_offset;
10165 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 10166 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
10167 }
10168
70612e96 10169 ret->regstclass = NULL;
d2f185dc
AMS
10170 if (r->data) {
10171 struct reg_data *d;
10172 int count = r->data->count;
10173
10174 Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
10175 char, struct reg_data);
10176 New(0, d->what, count, U8);
10177
10178 d->count = count;
10179 for (i = 0; i < count; i++) {
10180 d->what[i] = r->data->what[i];
10181 switch (d->what[i]) {
10182 case 's':
10183 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
10184 break;
10185 case 'p':
10186 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
10187 break;
10188 case 'f':
10189 /* This is cheating. */
10190 New(0, d->data[i], 1, struct regnode_charclass_class);
10191 StructCopy(r->data->data[i], d->data[i],
10192 struct regnode_charclass_class);
70612e96 10193 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
10194 break;
10195 case 'o':
33773810
AMS
10196 /* Compiled op trees are readonly, and can thus be
10197 shared without duplication. */
9b978d73
DM
10198 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
10199 break;
d2f185dc
AMS
10200 case 'n':
10201 d->data[i] = r->data->data[i];
10202 break;
10203 }
10204 }
10205
10206 ret->data = d;
10207 }
10208 else
10209 ret->data = NULL;
10210
10211 New(0, ret->offsets, 2*len+1, U32);
10212 Copy(r->offsets, ret->offsets, 2*len+1, U32);
10213
e01c5899 10214 ret->precomp = SAVEPVN(r->precomp, r->prelen);
d2f185dc
AMS
10215 ret->refcnt = r->refcnt;
10216 ret->minlen = r->minlen;
10217 ret->prelen = r->prelen;
10218 ret->nparens = r->nparens;
10219 ret->lastparen = r->lastparen;
10220 ret->lastcloseparen = r->lastcloseparen;
10221 ret->reganch = r->reganch;
10222
70612e96
RG
10223 ret->sublen = r->sublen;
10224
10225 if (RX_MATCH_COPIED(ret))
e01c5899 10226 ret->subbeg = SAVEPVN(r->subbeg, r->sublen);
70612e96
RG
10227 else
10228 ret->subbeg = Nullch;
9a26048b
NC
10229#ifdef PERL_COPY_ON_WRITE
10230 ret->saved_copy = Nullsv;
10231#endif
70612e96 10232
d2f185dc
AMS
10233 ptr_table_store(PL_ptr_table, r, ret);
10234 return ret;
1d7c1841
GS
10235}
10236
d2d73c3e 10237/* duplicate a file handle */
645c22ef 10238
1d7c1841 10239PerlIO *
a8fc9800 10240Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
10241{
10242 PerlIO *ret;
10243 if (!fp)
10244 return (PerlIO*)NULL;
10245
10246 /* look for it in the table first */
10247 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
10248 if (ret)
10249 return ret;
10250
10251 /* create anew and remember what it is */
ecdeb87c 10252 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
10253 ptr_table_store(PL_ptr_table, fp, ret);
10254 return ret;
10255}
10256
645c22ef
DM
10257/* duplicate a directory handle */
10258
1d7c1841
GS
10259DIR *
10260Perl_dirp_dup(pTHX_ DIR *dp)
10261{
10262 if (!dp)
10263 return (DIR*)NULL;
10264 /* XXX TODO */
10265 return dp;
10266}
10267
ff276b08 10268/* duplicate a typeglob */
645c22ef 10269
1d7c1841 10270GP *
a8fc9800 10271Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
10272{
10273 GP *ret;
10274 if (!gp)
10275 return (GP*)NULL;
10276 /* look for it in the table first */
10277 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
10278 if (ret)
10279 return ret;
10280
10281 /* create anew and remember what it is */
10282 Newz(0, ret, 1, GP);
10283 ptr_table_store(PL_ptr_table, gp, ret);
10284
10285 /* clone */
10286 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
10287 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
10288 ret->gp_io = io_dup_inc(gp->gp_io, param);
10289 ret->gp_form = cv_dup_inc(gp->gp_form, param);
10290 ret->gp_av = av_dup_inc(gp->gp_av, param);
10291 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
10292 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
10293 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
10294 ret->gp_cvgen = gp->gp_cvgen;
10295 ret->gp_flags = gp->gp_flags;
10296 ret->gp_line = gp->gp_line;
10297 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
10298 return ret;
10299}
10300
645c22ef
DM
10301/* duplicate a chain of magic */
10302
1d7c1841 10303MAGIC *
a8fc9800 10304Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 10305{
cb359b41
JH
10306 MAGIC *mgprev = (MAGIC*)NULL;
10307 MAGIC *mgret;
1d7c1841
GS
10308 if (!mg)
10309 return (MAGIC*)NULL;
10310 /* look for it in the table first */
10311 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
10312 if (mgret)
10313 return mgret;
10314
10315 for (; mg; mg = mg->mg_moremagic) {
10316 MAGIC *nmg;
10317 Newz(0, nmg, 1, MAGIC);
cb359b41 10318 if (mgprev)
1d7c1841 10319 mgprev->mg_moremagic = nmg;
cb359b41
JH
10320 else
10321 mgret = nmg;
1d7c1841
GS
10322 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
10323 nmg->mg_private = mg->mg_private;
10324 nmg->mg_type = mg->mg_type;
10325 nmg->mg_flags = mg->mg_flags;
14befaf4 10326 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 10327 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 10328 }
05bd4103 10329 else if(mg->mg_type == PERL_MAGIC_backref) {
fdc9a813
AE
10330 AV *av = (AV*) mg->mg_obj;
10331 SV **svp;
10332 I32 i;
10333 SvREFCNT_inc(nmg->mg_obj = (SV*)newAV());
10334 svp = AvARRAY(av);
10335 for (i = AvFILLp(av); i >= 0; i--) {
3a81978b 10336 if (!svp[i]) continue;
fdc9a813
AE
10337 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
10338 }
05bd4103 10339 }
1d7c1841
GS
10340 else {
10341 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
10342 ? sv_dup_inc(mg->mg_obj, param)
10343 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
10344 }
10345 nmg->mg_len = mg->mg_len;
10346 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 10347 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 10348 if (mg->mg_len > 0) {
1d7c1841 10349 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
10350 if (mg->mg_type == PERL_MAGIC_overload_table &&
10351 AMT_AMAGIC((AMT*)mg->mg_ptr))
10352 {
1d7c1841
GS
10353 AMT *amtp = (AMT*)mg->mg_ptr;
10354 AMT *namtp = (AMT*)nmg->mg_ptr;
10355 I32 i;
10356 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 10357 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
10358 }
10359 }
10360 }
10361 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 10362 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 10363 }
68795e93
NIS
10364 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
10365 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
10366 }
1d7c1841
GS
10367 mgprev = nmg;
10368 }
10369 return mgret;
10370}
10371
645c22ef
DM
10372/* create a new pointer-mapping table */
10373
1d7c1841
GS
10374PTR_TBL_t *
10375Perl_ptr_table_new(pTHX)
10376{
10377 PTR_TBL_t *tbl;
10378 Newz(0, tbl, 1, PTR_TBL_t);
10379 tbl->tbl_max = 511;
10380 tbl->tbl_items = 0;
10381 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
10382 return tbl;
10383}
10384
134ca3d6
DM
10385#if (PTRSIZE == 8)
10386# define PTR_TABLE_HASH(ptr) (PTR2UV(ptr) >> 3)
10387#else
10388# define PTR_TABLE_HASH(ptr) (PTR2UV(ptr) >> 2)
10389#endif
10390
645c22ef
DM
10391/* map an existing pointer using a table */
10392
1d7c1841
GS
10393void *
10394Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
10395{
10396 PTR_TBL_ENT_t *tblent;
134ca3d6 10397 UV hash = PTR_TABLE_HASH(sv);
1d7c1841
GS
10398 assert(tbl);
10399 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
10400 for (; tblent; tblent = tblent->next) {
10401 if (tblent->oldval == sv)
10402 return tblent->newval;
10403 }
10404 return (void*)NULL;
10405}
10406
645c22ef
DM
10407/* add a new entry to a pointer-mapping table */
10408
1d7c1841
GS
10409void
10410Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
10411{
10412 PTR_TBL_ENT_t *tblent, **otblent;
10413 /* XXX this may be pessimal on platforms where pointers aren't good
10414 * hash values e.g. if they grow faster in the most significant
10415 * bits */
134ca3d6 10416 UV hash = PTR_TABLE_HASH(oldv);
14cade97 10417 bool empty = 1;
1d7c1841
GS
10418
10419 assert(tbl);
10420 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
14cade97 10421 for (tblent = *otblent; tblent; empty=0, tblent = tblent->next) {
1d7c1841
GS
10422 if (tblent->oldval == oldv) {
10423 tblent->newval = newv;
1d7c1841
GS
10424 return;
10425 }
10426 }
10427 Newz(0, tblent, 1, PTR_TBL_ENT_t);
10428 tblent->oldval = oldv;
10429 tblent->newval = newv;
10430 tblent->next = *otblent;
10431 *otblent = tblent;
10432 tbl->tbl_items++;
14cade97 10433 if (!empty && tbl->tbl_items > tbl->tbl_max)
1d7c1841
GS
10434 ptr_table_split(tbl);
10435}
10436
645c22ef
DM
10437/* double the hash bucket size of an existing ptr table */
10438
1d7c1841
GS
10439void
10440Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
10441{
10442 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
10443 UV oldsize = tbl->tbl_max + 1;
10444 UV newsize = oldsize * 2;
10445 UV i;
10446
10447 Renew(ary, newsize, PTR_TBL_ENT_t*);
10448 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
10449 tbl->tbl_max = --newsize;
10450 tbl->tbl_ary = ary;
10451 for (i=0; i < oldsize; i++, ary++) {
10452 PTR_TBL_ENT_t **curentp, **entp, *ent;
10453 if (!*ary)
10454 continue;
10455 curentp = ary + oldsize;
10456 for (entp = ary, ent = *ary; ent; ent = *entp) {
134ca3d6 10457 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
10458 *entp = ent->next;
10459 ent->next = *curentp;
10460 *curentp = ent;
10461 continue;
10462 }
10463 else
10464 entp = &ent->next;
10465 }
10466 }
10467}
10468
645c22ef
DM
10469/* remove all the entries from a ptr table */
10470
a0739874
DM
10471void
10472Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
10473{
10474 register PTR_TBL_ENT_t **array;
10475 register PTR_TBL_ENT_t *entry;
10476 register PTR_TBL_ENT_t *oentry = Null(PTR_TBL_ENT_t*);
10477 UV riter = 0;
10478 UV max;
10479
10480 if (!tbl || !tbl->tbl_items) {
10481 return;
10482 }
10483
10484 array = tbl->tbl_ary;
10485 entry = array[0];
10486 max = tbl->tbl_max;
10487
10488 for (;;) {
10489 if (entry) {
10490 oentry = entry;
10491 entry = entry->next;
10492 Safefree(oentry);
10493 }
10494 if (!entry) {
10495 if (++riter > max) {
10496 break;
10497 }
10498 entry = array[riter];
10499 }
10500 }
10501
10502 tbl->tbl_items = 0;
10503}
10504
645c22ef
DM
10505/* clear and free a ptr table */
10506
a0739874
DM
10507void
10508Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
10509{
10510 if (!tbl) {
10511 return;
10512 }
10513 ptr_table_clear(tbl);
10514 Safefree(tbl->tbl_ary);
10515 Safefree(tbl);
10516}
10517
1d7c1841
GS
10518#ifdef DEBUGGING
10519char *PL_watch_pvx;
10520#endif
10521
645c22ef
DM
10522/* attempt to make everything in the typeglob readonly */
10523
5bd07a3d 10524STATIC SV *
59b40662 10525S_gv_share(pTHX_ SV *sstr, CLONE_PARAMS *param)
5bd07a3d
DM
10526{
10527 GV *gv = (GV*)sstr;
59b40662 10528 SV *sv = &param->proto_perl->Isv_no; /* just need SvREADONLY-ness */
5bd07a3d
DM
10529
10530 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 10531 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
10532 }
10533 else if (!GvCV(gv)) {
10534 GvCV(gv) = (CV*)sv;
10535 }
10536 else {
10537 /* CvPADLISTs cannot be shared */
37e20706 10538 if (!SvREADONLY(GvCV(gv)) && !CvXSUB(GvCV(gv))) {
7fb37951 10539 GvUNIQUE_off(gv);
5bd07a3d
DM
10540 }
10541 }
10542
7fb37951 10543 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
10544#if 0
10545 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
10546 HvNAME(GvSTASH(gv)), GvNAME(gv));
10547#endif
10548 return Nullsv;
10549 }
10550
4411f3b6 10551 /*
5bd07a3d
DM
10552 * write attempts will die with
10553 * "Modification of a read-only value attempted"
10554 */
10555 if (!GvSV(gv)) {
10556 GvSV(gv) = sv;
10557 }
10558 else {
10559 SvREADONLY_on(GvSV(gv));
10560 }
10561
10562 if (!GvAV(gv)) {
10563 GvAV(gv) = (AV*)sv;
10564 }
10565 else {
10566 SvREADONLY_on(GvAV(gv));
10567 }
10568
10569 if (!GvHV(gv)) {
10570 GvHV(gv) = (HV*)sv;
10571 }
10572 else {
53c33732 10573 SvREADONLY_on(GvHV(gv));
5bd07a3d
DM
10574 }
10575
10576 return sstr; /* he_dup() will SvREFCNT_inc() */
10577}
10578
645c22ef
DM
10579/* duplicate an SV of any type (including AV, HV etc) */
10580
83841fad
NIS
10581void
10582Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
10583{
10584 if (SvROK(sstr)) {
d3d0e6f1 10585 SvRV(dstr) = SvWEAKREF(sstr)
83841fad
NIS
10586 ? sv_dup(SvRV(sstr), param)
10587 : sv_dup_inc(SvRV(sstr), param);
10588 }
10589 else if (SvPVX(sstr)) {
10590 /* Has something there */
10591 if (SvLEN(sstr)) {
68795e93 10592 /* Normal PV - clone whole allocated space */
83841fad 10593 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
d3d0e6f1
NC
10594 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10595 /* Not that normal - actually sstr is copy on write.
10596 But we are a true, independant SV, so: */
10597 SvREADONLY_off(dstr);
10598 SvFAKE_off(dstr);
10599 }
68795e93 10600 }
83841fad
NIS
10601 else {
10602 /* Special case - not normally malloced for some reason */
10603 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10604 /* A "shared" PV - clone it as unshared string */
281b2760 10605 if(SvPADTMP(sstr)) {
5e6160dc
AB
10606 /* However, some of them live in the pad
10607 and they should not have these flags
10608 turned off */
281b2760
AB
10609
10610 SvPVX(dstr) = sharepvn(SvPVX(sstr), SvCUR(sstr),
10611 SvUVX(sstr));
10612 SvUVX(dstr) = SvUVX(sstr);
10613 } else {
10614
10615 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvCUR(sstr));
10616 SvFAKE_off(dstr);
10617 SvREADONLY_off(dstr);
5e6160dc 10618 }
83841fad
NIS
10619 }
10620 else {
10621 /* Some other special case - random pointer */
10622 SvPVX(dstr) = SvPVX(sstr);
d3d0e6f1 10623 }
83841fad
NIS
10624 }
10625 }
10626 else {
10627 /* Copy the Null */
10628 SvPVX(dstr) = SvPVX(sstr);
10629 }
10630}
10631
1d7c1841 10632SV *
a8fc9800 10633Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
1d7c1841 10634{
1d7c1841
GS
10635 SV *dstr;
10636
10637 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
10638 return Nullsv;
10639 /* look for it in the table first */
10640 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
10641 if (dstr)
10642 return dstr;
10643
0405e91e
AB
10644 if(param->flags & CLONEf_JOIN_IN) {
10645 /** We are joining here so we don't want do clone
10646 something that is bad **/
10647
10648 if(SvTYPE(sstr) == SVt_PVHV &&
10649 HvNAME(sstr)) {
10650 /** don't clone stashes if they already exist **/
10651 HV* old_stash = gv_stashpv(HvNAME(sstr),0);
10652 return (SV*) old_stash;
10653 }
10654 }
10655
1d7c1841
GS
10656 /* create anew and remember what it is */
10657 new_SV(dstr);
10658 ptr_table_store(PL_ptr_table, sstr, dstr);
10659
10660 /* clone */
10661 SvFLAGS(dstr) = SvFLAGS(sstr);
10662 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
10663 SvREFCNT(dstr) = 0; /* must be before any other dups! */
10664
10665#ifdef DEBUGGING
10666 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
10667 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
10668 PL_watch_pvx, SvPVX(sstr));
10669#endif
10670
10671 switch (SvTYPE(sstr)) {
10672 case SVt_NULL:
10673 SvANY(dstr) = NULL;
10674 break;
10675 case SVt_IV:
10676 SvANY(dstr) = new_XIV();
10677 SvIVX(dstr) = SvIVX(sstr);
10678 break;
10679 case SVt_NV:
10680 SvANY(dstr) = new_XNV();
10681 SvNVX(dstr) = SvNVX(sstr);
10682 break;
10683 case SVt_RV:
10684 SvANY(dstr) = new_XRV();
83841fad 10685 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10686 break;
10687 case SVt_PV:
10688 SvANY(dstr) = new_XPV();
10689 SvCUR(dstr) = SvCUR(sstr);
10690 SvLEN(dstr) = SvLEN(sstr);
83841fad 10691 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10692 break;
10693 case SVt_PVIV:
10694 SvANY(dstr) = new_XPVIV();
10695 SvCUR(dstr) = SvCUR(sstr);
10696 SvLEN(dstr) = SvLEN(sstr);
10697 SvIVX(dstr) = SvIVX(sstr);
83841fad 10698 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10699 break;
10700 case SVt_PVNV:
10701 SvANY(dstr) = new_XPVNV();
10702 SvCUR(dstr) = SvCUR(sstr);
10703 SvLEN(dstr) = SvLEN(sstr);
10704 SvIVX(dstr) = SvIVX(sstr);
10705 SvNVX(dstr) = SvNVX(sstr);
83841fad 10706 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10707 break;
10708 case SVt_PVMG:
10709 SvANY(dstr) = new_XPVMG();
10710 SvCUR(dstr) = SvCUR(sstr);
10711 SvLEN(dstr) = SvLEN(sstr);
10712 SvIVX(dstr) = SvIVX(sstr);
10713 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10714 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10715 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10716 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10717 break;
10718 case SVt_PVBM:
10719 SvANY(dstr) = new_XPVBM();
10720 SvCUR(dstr) = SvCUR(sstr);
10721 SvLEN(dstr) = SvLEN(sstr);
10722 SvIVX(dstr) = SvIVX(sstr);
10723 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10724 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10725 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10726 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10727 BmRARE(dstr) = BmRARE(sstr);
10728 BmUSEFUL(dstr) = BmUSEFUL(sstr);
10729 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
10730 break;
10731 case SVt_PVLV:
10732 SvANY(dstr) = new_XPVLV();
10733 SvCUR(dstr) = SvCUR(sstr);
10734 SvLEN(dstr) = SvLEN(sstr);
10735 SvIVX(dstr) = SvIVX(sstr);
10736 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10737 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10738 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10739 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10740 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
10741 LvTARGLEN(dstr) = LvTARGLEN(sstr);
dd28f7bb
DM
10742 if (LvTYPE(sstr) == 't') /* for tie: unrefcnted fake (SV**) */
10743 LvTARG(dstr) = dstr;
10744 else if (LvTYPE(sstr) == 'T') /* for tie: fake HE */
10745 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(sstr), 0, param);
10746 else
10747 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr), param);
1d7c1841
GS
10748 LvTYPE(dstr) = LvTYPE(sstr);
10749 break;
10750 case SVt_PVGV:
7fb37951 10751 if (GvUNIQUE((GV*)sstr)) {
5bd07a3d 10752 SV *share;
59b40662 10753 if ((share = gv_share(sstr, param))) {
5bd07a3d
DM
10754 del_SV(dstr);
10755 dstr = share;
37e20706 10756 ptr_table_store(PL_ptr_table, sstr, dstr);
5bd07a3d
DM
10757#if 0
10758 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
10759 HvNAME(GvSTASH(share)), GvNAME(share));
10760#endif
10761 break;
10762 }
10763 }
1d7c1841
GS
10764 SvANY(dstr) = new_XPVGV();
10765 SvCUR(dstr) = SvCUR(sstr);
10766 SvLEN(dstr) = SvLEN(sstr);
10767 SvIVX(dstr) = SvIVX(sstr);
10768 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10769 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10770 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10771 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10772 GvNAMELEN(dstr) = GvNAMELEN(sstr);
10773 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
d2d73c3e 10774 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr), param);
1d7c1841 10775 GvFLAGS(dstr) = GvFLAGS(sstr);
d2d73c3e 10776 GvGP(dstr) = gp_dup(GvGP(sstr), param);
1d7c1841
GS
10777 (void)GpREFCNT_inc(GvGP(dstr));
10778 break;
10779 case SVt_PVIO:
10780 SvANY(dstr) = new_XPVIO();
10781 SvCUR(dstr) = SvCUR(sstr);
10782 SvLEN(dstr) = SvLEN(sstr);
10783 SvIVX(dstr) = SvIVX(sstr);
10784 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10785 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10786 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10787 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
a8fc9800 10788 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10789 if (IoOFP(sstr) == IoIFP(sstr))
10790 IoOFP(dstr) = IoIFP(dstr);
10791 else
a8fc9800 10792 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10793 /* PL_rsfp_filters entries have fake IoDIRP() */
10794 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
10795 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
10796 else
10797 IoDIRP(dstr) = IoDIRP(sstr);
10798 IoLINES(dstr) = IoLINES(sstr);
10799 IoPAGE(dstr) = IoPAGE(sstr);
10800 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
10801 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
5a37521b
AB
10802 if(IoFLAGS(sstr) & IOf_FAKE_DIRP) {
10803 /* I have no idea why fake dirp (rsfps)
10804 should be treaded differently but otherwise
10805 we end up with leaks -- sky*/
10806 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(sstr), param);
10807 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(sstr), param);
10808 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(sstr), param);
10809 } else {
10810 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr), param);
10811 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr), param);
10812 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr), param);
10813 }
1d7c1841 10814 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
1d7c1841 10815 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
1d7c1841 10816 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
1d7c1841
GS
10817 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
10818 IoTYPE(dstr) = IoTYPE(sstr);
10819 IoFLAGS(dstr) = IoFLAGS(sstr);
10820 break;
10821 case SVt_PVAV:
10822 SvANY(dstr) = new_XPVAV();
10823 SvCUR(dstr) = SvCUR(sstr);
10824 SvLEN(dstr) = SvLEN(sstr);
10825 SvIVX(dstr) = SvIVX(sstr);
10826 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10827 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10828 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
10829 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
1d7c1841
GS
10830 AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
10831 if (AvARRAY((AV*)sstr)) {
10832 SV **dst_ary, **src_ary;
10833 SSize_t items = AvFILLp((AV*)sstr) + 1;
10834
10835 src_ary = AvARRAY((AV*)sstr);
10836 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
10837 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
10838 SvPVX(dstr) = (char*)dst_ary;
10839 AvALLOC((AV*)dstr) = dst_ary;
10840 if (AvREAL((AV*)sstr)) {
10841 while (items-- > 0)
d2d73c3e 10842 *dst_ary++ = sv_dup_inc(*src_ary++, param);
1d7c1841
GS
10843 }
10844 else {
10845 while (items-- > 0)
d2d73c3e 10846 *dst_ary++ = sv_dup(*src_ary++, param);
1d7c1841
GS
10847 }
10848 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10849 while (items-- > 0) {
10850 *dst_ary++ = &PL_sv_undef;
10851 }
10852 }
10853 else {
10854 SvPVX(dstr) = Nullch;
10855 AvALLOC((AV*)dstr) = (SV**)NULL;
10856 }
10857 break;
10858 case SVt_PVHV:
10859 SvANY(dstr) = new_XPVHV();
10860 SvCUR(dstr) = SvCUR(sstr);
10861 SvLEN(dstr) = SvLEN(sstr);
10862 SvIVX(dstr) = SvIVX(sstr);
10863 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10864 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10865 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841
GS
10866 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
10867 if (HvARRAY((HV*)sstr)) {
1d7c1841
GS
10868 STRLEN i = 0;
10869 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
10870 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
10871 Newz(0, dxhv->xhv_array,
10872 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
10873 while (i <= sxhv->xhv_max) {
10874 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
eb160463
GS
10875 (bool)!!HvSHAREKEYS(sstr),
10876 param);
1d7c1841
GS
10877 ++i;
10878 }
eb160463
GS
10879 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter,
10880 (bool)!!HvSHAREKEYS(sstr), param);
1d7c1841
GS
10881 }
10882 else {
10883 SvPVX(dstr) = Nullch;
10884 HvEITER((HV*)dstr) = (HE*)NULL;
10885 }
10886 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
10887 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
c43294b8 10888 /* Record stashes for possible cloning in Perl_clone(). */
6676db26 10889 if(HvNAME((HV*)dstr))
d2d73c3e 10890 av_push(param->stashes, dstr);
1d7c1841
GS
10891 break;
10892 case SVt_PVFM:
10893 SvANY(dstr) = new_XPVFM();
10894 FmLINES(dstr) = FmLINES(sstr);
10895 goto dup_pvcv;
10896 /* NOTREACHED */
10897 case SVt_PVCV:
10898 SvANY(dstr) = new_XPVCV();
d2d73c3e 10899 dup_pvcv:
1d7c1841
GS
10900 SvCUR(dstr) = SvCUR(sstr);
10901 SvLEN(dstr) = SvLEN(sstr);
10902 SvIVX(dstr) = SvIVX(sstr);
10903 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10904 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10905 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10906 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
d2d73c3e 10907 CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
1d7c1841
GS
10908 CvSTART(dstr) = CvSTART(sstr);
10909 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
10910 CvXSUB(dstr) = CvXSUB(sstr);
10911 CvXSUBANY(dstr) = CvXSUBANY(sstr);
01485f8b
DM
10912 if (CvCONST(sstr)) {
10913 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
10914 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
10915 sv_dup_inc(CvXSUBANY(sstr).any_ptr, param);
10916 }
b23f1a86
DM
10917 /* don't dup if copying back - CvGV isn't refcounted, so the
10918 * duped GV may never be freed. A bit of a hack! DAPM */
10919 CvGV(dstr) = (param->flags & CLONEf_JOIN_IN) ?
10920 Nullgv : gv_dup(CvGV(sstr), param) ;
d2d73c3e
AB
10921 if (param->flags & CLONEf_COPY_STACKS) {
10922 CvDEPTH(dstr) = CvDEPTH(sstr);
10923 } else {
10924 CvDEPTH(dstr) = 0;
10925 }
dd2155a4 10926 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
7dafbf52
DM
10927 CvOUTSIDE_SEQ(dstr) = CvOUTSIDE_SEQ(sstr);
10928 CvOUTSIDE(dstr) =
10929 CvWEAKOUTSIDE(sstr)
10930 ? cv_dup( CvOUTSIDE(sstr), param)
10931 : cv_dup_inc(CvOUTSIDE(sstr), param);
1d7c1841 10932 CvFLAGS(dstr) = CvFLAGS(sstr);
54356c7d 10933 CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
1d7c1841
GS
10934 break;
10935 default:
c803eecc 10936 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
1d7c1841
GS
10937 break;
10938 }
10939
10940 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
10941 ++PL_sv_objcount;
10942
10943 return dstr;
d2d73c3e 10944 }
1d7c1841 10945
645c22ef
DM
10946/* duplicate a context */
10947
1d7c1841 10948PERL_CONTEXT *
a8fc9800 10949Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
10950{
10951 PERL_CONTEXT *ncxs;
10952
10953 if (!cxs)
10954 return (PERL_CONTEXT*)NULL;
10955
10956 /* look for it in the table first */
10957 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
10958 if (ncxs)
10959 return ncxs;
10960
10961 /* create anew and remember what it is */
10962 Newz(56, ncxs, max + 1, PERL_CONTEXT);
10963 ptr_table_store(PL_ptr_table, cxs, ncxs);
10964
10965 while (ix >= 0) {
10966 PERL_CONTEXT *cx = &cxs[ix];
10967 PERL_CONTEXT *ncx = &ncxs[ix];
10968 ncx->cx_type = cx->cx_type;
10969 if (CxTYPE(cx) == CXt_SUBST) {
10970 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
10971 }
10972 else {
10973 ncx->blk_oldsp = cx->blk_oldsp;
10974 ncx->blk_oldcop = cx->blk_oldcop;
10975 ncx->blk_oldretsp = cx->blk_oldretsp;
10976 ncx->blk_oldmarksp = cx->blk_oldmarksp;
10977 ncx->blk_oldscopesp = cx->blk_oldscopesp;
10978 ncx->blk_oldpm = cx->blk_oldpm;
10979 ncx->blk_gimme = cx->blk_gimme;
10980 switch (CxTYPE(cx)) {
10981 case CXt_SUB:
10982 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
10983 ? cv_dup_inc(cx->blk_sub.cv, param)
10984 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 10985 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 10986 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 10987 : Nullav);
d2d73c3e 10988 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
10989 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
10990 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10991 ncx->blk_sub.lval = cx->blk_sub.lval;
10992 break;
10993 case CXt_EVAL:
10994 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
10995 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 10996 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 10997 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 10998 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
1d7c1841
GS
10999 break;
11000 case CXt_LOOP:
11001 ncx->blk_loop.label = cx->blk_loop.label;
11002 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
11003 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
11004 ncx->blk_loop.next_op = cx->blk_loop.next_op;
11005 ncx->blk_loop.last_op = cx->blk_loop.last_op;
11006 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
11007 ? cx->blk_loop.iterdata
d2d73c3e 11008 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
11009 ncx->blk_loop.oldcomppad
11010 = (PAD*)ptr_table_fetch(PL_ptr_table,
11011 cx->blk_loop.oldcomppad);
d2d73c3e
AB
11012 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
11013 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
11014 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
11015 ncx->blk_loop.iterix = cx->blk_loop.iterix;
11016 ncx->blk_loop.itermax = cx->blk_loop.itermax;
11017 break;
11018 case CXt_FORMAT:
d2d73c3e
AB
11019 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
11020 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
11021 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841
GS
11022 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
11023 break;
11024 case CXt_BLOCK:
11025 case CXt_NULL:
11026 break;
11027 }
11028 }
11029 --ix;
11030 }
11031 return ncxs;
11032}
11033
645c22ef
DM
11034/* duplicate a stack info structure */
11035
1d7c1841 11036PERL_SI *
a8fc9800 11037Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
11038{
11039 PERL_SI *nsi;
11040
11041 if (!si)
11042 return (PERL_SI*)NULL;
11043
11044 /* look for it in the table first */
11045 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
11046 if (nsi)
11047 return nsi;
11048
11049 /* create anew and remember what it is */
11050 Newz(56, nsi, 1, PERL_SI);
11051 ptr_table_store(PL_ptr_table, si, nsi);
11052
d2d73c3e 11053 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
11054 nsi->si_cxix = si->si_cxix;
11055 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 11056 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 11057 nsi->si_type = si->si_type;
d2d73c3e
AB
11058 nsi->si_prev = si_dup(si->si_prev, param);
11059 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
11060 nsi->si_markoff = si->si_markoff;
11061
11062 return nsi;
11063}
11064
11065#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
11066#define TOPINT(ss,ix) ((ss)[ix].any_i32)
11067#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
11068#define TOPLONG(ss,ix) ((ss)[ix].any_long)
11069#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
11070#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
11071#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
11072#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
11073#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
11074#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
11075#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
11076#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
11077#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
11078#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
11079
11080/* XXXXX todo */
11081#define pv_dup_inc(p) SAVEPV(p)
11082#define pv_dup(p) SAVEPV(p)
11083#define svp_dup_inc(p,pp) any_dup(p,pp)
11084
645c22ef
DM
11085/* map any object to the new equivent - either something in the
11086 * ptr table, or something in the interpreter structure
11087 */
11088
1d7c1841
GS
11089void *
11090Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
11091{
11092 void *ret;
11093
11094 if (!v)
11095 return (void*)NULL;
11096
11097 /* look for it in the table first */
11098 ret = ptr_table_fetch(PL_ptr_table, v);
11099 if (ret)
11100 return ret;
11101
11102 /* see if it is part of the interpreter structure */
11103 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 11104 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 11105 else {
1d7c1841 11106 ret = v;
05ec9bb3 11107 }
1d7c1841
GS
11108
11109 return ret;
11110}
11111
645c22ef
DM
11112/* duplicate the save stack */
11113
1d7c1841 11114ANY *
a8fc9800 11115Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841
GS
11116{
11117 ANY *ss = proto_perl->Tsavestack;
11118 I32 ix = proto_perl->Tsavestack_ix;
11119 I32 max = proto_perl->Tsavestack_max;
11120 ANY *nss;
11121 SV *sv;
11122 GV *gv;
11123 AV *av;
11124 HV *hv;
11125 void* ptr;
11126 int intval;
11127 long longval;
11128 GP *gp;
11129 IV iv;
11130 I32 i;
c4e33207 11131 char *c = NULL;
1d7c1841 11132 void (*dptr) (void*);
acfe0abc 11133 void (*dxptr) (pTHX_ void*);
e977893f 11134 OP *o;
1d7c1841
GS
11135
11136 Newz(54, nss, max, ANY);
11137
11138 while (ix > 0) {
11139 i = POPINT(ss,ix);
11140 TOPINT(nss,ix) = i;
11141 switch (i) {
11142 case SAVEt_ITEM: /* normal string */
11143 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11144 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11145 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11146 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11147 break;
11148 case SAVEt_SV: /* scalar reference */
11149 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11150 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11151 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11152 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 11153 break;
f4dd75d9
GS
11154 case SAVEt_GENERIC_PVREF: /* generic char* */
11155 c = (char*)POPPTR(ss,ix);
11156 TOPPTR(nss,ix) = pv_dup(c);
11157 ptr = POPPTR(ss,ix);
11158 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11159 break;
05ec9bb3
NIS
11160 case SAVEt_SHARED_PVREF: /* char* in shared space */
11161 c = (char*)POPPTR(ss,ix);
11162 TOPPTR(nss,ix) = savesharedpv(c);
11163 ptr = POPPTR(ss,ix);
11164 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11165 break;
1d7c1841
GS
11166 case SAVEt_GENERIC_SVREF: /* generic sv */
11167 case SAVEt_SVREF: /* scalar reference */
11168 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11169 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11170 ptr = POPPTR(ss,ix);
11171 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
11172 break;
11173 case SAVEt_AV: /* array reference */
11174 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11175 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 11176 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11177 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11178 break;
11179 case SAVEt_HV: /* hash reference */
11180 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11181 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 11182 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11183 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11184 break;
11185 case SAVEt_INT: /* int reference */
11186 ptr = POPPTR(ss,ix);
11187 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11188 intval = (int)POPINT(ss,ix);
11189 TOPINT(nss,ix) = intval;
11190 break;
11191 case SAVEt_LONG: /* long reference */
11192 ptr = POPPTR(ss,ix);
11193 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11194 longval = (long)POPLONG(ss,ix);
11195 TOPLONG(nss,ix) = longval;
11196 break;
11197 case SAVEt_I32: /* I32 reference */
11198 case SAVEt_I16: /* I16 reference */
11199 case SAVEt_I8: /* I8 reference */
11200 ptr = POPPTR(ss,ix);
11201 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11202 i = POPINT(ss,ix);
11203 TOPINT(nss,ix) = i;
11204 break;
11205 case SAVEt_IV: /* IV reference */
11206 ptr = POPPTR(ss,ix);
11207 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11208 iv = POPIV(ss,ix);
11209 TOPIV(nss,ix) = iv;
11210 break;
11211 case SAVEt_SPTR: /* SV* reference */
11212 ptr = POPPTR(ss,ix);
11213 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11214 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11215 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
11216 break;
11217 case SAVEt_VPTR: /* random* reference */
11218 ptr = POPPTR(ss,ix);
11219 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11220 ptr = POPPTR(ss,ix);
11221 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11222 break;
11223 case SAVEt_PPTR: /* char* reference */
11224 ptr = POPPTR(ss,ix);
11225 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11226 c = (char*)POPPTR(ss,ix);
11227 TOPPTR(nss,ix) = pv_dup(c);
11228 break;
11229 case SAVEt_HPTR: /* HV* reference */
11230 ptr = POPPTR(ss,ix);
11231 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11232 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11233 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
11234 break;
11235 case SAVEt_APTR: /* AV* reference */
11236 ptr = POPPTR(ss,ix);
11237 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11238 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11239 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
11240 break;
11241 case SAVEt_NSTAB:
11242 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 11243 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
11244 break;
11245 case SAVEt_GP: /* scalar reference */
11246 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 11247 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
11248 (void)GpREFCNT_inc(gp);
11249 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 11250 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
11251 c = (char*)POPPTR(ss,ix);
11252 TOPPTR(nss,ix) = pv_dup(c);
11253 iv = POPIV(ss,ix);
11254 TOPIV(nss,ix) = iv;
11255 iv = POPIV(ss,ix);
11256 TOPIV(nss,ix) = iv;
11257 break;
11258 case SAVEt_FREESV:
26d9b02f 11259 case SAVEt_MORTALIZESV:
1d7c1841 11260 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11261 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11262 break;
11263 case SAVEt_FREEOP:
11264 ptr = POPPTR(ss,ix);
11265 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
11266 /* these are assumed to be refcounted properly */
11267 switch (((OP*)ptr)->op_type) {
11268 case OP_LEAVESUB:
11269 case OP_LEAVESUBLV:
11270 case OP_LEAVEEVAL:
11271 case OP_LEAVE:
11272 case OP_SCOPE:
11273 case OP_LEAVEWRITE:
e977893f
GS
11274 TOPPTR(nss,ix) = ptr;
11275 o = (OP*)ptr;
11276 OpREFCNT_inc(o);
1d7c1841
GS
11277 break;
11278 default:
11279 TOPPTR(nss,ix) = Nullop;
11280 break;
11281 }
11282 }
11283 else
11284 TOPPTR(nss,ix) = Nullop;
11285 break;
11286 case SAVEt_FREEPV:
11287 c = (char*)POPPTR(ss,ix);
11288 TOPPTR(nss,ix) = pv_dup_inc(c);
11289 break;
11290 case SAVEt_CLEARSV:
11291 longval = POPLONG(ss,ix);
11292 TOPLONG(nss,ix) = longval;
11293 break;
11294 case SAVEt_DELETE:
11295 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11296 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
11297 c = (char*)POPPTR(ss,ix);
11298 TOPPTR(nss,ix) = pv_dup_inc(c);
11299 i = POPINT(ss,ix);
11300 TOPINT(nss,ix) = i;
11301 break;
11302 case SAVEt_DESTRUCTOR:
11303 ptr = POPPTR(ss,ix);
11304 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11305 dptr = POPDPTR(ss,ix);
ef75a179 11306 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
11307 break;
11308 case SAVEt_DESTRUCTOR_X:
11309 ptr = POPPTR(ss,ix);
11310 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11311 dxptr = POPDXPTR(ss,ix);
acfe0abc 11312 TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
11313 break;
11314 case SAVEt_REGCONTEXT:
11315 case SAVEt_ALLOC:
11316 i = POPINT(ss,ix);
11317 TOPINT(nss,ix) = i;
11318 ix -= i;
11319 break;
11320 case SAVEt_STACK_POS: /* Position on Perl stack */
11321 i = POPINT(ss,ix);
11322 TOPINT(nss,ix) = i;
11323 break;
11324 case SAVEt_AELEM: /* array element */
11325 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11326 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11327 i = POPINT(ss,ix);
11328 TOPINT(nss,ix) = i;
11329 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11330 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
11331 break;
11332 case SAVEt_HELEM: /* hash element */
11333 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11334 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11335 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11336 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11337 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11338 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
11339 break;
11340 case SAVEt_OP:
11341 ptr = POPPTR(ss,ix);
11342 TOPPTR(nss,ix) = ptr;
11343 break;
11344 case SAVEt_HINTS:
11345 i = POPINT(ss,ix);
11346 TOPINT(nss,ix) = i;
11347 break;
c4410b1b
GS
11348 case SAVEt_COMPPAD:
11349 av = (AV*)POPPTR(ss,ix);
58ed4fbe 11350 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 11351 break;
c3564e5c
GS
11352 case SAVEt_PADSV:
11353 longval = (long)POPLONG(ss,ix);
11354 TOPLONG(nss,ix) = longval;
11355 ptr = POPPTR(ss,ix);
11356 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11357 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11358 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 11359 break;
a1bb4754 11360 case SAVEt_BOOL:
38d8b13e 11361 ptr = POPPTR(ss,ix);
b9609c01 11362 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 11363 longval = (long)POPBOOL(ss,ix);
b9609c01 11364 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 11365 break;
8bd2680e
MHM
11366 case SAVEt_SET_SVFLAGS:
11367 i = POPINT(ss,ix);
11368 TOPINT(nss,ix) = i;
11369 i = POPINT(ss,ix);
11370 TOPINT(nss,ix) = i;
11371 sv = (SV*)POPPTR(ss,ix);
11372 TOPPTR(nss,ix) = sv_dup(sv, param);
11373 break;
1d7c1841
GS
11374 default:
11375 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
11376 }
11377 }
11378
11379 return nss;
11380}
11381
645c22ef
DM
11382/*
11383=for apidoc perl_clone
11384
11385Create and return a new interpreter by cloning the current one.
11386
4be49ee6 11387perl_clone takes these flags as parameters:
6a78b4db
AB
11388
11389CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
11390without it we only clone the data and zero the stacks,
11391with it we copy the stacks and the new perl interpreter is
11392ready to run at the exact same point as the previous one.
11393The pseudo-fork code uses COPY_STACKS while the
11394threads->new doesn't.
11395
11396CLONEf_KEEP_PTR_TABLE
11397perl_clone keeps a ptr_table with the pointer of the old
11398variable as a key and the new variable as a value,
11399this allows it to check if something has been cloned and not
11400clone it again but rather just use the value and increase the
11401refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
11402the ptr_table using the function
11403C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
11404reason to keep it around is if you want to dup some of your own
11405variable who are outside the graph perl scans, example of this
11406code is in threads.xs create
11407
11408CLONEf_CLONE_HOST
11409This is a win32 thing, it is ignored on unix, it tells perls
11410win32host code (which is c++) to clone itself, this is needed on
11411win32 if you want to run two threads at the same time,
11412if you just want to do some stuff in a separate perl interpreter
11413and then throw it away and return to the original one,
11414you don't need to do anything.
11415
645c22ef
DM
11416=cut
11417*/
11418
11419/* XXX the above needs expanding by someone who actually understands it ! */
3fc56081
NK
11420EXTERN_C PerlInterpreter *
11421perl_clone_host(PerlInterpreter* proto_perl, UV flags);
645c22ef 11422
1d7c1841
GS
11423PerlInterpreter *
11424perl_clone(PerlInterpreter *proto_perl, UV flags)
11425{
1d7c1841 11426#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
11427
11428 /* perlhost.h so we need to call into it
11429 to clone the host, CPerlHost should have a c interface, sky */
11430
11431 if (flags & CLONEf_CLONE_HOST) {
11432 return perl_clone_host(proto_perl,flags);
11433 }
11434 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
11435 proto_perl->IMem,
11436 proto_perl->IMemShared,
11437 proto_perl->IMemParse,
11438 proto_perl->IEnv,
11439 proto_perl->IStdIO,
11440 proto_perl->ILIO,
11441 proto_perl->IDir,
11442 proto_perl->ISock,
11443 proto_perl->IProc);
11444}
11445
11446PerlInterpreter *
11447perl_clone_using(PerlInterpreter *proto_perl, UV flags,
11448 struct IPerlMem* ipM, struct IPerlMem* ipMS,
11449 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
11450 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
11451 struct IPerlDir* ipD, struct IPerlSock* ipS,
11452 struct IPerlProc* ipP)
11453{
11454 /* XXX many of the string copies here can be optimized if they're
11455 * constants; they need to be allocated as common memory and just
11456 * their pointers copied. */
11457
11458 IV i;
64aa0685
GS
11459 CLONE_PARAMS clone_params;
11460 CLONE_PARAMS* param = &clone_params;
d2d73c3e 11461
1d7c1841 11462 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
ba869deb 11463 PERL_SET_THX(my_perl);
1d7c1841 11464
acfe0abc 11465# ifdef DEBUGGING
a4530404 11466 Poison(my_perl, 1, PerlInterpreter);
1d7c1841
GS
11467 PL_markstack = 0;
11468 PL_scopestack = 0;
11469 PL_savestack = 0;
22f7c9c9
JH
11470 PL_savestack_ix = 0;
11471 PL_savestack_max = -1;
1d7c1841 11472 PL_retstack = 0;
66fe0623 11473 PL_sig_pending = 0;
25596c82 11474 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
acfe0abc 11475# else /* !DEBUGGING */
1d7c1841 11476 Zero(my_perl, 1, PerlInterpreter);
acfe0abc 11477# endif /* DEBUGGING */
1d7c1841
GS
11478
11479 /* host pointers */
11480 PL_Mem = ipM;
11481 PL_MemShared = ipMS;
11482 PL_MemParse = ipMP;
11483 PL_Env = ipE;
11484 PL_StdIO = ipStd;
11485 PL_LIO = ipLIO;
11486 PL_Dir = ipD;
11487 PL_Sock = ipS;
11488 PL_Proc = ipP;
1d7c1841
GS
11489#else /* !PERL_IMPLICIT_SYS */
11490 IV i;
64aa0685
GS
11491 CLONE_PARAMS clone_params;
11492 CLONE_PARAMS* param = &clone_params;
1d7c1841 11493 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 11494 PERL_SET_THX(my_perl);
1d7c1841 11495
d2d73c3e
AB
11496
11497
1d7c1841 11498# ifdef DEBUGGING
a4530404 11499 Poison(my_perl, 1, PerlInterpreter);
1d7c1841
GS
11500 PL_markstack = 0;
11501 PL_scopestack = 0;
11502 PL_savestack = 0;
22f7c9c9
JH
11503 PL_savestack_ix = 0;
11504 PL_savestack_max = -1;
1d7c1841 11505 PL_retstack = 0;
66fe0623 11506 PL_sig_pending = 0;
25596c82 11507 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
1d7c1841
GS
11508# else /* !DEBUGGING */
11509 Zero(my_perl, 1, PerlInterpreter);
11510# endif /* DEBUGGING */
11511#endif /* PERL_IMPLICIT_SYS */
83236556 11512 param->flags = flags;
59b40662 11513 param->proto_perl = proto_perl;
1d7c1841
GS
11514
11515 /* arena roots */
11516 PL_xiv_arenaroot = NULL;
11517 PL_xiv_root = NULL;
612f20c3 11518 PL_xnv_arenaroot = NULL;
1d7c1841 11519 PL_xnv_root = NULL;
612f20c3 11520 PL_xrv_arenaroot = NULL;
1d7c1841 11521 PL_xrv_root = NULL;
612f20c3 11522 PL_xpv_arenaroot = NULL;
1d7c1841 11523 PL_xpv_root = NULL;
612f20c3 11524 PL_xpviv_arenaroot = NULL;
1d7c1841 11525 PL_xpviv_root = NULL;
612f20c3 11526 PL_xpvnv_arenaroot = NULL;
1d7c1841 11527 PL_xpvnv_root = NULL;
612f20c3 11528 PL_xpvcv_arenaroot = NULL;
1d7c1841 11529 PL_xpvcv_root = NULL;
612f20c3 11530 PL_xpvav_arenaroot = NULL;
1d7c1841 11531 PL_xpvav_root = NULL;
612f20c3 11532 PL_xpvhv_arenaroot = NULL;
1d7c1841 11533 PL_xpvhv_root = NULL;
612f20c3 11534 PL_xpvmg_arenaroot = NULL;
1d7c1841 11535 PL_xpvmg_root = NULL;
612f20c3 11536 PL_xpvlv_arenaroot = NULL;
1d7c1841 11537 PL_xpvlv_root = NULL;
612f20c3 11538 PL_xpvbm_arenaroot = NULL;
1d7c1841 11539 PL_xpvbm_root = NULL;
612f20c3 11540 PL_he_arenaroot = NULL;
1d7c1841
GS
11541 PL_he_root = NULL;
11542 PL_nice_chunk = NULL;
11543 PL_nice_chunk_size = 0;
11544 PL_sv_count = 0;
11545 PL_sv_objcount = 0;
11546 PL_sv_root = Nullsv;
11547 PL_sv_arenaroot = Nullsv;
11548
11549 PL_debug = proto_perl->Idebug;
11550
e5dd39fc 11551#ifdef USE_REENTRANT_API
68853529
SB
11552 /* XXX: things like -Dm will segfault here in perlio, but doing
11553 * PERL_SET_CONTEXT(proto_perl);
11554 * breaks too many other things
11555 */
59bd0823 11556 Perl_reentrant_init(aTHX);
e5dd39fc
AB
11557#endif
11558
1d7c1841
GS
11559 /* create SV map for pointer relocation */
11560 PL_ptr_table = ptr_table_new();
11561
11562 /* initialize these special pointers as early as possible */
11563 SvANY(&PL_sv_undef) = NULL;
11564 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
11565 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
11566 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
11567
1d7c1841 11568 SvANY(&PL_sv_no) = new_XPVNV();
1d7c1841
GS
11569 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
11570 SvFLAGS(&PL_sv_no) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
11571 SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
11572 SvCUR(&PL_sv_no) = 0;
11573 SvLEN(&PL_sv_no) = 1;
11574 SvNVX(&PL_sv_no) = 0;
11575 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
11576
1d7c1841 11577 SvANY(&PL_sv_yes) = new_XPVNV();
1d7c1841
GS
11578 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
11579 SvFLAGS(&PL_sv_yes) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
11580 SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
11581 SvCUR(&PL_sv_yes) = 1;
11582 SvLEN(&PL_sv_yes) = 2;
11583 SvNVX(&PL_sv_yes) = 1;
11584 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
11585
05ec9bb3 11586 /* create (a non-shared!) shared string table */
1d7c1841
GS
11587 PL_strtab = newHV();
11588 HvSHAREKEYS_off(PL_strtab);
11589 hv_ksplit(PL_strtab, 512);
11590 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
11591
05ec9bb3
NIS
11592 PL_compiling = proto_perl->Icompiling;
11593
11594 /* These two PVs will be free'd special way so must set them same way op.c does */
11595 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
11596 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
11597
11598 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
11599 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
11600
1d7c1841
GS
11601 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
11602 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 11603 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 11604 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 11605 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
11606 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
11607
11608 /* pseudo environmental stuff */
11609 PL_origargc = proto_perl->Iorigargc;
e2975953 11610 PL_origargv = proto_perl->Iorigargv;
d2d73c3e 11611
d2d73c3e
AB
11612 param->stashes = newAV(); /* Setup array of objects to call clone on */
11613
a1ea730d 11614#ifdef PERLIO_LAYERS
3a1ee7e8
NIS
11615 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11616 PerlIO_clone(aTHX_ proto_perl, param);
a1ea730d 11617#endif
d2d73c3e
AB
11618
11619 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
11620 PL_incgv = gv_dup(proto_perl->Iincgv, param);
11621 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 11622 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
11623 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
11624 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
11625
11626 /* switches */
11627 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 11628 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
11629 PL_localpatches = proto_perl->Ilocalpatches;
11630 PL_splitstr = proto_perl->Isplitstr;
11631 PL_preprocess = proto_perl->Ipreprocess;
11632 PL_minus_n = proto_perl->Iminus_n;
11633 PL_minus_p = proto_perl->Iminus_p;
11634 PL_minus_l = proto_perl->Iminus_l;
11635 PL_minus_a = proto_perl->Iminus_a;
11636 PL_minus_F = proto_perl->Iminus_F;
11637 PL_doswitches = proto_perl->Idoswitches;
11638 PL_dowarn = proto_perl->Idowarn;
11639 PL_doextract = proto_perl->Idoextract;
11640 PL_sawampersand = proto_perl->Isawampersand;
11641 PL_unsafe = proto_perl->Iunsafe;
11642 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 11643 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
11644 PL_perldb = proto_perl->Iperldb;
11645 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
1cbb0781 11646 PL_exit_flags = proto_perl->Iexit_flags;
1d7c1841
GS
11647
11648 /* magical thingies */
11649 /* XXX time(&PL_basetime) when asked for? */
11650 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 11651 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
11652
11653 PL_maxsysfd = proto_perl->Imaxsysfd;
11654 PL_multiline = proto_perl->Imultiline;
11655 PL_statusvalue = proto_perl->Istatusvalue;
11656#ifdef VMS
11657 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
11658#endif
0a378802 11659 PL_encoding = sv_dup(proto_perl->Iencoding, param);
1d7c1841 11660
4a4c6fe3 11661 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
1f483ca1
JH
11662 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
11663 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
4a4c6fe3 11664
d2f185dc
AMS
11665 /* Clone the regex array */
11666 PL_regex_padav = newAV();
11667 {
11668 I32 len = av_len((AV*)proto_perl->Iregex_padav);
11669 SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
0f95fc41
AB
11670 av_push(PL_regex_padav,
11671 sv_dup_inc(regexen[0],param));
11672 for(i = 1; i <= len; i++) {
11673 if(SvREPADTMP(regexen[i])) {
11674 av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
8cf8f3d1 11675 } else {
0f95fc41
AB
11676 av_push(PL_regex_padav,
11677 SvREFCNT_inc(
8cf8f3d1 11678 newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
cbfa9890 11679 SvIVX(regexen[i])), param)))
0f95fc41
AB
11680 ));
11681 }
d2f185dc
AMS
11682 }
11683 }
11684 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 11685
1d7c1841 11686 /* shortcuts to various I/O objects */
d2d73c3e
AB
11687 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
11688 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
11689 PL_defgv = gv_dup(proto_perl->Idefgv, param);
11690 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
11691 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
11692 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
11693
11694 /* shortcuts to regexp stuff */
d2d73c3e 11695 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
11696
11697 /* shortcuts to misc objects */
d2d73c3e 11698 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
11699
11700 /* shortcuts to debugging objects */
d2d73c3e
AB
11701 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
11702 PL_DBline = gv_dup(proto_perl->IDBline, param);
11703 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
11704 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
11705 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
11706 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
06492da6 11707 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
d2d73c3e
AB
11708 PL_lineary = av_dup(proto_perl->Ilineary, param);
11709 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
11710
11711 /* symbol tables */
d2d73c3e
AB
11712 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
11713 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
d2d73c3e
AB
11714 PL_debstash = hv_dup(proto_perl->Idebstash, param);
11715 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
11716 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
11717
11718 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
ee1c5a4e 11719 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
ece599bd 11720 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
d2d73c3e
AB
11721 PL_endav = av_dup_inc(proto_perl->Iendav, param);
11722 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
11723 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
11724
11725 PL_sub_generation = proto_perl->Isub_generation;
11726
11727 /* funky return mechanisms */
11728 PL_forkprocess = proto_perl->Iforkprocess;
11729
11730 /* subprocess state */
d2d73c3e 11731 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
11732
11733 /* internal state */
11734 PL_tainting = proto_perl->Itainting;
7135f00b 11735 PL_taint_warn = proto_perl->Itaint_warn;
1d7c1841
GS
11736 PL_maxo = proto_perl->Imaxo;
11737 if (proto_perl->Iop_mask)
11738 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11739 else
11740 PL_op_mask = Nullch;
06492da6 11741 /* PL_asserting = proto_perl->Iasserting; */
1d7c1841
GS
11742
11743 /* current interpreter roots */
d2d73c3e 11744 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
11745 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
11746 PL_main_start = proto_perl->Imain_start;
e977893f 11747 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
11748 PL_eval_start = proto_perl->Ieval_start;
11749
11750 /* runtime control stuff */
11751 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
11752 PL_copline = proto_perl->Icopline;
11753
11754 PL_filemode = proto_perl->Ifilemode;
11755 PL_lastfd = proto_perl->Ilastfd;
11756 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
11757 PL_Argv = NULL;
11758 PL_Cmd = Nullch;
11759 PL_gensym = proto_perl->Igensym;
11760 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 11761 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
11762 PL_laststatval = proto_perl->Ilaststatval;
11763 PL_laststype = proto_perl->Ilaststype;
11764 PL_mess_sv = Nullsv;
11765
d2d73c3e 11766 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
11767 PL_ofmt = SAVEPV(proto_perl->Iofmt);
11768
11769 /* interpreter atexit processing */
11770 PL_exitlistlen = proto_perl->Iexitlistlen;
11771 if (PL_exitlistlen) {
11772 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11773 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11774 }
11775 else
11776 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 11777 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
19e8ce8e
AB
11778 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
11779 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1d7c1841
GS
11780
11781 PL_profiledata = NULL;
a8fc9800 11782 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
1d7c1841 11783 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 11784 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 11785
d2d73c3e 11786 PL_compcv = cv_dup(proto_perl->Icompcv, param);
dd2155a4
DM
11787
11788 PAD_CLONE_VARS(proto_perl, param);
1d7c1841
GS
11789
11790#ifdef HAVE_INTERP_INTERN
11791 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11792#endif
11793
11794 /* more statics moved here */
11795 PL_generation = proto_perl->Igeneration;
d2d73c3e 11796 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
11797
11798 PL_in_clean_objs = proto_perl->Iin_clean_objs;
11799 PL_in_clean_all = proto_perl->Iin_clean_all;
11800
11801 PL_uid = proto_perl->Iuid;
11802 PL_euid = proto_perl->Ieuid;
11803 PL_gid = proto_perl->Igid;
11804 PL_egid = proto_perl->Iegid;
11805 PL_nomemok = proto_perl->Inomemok;
11806 PL_an = proto_perl->Ian;
1d7c1841
GS
11807 PL_evalseq = proto_perl->Ievalseq;
11808 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
11809 PL_origalen = proto_perl->Iorigalen;
11810 PL_pidstatus = newHV(); /* XXX flag for cloning? */
11811 PL_osname = SAVEPV(proto_perl->Iosname);
5c728af0 11812 PL_sh_path_compat = proto_perl->Ish_path_compat; /* XXX never deallocated */
1d7c1841
GS
11813 PL_sighandlerp = proto_perl->Isighandlerp;
11814
11815
11816 PL_runops = proto_perl->Irunops;
11817
11818 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
11819
11820#ifdef CSH
11821 PL_cshlen = proto_perl->Icshlen;
74f1b2b8 11822 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
1d7c1841
GS
11823#endif
11824
11825 PL_lex_state = proto_perl->Ilex_state;
11826 PL_lex_defer = proto_perl->Ilex_defer;
11827 PL_lex_expect = proto_perl->Ilex_expect;
11828 PL_lex_formbrack = proto_perl->Ilex_formbrack;
11829 PL_lex_dojoin = proto_perl->Ilex_dojoin;
11830 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
11831 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
11832 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
11833 PL_lex_op = proto_perl->Ilex_op;
11834 PL_lex_inpat = proto_perl->Ilex_inpat;
11835 PL_lex_inwhat = proto_perl->Ilex_inwhat;
11836 PL_lex_brackets = proto_perl->Ilex_brackets;
11837 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
11838 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
11839 PL_lex_casemods = proto_perl->Ilex_casemods;
11840 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
11841 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
11842
11843 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
11844 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
11845 PL_nexttoke = proto_perl->Inexttoke;
11846
1d773130
TB
11847 /* XXX This is probably masking the deeper issue of why
11848 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
11849 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
11850 * (A little debugging with a watchpoint on it may help.)
11851 */
389edf32
TB
11852 if (SvANY(proto_perl->Ilinestr)) {
11853 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
11854 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
11855 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11856 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
11857 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11858 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
11859 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11860 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
11861 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11862 }
11863 else {
11864 PL_linestr = NEWSV(65,79);
11865 sv_upgrade(PL_linestr,SVt_PVIV);
11866 sv_setpvn(PL_linestr,"",0);
11867 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
11868 }
1d7c1841 11869 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1d7c1841
GS
11870 PL_pending_ident = proto_perl->Ipending_ident;
11871 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
11872
11873 PL_expect = proto_perl->Iexpect;
11874
11875 PL_multi_start = proto_perl->Imulti_start;
11876 PL_multi_end = proto_perl->Imulti_end;
11877 PL_multi_open = proto_perl->Imulti_open;
11878 PL_multi_close = proto_perl->Imulti_close;
11879
11880 PL_error_count = proto_perl->Ierror_count;
11881 PL_subline = proto_perl->Isubline;
d2d73c3e 11882 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841 11883
1d773130 11884 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
389edf32
TB
11885 if (SvANY(proto_perl->Ilinestr)) {
11886 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
11887 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11888 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
11889 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11890 PL_last_lop_op = proto_perl->Ilast_lop_op;
11891 }
11892 else {
11893 PL_last_uni = SvPVX(PL_linestr);
11894 PL_last_lop = SvPVX(PL_linestr);
11895 PL_last_lop_op = 0;
11896 }
1d7c1841 11897 PL_in_my = proto_perl->Iin_my;
d2d73c3e 11898 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
11899#ifdef FCRYPT
11900 PL_cryptseen = proto_perl->Icryptseen;
11901#endif
11902
11903 PL_hints = proto_perl->Ihints;
11904
11905 PL_amagic_generation = proto_perl->Iamagic_generation;
11906
11907#ifdef USE_LOCALE_COLLATE
11908 PL_collation_ix = proto_perl->Icollation_ix;
11909 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
11910 PL_collation_standard = proto_perl->Icollation_standard;
11911 PL_collxfrm_base = proto_perl->Icollxfrm_base;
11912 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
11913#endif /* USE_LOCALE_COLLATE */
11914
11915#ifdef USE_LOCALE_NUMERIC
11916 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
11917 PL_numeric_standard = proto_perl->Inumeric_standard;
11918 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 11919 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
11920#endif /* !USE_LOCALE_NUMERIC */
11921
11922 /* utf8 character classes */
d2d73c3e
AB
11923 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
11924 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
11925 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
11926 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
11927 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
11928 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
11929 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
11930 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
11931 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
11932 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
11933 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
11934 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
11935 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
11936 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
11937 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
11938 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
11939 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
b4e400f9 11940 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
82686b01
JH
11941 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
11942 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 11943
6c3182a5 11944 /* Did the locale setup indicate UTF-8? */
9769094f 11945 PL_utf8locale = proto_perl->Iutf8locale;
6c3182a5
JH
11946 /* Unicode features (see perlrun/-C) */
11947 PL_unicode = proto_perl->Iunicode;
11948
11949 /* Pre-5.8 signals control */
11950 PL_signals = proto_perl->Isignals;
11951
11952 /* times() ticks per second */
11953 PL_clocktick = proto_perl->Iclocktick;
11954
11955 /* Recursion stopper for PerlIO_find_layer */
11956 PL_in_load_module = proto_perl->Iin_load_module;
11957
11958 /* sort() routine */
11959 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
11960
57c6e6d2
JH
11961 /* Not really needed/useful since the reenrant_retint is "volatile",
11962 * but do it for consistency's sake. */
11963 PL_reentrant_retint = proto_perl->Ireentrant_retint;
11964
15a5279a
JH
11965 /* Hooks to shared SVs and locks. */
11966 PL_sharehook = proto_perl->Isharehook;
11967 PL_lockhook = proto_perl->Ilockhook;
11968 PL_unlockhook = proto_perl->Iunlockhook;
11969 PL_threadhook = proto_perl->Ithreadhook;
11970
bce260cd
JH
11971 PL_runops_std = proto_perl->Irunops_std;
11972 PL_runops_dbg = proto_perl->Irunops_dbg;
11973
11974#ifdef THREADS_HAVE_PIDS
11975 PL_ppid = proto_perl->Ippid;
11976#endif
11977
1d7c1841
GS
11978 /* swatch cache */
11979 PL_last_swash_hv = Nullhv; /* reinits on demand */
11980 PL_last_swash_klen = 0;
11981 PL_last_swash_key[0]= '\0';
11982 PL_last_swash_tmps = (U8*)NULL;
11983 PL_last_swash_slen = 0;
11984
1d7c1841
GS
11985 PL_glob_index = proto_perl->Iglob_index;
11986 PL_srand_called = proto_perl->Isrand_called;
504f80c1 11987 PL_hash_seed = proto_perl->Ihash_seed;
008fb0c0 11988 PL_rehash_seed = proto_perl->Irehash_seed;
1d7c1841
GS
11989 PL_uudmap['M'] = 0; /* reinits on demand */
11990 PL_bitcount = Nullch; /* reinits on demand */
11991
66fe0623
NIS
11992 if (proto_perl->Ipsig_pend) {
11993 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 11994 }
66fe0623
NIS
11995 else {
11996 PL_psig_pend = (int*)NULL;
11997 }
11998
1d7c1841 11999 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
12000 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
12001 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 12002 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
12003 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
12004 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
12005 }
12006 }
12007 else {
12008 PL_psig_ptr = (SV**)NULL;
12009 PL_psig_name = (SV**)NULL;
12010 }
12011
12012 /* thrdvar.h stuff */
12013
a0739874 12014 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
12015 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
12016 PL_tmps_ix = proto_perl->Ttmps_ix;
12017 PL_tmps_max = proto_perl->Ttmps_max;
12018 PL_tmps_floor = proto_perl->Ttmps_floor;
12019 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
12020 i = 0;
12021 while (i <= PL_tmps_ix) {
d2d73c3e 12022 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
12023 ++i;
12024 }
12025
12026 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
12027 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
12028 Newz(54, PL_markstack, i, I32);
12029 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
12030 - proto_perl->Tmarkstack);
12031 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
12032 - proto_perl->Tmarkstack);
12033 Copy(proto_perl->Tmarkstack, PL_markstack,
12034 PL_markstack_ptr - PL_markstack + 1, I32);
12035
12036 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
12037 * NOTE: unlike the others! */
12038 PL_scopestack_ix = proto_perl->Tscopestack_ix;
12039 PL_scopestack_max = proto_perl->Tscopestack_max;
12040 Newz(54, PL_scopestack, PL_scopestack_max, I32);
12041 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
12042
12043 /* next push_return() sets PL_retstack[PL_retstack_ix]
12044 * NOTE: unlike the others! */
12045 PL_retstack_ix = proto_perl->Tretstack_ix;
12046 PL_retstack_max = proto_perl->Tretstack_max;
12047 Newz(54, PL_retstack, PL_retstack_max, OP*);
ce0a1ae0 12048 Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, OP*);
1d7c1841
GS
12049
12050 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 12051 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
12052
12053 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
12054 PL_curstack = av_dup(proto_perl->Tcurstack, param);
12055 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
12056
12057 /* next PUSHs() etc. set *(PL_stack_sp+1) */
12058 PL_stack_base = AvARRAY(PL_curstack);
12059 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
12060 - proto_perl->Tstack_base);
12061 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
12062
12063 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
12064 * NOTE: unlike the others! */
12065 PL_savestack_ix = proto_perl->Tsavestack_ix;
12066 PL_savestack_max = proto_perl->Tsavestack_max;
12067 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 12068 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
12069 }
12070 else {
12071 init_stacks();
985e7056 12072 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
12073 }
12074
12075 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
12076 PL_top_env = &PL_start_env;
12077
12078 PL_op = proto_perl->Top;
12079
12080 PL_Sv = Nullsv;
12081 PL_Xpv = (XPV*)NULL;
12082 PL_na = proto_perl->Tna;
12083
12084 PL_statbuf = proto_perl->Tstatbuf;
12085 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
12086 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
12087 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
12088#ifdef HAS_TIMES
12089 PL_timesbuf = proto_perl->Ttimesbuf;
12090#endif
12091
12092 PL_tainted = proto_perl->Ttainted;
12093 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
12094 PL_rs = sv_dup_inc(proto_perl->Trs, param);
12095 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
12096 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
12097 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 12098 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
12099 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
12100 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
12101 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
12102
12103 PL_restartop = proto_perl->Trestartop;
12104 PL_in_eval = proto_perl->Tin_eval;
12105 PL_delaymagic = proto_perl->Tdelaymagic;
12106 PL_dirty = proto_perl->Tdirty;
12107 PL_localizing = proto_perl->Tlocalizing;
12108
14dd3ad8 12109#ifdef PERL_FLEXIBLE_EXCEPTIONS
1d7c1841 12110 PL_protect = proto_perl->Tprotect;
14dd3ad8 12111#endif
d2d73c3e 12112 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
dd28f7bb 12113 PL_hv_fetch_ent_mh = Nullhe;
1d7c1841
GS
12114 PL_modcount = proto_perl->Tmodcount;
12115 PL_lastgotoprobe = Nullop;
12116 PL_dumpindent = proto_perl->Tdumpindent;
12117
12118 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
12119 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
12120 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
12121 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
12122 PL_sortcxix = proto_perl->Tsortcxix;
12123 PL_efloatbuf = Nullch; /* reinits on demand */
12124 PL_efloatsize = 0; /* reinits on demand */
12125
12126 /* regex stuff */
12127
12128 PL_screamfirst = NULL;
12129 PL_screamnext = NULL;
12130 PL_maxscream = -1; /* reinits on demand */
12131 PL_lastscream = Nullsv;
12132
12133 PL_watchaddr = NULL;
12134 PL_watchok = Nullch;
12135
12136 PL_regdummy = proto_perl->Tregdummy;
1d7c1841
GS
12137 PL_regprecomp = Nullch;
12138 PL_regnpar = 0;
12139 PL_regsize = 0;
1d7c1841
GS
12140 PL_colorset = 0; /* reinits PL_colors[] */
12141 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841
GS
12142 PL_reginput = Nullch;
12143 PL_regbol = Nullch;
12144 PL_regeol = Nullch;
12145 PL_regstartp = (I32*)NULL;
12146 PL_regendp = (I32*)NULL;
12147 PL_reglastparen = (U32*)NULL;
2d862feb 12148 PL_reglastcloseparen = (U32*)NULL;
1d7c1841 12149 PL_regtill = Nullch;
1d7c1841
GS
12150 PL_reg_start_tmp = (char**)NULL;
12151 PL_reg_start_tmpl = 0;
12152 PL_regdata = (struct reg_data*)NULL;
12153 PL_bostr = Nullch;
12154 PL_reg_flags = 0;
12155 PL_reg_eval_set = 0;
12156 PL_regnarrate = 0;
12157 PL_regprogram = (regnode*)NULL;
12158 PL_regindent = 0;
12159 PL_regcc = (CURCUR*)NULL;
12160 PL_reg_call_cc = (struct re_cc_state*)NULL;
12161 PL_reg_re = (regexp*)NULL;
12162 PL_reg_ganch = Nullch;
12163 PL_reg_sv = Nullsv;
53c4c00c 12164 PL_reg_match_utf8 = FALSE;
1d7c1841
GS
12165 PL_reg_magic = (MAGIC*)NULL;
12166 PL_reg_oldpos = 0;
12167 PL_reg_oldcurpm = (PMOP*)NULL;
12168 PL_reg_curpm = (PMOP*)NULL;
12169 PL_reg_oldsaved = Nullch;
12170 PL_reg_oldsavedlen = 0;
ed252734 12171#ifdef PERL_COPY_ON_WRITE
504cff3b 12172 PL_nrs = Nullsv;
ed252734 12173#endif
1d7c1841
GS
12174 PL_reg_maxiter = 0;
12175 PL_reg_leftiter = 0;
12176 PL_reg_poscache = Nullch;
12177 PL_reg_poscache_size= 0;
12178
12179 /* RE engine - function pointers */
12180 PL_regcompp = proto_perl->Tregcompp;
12181 PL_regexecp = proto_perl->Tregexecp;
12182 PL_regint_start = proto_perl->Tregint_start;
12183 PL_regint_string = proto_perl->Tregint_string;
12184 PL_regfree = proto_perl->Tregfree;
12185
12186 PL_reginterp_cnt = 0;
12187 PL_reg_starttry = 0;
12188
a2efc822
SC
12189 /* Pluggable optimizer */
12190 PL_peepp = proto_perl->Tpeepp;
12191
081fc587
AB
12192 PL_stashcache = newHV();
12193
a0739874
DM
12194 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
12195 ptr_table_free(PL_ptr_table);
12196 PL_ptr_table = NULL;
12197 }
8cf8f3d1 12198
f284b03f
AMS
12199 /* Call the ->CLONE method, if it exists, for each of the stashes
12200 identified by sv_dup() above.
12201 */
d2d73c3e
AB
12202 while(av_len(param->stashes) != -1) {
12203 HV* stash = (HV*) av_shift(param->stashes);
f284b03f
AMS
12204 GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
12205 if (cloner && GvCV(cloner)) {
12206 dSP;
12207 ENTER;
12208 SAVETMPS;
12209 PUSHMARK(SP);
dc507217 12210 XPUSHs(sv_2mortal(newSVpv(HvNAME(stash), 0)));
f284b03f
AMS
12211 PUTBACK;
12212 call_sv((SV*)GvCV(cloner), G_DISCARD);
12213 FREETMPS;
12214 LEAVE;
12215 }
4a09accc 12216 }
a0739874 12217
dc507217 12218 SvREFCNT_dec(param->stashes);
dc507217 12219
1d7c1841 12220 return my_perl;
1d7c1841
GS
12221}
12222
1d7c1841 12223#endif /* USE_ITHREADS */
a0ae6670 12224
9f4817db 12225/*
ccfc67b7
JH
12226=head1 Unicode Support
12227
9f4817db
JH
12228=for apidoc sv_recode_to_utf8
12229
5d170f3a
JH
12230The encoding is assumed to be an Encode object, on entry the PV
12231of the sv is assumed to be octets in that encoding, and the sv
12232will be converted into Unicode (and UTF-8).
9f4817db 12233
5d170f3a
JH
12234If the sv already is UTF-8 (or if it is not POK), or if the encoding
12235is not a reference, nothing is done to the sv. If the encoding is not
1768d7eb
JH
12236an C<Encode::XS> Encoding object, bad things will happen.
12237(See F<lib/encoding.pm> and L<Encode>).
9f4817db 12238
5d170f3a 12239The PV of the sv is returned.
9f4817db 12240
5d170f3a
JH
12241=cut */
12242
12243char *
12244Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
12245{
220e2d4e 12246 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
d0063567
DK
12247 SV *uni;
12248 STRLEN len;
12249 char *s;
12250 dSP;
12251 ENTER;
12252 SAVETMPS;
220e2d4e 12253 save_re_context();
d0063567
DK
12254 PUSHMARK(sp);
12255 EXTEND(SP, 3);
12256 XPUSHs(encoding);
12257 XPUSHs(sv);
f9893866
NIS
12258/*
12259 NI-S 2002/07/09
12260 Passing sv_yes is wrong - it needs to be or'ed set of constants
12261 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
12262 remove converted chars from source.
12263
12264 Both will default the value - let them.
12265
d0063567 12266 XPUSHs(&PL_sv_yes);
f9893866 12267*/
d0063567
DK
12268 PUTBACK;
12269 call_method("decode", G_SCALAR);
12270 SPAGAIN;
12271 uni = POPs;
12272 PUTBACK;
12273 s = SvPV(uni, len);
d0063567
DK
12274 if (s != SvPVX(sv)) {
12275 SvGROW(sv, len + 1);
12276 Move(s, SvPVX(sv), len, char);
12277 SvCUR_set(sv, len);
12278 SvPVX(sv)[len] = 0;
12279 }
12280 FREETMPS;
12281 LEAVE;
d0063567 12282 SvUTF8_on(sv);
f9893866
NIS
12283 }
12284 return SvPVX(sv);
9f4817db
JH
12285}
12286
220e2d4e
IH
12287/*
12288=for apidoc sv_cat_decode
12289
12290The encoding is assumed to be an Encode object, the PV of the ssv is
12291assumed to be octets in that encoding and decoding the input starts
12292from the position which (PV + *offset) pointed to. The dsv will be
12293concatenated the decoded UTF-8 string from ssv. Decoding will terminate
12294when the string tstr appears in decoding output or the input ends on
12295the PV of the ssv. The value which the offset points will be modified
12296to the last input position on the ssv.
68795e93 12297
220e2d4e
IH
12298Returns TRUE if the terminator was found, else returns FALSE.
12299
12300=cut */
12301
12302bool
12303Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
12304 SV *ssv, int *offset, char *tstr, int tlen)
12305{
a73e8557 12306 bool ret = FALSE;
220e2d4e 12307 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
220e2d4e
IH
12308 SV *offsv;
12309 dSP;
12310 ENTER;
12311 SAVETMPS;
12312 save_re_context();
12313 PUSHMARK(sp);
12314 EXTEND(SP, 6);
12315 XPUSHs(encoding);
12316 XPUSHs(dsv);
12317 XPUSHs(ssv);
12318 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
12319 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
12320 PUTBACK;
12321 call_method("cat_decode", G_SCALAR);
12322 SPAGAIN;
12323 ret = SvTRUE(TOPs);
12324 *offset = SvIV(offsv);
12325 PUTBACK;
12326 FREETMPS;
12327 LEAVE;
220e2d4e 12328 }
a73e8557
JH
12329 else
12330 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
12331 return ret;
220e2d4e 12332}
f9893866 12333