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