This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix Archive::Tar test when perl is built with -Dmksymlinks
[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
f8c7b90f 50#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 51#define SV_COW_NEXT_SV(sv) INT2PTR(SV *,SvUVX(sv))
607fa7f2 52#define SV_COW_NEXT_SV_SET(current,next) SvUV_set(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
4977e971
NC
66Normally, this allocation is done using arenas, which by default are
67approximately 4K chunks of memory parcelled up into N heads or bodies. The
68first slot in each arena is reserved, and is used to hold a link to the next
69arena. In the case of heads, the unused first slot also contains some flags
70and a note of the number of slots. Snaked through each arena chain is a
5e045b90 71linked list of free items; when this becomes empty, an extra arena is
4977e971 72allocated and divided up into N items which are threaded into the free list.
645c22ef
DM
73
74The following global variables are associated with arenas:
75
76 PL_sv_arenaroot pointer to list of SV arenas
77 PL_sv_root pointer to list of free SV structures
78
79 PL_foo_arenaroot pointer to list of foo arenas,
80 PL_foo_root pointer to list of free foo bodies
81 ... for foo in xiv, xnv, xrv, xpv etc.
82
83Note that some of the larger and more rarely used body types (eg xpvio)
84are not allocated using arenas, but are instead just malloc()/free()ed as
85required. Also, if PURIFY is defined, arenas are abandoned altogether,
86with all items individually malloc()ed. In addition, a few SV heads are
87not allocated from an arena, but are instead directly created as static
4977e971
NC
88or auto variables, eg PL_sv_undef. The size of arenas can be changed from
89the default by setting PERL_ARENA_SIZE appropriately at compile time.
645c22ef
DM
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
cac9b346 168
fd0854ff
DM
169#ifdef DEBUG_LEAKING_SCALARS
170# ifdef NETWARE
171# define FREE_SV_DEBUG_FILE(sv) PerlMemfree((sv)->sv_debug_file)
172# else
173# define FREE_SV_DEBUG_FILE(sv) PerlMemShared_free((sv)->sv_debug_file)
174# endif
175#else
176# define FREE_SV_DEBUG_FILE(sv)
177#endif
178
053fc874
GS
179#define plant_SV(p) \
180 STMT_START { \
fd0854ff 181 FREE_SV_DEBUG_FILE(p); \
053fc874
GS
182 SvANY(p) = (void *)PL_sv_root; \
183 SvFLAGS(p) = SVTYPEMASK; \
184 PL_sv_root = (p); \
185 --PL_sv_count; \
186 } STMT_END
a0d0e21e 187
fba3b22e 188/* sv_mutex must be held while calling uproot_SV() */
053fc874
GS
189#define uproot_SV(p) \
190 STMT_START { \
191 (p) = PL_sv_root; \
192 PL_sv_root = (SV*)SvANY(p); \
193 ++PL_sv_count; \
194 } STMT_END
195
645c22ef 196
cac9b346
NC
197/* make some more SVs by adding another arena */
198
199/* sv_mutex must be held while calling more_sv() */
200STATIC SV*
201S_more_sv(pTHX)
202{
203 SV* sv;
204
205 if (PL_nice_chunk) {
206 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
207 PL_nice_chunk = Nullch;
208 PL_nice_chunk_size = 0;
209 }
210 else {
211 char *chunk; /* must use New here to match call to */
2e7ed132
NC
212 New(704,chunk,PERL_ARENA_SIZE,char); /* Safefree() in sv_free_arenas() */
213 sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
cac9b346
NC
214 }
215 uproot_SV(sv);
216 return sv;
217}
218
645c22ef
DM
219/* new_SV(): return a new, empty SV head */
220
eba0f806
DM
221#ifdef DEBUG_LEAKING_SCALARS
222/* provide a real function for a debugger to play with */
223STATIC SV*
224S_new_SV(pTHX)
225{
226 SV* sv;
227
228 LOCK_SV_MUTEX;
229 if (PL_sv_root)
230 uproot_SV(sv);
231 else
cac9b346 232 sv = S_more_sv(aTHX);
eba0f806
DM
233 UNLOCK_SV_MUTEX;
234 SvANY(sv) = 0;
235 SvREFCNT(sv) = 1;
236 SvFLAGS(sv) = 0;
fd0854ff
DM
237 sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
238 sv->sv_debug_line = (U16) ((PL_copline == NOLINE) ?
239 (PL_curcop ? CopLINE(PL_curcop) : 0) : PL_copline);
240 sv->sv_debug_inpad = 0;
241 sv->sv_debug_cloned = 0;
242# ifdef NETWARE
243 sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
244# else
245 sv->sv_debug_file = PL_curcop ? savesharedpv(CopFILE(PL_curcop)): NULL;
246# endif
247
eba0f806
DM
248 return sv;
249}
250# define new_SV(p) (p)=S_new_SV(aTHX)
251
252#else
253# define new_SV(p) \
053fc874
GS
254 STMT_START { \
255 LOCK_SV_MUTEX; \
256 if (PL_sv_root) \
257 uproot_SV(p); \
258 else \
cac9b346 259 (p) = S_more_sv(aTHX); \
053fc874
GS
260 UNLOCK_SV_MUTEX; \
261 SvANY(p) = 0; \
262 SvREFCNT(p) = 1; \
263 SvFLAGS(p) = 0; \
264 } STMT_END
eba0f806 265#endif
463ee0b2 266
645c22ef
DM
267
268/* del_SV(): return an empty SV head to the free list */
269
a0d0e21e 270#ifdef DEBUGGING
4561caa4 271
053fc874
GS
272#define del_SV(p) \
273 STMT_START { \
274 LOCK_SV_MUTEX; \
aea4f609 275 if (DEBUG_D_TEST) \
053fc874
GS
276 del_sv(p); \
277 else \
278 plant_SV(p); \
279 UNLOCK_SV_MUTEX; \
280 } STMT_END
a0d0e21e 281
76e3520e 282STATIC void
cea2e8a9 283S_del_sv(pTHX_ SV *p)
463ee0b2 284{
aea4f609 285 if (DEBUG_D_TEST) {
4633a7c4 286 SV* sva;
a3b680e6 287 bool ok = 0;
3280af22 288 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
53c1dcc0
AL
289 const SV * const sv = sva + 1;
290 const SV * const svend = &sva[SvREFCNT(sva)];
c0ff570e 291 if (p >= sv && p < svend) {
a0d0e21e 292 ok = 1;
c0ff570e
NC
293 break;
294 }
a0d0e21e
LW
295 }
296 if (!ok) {
0453d815 297 if (ckWARN_d(WARN_INTERNAL))
9014280d 298 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
299 "Attempt to free non-arena SV: 0x%"UVxf
300 pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
a0d0e21e
LW
301 return;
302 }
303 }
4561caa4 304 plant_SV(p);
463ee0b2 305}
a0d0e21e 306
4561caa4
CS
307#else /* ! DEBUGGING */
308
309#define del_SV(p) plant_SV(p)
310
311#endif /* DEBUGGING */
463ee0b2 312
645c22ef
DM
313
314/*
ccfc67b7
JH
315=head1 SV Manipulation Functions
316
645c22ef
DM
317=for apidoc sv_add_arena
318
319Given a chunk of memory, link it to the head of the list of arenas,
320and split it into a list of free SVs.
321
322=cut
323*/
324
4633a7c4 325void
864dbfa3 326Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
463ee0b2 327{
4633a7c4 328 SV* sva = (SV*)ptr;
463ee0b2
LW
329 register SV* sv;
330 register SV* svend;
4633a7c4
LW
331
332 /* The first SV in an arena isn't an SV. */
3280af22 333 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
334 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
335 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
336
3280af22
NIS
337 PL_sv_arenaroot = sva;
338 PL_sv_root = sva + 1;
4633a7c4
LW
339
340 svend = &sva[SvREFCNT(sva) - 1];
341 sv = sva + 1;
463ee0b2 342 while (sv < svend) {
a0d0e21e 343 SvANY(sv) = (void *)(SV*)(sv + 1);
03e36789 344#ifdef DEBUGGING
978b032e 345 SvREFCNT(sv) = 0;
03e36789
NC
346#endif
347 /* Must always set typemask because it's awlays checked in on cleanup
348 when the arenas are walked looking for objects. */
8990e307 349 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
350 sv++;
351 }
352 SvANY(sv) = 0;
03e36789
NC
353#ifdef DEBUGGING
354 SvREFCNT(sv) = 0;
355#endif
4633a7c4
LW
356 SvFLAGS(sv) = SVTYPEMASK;
357}
358
055972dc
DM
359/* visit(): call the named function for each non-free SV in the arenas
360 * whose flags field matches the flags/mask args. */
645c22ef 361
5226ed68 362STATIC I32
055972dc 363S_visit(pTHX_ SVFUNC_t f, U32 flags, U32 mask)
8990e307 364{
4633a7c4 365 SV* sva;
5226ed68 366 I32 visited = 0;
8990e307 367
3280af22 368 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
53c1dcc0 369 register const SV * const svend = &sva[SvREFCNT(sva)];
a3b680e6 370 register SV* sv;
4561caa4 371 for (sv = sva + 1; sv < svend; ++sv) {
055972dc
DM
372 if (SvTYPE(sv) != SVTYPEMASK
373 && (sv->sv_flags & mask) == flags
374 && SvREFCNT(sv))
375 {
acfe0abc 376 (FCALL)(aTHX_ sv);
5226ed68
JH
377 ++visited;
378 }
8990e307
LW
379 }
380 }
5226ed68 381 return visited;
8990e307
LW
382}
383
758a08c3
JH
384#ifdef DEBUGGING
385
645c22ef
DM
386/* called by sv_report_used() for each live SV */
387
388static void
acfe0abc 389do_report_used(pTHX_ SV *sv)
645c22ef
DM
390{
391 if (SvTYPE(sv) != SVTYPEMASK) {
392 PerlIO_printf(Perl_debug_log, "****\n");
393 sv_dump(sv);
394 }
395}
758a08c3 396#endif
645c22ef
DM
397
398/*
399=for apidoc sv_report_used
400
401Dump the contents of all SVs not yet freed. (Debugging aid).
402
403=cut
404*/
405
8990e307 406void
864dbfa3 407Perl_sv_report_used(pTHX)
4561caa4 408{
ff270d3a 409#ifdef DEBUGGING
055972dc 410 visit(do_report_used, 0, 0);
ff270d3a 411#endif
4561caa4
CS
412}
413
645c22ef
DM
414/* called by sv_clean_objs() for each live SV */
415
416static void
acfe0abc 417do_clean_objs(pTHX_ SV *sv)
645c22ef
DM
418{
419 SV* rv;
420
421 if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
422 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv)));
423 if (SvWEAKREF(sv)) {
424 sv_del_backref(sv);
425 SvWEAKREF_off(sv);
b162af07 426 SvRV_set(sv, NULL);
645c22ef
DM
427 } else {
428 SvROK_off(sv);
b162af07 429 SvRV_set(sv, NULL);
645c22ef
DM
430 SvREFCNT_dec(rv);
431 }
432 }
433
434 /* XXX Might want to check arrays, etc. */
435}
436
437/* called by sv_clean_objs() for each live SV */
438
439#ifndef DISABLE_DESTRUCTOR_KLUDGE
440static void
acfe0abc 441do_clean_named_objs(pTHX_ SV *sv)
645c22ef
DM
442{
443 if (SvTYPE(sv) == SVt_PVGV && GvGP(sv)) {
444 if ( SvOBJECT(GvSV(sv)) ||
445 (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
446 (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
447 (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
448 (GvCV(sv) && SvOBJECT(GvCV(sv))) )
449 {
450 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
ec5f3c78 451 SvFLAGS(sv) |= SVf_BREAK;
645c22ef
DM
452 SvREFCNT_dec(sv);
453 }
454 }
455}
456#endif
457
458/*
459=for apidoc sv_clean_objs
460
461Attempt to destroy all objects not yet freed
462
463=cut
464*/
465
4561caa4 466void
864dbfa3 467Perl_sv_clean_objs(pTHX)
4561caa4 468{
3280af22 469 PL_in_clean_objs = TRUE;
055972dc 470 visit(do_clean_objs, SVf_ROK, SVf_ROK);
4561caa4 471#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 472 /* some barnacles may yet remain, clinging to typeglobs */
055972dc 473 visit(do_clean_named_objs, SVt_PVGV, SVTYPEMASK);
4561caa4 474#endif
3280af22 475 PL_in_clean_objs = FALSE;
4561caa4
CS
476}
477
645c22ef
DM
478/* called by sv_clean_all() for each live SV */
479
480static void
acfe0abc 481do_clean_all(pTHX_ SV *sv)
645c22ef
DM
482{
483 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
484 SvFLAGS(sv) |= SVf_BREAK;
0e705b3b
DM
485 if (PL_comppad == (AV*)sv) {
486 PL_comppad = Nullav;
487 PL_curpad = Null(SV**);
488 }
645c22ef
DM
489 SvREFCNT_dec(sv);
490}
491
492/*
493=for apidoc sv_clean_all
494
495Decrement the refcnt of each remaining SV, possibly triggering a
496cleanup. This function may have to be called multiple times to free
ff276b08 497SVs which are in complex self-referential hierarchies.
645c22ef
DM
498
499=cut
500*/
501
5226ed68 502I32
864dbfa3 503Perl_sv_clean_all(pTHX)
8990e307 504{
5226ed68 505 I32 cleaned;
3280af22 506 PL_in_clean_all = TRUE;
055972dc 507 cleaned = visit(do_clean_all, 0,0);
3280af22 508 PL_in_clean_all = FALSE;
5226ed68 509 return cleaned;
8990e307 510}
463ee0b2 511
7cfef17e
NC
512static void
513S_free_arena(pTHX_ void **root) {
514 while (root) {
1b6737cc 515 void ** const next = *(void **)root;
7cfef17e
NC
516 Safefree(root);
517 root = next;
518 }
519}
520
645c22ef
DM
521/*
522=for apidoc sv_free_arenas
523
524Deallocate the memory used by all arenas. Note that all the individual SV
525heads and bodies within the arenas must already have been freed.
526
527=cut
528*/
529
7cfef17e
NC
530#define free_arena(name) \
531 STMT_START { \
532 S_free_arena(aTHX_ (void**) PL_ ## name ## _arenaroot); \
533 PL_ ## name ## _arenaroot = 0; \
534 PL_ ## name ## _root = 0; \
535 } STMT_END
536
4633a7c4 537void
864dbfa3 538Perl_sv_free_arenas(pTHX)
4633a7c4
LW
539{
540 SV* sva;
541 SV* svanext;
542
543 /* Free arenas here, but be careful about fake ones. (We assume
544 contiguity of the fake ones with the corresponding real ones.) */
545
3280af22 546 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
547 svanext = (SV*) SvANY(sva);
548 while (svanext && SvFAKE(svanext))
549 svanext = (SV*) SvANY(svanext);
550
551 if (!SvFAKE(sva))
1df70142 552 Safefree(sva);
4633a7c4 553 }
8b4f5e17 554
7cfef17e
NC
555 free_arena(xnv);
556 free_arena(xpv);
557 free_arena(xpviv);
558 free_arena(xpvnv);
559 free_arena(xpvcv);
560 free_arena(xpvav);
561 free_arena(xpvhv);
562 free_arena(xpvmg);
563 free_arena(xpvgv);
564 free_arena(xpvlv);
565 free_arena(xpvbm);
566 free_arena(he);
567#if defined(USE_ITHREADS)
568 free_arena(pte);
569#endif
612f20c3 570
3280af22
NIS
571 if (PL_nice_chunk)
572 Safefree(PL_nice_chunk);
573 PL_nice_chunk = Nullch;
574 PL_nice_chunk_size = 0;
575 PL_sv_arenaroot = 0;
576 PL_sv_root = 0;
4633a7c4
LW
577}
578
29489e7c
DM
579/* ---------------------------------------------------------------------
580 *
581 * support functions for report_uninit()
582 */
583
584/* the maxiumum size of array or hash where we will scan looking
585 * for the undefined element that triggered the warning */
586
587#define FUV_MAX_SEARCH_SIZE 1000
588
589/* Look for an entry in the hash whose value has the same SV as val;
590 * If so, return a mortal copy of the key. */
591
592STATIC SV*
593S_find_hash_subscript(pTHX_ HV *hv, SV* val)
594{
27da23d5 595 dVAR;
29489e7c 596 register HE **array;
29489e7c
DM
597 I32 i;
598
599 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
600 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
601 return Nullsv;
602
603 array = HvARRAY(hv);
604
605 for (i=HvMAX(hv); i>0; i--) {
f54cb97a 606 register HE *entry;
29489e7c
DM
607 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
608 if (HeVAL(entry) != val)
609 continue;
610 if ( HeVAL(entry) == &PL_sv_undef ||
611 HeVAL(entry) == &PL_sv_placeholder)
612 continue;
613 if (!HeKEY(entry))
614 return Nullsv;
615 if (HeKLEN(entry) == HEf_SVKEY)
616 return sv_mortalcopy(HeKEY_sv(entry));
617 return sv_2mortal(newSVpvn(HeKEY(entry), HeKLEN(entry)));
618 }
619 }
620 return Nullsv;
621}
622
623/* Look for an entry in the array whose value has the same SV as val;
624 * If so, return the index, otherwise return -1. */
625
626STATIC I32
627S_find_array_subscript(pTHX_ AV *av, SV* val)
628{
629 SV** svp;
630 I32 i;
631 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
632 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
633 return -1;
634
635 svp = AvARRAY(av);
636 for (i=AvFILLp(av); i>=0; i--) {
637 if (svp[i] == val && svp[i] != &PL_sv_undef)
638 return i;
639 }
640 return -1;
641}
642
643/* S_varname(): return the name of a variable, optionally with a subscript.
644 * If gv is non-zero, use the name of that global, along with gvtype (one
645 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
646 * targ. Depending on the value of the subscript_type flag, return:
647 */
648
649#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
650#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
651#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
652#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
653
654STATIC SV*
bfed75c6 655S_varname(pTHX_ GV *gv, const char *gvtype, PADOFFSET targ,
29489e7c
DM
656 SV* keyname, I32 aindex, int subscript_type)
657{
29489e7c 658
a3b680e6 659 SV * const name = sv_newmortal();
29489e7c
DM
660 if (gv) {
661
662 /* simulate gv_fullname4(), but add literal '^' for $^FOO names
663 * XXX get rid of all this if gv_fullnameX() ever supports this
664 * directly */
665
bfed75c6 666 const char *p;
53c1dcc0 667 HV * const hv = GvSTASH(gv);
29489e7c
DM
668 sv_setpv(name, gvtype);
669 if (!hv)
670 p = "???";
bfcb3514 671 else if (!(p=HvNAME_get(hv)))
29489e7c 672 p = "__ANON__";
29489e7c
DM
673 if (strNE(p, "main")) {
674 sv_catpv(name,p);
675 sv_catpvn(name,"::", 2);
676 }
677 if (GvNAMELEN(gv)>= 1 &&
678 ((unsigned int)*GvNAME(gv)) <= 26)
679 { /* handle $^FOO */
680 Perl_sv_catpvf(aTHX_ name,"^%c", *GvNAME(gv) + 'A' - 1);
681 sv_catpvn(name,GvNAME(gv)+1,GvNAMELEN(gv)-1);
682 }
683 else
684 sv_catpvn(name,GvNAME(gv),GvNAMELEN(gv));
685 }
686 else {
53c1dcc0
AL
687 U32 unused;
688 CV * const cv = find_runcv(&unused);
689 SV *sv;
690 AV *av;
691
29489e7c 692 if (!cv || !CvPADLIST(cv))
1b6737cc 693 return Nullsv;
29489e7c
DM
694 av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
695 sv = *av_fetch(av, targ, FALSE);
696 /* SvLEN in a pad name is not to be trusted */
f9926b10 697 sv_setpv(name, SvPV_nolen_const(sv));
29489e7c
DM
698 }
699
700 if (subscript_type == FUV_SUBSCRIPT_HASH) {
1b6737cc 701 SV * const sv = NEWSV(0,0);
29489e7c 702 *SvPVX(name) = '$';
29489e7c 703 Perl_sv_catpvf(aTHX_ name, "{%s}",
3f7c398e 704 pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
29489e7c
DM
705 SvREFCNT_dec(sv);
706 }
707 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
708 *SvPVX(name) = '$';
265a12b8 709 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
29489e7c
DM
710 }
711 else if (subscript_type == FUV_SUBSCRIPT_WITHIN)
712 sv_insert(name, 0, 0, "within ", 7);
713
714 return name;
715}
716
717
718/*
719=for apidoc find_uninit_var
720
721Find the name of the undefined variable (if any) that caused the operator o
722to issue a "Use of uninitialized value" warning.
723If match is true, only return a name if it's value matches uninit_sv.
724So roughly speaking, if a unary operator (such as OP_COS) generates a
725warning, then following the direct child of the op may yield an
726OP_PADSV or OP_GV that gives the name of the undefined variable. On the
727other hand, with OP_ADD there are two branches to follow, so we only print
728the variable name if we get an exact match.
729
730The name is returned as a mortal SV.
731
732Assumes that PL_op is the op that originally triggered the error, and that
733PL_comppad/PL_curpad points to the currently executing pad.
734
735=cut
736*/
737
738STATIC SV *
739S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
740{
27da23d5 741 dVAR;
29489e7c
DM
742 SV *sv;
743 AV *av;
29489e7c
DM
744 GV *gv;
745 OP *o, *o2, *kid;
746
747 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
748 uninit_sv == &PL_sv_placeholder)))
749 return Nullsv;
750
751 switch (obase->op_type) {
752
753 case OP_RV2AV:
754 case OP_RV2HV:
755 case OP_PADAV:
756 case OP_PADHV:
757 {
f54cb97a
AL
758 const bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
759 const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
112dcc46
RGS
760 I32 index = 0;
761 SV *keysv = Nullsv;
29489e7c
DM
762 int subscript_type = FUV_SUBSCRIPT_WITHIN;
763
764 if (pad) { /* @lex, %lex */
765 sv = PAD_SVl(obase->op_targ);
766 gv = Nullgv;
767 }
768 else {
769 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
770 /* @global, %global */
771 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
772 if (!gv)
773 break;
774 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
775 }
776 else /* @{expr}, %{expr} */
777 return find_uninit_var(cUNOPx(obase)->op_first,
778 uninit_sv, match);
779 }
780
781 /* attempt to find a match within the aggregate */
782 if (hash) {
783 keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
784 if (keysv)
785 subscript_type = FUV_SUBSCRIPT_HASH;
786 }
787 else {
788 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
789 if (index >= 0)
790 subscript_type = FUV_SUBSCRIPT_ARRAY;
791 }
792
793 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
794 break;
795
1b6737cc 796 return varname(gv, hash ? "%" : "@", obase->op_targ,
29489e7c
DM
797 keysv, index, subscript_type);
798 }
799
800 case OP_PADSV:
801 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
802 break;
1b6737cc 803 return varname(Nullgv, "$", obase->op_targ,
29489e7c
DM
804 Nullsv, 0, FUV_SUBSCRIPT_NONE);
805
806 case OP_GVSV:
807 gv = cGVOPx_gv(obase);
808 if (!gv || (match && GvSV(gv) != uninit_sv))
809 break;
1b6737cc 810 return varname(gv, "$", 0, Nullsv, 0, FUV_SUBSCRIPT_NONE);
29489e7c
DM
811
812 case OP_AELEMFAST:
813 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
814 if (match) {
1b6737cc 815 SV **svp;
29489e7c
DM
816 av = (AV*)PAD_SV(obase->op_targ);
817 if (!av || SvRMAGICAL(av))
818 break;
819 svp = av_fetch(av, (I32)obase->op_private, FALSE);
820 if (!svp || *svp != uninit_sv)
821 break;
822 }
1b6737cc 823 return varname(Nullgv, "$", obase->op_targ,
29489e7c
DM
824 Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
825 }
826 else {
827 gv = cGVOPx_gv(obase);
828 if (!gv)
829 break;
830 if (match) {
1b6737cc 831 SV **svp;
29489e7c
DM
832 av = GvAV(gv);
833 if (!av || SvRMAGICAL(av))
834 break;
835 svp = av_fetch(av, (I32)obase->op_private, FALSE);
836 if (!svp || *svp != uninit_sv)
837 break;
838 }
1b6737cc 839 return varname(gv, "$", 0,
29489e7c
DM
840 Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
841 }
842 break;
843
844 case OP_EXISTS:
845 o = cUNOPx(obase)->op_first;
846 if (!o || o->op_type != OP_NULL ||
847 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
848 break;
849 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
850
851 case OP_AELEM:
852 case OP_HELEM:
853 if (PL_op == obase)
854 /* $a[uninit_expr] or $h{uninit_expr} */
855 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
856
857 gv = Nullgv;
858 o = cBINOPx(obase)->op_first;
859 kid = cBINOPx(obase)->op_last;
860
861 /* get the av or hv, and optionally the gv */
862 sv = Nullsv;
863 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
864 sv = PAD_SV(o->op_targ);
865 }
866 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
867 && cUNOPo->op_first->op_type == OP_GV)
868 {
869 gv = cGVOPx_gv(cUNOPo->op_first);
870 if (!gv)
871 break;
872 sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
873 }
874 if (!sv)
875 break;
876
877 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
878 /* index is constant */
879 if (match) {
880 if (SvMAGICAL(sv))
881 break;
882 if (obase->op_type == OP_HELEM) {
883 HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
884 if (!he || HeVAL(he) != uninit_sv)
885 break;
886 }
887 else {
1b6737cc 888 SV ** const svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
29489e7c
DM
889 if (!svp || *svp != uninit_sv)
890 break;
891 }
892 }
893 if (obase->op_type == OP_HELEM)
1b6737cc 894 return varname(gv, "%", o->op_targ,
29489e7c
DM
895 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
896 else
1b6737cc 897 return varname(gv, "@", o->op_targ, Nullsv,
29489e7c
DM
898 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
899 ;
900 }
901 else {
902 /* index is an expression;
903 * attempt to find a match within the aggregate */
904 if (obase->op_type == OP_HELEM) {
53c1dcc0 905 SV * const keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
29489e7c 906 if (keysv)
1b6737cc 907 return varname(gv, "%", o->op_targ,
29489e7c
DM
908 keysv, 0, FUV_SUBSCRIPT_HASH);
909 }
910 else {
f54cb97a 911 const I32 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
29489e7c 912 if (index >= 0)
1b6737cc 913 return varname(gv, "@", o->op_targ,
29489e7c
DM
914 Nullsv, index, FUV_SUBSCRIPT_ARRAY);
915 }
916 if (match)
917 break;
1b6737cc 918 return varname(gv,
29489e7c
DM
919 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
920 ? "@" : "%",
921 o->op_targ, Nullsv, 0, FUV_SUBSCRIPT_WITHIN);
922 }
923
924 break;
925
926 case OP_AASSIGN:
927 /* only examine RHS */
928 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
929
930 case OP_OPEN:
931 o = cUNOPx(obase)->op_first;
932 if (o->op_type == OP_PUSHMARK)
933 o = o->op_sibling;
934
935 if (!o->op_sibling) {
936 /* one-arg version of open is highly magical */
937
938 if (o->op_type == OP_GV) { /* open FOO; */
939 gv = cGVOPx_gv(o);
940 if (match && GvSV(gv) != uninit_sv)
941 break;
1b6737cc 942 return varname(gv, "$", 0,
29489e7c
DM
943 Nullsv, 0, FUV_SUBSCRIPT_NONE);
944 }
945 /* other possibilities not handled are:
946 * open $x; or open my $x; should return '${*$x}'
947 * open expr; should return '$'.expr ideally
948 */
949 break;
950 }
951 goto do_op;
952
953 /* ops where $_ may be an implicit arg */
954 case OP_TRANS:
955 case OP_SUBST:
956 case OP_MATCH:
957 if ( !(obase->op_flags & OPf_STACKED)) {
958 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
959 ? PAD_SVl(obase->op_targ)
960 : DEFSV))
961 {
962 sv = sv_newmortal();
616d8c9c 963 sv_setpvn(sv, "$_", 2);
29489e7c
DM
964 return sv;
965 }
966 }
967 goto do_op;
968
969 case OP_PRTF:
970 case OP_PRINT:
971 /* skip filehandle as it can't produce 'undef' warning */
972 o = cUNOPx(obase)->op_first;
973 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
974 o = o->op_sibling->op_sibling;
975 goto do_op2;
976
977
e21bd382 978 case OP_RV2SV:
29489e7c
DM
979 case OP_CUSTOM:
980 case OP_ENTERSUB:
981 match = 1; /* XS or custom code could trigger random warnings */
982 goto do_op;
983
984 case OP_SCHOMP:
985 case OP_CHOMP:
986 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
987 return sv_2mortal(newSVpv("${$/}", 0));
988 /* FALL THROUGH */
989
990 default:
991 do_op:
992 if (!(obase->op_flags & OPf_KIDS))
993 break;
994 o = cUNOPx(obase)->op_first;
995
996 do_op2:
997 if (!o)
998 break;
999
1000 /* if all except one arg are constant, or have no side-effects,
1001 * or are optimized away, then it's unambiguous */
1002 o2 = Nullop;
1003 for (kid=o; kid; kid = kid->op_sibling) {
1004 if (kid &&
1005 ( (kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid)))
1006 || (kid->op_type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
1007 || (kid->op_type == OP_PUSHMARK)
1008 )
1009 )
1010 continue;
1011 if (o2) { /* more than one found */
1012 o2 = Nullop;
1013 break;
1014 }
1015 o2 = kid;
1016 }
1017 if (o2)
1018 return find_uninit_var(o2, uninit_sv, match);
1019
1020 /* scan all args */
1021 while (o) {
1022 sv = find_uninit_var(o, uninit_sv, 1);
1023 if (sv)
1024 return sv;
1025 o = o->op_sibling;
1026 }
1027 break;
1028 }
1029 return Nullsv;
1030}
1031
1032
645c22ef
DM
1033/*
1034=for apidoc report_uninit
1035
1036Print appropriate "Use of uninitialized variable" warning
1037
1038=cut
1039*/
1040
1d7c1841 1041void
29489e7c
DM
1042Perl_report_uninit(pTHX_ SV* uninit_sv)
1043{
1044 if (PL_op) {
112dcc46 1045 SV* varname = Nullsv;
29489e7c
DM
1046 if (uninit_sv) {
1047 varname = find_uninit_var(PL_op, uninit_sv,0);
1048 if (varname)
1049 sv_insert(varname, 0, 0, " ", 1);
1050 }
9014280d 1051 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
93524f2b 1052 varname ? SvPV_nolen_const(varname) : "",
29489e7c
DM
1053 " in ", OP_DESC(PL_op));
1054 }
1d7c1841 1055 else
29489e7c
DM
1056 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
1057 "", "", "");
1d7c1841
GS
1058}
1059
de042e1d 1060STATIC void *
e3bbdc67 1061S_more_bodies (pTHX_ void **arena_root, void **root, size_t size)
cac9b346 1062{
e3bbdc67
NC
1063 char *start;
1064 const char *end;
53c1dcc0 1065 const size_t count = PERL_ARENA_SIZE/size;
e3bbdc67
NC
1066 New(0, start, count*size, char);
1067 *((void **) start) = *arena_root;
1068 *arena_root = (void *)start;
cac9b346 1069
e3bbdc67 1070 end = start + (count-1) * size;
cac9b346 1071
e3bbdc67
NC
1072 /* The initial slot is used to link the arenas together, so it isn't to be
1073 linked into the list of ready-to-use bodies. */
cac9b346 1074
e3bbdc67 1075 start += size;
cac9b346 1076
e3bbdc67 1077 *root = (void *)start;
cac9b346 1078
e3bbdc67 1079 while (start < end) {
53c1dcc0 1080 char * const next = start + size;
e3bbdc67
NC
1081 *(void**) start = (void *)next;
1082 start = next;
cac9b346 1083 }
e3bbdc67 1084 *(void **)start = 0;
de042e1d
NC
1085
1086 return *root;
cac9b346
NC
1087}
1088
aeb18a1e 1089/* grab a new thing from the free list, allocating more if necessary */
645c22ef 1090
aeb18a1e 1091STATIC void *
dd690478 1092S_new_body(pTHX_ void **arena_root, void **root, size_t size)
932e9ff9 1093{
aeb18a1e 1094 void *xpv;
932e9ff9 1095 LOCK_SV_MUTEX;
aeb18a1e
NC
1096 xpv = *root ? *root : S_more_bodies(aTHX_ arena_root, root, size);
1097 *root = *(void**)xpv;
932e9ff9 1098 UNLOCK_SV_MUTEX;
dd690478 1099 return xpv;
932e9ff9
VB
1100}
1101
aeb18a1e 1102/* return a thing to the free list */
645c22ef 1103
cb4415b8
NC
1104#define del_body(thing, root) \
1105 STMT_START { \
1106 LOCK_SV_MUTEX; \
1107 *(void **)thing = *root; \
1108 *root = (void*)thing; \
1109 UNLOCK_SV_MUTEX; \
1110 } STMT_END
932e9ff9 1111
aeb18a1e
NC
1112/* Conventionally we simply malloc() a big block of memory, then divide it
1113 up into lots of the thing that we're allocating.
645c22ef 1114
aeb18a1e
NC
1115 This macro will expand to call to S_new_body. So for XPVBM (with ithreads),
1116 it would become
932e9ff9 1117
aeb18a1e
NC
1118 S_new_body(my_perl, (void**)&(my_perl->Ixpvbm_arenaroot),
1119 (void**)&(my_perl->Ixpvbm_root), sizeof(XPVBM), 0)
1120*/
645c22ef 1121
aeb18a1e
NC
1122#define new_body(TYPE,lctype) \
1123 S_new_body(aTHX_ (void**)&PL_ ## lctype ## _arenaroot, \
1124 (void**)&PL_ ## lctype ## _root, \
dd690478
NC
1125 sizeof(TYPE))
1126
cb4415b8
NC
1127#define del_body_type(p,TYPE,lctype) \
1128 del_body((void*)p, (void**)&PL_ ## lctype ## _root)
aeb18a1e
NC
1129
1130/* But for some types, we cheat. The type starts with some members that are
1131 never accessed. So we allocate the substructure, starting at the first used
1132 member, then adjust the pointer back in memory by the size of the bit not
1133 allocated, so it's as if we allocated the full structure.
1134 (But things will all go boom if you write to the part that is "not there",
1135 because you'll be overwriting the last members of the preceding structure
1136 in memory.)
1137
1138 We calculate the correction using the STRUCT_OFFSET macro. For example, if
1139 xpv_allocated is the same structure as XPV then the two OFFSETs sum to zero,
1140 and the pointer is unchanged. If the allocated structure is smaller (no
1141 initial NV actually allocated) then the net effect is to subtract the size
1142 of the NV from the pointer, to return a new pointer as if an initial NV were
1143 actually allocated.
1144
1145 This is the same trick as was used for NV and IV bodies. Ironically it
1146 doesn't need to be used for NV bodies any more, because NV is now at the
1147 start of the structure. IV bodies don't need it either, because they are
1148 no longer allocated. */
1149
1150#define new_body_allocated(TYPE,lctype,member) \
dd690478
NC
1151 (void*)((char*)S_new_body(aTHX_ (void**)&PL_ ## lctype ## _arenaroot, \
1152 (void**)&PL_ ## lctype ## _root, \
1153 sizeof(lctype ## _allocated)) - \
1154 STRUCT_OFFSET(TYPE, member) \
1155 + STRUCT_OFFSET(lctype ## _allocated, member))
aeb18a1e
NC
1156
1157
aeb18a1e 1158#define del_body_allocated(p,TYPE,lctype,member) \
cb4415b8
NC
1159 del_body((void*)((char*)p + STRUCT_OFFSET(TYPE, member) \
1160 - STRUCT_OFFSET(lctype ## _allocated, member)), \
1161 (void**)&PL_ ## lctype ## _root)
932e9ff9 1162
7bab3ede
MB
1163#define my_safemalloc(s) (void*)safemalloc(s)
1164#define my_safefree(p) safefree((char*)p)
463ee0b2 1165
d33b2eba 1166#ifdef PURIFY
463ee0b2 1167
d33b2eba
GS
1168#define new_XNV() my_safemalloc(sizeof(XPVNV))
1169#define del_XNV(p) my_safefree(p)
463ee0b2 1170
d33b2eba
GS
1171#define new_XPV() my_safemalloc(sizeof(XPV))
1172#define del_XPV(p) my_safefree(p)
9b94d1dd 1173
d33b2eba
GS
1174#define new_XPVIV() my_safemalloc(sizeof(XPVIV))
1175#define del_XPVIV(p) my_safefree(p)
932e9ff9 1176
d33b2eba
GS
1177#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
1178#define del_XPVNV(p) my_safefree(p)
932e9ff9 1179
d33b2eba
GS
1180#define new_XPVCV() my_safemalloc(sizeof(XPVCV))
1181#define del_XPVCV(p) my_safefree(p)
932e9ff9 1182
d33b2eba
GS
1183#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
1184#define del_XPVAV(p) my_safefree(p)
1185
1186#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
1187#define del_XPVHV(p) my_safefree(p)
1c846c1f 1188
d33b2eba
GS
1189#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
1190#define del_XPVMG(p) my_safefree(p)
1191
727879eb
NC
1192#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
1193#define del_XPVGV(p) my_safefree(p)
1194
d33b2eba
GS
1195#define new_XPVLV() my_safemalloc(sizeof(XPVLV))
1196#define del_XPVLV(p) my_safefree(p)
1197
1198#define new_XPVBM() my_safemalloc(sizeof(XPVBM))
1199#define del_XPVBM(p) my_safefree(p)
1200
1201#else /* !PURIFY */
1202
aeb18a1e 1203#define new_XNV() new_body(NV, xnv)
cb4415b8 1204#define del_XNV(p) del_body_type(p, NV, xnv)
9b94d1dd 1205
aeb18a1e
NC
1206#define new_XPV() new_body_allocated(XPV, xpv, xpv_cur)
1207#define del_XPV(p) del_body_allocated(p, XPV, xpv, xpv_cur)
d33b2eba 1208
aeb18a1e
NC
1209#define new_XPVIV() new_body_allocated(XPVIV, xpviv, xpv_cur)
1210#define del_XPVIV(p) del_body_allocated(p, XPVIV, xpviv, xpv_cur)
d33b2eba 1211
aeb18a1e 1212#define new_XPVNV() new_body(XPVNV, xpvnv)
cb4415b8 1213#define del_XPVNV(p) del_body_type(p, XPVNV, xpvnv)
d33b2eba 1214
aeb18a1e 1215#define new_XPVCV() new_body(XPVCV, xpvcv)
cb4415b8 1216#define del_XPVCV(p) del_body_type(p, XPVCV, xpvcv)
d33b2eba 1217
aeb18a1e
NC
1218#define new_XPVAV() new_body_allocated(XPVAV, xpvav, xav_fill)
1219#define del_XPVAV(p) del_body_allocated(p, XPVAV, xpvav, xav_fill)
d33b2eba 1220
aeb18a1e
NC
1221#define new_XPVHV() new_body_allocated(XPVHV, xpvhv, xhv_fill)
1222#define del_XPVHV(p) del_body_allocated(p, XPVHV, xpvhv, xhv_fill)
1c846c1f 1223
aeb18a1e 1224#define new_XPVMG() new_body(XPVMG, xpvmg)
cb4415b8 1225#define del_XPVMG(p) del_body_type(p, XPVMG, xpvmg)
d33b2eba 1226
aeb18a1e 1227#define new_XPVGV() new_body(XPVGV, xpvgv)
cb4415b8 1228#define del_XPVGV(p) del_body_type(p, XPVGV, xpvgv)
727879eb 1229
aeb18a1e 1230#define new_XPVLV() new_body(XPVLV, xpvlv)
cb4415b8 1231#define del_XPVLV(p) del_body_type(p, XPVLV, xpvlv)
d33b2eba 1232
aeb18a1e 1233#define new_XPVBM() new_body(XPVBM, xpvbm)
cb4415b8 1234#define del_XPVBM(p) del_body_type(p, XPVBM, xpvbm)
d33b2eba
GS
1235
1236#endif /* PURIFY */
9b94d1dd 1237
d33b2eba
GS
1238#define new_XPVFM() my_safemalloc(sizeof(XPVFM))
1239#define del_XPVFM(p) my_safefree(p)
1c846c1f 1240
d33b2eba
GS
1241#define new_XPVIO() my_safemalloc(sizeof(XPVIO))
1242#define del_XPVIO(p) my_safefree(p)
8990e307 1243
954c1994
GS
1244/*
1245=for apidoc sv_upgrade
1246
ff276b08 1247Upgrade an SV to a more complex form. Generally adds a new body type to the
645c22ef 1248SV, then copies across as much information as possible from the old body.
ff276b08 1249You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
954c1994
GS
1250
1251=cut
1252*/
1253
63f97190 1254void
864dbfa3 1255Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
79072805 1256{
9a085840 1257 void** old_body_arena;
878cc751 1258 size_t old_body_offset;
4cbc76b1 1259 size_t old_body_length; /* Well, the length to copy. */
878cc751 1260 void* old_body;
16b305e3
NC
1261#ifndef NV_ZERO_IS_ALLBITS_ZERO
1262 /* If NV 0.0 is store as all bits 0 then Zero() already creates a correct
1263 0.0 for us. */
4cbc76b1 1264 bool zero_nv = TRUE;
16b305e3 1265#endif
403d36eb
NC
1266 void* new_body;
1267 size_t new_body_length;
1268 size_t new_body_offset;
1269 void** new_body_arena;
1270 void** new_body_arenaroot;
53c1dcc0 1271 const U32 old_type = SvTYPE(sv);
79072805 1272
765f542d
NC
1273 if (mt != SVt_PV && SvIsCOW(sv)) {
1274 sv_force_normal_flags(sv, 0);
f130fd45
NIS
1275 }
1276
79072805 1277 if (SvTYPE(sv) == mt)
63f97190 1278 return;
79072805 1279
f5282e15 1280 if (SvTYPE(sv) > mt)
921edb34
RGS
1281 Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
1282 (int)SvTYPE(sv), (int)mt);
f5282e15 1283
d2e56290 1284
878cc751
NC
1285 old_body = SvANY(sv);
1286 old_body_arena = 0;
1287 old_body_offset = 0;
4cbc76b1 1288 old_body_length = 0;
403d36eb
NC
1289 new_body_offset = 0;
1290 new_body_length = ~0;
1291
1292 /* Copying structures onto other structures that have been neatly zeroed
1293 has a subtle gotcha. Consider XPVMG
1294
1295 +------+------+------+------+------+-------+-------+
1296 | NV | CUR | LEN | IV | MAGIC | STASH |
1297 +------+------+------+------+------+-------+-------+
1298 0 4 8 12 16 20 24 28
1299
1300 where NVs are aligned to 8 bytes, so that sizeof that structure is
1301 actually 32 bytes long, with 4 bytes of padding at the end:
1302
1303 +------+------+------+------+------+-------+-------+------+
1304 | NV | CUR | LEN | IV | MAGIC | STASH | ??? |
1305 +------+------+------+------+------+-------+-------+------+
1306 0 4 8 12 16 20 24 28 32
1307
1308 so what happens if you allocate memory for this structure:
1309
1310 +------+------+------+------+------+-------+-------+------+------+...
1311 | NV | CUR | LEN | IV | MAGIC | STASH | GP | NAME |
1312 +------+------+------+------+------+-------+-------+------+------+...
1313 0 4 8 12 16 20 24 28 32 36
1314
1315 zero it, then copy sizeof(XPVMG) bytes on top of it? Not quite what you
1316 expect, because you copy the area marked ??? onto GP. Now, ??? may have
1317 started out as zero once, but it's quite possible that it isn't. So now,
1318 rather than a nicely zeroed GP, you have it pointing somewhere random.
1319 Bugs ensue.
1320
1321 (In fact, GP ends up pointing at a previous GP structure, because the
1322 principle cause of the padding in XPVMG getting garbage is a copy of
1323 sizeof(XPVMG) bytes from a XPVGV structure in sv_unglob)
1324
1325 So we are careful and work out the size of used parts of all the
1326 structures. */
878cc751 1327
79072805
LW
1328 switch (SvTYPE(sv)) {
1329 case SVt_NULL:
79072805 1330 break;
79072805 1331 case SVt_IV:
ed6116ce 1332 if (mt == SVt_NV)
463ee0b2 1333 mt = SVt_PVNV;
ed6116ce
LW
1334 else if (mt < SVt_PVIV)
1335 mt = SVt_PVIV;
4cbc76b1
NC
1336 old_body_offset = STRUCT_OFFSET(XPVIV, xiv_iv);
1337 old_body_length = sizeof(IV);
79072805
LW
1338 break;
1339 case SVt_NV:
9a085840 1340 old_body_arena = (void **) &PL_xnv_root;
4cbc76b1 1341 old_body_length = sizeof(NV);
16b305e3 1342#ifndef NV_ZERO_IS_ALLBITS_ZERO
4cbc76b1 1343 zero_nv = FALSE;
16b305e3 1344#endif
ed6116ce 1345 if (mt < SVt_PVNV)
79072805
LW
1346 mt = SVt_PVNV;
1347 break;
ed6116ce 1348 case SVt_RV:
ed6116ce 1349 break;
79072805 1350 case SVt_PV:
9a085840 1351 old_body_arena = (void **) &PL_xpv_root;
878cc751
NC
1352 old_body_offset = STRUCT_OFFSET(XPV, xpv_cur)
1353 - STRUCT_OFFSET(xpv_allocated, xpv_cur);
403d36eb
NC
1354 old_body_length = STRUCT_OFFSET(XPV, xpv_len)
1355 + sizeof (((XPV*)SvANY(sv))->xpv_len)
1356 - old_body_offset;
748a9306
LW
1357 if (mt <= SVt_IV)
1358 mt = SVt_PVIV;
1359 else if (mt == SVt_NV)
1360 mt = SVt_PVNV;
79072805
LW
1361 break;
1362 case SVt_PVIV:
9a085840 1363 old_body_arena = (void **) &PL_xpviv_root;
878cc751
NC
1364 old_body_offset = STRUCT_OFFSET(XPVIV, xpv_cur)
1365 - STRUCT_OFFSET(xpviv_allocated, xpv_cur);
403d36eb
NC
1366 old_body_length = STRUCT_OFFSET(XPVIV, xiv_u)
1367 + sizeof (((XPVIV*)SvANY(sv))->xiv_u)
1368 - old_body_offset;
79072805
LW
1369 break;
1370 case SVt_PVNV:
9a085840 1371 old_body_arena = (void **) &PL_xpvnv_root;
403d36eb
NC
1372 old_body_length = STRUCT_OFFSET(XPVNV, xiv_u)
1373 + sizeof (((XPVNV*)SvANY(sv))->xiv_u);
16b305e3 1374#ifndef NV_ZERO_IS_ALLBITS_ZERO
4cbc76b1 1375 zero_nv = FALSE;
16b305e3 1376#endif
79072805
LW
1377 break;
1378 case SVt_PVMG:
0ec50a73
NC
1379 /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1380 there's no way that it can be safely upgraded, because perl.c
1381 expects to Safefree(SvANY(PL_mess_sv)) */
1382 assert(sv != PL_mess_sv);
bce8f412
NC
1383 /* This flag bit is used to mean other things in other scalar types.
1384 Given that it only has meaning inside the pad, it shouldn't be set
1385 on anything that can get upgraded. */
1386 assert((SvFLAGS(sv) & SVpad_TYPED) == 0);
9a085840 1387 old_body_arena = (void **) &PL_xpvmg_root;
403d36eb
NC
1388 old_body_length = STRUCT_OFFSET(XPVMG, xmg_stash)
1389 + sizeof (((XPVMG*)SvANY(sv))->xmg_stash);
16b305e3 1390#ifndef NV_ZERO_IS_ALLBITS_ZERO
4cbc76b1 1391 zero_nv = FALSE;
16b305e3 1392#endif
79072805
LW
1393 break;
1394 default:
cea2e8a9 1395 Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
79072805
LW
1396 }
1397
ffb05e06
NC
1398 SvFLAGS(sv) &= ~SVTYPEMASK;
1399 SvFLAGS(sv) |= mt;
1400
79072805
LW
1401 switch (mt) {
1402 case SVt_NULL:
cea2e8a9 1403 Perl_croak(aTHX_ "Can't upgrade to undef");
79072805 1404 case SVt_IV:
4cbc76b1 1405 assert(old_type == SVt_NULL);
339049b0 1406 SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
403d36eb 1407 SvIV_set(sv, 0);
85274cbc 1408 return;
79072805 1409 case SVt_NV:
4cbc76b1 1410 assert(old_type == SVt_NULL);
79072805 1411 SvANY(sv) = new_XNV();
403d36eb 1412 SvNV_set(sv, 0);
85274cbc 1413 return;
ed6116ce 1414 case SVt_RV:
4cbc76b1 1415 assert(old_type == SVt_NULL);
339049b0 1416 SvANY(sv) = &sv->sv_u.svu_rv;
403d36eb 1417 SvRV_set(sv, 0);
85274cbc 1418 return;
79072805
LW
1419 case SVt_PVHV:
1420 SvANY(sv) = new_XPVHV();
463ee0b2
LW
1421 HvFILL(sv) = 0;
1422 HvMAX(sv) = 0;
8aacddc1 1423 HvTOTALKEYS(sv) = 0;
bd4b1eb5 1424
2068cd4d
NC
1425 goto hv_av_common;
1426
1427 case SVt_PVAV:
1428 SvANY(sv) = new_XPVAV();
1429 AvMAX(sv) = -1;
1430 AvFILLp(sv) = -1;
1431 AvALLOC(sv) = 0;
1432 AvREAL_only(sv);
1433
1434 hv_av_common:
1435 /* SVt_NULL isn't the only thing upgraded to AV or HV.
1436 The target created by newSVrv also is, and it can have magic.
1437 However, it never has SvPVX set.
1438 */
1439 if (old_type >= SVt_RV) {
1440 assert(SvPVX_const(sv) == 0);
8bd4d4c5 1441 }
2068cd4d
NC
1442
1443 /* Could put this in the else clause below, as PVMG must have SvPVX
1444 0 already (the assertion above) */
bd4b1eb5 1445 SvPV_set(sv, (char*)0);
2068cd4d
NC
1446
1447 if (old_type >= SVt_PVMG) {
1448 SvMAGIC_set(sv, ((XPVMG*)old_body)->xmg_magic);
1449 SvSTASH_set(sv, ((XPVMG*)old_body)->xmg_stash);
1450 } else {
1451 SvMAGIC_set(sv, 0);
1452 SvSTASH_set(sv, 0);
1453 }
79072805 1454 break;
bd4b1eb5
NC
1455
1456 case SVt_PVIO:
403d36eb
NC
1457 new_body = new_XPVIO();
1458 new_body_length = sizeof(XPVIO);
1459 goto zero;
bd4b1eb5 1460 case SVt_PVFM:
403d36eb
NC
1461 new_body = new_XPVFM();
1462 new_body_length = sizeof(XPVFM);
1463 goto zero;
1464
bd4b1eb5 1465 case SVt_PVBM:
403d36eb
NC
1466 new_body_length = sizeof(XPVBM);
1467 new_body_arena = (void **) &PL_xpvbm_root;
1468 new_body_arenaroot = (void **) &PL_xpvbm_arenaroot;
1469 goto new_body;
bd4b1eb5 1470 case SVt_PVGV:
403d36eb
NC
1471 new_body_length = sizeof(XPVGV);
1472 new_body_arena = (void **) &PL_xpvgv_root;
1473 new_body_arenaroot = (void **) &PL_xpvgv_arenaroot;
1474 goto new_body;
79072805 1475 case SVt_PVCV:
403d36eb
NC
1476 new_body_length = sizeof(XPVCV);
1477 new_body_arena = (void **) &PL_xpvcv_root;
1478 new_body_arenaroot = (void **) &PL_xpvcv_arenaroot;
1479 goto new_body;
bd4b1eb5 1480 case SVt_PVLV:
403d36eb
NC
1481 new_body_length = sizeof(XPVLV);
1482 new_body_arena = (void **) &PL_xpvlv_root;
1483 new_body_arenaroot = (void **) &PL_xpvlv_arenaroot;
1484 goto new_body;
1485 case SVt_PVMG:
1486 new_body_length = sizeof(XPVMG);
1487 new_body_arena = (void **) &PL_xpvmg_root;
1488 new_body_arenaroot = (void **) &PL_xpvmg_arenaroot;
1489 goto new_body;
1490 case SVt_PVNV:
1491 new_body_length = sizeof(XPVNV);
1492 new_body_arena = (void **) &PL_xpvnv_root;
1493 new_body_arenaroot = (void **) &PL_xpvnv_arenaroot;
1494 goto new_body;
1495 case SVt_PVIV:
1496 new_body_offset = STRUCT_OFFSET(XPVIV, xpv_cur)
1497 - STRUCT_OFFSET(xpviv_allocated, xpv_cur);
1498 new_body_length = sizeof(XPVIV) - new_body_offset;
1499 new_body_arena = (void **) &PL_xpviv_root;
1500 new_body_arenaroot = (void **) &PL_xpviv_arenaroot;
1501 /* XXX Is this still needed? Was it ever needed? Surely as there is
1502 no route from NV to PVIV, NOK can never be true */
1503 if (SvNIOK(sv))
1504 (void)SvIOK_on(sv);
1505 SvNOK_off(sv);
1506 goto new_body_no_NV;
1507 case SVt_PV:
1508 new_body_offset = STRUCT_OFFSET(XPV, xpv_cur)
1509 - STRUCT_OFFSET(xpv_allocated, xpv_cur);
1510 new_body_length = sizeof(XPV) - new_body_offset;
1511 new_body_arena = (void **) &PL_xpv_root;
1512 new_body_arenaroot = (void **) &PL_xpv_arenaroot;
1513 new_body_no_NV:
1514 /* PV and PVIV don't have an NV slot. */
16b305e3 1515#ifndef NV_ZERO_IS_ALLBITS_ZERO
403d36eb 1516 zero_nv = FALSE;
16b305e3 1517#endif
403d36eb 1518
16b305e3
NC
1519 new_body:
1520 assert(new_body_length);
403d36eb 1521#ifndef PURIFY
16b305e3
NC
1522 /* This points to the start of the allocated area. */
1523 new_body = S_new_body(aTHX_ new_body_arenaroot, new_body_arena,
1524 new_body_length);
403d36eb 1525#else
16b305e3
NC
1526 /* We always allocated the full length item with PURIFY */
1527 new_body_length += new_body_offset;
1528 new_body_offset = 0;
1529 new_body = my_safemalloc(new_body_length);
403d36eb
NC
1530
1531#endif
16b305e3
NC
1532 zero:
1533 Zero(new_body, new_body_length, char);
1534 new_body = ((char *)new_body) - new_body_offset;
1535 SvANY(sv) = new_body;
1536
1537 if (old_body_length) {
1538 Copy((char *)old_body + old_body_offset,
1539 (char *)new_body + old_body_offset,
1540 old_body_length, char);
1541 }
403d36eb 1542
16b305e3
NC
1543#ifndef NV_ZERO_IS_ALLBITS_ZERO
1544 if (zero_nv)
1545 SvNV_set(sv, 0);
1546#endif
403d36eb 1547
16b305e3
NC
1548 if (mt == SVt_PVIO)
1549 IoPAGE_LEN(sv) = 60;
1550 if (old_type < SVt_RV)
1551 SvPV_set(sv, 0);
8990e307 1552 break;
403d36eb
NC
1553 default:
1554 Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu", mt);
8990e307 1555 }
878cc751
NC
1556
1557
1558 if (old_body_arena) {
1559#ifdef PURIFY
ee6954bb 1560 my_safefree(old_body);
878cc751 1561#else
cb4415b8
NC
1562 del_body((void*)((char*)old_body + old_body_offset),
1563 old_body_arena);
878cc751 1564#endif
2068cd4d 1565 }
79072805
LW
1566}
1567
645c22ef
DM
1568/*
1569=for apidoc sv_backoff
1570
1571Remove any string offset. You should normally use the C<SvOOK_off> macro
1572wrapper instead.
1573
1574=cut
1575*/
1576
79072805 1577int
864dbfa3 1578Perl_sv_backoff(pTHX_ register SV *sv)
79072805
LW
1579{
1580 assert(SvOOK(sv));
b79f7545
NC
1581 assert(SvTYPE(sv) != SVt_PVHV);
1582 assert(SvTYPE(sv) != SVt_PVAV);
463ee0b2 1583 if (SvIVX(sv)) {
53c1dcc0 1584 const char * const s = SvPVX_const(sv);
b162af07 1585 SvLEN_set(sv, SvLEN(sv) + SvIVX(sv));
f880fe2f 1586 SvPV_set(sv, SvPVX(sv) - SvIVX(sv));
79072805 1587 SvIV_set(sv, 0);
463ee0b2 1588 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
79072805
LW
1589 }
1590 SvFLAGS(sv) &= ~SVf_OOK;
a0d0e21e 1591 return 0;
79072805
LW
1592}
1593
954c1994
GS
1594/*
1595=for apidoc sv_grow
1596
645c22ef
DM
1597Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
1598upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
1599Use the C<SvGROW> wrapper instead.
954c1994
GS
1600
1601=cut
1602*/
1603
79072805 1604char *
864dbfa3 1605Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
79072805
LW
1606{
1607 register char *s;
1608
55497cff 1609#ifdef HAS_64K_LIMIT
79072805 1610 if (newlen >= 0x10000) {
1d7c1841
GS
1611 PerlIO_printf(Perl_debug_log,
1612 "Allocation too large: %"UVxf"\n", (UV)newlen);
79072805
LW
1613 my_exit(1);
1614 }
55497cff 1615#endif /* HAS_64K_LIMIT */
a0d0e21e
LW
1616 if (SvROK(sv))
1617 sv_unref(sv);
79072805
LW
1618 if (SvTYPE(sv) < SVt_PV) {
1619 sv_upgrade(sv, SVt_PV);
93524f2b 1620 s = SvPVX_mutable(sv);
79072805
LW
1621 }
1622 else if (SvOOK(sv)) { /* pv is offset? */
1623 sv_backoff(sv);
93524f2b 1624 s = SvPVX_mutable(sv);
79072805
LW
1625 if (newlen > SvLEN(sv))
1626 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
c6f8c383
GA
1627#ifdef HAS_64K_LIMIT
1628 if (newlen >= 0x10000)
1629 newlen = 0xFFFF;
1630#endif
79072805 1631 }
bc44a8a2 1632 else
4d84ee25 1633 s = SvPVX_mutable(sv);
54f0641b 1634
79072805 1635 if (newlen > SvLEN(sv)) { /* need more room? */
7a9b70e9 1636 newlen = PERL_STRLEN_ROUNDUP(newlen);
8d6dde3e 1637 if (SvLEN(sv) && s) {
7bab3ede 1638#ifdef MYMALLOC
93524f2b 1639 const STRLEN l = malloced_size((void*)SvPVX_const(sv));
8d6dde3e
IZ
1640 if (newlen <= l) {
1641 SvLEN_set(sv, l);
1642 return s;
1643 } else
c70c8a0a 1644#endif
1936d2a7 1645 s = saferealloc(s, newlen);
8d6dde3e 1646 }
bfed75c6 1647 else {
1936d2a7 1648 s = safemalloc(newlen);
3f7c398e
SP
1649 if (SvPVX_const(sv) && SvCUR(sv)) {
1650 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
40565179 1651 }
4e83176d 1652 }
79072805 1653 SvPV_set(sv, s);
e1ec3a88 1654 SvLEN_set(sv, newlen);
79072805
LW
1655 }
1656 return s;
1657}
1658
954c1994
GS
1659/*
1660=for apidoc sv_setiv
1661
645c22ef
DM
1662Copies an integer into the given SV, upgrading first if necessary.
1663Does not handle 'set' magic. See also C<sv_setiv_mg>.
954c1994
GS
1664
1665=cut
1666*/
1667
79072805 1668void
864dbfa3 1669Perl_sv_setiv(pTHX_ register SV *sv, IV i)
79072805 1670{
765f542d 1671 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2
LW
1672 switch (SvTYPE(sv)) {
1673 case SVt_NULL:
79072805 1674 sv_upgrade(sv, SVt_IV);
463ee0b2
LW
1675 break;
1676 case SVt_NV:
1677 sv_upgrade(sv, SVt_PVNV);
1678 break;
ed6116ce 1679 case SVt_RV:
463ee0b2 1680 case SVt_PV:
79072805 1681 sv_upgrade(sv, SVt_PVIV);
463ee0b2 1682 break;
a0d0e21e
LW
1683
1684 case SVt_PVGV:
a0d0e21e
LW
1685 case SVt_PVAV:
1686 case SVt_PVHV:
1687 case SVt_PVCV:
1688 case SVt_PVFM:
1689 case SVt_PVIO:
411caa50 1690 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
53e06cf0 1691 OP_DESC(PL_op));
463ee0b2 1692 }
a0d0e21e 1693 (void)SvIOK_only(sv); /* validate number */
45977657 1694 SvIV_set(sv, i);
463ee0b2 1695 SvTAINT(sv);
79072805
LW
1696}
1697
954c1994
GS
1698/*
1699=for apidoc sv_setiv_mg
1700
1701Like C<sv_setiv>, but also handles 'set' magic.
1702
1703=cut
1704*/
1705
79072805 1706void
864dbfa3 1707Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
ef50df4b
GS
1708{
1709 sv_setiv(sv,i);
1710 SvSETMAGIC(sv);
1711}
1712
954c1994
GS
1713/*
1714=for apidoc sv_setuv
1715
645c22ef
DM
1716Copies an unsigned integer into the given SV, upgrading first if necessary.
1717Does not handle 'set' magic. See also C<sv_setuv_mg>.
954c1994
GS
1718
1719=cut
1720*/
1721
ef50df4b 1722void
864dbfa3 1723Perl_sv_setuv(pTHX_ register SV *sv, UV u)
55497cff 1724{
55ada374
NC
1725 /* With these two if statements:
1726 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 1727
55ada374
NC
1728 without
1729 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 1730
55ada374
NC
1731 If you wish to remove them, please benchmark to see what the effect is
1732 */
28e5dec8
JH
1733 if (u <= (UV)IV_MAX) {
1734 sv_setiv(sv, (IV)u);
1735 return;
1736 }
25da4f38
IZ
1737 sv_setiv(sv, 0);
1738 SvIsUV_on(sv);
607fa7f2 1739 SvUV_set(sv, u);
55497cff 1740}
1741
954c1994
GS
1742/*
1743=for apidoc sv_setuv_mg
1744
1745Like C<sv_setuv>, but also handles 'set' magic.
1746
1747=cut
1748*/
1749
55497cff 1750void
864dbfa3 1751Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
ef50df4b 1752{
55ada374
NC
1753 /* With these two if statements:
1754 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 1755
55ada374
NC
1756 without
1757 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 1758
55ada374
NC
1759 If you wish to remove them, please benchmark to see what the effect is
1760 */
28e5dec8
JH
1761 if (u <= (UV)IV_MAX) {
1762 sv_setiv(sv, (IV)u);
1763 } else {
1764 sv_setiv(sv, 0);
1765 SvIsUV_on(sv);
1766 sv_setuv(sv,u);
1767 }
ef50df4b
GS
1768 SvSETMAGIC(sv);
1769}
1770
954c1994
GS
1771/*
1772=for apidoc sv_setnv
1773
645c22ef
DM
1774Copies a double into the given SV, upgrading first if necessary.
1775Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
1776
1777=cut
1778*/
1779
ef50df4b 1780void
65202027 1781Perl_sv_setnv(pTHX_ register SV *sv, NV num)
79072805 1782{
765f542d 1783 SV_CHECK_THINKFIRST_COW_DROP(sv);
a0d0e21e
LW
1784 switch (SvTYPE(sv)) {
1785 case SVt_NULL:
1786 case SVt_IV:
79072805 1787 sv_upgrade(sv, SVt_NV);
a0d0e21e 1788 break;
a0d0e21e
LW
1789 case SVt_RV:
1790 case SVt_PV:
1791 case SVt_PVIV:
79072805 1792 sv_upgrade(sv, SVt_PVNV);
a0d0e21e 1793 break;
827b7e14 1794
a0d0e21e 1795 case SVt_PVGV:
a0d0e21e
LW
1796 case SVt_PVAV:
1797 case SVt_PVHV:
1798 case SVt_PVCV:
1799 case SVt_PVFM:
1800 case SVt_PVIO:
411caa50 1801 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
53e06cf0 1802 OP_NAME(PL_op));
79072805 1803 }
9d6ce603 1804 SvNV_set(sv, num);
a0d0e21e 1805 (void)SvNOK_only(sv); /* validate number */
463ee0b2 1806 SvTAINT(sv);
79072805
LW
1807}
1808
954c1994
GS
1809/*
1810=for apidoc sv_setnv_mg
1811
1812Like C<sv_setnv>, but also handles 'set' magic.
1813
1814=cut
1815*/
1816
ef50df4b 1817void
65202027 1818Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
ef50df4b
GS
1819{
1820 sv_setnv(sv,num);
1821 SvSETMAGIC(sv);
1822}
1823
645c22ef
DM
1824/* Print an "isn't numeric" warning, using a cleaned-up,
1825 * printable version of the offending string
1826 */
1827
76e3520e 1828STATIC void
cea2e8a9 1829S_not_a_number(pTHX_ SV *sv)
a0d0e21e 1830{
94463019
JH
1831 SV *dsv;
1832 char tmpbuf[64];
1b6737cc 1833 const char *pv;
94463019
JH
1834
1835 if (DO_UTF8(sv)) {
1836 dsv = sv_2mortal(newSVpv("", 0));
1837 pv = sv_uni_display(dsv, sv, 10, 0);
1838 } else {
1839 char *d = tmpbuf;
1840 char *limit = tmpbuf + sizeof(tmpbuf) - 8;
1841 /* each *s can expand to 4 chars + "...\0",
1842 i.e. need room for 8 chars */
ecdeb87c 1843
e62f0680
NC
1844 const char *s, *end;
1845 for (s = SvPVX_const(sv), end = s + SvCUR(sv); s < end && d < limit;
1846 s++) {
94463019
JH
1847 int ch = *s & 0xFF;
1848 if (ch & 128 && !isPRINT_LC(ch)) {
1849 *d++ = 'M';
1850 *d++ = '-';
1851 ch &= 127;
1852 }
1853 if (ch == '\n') {
1854 *d++ = '\\';
1855 *d++ = 'n';
1856 }
1857 else if (ch == '\r') {
1858 *d++ = '\\';
1859 *d++ = 'r';
1860 }
1861 else if (ch == '\f') {
1862 *d++ = '\\';
1863 *d++ = 'f';
1864 }
1865 else if (ch == '\\') {
1866 *d++ = '\\';
1867 *d++ = '\\';
1868 }
1869 else if (ch == '\0') {
1870 *d++ = '\\';
1871 *d++ = '0';
1872 }
1873 else if (isPRINT_LC(ch))
1874 *d++ = ch;
1875 else {
1876 *d++ = '^';
1877 *d++ = toCTRL(ch);
1878 }
1879 }
1880 if (s < end) {
1881 *d++ = '.';
1882 *d++ = '.';
1883 *d++ = '.';
1884 }
1885 *d = '\0';
1886 pv = tmpbuf;
a0d0e21e 1887 }
a0d0e21e 1888
533c011a 1889 if (PL_op)
9014280d 1890 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
1891 "Argument \"%s\" isn't numeric in %s", pv,
1892 OP_DESC(PL_op));
a0d0e21e 1893 else
9014280d 1894 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 1895 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
1896}
1897
c2988b20
NC
1898/*
1899=for apidoc looks_like_number
1900
645c22ef
DM
1901Test if the content of an SV looks like a number (or is a number).
1902C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1903non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
1904
1905=cut
1906*/
1907
1908I32
1909Perl_looks_like_number(pTHX_ SV *sv)
1910{
a3b680e6 1911 register const char *sbegin;
c2988b20
NC
1912 STRLEN len;
1913
1914 if (SvPOK(sv)) {
3f7c398e 1915 sbegin = SvPVX_const(sv);
c2988b20
NC
1916 len = SvCUR(sv);
1917 }
1918 else if (SvPOKp(sv))
83003860 1919 sbegin = SvPV_const(sv, len);
c2988b20 1920 else
e0ab1c0e 1921 return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
c2988b20
NC
1922 return grok_number(sbegin, len, NULL);
1923}
25da4f38
IZ
1924
1925/* Actually, ISO C leaves conversion of UV to IV undefined, but
1926 until proven guilty, assume that things are not that bad... */
1927
645c22ef
DM
1928/*
1929 NV_PRESERVES_UV:
1930
1931 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
1932 an IV (an assumption perl has been based on to date) it becomes necessary
1933 to remove the assumption that the NV always carries enough precision to
1934 recreate the IV whenever needed, and that the NV is the canonical form.
1935 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 1936 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
1937 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1938 1) to distinguish between IV/UV/NV slots that have cached a valid
1939 conversion where precision was lost and IV/UV/NV slots that have a
1940 valid conversion which has lost no precision
645c22ef 1941 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
1942 would lose precision, the precise conversion (or differently
1943 imprecise conversion) is also performed and cached, to prevent
1944 requests for different numeric formats on the same SV causing
1945 lossy conversion chains. (lossless conversion chains are perfectly
1946 acceptable (still))
1947
1948
1949 flags are used:
1950 SvIOKp is true if the IV slot contains a valid value
1951 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
1952 SvNOKp is true if the NV slot contains a valid value
1953 SvNOK is true only if the NV value is accurate
1954
1955 so
645c22ef 1956 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
1957 IV(or UV) would lose accuracy over a direct conversion from PV to
1958 IV(or UV). If it would, cache both conversions, return NV, but mark
1959 SV as IOK NOKp (ie not NOK).
1960
645c22ef 1961 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
1962 NV would lose accuracy over a direct conversion from PV to NV. If it
1963 would, cache both conversions, flag similarly.
1964
1965 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1966 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
1967 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1968 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 1969 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 1970
645c22ef
DM
1971 The benefit of this is that operations such as pp_add know that if
1972 SvIOK is true for both left and right operands, then integer addition
1973 can be used instead of floating point (for cases where the result won't
1974 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
1975 loss of precision compared with integer addition.
1976
1977 * making IV and NV equal status should make maths accurate on 64 bit
1978 platforms
1979 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 1980 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
1981 looking for SvIOK and checking for overflow will not outweigh the
1982 fp to integer speedup)
1983 * will slow down integer operations (callers of SvIV) on "inaccurate"
1984 values, as the change from SvIOK to SvIOKp will cause a call into
1985 sv_2iv each time rather than a macro access direct to the IV slot
1986 * should speed up number->string conversion on integers as IV is
645c22ef 1987 favoured when IV and NV are equally accurate
28e5dec8
JH
1988
1989 ####################################################################
645c22ef
DM
1990 You had better be using SvIOK_notUV if you want an IV for arithmetic:
1991 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1992 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
1993 ####################################################################
1994
645c22ef 1995 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
1996 performance ratio.
1997*/
1998
1999#ifndef NV_PRESERVES_UV
645c22ef
DM
2000# define IS_NUMBER_UNDERFLOW_IV 1
2001# define IS_NUMBER_UNDERFLOW_UV 2
2002# define IS_NUMBER_IV_AND_UV 2
2003# define IS_NUMBER_OVERFLOW_IV 4
2004# define IS_NUMBER_OVERFLOW_UV 5
2005
2006/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
2007
2008/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
2009STATIC int
645c22ef 2010S_sv_2iuv_non_preserve(pTHX_ register SV *sv, I32 numtype)
28e5dec8 2011{
3f7c398e 2012 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_2iuv_non '%s', IV=0x%"UVxf" NV=%"NVgf" inttype=%"UVXf"\n", SvPVX_const(sv), SvIVX(sv), SvNVX(sv), (UV)numtype));
28e5dec8
JH
2013 if (SvNVX(sv) < (NV)IV_MIN) {
2014 (void)SvIOKp_on(sv);
2015 (void)SvNOK_on(sv);
45977657 2016 SvIV_set(sv, IV_MIN);
28e5dec8
JH
2017 return IS_NUMBER_UNDERFLOW_IV;
2018 }
2019 if (SvNVX(sv) > (NV)UV_MAX) {
2020 (void)SvIOKp_on(sv);
2021 (void)SvNOK_on(sv);
2022 SvIsUV_on(sv);
607fa7f2 2023 SvUV_set(sv, UV_MAX);
28e5dec8
JH
2024 return IS_NUMBER_OVERFLOW_UV;
2025 }
c2988b20
NC
2026 (void)SvIOKp_on(sv);
2027 (void)SvNOK_on(sv);
2028 /* Can't use strtol etc to convert this string. (See truth table in
2029 sv_2iv */
2030 if (SvNVX(sv) <= (UV)IV_MAX) {
45977657 2031 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2032 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2033 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
2034 } else {
2035 /* Integer is imprecise. NOK, IOKp */
2036 }
2037 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
2038 }
2039 SvIsUV_on(sv);
607fa7f2 2040 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
2041 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2042 if (SvUVX(sv) == UV_MAX) {
2043 /* As we know that NVs don't preserve UVs, UV_MAX cannot
2044 possibly be preserved by NV. Hence, it must be overflow.
2045 NOK, IOKp */
2046 return IS_NUMBER_OVERFLOW_UV;
2047 }
2048 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
2049 } else {
2050 /* Integer is imprecise. NOK, IOKp */
28e5dec8 2051 }
c2988b20 2052 return IS_NUMBER_OVERFLOW_IV;
28e5dec8 2053}
645c22ef
DM
2054#endif /* !NV_PRESERVES_UV*/
2055
891f9566
YST
2056/* sv_2iv() is now a macro using Perl_sv_2iv_flags();
2057 * this function provided for binary compatibility only
2058 */
2059
2060IV
2061Perl_sv_2iv(pTHX_ register SV *sv)
2062{
2063 return sv_2iv_flags(sv, SV_GMAGIC);
2064}
2065
645c22ef 2066/*
891f9566 2067=for apidoc sv_2iv_flags
645c22ef 2068
891f9566
YST
2069Return the integer value of an SV, doing any necessary string
2070conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2071Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
645c22ef
DM
2072
2073=cut
2074*/
28e5dec8 2075
a0d0e21e 2076IV
891f9566 2077Perl_sv_2iv_flags(pTHX_ register SV *sv, I32 flags)
79072805
LW
2078{
2079 if (!sv)
2080 return 0;
8990e307 2081 if (SvGMAGICAL(sv)) {
891f9566
YST
2082 if (flags & SV_GMAGIC)
2083 mg_get(sv);
463ee0b2
LW
2084 if (SvIOKp(sv))
2085 return SvIVX(sv);
748a9306 2086 if (SvNOKp(sv)) {
25da4f38 2087 return I_V(SvNVX(sv));
748a9306 2088 }
36477c24 2089 if (SvPOKp(sv) && SvLEN(sv))
2090 return asIV(sv);
3fe9a6f1 2091 if (!SvROK(sv)) {
d008e5eb 2092 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2093 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 2094 report_uninit(sv);
c6ee37c5 2095 }
36477c24 2096 return 0;
3fe9a6f1 2097 }
463ee0b2 2098 }
ed6116ce 2099 if (SvTHINKFIRST(sv)) {
a0d0e21e 2100 if (SvROK(sv)) {
a0d0e21e 2101 SV* tmpstr;
1554e226 2102 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2103 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2104 return SvIV(tmpstr);
56431972 2105 return PTR2IV(SvRV(sv));
a0d0e21e 2106 }
765f542d
NC
2107 if (SvIsCOW(sv)) {
2108 sv_force_normal_flags(sv, 0);
47deb5e7 2109 }
0336b60e 2110 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2111 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2112 report_uninit(sv);
ed6116ce
LW
2113 return 0;
2114 }
79072805 2115 }
25da4f38
IZ
2116 if (SvIOKp(sv)) {
2117 if (SvIsUV(sv)) {
2118 return (IV)(SvUVX(sv));
2119 }
2120 else {
2121 return SvIVX(sv);
2122 }
463ee0b2 2123 }
748a9306 2124 if (SvNOKp(sv)) {
28e5dec8
JH
2125 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2126 * without also getting a cached IV/UV from it at the same time
2127 * (ie PV->NV conversion should detect loss of accuracy and cache
2128 * IV or UV at same time to avoid this. NWC */
25da4f38
IZ
2129
2130 if (SvTYPE(sv) == SVt_NV)
2131 sv_upgrade(sv, SVt_PVNV);
2132
28e5dec8
JH
2133 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2134 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
2135 certainly cast into the IV range at IV_MAX, whereas the correct
2136 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
2137 cases go to UV */
2138 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2139 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
2140 if (SvNVX(sv) == (NV) SvIVX(sv)
2141#ifndef NV_PRESERVES_UV
2142 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2143 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2144 /* Don't flag it as "accurately an integer" if the number
2145 came from a (by definition imprecise) NV operation, and
2146 we're outside the range of NV integer precision */
2147#endif
2148 ) {
2149 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2150 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2151 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2152 PTR2UV(sv),
2153 SvNVX(sv),
2154 SvIVX(sv)));
2155
2156 } else {
2157 /* IV not precise. No need to convert from PV, as NV
2158 conversion would already have cached IV if it detected
2159 that PV->IV would be better than PV->NV->IV
2160 flags already correct - don't set public IOK. */
2161 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2162 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2163 PTR2UV(sv),
2164 SvNVX(sv),
2165 SvIVX(sv)));
2166 }
2167 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2168 but the cast (NV)IV_MIN rounds to a the value less (more
2169 negative) than IV_MIN which happens to be equal to SvNVX ??
2170 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2171 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2172 (NV)UVX == NVX are both true, but the values differ. :-(
2173 Hopefully for 2s complement IV_MIN is something like
2174 0x8000000000000000 which will be exact. NWC */
d460ef45 2175 }
25da4f38 2176 else {
607fa7f2 2177 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
2178 if (
2179 (SvNVX(sv) == (NV) SvUVX(sv))
2180#ifndef NV_PRESERVES_UV
2181 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2182 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2183 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2184 /* Don't flag it as "accurately an integer" if the number
2185 came from a (by definition imprecise) NV operation, and
2186 we're outside the range of NV integer precision */
2187#endif
2188 )
2189 SvIOK_on(sv);
25da4f38
IZ
2190 SvIsUV_on(sv);
2191 ret_iv_max:
1c846c1f 2192 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 2193 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 2194 PTR2UV(sv),
57def98f
JH
2195 SvUVX(sv),
2196 SvUVX(sv)));
25da4f38
IZ
2197 return (IV)SvUVX(sv);
2198 }
748a9306
LW
2199 }
2200 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2201 UV value;
504618e9 2202 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
25da4f38
IZ
2203 /* We want to avoid a possible problem when we cache an IV which
2204 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
2205 the same as the direct translation of the initial string
2206 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2207 be careful to ensure that the value with the .456 is around if the
2208 NV value is requested in the future).
1c846c1f 2209
25da4f38
IZ
2210 This means that if we cache such an IV, we need to cache the
2211 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 2212 cache the NV if we are sure it's not needed.
25da4f38 2213 */
16b7a9a4 2214
c2988b20
NC
2215 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2216 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2217 == IS_NUMBER_IN_UV) {
5e045b90 2218 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
2219 if (SvTYPE(sv) < SVt_PVIV)
2220 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 2221 (void)SvIOK_on(sv);
c2988b20
NC
2222 } else if (SvTYPE(sv) < SVt_PVNV)
2223 sv_upgrade(sv, SVt_PVNV);
28e5dec8 2224
c2988b20
NC
2225 /* If NV preserves UV then we only use the UV value if we know that
2226 we aren't going to call atof() below. If NVs don't preserve UVs
2227 then the value returned may have more precision than atof() will
2228 return, even though value isn't perfectly accurate. */
2229 if ((numtype & (IS_NUMBER_IN_UV
2230#ifdef NV_PRESERVES_UV
2231 | IS_NUMBER_NOT_INT
2232#endif
2233 )) == IS_NUMBER_IN_UV) {
2234 /* This won't turn off the public IOK flag if it was set above */
2235 (void)SvIOKp_on(sv);
2236
2237 if (!(numtype & IS_NUMBER_NEG)) {
2238 /* positive */;
2239 if (value <= (UV)IV_MAX) {
45977657 2240 SvIV_set(sv, (IV)value);
c2988b20 2241 } else {
607fa7f2 2242 SvUV_set(sv, value);
c2988b20
NC
2243 SvIsUV_on(sv);
2244 }
2245 } else {
2246 /* 2s complement assumption */
2247 if (value <= (UV)IV_MIN) {
45977657 2248 SvIV_set(sv, -(IV)value);
c2988b20
NC
2249 } else {
2250 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2251 I'm assuming it will be rare. */
c2988b20
NC
2252 if (SvTYPE(sv) < SVt_PVNV)
2253 sv_upgrade(sv, SVt_PVNV);
2254 SvNOK_on(sv);
2255 SvIOK_off(sv);
2256 SvIOKp_on(sv);
9d6ce603 2257 SvNV_set(sv, -(NV)value);
45977657 2258 SvIV_set(sv, IV_MIN);
c2988b20
NC
2259 }
2260 }
2261 }
2262 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2263 will be in the previous block to set the IV slot, and the next
2264 block to set the NV slot. So no else here. */
2265
2266 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2267 != IS_NUMBER_IN_UV) {
2268 /* It wasn't an (integer that doesn't overflow the UV). */
3f7c398e 2269 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8 2270
c2988b20
NC
2271 if (! numtype && ckWARN(WARN_NUMERIC))
2272 not_a_number(sv);
28e5dec8 2273
65202027 2274#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2275 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2276 PTR2UV(sv), SvNVX(sv)));
65202027 2277#else
1779d84d 2278 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 2279 PTR2UV(sv), SvNVX(sv)));
65202027 2280#endif
28e5dec8
JH
2281
2282
2283#ifdef NV_PRESERVES_UV
c2988b20
NC
2284 (void)SvIOKp_on(sv);
2285 (void)SvNOK_on(sv);
2286 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2287 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2288 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2289 SvIOK_on(sv);
28e5dec8 2290 } else {
c2988b20
NC
2291 /* Integer is imprecise. NOK, IOKp */
2292 }
2293 /* UV will not work better than IV */
2294 } else {
2295 if (SvNVX(sv) > (NV)UV_MAX) {
2296 SvIsUV_on(sv);
2297 /* Integer is inaccurate. NOK, IOKp, is UV */
607fa7f2 2298 SvUV_set(sv, UV_MAX);
c2988b20
NC
2299 SvIsUV_on(sv);
2300 } else {
607fa7f2 2301 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
2302 /* 0xFFFFFFFFFFFFFFFF not an issue in here */
2303 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2304 SvIOK_on(sv);
28e5dec8
JH
2305 SvIsUV_on(sv);
2306 } else {
c2988b20
NC
2307 /* Integer is imprecise. NOK, IOKp, is UV */
2308 SvIsUV_on(sv);
28e5dec8 2309 }
28e5dec8 2310 }
c2988b20
NC
2311 goto ret_iv_max;
2312 }
28e5dec8 2313#else /* NV_PRESERVES_UV */
c2988b20
NC
2314 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2315 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2316 /* The IV slot will have been set from value returned by
2317 grok_number above. The NV slot has just been set using
2318 Atof. */
560b0c46 2319 SvNOK_on(sv);
c2988b20
NC
2320 assert (SvIOKp(sv));
2321 } else {
2322 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2323 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2324 /* Small enough to preserve all bits. */
2325 (void)SvIOKp_on(sv);
2326 SvNOK_on(sv);
45977657 2327 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2328 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2329 SvIOK_on(sv);
2330 /* Assumption: first non-preserved integer is < IV_MAX,
2331 this NV is in the preserved range, therefore: */
2332 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2333 < (UV)IV_MAX)) {
32fdb065 2334 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
2335 }
2336 } else {
2337 /* IN_UV NOT_INT
2338 0 0 already failed to read UV.
2339 0 1 already failed to read UV.
2340 1 0 you won't get here in this case. IV/UV
2341 slot set, public IOK, Atof() unneeded.
2342 1 1 already read UV.
2343 so there's no point in sv_2iuv_non_preserve() attempting
2344 to use atol, strtol, strtoul etc. */
2345 if (sv_2iuv_non_preserve (sv, numtype)
2346 >= IS_NUMBER_OVERFLOW_IV)
2347 goto ret_iv_max;
2348 }
2349 }
28e5dec8 2350#endif /* NV_PRESERVES_UV */
25da4f38 2351 }
28e5dec8 2352 } else {
599cee73 2353 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 2354 report_uninit(sv);
25da4f38
IZ
2355 if (SvTYPE(sv) < SVt_IV)
2356 /* Typically the caller expects that sv_any is not NULL now. */
2357 sv_upgrade(sv, SVt_IV);
a0d0e21e 2358 return 0;
79072805 2359 }
1d7c1841
GS
2360 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2361 PTR2UV(sv),SvIVX(sv)));
25da4f38 2362 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
2363}
2364
891f9566
YST
2365/* sv_2uv() is now a macro using Perl_sv_2uv_flags();
2366 * this function provided for binary compatibility only
2367 */
2368
2369UV
2370Perl_sv_2uv(pTHX_ register SV *sv)
2371{
2372 return sv_2uv_flags(sv, SV_GMAGIC);
2373}
2374
645c22ef 2375/*
891f9566 2376=for apidoc sv_2uv_flags
645c22ef
DM
2377
2378Return the unsigned integer value of an SV, doing any necessary string
891f9566
YST
2379conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2380Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
645c22ef
DM
2381
2382=cut
2383*/
2384
ff68c719 2385UV
891f9566 2386Perl_sv_2uv_flags(pTHX_ register SV *sv, I32 flags)
ff68c719 2387{
2388 if (!sv)
2389 return 0;
2390 if (SvGMAGICAL(sv)) {
891f9566
YST
2391 if (flags & SV_GMAGIC)
2392 mg_get(sv);
ff68c719 2393 if (SvIOKp(sv))
2394 return SvUVX(sv);
2395 if (SvNOKp(sv))
2396 return U_V(SvNVX(sv));
36477c24 2397 if (SvPOKp(sv) && SvLEN(sv))
2398 return asUV(sv);
3fe9a6f1 2399 if (!SvROK(sv)) {
d008e5eb 2400 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2401 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 2402 report_uninit(sv);
c6ee37c5 2403 }
36477c24 2404 return 0;
3fe9a6f1 2405 }
ff68c719 2406 }
2407 if (SvTHINKFIRST(sv)) {
2408 if (SvROK(sv)) {
ff68c719 2409 SV* tmpstr;
1554e226 2410 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2411 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2412 return SvUV(tmpstr);
56431972 2413 return PTR2UV(SvRV(sv));
ff68c719 2414 }
765f542d
NC
2415 if (SvIsCOW(sv)) {
2416 sv_force_normal_flags(sv, 0);
8a818333 2417 }
0336b60e 2418 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2419 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2420 report_uninit(sv);
ff68c719 2421 return 0;
2422 }
2423 }
25da4f38
IZ
2424 if (SvIOKp(sv)) {
2425 if (SvIsUV(sv)) {
2426 return SvUVX(sv);
2427 }
2428 else {
2429 return (UV)SvIVX(sv);
2430 }
ff68c719 2431 }
2432 if (SvNOKp(sv)) {
28e5dec8
JH
2433 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2434 * without also getting a cached IV/UV from it at the same time
2435 * (ie PV->NV conversion should detect loss of accuracy and cache
2436 * IV or UV at same time to avoid this. */
2437 /* IV-over-UV optimisation - choose to cache IV if possible */
2438
25da4f38
IZ
2439 if (SvTYPE(sv) == SVt_NV)
2440 sv_upgrade(sv, SVt_PVNV);
28e5dec8
JH
2441
2442 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2443 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2444 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
2445 if (SvNVX(sv) == (NV) SvIVX(sv)
2446#ifndef NV_PRESERVES_UV
2447 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2448 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2449 /* Don't flag it as "accurately an integer" if the number
2450 came from a (by definition imprecise) NV operation, and
2451 we're outside the range of NV integer precision */
2452#endif
2453 ) {
2454 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2455 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2456 "0x%"UVxf" uv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2457 PTR2UV(sv),
2458 SvNVX(sv),
2459 SvIVX(sv)));
2460
2461 } else {
2462 /* IV not precise. No need to convert from PV, as NV
2463 conversion would already have cached IV if it detected
2464 that PV->IV would be better than PV->NV->IV
2465 flags already correct - don't set public IOK. */
2466 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2467 "0x%"UVxf" uv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2468 PTR2UV(sv),
2469 SvNVX(sv),
2470 SvIVX(sv)));
2471 }
2472 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2473 but the cast (NV)IV_MIN rounds to a the value less (more
2474 negative) than IV_MIN which happens to be equal to SvNVX ??
2475 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2476 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2477 (NV)UVX == NVX are both true, but the values differ. :-(
2478 Hopefully for 2s complement IV_MIN is something like
2479 0x8000000000000000 which will be exact. NWC */
d460ef45 2480 }
28e5dec8 2481 else {
607fa7f2 2482 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
2483 if (
2484 (SvNVX(sv) == (NV) SvUVX(sv))
2485#ifndef NV_PRESERVES_UV
2486 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2487 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2488 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2489 /* Don't flag it as "accurately an integer" if the number
2490 came from a (by definition imprecise) NV operation, and
2491 we're outside the range of NV integer precision */
2492#endif
2493 )
2494 SvIOK_on(sv);
2495 SvIsUV_on(sv);
1c846c1f 2496 DEBUG_c(PerlIO_printf(Perl_debug_log,
28e5dec8 2497 "0x%"UVxf" 2uv(%"UVuf" => %"IVdf") (as unsigned)\n",
57def98f 2498 PTR2UV(sv),
28e5dec8
JH
2499 SvUVX(sv),
2500 SvUVX(sv)));
25da4f38 2501 }
ff68c719 2502 }
2503 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2504 UV value;
504618e9 2505 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
25da4f38
IZ
2506
2507 /* We want to avoid a possible problem when we cache a UV which
2508 may be later translated to an NV, and the resulting NV is not
2509 the translation of the initial data.
1c846c1f 2510
25da4f38
IZ
2511 This means that if we cache such a UV, we need to cache the
2512 NV as well. Moreover, we trade speed for space, and do not
2513 cache the NV if not needed.
2514 */
16b7a9a4 2515
c2988b20
NC
2516 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2517 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2518 == IS_NUMBER_IN_UV) {
5e045b90 2519 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8 2520 if (SvTYPE(sv) < SVt_PVIV)
f7bbb42a
JH
2521 sv_upgrade(sv, SVt_PVIV);
2522 (void)SvIOK_on(sv);
c2988b20
NC
2523 } else if (SvTYPE(sv) < SVt_PVNV)
2524 sv_upgrade(sv, SVt_PVNV);
d460ef45 2525
c2988b20
NC
2526 /* If NV preserves UV then we only use the UV value if we know that
2527 we aren't going to call atof() below. If NVs don't preserve UVs
2528 then the value returned may have more precision than atof() will
2529 return, even though it isn't accurate. */
2530 if ((numtype & (IS_NUMBER_IN_UV
2531#ifdef NV_PRESERVES_UV
2532 | IS_NUMBER_NOT_INT
2533#endif
2534 )) == IS_NUMBER_IN_UV) {
2535 /* This won't turn off the public IOK flag if it was set above */
2536 (void)SvIOKp_on(sv);
2537
2538 if (!(numtype & IS_NUMBER_NEG)) {
2539 /* positive */;
2540 if (value <= (UV)IV_MAX) {
45977657 2541 SvIV_set(sv, (IV)value);
28e5dec8
JH
2542 } else {
2543 /* it didn't overflow, and it was positive. */
607fa7f2 2544 SvUV_set(sv, value);
28e5dec8
JH
2545 SvIsUV_on(sv);
2546 }
c2988b20
NC
2547 } else {
2548 /* 2s complement assumption */
2549 if (value <= (UV)IV_MIN) {
45977657 2550 SvIV_set(sv, -(IV)value);
c2988b20
NC
2551 } else {
2552 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2553 I'm assuming it will be rare. */
c2988b20
NC
2554 if (SvTYPE(sv) < SVt_PVNV)
2555 sv_upgrade(sv, SVt_PVNV);
2556 SvNOK_on(sv);
2557 SvIOK_off(sv);
2558 SvIOKp_on(sv);
9d6ce603 2559 SvNV_set(sv, -(NV)value);
45977657 2560 SvIV_set(sv, IV_MIN);
c2988b20
NC
2561 }
2562 }
2563 }
2564
2565 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2566 != IS_NUMBER_IN_UV) {
2567 /* It wasn't an integer, or it overflowed the UV. */
3f7c398e 2568 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8 2569
c2988b20 2570 if (! numtype && ckWARN(WARN_NUMERIC))
28e5dec8
JH
2571 not_a_number(sv);
2572
2573#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2574 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%" PERL_PRIgldbl ")\n",
2575 PTR2UV(sv), SvNVX(sv)));
28e5dec8 2576#else
1779d84d 2577 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"NVgf")\n",
c2988b20 2578 PTR2UV(sv), SvNVX(sv)));
28e5dec8
JH
2579#endif
2580
2581#ifdef NV_PRESERVES_UV
c2988b20
NC
2582 (void)SvIOKp_on(sv);
2583 (void)SvNOK_on(sv);
2584 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2585 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2586 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2587 SvIOK_on(sv);
2588 } else {
2589 /* Integer is imprecise. NOK, IOKp */
2590 }
2591 /* UV will not work better than IV */
2592 } else {
2593 if (SvNVX(sv) > (NV)UV_MAX) {
2594 SvIsUV_on(sv);
2595 /* Integer is inaccurate. NOK, IOKp, is UV */
607fa7f2 2596 SvUV_set(sv, UV_MAX);
c2988b20
NC
2597 SvIsUV_on(sv);
2598 } else {
607fa7f2 2599 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
2600 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2601 NV preservse UV so can do correct comparison. */
2602 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2603 SvIOK_on(sv);
2604 SvIsUV_on(sv);
2605 } else {
2606 /* Integer is imprecise. NOK, IOKp, is UV */
2607 SvIsUV_on(sv);
2608 }
2609 }
2610 }
28e5dec8 2611#else /* NV_PRESERVES_UV */
c2988b20
NC
2612 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2613 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2614 /* The UV slot will have been set from value returned by
2615 grok_number above. The NV slot has just been set using
2616 Atof. */
560b0c46 2617 SvNOK_on(sv);
c2988b20
NC
2618 assert (SvIOKp(sv));
2619 } else {
2620 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2621 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2622 /* Small enough to preserve all bits. */
2623 (void)SvIOKp_on(sv);
2624 SvNOK_on(sv);
45977657 2625 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2626 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2627 SvIOK_on(sv);
2628 /* Assumption: first non-preserved integer is < IV_MAX,
2629 this NV is in the preserved range, therefore: */
2630 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2631 < (UV)IV_MAX)) {
32fdb065 2632 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
2633 }
2634 } else
2635 sv_2iuv_non_preserve (sv, numtype);
2636 }
28e5dec8 2637#endif /* NV_PRESERVES_UV */
f7bbb42a 2638 }
ff68c719 2639 }
2640 else {
d008e5eb 2641 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2642 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 2643 report_uninit(sv);
c6ee37c5 2644 }
25da4f38
IZ
2645 if (SvTYPE(sv) < SVt_IV)
2646 /* Typically the caller expects that sv_any is not NULL now. */
2647 sv_upgrade(sv, SVt_IV);
ff68c719 2648 return 0;
2649 }
25da4f38 2650
1d7c1841
GS
2651 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2652 PTR2UV(sv),SvUVX(sv)));
25da4f38 2653 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 2654}
2655
645c22ef
DM
2656/*
2657=for apidoc sv_2nv
2658
2659Return the num value of an SV, doing any necessary string or integer
2660conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
2661macros.
2662
2663=cut
2664*/
2665
65202027 2666NV
864dbfa3 2667Perl_sv_2nv(pTHX_ register SV *sv)
79072805
LW
2668{
2669 if (!sv)
2670 return 0.0;
8990e307 2671 if (SvGMAGICAL(sv)) {
463ee0b2
LW
2672 mg_get(sv);
2673 if (SvNOKp(sv))
2674 return SvNVX(sv);
a0d0e21e 2675 if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2676 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) &&
504618e9 2677 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
a0d0e21e 2678 not_a_number(sv);
3f7c398e 2679 return Atof(SvPVX_const(sv));
a0d0e21e 2680 }
25da4f38 2681 if (SvIOKp(sv)) {
1c846c1f 2682 if (SvIsUV(sv))
65202027 2683 return (NV)SvUVX(sv);
25da4f38 2684 else
65202027 2685 return (NV)SvIVX(sv);
25da4f38 2686 }
16d20bd9 2687 if (!SvROK(sv)) {
d008e5eb 2688 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2689 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 2690 report_uninit(sv);
c6ee37c5 2691 }
66a1b24b 2692 return (NV)0;
16d20bd9 2693 }
463ee0b2 2694 }
ed6116ce 2695 if (SvTHINKFIRST(sv)) {
a0d0e21e 2696 if (SvROK(sv)) {
a0d0e21e 2697 SV* tmpstr;
1554e226 2698 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
b4b9a328 2699 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
9e7bc3e8 2700 return SvNV(tmpstr);
56431972 2701 return PTR2NV(SvRV(sv));
a0d0e21e 2702 }
765f542d
NC
2703 if (SvIsCOW(sv)) {
2704 sv_force_normal_flags(sv, 0);
8a818333 2705 }
0336b60e 2706 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 2707 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2708 report_uninit(sv);
ed6116ce
LW
2709 return 0.0;
2710 }
79072805
LW
2711 }
2712 if (SvTYPE(sv) < SVt_NV) {
463ee0b2
LW
2713 if (SvTYPE(sv) == SVt_IV)
2714 sv_upgrade(sv, SVt_PVNV);
2715 else
2716 sv_upgrade(sv, SVt_NV);
906f284f 2717#ifdef USE_LONG_DOUBLE
097ee67d 2718 DEBUG_c({
f93f4e46 2719 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2720 PerlIO_printf(Perl_debug_log,
2721 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2722 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2723 RESTORE_NUMERIC_LOCAL();
2724 });
65202027 2725#else
572bbb43 2726 DEBUG_c({
f93f4e46 2727 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2728 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 2729 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2730 RESTORE_NUMERIC_LOCAL();
2731 });
572bbb43 2732#endif
79072805
LW
2733 }
2734 else if (SvTYPE(sv) < SVt_PVNV)
2735 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
2736 if (SvNOKp(sv)) {
2737 return SvNVX(sv);
61604483 2738 }
59d8ce62 2739 if (SvIOKp(sv)) {
9d6ce603 2740 SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
28e5dec8
JH
2741#ifdef NV_PRESERVES_UV
2742 SvNOK_on(sv);
2743#else
2744 /* Only set the public NV OK flag if this NV preserves the IV */
2745 /* Check it's not 0xFFFFFFFFFFFFFFFF */
2746 if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2747 : (SvIVX(sv) == I_V(SvNVX(sv))))
2748 SvNOK_on(sv);
2749 else
2750 SvNOKp_on(sv);
2751#endif
93a17b20 2752 }
748a9306 2753 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2754 UV value;
3f7c398e 2755 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
c2988b20 2756 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !numtype)
a0d0e21e 2757 not_a_number(sv);
28e5dec8 2758#ifdef NV_PRESERVES_UV
c2988b20
NC
2759 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2760 == IS_NUMBER_IN_UV) {
5e045b90 2761 /* It's definitely an integer */
9d6ce603 2762 SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
c2988b20 2763 } else
3f7c398e 2764 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2765 SvNOK_on(sv);
2766#else
3f7c398e 2767 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2768 /* Only set the public NV OK flag if this NV preserves the value in
2769 the PV at least as well as an IV/UV would.
2770 Not sure how to do this 100% reliably. */
2771 /* if that shift count is out of range then Configure's test is
2772 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2773 UV_BITS */
2774 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 2775 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 2776 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
2777 } else if (!(numtype & IS_NUMBER_IN_UV)) {
2778 /* Can't use strtol etc to convert this string, so don't try.
2779 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
2780 SvNOK_on(sv);
2781 } else {
2782 /* value has been set. It may not be precise. */
2783 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2784 /* 2s complement assumption for (UV)IV_MIN */
2785 SvNOK_on(sv); /* Integer is too negative. */
2786 } else {
2787 SvNOKp_on(sv);
2788 SvIOKp_on(sv);
6fa402ec 2789
c2988b20 2790 if (numtype & IS_NUMBER_NEG) {
45977657 2791 SvIV_set(sv, -(IV)value);
c2988b20 2792 } else if (value <= (UV)IV_MAX) {
45977657 2793 SvIV_set(sv, (IV)value);
c2988b20 2794 } else {
607fa7f2 2795 SvUV_set(sv, value);
c2988b20
NC
2796 SvIsUV_on(sv);
2797 }
2798
2799 if (numtype & IS_NUMBER_NOT_INT) {
2800 /* I believe that even if the original PV had decimals,
2801 they are lost beyond the limit of the FP precision.
2802 However, neither is canonical, so both only get p
2803 flags. NWC, 2000/11/25 */
2804 /* Both already have p flags, so do nothing */
2805 } else {
66a1b24b 2806 const NV nv = SvNVX(sv);
c2988b20
NC
2807 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2808 if (SvIVX(sv) == I_V(nv)) {
2809 SvNOK_on(sv);
2810 SvIOK_on(sv);
2811 } else {
2812 SvIOK_on(sv);
2813 /* It had no "." so it must be integer. */
2814 }
2815 } else {
2816 /* between IV_MAX and NV(UV_MAX).
2817 Could be slightly > UV_MAX */
6fa402ec 2818
c2988b20
NC
2819 if (numtype & IS_NUMBER_NOT_INT) {
2820 /* UV and NV both imprecise. */
2821 } else {
66a1b24b 2822 const UV nv_as_uv = U_V(nv);
c2988b20
NC
2823
2824 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2825 SvNOK_on(sv);
2826 SvIOK_on(sv);
2827 } else {
2828 SvIOK_on(sv);
2829 }
2830 }
2831 }
2832 }
2833 }
2834 }
28e5dec8 2835#endif /* NV_PRESERVES_UV */
93a17b20 2836 }
79072805 2837 else {
599cee73 2838 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 2839 report_uninit(sv);
25da4f38
IZ
2840 if (SvTYPE(sv) < SVt_NV)
2841 /* Typically the caller expects that sv_any is not NULL now. */
28e5dec8
JH
2842 /* XXX Ilya implies that this is a bug in callers that assume this
2843 and ideally should be fixed. */
25da4f38 2844 sv_upgrade(sv, SVt_NV);
a0d0e21e 2845 return 0.0;
79072805 2846 }
572bbb43 2847#if defined(USE_LONG_DOUBLE)
097ee67d 2848 DEBUG_c({
f93f4e46 2849 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2850 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2851 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2852 RESTORE_NUMERIC_LOCAL();
2853 });
65202027 2854#else
572bbb43 2855 DEBUG_c({
f93f4e46 2856 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2857 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 2858 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2859 RESTORE_NUMERIC_LOCAL();
2860 });
572bbb43 2861#endif
463ee0b2 2862 return SvNVX(sv);
79072805
LW
2863}
2864
645c22ef
DM
2865/* asIV(): extract an integer from the string value of an SV.
2866 * Caller must validate PVX */
2867
76e3520e 2868STATIC IV
cea2e8a9 2869S_asIV(pTHX_ SV *sv)
36477c24 2870{
c2988b20 2871 UV value;
66a1b24b 2872 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
c2988b20
NC
2873
2874 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2875 == IS_NUMBER_IN_UV) {
645c22ef 2876 /* It's definitely an integer */
c2988b20
NC
2877 if (numtype & IS_NUMBER_NEG) {
2878 if (value < (UV)IV_MIN)
2879 return -(IV)value;
2880 } else {
2881 if (value < (UV)IV_MAX)
2882 return (IV)value;
2883 }
2884 }
d008e5eb 2885 if (!numtype) {
d008e5eb
GS
2886 if (ckWARN(WARN_NUMERIC))
2887 not_a_number(sv);
2888 }
3f7c398e 2889 return I_V(Atof(SvPVX_const(sv)));
36477c24 2890}
2891
645c22ef
DM
2892/* asUV(): extract an unsigned integer from the string value of an SV
2893 * Caller must validate PVX */
2894
76e3520e 2895STATIC UV
cea2e8a9 2896S_asUV(pTHX_ SV *sv)
36477c24 2897{
c2988b20 2898 UV value;
504618e9 2899 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
36477c24 2900
c2988b20
NC
2901 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2902 == IS_NUMBER_IN_UV) {
645c22ef 2903 /* It's definitely an integer */
6fa402ec 2904 if (!(numtype & IS_NUMBER_NEG))
c2988b20
NC
2905 return value;
2906 }
d008e5eb 2907 if (!numtype) {
d008e5eb
GS
2908 if (ckWARN(WARN_NUMERIC))
2909 not_a_number(sv);
2910 }
3f7c398e 2911 return U_V(Atof(SvPVX_const(sv)));
36477c24 2912}
2913
645c22ef
DM
2914/*
2915=for apidoc sv_2pv_nolen
2916
2917Like C<sv_2pv()>, but doesn't return the length too. You should usually
2918use the macro wrapper C<SvPV_nolen(sv)> instead.
2919=cut
2920*/
2921
79072805 2922char *
864dbfa3 2923Perl_sv_2pv_nolen(pTHX_ register SV *sv)
1fa8b10d 2924{
dafda6d1 2925 return sv_2pv(sv, 0);
1fa8b10d
JD
2926}
2927
645c22ef
DM
2928/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2929 * UV as a string towards the end of buf, and return pointers to start and
2930 * end of it.
2931 *
2932 * We assume that buf is at least TYPE_CHARS(UV) long.
2933 */
2934
864dbfa3 2935static char *
25da4f38
IZ
2936uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
2937{
25da4f38
IZ
2938 char *ptr = buf + TYPE_CHARS(UV);
2939 char *ebuf = ptr;
2940 int sign;
25da4f38
IZ
2941
2942 if (is_uv)
2943 sign = 0;
2944 else if (iv >= 0) {
2945 uv = iv;
2946 sign = 0;
2947 } else {
2948 uv = -iv;
2949 sign = 1;
2950 }
2951 do {
eb160463 2952 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
2953 } while (uv /= 10);
2954 if (sign)
2955 *--ptr = '-';
2956 *peob = ebuf;
2957 return ptr;
2958}
2959
09540bc3
JH
2960/* sv_2pv() is now a macro using Perl_sv_2pv_flags();
2961 * this function provided for binary compatibility only
2962 */
2963
2964char *
2965Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
2966{
2967 return sv_2pv_flags(sv, lp, SV_GMAGIC);
2968}
2969
645c22ef
DM
2970/*
2971=for apidoc sv_2pv_flags
2972
ff276b08 2973Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
2974If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2975if necessary.
2976Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2977usually end up here too.
2978
2979=cut
2980*/
2981
8d6d96c1
HS
2982char *
2983Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
2984{
79072805
LW
2985 register char *s;
2986 int olderrno;
cb50f42d 2987 SV *tsv, *origsv;
25da4f38
IZ
2988 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
2989 char *tmpbuf = tbuf;
79072805 2990
463ee0b2 2991 if (!sv) {
cdb061a3
NC
2992 if (lp)
2993 *lp = 0;
73d840c0 2994 return (char *)"";
463ee0b2 2995 }
8990e307 2996 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
2997 if (flags & SV_GMAGIC)
2998 mg_get(sv);
463ee0b2 2999 if (SvPOKp(sv)) {
cdb061a3
NC
3000 if (lp)
3001 *lp = SvCUR(sv);
10516c54
NC
3002 if (flags & SV_MUTABLE_RETURN)
3003 return SvPVX_mutable(sv);
4d84ee25
NC
3004 if (flags & SV_CONST_RETURN)
3005 return (char *)SvPVX_const(sv);
463ee0b2
LW
3006 return SvPVX(sv);
3007 }
cf2093f6 3008 if (SvIOKp(sv)) {
1c846c1f 3009 if (SvIsUV(sv))
57def98f 3010 (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
cf2093f6 3011 else
57def98f 3012 (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
46fc3d4c 3013 tsv = Nullsv;
a0d0e21e 3014 goto tokensave;
463ee0b2
LW
3015 }
3016 if (SvNOKp(sv)) {
2d4389e4 3017 Gconvert(SvNVX(sv), NV_DIG, 0, tmpbuf);
46fc3d4c 3018 tsv = Nullsv;
a0d0e21e 3019 goto tokensave;
463ee0b2 3020 }
16d20bd9 3021 if (!SvROK(sv)) {
d008e5eb 3022 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 3023 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
29489e7c 3024 report_uninit(sv);
c6ee37c5 3025 }
cdb061a3
NC
3026 if (lp)
3027 *lp = 0;
73d840c0 3028 return (char *)"";
16d20bd9 3029 }
463ee0b2 3030 }
ed6116ce
LW
3031 if (SvTHINKFIRST(sv)) {
3032 if (SvROK(sv)) {
a0d0e21e 3033 SV* tmpstr;
e1ec3a88 3034 register const char *typestr;
1554e226 3035 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)) &&
b4b9a328 3036 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
50adf7d2
NC
3037 /* Unwrap this: */
3038 /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr); */
3039
3040 char *pv;
3041 if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
3042 if (flags & SV_CONST_RETURN) {
3043 pv = (char *) SvPVX_const(tmpstr);
3044 } else {
3045 pv = (flags & SV_MUTABLE_RETURN)
3046 ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
3047 }
3048 if (lp)
3049 *lp = SvCUR(tmpstr);
3050 } else {
3051 pv = sv_2pv_flags(tmpstr, lp, flags);
3052 }
446eaa42
YST
3053 if (SvUTF8(tmpstr))
3054 SvUTF8_on(sv);
3055 else
3056 SvUTF8_off(sv);
3057 return pv;
3058 }
cb50f42d 3059 origsv = sv;
ed6116ce
LW
3060 sv = (SV*)SvRV(sv);
3061 if (!sv)
e1ec3a88 3062 typestr = "NULLREF";
ed6116ce 3063 else {
f9277f47
IZ
3064 MAGIC *mg;
3065
ed6116ce 3066 switch (SvTYPE(sv)) {
f9277f47
IZ
3067 case SVt_PVMG:
3068 if ( ((SvFLAGS(sv) &
1c846c1f 3069 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
faf82a0b 3070 == (SVs_OBJECT|SVs_SMG))
14befaf4 3071 && (mg = mg_find(sv, PERL_MAGIC_qr))) {
e1ec3a88 3072 const regexp *re = (regexp *)mg->mg_obj;
1bd3ad17 3073
2cd61cdb 3074 if (!mg->mg_ptr) {
e1ec3a88 3075 const char *fptr = "msix";
8782bef2
GB
3076 char reflags[6];
3077 char ch;
3078 int left = 0;
3079 int right = 4;
ff385a1b 3080 char need_newline = 0;
eb160463 3081 U16 reganch = (U16)((re->reganch & PMf_COMPILETIME) >> 12);
8782bef2 3082
155aba94 3083 while((ch = *fptr++)) {
8782bef2
GB
3084 if(reganch & 1) {
3085 reflags[left++] = ch;
3086 }
3087 else {
3088 reflags[right--] = ch;
3089 }
3090 reganch >>= 1;
3091 }
3092 if(left != 4) {
3093 reflags[left] = '-';
3094 left = 5;
3095 }
3096
3097 mg->mg_len = re->prelen + 4 + left;
ff385a1b
JF
3098 /*
3099 * If /x was used, we have to worry about a regex
3100 * ending with a comment later being embedded
3101 * within another regex. If so, we don't want this
3102 * regex's "commentization" to leak out to the
3103 * right part of the enclosing regex, we must cap
3104 * it with a newline.
3105 *
3106 * So, if /x was used, we scan backwards from the
3107 * end of the regex. If we find a '#' before we
3108 * find a newline, we need to add a newline
3109 * ourself. If we find a '\n' first (or if we
3110 * don't find '#' or '\n'), we don't need to add
3111 * anything. -jfriedl
3112 */
3113 if (PMf_EXTENDED & re->reganch)
3114 {
e1ec3a88 3115 const char *endptr = re->precomp + re->prelen;
ff385a1b
JF
3116 while (endptr >= re->precomp)
3117 {
e1ec3a88 3118 const char c = *(endptr--);
ff385a1b
JF
3119 if (c == '\n')
3120 break; /* don't need another */
3121 if (c == '#') {
3122 /* we end while in a comment, so we
3123 need a newline */
3124 mg->mg_len++; /* save space for it */
3125 need_newline = 1; /* note to add it */
ab01544f 3126 break;
ff385a1b
JF
3127 }
3128 }
3129 }
3130
8782bef2
GB
3131 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
3132 Copy("(?", mg->mg_ptr, 2, char);
3133 Copy(reflags, mg->mg_ptr+2, left, char);
3134 Copy(":", mg->mg_ptr+left+2, 1, char);
3135 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
ff385a1b
JF
3136 if (need_newline)
3137 mg->mg_ptr[mg->mg_len - 2] = '\n';
1bd3ad17
IZ
3138 mg->mg_ptr[mg->mg_len - 1] = ')';
3139 mg->mg_ptr[mg->mg_len] = 0;
3140 }
3280af22 3141 PL_reginterp_cnt += re->program[0].next_off;
cb50f42d
YST
3142
3143 if (re->reganch & ROPT_UTF8)
3144 SvUTF8_on(origsv);
3145 else
3146 SvUTF8_off(origsv);
cdb061a3
NC
3147 if (lp)
3148 *lp = mg->mg_len;
1bd3ad17 3149 return mg->mg_ptr;
f9277f47
IZ
3150 }
3151 /* Fall through */
ed6116ce
LW
3152 case SVt_NULL:
3153 case SVt_IV:
3154 case SVt_NV:
3155 case SVt_RV:
3156 case SVt_PV:
3157 case SVt_PVIV:
3158 case SVt_PVNV:
e1ec3a88
AL
3159 case SVt_PVBM: typestr = SvROK(sv) ? "REF" : "SCALAR"; break;
3160 case SVt_PVLV: typestr = SvROK(sv) ? "REF"
be65207d
DM
3161 /* tied lvalues should appear to be
3162 * scalars for backwards compatitbility */
3163 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
3164 ? "SCALAR" : "LVALUE"; break;
e1ec3a88
AL
3165 case SVt_PVAV: typestr = "ARRAY"; break;
3166 case SVt_PVHV: typestr = "HASH"; break;
3167 case SVt_PVCV: typestr = "CODE"; break;
3168 case SVt_PVGV: typestr = "GLOB"; break;
3169 case SVt_PVFM: typestr = "FORMAT"; break;
3170 case SVt_PVIO: typestr = "IO"; break;
3171 default: typestr = "UNKNOWN"; break;
ed6116ce 3172 }
46fc3d4c 3173 tsv = NEWSV(0,0);
a5cb6b62 3174 if (SvOBJECT(sv)) {
bfcb3514 3175 const char *name = HvNAME_get(SvSTASH(sv));
a5cb6b62 3176 Perl_sv_setpvf(aTHX_ tsv, "%s=%s(0x%"UVxf")",
e1ec3a88 3177 name ? name : "__ANON__" , typestr, PTR2UV(sv));
a5cb6b62 3178 }
ed6116ce 3179 else
e1ec3a88 3180 Perl_sv_setpvf(aTHX_ tsv, "%s(0x%"UVxf")", typestr, PTR2UV(sv));
a0d0e21e 3181 goto tokensaveref;
463ee0b2 3182 }
cdb061a3
NC
3183 if (lp)
3184 *lp = strlen(typestr);
73d840c0 3185 return (char *)typestr;
79072805 3186 }
0336b60e 3187 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 3188 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 3189 report_uninit(sv);
cdb061a3
NC
3190 if (lp)
3191 *lp = 0;
73d840c0 3192 return (char *)"";
79072805 3193 }
79072805 3194 }
28e5dec8
JH
3195 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
3196 /* I'm assuming that if both IV and NV are equally valid then
3197 converting the IV is going to be more efficient */
e1ec3a88
AL
3198 const U32 isIOK = SvIOK(sv);
3199 const U32 isUIOK = SvIsUV(sv);
28e5dec8
JH
3200 char buf[TYPE_CHARS(UV)];
3201 char *ebuf, *ptr;
3202
3203 if (SvTYPE(sv) < SVt_PVIV)
3204 sv_upgrade(sv, SVt_PVIV);
3205 if (isUIOK)
3206 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
3207 else
3208 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
5902b6a9
NC
3209 /* inlined from sv_setpvn */
3210 SvGROW_mutable(sv, (STRLEN)(ebuf - ptr + 1));
4d84ee25 3211 Move(ptr,SvPVX_mutable(sv),ebuf - ptr,char);
28e5dec8
JH
3212 SvCUR_set(sv, ebuf - ptr);
3213 s = SvEND(sv);
3214 *s = '\0';
3215 if (isIOK)
3216 SvIOK_on(sv);
3217 else
3218 SvIOKp_on(sv);
3219 if (isUIOK)
3220 SvIsUV_on(sv);
3221 }
3222 else if (SvNOKp(sv)) {
79072805
LW
3223 if (SvTYPE(sv) < SVt_PVNV)
3224 sv_upgrade(sv, SVt_PVNV);
1c846c1f 3225 /* The +20 is pure guesswork. Configure test needed. --jhi */
5902b6a9 3226 s = SvGROW_mutable(sv, NV_DIG + 20);
79072805 3227 olderrno = errno; /* some Xenix systems wipe out errno here */
79072805 3228#ifdef apollo
463ee0b2 3229 if (SvNVX(sv) == 0.0)
79072805
LW
3230 (void)strcpy(s,"0");
3231 else
3232#endif /*apollo*/
bbce6d69 3233 {
2d4389e4 3234 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 3235 }
79072805 3236 errno = olderrno;
a0d0e21e
LW
3237#ifdef FIXNEGATIVEZERO
3238 if (*s == '-' && s[1] == '0' && !s[2])
3239 strcpy(s,"0");
3240#endif
79072805
LW
3241 while (*s) s++;
3242#ifdef hcx
3243 if (s[-1] == '.')
46fc3d4c 3244 *--s = '\0';
79072805
LW
3245#endif
3246 }
79072805 3247 else {
0336b60e
IZ
3248 if (ckWARN(WARN_UNINITIALIZED)
3249 && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
29489e7c 3250 report_uninit(sv);
cdb061a3 3251 if (lp)
a0d0e21e 3252 *lp = 0;
25da4f38
IZ
3253 if (SvTYPE(sv) < SVt_PV)
3254 /* Typically the caller expects that sv_any is not NULL now. */
3255 sv_upgrade(sv, SVt_PV);
73d840c0 3256 return (char *)"";
79072805 3257 }
cdb061a3
NC
3258 {
3259 STRLEN len = s - SvPVX_const(sv);
3260 if (lp)
3261 *lp = len;
3262 SvCUR_set(sv, len);
3263 }
79072805 3264 SvPOK_on(sv);
1d7c1841 3265 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 3266 PTR2UV(sv),SvPVX_const(sv)));
4d84ee25
NC
3267 if (flags & SV_CONST_RETURN)
3268 return (char *)SvPVX_const(sv);
10516c54
NC
3269 if (flags & SV_MUTABLE_RETURN)
3270 return SvPVX_mutable(sv);
463ee0b2 3271 return SvPVX(sv);
a0d0e21e
LW
3272
3273 tokensave:
3274 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
3275 /* Sneaky stuff here */
3276
3277 tokensaveref:
46fc3d4c 3278 if (!tsv)
96827780 3279 tsv = newSVpv(tmpbuf, 0);
46fc3d4c 3280 sv_2mortal(tsv);
cdb061a3
NC
3281 if (lp)
3282 *lp = SvCUR(tsv);
46fc3d4c 3283 return SvPVX(tsv);
a0d0e21e
LW
3284 }
3285 else {
27da23d5 3286 dVAR;
a0d0e21e 3287 STRLEN len;
73d840c0 3288 const char *t;
46fc3d4c 3289
3290 if (tsv) {
3291 sv_2mortal(tsv);
3f7c398e 3292 t = SvPVX_const(tsv);
46fc3d4c 3293 len = SvCUR(tsv);
3294 }
3295 else {
96827780
MB
3296 t = tmpbuf;
3297 len = strlen(tmpbuf);
46fc3d4c 3298 }
a0d0e21e 3299#ifdef FIXNEGATIVEZERO
46fc3d4c 3300 if (len == 2 && t[0] == '-' && t[1] == '0') {
3301 t = "0";
3302 len = 1;
3303 }
a0d0e21e 3304#endif
862a34c6 3305 SvUPGRADE(sv, SVt_PV);
cdb061a3
NC
3306 if (lp)
3307 *lp = len;
5902b6a9 3308 s = SvGROW_mutable(sv, len + 1);
a0d0e21e 3309 SvCUR_set(sv, len);
6bf554b4 3310 SvPOKp_on(sv);
e90e2364 3311 return strcpy(s, t);
a0d0e21e 3312 }
463ee0b2
LW
3313}
3314
645c22ef 3315/*
6050d10e
JP
3316=for apidoc sv_copypv
3317
3318Copies a stringified representation of the source SV into the
3319destination SV. Automatically performs any necessary mg_get and
54f0641b 3320coercion of numeric values into strings. Guaranteed to preserve
6050d10e 3321UTF-8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
3322sv_2pv[_flags] but operates directly on an SV instead of just the
3323string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
3324would lose the UTF-8'ness of the PV.
3325
3326=cut
3327*/
3328
3329void
3330Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
3331{
446eaa42 3332 STRLEN len;
53c1dcc0 3333 const char * const s = SvPV_const(ssv,len);
cb50f42d 3334 sv_setpvn(dsv,s,len);
446eaa42 3335 if (SvUTF8(ssv))
cb50f42d 3336 SvUTF8_on(dsv);
446eaa42 3337 else
cb50f42d 3338 SvUTF8_off(dsv);
6050d10e
JP
3339}
3340
3341/*
645c22ef
DM
3342=for apidoc sv_2pvbyte_nolen
3343
3344Return a pointer to the byte-encoded representation of the SV.
1e54db1a 3345May cause the SV to be downgraded from UTF-8 as a side-effect.
645c22ef
DM
3346
3347Usually accessed via the C<SvPVbyte_nolen> macro.
3348
3349=cut
3350*/
3351
7340a771
GS
3352char *
3353Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
3354{
dafda6d1 3355 return sv_2pvbyte(sv, 0);
7340a771
GS
3356}
3357
645c22ef
DM
3358/*
3359=for apidoc sv_2pvbyte
3360
3361Return a pointer to the byte-encoded representation of the SV, and set *lp
1e54db1a 3362to its length. May cause the SV to be downgraded from UTF-8 as a
645c22ef
DM
3363side-effect.
3364
3365Usually accessed via the C<SvPVbyte> macro.
3366
3367=cut
3368*/
3369
7340a771
GS
3370char *
3371Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
3372{
0875d2fe 3373 sv_utf8_downgrade(sv,0);
97972285 3374 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771
GS
3375}
3376
645c22ef
DM
3377/*
3378=for apidoc sv_2pvutf8_nolen
3379
1e54db1a
JH
3380Return a pointer to the UTF-8-encoded representation of the SV.
3381May cause the SV to be upgraded to UTF-8 as a side-effect.
645c22ef
DM
3382
3383Usually accessed via the C<SvPVutf8_nolen> macro.
3384
3385=cut
3386*/
3387
7340a771
GS
3388char *
3389Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
3390{
dafda6d1 3391 return sv_2pvutf8(sv, 0);
7340a771
GS
3392}
3393
645c22ef
DM
3394/*
3395=for apidoc sv_2pvutf8
3396
1e54db1a
JH
3397Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3398to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
645c22ef
DM
3399
3400Usually accessed via the C<SvPVutf8> macro.
3401
3402=cut
3403*/
3404
7340a771
GS
3405char *
3406Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
3407{
560a288e 3408 sv_utf8_upgrade(sv);
7d59b7e4 3409 return SvPV(sv,*lp);
7340a771 3410}
1c846c1f 3411
645c22ef
DM
3412/*
3413=for apidoc sv_2bool
3414
3415This function is only called on magical items, and is only used by
8cf8f3d1 3416sv_true() or its macro equivalent.
645c22ef
DM
3417
3418=cut
3419*/
3420
463ee0b2 3421bool
864dbfa3 3422Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 3423{
8990e307 3424 if (SvGMAGICAL(sv))
463ee0b2
LW
3425 mg_get(sv);
3426
a0d0e21e
LW
3427 if (!SvOK(sv))
3428 return 0;
3429 if (SvROK(sv)) {
a0d0e21e 3430 SV* tmpsv;
1554e226 3431 if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
9e3013b1 3432 (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
8a31060d 3433 return (bool)SvTRUE(tmpsv);
a0d0e21e
LW
3434 return SvRV(sv) != 0;
3435 }
463ee0b2 3436 if (SvPOKp(sv)) {
53c1dcc0
AL
3437 register XPV* const Xpvtmp = (XPV*)SvANY(sv);
3438 if (Xpvtmp &&
339049b0 3439 (*sv->sv_u.svu_pv > '0' ||
11343788 3440 Xpvtmp->xpv_cur > 1 ||
339049b0 3441 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
463ee0b2
LW
3442 return 1;
3443 else
3444 return 0;
3445 }
3446 else {
3447 if (SvIOKp(sv))
3448 return SvIVX(sv) != 0;
3449 else {
3450 if (SvNOKp(sv))
3451 return SvNVX(sv) != 0.0;
3452 else
3453 return FALSE;
3454 }
3455 }
79072805
LW
3456}
3457
09540bc3
JH
3458/* sv_utf8_upgrade() is now a macro using sv_utf8_upgrade_flags();
3459 * this function provided for binary compatibility only
3460 */
3461
3462
3463STRLEN
3464Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
3465{
3466 return sv_utf8_upgrade_flags(sv, SV_GMAGIC);
3467}
3468
c461cf8f
JH
3469/*
3470=for apidoc sv_utf8_upgrade
3471
78ea37eb 3472Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3473Forces the SV to string form if it is not already.
4411f3b6
NIS
3474Always sets the SvUTF8 flag to avoid future validity checks even
3475if all the bytes have hibit clear.
c461cf8f 3476
13a6c0e0
JH
3477This is not as a general purpose byte encoding to Unicode interface:
3478use the Encode extension for that.
3479
8d6d96c1
HS
3480=for apidoc sv_utf8_upgrade_flags
3481
78ea37eb 3482Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3483Forces the SV to string form if it is not already.
8d6d96c1
HS
3484Always sets the SvUTF8 flag to avoid future validity checks even
3485if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
3486will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
3487C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3488
13a6c0e0
JH
3489This is not as a general purpose byte encoding to Unicode interface:
3490use the Encode extension for that.
3491
8d6d96c1
HS
3492=cut
3493*/
3494
3495STRLEN
3496Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
3497{
808c356f
RGS
3498 if (sv == &PL_sv_undef)
3499 return 0;
e0e62c2a
NIS
3500 if (!SvPOK(sv)) {
3501 STRLEN len = 0;
d52b7888
NC
3502 if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3503 (void) sv_2pv_flags(sv,&len, flags);
3504 if (SvUTF8(sv))
3505 return len;
3506 } else {
3507 (void) SvPV_force(sv,len);
3508 }
e0e62c2a 3509 }
4411f3b6 3510
f5cee72b 3511 if (SvUTF8(sv)) {
5fec3b1d 3512 return SvCUR(sv);
f5cee72b 3513 }
5fec3b1d 3514
765f542d
NC
3515 if (SvIsCOW(sv)) {
3516 sv_force_normal_flags(sv, 0);
db42d148
NIS
3517 }
3518
88632417 3519 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
799ef3cb 3520 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 3521 else { /* Assume Latin-1/EBCDIC */
c4e7c712
NC
3522 /* This function could be much more efficient if we
3523 * had a FLAG in SVs to signal if there are any hibit
3524 * chars in the PV. Given that there isn't such a flag
3525 * make the loop as fast as possible. */
93524f2b
NC
3526 const U8 *s = (U8 *) SvPVX_const(sv);
3527 const U8 *e = (U8 *) SvEND(sv);
3528 const U8 *t = s;
c4e7c712
NC
3529 int hibit = 0;
3530
3531 while (t < e) {
53c1dcc0 3532 const U8 ch = *t++;
c4e7c712
NC
3533 if ((hibit = !NATIVE_IS_INVARIANT(ch)))
3534 break;
3535 }
3536 if (hibit) {
3537 STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
53c1dcc0 3538 U8 * const recoded = bytes_to_utf8((U8*)s, &len);
c4e7c712
NC
3539
3540 SvPV_free(sv); /* No longer using what was there before. */
3541
1e2ebb21 3542 SvPV_set(sv, (char*)recoded);
c4e7c712
NC
3543 SvCUR_set(sv, len - 1);
3544 SvLEN_set(sv, len); /* No longer know the real size. */
3545 }
3546 /* Mark as UTF-8 even if no hibit - saves scanning loop */
3547 SvUTF8_on(sv);
560a288e 3548 }
4411f3b6 3549 return SvCUR(sv);
560a288e
GS
3550}
3551
c461cf8f
JH
3552/*
3553=for apidoc sv_utf8_downgrade
3554
78ea37eb
TS
3555Attempts to convert the PV of an SV from characters to bytes.
3556If the PV contains a character beyond byte, this conversion will fail;
3557in this case, either returns false or, if C<fail_ok> is not
c461cf8f
JH
3558true, croaks.
3559
13a6c0e0
JH
3560This is not as a general purpose Unicode to byte encoding interface:
3561use the Encode extension for that.
3562
c461cf8f
JH
3563=cut
3564*/
3565
560a288e
GS
3566bool
3567Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
3568{
78ea37eb 3569 if (SvPOKp(sv) && SvUTF8(sv)) {
fa301091 3570 if (SvCUR(sv)) {
03cfe0ae 3571 U8 *s;
652088fc 3572 STRLEN len;
fa301091 3573
765f542d
NC
3574 if (SvIsCOW(sv)) {
3575 sv_force_normal_flags(sv, 0);
3576 }
03cfe0ae
NIS
3577 s = (U8 *) SvPV(sv, len);
3578 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
3579 if (fail_ok)
3580 return FALSE;
3581 else {
3582 if (PL_op)
3583 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 3584 OP_DESC(PL_op));
fa301091
JH
3585 else
3586 Perl_croak(aTHX_ "Wide character");
3587 }
4b3603a4 3588 }
b162af07 3589 SvCUR_set(sv, len);
67e989fb 3590 }
560a288e 3591 }
ffebcc3e 3592 SvUTF8_off(sv);
560a288e
GS
3593 return TRUE;
3594}
3595
c461cf8f
JH
3596/*
3597=for apidoc sv_utf8_encode
3598
78ea37eb
TS
3599Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3600flag off so that it looks like octets again.
c461cf8f
JH
3601
3602=cut
3603*/
3604
560a288e
GS
3605void
3606Perl_sv_utf8_encode(pTHX_ register SV *sv)
3607{
4411f3b6 3608 (void) sv_utf8_upgrade(sv);
4c94c214
NC
3609 if (SvIsCOW(sv)) {
3610 sv_force_normal_flags(sv, 0);
3611 }
3612 if (SvREADONLY(sv)) {
3613 Perl_croak(aTHX_ PL_no_modify);
3614 }
560a288e
GS
3615 SvUTF8_off(sv);
3616}
3617
4411f3b6
NIS
3618/*
3619=for apidoc sv_utf8_decode
3620
78ea37eb
TS
3621If the PV of the SV is an octet sequence in UTF-8
3622and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3623so that it looks like a character. If the PV contains only single-byte
3624characters, the C<SvUTF8> flag stays being off.
3625Scans PV for validity and returns false if the PV is invalid UTF-8.
4411f3b6
NIS
3626
3627=cut
3628*/
3629
560a288e
GS
3630bool
3631Perl_sv_utf8_decode(pTHX_ register SV *sv)
3632{
78ea37eb 3633 if (SvPOKp(sv)) {
93524f2b
NC
3634 const U8 *c;
3635 const U8 *e;
9cbac4c7 3636
645c22ef
DM
3637 /* The octets may have got themselves encoded - get them back as
3638 * bytes
3639 */
3640 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
3641 return FALSE;
3642
3643 /* it is actually just a matter of turning the utf8 flag on, but
3644 * we want to make sure everything inside is valid utf8 first.
3645 */
93524f2b 3646 c = (const U8 *) SvPVX_const(sv);
63cd0674 3647 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 3648 return FALSE;
93524f2b 3649 e = (const U8 *) SvEND(sv);
511c2ff0 3650 while (c < e) {
c4d5f83a
NIS
3651 U8 ch = *c++;
3652 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
3653 SvUTF8_on(sv);
3654 break;
3655 }
560a288e 3656 }
560a288e
GS
3657 }
3658 return TRUE;
3659}
3660
09540bc3
JH
3661/* sv_setsv() is now a macro using Perl_sv_setsv_flags();
3662 * this function provided for binary compatibility only
3663 */
3664
3665void
3666Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
3667{
3668 sv_setsv_flags(dstr, sstr, SV_GMAGIC);
3669}
3670
954c1994
GS
3671/*
3672=for apidoc sv_setsv
3673
645c22ef
DM
3674Copies the contents of the source SV C<ssv> into the destination SV
3675C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3676function if the source SV needs to be reused. Does not handle 'set' magic.
3677Loosely speaking, it performs a copy-by-value, obliterating any previous
3678content of the destination.
3679
3680You probably want to use one of the assortment of wrappers, such as
3681C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3682C<SvSetMagicSV_nosteal>.
3683
8d6d96c1
HS
3684=for apidoc sv_setsv_flags
3685
645c22ef
DM
3686Copies the contents of the source SV C<ssv> into the destination SV
3687C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3688function if the source SV needs to be reused. Does not handle 'set' magic.
3689Loosely speaking, it performs a copy-by-value, obliterating any previous
3690content of the destination.
3691If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
5fcdf167
NC
3692C<ssv> if appropriate, else not. If the C<flags> parameter has the
3693C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
3694and C<sv_setsv_nomg> are implemented in terms of this function.
645c22ef
DM
3695
3696You probably want to use one of the assortment of wrappers, such as
3697C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3698C<SvSetMagicSV_nosteal>.
3699
3700This is the primary function for copying scalars, and most other
3701copy-ish functions and macros use this underneath.
8d6d96c1
HS
3702
3703=cut
3704*/
3705
3706void
3707Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
3708{
8990e307
LW
3709 register U32 sflags;
3710 register int dtype;
3711 register int stype;
463ee0b2 3712
79072805
LW
3713 if (sstr == dstr)
3714 return;
765f542d 3715 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 3716 if (!sstr)
3280af22 3717 sstr = &PL_sv_undef;
8990e307
LW
3718 stype = SvTYPE(sstr);
3719 dtype = SvTYPE(dstr);
79072805 3720
a0d0e21e 3721 SvAMAGIC_off(dstr);
7a5fa8a2 3722 if ( SvVOK(dstr) )
ece467f9
JP
3723 {
3724 /* need to nuke the magic */
3725 mg_free(dstr);
3726 SvRMAGICAL_off(dstr);
3727 }
9e7bc3e8 3728
463ee0b2 3729 /* There's a lot of redundancy below but we're going for speed here */
79072805 3730
8990e307 3731 switch (stype) {
79072805 3732 case SVt_NULL:
aece5585 3733 undef_sstr:
20408e3c
GS
3734 if (dtype != SVt_PVGV) {
3735 (void)SvOK_off(dstr);
3736 return;
3737 }
3738 break;
463ee0b2 3739 case SVt_IV:
aece5585
GA
3740 if (SvIOK(sstr)) {
3741 switch (dtype) {
3742 case SVt_NULL:
8990e307 3743 sv_upgrade(dstr, SVt_IV);
aece5585
GA
3744 break;
3745 case SVt_NV:
8990e307 3746 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
3747 break;
3748 case SVt_RV:
3749 case SVt_PV:
a0d0e21e 3750 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
3751 break;
3752 }
3753 (void)SvIOK_only(dstr);
45977657 3754 SvIV_set(dstr, SvIVX(sstr));
25da4f38
IZ
3755 if (SvIsUV(sstr))
3756 SvIsUV_on(dstr);
27c9684d
AP
3757 if (SvTAINTED(sstr))
3758 SvTAINT(dstr);
aece5585 3759 return;
8990e307 3760 }
aece5585
GA
3761 goto undef_sstr;
3762
463ee0b2 3763 case SVt_NV:
aece5585
GA
3764 if (SvNOK(sstr)) {
3765 switch (dtype) {
3766 case SVt_NULL:
3767 case SVt_IV:
8990e307 3768 sv_upgrade(dstr, SVt_NV);
aece5585
GA
3769 break;
3770 case SVt_RV:
3771 case SVt_PV:
3772 case SVt_PVIV:
a0d0e21e 3773 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
3774 break;
3775 }
9d6ce603 3776 SvNV_set(dstr, SvNVX(sstr));
aece5585 3777 (void)SvNOK_only(dstr);
27c9684d
AP
3778 if (SvTAINTED(sstr))
3779 SvTAINT(dstr);
aece5585 3780 return;
8990e307 3781 }
aece5585
GA
3782 goto undef_sstr;
3783
ed6116ce 3784 case SVt_RV:
8990e307 3785 if (dtype < SVt_RV)
ed6116ce 3786 sv_upgrade(dstr, SVt_RV);
c07a80fd 3787 else if (dtype == SVt_PVGV &&
23bb1b96 3788 SvROK(sstr) && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
c07a80fd 3789 sstr = SvRV(sstr);
a5f75d66 3790 if (sstr == dstr) {
1d7c1841
GS
3791 if (GvIMPORTED(dstr) != GVf_IMPORTED
3792 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3793 {
a5f75d66 3794 GvIMPORTED_on(dstr);
1d7c1841 3795 }
a5f75d66
AD
3796 GvMULTI_on(dstr);
3797 return;
3798 }
c07a80fd 3799 goto glob_assign;
3800 }
ed6116ce 3801 break;
fc36a67e 3802 case SVt_PVFM:
f8c7b90f 3803#ifdef PERL_OLD_COPY_ON_WRITE
d89fc664
NC
3804 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
3805 if (dtype < SVt_PVIV)
3806 sv_upgrade(dstr, SVt_PVIV);
3807 break;
3808 }
3809 /* Fall through */
3810#endif
3811 case SVt_PV:
8990e307 3812 if (dtype < SVt_PV)
463ee0b2 3813 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
3814 break;
3815 case SVt_PVIV:
8990e307 3816 if (dtype < SVt_PVIV)
463ee0b2 3817 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
3818 break;
3819 case SVt_PVNV:
8990e307 3820 if (dtype < SVt_PVNV)
463ee0b2 3821 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 3822 break;
4633a7c4
LW
3823 case SVt_PVAV:
3824 case SVt_PVHV:
3825 case SVt_PVCV:
4633a7c4 3826 case SVt_PVIO:
a3b680e6
AL
3827 {
3828 const char * const type = sv_reftype(sstr,0);
533c011a 3829 if (PL_op)
a3b680e6 3830 Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_NAME(PL_op));
4633a7c4 3831 else
a3b680e6
AL
3832 Perl_croak(aTHX_ "Bizarre copy of %s", type);
3833 }
4633a7c4
LW
3834 break;
3835
79072805 3836 case SVt_PVGV:
8990e307 3837 if (dtype <= SVt_PVGV) {
c07a80fd 3838 glob_assign:
a5f75d66 3839 if (dtype != SVt_PVGV) {
a3b680e6
AL
3840 const char * const name = GvNAME(sstr);
3841 const STRLEN len = GvNAMELEN(sstr);
b76195c2
DM
3842 /* don't upgrade SVt_PVLV: it can hold a glob */
3843 if (dtype != SVt_PVLV)
3844 sv_upgrade(dstr, SVt_PVGV);
14befaf4 3845 sv_magic(dstr, dstr, PERL_MAGIC_glob, Nullch, 0);
85aff577 3846 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
3847 GvNAME(dstr) = savepvn(name, len);
3848 GvNAMELEN(dstr) = len;
3849 SvFAKE_on(dstr); /* can coerce to non-glob */
3850 }
7bac28a0 3851 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
3852 else if (PL_curstackinfo->si_type == PERLSI_SORT
3853 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
cea2e8a9 3854 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
7bac28a0 3855 GvNAME(dstr));
5bd07a3d 3856
7fb37951
AMS
3857#ifdef GV_UNIQUE_CHECK
3858 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
3859 Perl_croak(aTHX_ PL_no_modify);
3860 }
3861#endif
3862
a0d0e21e 3863 (void)SvOK_off(dstr);
a5f75d66 3864 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 3865 gp_free((GV*)dstr);
79072805 3866 GvGP(dstr) = gp_ref(GvGP(sstr));
27c9684d
AP
3867 if (SvTAINTED(sstr))
3868 SvTAINT(dstr);
1d7c1841
GS
3869 if (GvIMPORTED(dstr) != GVf_IMPORTED
3870 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3871 {
a5f75d66 3872 GvIMPORTED_on(dstr);
1d7c1841 3873 }
a5f75d66 3874 GvMULTI_on(dstr);
79072805
LW
3875 return;
3876 }
3877 /* FALL THROUGH */
3878
3879 default:
8d6d96c1 3880 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 3881 mg_get(sstr);
eb160463 3882 if ((int)SvTYPE(sstr) != stype) {
973f89ab
CS
3883 stype = SvTYPE(sstr);
3884 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
3885 goto glob_assign;
3886 }
3887 }
ded42b9f 3888 if (stype == SVt_PVLV)
862a34c6 3889 SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 3890 else
862a34c6 3891 SvUPGRADE(dstr, (U32)stype);
79072805
LW
3892 }
3893
8990e307
LW
3894 sflags = SvFLAGS(sstr);
3895
3896 if (sflags & SVf_ROK) {
3897 if (dtype >= SVt_PV) {
3898 if (dtype == SVt_PVGV) {
3899 SV *sref = SvREFCNT_inc(SvRV(sstr));
3900 SV *dref = 0;
a3b680e6 3901 const int intro = GvINTRO(dstr);
a0d0e21e 3902
7fb37951
AMS
3903#ifdef GV_UNIQUE_CHECK
3904 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
3905 Perl_croak(aTHX_ PL_no_modify);
3906 }
3907#endif
3908
a0d0e21e 3909 if (intro) {
a5f75d66 3910 GvINTRO_off(dstr); /* one-shot flag */
1d7c1841 3911 GvLINE(dstr) = CopLINE(PL_curcop);
1edc1566 3912 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 3913 }
a5f75d66 3914 GvMULTI_on(dstr);
8990e307
LW
3915 switch (SvTYPE(sref)) {
3916 case SVt_PVAV:
a0d0e21e 3917 if (intro)
890ed176 3918 SAVEGENERICSV(GvAV(dstr));
a0d0e21e
LW
3919 else
3920 dref = (SV*)GvAV(dstr);
8990e307 3921 GvAV(dstr) = (AV*)sref;
39bac7f7 3922 if (!GvIMPORTED_AV(dstr)
1d7c1841
GS
3923 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3924 {
a5f75d66 3925 GvIMPORTED_AV_on(dstr);
1d7c1841 3926 }
8990e307
LW
3927 break;
3928 case SVt_PVHV:
a0d0e21e 3929 if (intro)
890ed176 3930 SAVEGENERICSV(GvHV(dstr));
a0d0e21e
LW
3931 else
3932 dref = (SV*)GvHV(dstr);
8990e307 3933 GvHV(dstr) = (HV*)sref;
39bac7f7 3934 if (!GvIMPORTED_HV(dstr)
1d7c1841
GS
3935 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3936 {
a5f75d66 3937 GvIMPORTED_HV_on(dstr);
1d7c1841 3938 }
8990e307
LW
3939 break;
3940 case SVt_PVCV:
8ebc5c01 3941 if (intro) {
3942 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
3943 SvREFCNT_dec(GvCV(dstr));
3944 GvCV(dstr) = Nullcv;
68dc0745 3945 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 3946 PL_sub_generation++;
8ebc5c01 3947 }
890ed176 3948 SAVEGENERICSV(GvCV(dstr));
8ebc5c01 3949 }
68dc0745 3950 else
3951 dref = (SV*)GvCV(dstr);
3952 if (GvCV(dstr) != (CV*)sref) {
748a9306 3953 CV* cv = GvCV(dstr);
4633a7c4 3954 if (cv) {
68dc0745 3955 if (!GvCVGEN((GV*)dstr) &&
3956 (CvROOT(cv) || CvXSUB(cv)))
3957 {
7bac28a0 3958 /* ahem, death to those who redefine
3959 * active sort subs */
3280af22
NIS
3960 if (PL_curstackinfo->si_type == PERLSI_SORT &&
3961 PL_sortcop == CvSTART(cv))
1c846c1f 3962 Perl_croak(aTHX_
7bac28a0 3963 "Can't redefine active sort subroutine %s",
3964 GvENAME((GV*)dstr));
beab0874
JT
3965 /* Redefining a sub - warning is mandatory if
3966 it was a const and its value changed. */
3967 if (ckWARN(WARN_REDEFINE)
3968 || (CvCONST(cv)
3969 && (!CvCONST((CV*)sref)
3970 || sv_cmp(cv_const_sv(cv),
3971 cv_const_sv((CV*)sref)))))
3972 {
9014280d 3973 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
beab0874 3974 CvCONST(cv)
910764e6
RGS
3975 ? "Constant subroutine %s::%s redefined"
3976 : "Subroutine %s::%s redefined",
bfcb3514 3977 HvNAME_get(GvSTASH((GV*)dstr)),
beab0874
JT
3978 GvENAME((GV*)dstr));
3979 }
9607fc9c 3980 }
fb24441d
RGS
3981 if (!intro)
3982 cv_ckproto(cv, (GV*)dstr,
93524f2b
NC
3983 SvPOK(sref)
3984 ? SvPVX_const(sref) : Nullch);
4633a7c4 3985 }
a5f75d66 3986 GvCV(dstr) = (CV*)sref;
7a4c00b4 3987 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 3988 GvASSUMECV_on(dstr);
3280af22 3989 PL_sub_generation++;
a5f75d66 3990 }
39bac7f7 3991 if (!GvIMPORTED_CV(dstr)
1d7c1841
GS
3992 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3993 {
a5f75d66 3994 GvIMPORTED_CV_on(dstr);
1d7c1841 3995 }
8990e307 3996 break;
91bba347
LW
3997 case SVt_PVIO:
3998 if (intro)
890ed176 3999 SAVEGENERICSV(GvIOp(dstr));
91bba347
LW
4000 else
4001 dref = (SV*)GvIOp(dstr);
4002 GvIOp(dstr) = (IO*)sref;
4003 break;
f4d13ee9
JH
4004 case SVt_PVFM:
4005 if (intro)
890ed176 4006 SAVEGENERICSV(GvFORM(dstr));
f4d13ee9
JH
4007 else
4008 dref = (SV*)GvFORM(dstr);
4009 GvFORM(dstr) = (CV*)sref;
4010 break;
8990e307 4011 default:
a0d0e21e 4012 if (intro)
890ed176 4013 SAVEGENERICSV(GvSV(dstr));
a0d0e21e
LW
4014 else
4015 dref = (SV*)GvSV(dstr);
8990e307 4016 GvSV(dstr) = sref;
39bac7f7 4017 if (!GvIMPORTED_SV(dstr)
1d7c1841
GS
4018 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4019 {
a5f75d66 4020 GvIMPORTED_SV_on(dstr);
1d7c1841 4021 }
8990e307
LW
4022 break;
4023 }
4024 if (dref)
4025 SvREFCNT_dec(dref);
27c9684d
AP
4026 if (SvTAINTED(sstr))
4027 SvTAINT(dstr);
8990e307
LW
4028 return;
4029 }
3f7c398e 4030 if (SvPVX_const(dstr)) {
8bd4d4c5 4031 SvPV_free(dstr);
b162af07
SP
4032 SvLEN_set(dstr, 0);
4033 SvCUR_set(dstr, 0);
a0d0e21e 4034 }
8990e307 4035 }
a0d0e21e 4036 (void)SvOK_off(dstr);
b162af07 4037 SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
ed6116ce 4038 SvROK_on(dstr);
8990e307 4039 if (sflags & SVp_NOK) {
3332b3c1
JH
4040 SvNOKp_on(dstr);
4041 /* Only set the public OK flag if the source has public OK. */
4042 if (sflags & SVf_NOK)
4043 SvFLAGS(dstr) |= SVf_NOK;
9d6ce603 4044 SvNV_set(dstr, SvNVX(sstr));
ed6116ce 4045 }
8990e307 4046 if (sflags & SVp_IOK) {
3332b3c1
JH
4047 (void)SvIOKp_on(dstr);
4048 if (sflags & SVf_IOK)
4049 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4050 if (sflags & SVf_IVisUV)
25da4f38 4051 SvIsUV_on(dstr);
45977657 4052 SvIV_set(dstr, SvIVX(sstr));
ed6116ce 4053 }
a0d0e21e
LW
4054 if (SvAMAGIC(sstr)) {
4055 SvAMAGIC_on(dstr);
4056 }
ed6116ce 4057 }
8990e307 4058 else if (sflags & SVp_POK) {
765f542d 4059 bool isSwipe = 0;
79072805
LW
4060
4061 /*
4062 * Check to see if we can just swipe the string. If so, it's a
4063 * possible small lose on short strings, but a big win on long ones.
3f7c398e
SP
4064 * It might even be a win on short strings if SvPVX_const(dstr)
4065 * has to be allocated and SvPVX_const(sstr) has to be freed.
79072805
LW
4066 */
4067
120fac95
NC
4068 /* Whichever path we take through the next code, we want this true,
4069 and doing it now facilitates the COW check. */
4070 (void)SvPOK_only(dstr);
4071
765f542d 4072 if (
b8f9541a
NC
4073 /* We're not already COW */
4074 ((sflags & (SVf_FAKE | SVf_READONLY)) != (SVf_FAKE | SVf_READONLY)
f8c7b90f 4075#ifndef PERL_OLD_COPY_ON_WRITE
b8f9541a
NC
4076 /* or we are, but dstr isn't a suitable target. */
4077 || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
4078#endif
4079 )
765f542d 4080 &&
765f542d
NC
4081 !(isSwipe =
4082 (sflags & SVs_TEMP) && /* slated for free anyway? */
4083 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
5fcdf167
NC
4084 (!(flags & SV_NOSTEAL)) &&
4085 /* and we're allowed to steal temps */
765f542d
NC
4086 SvREFCNT(sstr) == 1 && /* and no other references to it? */
4087 SvLEN(sstr) && /* and really is a string */
645c22ef 4088 /* and won't be needed again, potentially */
765f542d 4089 !(PL_op && PL_op->op_type == OP_AASSIGN))
f8c7b90f 4090#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 4091 && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
120fac95 4092 && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
765f542d
NC
4093 && SvTYPE(sstr) >= SVt_PVIV)
4094#endif
4095 ) {
4096 /* Failed the swipe test, and it's not a shared hash key either.
4097 Have to copy the string. */
4098 STRLEN len = SvCUR(sstr);
4099 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3f7c398e 4100 Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
765f542d
NC
4101 SvCUR_set(dstr, len);
4102 *SvEND(dstr) = '\0';
765f542d 4103 } else {
f8c7b90f 4104 /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
765f542d 4105 be true in here. */
765f542d
NC
4106 /* Either it's a shared hash key, or it's suitable for
4107 copy-on-write or we can swipe the string. */
46187eeb 4108 if (DEBUG_C_TEST) {
ed252734 4109 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
4110 sv_dump(sstr);
4111 sv_dump(dstr);
46187eeb 4112 }
f8c7b90f 4113#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4114 if (!isSwipe) {
4115 /* I believe I should acquire a global SV mutex if
4116 it's a COW sv (not a shared hash key) to stop
4117 it going un copy-on-write.
4118 If the source SV has gone un copy on write between up there
4119 and down here, then (assert() that) it is of the correct
4120 form to make it copy on write again */
4121 if ((sflags & (SVf_FAKE | SVf_READONLY))
4122 != (SVf_FAKE | SVf_READONLY)) {
4123 SvREADONLY_on(sstr);
4124 SvFAKE_on(sstr);
4125 /* Make the source SV into a loop of 1.
4126 (about to become 2) */
a29f6d03 4127 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
4128 }
4129 }
4130#endif
4131 /* Initial code is common. */
94010e71
NC
4132 if (SvPVX_const(dstr)) { /* we know that dtype >= SVt_PV */
4133 SvPV_free(dstr);
79072805 4134 }
765f542d 4135
765f542d
NC
4136 if (!isSwipe) {
4137 /* making another shared SV. */
4138 STRLEN cur = SvCUR(sstr);
4139 STRLEN len = SvLEN(sstr);
f8c7b90f 4140#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 4141 if (len) {
b8f9541a 4142 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
4143 /* SvIsCOW_normal */
4144 /* splice us in between source and next-after-source. */
a29f6d03
NC
4145 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4146 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 4147 SvPV_set(dstr, SvPVX_mutable(sstr));
a604c751
NC
4148 } else
4149#endif
4150 {
765f542d 4151 /* SvIsCOW_shared_hash */
46187eeb
NC
4152 DEBUG_C(PerlIO_printf(Perl_debug_log,
4153 "Copy on write: Sharing hash\n"));
b8f9541a 4154
bdd68bc3 4155 assert (SvTYPE(dstr) >= SVt_PV);
765f542d 4156 SvPV_set(dstr,
d1db91c6 4157 HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
bdd68bc3 4158 }
87a1ef3d
SP
4159 SvLEN_set(dstr, len);
4160 SvCUR_set(dstr, cur);
765f542d
NC
4161 SvREADONLY_on(dstr);
4162 SvFAKE_on(dstr);
4163 /* Relesase a global SV mutex. */
4164 }
4165 else
765f542d 4166 { /* Passes the swipe test. */
78d1e721 4167 SvPV_set(dstr, SvPVX_mutable(sstr));
765f542d
NC
4168 SvLEN_set(dstr, SvLEN(sstr));
4169 SvCUR_set(dstr, SvCUR(sstr));
4170
4171 SvTEMP_off(dstr);
4172 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
4173 SvPV_set(sstr, Nullch);
4174 SvLEN_set(sstr, 0);
4175 SvCUR_set(sstr, 0);
4176 SvTEMP_off(sstr);
4177 }
4178 }
9aa983d2 4179 if (sflags & SVf_UTF8)
a7cb1f99 4180 SvUTF8_on(dstr);
8990e307 4181 if (sflags & SVp_NOK) {
3332b3c1
JH
4182 SvNOKp_on(dstr);
4183 if (sflags & SVf_NOK)
4184 SvFLAGS(dstr) |= SVf_NOK;
9d6ce603 4185 SvNV_set(dstr, SvNVX(sstr));
79072805 4186 }
8990e307 4187 if (sflags & SVp_IOK) {
3332b3c1
JH
4188 (void)SvIOKp_on(dstr);
4189 if (sflags & SVf_IOK)
4190 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4191 if (sflags & SVf_IVisUV)
25da4f38 4192 SvIsUV_on(dstr);
45977657 4193 SvIV_set(dstr, SvIVX(sstr));
79072805 4194 }
92f0c265 4195 if (SvVOK(sstr)) {
7a5fa8a2 4196 MAGIC *smg = mg_find(sstr,PERL_MAGIC_vstring);
ece467f9
JP
4197 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4198 smg->mg_ptr, smg->mg_len);
439cb1c4 4199 SvRMAGICAL_on(dstr);
7a5fa8a2 4200 }
79072805 4201 }
8990e307 4202 else if (sflags & SVp_IOK) {
3332b3c1
JH
4203 if (sflags & SVf_IOK)
4204 (void)SvIOK_only(dstr);
4205 else {
9cbac4c7
DM
4206 (void)SvOK_off(dstr);
4207 (void)SvIOKp_on(dstr);
3332b3c1
JH
4208 }
4209 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2b1c7e3e 4210 if (sflags & SVf_IVisUV)
25da4f38 4211 SvIsUV_on(dstr);
45977657 4212 SvIV_set(dstr, SvIVX(sstr));
3332b3c1
JH
4213 if (sflags & SVp_NOK) {
4214 if (sflags & SVf_NOK)
4215 (void)SvNOK_on(dstr);
4216 else
4217 (void)SvNOKp_on(dstr);
9d6ce603 4218 SvNV_set(dstr, SvNVX(sstr));
3332b3c1
JH
4219 }
4220 }
4221 else if (sflags & SVp_NOK) {
4222 if (sflags & SVf_NOK)
4223 (void)SvNOK_only(dstr);
4224 else {
9cbac4c7 4225 (void)SvOK_off(dstr);
3332b3c1
JH
4226 SvNOKp_on(dstr);
4227 }
9d6ce603 4228 SvNV_set(dstr, SvNVX(sstr));
79072805
LW
4229 }
4230 else {
20408e3c 4231 if (dtype == SVt_PVGV) {
e476b1b5 4232 if (ckWARN(WARN_MISC))
9014280d 4233 Perl_warner(aTHX_ packWARN(WARN_MISC), "Undefined value assigned to typeglob");
20408e3c
GS
4234 }
4235 else
4236 (void)SvOK_off(dstr);
a0d0e21e 4237 }
27c9684d
AP
4238 if (SvTAINTED(sstr))
4239 SvTAINT(dstr);
79072805
LW
4240}
4241
954c1994
GS
4242/*
4243=for apidoc sv_setsv_mg
4244
4245Like C<sv_setsv>, but also handles 'set' magic.
4246
4247=cut
4248*/
4249
79072805 4250void
864dbfa3 4251Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
4252{
4253 sv_setsv(dstr,sstr);
4254 SvSETMAGIC(dstr);
4255}
4256
f8c7b90f 4257#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
4258SV *
4259Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4260{
4261 STRLEN cur = SvCUR(sstr);
4262 STRLEN len = SvLEN(sstr);
4263 register char *new_pv;
4264
4265 if (DEBUG_C_TEST) {
4266 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4267 sstr, dstr);
4268 sv_dump(sstr);
4269 if (dstr)
4270 sv_dump(dstr);
4271 }
4272
4273 if (dstr) {
4274 if (SvTHINKFIRST(dstr))
4275 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
3f7c398e
SP
4276 else if (SvPVX_const(dstr))
4277 Safefree(SvPVX_const(dstr));
ed252734
NC
4278 }
4279 else
4280 new_SV(dstr);
862a34c6 4281 SvUPGRADE(dstr, SVt_PVIV);
ed252734
NC
4282
4283 assert (SvPOK(sstr));
4284 assert (SvPOKp(sstr));
4285 assert (!SvIOK(sstr));
4286 assert (!SvIOKp(sstr));
4287 assert (!SvNOK(sstr));
4288 assert (!SvNOKp(sstr));
4289
4290 if (SvIsCOW(sstr)) {
4291
4292 if (SvLEN(sstr) == 0) {
4293 /* source is a COW shared hash key. */
ed252734
NC
4294 DEBUG_C(PerlIO_printf(Perl_debug_log,
4295 "Fast copy on write: Sharing hash\n"));
d1db91c6 4296 new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
ed252734
NC
4297 goto common_exit;
4298 }
4299 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4300 } else {
4301 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
862a34c6 4302 SvUPGRADE(sstr, SVt_PVIV);
ed252734
NC
4303 SvREADONLY_on(sstr);
4304 SvFAKE_on(sstr);
4305 DEBUG_C(PerlIO_printf(Perl_debug_log,
4306 "Fast copy on write: Converting sstr to COW\n"));
4307 SV_COW_NEXT_SV_SET(dstr, sstr);
4308 }
4309 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 4310 new_pv = SvPVX_mutable(sstr);
ed252734
NC
4311
4312 common_exit:
4313 SvPV_set(dstr, new_pv);
4314 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4315 if (SvUTF8(sstr))
4316 SvUTF8_on(dstr);
87a1ef3d
SP
4317 SvLEN_set(dstr, len);
4318 SvCUR_set(dstr, cur);
ed252734
NC
4319 if (DEBUG_C_TEST) {
4320 sv_dump(dstr);
4321 }
4322 return dstr;
4323}
4324#endif
4325
954c1994
GS
4326/*
4327=for apidoc sv_setpvn
4328
4329Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
4330bytes to be copied. If the C<ptr> argument is NULL the SV will become
4331undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
4332
4333=cut
4334*/
4335
ef50df4b 4336void
864dbfa3 4337Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 4338{
c6f8c383 4339 register char *dptr;
22c522df 4340
765f542d 4341 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4342 if (!ptr) {
a0d0e21e 4343 (void)SvOK_off(sv);
463ee0b2
LW
4344 return;
4345 }
22c522df
JH
4346 else {
4347 /* len is STRLEN which is unsigned, need to copy to signed */
a3b680e6 4348 const IV iv = len;
9c5ffd7c
JH
4349 if (iv < 0)
4350 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 4351 }
862a34c6 4352 SvUPGRADE(sv, SVt_PV);
c6f8c383 4353
5902b6a9 4354 dptr = SvGROW(sv, len + 1);
c6f8c383
GA
4355 Move(ptr,dptr,len,char);
4356 dptr[len] = '\0';
79072805 4357 SvCUR_set(sv, len);
1aa99e6b 4358 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4359 SvTAINT(sv);
79072805
LW
4360}
4361
954c1994
GS
4362/*
4363=for apidoc sv_setpvn_mg
4364
4365Like C<sv_setpvn>, but also handles 'set' magic.
4366
4367=cut
4368*/
4369
79072805 4370void
864dbfa3 4371Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4372{
4373 sv_setpvn(sv,ptr,len);
4374 SvSETMAGIC(sv);
4375}
4376
954c1994
GS
4377/*
4378=for apidoc sv_setpv
4379
4380Copies a string into an SV. The string must be null-terminated. Does not
4381handle 'set' magic. See C<sv_setpv_mg>.
4382
4383=cut
4384*/
4385
ef50df4b 4386void
864dbfa3 4387Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4388{
4389 register STRLEN len;
4390
765f542d 4391 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4392 if (!ptr) {
a0d0e21e 4393 (void)SvOK_off(sv);
463ee0b2
LW
4394 return;
4395 }
79072805 4396 len = strlen(ptr);
862a34c6 4397 SvUPGRADE(sv, SVt_PV);
c6f8c383 4398
79072805 4399 SvGROW(sv, len + 1);
463ee0b2 4400 Move(ptr,SvPVX(sv),len+1,char);
79072805 4401 SvCUR_set(sv, len);
1aa99e6b 4402 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
4403 SvTAINT(sv);
4404}
4405
954c1994
GS
4406/*
4407=for apidoc sv_setpv_mg
4408
4409Like C<sv_setpv>, but also handles 'set' magic.
4410
4411=cut
4412*/
4413
463ee0b2 4414void
864dbfa3 4415Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
4416{
4417 sv_setpv(sv,ptr);
4418 SvSETMAGIC(sv);
4419}
4420
954c1994
GS
4421/*
4422=for apidoc sv_usepvn
4423
4424Tells an SV to use C<ptr> to find its string value. Normally the string is
1c846c1f 4425stored inside the SV but sv_usepvn allows the SV to use an outside string.
954c1994
GS
4426The C<ptr> should point to memory that was allocated by C<malloc>. The
4427string length, C<len>, must be supplied. This function will realloc the
4428memory pointed to by C<ptr>, so that pointer should not be freed or used by
4429the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
4430See C<sv_usepvn_mg>.
4431
4432=cut
4433*/
4434
ef50df4b 4435void
864dbfa3 4436Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 4437{
1936d2a7 4438 STRLEN allocate;
765f542d 4439 SV_CHECK_THINKFIRST_COW_DROP(sv);
862a34c6 4440 SvUPGRADE(sv, SVt_PV);
463ee0b2 4441 if (!ptr) {
a0d0e21e 4442 (void)SvOK_off(sv);
463ee0b2
LW
4443 return;
4444 }
3f7c398e 4445 if (SvPVX_const(sv))
8bd4d4c5 4446 SvPV_free(sv);
1936d2a7
NC
4447
4448 allocate = PERL_STRLEN_ROUNDUP(len + 1);
7a9b70e9 4449 ptr = saferealloc (ptr, allocate);
f880fe2f 4450 SvPV_set(sv, ptr);
463ee0b2 4451 SvCUR_set(sv, len);
1936d2a7 4452 SvLEN_set(sv, allocate);
463ee0b2 4453 *SvEND(sv) = '\0';
1aa99e6b 4454 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4455 SvTAINT(sv);
79072805
LW
4456}
4457
954c1994
GS
4458/*
4459=for apidoc sv_usepvn_mg
4460
4461Like C<sv_usepvn>, but also handles 'set' magic.
4462
4463=cut
4464*/
4465
ef50df4b 4466void
864dbfa3 4467Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 4468{
51c1089b 4469 sv_usepvn(sv,ptr,len);
ef50df4b
GS
4470 SvSETMAGIC(sv);
4471}
4472
f8c7b90f 4473#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4474/* Need to do this *after* making the SV normal, as we need the buffer
4475 pointer to remain valid until after we've copied it. If we let go too early,
4476 another thread could invalidate it by unsharing last of the same hash key
4477 (which it can do by means other than releasing copy-on-write Svs)
4478 or by changing the other copy-on-write SVs in the loop. */
4479STATIC void
bdd68bc3 4480S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, STRLEN len, SV *after)
765f542d
NC
4481{
4482 if (len) { /* this SV was SvIsCOW_normal(sv) */
4483 /* we need to find the SV pointing to us. */
4484 SV *current = SV_COW_NEXT_SV(after);
7a5fa8a2 4485
765f542d
NC
4486 if (current == sv) {
4487 /* The SV we point to points back to us (there were only two of us
4488 in the loop.)
4489 Hence other SV is no longer copy on write either. */
4490 SvFAKE_off(after);
4491 SvREADONLY_off(after);
4492 } else {
4493 /* We need to follow the pointers around the loop. */
4494 SV *next;
4495 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4496 assert (next);
4497 current = next;
4498 /* don't loop forever if the structure is bust, and we have
4499 a pointer into a closed loop. */
4500 assert (current != after);
3f7c398e 4501 assert (SvPVX_const(current) == pvx);
765f542d
NC
4502 }
4503 /* Make the SV before us point to the SV after us. */
a29f6d03 4504 SV_COW_NEXT_SV_SET(current, after);
765f542d
NC
4505 }
4506 } else {
bdd68bc3 4507 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
765f542d
NC
4508 }
4509}
4510
4511int
4512Perl_sv_release_IVX(pTHX_ register SV *sv)
4513{
4514 if (SvIsCOW(sv))
4515 sv_force_normal_flags(sv, 0);
0c34ef67
MHM
4516 SvOOK_off(sv);
4517 return 0;
765f542d
NC
4518}
4519#endif
645c22ef
DM
4520/*
4521=for apidoc sv_force_normal_flags
4522
4523Undo various types of fakery on an SV: if the PV is a shared string, make
4524a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4525an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4526we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4527then a copy-on-write scalar drops its PV buffer (if any) and becomes
4528SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 4529set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
4530C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4531with flags set to 0.
645c22ef
DM
4532
4533=cut
4534*/
4535
6fc92669 4536void
840a7b70 4537Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 4538{
f8c7b90f 4539#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4540 if (SvREADONLY(sv)) {
4541 /* At this point I believe I should acquire a global SV mutex. */
4542 if (SvFAKE(sv)) {
a28509cc
AL
4543 const char *pvx = SvPVX_const(sv);
4544 const STRLEN len = SvLEN(sv);
4545 const STRLEN cur = SvCUR(sv);
a28509cc 4546 SV * const next = SV_COW_NEXT_SV(sv); /* next COW sv in the loop. */
46187eeb
NC
4547 if (DEBUG_C_TEST) {
4548 PerlIO_printf(Perl_debug_log,
4549 "Copy on write: Force normal %ld\n",
4550 (long) flags);
e419cbc5 4551 sv_dump(sv);
46187eeb 4552 }
765f542d
NC
4553 SvFAKE_off(sv);
4554 SvREADONLY_off(sv);
4555 /* This SV doesn't own the buffer, so need to New() a new one: */
f880fe2f 4556 SvPV_set(sv, (char*)0);
87a1ef3d 4557 SvLEN_set(sv, 0);
765f542d
NC
4558 if (flags & SV_COW_DROP_PV) {
4559 /* OK, so we don't need to copy our buffer. */
4560 SvPOK_off(sv);
4561 } else {
4562 SvGROW(sv, cur + 1);
4563 Move(pvx,SvPVX(sv),cur,char);
87a1ef3d 4564 SvCUR_set(sv, cur);
765f542d
NC
4565 *SvEND(sv) = '\0';
4566 }
bdd68bc3 4567 sv_release_COW(sv, pvx, len, next);
46187eeb 4568 if (DEBUG_C_TEST) {
e419cbc5 4569 sv_dump(sv);
46187eeb 4570 }
765f542d 4571 }
923e4eb5 4572 else if (IN_PERL_RUNTIME)
765f542d
NC
4573 Perl_croak(aTHX_ PL_no_modify);
4574 /* At this point I believe that I can drop the global SV mutex. */
4575 }
4576#else
2213622d 4577 if (SvREADONLY(sv)) {
1c846c1f 4578 if (SvFAKE(sv)) {
a433f3d2 4579 const char *pvx = SvPVX_const(sv);
66a1b24b 4580 const STRLEN len = SvCUR(sv);
10bcdfd6
NC
4581 SvFAKE_off(sv);
4582 SvREADONLY_off(sv);
66a1b24b
AL
4583 SvPV_set(sv, Nullch);
4584 SvLEN_set(sv, 0);
1c846c1f 4585 SvGROW(sv, len + 1);
3f7c398e 4586 Move(pvx,SvPVX_const(sv),len,char);
1c846c1f 4587 *SvEND(sv) = '\0';
bdd68bc3 4588 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
1c846c1f 4589 }
923e4eb5 4590 else if (IN_PERL_RUNTIME)
cea2e8a9 4591 Perl_croak(aTHX_ PL_no_modify);
0f15f207 4592 }
765f542d 4593#endif
2213622d 4594 if (SvROK(sv))
840a7b70 4595 sv_unref_flags(sv, flags);
6fc92669
GS
4596 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4597 sv_unglob(sv);
0f15f207 4598}
1c846c1f 4599
645c22ef
DM
4600/*
4601=for apidoc sv_force_normal
4602
4603Undo various types of fakery on an SV: if the PV is a shared string, make
4604a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4605an xpvmg. See also C<sv_force_normal_flags>.
4606
4607=cut
4608*/
4609
840a7b70
IZ
4610void
4611Perl_sv_force_normal(pTHX_ register SV *sv)
4612{
4613 sv_force_normal_flags(sv, 0);
4614}
4615
954c1994
GS
4616/*
4617=for apidoc sv_chop
4618
1c846c1f 4619Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4620SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4621the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4622string. Uses the "OOK hack".
3f7c398e 4623Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
31869a79 4624refer to the same chunk of data.
954c1994
GS
4625
4626=cut
4627*/
4628
79072805 4629void
f54cb97a 4630Perl_sv_chop(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4631{
4632 register STRLEN delta;
a0d0e21e 4633 if (!ptr || !SvPOKp(sv))
79072805 4634 return;
3f7c398e 4635 delta = ptr - SvPVX_const(sv);
2213622d 4636 SV_CHECK_THINKFIRST(sv);
79072805
LW
4637 if (SvTYPE(sv) < SVt_PVIV)
4638 sv_upgrade(sv,SVt_PVIV);
4639
4640 if (!SvOOK(sv)) {
50483b2c 4641 if (!SvLEN(sv)) { /* make copy of shared string */
3f7c398e 4642 const char *pvx = SvPVX_const(sv);
a28509cc 4643 const STRLEN len = SvCUR(sv);
50483b2c 4644 SvGROW(sv, len + 1);
3f7c398e 4645 Move(pvx,SvPVX_const(sv),len,char);
50483b2c
JD
4646 *SvEND(sv) = '\0';
4647 }
45977657 4648 SvIV_set(sv, 0);
a4bfb290
AB
4649 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
4650 and we do that anyway inside the SvNIOK_off
4651 */
7a5fa8a2 4652 SvFLAGS(sv) |= SVf_OOK;
79072805 4653 }
a4bfb290 4654 SvNIOK_off(sv);
b162af07
SP
4655 SvLEN_set(sv, SvLEN(sv) - delta);
4656 SvCUR_set(sv, SvCUR(sv) - delta);
f880fe2f 4657 SvPV_set(sv, SvPVX(sv) + delta);
45977657 4658 SvIV_set(sv, SvIVX(sv) + delta);
79072805
LW
4659}
4660
09540bc3
JH
4661/* sv_catpvn() is now a macro using Perl_sv_catpvn_flags();
4662 * this function provided for binary compatibility only
4663 */
4664
4665void
4666Perl_sv_catpvn(pTHX_ SV *dsv, const char* sstr, STRLEN slen)
4667{
4668 sv_catpvn_flags(dsv, sstr, slen, SV_GMAGIC);
4669}
4670
954c1994
GS
4671/*
4672=for apidoc sv_catpvn
4673
4674Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4675C<len> indicates number of bytes to copy. If the SV has the UTF-8
4676status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 4677Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 4678
8d6d96c1
HS
4679=for apidoc sv_catpvn_flags
4680
4681Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4682C<len> indicates number of bytes to copy. If the SV has the UTF-8
4683status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
4684If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4685appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4686in terms of this function.
4687
4688=cut
4689*/
4690
4691void
4692Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
4693{
4694 STRLEN dlen;
f54cb97a 4695 const char *dstr = SvPV_force_flags(dsv, dlen, flags);
8d6d96c1 4696
8d6d96c1
HS
4697 SvGROW(dsv, dlen + slen + 1);
4698 if (sstr == dstr)
3f7c398e 4699 sstr = SvPVX_const(dsv);
8d6d96c1 4700 Move(sstr, SvPVX(dsv) + dlen, slen, char);
b162af07 4701 SvCUR_set(dsv, SvCUR(dsv) + slen);
8d6d96c1
HS
4702 *SvEND(dsv) = '\0';
4703 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
4704 SvTAINT(dsv);
79072805
LW
4705}
4706
954c1994
GS
4707/*
4708=for apidoc sv_catpvn_mg
4709
4710Like C<sv_catpvn>, but also handles 'set' magic.
4711
4712=cut
4713*/
4714
79072805 4715void
864dbfa3 4716Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4717{
4718 sv_catpvn(sv,ptr,len);
4719 SvSETMAGIC(sv);
4720}
4721
09540bc3
JH
4722/* sv_catsv() is now a macro using Perl_sv_catsv_flags();
4723 * this function provided for binary compatibility only
4724 */
4725
4726void
4727Perl_sv_catsv(pTHX_ SV *dstr, register SV *sstr)
4728{
4729 sv_catsv_flags(dstr, sstr, SV_GMAGIC);
4730}
4731
954c1994
GS
4732/*
4733=for apidoc sv_catsv
4734
13e8c8e3
JH
4735Concatenates the string from SV C<ssv> onto the end of the string in
4736SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
4737not 'set' magic. See C<sv_catsv_mg>.
954c1994 4738
8d6d96c1
HS
4739=for apidoc sv_catsv_flags
4740
4741Concatenates the string from SV C<ssv> onto the end of the string in
4742SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
4743bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4744and C<sv_catsv_nomg> are implemented in terms of this function.
4745
4746=cut */
4747
ef50df4b 4748void
8d6d96c1 4749Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 4750{
4d84ee25 4751 const char *spv;
13e8c8e3 4752 STRLEN slen;
46199a12 4753 if (!ssv)
79072805 4754 return;
4d84ee25 4755 if ((spv = SvPV_const(ssv, slen))) {
4fd84b44
AD
4756 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4757 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
8cf8f3d1
NIS
4758 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4759 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4fd84b44
AD
4760 dsv->sv_flags doesn't have that bit set.
4761 Andy Dougherty 12 Oct 2001
4762 */
b464bac0 4763 const I32 sutf8 = DO_UTF8(ssv);
4fd84b44 4764 I32 dutf8;
13e8c8e3 4765
8d6d96c1
HS
4766 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4767 mg_get(dsv);
4768 dutf8 = DO_UTF8(dsv);
4769
4770 if (dutf8 != sutf8) {
13e8c8e3 4771 if (dutf8) {
46199a12 4772 /* Not modifying source SV, so taking a temporary copy. */
8d6d96c1 4773 SV* csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 4774
46199a12 4775 sv_utf8_upgrade(csv);
93524f2b 4776 spv = SvPV_const(csv, slen);
13e8c8e3 4777 }
8d6d96c1
HS
4778 else
4779 sv_utf8_upgrade_nomg(dsv);
e84ff256 4780 }
8d6d96c1 4781 sv_catpvn_nomg(dsv, spv, slen);
560a288e 4782 }
79072805
LW
4783}
4784
954c1994
GS
4785/*
4786=for apidoc sv_catsv_mg
4787
4788Like C<sv_catsv>, but also handles 'set' magic.
4789
4790=cut
4791*/
4792
79072805 4793void
46199a12 4794Perl_sv_catsv_mg(pTHX_ SV *dsv, register SV *ssv)
ef50df4b 4795{
46199a12
JH
4796 sv_catsv(dsv,ssv);
4797 SvSETMAGIC(dsv);
ef50df4b
GS
4798}
4799
954c1994
GS
4800/*
4801=for apidoc sv_catpv
4802
4803Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
4804If the SV has the UTF-8 status set, then the bytes appended should be
4805valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 4806
d5ce4a7c 4807=cut */
954c1994 4808
ef50df4b 4809void
0c981600 4810Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4811{
4812 register STRLEN len;
463ee0b2 4813 STRLEN tlen;
748a9306 4814 char *junk;
79072805 4815
0c981600 4816 if (!ptr)
79072805 4817 return;
748a9306 4818 junk = SvPV_force(sv, tlen);
0c981600 4819 len = strlen(ptr);
463ee0b2 4820 SvGROW(sv, tlen + len + 1);
0c981600 4821 if (ptr == junk)
3f7c398e 4822 ptr = SvPVX_const(sv);
0c981600 4823 Move(ptr,SvPVX(sv)+tlen,len+1,char);
b162af07 4824 SvCUR_set(sv, SvCUR(sv) + len);
d41ff1b8 4825 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4826 SvTAINT(sv);
79072805
LW
4827}
4828
954c1994
GS
4829/*
4830=for apidoc sv_catpv_mg
4831
4832Like C<sv_catpv>, but also handles 'set' magic.
4833
4834=cut
4835*/
4836
ef50df4b 4837void
0c981600 4838Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 4839{
0c981600 4840 sv_catpv(sv,ptr);
ef50df4b
GS
4841 SvSETMAGIC(sv);
4842}
4843
645c22ef
DM
4844/*
4845=for apidoc newSV
4846
4847Create a new null SV, or if len > 0, create a new empty SVt_PV type SV
4848with an initial PV allocation of len+1. Normally accessed via the C<NEWSV>
4849macro.
4850
4851=cut
4852*/
4853
79072805 4854SV *
864dbfa3 4855Perl_newSV(pTHX_ STRLEN len)
79072805
LW
4856{
4857 register SV *sv;
1c846c1f 4858
4561caa4 4859 new_SV(sv);
79072805
LW
4860 if (len) {
4861 sv_upgrade(sv, SVt_PV);
4862 SvGROW(sv, len + 1);
4863 }
4864 return sv;
4865}
954c1994 4866/*
92110913 4867=for apidoc sv_magicext
954c1994 4868
68795e93 4869Adds magic to an SV, upgrading it if necessary. Applies the
2d8d5d5a 4870supplied vtable and returns a pointer to the magic added.
92110913 4871
2d8d5d5a
SH
4872Note that C<sv_magicext> will allow things that C<sv_magic> will not.
4873In particular, you can add magic to SvREADONLY SVs, and add more than
4874one instance of the same 'how'.
645c22ef 4875
2d8d5d5a
SH
4876If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
4877stored, if C<namlen> is zero then C<name> is stored as-is and - as another
4878special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
4879to contain an C<SV*> and is stored as-is with its REFCNT incremented.
92110913 4880
2d8d5d5a 4881(This is now used as a subroutine by C<sv_magic>.)
954c1994
GS
4882
4883=cut
4884*/
92110913 4885MAGIC *
e1ec3a88 4886Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, const MGVTBL *vtable,
92110913 4887 const char* name, I32 namlen)
79072805
LW
4888{
4889 MAGIC* mg;
68795e93 4890
92110913 4891 if (SvTYPE(sv) < SVt_PVMG) {
862a34c6 4892 SvUPGRADE(sv, SVt_PVMG);
463ee0b2 4893 }
79072805
LW
4894 Newz(702,mg, 1, MAGIC);
4895 mg->mg_moremagic = SvMAGIC(sv);
b162af07 4896 SvMAGIC_set(sv, mg);
75f9d97a 4897
05f95b08
SB
4898 /* Sometimes a magic contains a reference loop, where the sv and
4899 object refer to each other. To prevent a reference loop that
4900 would prevent such objects being freed, we look for such loops
4901 and if we find one we avoid incrementing the object refcount.
87f0b213
JH
4902
4903 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 4904 have its REFCNT incremented to keep it in existence.
87f0b213
JH
4905
4906 */
14befaf4
DM
4907 if (!obj || obj == sv ||
4908 how == PERL_MAGIC_arylen ||
4909 how == PERL_MAGIC_qr ||
8d2f4536 4910 how == PERL_MAGIC_symtab ||
75f9d97a
JH
4911 (SvTYPE(obj) == SVt_PVGV &&
4912 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4913 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 4914 GvFORM(obj) == (CV*)sv)))
75f9d97a 4915 {
8990e307 4916 mg->mg_obj = obj;
75f9d97a 4917 }
85e6fe83 4918 else {
8990e307 4919 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
4920 mg->mg_flags |= MGf_REFCOUNTED;
4921 }
b5ccf5f2
YST
4922
4923 /* Normal self-ties simply pass a null object, and instead of
4924 using mg_obj directly, use the SvTIED_obj macro to produce a
4925 new RV as needed. For glob "self-ties", we are tieing the PVIO
4926 with an RV obj pointing to the glob containing the PVIO. In
4927 this case, to avoid a reference loop, we need to weaken the
4928 reference.
4929 */
4930
4931 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4932 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
4933 {
4934 sv_rvweaken(obj);
4935 }
4936
79072805 4937 mg->mg_type = how;
565764a8 4938 mg->mg_len = namlen;
9cbac4c7 4939 if (name) {
92110913 4940 if (namlen > 0)
1edc1566 4941 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 4942 else if (namlen == HEf_SVKEY)
1edc1566 4943 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
68795e93 4944 else
92110913 4945 mg->mg_ptr = (char *) name;
9cbac4c7 4946 }
92110913 4947 mg->mg_virtual = vtable;
68795e93 4948
92110913
NIS
4949 mg_magical(sv);
4950 if (SvGMAGICAL(sv))
4951 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4952 return mg;
4953}
4954
4955/*
4956=for apidoc sv_magic
1c846c1f 4957
92110913
NIS
4958Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4959then adds a new magic item of type C<how> to the head of the magic list.
4960
2d8d5d5a
SH
4961See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
4962handling of the C<name> and C<namlen> arguments.
4963
4509d3fb
SB
4964You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
4965to add more than one instance of the same 'how'.
4966
92110913
NIS
4967=cut
4968*/
4969
4970void
4971Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 4972{
e1ec3a88 4973 const MGVTBL *vtable = 0;
92110913 4974 MAGIC* mg;
92110913 4975
f8c7b90f 4976#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4977 if (SvIsCOW(sv))
4978 sv_force_normal_flags(sv, 0);
4979#endif
92110913 4980 if (SvREADONLY(sv)) {
923e4eb5 4981 if (IN_PERL_RUNTIME
92110913
NIS
4982 && how != PERL_MAGIC_regex_global
4983 && how != PERL_MAGIC_bm
4984 && how != PERL_MAGIC_fm
4985 && how != PERL_MAGIC_sv
e6469971 4986 && how != PERL_MAGIC_backref
92110913
NIS
4987 )
4988 {
4989 Perl_croak(aTHX_ PL_no_modify);
4990 }
4991 }
4992 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4993 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
4994 /* sv_magic() refuses to add a magic of the same 'how' as an
4995 existing one
92110913
NIS
4996 */
4997 if (how == PERL_MAGIC_taint)
4998 mg->mg_len |= 1;
4999 return;
5000 }
5001 }
68795e93 5002
79072805 5003 switch (how) {
14befaf4 5004 case PERL_MAGIC_sv:
92110913 5005 vtable = &PL_vtbl_sv;
79072805 5006 break;
14befaf4 5007 case PERL_MAGIC_overload:
92110913 5008 vtable = &PL_vtbl_amagic;
a0d0e21e 5009 break;
14befaf4 5010 case PERL_MAGIC_overload_elem:
92110913 5011 vtable = &PL_vtbl_amagicelem;
a0d0e21e 5012 break;
14befaf4 5013 case PERL_MAGIC_overload_table:
92110913 5014 vtable = &PL_vtbl_ovrld;
a0d0e21e 5015 break;
14befaf4 5016 case PERL_MAGIC_bm:
92110913 5017 vtable = &PL_vtbl_bm;
79072805 5018 break;
14befaf4 5019 case PERL_MAGIC_regdata:
92110913 5020 vtable = &PL_vtbl_regdata;
6cef1e77 5021 break;
14befaf4 5022 case PERL_MAGIC_regdatum:
92110913 5023 vtable = &PL_vtbl_regdatum;
6cef1e77 5024 break;
14befaf4 5025 case PERL_MAGIC_env:
92110913 5026 vtable = &PL_vtbl_env;
79072805 5027 break;
14befaf4 5028 case PERL_MAGIC_fm:
92110913 5029 vtable = &PL_vtbl_fm;
55497cff 5030 break;
14befaf4 5031 case PERL_MAGIC_envelem:
92110913 5032 vtable = &PL_vtbl_envelem;
79072805 5033 break;
14befaf4 5034 case PERL_MAGIC_regex_global:
92110913 5035 vtable = &PL_vtbl_mglob;
93a17b20 5036 break;
14befaf4 5037 case PERL_MAGIC_isa:
92110913 5038 vtable = &PL_vtbl_isa;
463ee0b2 5039 break;
14befaf4 5040 case PERL_MAGIC_isaelem:
92110913 5041 vtable = &PL_vtbl_isaelem;
463ee0b2 5042 break;
14befaf4 5043 case PERL_MAGIC_nkeys:
92110913 5044 vtable = &PL_vtbl_nkeys;
16660edb 5045 break;
14befaf4 5046 case PERL_MAGIC_dbfile:
92110913 5047 vtable = 0;
93a17b20 5048 break;
14befaf4 5049 case PERL_MAGIC_dbline:
92110913 5050 vtable = &PL_vtbl_dbline;
79072805 5051 break;
36477c24 5052#ifdef USE_LOCALE_COLLATE
14befaf4 5053 case PERL_MAGIC_collxfrm:
92110913 5054 vtable = &PL_vtbl_collxfrm;
bbce6d69 5055 break;
36477c24 5056#endif /* USE_LOCALE_COLLATE */
14befaf4 5057 case PERL_MAGIC_tied:
92110913 5058 vtable = &PL_vtbl_pack;
463ee0b2 5059 break;
14befaf4
DM
5060 case PERL_MAGIC_tiedelem:
5061 case PERL_MAGIC_tiedscalar:
92110913 5062 vtable = &PL_vtbl_packelem;
463ee0b2 5063 break;
14befaf4 5064 case PERL_MAGIC_qr:
92110913 5065 vtable = &PL_vtbl_regexp;
c277df42 5066 break;
14befaf4 5067 case PERL_MAGIC_sig:
92110913 5068 vtable = &PL_vtbl_sig;
79072805 5069 break;
14befaf4 5070 case PERL_MAGIC_sigelem:
92110913 5071 vtable = &PL_vtbl_sigelem;
79072805 5072 break;
14befaf4 5073 case PERL_MAGIC_taint:
92110913 5074 vtable = &PL_vtbl_taint;
463ee0b2 5075 break;
14befaf4 5076 case PERL_MAGIC_uvar:
92110913 5077 vtable = &PL_vtbl_uvar;
79072805 5078 break;
14befaf4 5079 case PERL_MAGIC_vec:
92110913 5080 vtable = &PL_vtbl_vec;
79072805 5081 break;
a3874608 5082 case PERL_MAGIC_arylen_p:
bfcb3514 5083 case PERL_MAGIC_rhash:
8d2f4536 5084 case PERL_MAGIC_symtab:
ece467f9
JP
5085 case PERL_MAGIC_vstring:
5086 vtable = 0;
5087 break;
7e8c5dac
HS
5088 case PERL_MAGIC_utf8:
5089 vtable = &PL_vtbl_utf8;
5090 break;
14befaf4 5091 case PERL_MAGIC_substr:
92110913 5092 vtable = &PL_vtbl_substr;
79072805 5093 break;
14befaf4 5094 case PERL_MAGIC_defelem:
92110913 5095 vtable = &PL_vtbl_defelem;
5f05dabc 5096 break;
14befaf4 5097 case PERL_MAGIC_glob:
92110913 5098 vtable = &PL_vtbl_glob;
79072805 5099 break;
14befaf4 5100 case PERL_MAGIC_arylen:
92110913 5101 vtable = &PL_vtbl_arylen;
79072805 5102 break;
14befaf4 5103 case PERL_MAGIC_pos:
92110913 5104 vtable = &PL_vtbl_pos;
a0d0e21e 5105 break;
14befaf4 5106 case PERL_MAGIC_backref:
92110913 5107 vtable = &PL_vtbl_backref;
810b8aa5 5108 break;
14befaf4
DM
5109 case PERL_MAGIC_ext:
5110 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
5111 /* Useful for attaching extension internal data to perl vars. */
5112 /* Note that multiple extensions may clash if magical scalars */
5113 /* etc holding private data from one are passed to another. */
a0d0e21e 5114 break;
79072805 5115 default:
14befaf4 5116 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 5117 }
68795e93 5118
92110913 5119 /* Rest of work is done else where */
27da23d5 5120 mg = sv_magicext(sv,obj,how,(MGVTBL*)vtable,name,namlen);
68795e93 5121
92110913
NIS
5122 switch (how) {
5123 case PERL_MAGIC_taint:
5124 mg->mg_len = 1;
5125 break;
5126 case PERL_MAGIC_ext:
5127 case PERL_MAGIC_dbfile:
5128 SvRMAGICAL_on(sv);
5129 break;
5130 }
463ee0b2
LW
5131}
5132
c461cf8f
JH
5133/*
5134=for apidoc sv_unmagic
5135
645c22ef 5136Removes all magic of type C<type> from an SV.
c461cf8f
JH
5137
5138=cut
5139*/
5140
463ee0b2 5141int
864dbfa3 5142Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
5143{
5144 MAGIC* mg;
5145 MAGIC** mgp;
91bba347 5146 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
5147 return 0;
5148 mgp = &SvMAGIC(sv);
5149 for (mg = *mgp; mg; mg = *mgp) {
5150 if (mg->mg_type == type) {
e1ec3a88 5151 const MGVTBL* const vtbl = mg->mg_virtual;
463ee0b2 5152 *mgp = mg->mg_moremagic;
1d7c1841 5153 if (vtbl && vtbl->svt_free)
fc0dc3b3 5154 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 5155 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 5156 if (mg->mg_len > 0)
1edc1566 5157 Safefree(mg->mg_ptr);
565764a8 5158 else if (mg->mg_len == HEf_SVKEY)
1edc1566 5159 SvREFCNT_dec((SV*)mg->mg_ptr);
7e8c5dac
HS
5160 else if (mg->mg_type == PERL_MAGIC_utf8 && mg->mg_ptr)
5161 Safefree(mg->mg_ptr);
9cbac4c7 5162 }
a0d0e21e
LW
5163 if (mg->mg_flags & MGf_REFCOUNTED)
5164 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
5165 Safefree(mg);
5166 }
5167 else
5168 mgp = &mg->mg_moremagic;
79072805 5169 }
91bba347 5170 if (!SvMAGIC(sv)) {
463ee0b2 5171 SvMAGICAL_off(sv);
06759ea0 5172 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
5173 }
5174
5175 return 0;
79072805
LW
5176}
5177
c461cf8f
JH
5178/*
5179=for apidoc sv_rvweaken
5180
645c22ef
DM
5181Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5182referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5183push a back-reference to this RV onto the array of backreferences
5184associated with that magic.
c461cf8f
JH
5185
5186=cut
5187*/
5188
810b8aa5 5189SV *
864dbfa3 5190Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
5191{
5192 SV *tsv;
5193 if (!SvOK(sv)) /* let undefs pass */
5194 return sv;
5195 if (!SvROK(sv))
cea2e8a9 5196 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 5197 else if (SvWEAKREF(sv)) {
810b8aa5 5198 if (ckWARN(WARN_MISC))
9014280d 5199 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
5200 return sv;
5201 }
5202 tsv = SvRV(sv);
5203 sv_add_backref(tsv, sv);
5204 SvWEAKREF_on(sv);
1c846c1f 5205 SvREFCNT_dec(tsv);
810b8aa5
GS
5206 return sv;
5207}
5208
645c22ef
DM
5209/* Give tsv backref magic if it hasn't already got it, then push a
5210 * back-reference to sv onto the array associated with the backref magic.
5211 */
5212
810b8aa5 5213STATIC void
cea2e8a9 5214S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
5215{
5216 AV *av;
5217 MAGIC *mg;
14befaf4 5218 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, PERL_MAGIC_backref)))
810b8aa5
GS
5219 av = (AV*)mg->mg_obj;
5220 else {
5221 av = newAV();
14befaf4 5222 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
d99b02a1
DM
5223 /* av now has a refcnt of 2, which avoids it getting freed
5224 * before us during global cleanup. The extra ref is removed
5225 * by magic_killbackrefs() when tsv is being freed */
810b8aa5 5226 }
d91d49e8 5227 if (AvFILLp(av) >= AvMAX(av)) {
d91d49e8
MM
5228 av_extend(av, AvFILLp(av)+1);
5229 }
5230 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
5231}
5232
645c22ef
DM
5233/* delete a back-reference to ourselves from the backref magic associated
5234 * with the SV we point to.
5235 */
5236
1c846c1f 5237STATIC void
cea2e8a9 5238S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
5239{
5240 AV *av;
5241 SV **svp;
5242 I32 i;
1b6737cc 5243 SV * const tsv = SvRV(sv);
c04a4dfe 5244 MAGIC *mg = NULL;
14befaf4 5245 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, PERL_MAGIC_backref)))
cea2e8a9 5246 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
5247 av = (AV *)mg->mg_obj;
5248 svp = AvARRAY(av);
6a76db8b
NC
5249 /* We shouldn't be in here more than once, but for paranoia reasons lets
5250 not assume this. */
5251 for (i = AvFILLp(av); i >= 0; i--) {
5252 if (svp[i] == sv) {
5253 const SSize_t fill = AvFILLp(av);
5254 if (i != fill) {
5255 /* We weren't the last entry.
5256 An unordered list has this property that you can take the
5257 last element off the end to fill the hole, and it's still
5258 an unordered list :-)
5259 */
5260 svp[i] = svp[fill];
5261 }
5262 svp[fill] = Nullsv;
5263 AvFILLp(av) = fill - 1;
5264 }
5265 }
810b8aa5
GS
5266}
5267
954c1994
GS
5268/*
5269=for apidoc sv_insert
5270
5271Inserts a string at the specified offset/length within the SV. Similar to
5272the Perl substr() function.
5273
5274=cut
5275*/
5276
79072805 5277void
e1ec3a88 5278Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, const char *little, STRLEN littlelen)
79072805
LW
5279{
5280 register char *big;
5281 register char *mid;
5282 register char *midend;
5283 register char *bigend;
5284 register I32 i;
6ff81951 5285 STRLEN curlen;
1c846c1f 5286
79072805 5287
8990e307 5288 if (!bigstr)
cea2e8a9 5289 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 5290 SvPV_force(bigstr, curlen);
60fa28ff 5291 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
5292 if (offset + len > curlen) {
5293 SvGROW(bigstr, offset+len+1);
93524f2b 5294 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
6ff81951
GS
5295 SvCUR_set(bigstr, offset+len);
5296 }
79072805 5297
69b47968 5298 SvTAINT(bigstr);
79072805
LW
5299 i = littlelen - len;
5300 if (i > 0) { /* string might grow */
a0d0e21e 5301 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
5302 mid = big + offset + len;
5303 midend = bigend = big + SvCUR(bigstr);
5304 bigend += i;
5305 *bigend = '\0';
5306 while (midend > mid) /* shove everything down */
5307 *--bigend = *--midend;
5308 Move(little,big+offset,littlelen,char);
b162af07 5309 SvCUR_set(bigstr, SvCUR(bigstr) + i);
79072805
LW
5310 SvSETMAGIC(bigstr);
5311 return;
5312 }
5313 else if (i == 0) {
463ee0b2 5314 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
5315 SvSETMAGIC(bigstr);
5316 return;
5317 }
5318
463ee0b2 5319 big = SvPVX(bigstr);
79072805
LW
5320 mid = big + offset;
5321 midend = mid + len;
5322 bigend = big + SvCUR(bigstr);
5323
5324 if (midend > bigend)
cea2e8a9 5325 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5326
5327 if (mid - big > bigend - midend) { /* faster to shorten from end */
5328 if (littlelen) {
5329 Move(little, mid, littlelen,char);
5330 mid += littlelen;
5331 }
5332 i = bigend - midend;
5333 if (i > 0) {
5334 Move(midend, mid, i,char);
5335 mid += i;
5336 }
5337 *mid = '\0';
5338 SvCUR_set(bigstr, mid - big);
5339 }
155aba94 5340 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5341 midend -= littlelen;
5342 mid = midend;
5343 sv_chop(bigstr,midend-i);
5344 big += i;
5345 while (i--)
5346 *--midend = *--big;
5347 if (littlelen)
5348 Move(little, mid, littlelen,char);
5349 }
5350 else if (littlelen) {
5351 midend -= littlelen;
5352 sv_chop(bigstr,midend);
5353 Move(little,midend,littlelen,char);
5354 }
5355 else {
5356 sv_chop(bigstr,midend);
5357 }
5358 SvSETMAGIC(bigstr);
5359}
5360
c461cf8f
JH
5361/*
5362=for apidoc sv_replace
5363
5364Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5365The target SV physically takes over ownership of the body of the source SV
5366and inherits its flags; however, the target keeps any magic it owns,
5367and any magic in the source is discarded.
ff276b08 5368Note that this is a rather specialist SV copying operation; most of the
645c22ef 5369time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5370
5371=cut
5372*/
79072805
LW
5373
5374void
864dbfa3 5375Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805 5376{
a3b680e6 5377 const U32 refcnt = SvREFCNT(sv);
765f542d 5378 SV_CHECK_THINKFIRST_COW_DROP(sv);
0453d815 5379 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
9014280d 5380 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
93a17b20 5381 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5382 if (SvMAGICAL(nsv))
5383 mg_free(nsv);
5384 else
5385 sv_upgrade(nsv, SVt_PVMG);
b162af07 5386 SvMAGIC_set(nsv, SvMAGIC(sv));
a0d0e21e 5387 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20 5388 SvMAGICAL_off(sv);
b162af07 5389 SvMAGIC_set(sv, NULL);
93a17b20 5390 }
79072805
LW
5391 SvREFCNT(sv) = 0;
5392 sv_clear(sv);
477f5d66 5393 assert(!SvREFCNT(sv));
fd0854ff
DM
5394#ifdef DEBUG_LEAKING_SCALARS
5395 sv->sv_flags = nsv->sv_flags;
5396 sv->sv_any = nsv->sv_any;
5397 sv->sv_refcnt = nsv->sv_refcnt;
f34d0642 5398 sv->sv_u = nsv->sv_u;
fd0854ff 5399#else
79072805 5400 StructCopy(nsv,sv,SV);
fd0854ff 5401#endif
7b2c381c
NC
5402 /* Currently could join these into one piece of pointer arithmetic, but
5403 it would be unclear. */
5404 if(SvTYPE(sv) == SVt_IV)
5405 SvANY(sv)
339049b0 5406 = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
7b2c381c 5407 else if (SvTYPE(sv) == SVt_RV) {
339049b0 5408 SvANY(sv) = &sv->sv_u.svu_rv;
7b2c381c
NC
5409 }
5410
fd0854ff 5411
f8c7b90f 5412#ifdef PERL_OLD_COPY_ON_WRITE
d3d0e6f1
NC
5413 if (SvIsCOW_normal(nsv)) {
5414 /* We need to follow the pointers around the loop to make the
5415 previous SV point to sv, rather than nsv. */
5416 SV *next;
5417 SV *current = nsv;
5418 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5419 assert(next);
5420 current = next;
3f7c398e 5421 assert(SvPVX_const(current) == SvPVX_const(nsv));
d3d0e6f1
NC
5422 }
5423 /* Make the SV before us point to the SV after us. */
5424 if (DEBUG_C_TEST) {
5425 PerlIO_printf(Perl_debug_log, "previous is\n");
5426 sv_dump(current);
a29f6d03
NC
5427 PerlIO_printf(Perl_debug_log,
5428 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5429 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5430 }
a29f6d03 5431 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5432 }
5433#endif
79072805 5434 SvREFCNT(sv) = refcnt;
1edc1566 5435 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 5436 SvREFCNT(nsv) = 0;
463ee0b2 5437 del_SV(nsv);
79072805
LW
5438}
5439
c461cf8f
JH
5440/*
5441=for apidoc sv_clear
5442
645c22ef
DM
5443Clear an SV: call any destructors, free up any memory used by the body,
5444and free the body itself. The SV's head is I<not> freed, although
5445its type is set to all 1's so that it won't inadvertently be assumed
5446to be live during global destruction etc.
5447This function should only be called when REFCNT is zero. Most of the time
5448you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5449instead.
c461cf8f
JH
5450
5451=cut
5452*/
5453
79072805 5454void
864dbfa3 5455Perl_sv_clear(pTHX_ register SV *sv)
79072805 5456{
27da23d5 5457 dVAR;
ec12f114 5458 HV* stash;
79072805
LW
5459 assert(sv);
5460 assert(SvREFCNT(sv) == 0);
5461
ed6116ce 5462 if (SvOBJECT(sv)) {
3280af22 5463 if (PL_defstash) { /* Still have a symbol table? */
39644a26 5464 dSP;
d460ef45 5465 do {
b464bac0 5466 CV* destructor;
4e8e7886 5467 stash = SvSTASH(sv);
32251b26 5468 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 5469 if (destructor) {
1b6737cc 5470 SV* const tmpref = newRV(sv);
5cc433a6 5471 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 5472 ENTER;
e788e7d3 5473 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
5474 EXTEND(SP, 2);
5475 PUSHMARK(SP);
5cc433a6 5476 PUSHs(tmpref);
4e8e7886 5477 PUTBACK;
44389ee9 5478 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
7a5fa8a2
NIS
5479
5480
d3acc0f7 5481 POPSTACK;
3095d977 5482 SPAGAIN;
4e8e7886 5483 LEAVE;
5cc433a6
AB
5484 if(SvREFCNT(tmpref) < 2) {
5485 /* tmpref is not kept alive! */
5486 SvREFCNT(sv)--;
b162af07 5487 SvRV_set(tmpref, NULL);
5cc433a6
AB
5488 SvROK_off(tmpref);
5489 }
5490 SvREFCNT_dec(tmpref);
4e8e7886
GS
5491 }
5492 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5493
6f44e0a4
JP
5494
5495 if (SvREFCNT(sv)) {
5496 if (PL_in_clean_objs)
cea2e8a9 5497 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
bfcb3514 5498 HvNAME_get(stash));
6f44e0a4
JP
5499 /* DESTROY gave object new lease on life */
5500 return;
5501 }
a0d0e21e 5502 }
4e8e7886 5503
a0d0e21e 5504 if (SvOBJECT(sv)) {
4e8e7886 5505 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
5506 SvOBJECT_off(sv); /* Curse the object. */
5507 if (SvTYPE(sv) != SVt_PVIO)
3280af22 5508 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5509 }
463ee0b2 5510 }
524189f1
JH
5511 if (SvTYPE(sv) >= SVt_PVMG) {
5512 if (SvMAGIC(sv))
5513 mg_free(sv);
bce8f412 5514 if (SvTYPE(sv) == SVt_PVMG && SvFLAGS(sv) & SVpad_TYPED)
524189f1
JH
5515 SvREFCNT_dec(SvSTASH(sv));
5516 }
ec12f114 5517 stash = NULL;
79072805 5518 switch (SvTYPE(sv)) {
8990e307 5519 case SVt_PVIO:
df0bd2f4
GS
5520 if (IoIFP(sv) &&
5521 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5522 IoIFP(sv) != PerlIO_stdout() &&
5523 IoIFP(sv) != PerlIO_stderr())
93578b34 5524 {
f2b5be74 5525 io_close((IO*)sv, FALSE);
93578b34 5526 }
1d7c1841 5527 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5528 PerlDir_close(IoDIRP(sv));
1d7c1841 5529 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5530 Safefree(IoTOP_NAME(sv));
5531 Safefree(IoFMT_NAME(sv));
5532 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 5533 /* FALL THROUGH */
79072805 5534 case SVt_PVBM:
a0d0e21e 5535 goto freescalar;
79072805 5536 case SVt_PVCV:
748a9306 5537 case SVt_PVFM:
85e6fe83 5538 cv_undef((CV*)sv);
a0d0e21e 5539 goto freescalar;
79072805 5540 case SVt_PVHV:
85e6fe83 5541 hv_undef((HV*)sv);
a0d0e21e 5542 break;
79072805 5543 case SVt_PVAV:
85e6fe83 5544 av_undef((AV*)sv);
a0d0e21e 5545 break;
02270b4e 5546 case SVt_PVLV:
dd28f7bb
DM
5547 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5548 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5549 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5550 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5551 }
5552 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
5553 SvREFCNT_dec(LvTARG(sv));
02270b4e 5554 goto freescalar;
a0d0e21e 5555 case SVt_PVGV:
1edc1566 5556 gp_free((GV*)sv);
a0d0e21e 5557 Safefree(GvNAME(sv));
ec12f114
JPC
5558 /* cannot decrease stash refcount yet, as we might recursively delete
5559 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
5560 of stash until current sv is completely gone.
5561 -- JohnPC, 27 Mar 1998 */
5562 stash = GvSTASH(sv);
a0d0e21e 5563 /* FALL THROUGH */
79072805 5564 case SVt_PVMG:
79072805
LW
5565 case SVt_PVNV:
5566 case SVt_PVIV:
a0d0e21e 5567 freescalar:
5228ca4e
NC
5568 /* Don't bother with SvOOK_off(sv); as we're only going to free it. */
5569 if (SvOOK(sv)) {
93524f2b 5570 SvPV_set(sv, SvPVX_mutable(sv) - SvIVX(sv));
5228ca4e
NC
5571 /* Don't even bother with turning off the OOK flag. */
5572 }
79072805
LW
5573 /* FALL THROUGH */
5574 case SVt_PV:
a0d0e21e 5575 case SVt_RV:
810b8aa5
GS
5576 if (SvROK(sv)) {
5577 if (SvWEAKREF(sv))
5578 sv_del_backref(sv);
5579 else
5580 SvREFCNT_dec(SvRV(sv));
5581 }
f8c7b90f 5582#ifdef PERL_OLD_COPY_ON_WRITE
3f7c398e 5583 else if (SvPVX_const(sv)) {
765f542d
NC
5584 if (SvIsCOW(sv)) {
5585 /* I believe I need to grab the global SV mutex here and
5586 then recheck the COW status. */
46187eeb
NC
5587 if (DEBUG_C_TEST) {
5588 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5589 sv_dump(sv);
46187eeb 5590 }
bdd68bc3
NC
5591 sv_release_COW(sv, SvPVX_const(sv), SvLEN(sv),
5592 SV_COW_NEXT_SV(sv));
765f542d
NC
5593 /* And drop it here. */
5594 SvFAKE_off(sv);
5595 } else if (SvLEN(sv)) {
3f7c398e 5596 Safefree(SvPVX_const(sv));
765f542d
NC
5597 }
5598 }
5599#else
3f7c398e 5600 else if (SvPVX_const(sv) && SvLEN(sv))
94010e71 5601 Safefree(SvPVX_mutable(sv));
3f7c398e 5602 else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
bdd68bc3 5603 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
1c846c1f
NIS
5604 SvFAKE_off(sv);
5605 }
765f542d 5606#endif
79072805 5607 break;
a0d0e21e 5608/*
79072805 5609 case SVt_NV:
79072805 5610 case SVt_IV:
79072805
LW
5611 case SVt_NULL:
5612 break;
a0d0e21e 5613*/
79072805
LW
5614 }
5615
5616 switch (SvTYPE(sv)) {
5617 case SVt_NULL:
5618 break;
79072805 5619 case SVt_IV:
79072805
LW
5620 break;
5621 case SVt_NV:
5622 del_XNV(SvANY(sv));
5623 break;
ed6116ce 5624 case SVt_RV:
ed6116ce 5625 break;
79072805
LW
5626 case SVt_PV:
5627 del_XPV(SvANY(sv));
5628 break;
5629 case SVt_PVIV:
5630 del_XPVIV(SvANY(sv));
5631 break;
5632 case SVt_PVNV:
5633 del_XPVNV(SvANY(sv));
5634 break;
5635 case SVt_PVMG:
5636 del_XPVMG(SvANY(sv));
5637 break;
5638 case SVt_PVLV:
5639 del_XPVLV(SvANY(sv));
5640 break;
5641 case SVt_PVAV:
5642 del_XPVAV(SvANY(sv));
5643 break;
5644 case SVt_PVHV:
5645 del_XPVHV(SvANY(sv));
5646 break;
5647 case SVt_PVCV:
5648 del_XPVCV(SvANY(sv));
5649 break;
5650 case SVt_PVGV:
5651 del_XPVGV(SvANY(sv));
ec12f114
JPC
5652 /* code duplication for increased performance. */
5653 SvFLAGS(sv) &= SVf_BREAK;
5654 SvFLAGS(sv) |= SVTYPEMASK;
5655 /* decrease refcount of the stash that owns this GV, if any */
5656 if (stash)
5657 SvREFCNT_dec(stash);
5658 return; /* not break, SvFLAGS reset already happened */
79072805
LW
5659 case SVt_PVBM:
5660 del_XPVBM(SvANY(sv));
5661 break;
5662 case SVt_PVFM:
5663 del_XPVFM(SvANY(sv));
5664 break;
8990e307
LW
5665 case SVt_PVIO:
5666 del_XPVIO(SvANY(sv));
5667 break;
79072805 5668 }
a0d0e21e 5669 SvFLAGS(sv) &= SVf_BREAK;
8990e307 5670 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
5671}
5672
645c22ef
DM
5673/*
5674=for apidoc sv_newref
5675
5676Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5677instead.
5678
5679=cut
5680*/
5681
79072805 5682SV *
864dbfa3 5683Perl_sv_newref(pTHX_ SV *sv)
79072805 5684{
463ee0b2 5685 if (sv)
4db098f4 5686 (SvREFCNT(sv))++;
79072805
LW
5687 return sv;
5688}
5689
c461cf8f
JH
5690/*
5691=for apidoc sv_free
5692
645c22ef
DM
5693Decrement an SV's reference count, and if it drops to zero, call
5694C<sv_clear> to invoke destructors and free up any memory used by
5695the body; finally, deallocate the SV's head itself.
5696Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5697
5698=cut
5699*/
5700
79072805 5701void
864dbfa3 5702Perl_sv_free(pTHX_ SV *sv)
79072805 5703{
27da23d5 5704 dVAR;
79072805
LW
5705 if (!sv)
5706 return;
a0d0e21e
LW
5707 if (SvREFCNT(sv) == 0) {
5708 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5709 /* this SV's refcnt has been artificially decremented to
5710 * trigger cleanup */
a0d0e21e 5711 return;
3280af22 5712 if (PL_in_clean_all) /* All is fair */
1edc1566 5713 return;
d689ffdd
JP
5714 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5715 /* make sure SvREFCNT(sv)==0 happens very seldom */
5716 SvREFCNT(sv) = (~(U32)0)/2;
5717 return;
5718 }
0453d815 5719 if (ckWARN_d(WARN_INTERNAL))
d5dede04 5720 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
5721 "Attempt to free unreferenced scalar: SV 0x%"UVxf
5722 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805
LW
5723 return;
5724 }
4db098f4 5725 if (--(SvREFCNT(sv)) > 0)
8990e307 5726 return;
8c4d3c90
NC
5727 Perl_sv_free2(aTHX_ sv);
5728}
5729
5730void
5731Perl_sv_free2(pTHX_ SV *sv)
5732{
27da23d5 5733 dVAR;
463ee0b2
LW
5734#ifdef DEBUGGING
5735 if (SvTEMP(sv)) {
0453d815 5736 if (ckWARN_d(WARN_DEBUGGING))
9014280d 5737 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
472d47bc
SB
5738 "Attempt to free temp prematurely: SV 0x%"UVxf
5739 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 5740 return;
79072805 5741 }
463ee0b2 5742#endif
d689ffdd
JP
5743 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5744 /* make sure SvREFCNT(sv)==0 happens very seldom */
5745 SvREFCNT(sv) = (~(U32)0)/2;
5746 return;
5747 }
79072805 5748 sv_clear(sv);
477f5d66
CS
5749 if (! SvREFCNT(sv))
5750 del_SV(sv);
79072805
LW
5751}
5752
954c1994
GS
5753/*
5754=for apidoc sv_len
5755
645c22ef
DM
5756Returns the length of the string in the SV. Handles magic and type
5757coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5758
5759=cut
5760*/
5761
79072805 5762STRLEN
864dbfa3 5763Perl_sv_len(pTHX_ register SV *sv)
79072805 5764{
463ee0b2 5765 STRLEN len;
79072805
LW
5766
5767 if (!sv)
5768 return 0;
5769
8990e307 5770 if (SvGMAGICAL(sv))
565764a8 5771 len = mg_length(sv);
8990e307 5772 else
4d84ee25 5773 (void)SvPV_const(sv, len);
463ee0b2 5774 return len;
79072805
LW
5775}
5776
c461cf8f
JH
5777/*
5778=for apidoc sv_len_utf8
5779
5780Returns the number of characters in the string in an SV, counting wide
1e54db1a 5781UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5782
5783=cut
5784*/
5785
7e8c5dac
HS
5786/*
5787 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
5788 * mg_ptr is used, by sv_pos_u2b(), see the comments of S_utf8_mg_pos_init().
5789 * (Note that the mg_len is not the length of the mg_ptr field.)
7a5fa8a2 5790 *
7e8c5dac
HS
5791 */
5792
a0ed51b3 5793STRLEN
864dbfa3 5794Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 5795{
a0ed51b3
LW
5796 if (!sv)
5797 return 0;
5798
a0ed51b3 5799 if (SvGMAGICAL(sv))
b76347f2 5800 return mg_length(sv);
a0ed51b3 5801 else
b76347f2 5802 {
7e8c5dac 5803 STRLEN len, ulen;
e62f0680 5804 const U8 *s = (U8*)SvPV_const(sv, len);
7e8c5dac
HS
5805 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
5806
e23c8137 5807 if (mg && mg->mg_len != -1 && (mg->mg_len > 0 || len == 0)) {
7e8c5dac 5808 ulen = mg->mg_len;
e23c8137
JH
5809#ifdef PERL_UTF8_CACHE_ASSERT
5810 assert(ulen == Perl_utf8_length(aTHX_ s, s + len));
5811#endif
5812 }
7e8c5dac
HS
5813 else {
5814 ulen = Perl_utf8_length(aTHX_ s, s + len);
5815 if (!mg && !SvREADONLY(sv)) {
5816 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
5817 mg = mg_find(sv, PERL_MAGIC_utf8);
5818 assert(mg);
5819 }
5820 if (mg)
5821 mg->mg_len = ulen;
5822 }
5823 return ulen;
5824 }
5825}
5826
5827/* S_utf8_mg_pos_init() is used to initialize the mg_ptr field of
5828 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5829 * between UTF-8 and byte offsets. There are two (substr offset and substr
5830 * length, the i offset, PERL_MAGIC_UTF8_CACHESIZE) times two (UTF-8 offset
5831 * and byte offset) cache positions.
5832 *
5833 * The mg_len field is used by sv_len_utf8(), see its comments.
5834 * Note that the mg_len is not the length of the mg_ptr field.
5835 *
5836 */
5837STATIC bool
245d4a47
NC
5838S_utf8_mg_pos_init(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i,
5839 I32 offsetp, const U8 *s, const U8 *start)
7e8c5dac 5840{
7a5fa8a2 5841 bool found = FALSE;
7e8c5dac
HS
5842
5843 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
8f78557a 5844 if (!*mgp)
27da23d5 5845 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0, 0);
7e8c5dac 5846 assert(*mgp);
b76347f2 5847
7e8c5dac
HS
5848 if ((*mgp)->mg_ptr)
5849 *cachep = (STRLEN *) (*mgp)->mg_ptr;
5850 else {
5851 Newz(0, *cachep, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
5852 (*mgp)->mg_ptr = (char *) *cachep;
5853 }
5854 assert(*cachep);
5855
a3b680e6 5856 (*cachep)[i] = offsetp;
7e8c5dac
HS
5857 (*cachep)[i+1] = s - start;
5858 found = TRUE;
a0ed51b3 5859 }
7e8c5dac
HS
5860
5861 return found;
a0ed51b3
LW
5862}
5863
645c22ef 5864/*
7e8c5dac
HS
5865 * S_utf8_mg_pos() is used to query and update mg_ptr field of
5866 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5867 * between UTF-8 and byte offsets. See also the comments of
5868 * S_utf8_mg_pos_init().
5869 *
5870 */
5871STATIC bool
245d4a47 5872S_utf8_mg_pos(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, I32 uoff, const U8 **sp, const U8 *start, const U8 *send)
7e8c5dac
HS
5873{
5874 bool found = FALSE;
5875
5876 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
5877 if (!*mgp)
5878 *mgp = mg_find(sv, PERL_MAGIC_utf8);
5879 if (*mgp && (*mgp)->mg_ptr) {
5880 *cachep = (STRLEN *) (*mgp)->mg_ptr;
e23c8137 5881 ASSERT_UTF8_CACHE(*cachep);
667208dd 5882 if ((*cachep)[i] == (STRLEN)uoff) /* An exact match. */
7a5fa8a2 5883 found = TRUE;
7e8c5dac
HS
5884 else { /* We will skip to the right spot. */
5885 STRLEN forw = 0;
5886 STRLEN backw = 0;
a3b680e6 5887 const U8* p = NULL;
7e8c5dac
HS
5888
5889 /* The assumption is that going backward is half
5890 * the speed of going forward (that's where the
5891 * 2 * backw in the below comes from). (The real
5892 * figure of course depends on the UTF-8 data.) */
5893
667208dd 5894 if ((*cachep)[i] > (STRLEN)uoff) {
7e8c5dac 5895 forw = uoff;
667208dd 5896 backw = (*cachep)[i] - (STRLEN)uoff;
7e8c5dac
HS
5897
5898 if (forw < 2 * backw)
5899 p = start;
5900 else
5901 p = start + (*cachep)[i+1];
5902 }
5903 /* Try this only for the substr offset (i == 0),
5904 * not for the substr length (i == 2). */
5905 else if (i == 0) { /* (*cachep)[i] < uoff */
a3b680e6 5906 const STRLEN ulen = sv_len_utf8(sv);
7e8c5dac 5907
667208dd
JH
5908 if ((STRLEN)uoff < ulen) {
5909 forw = (STRLEN)uoff - (*cachep)[i];
5910 backw = ulen - (STRLEN)uoff;
7e8c5dac
HS
5911
5912 if (forw < 2 * backw)
5913 p = start + (*cachep)[i+1];
5914 else
5915 p = send;
5916 }
5917
5918 /* If the string is not long enough for uoff,
5919 * we could extend it, but not at this low a level. */
5920 }
5921
5922 if (p) {
5923 if (forw < 2 * backw) {
5924 while (forw--)
5925 p += UTF8SKIP(p);
5926 }
5927 else {
5928 while (backw--) {
5929 p--;
5930 while (UTF8_IS_CONTINUATION(*p))
5931 p--;
5932 }
5933 }
5934
5935 /* Update the cache. */
667208dd 5936 (*cachep)[i] = (STRLEN)uoff;
7e8c5dac 5937 (*cachep)[i+1] = p - start;
8f78557a
AE
5938
5939 /* Drop the stale "length" cache */
5940 if (i == 0) {
5941 (*cachep)[2] = 0;
5942 (*cachep)[3] = 0;
5943 }
7a5fa8a2 5944
7e8c5dac
HS
5945 found = TRUE;
5946 }
5947 }
5948 if (found) { /* Setup the return values. */
5949 *offsetp = (*cachep)[i+1];
5950 *sp = start + *offsetp;
5951 if (*sp >= send) {
5952 *sp = send;
5953 *offsetp = send - start;
5954 }
5955 else if (*sp < start) {
5956 *sp = start;
5957 *offsetp = 0;
5958 }
5959 }
5960 }
e23c8137
JH
5961#ifdef PERL_UTF8_CACHE_ASSERT
5962 if (found) {
5963 U8 *s = start;
5964 I32 n = uoff;
5965
5966 while (n-- && s < send)
5967 s += UTF8SKIP(s);
5968
5969 if (i == 0) {
5970 assert(*offsetp == s - start);
5971 assert((*cachep)[0] == (STRLEN)uoff);
5972 assert((*cachep)[1] == *offsetp);
5973 }
5974 ASSERT_UTF8_CACHE(*cachep);
5975 }
5976#endif
7e8c5dac 5977 }
e23c8137 5978
7e8c5dac
HS
5979 return found;
5980}
7a5fa8a2 5981
7e8c5dac 5982/*
645c22ef
DM
5983=for apidoc sv_pos_u2b
5984
1e54db1a 5985Converts the value pointed to by offsetp from a count of UTF-8 chars from
645c22ef
DM
5986the start of the string, to a count of the equivalent number of bytes; if
5987lenp is non-zero, it does the same to lenp, but this time starting from
5988the offset, rather than from the start of the string. Handles magic and
5989type coercion.
5990
5991=cut
5992*/
5993
7e8c5dac
HS
5994/*
5995 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
5996 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5997 * byte offsets. See also the comments of S_utf8_mg_pos().
5998 *
5999 */
6000
a0ed51b3 6001void
864dbfa3 6002Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 6003{
245d4a47 6004 const U8 *start;
a0ed51b3
LW
6005 STRLEN len;
6006
6007 if (!sv)
6008 return;
6009
245d4a47 6010 start = (U8*)SvPV_const(sv, len);
7e8c5dac 6011 if (len) {
b464bac0
AL
6012 STRLEN boffset = 0;
6013 STRLEN *cache = 0;
245d4a47
NC
6014 const U8 *s = start;
6015 I32 uoffset = *offsetp;
6016 const U8 *send = s + len;
6017 MAGIC *mg = 0;
6018 bool found = FALSE;
7e8c5dac 6019
bdf77a2a 6020 if (utf8_mg_pos(sv, &mg, &cache, 0, offsetp, *offsetp, &s, start, send))
7e8c5dac
HS
6021 found = TRUE;
6022 if (!found && uoffset > 0) {
6023 while (s < send && uoffset--)
6024 s += UTF8SKIP(s);
6025 if (s >= send)
6026 s = send;
a3b680e6 6027 if (utf8_mg_pos_init(sv, &mg, &cache, 0, *offsetp, s, start))
7e8c5dac
HS
6028 boffset = cache[1];
6029 *offsetp = s - start;
6030 }
6031 if (lenp) {
6032 found = FALSE;
6033 start = s;
ec062429 6034 if (utf8_mg_pos(sv, &mg, &cache, 2, lenp, *lenp, &s, start, send)) {
7e8c5dac
HS
6035 *lenp -= boffset;
6036 found = TRUE;
6037 }
6038 if (!found && *lenp > 0) {
6039 I32 ulen = *lenp;
6040 if (ulen > 0)
6041 while (s < send && ulen--)
6042 s += UTF8SKIP(s);
6043 if (s >= send)
6044 s = send;
a3b680e6 6045 utf8_mg_pos_init(sv, &mg, &cache, 2, *lenp, s, start);
7e8c5dac
HS
6046 }
6047 *lenp = s - start;
6048 }
e23c8137 6049 ASSERT_UTF8_CACHE(cache);
7e8c5dac
HS
6050 }
6051 else {
6052 *offsetp = 0;
6053 if (lenp)
6054 *lenp = 0;
a0ed51b3 6055 }
e23c8137 6056
a0ed51b3
LW
6057 return;
6058}
6059
645c22ef
DM
6060/*
6061=for apidoc sv_pos_b2u
6062
6063Converts the value pointed to by offsetp from a count of bytes from the
1e54db1a 6064start of the string, to a count of the equivalent number of UTF-8 chars.
645c22ef
DM
6065Handles magic and type coercion.
6066
6067=cut
6068*/
6069
7e8c5dac
HS
6070/*
6071 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
6072 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
6073 * byte offsets. See also the comments of S_utf8_mg_pos().
6074 *
6075 */
6076
a0ed51b3 6077void
7e8c5dac 6078Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 6079{
83003860 6080 const U8* s;
a0ed51b3
LW
6081 STRLEN len;
6082
6083 if (!sv)
6084 return;
6085
83003860 6086 s = (const U8*)SvPV_const(sv, len);
eb160463 6087 if ((I32)len < *offsetp)
a0dbb045 6088 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac 6089 else {
83003860 6090 const U8* send = s + *offsetp;
7e8c5dac
HS
6091 MAGIC* mg = NULL;
6092 STRLEN *cache = NULL;
6093
6094 len = 0;
6095
6096 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
6097 mg = mg_find(sv, PERL_MAGIC_utf8);
6098 if (mg && mg->mg_ptr) {
6099 cache = (STRLEN *) mg->mg_ptr;
c5661c80 6100 if (cache[1] == (STRLEN)*offsetp) {
7e8c5dac
HS
6101 /* An exact match. */
6102 *offsetp = cache[0];
6103
6104 return;
6105 }
c5661c80 6106 else if (cache[1] < (STRLEN)*offsetp) {
7e8c5dac
HS
6107 /* We already know part of the way. */
6108 len = cache[0];
6109 s += cache[1];
7a5fa8a2 6110 /* Let the below loop do the rest. */
7e8c5dac
HS
6111 }
6112 else { /* cache[1] > *offsetp */
6113 /* We already know all of the way, now we may
6114 * be able to walk back. The same assumption
6115 * is made as in S_utf8_mg_pos(), namely that
6116 * walking backward is twice slower than
6117 * walking forward. */
6118 STRLEN forw = *offsetp;
6119 STRLEN backw = cache[1] - *offsetp;
6120
6121 if (!(forw < 2 * backw)) {
83003860 6122 const U8 *p = s + cache[1];
7e8c5dac 6123 STRLEN ubackw = 0;
7a5fa8a2 6124
a5b510f2
AE
6125 cache[1] -= backw;
6126
7e8c5dac
HS
6127 while (backw--) {
6128 p--;
0aeb64d0 6129 while (UTF8_IS_CONTINUATION(*p)) {
7e8c5dac 6130 p--;
0aeb64d0
JH
6131 backw--;
6132 }
7e8c5dac
HS
6133 ubackw++;
6134 }
6135
6136 cache[0] -= ubackw;
0aeb64d0 6137 *offsetp = cache[0];
a67d7df9
TS
6138
6139 /* Drop the stale "length" cache */
6140 cache[2] = 0;
6141 cache[3] = 0;
6142
0aeb64d0 6143 return;
7e8c5dac
HS
6144 }
6145 }
6146 }
e23c8137 6147 ASSERT_UTF8_CACHE(cache);
a0dbb045 6148 }
7e8c5dac
HS
6149
6150 while (s < send) {
6151 STRLEN n = 1;
6152
6153 /* Call utf8n_to_uvchr() to validate the sequence
6154 * (unless a simple non-UTF character) */
6155 if (!UTF8_IS_INVARIANT(*s))
6156 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
6157 if (n > 0) {
6158 s += n;
6159 len++;
6160 }
6161 else
6162 break;
6163 }
6164
6165 if (!SvREADONLY(sv)) {
6166 if (!mg) {
6167 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
6168 mg = mg_find(sv, PERL_MAGIC_utf8);
6169 }
6170 assert(mg);
6171
6172 if (!mg->mg_ptr) {
979acdb5 6173 Newz(0, cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7e8c5dac
HS
6174 mg->mg_ptr = (char *) cache;
6175 }
6176 assert(cache);
6177
6178 cache[0] = len;
6179 cache[1] = *offsetp;
a67d7df9
TS
6180 /* Drop the stale "length" cache */
6181 cache[2] = 0;
6182 cache[3] = 0;
7e8c5dac
HS
6183 }
6184
6185 *offsetp = len;
a0ed51b3 6186 }
a0ed51b3
LW
6187 return;
6188}
6189
954c1994
GS
6190/*
6191=for apidoc sv_eq
6192
6193Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
6194identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6195coerce its args to strings if necessary.
954c1994
GS
6196
6197=cut
6198*/
6199
79072805 6200I32
e01b9e88 6201Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805 6202{
e1ec3a88 6203 const char *pv1;
463ee0b2 6204 STRLEN cur1;
e1ec3a88 6205 const char *pv2;
463ee0b2 6206 STRLEN cur2;
e01b9e88 6207 I32 eq = 0;
553e1bcc
AT
6208 char *tpv = Nullch;
6209 SV* svrecode = Nullsv;
79072805 6210
e01b9e88 6211 if (!sv1) {
79072805
LW
6212 pv1 = "";
6213 cur1 = 0;
6214 }
463ee0b2 6215 else
4d84ee25 6216 pv1 = SvPV_const(sv1, cur1);
79072805 6217
e01b9e88
SC
6218 if (!sv2){
6219 pv2 = "";
6220 cur2 = 0;
92d29cee 6221 }
e01b9e88 6222 else
4d84ee25 6223 pv2 = SvPV_const(sv2, cur2);
79072805 6224
cf48d248 6225 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6226 /* Differing utf8ness.
6227 * Do not UTF8size the comparands as a side-effect. */
6228 if (PL_encoding) {
6229 if (SvUTF8(sv1)) {
553e1bcc
AT
6230 svrecode = newSVpvn(pv2, cur2);
6231 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6232 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
6233 }
6234 else {
553e1bcc
AT
6235 svrecode = newSVpvn(pv1, cur1);
6236 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6237 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
6238 }
6239 /* Now both are in UTF-8. */
0a1bd7ac
DM
6240 if (cur1 != cur2) {
6241 SvREFCNT_dec(svrecode);
799ef3cb 6242 return FALSE;
0a1bd7ac 6243 }
799ef3cb
JH
6244 }
6245 else {
6246 bool is_utf8 = TRUE;
6247
6248 if (SvUTF8(sv1)) {
6249 /* sv1 is the UTF-8 one,
6250 * if is equal it must be downgrade-able */
e1ec3a88 6251 char *pv = (char*)bytes_from_utf8((const U8*)pv1,
799ef3cb
JH
6252 &cur1, &is_utf8);
6253 if (pv != pv1)
553e1bcc 6254 pv1 = tpv = pv;
799ef3cb
JH
6255 }
6256 else {
6257 /* sv2 is the UTF-8 one,
6258 * if is equal it must be downgrade-able */
e1ec3a88 6259 char *pv = (char *)bytes_from_utf8((const U8*)pv2,
799ef3cb
JH
6260 &cur2, &is_utf8);
6261 if (pv != pv2)
553e1bcc 6262 pv2 = tpv = pv;
799ef3cb
JH
6263 }
6264 if (is_utf8) {
6265 /* Downgrade not possible - cannot be eq */
bf694877 6266 assert (tpv == 0);
799ef3cb
JH
6267 return FALSE;
6268 }
6269 }
cf48d248
JH
6270 }
6271
6272 if (cur1 == cur2)
765f542d 6273 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 6274
553e1bcc
AT
6275 if (svrecode)
6276 SvREFCNT_dec(svrecode);
799ef3cb 6277
553e1bcc
AT
6278 if (tpv)
6279 Safefree(tpv);
cf48d248 6280
e01b9e88 6281 return eq;
79072805
LW
6282}
6283
954c1994
GS
6284/*
6285=for apidoc sv_cmp
6286
6287Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
6288string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
6289C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6290coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
6291
6292=cut
6293*/
6294
79072805 6295I32
e01b9e88 6296Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 6297{
560a288e 6298 STRLEN cur1, cur2;
e1ec3a88
AL
6299 const char *pv1, *pv2;
6300 char *tpv = Nullch;
cf48d248 6301 I32 cmp;
553e1bcc 6302 SV *svrecode = Nullsv;
560a288e 6303
e01b9e88
SC
6304 if (!sv1) {
6305 pv1 = "";
560a288e
GS
6306 cur1 = 0;
6307 }
e01b9e88 6308 else
4d84ee25 6309 pv1 = SvPV_const(sv1, cur1);
560a288e 6310
553e1bcc 6311 if (!sv2) {
e01b9e88 6312 pv2 = "";
560a288e
GS
6313 cur2 = 0;
6314 }
e01b9e88 6315 else
4d84ee25 6316 pv2 = SvPV_const(sv2, cur2);
79072805 6317
cf48d248 6318 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6319 /* Differing utf8ness.
6320 * Do not UTF8size the comparands as a side-effect. */
cf48d248 6321 if (SvUTF8(sv1)) {
799ef3cb 6322 if (PL_encoding) {
553e1bcc
AT
6323 svrecode = newSVpvn(pv2, cur2);
6324 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6325 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
6326 }
6327 else {
e1ec3a88 6328 pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
799ef3cb 6329 }
cf48d248
JH
6330 }
6331 else {
799ef3cb 6332 if (PL_encoding) {
553e1bcc
AT
6333 svrecode = newSVpvn(pv1, cur1);
6334 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6335 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
6336 }
6337 else {
e1ec3a88 6338 pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
799ef3cb 6339 }
cf48d248
JH
6340 }
6341 }
6342
e01b9e88 6343 if (!cur1) {
cf48d248 6344 cmp = cur2 ? -1 : 0;
e01b9e88 6345 } else if (!cur2) {
cf48d248
JH
6346 cmp = 1;
6347 } else {
e1ec3a88 6348 const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
6349
6350 if (retval) {
cf48d248 6351 cmp = retval < 0 ? -1 : 1;
e01b9e88 6352 } else if (cur1 == cur2) {
cf48d248
JH
6353 cmp = 0;
6354 } else {
6355 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 6356 }
cf48d248 6357 }
16660edb 6358
553e1bcc
AT
6359 if (svrecode)
6360 SvREFCNT_dec(svrecode);
799ef3cb 6361
553e1bcc
AT
6362 if (tpv)
6363 Safefree(tpv);
cf48d248
JH
6364
6365 return cmp;
bbce6d69 6366}
16660edb 6367
c461cf8f
JH
6368/*
6369=for apidoc sv_cmp_locale
6370
645c22ef
DM
6371Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6372'use bytes' aware, handles get magic, and will coerce its args to strings
6373if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
6374
6375=cut
6376*/
6377
bbce6d69 6378I32
864dbfa3 6379Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 6380{
36477c24 6381#ifdef USE_LOCALE_COLLATE
16660edb 6382
bbce6d69 6383 char *pv1, *pv2;
6384 STRLEN len1, len2;
6385 I32 retval;
16660edb 6386
3280af22 6387 if (PL_collation_standard)
bbce6d69 6388 goto raw_compare;
16660edb 6389
bbce6d69 6390 len1 = 0;
8ac85365 6391 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 6392 len2 = 0;
8ac85365 6393 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 6394
bbce6d69 6395 if (!pv1 || !len1) {
6396 if (pv2 && len2)
6397 return -1;
6398 else
6399 goto raw_compare;
6400 }
6401 else {
6402 if (!pv2 || !len2)
6403 return 1;
6404 }
16660edb 6405
bbce6d69 6406 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 6407
bbce6d69 6408 if (retval)
16660edb 6409 return retval < 0 ? -1 : 1;
6410
bbce6d69 6411 /*
6412 * When the result of collation is equality, that doesn't mean
6413 * that there are no differences -- some locales exclude some
6414 * characters from consideration. So to avoid false equalities,
6415 * we use the raw string as a tiebreaker.
6416 */
16660edb 6417
bbce6d69 6418 raw_compare:
6419 /* FALL THROUGH */
16660edb 6420
36477c24 6421#endif /* USE_LOCALE_COLLATE */
16660edb 6422
bbce6d69 6423 return sv_cmp(sv1, sv2);
6424}
79072805 6425
645c22ef 6426
36477c24 6427#ifdef USE_LOCALE_COLLATE
645c22ef 6428
7a4c00b4 6429/*
645c22ef
DM
6430=for apidoc sv_collxfrm
6431
6432Add Collate Transform magic to an SV if it doesn't already have it.
6433
6434Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6435scalar data of the variable, but transformed to such a format that a normal
6436memory comparison can be used to compare the data according to the locale
6437settings.
6438
6439=cut
6440*/
6441
bbce6d69 6442char *
864dbfa3 6443Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 6444{
7a4c00b4 6445 MAGIC *mg;
16660edb 6446
14befaf4 6447 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 6448 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
93524f2b
NC
6449 const char *s;
6450 char *xf;
bbce6d69 6451 STRLEN len, xlen;
6452
7a4c00b4 6453 if (mg)
6454 Safefree(mg->mg_ptr);
93524f2b 6455 s = SvPV_const(sv, len);
bbce6d69 6456 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 6457 if (SvREADONLY(sv)) {
6458 SAVEFREEPV(xf);
6459 *nxp = xlen;
3280af22 6460 return xf + sizeof(PL_collation_ix);
ff0cee69 6461 }
7a4c00b4 6462 if (! mg) {
14befaf4
DM
6463 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
6464 mg = mg_find(sv, PERL_MAGIC_collxfrm);
7a4c00b4 6465 assert(mg);
bbce6d69 6466 }
7a4c00b4 6467 mg->mg_ptr = xf;
565764a8 6468 mg->mg_len = xlen;
7a4c00b4 6469 }
6470 else {
ff0cee69 6471 if (mg) {
6472 mg->mg_ptr = NULL;
565764a8 6473 mg->mg_len = -1;
ff0cee69 6474 }
bbce6d69 6475 }
6476 }
7a4c00b4 6477 if (mg && mg->mg_ptr) {
565764a8 6478 *nxp = mg->mg_len;
3280af22 6479 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 6480 }
6481 else {
6482 *nxp = 0;
6483 return NULL;
16660edb 6484 }
79072805
LW
6485}
6486
36477c24 6487#endif /* USE_LOCALE_COLLATE */
bbce6d69 6488
c461cf8f
JH
6489/*
6490=for apidoc sv_gets
6491
6492Get a line from the filehandle and store it into the SV, optionally
6493appending to the currently-stored string.
6494
6495=cut
6496*/
6497
79072805 6498char *
864dbfa3 6499Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 6500{
e1ec3a88 6501 const char *rsptr;
c07a80fd 6502 STRLEN rslen;
6503 register STDCHAR rslast;
6504 register STDCHAR *bp;
6505 register I32 cnt;
9c5ffd7c 6506 I32 i = 0;
8bfdd7d9 6507 I32 rspara = 0;
e311fd51 6508 I32 recsize;
c07a80fd 6509
bc44a8a2
NC
6510 if (SvTHINKFIRST(sv))
6511 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
6512 /* XXX. If you make this PVIV, then copy on write can copy scalars read
6513 from <>.
6514 However, perlbench says it's slower, because the existing swipe code
6515 is faster than copy on write.
6516 Swings and roundabouts. */
862a34c6 6517 SvUPGRADE(sv, SVt_PV);
99491443 6518
ff68c719 6519 SvSCREAM_off(sv);
efd8b2ba
AE
6520
6521 if (append) {
6522 if (PerlIO_isutf8(fp)) {
6523 if (!SvUTF8(sv)) {
6524 sv_utf8_upgrade_nomg(sv);
6525 sv_pos_u2b(sv,&append,0);
6526 }
6527 } else if (SvUTF8(sv)) {
1b6737cc 6528 SV * const tsv = NEWSV(0,0);
efd8b2ba
AE
6529 sv_gets(tsv, fp, 0);
6530 sv_utf8_upgrade_nomg(tsv);
6531 SvCUR_set(sv,append);
6532 sv_catsv(sv,tsv);
6533 sv_free(tsv);
6534 goto return_string_or_null;
6535 }
6536 }
6537
6538 SvPOK_only(sv);
6539 if (PerlIO_isutf8(fp))
6540 SvUTF8_on(sv);
c07a80fd 6541
923e4eb5 6542 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
6543 /* we always read code in line mode */
6544 rsptr = "\n";
6545 rslen = 1;
6546 }
6547 else if (RsSNARF(PL_rs)) {
7a5fa8a2
NIS
6548 /* If it is a regular disk file use size from stat() as estimate
6549 of amount we are going to read - may result in malloc-ing
6550 more memory than we realy need if layers bellow reduce
e468d35b
NIS
6551 size we read (e.g. CRLF or a gzip layer)
6552 */
e311fd51 6553 Stat_t st;
e468d35b 6554 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
f54cb97a 6555 const Off_t offset = PerlIO_tell(fp);
58f1856e 6556 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
6557 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6558 }
6559 }
c07a80fd 6560 rsptr = NULL;
6561 rslen = 0;
6562 }
3280af22 6563 else if (RsRECORD(PL_rs)) {
e311fd51 6564 I32 bytesread;
5b2b9c68
HM
6565 char *buffer;
6566
6567 /* Grab the size of the record we're getting */
3280af22 6568 recsize = SvIV(SvRV(PL_rs));
e311fd51 6569 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
6570 /* Go yank in */
6571#ifdef VMS
6572 /* VMS wants read instead of fread, because fread doesn't respect */
6573 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
6574 /* doing, but we've got no other real choice - except avoid stdio
6575 as implementation - perhaps write a :vms layer ?
6576 */
5b2b9c68
HM
6577 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
6578#else
6579 bytesread = PerlIO_read(fp, buffer, recsize);
6580#endif
27e6ca2d
AE
6581 if (bytesread < 0)
6582 bytesread = 0;
e311fd51 6583 SvCUR_set(sv, bytesread += append);
e670df4e 6584 buffer[bytesread] = '\0';
efd8b2ba 6585 goto return_string_or_null;
5b2b9c68 6586 }
3280af22 6587 else if (RsPARA(PL_rs)) {
c07a80fd 6588 rsptr = "\n\n";
6589 rslen = 2;
8bfdd7d9 6590 rspara = 1;
c07a80fd 6591 }
7d59b7e4
NIS
6592 else {
6593 /* Get $/ i.e. PL_rs into same encoding as stream wants */
6594 if (PerlIO_isutf8(fp)) {
6595 rsptr = SvPVutf8(PL_rs, rslen);
6596 }
6597 else {
6598 if (SvUTF8(PL_rs)) {
6599 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
6600 Perl_croak(aTHX_ "Wide character in $/");
6601 }
6602 }
93524f2b 6603 rsptr = SvPV_const(PL_rs, rslen);
7d59b7e4
NIS
6604 }
6605 }
6606
c07a80fd 6607 rslast = rslen ? rsptr[rslen - 1] : '\0';
6608
8bfdd7d9 6609 if (rspara) { /* have to do this both before and after */
79072805 6610 do { /* to make sure file boundaries work right */
760ac839 6611 if (PerlIO_eof(fp))
a0d0e21e 6612 return 0;
760ac839 6613 i = PerlIO_getc(fp);
79072805 6614 if (i != '\n') {
a0d0e21e
LW
6615 if (i == -1)
6616 return 0;
760ac839 6617 PerlIO_ungetc(fp,i);
79072805
LW
6618 break;
6619 }
6620 } while (i != EOF);
6621 }
c07a80fd 6622
760ac839
LW
6623 /* See if we know enough about I/O mechanism to cheat it ! */
6624
6625 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 6626 of abstracting out stdio interface. One call should be cheap
760ac839
LW
6627 enough here - and may even be a macro allowing compile
6628 time optimization.
6629 */
6630
6631 if (PerlIO_fast_gets(fp)) {
6632
6633 /*
6634 * We're going to steal some values from the stdio struct
6635 * and put EVERYTHING in the innermost loop into registers.
6636 */
6637 register STDCHAR *ptr;
6638 STRLEN bpx;
6639 I32 shortbuffered;
6640
16660edb 6641#if defined(VMS) && defined(PERLIO_IS_STDIO)
6642 /* An ungetc()d char is handled separately from the regular
6643 * buffer, so we getc() it back out and stuff it in the buffer.
6644 */
6645 i = PerlIO_getc(fp);
6646 if (i == EOF) return 0;
6647 *(--((*fp)->_ptr)) = (unsigned char) i;
6648 (*fp)->_cnt++;
6649#endif
c07a80fd 6650
c2960299 6651 /* Here is some breathtakingly efficient cheating */
c07a80fd 6652
a20bf0c3 6653 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b 6654 /* make sure we have the room */
7a5fa8a2 6655 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
e468d35b 6656 /* Not room for all of it
7a5fa8a2 6657 if we are looking for a separator and room for some
e468d35b
NIS
6658 */
6659 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7a5fa8a2 6660 /* just process what we have room for */
79072805
LW
6661 shortbuffered = cnt - SvLEN(sv) + append + 1;
6662 cnt -= shortbuffered;
6663 }
6664 else {
6665 shortbuffered = 0;
bbce6d69 6666 /* remember that cnt can be negative */
eb160463 6667 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
6668 }
6669 }
7a5fa8a2 6670 else
79072805 6671 shortbuffered = 0;
3f7c398e 6672 bp = (STDCHAR*)SvPVX_const(sv) + append; /* move these two too to registers */
a20bf0c3 6673 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 6674 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6675 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 6676 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 6677 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6678 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6679 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
6680 for (;;) {
6681 screamer:
93a17b20 6682 if (cnt > 0) {
c07a80fd 6683 if (rslen) {
760ac839
LW
6684 while (cnt > 0) { /* this | eat */
6685 cnt--;
c07a80fd 6686 if ((*bp++ = *ptr++) == rslast) /* really | dust */
6687 goto thats_all_folks; /* screams | sed :-) */
6688 }
6689 }
6690 else {
1c846c1f
NIS
6691 Copy(ptr, bp, cnt, char); /* this | eat */
6692 bp += cnt; /* screams | dust */
c07a80fd 6693 ptr += cnt; /* louder | sed :-) */
a5f75d66 6694 cnt = 0;
93a17b20 6695 }
79072805
LW
6696 }
6697
748a9306 6698 if (shortbuffered) { /* oh well, must extend */
79072805
LW
6699 cnt = shortbuffered;
6700 shortbuffered = 0;
3f7c398e 6701 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6702 SvCUR_set(sv, bpx);
6703 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3f7c398e 6704 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
79072805
LW
6705 continue;
6706 }
6707
16660edb 6708 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
6709 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
6710 PTR2UV(ptr),(long)cnt));
cc00df79 6711 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 6712#if 0
16660edb 6713 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6714 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6715 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6716 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6717#endif
1c846c1f 6718 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 6719 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
6720 another abstraction. */
760ac839 6721 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 6722#if 0
16660edb 6723 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6724 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6725 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6726 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6727#endif
a20bf0c3
JH
6728 cnt = PerlIO_get_cnt(fp);
6729 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 6730 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6731 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 6732
748a9306
LW
6733 if (i == EOF) /* all done for ever? */
6734 goto thats_really_all_folks;
6735
3f7c398e 6736 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6737 SvCUR_set(sv, bpx);
6738 SvGROW(sv, bpx + cnt + 2);
3f7c398e 6739 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
c07a80fd 6740
eb160463 6741 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 6742
c07a80fd 6743 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 6744 goto thats_all_folks;
79072805
LW
6745 }
6746
6747thats_all_folks:
3f7c398e 6748 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
36477c24 6749 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 6750 goto screamer; /* go back to the fray */
79072805
LW
6751thats_really_all_folks:
6752 if (shortbuffered)
6753 cnt += shortbuffered;
16660edb 6754 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6755 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 6756 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 6757 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6758 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6759 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6760 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 6761 *bp = '\0';
3f7c398e 6762 SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv)); /* set length */
16660edb 6763 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 6764 "Screamer: done, len=%ld, string=|%.*s|\n",
3f7c398e 6765 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
760ac839
LW
6766 }
6767 else
79072805 6768 {
6edd2cd5 6769 /*The big, slow, and stupid way. */
27da23d5 6770#ifdef USE_HEAP_INSTEAD_OF_STACK /* Even slower way. */
6edd2cd5
JH
6771 STDCHAR *buf = 0;
6772 New(0, buf, 8192, STDCHAR);
6773 assert(buf);
4d2c4e07 6774#else
6edd2cd5 6775 STDCHAR buf[8192];
4d2c4e07 6776#endif
79072805 6777
760ac839 6778screamer2:
c07a80fd 6779 if (rslen) {
6867be6d 6780 const register STDCHAR *bpe = buf + sizeof(buf);
760ac839 6781 bp = buf;
eb160463 6782 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
6783 ; /* keep reading */
6784 cnt = bp - buf;
c07a80fd 6785 }
6786 else {
760ac839 6787 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 6788 /* Accomodate broken VAXC compiler, which applies U8 cast to
6789 * both args of ?: operator, causing EOF to change into 255
6790 */
37be0adf 6791 if (cnt > 0)
cbe9e203
JH
6792 i = (U8)buf[cnt - 1];
6793 else
37be0adf 6794 i = EOF;
c07a80fd 6795 }
79072805 6796
cbe9e203
JH
6797 if (cnt < 0)
6798 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
6799 if (append)
6800 sv_catpvn(sv, (char *) buf, cnt);
6801 else
6802 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 6803
6804 if (i != EOF && /* joy */
6805 (!rslen ||
6806 SvCUR(sv) < rslen ||
3f7c398e 6807 memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
6808 {
6809 append = -1;
63e4d877
CS
6810 /*
6811 * If we're reading from a TTY and we get a short read,
6812 * indicating that the user hit his EOF character, we need
6813 * to notice it now, because if we try to read from the TTY
6814 * again, the EOF condition will disappear.
6815 *
6816 * The comparison of cnt to sizeof(buf) is an optimization
6817 * that prevents unnecessary calls to feof().
6818 *
6819 * - jik 9/25/96
6820 */
6821 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
6822 goto screamer2;
79072805 6823 }
6edd2cd5 6824
27da23d5 6825#ifdef USE_HEAP_INSTEAD_OF_STACK
6edd2cd5
JH
6826 Safefree(buf);
6827#endif
79072805
LW
6828 }
6829
8bfdd7d9 6830 if (rspara) { /* have to do this both before and after */
c07a80fd 6831 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 6832 i = PerlIO_getc(fp);
79072805 6833 if (i != '\n') {
760ac839 6834 PerlIO_ungetc(fp,i);
79072805
LW
6835 break;
6836 }
6837 }
6838 }
c07a80fd 6839
efd8b2ba 6840return_string_or_null:
c07a80fd 6841 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
6842}
6843
954c1994
GS
6844/*
6845=for apidoc sv_inc
6846
645c22ef
DM
6847Auto-increment of the value in the SV, doing string to numeric conversion
6848if necessary. Handles 'get' magic.
954c1994
GS
6849
6850=cut
6851*/
6852
79072805 6853void
864dbfa3 6854Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
6855{
6856 register char *d;
463ee0b2 6857 int flags;
79072805
LW
6858
6859 if (!sv)
6860 return;
b23a5f78
GB
6861 if (SvGMAGICAL(sv))
6862 mg_get(sv);
ed6116ce 6863 if (SvTHINKFIRST(sv)) {
765f542d
NC
6864 if (SvIsCOW(sv))
6865 sv_force_normal_flags(sv, 0);
0f15f207 6866 if (SvREADONLY(sv)) {
923e4eb5 6867 if (IN_PERL_RUNTIME)
cea2e8a9 6868 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6869 }
a0d0e21e 6870 if (SvROK(sv)) {
b5be31e9 6871 IV i;
9e7bc3e8
JD
6872 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
6873 return;
56431972 6874 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6875 sv_unref(sv);
6876 sv_setiv(sv, i);
a0d0e21e 6877 }
ed6116ce 6878 }
8990e307 6879 flags = SvFLAGS(sv);
28e5dec8
JH
6880 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
6881 /* It's (privately or publicly) a float, but not tested as an
6882 integer, so test it to see. */
d460ef45 6883 (void) SvIV(sv);
28e5dec8
JH
6884 flags = SvFLAGS(sv);
6885 }
6886 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6887 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6888#ifdef PERL_PRESERVE_IVUV
28e5dec8 6889 oops_its_int:
59d8ce62 6890#endif
25da4f38
IZ
6891 if (SvIsUV(sv)) {
6892 if (SvUVX(sv) == UV_MAX)
a1e868e7 6893 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
6894 else
6895 (void)SvIOK_only_UV(sv);
607fa7f2 6896 SvUV_set(sv, SvUVX(sv) + 1);
25da4f38
IZ
6897 } else {
6898 if (SvIVX(sv) == IV_MAX)
28e5dec8 6899 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
6900 else {
6901 (void)SvIOK_only(sv);
45977657 6902 SvIV_set(sv, SvIVX(sv) + 1);
1c846c1f 6903 }
55497cff 6904 }
79072805
LW
6905 return;
6906 }
28e5dec8
JH
6907 if (flags & SVp_NOK) {
6908 (void)SvNOK_only(sv);
9d6ce603 6909 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6910 return;
6911 }
6912
3f7c398e 6913 if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
28e5dec8 6914 if ((flags & SVTYPEMASK) < SVt_PVIV)
f5282e15 6915 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
28e5dec8 6916 (void)SvIOK_only(sv);
45977657 6917 SvIV_set(sv, 1);
79072805
LW
6918 return;
6919 }
463ee0b2 6920 d = SvPVX(sv);
79072805
LW
6921 while (isALPHA(*d)) d++;
6922 while (isDIGIT(*d)) d++;
6923 if (*d) {
28e5dec8 6924#ifdef PERL_PRESERVE_IVUV
d1be9408 6925 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
6926 warnings. Probably ought to make the sv_iv_please() that does
6927 the conversion if possible, and silently. */
504618e9 6928 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
6929 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6930 /* Need to try really hard to see if it's an integer.
6931 9.22337203685478e+18 is an integer.
6932 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6933 so $a="9.22337203685478e+18"; $a+0; $a++
6934 needs to be the same as $a="9.22337203685478e+18"; $a++
6935 or we go insane. */
d460ef45 6936
28e5dec8
JH
6937 (void) sv_2iv(sv);
6938 if (SvIOK(sv))
6939 goto oops_its_int;
6940
6941 /* sv_2iv *should* have made this an NV */
6942 if (flags & SVp_NOK) {
6943 (void)SvNOK_only(sv);
9d6ce603 6944 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6945 return;
6946 }
6947 /* I don't think we can get here. Maybe I should assert this
6948 And if we do get here I suspect that sv_setnv will croak. NWC
6949 Fall through. */
6950#if defined(USE_LONG_DOUBLE)
6951 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",
3f7c398e 6952 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 6953#else
1779d84d 6954 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
3f7c398e 6955 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
6956#endif
6957 }
6958#endif /* PERL_PRESERVE_IVUV */
3f7c398e 6959 sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
79072805
LW
6960 return;
6961 }
6962 d--;
3f7c398e 6963 while (d >= SvPVX_const(sv)) {
79072805
LW
6964 if (isDIGIT(*d)) {
6965 if (++*d <= '9')
6966 return;
6967 *(d--) = '0';
6968 }
6969 else {
9d116dd7
JH
6970#ifdef EBCDIC
6971 /* MKS: The original code here died if letters weren't consecutive.
6972 * at least it didn't have to worry about non-C locales. The
6973 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 6974 * arranged in order (although not consecutively) and that only
9d116dd7
JH
6975 * [A-Za-z] are accepted by isALPHA in the C locale.
6976 */
6977 if (*d != 'z' && *d != 'Z') {
6978 do { ++*d; } while (!isALPHA(*d));
6979 return;
6980 }
6981 *(d--) -= 'z' - 'a';
6982#else
79072805
LW
6983 ++*d;
6984 if (isALPHA(*d))
6985 return;
6986 *(d--) -= 'z' - 'a' + 1;
9d116dd7 6987#endif
79072805
LW
6988 }
6989 }
6990 /* oh,oh, the number grew */
6991 SvGROW(sv, SvCUR(sv) + 2);
b162af07 6992 SvCUR_set(sv, SvCUR(sv) + 1);
3f7c398e 6993 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
79072805
LW
6994 *d = d[-1];
6995 if (isDIGIT(d[1]))
6996 *d = '1';
6997 else
6998 *d = d[1];
6999}
7000
954c1994
GS
7001/*
7002=for apidoc sv_dec
7003
645c22ef
DM
7004Auto-decrement of the value in the SV, doing string to numeric conversion
7005if necessary. Handles 'get' magic.
954c1994
GS
7006
7007=cut
7008*/
7009
79072805 7010void
864dbfa3 7011Perl_sv_dec(pTHX_ register SV *sv)
79072805 7012{
463ee0b2
LW
7013 int flags;
7014
79072805
LW
7015 if (!sv)
7016 return;
b23a5f78
GB
7017 if (SvGMAGICAL(sv))
7018 mg_get(sv);
ed6116ce 7019 if (SvTHINKFIRST(sv)) {
765f542d
NC
7020 if (SvIsCOW(sv))
7021 sv_force_normal_flags(sv, 0);
0f15f207 7022 if (SvREADONLY(sv)) {
923e4eb5 7023 if (IN_PERL_RUNTIME)
cea2e8a9 7024 Perl_croak(aTHX_ PL_no_modify);
0f15f207 7025 }
a0d0e21e 7026 if (SvROK(sv)) {
b5be31e9 7027 IV i;
9e7bc3e8
JD
7028 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
7029 return;
56431972 7030 i = PTR2IV(SvRV(sv));
b5be31e9
SM
7031 sv_unref(sv);
7032 sv_setiv(sv, i);
a0d0e21e 7033 }
ed6116ce 7034 }
28e5dec8
JH
7035 /* Unlike sv_inc we don't have to worry about string-never-numbers
7036 and keeping them magic. But we mustn't warn on punting */
8990e307 7037 flags = SvFLAGS(sv);
28e5dec8
JH
7038 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7039 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 7040#ifdef PERL_PRESERVE_IVUV
28e5dec8 7041 oops_its_int:
59d8ce62 7042#endif
25da4f38
IZ
7043 if (SvIsUV(sv)) {
7044 if (SvUVX(sv) == 0) {
7045 (void)SvIOK_only(sv);
45977657 7046 SvIV_set(sv, -1);
25da4f38
IZ
7047 }
7048 else {
7049 (void)SvIOK_only_UV(sv);
607fa7f2 7050 SvUV_set(sv, SvUVX(sv) + 1);
1c846c1f 7051 }
25da4f38
IZ
7052 } else {
7053 if (SvIVX(sv) == IV_MIN)
65202027 7054 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
7055 else {
7056 (void)SvIOK_only(sv);
45977657 7057 SvIV_set(sv, SvIVX(sv) - 1);
1c846c1f 7058 }
55497cff 7059 }
7060 return;
7061 }
28e5dec8 7062 if (flags & SVp_NOK) {
9d6ce603 7063 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
7064 (void)SvNOK_only(sv);
7065 return;
7066 }
8990e307 7067 if (!(flags & SVp_POK)) {
4633a7c4
LW
7068 if ((flags & SVTYPEMASK) < SVt_PVNV)
7069 sv_upgrade(sv, SVt_NV);
f599b64b 7070 SvNV_set(sv, 1.0);
a0d0e21e 7071 (void)SvNOK_only(sv);
79072805
LW
7072 return;
7073 }
28e5dec8
JH
7074#ifdef PERL_PRESERVE_IVUV
7075 {
504618e9 7076 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
7077 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7078 /* Need to try really hard to see if it's an integer.
7079 9.22337203685478e+18 is an integer.
7080 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7081 so $a="9.22337203685478e+18"; $a+0; $a--
7082 needs to be the same as $a="9.22337203685478e+18"; $a--
7083 or we go insane. */
d460ef45 7084
28e5dec8
JH
7085 (void) sv_2iv(sv);
7086 if (SvIOK(sv))
7087 goto oops_its_int;
7088
7089 /* sv_2iv *should* have made this an NV */
7090 if (flags & SVp_NOK) {
7091 (void)SvNOK_only(sv);
9d6ce603 7092 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
7093 return;
7094 }
7095 /* I don't think we can get here. Maybe I should assert this
7096 And if we do get here I suspect that sv_setnv will croak. NWC
7097 Fall through. */
7098#if defined(USE_LONG_DOUBLE)
7099 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",
3f7c398e 7100 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 7101#else
1779d84d 7102 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
3f7c398e 7103 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
7104#endif
7105 }
7106 }
7107#endif /* PERL_PRESERVE_IVUV */
3f7c398e 7108 sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0); /* punt */
79072805
LW
7109}
7110
954c1994
GS
7111/*
7112=for apidoc sv_mortalcopy
7113
645c22ef 7114Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
7115The new SV is marked as mortal. It will be destroyed "soon", either by an
7116explicit call to FREETMPS, or by an implicit call at places such as
7117statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
7118
7119=cut
7120*/
7121
79072805
LW
7122/* Make a string that will exist for the duration of the expression
7123 * evaluation. Actually, it may have to last longer than that, but
7124 * hopefully we won't free it until it has been assigned to a
7125 * permanent location. */
7126
7127SV *
864dbfa3 7128Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 7129{
463ee0b2 7130 register SV *sv;
b881518d 7131
4561caa4 7132 new_SV(sv);
79072805 7133 sv_setsv(sv,oldstr);
677b06e3
GS
7134 EXTEND_MORTAL(1);
7135 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
7136 SvTEMP_on(sv);
7137 return sv;
7138}
7139
954c1994
GS
7140/*
7141=for apidoc sv_newmortal
7142
645c22ef 7143Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
7144set to 1. It will be destroyed "soon", either by an explicit call to
7145FREETMPS, or by an implicit call at places such as statement boundaries.
7146See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
7147
7148=cut
7149*/
7150
8990e307 7151SV *
864dbfa3 7152Perl_sv_newmortal(pTHX)
8990e307
LW
7153{
7154 register SV *sv;
7155
4561caa4 7156 new_SV(sv);
8990e307 7157 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
7158 EXTEND_MORTAL(1);
7159 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
7160 return sv;
7161}
7162
954c1994
GS
7163/*
7164=for apidoc sv_2mortal
7165
d4236ebc
DM
7166Marks an existing SV as mortal. The SV will be destroyed "soon", either
7167by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
7168statement boundaries. SvTEMP() is turned on which means that the SV's
7169string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
7170and C<sv_mortalcopy>.
954c1994
GS
7171
7172=cut
7173*/
7174
79072805 7175SV *
864dbfa3 7176Perl_sv_2mortal(pTHX_ register SV *sv)
79072805 7177{
27da23d5 7178 dVAR;
79072805
LW
7179 if (!sv)
7180 return sv;
d689ffdd 7181 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 7182 return sv;
677b06e3
GS
7183 EXTEND_MORTAL(1);
7184 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 7185 SvTEMP_on(sv);
79072805
LW
7186 return sv;
7187}
7188
954c1994
GS
7189/*
7190=for apidoc newSVpv
7191
7192Creates a new SV and copies a string into it. The reference count for the
7193SV is set to 1. If C<len> is zero, Perl will compute the length using
7194strlen(). For efficiency, consider using C<newSVpvn> instead.
7195
7196=cut
7197*/
7198
79072805 7199SV *
864dbfa3 7200Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 7201{
463ee0b2 7202 register SV *sv;
79072805 7203
4561caa4 7204 new_SV(sv);
616d8c9c 7205 sv_setpvn(sv,s,len ? len : strlen(s));
79072805
LW
7206 return sv;
7207}
7208
954c1994
GS
7209/*
7210=for apidoc newSVpvn
7211
7212Creates a new SV and copies a string into it. The reference count for the
1c846c1f 7213SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 7214string. You are responsible for ensuring that the source string is at least
9e09f5f2 7215C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
7216
7217=cut
7218*/
7219
9da1e3b5 7220SV *
864dbfa3 7221Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
7222{
7223 register SV *sv;
7224
7225 new_SV(sv);
9da1e3b5
MUN
7226 sv_setpvn(sv,s,len);
7227 return sv;
7228}
7229
bd08039b
NC
7230
7231/*
926f8064 7232=for apidoc newSVhek
bd08039b
NC
7233
7234Creates a new SV from the hash key structure. It will generate scalars that
5aaec2b4
NC
7235point to the shared string table where possible. Returns a new (undefined)
7236SV if the hek is NULL.
bd08039b
NC
7237
7238=cut
7239*/
7240
7241SV *
c1b02ed8 7242Perl_newSVhek(pTHX_ const HEK *hek)
bd08039b 7243{
5aaec2b4
NC
7244 if (!hek) {
7245 SV *sv;
7246
7247 new_SV(sv);
7248 return sv;
7249 }
7250
bd08039b
NC
7251 if (HEK_LEN(hek) == HEf_SVKEY) {
7252 return newSVsv(*(SV**)HEK_KEY(hek));
7253 } else {
7254 const int flags = HEK_FLAGS(hek);
7255 if (flags & HVhek_WASUTF8) {
7256 /* Trouble :-)
7257 Andreas would like keys he put in as utf8 to come back as utf8
7258 */
7259 STRLEN utf8_len = HEK_LEN(hek);
7260 U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
7261 SV *sv = newSVpvn ((char*)as_utf8, utf8_len);
7262
7263 SvUTF8_on (sv);
7264 Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
7265 return sv;
7266 } else if (flags & HVhek_REHASH) {
7267 /* We don't have a pointer to the hv, so we have to replicate the
7268 flag into every HEK. This hv is using custom a hasing
7269 algorithm. Hence we can't return a shared string scalar, as
7270 that would contain the (wrong) hash value, and might get passed
7271 into an hv routine with a regular hash */
7272
7273 SV *sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
7274 if (HEK_UTF8(hek))
7275 SvUTF8_on (sv);
7276 return sv;
7277 }
7278 /* This will be overwhelminly the most common case. */
7279 return newSVpvn_share(HEK_KEY(hek),
7280 (HEK_UTF8(hek) ? -HEK_LEN(hek) : HEK_LEN(hek)),
7281 HEK_HASH(hek));
7282 }
7283}
7284
1c846c1f
NIS
7285/*
7286=for apidoc newSVpvn_share
7287
3f7c398e 7288Creates a new SV with its SvPVX_const pointing to a shared string in the string
645c22ef
DM
7289table. If the string does not already exist in the table, it is created
7290first. Turns on READONLY and FAKE. The string's hash is stored in the UV
7291slot of the SV; if the C<hash> parameter is non-zero, that value is used;
7292otherwise the hash is computed. The idea here is that as the string table
3f7c398e 7293is used for shared hash keys these strings will have SvPVX_const == HeKEY and
645c22ef 7294hash lookup will avoid string compare.
1c846c1f
NIS
7295
7296=cut
7297*/
7298
7299SV *
c3654f1a 7300Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
7301{
7302 register SV *sv;
c3654f1a
IH
7303 bool is_utf8 = FALSE;
7304 if (len < 0) {
77caf834 7305 STRLEN tmplen = -len;
c3654f1a 7306 is_utf8 = TRUE;
75a54232 7307 /* See the note in hv.c:hv_fetch() --jhi */
e1ec3a88 7308 src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
75a54232
JH
7309 len = tmplen;
7310 }
1c846c1f 7311 if (!hash)
5afd6d42 7312 PERL_HASH(hash, src, len);
1c846c1f 7313 new_SV(sv);
bdd68bc3 7314 sv_upgrade(sv, SVt_PV);
f880fe2f 7315 SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
b162af07 7316 SvCUR_set(sv, len);
b162af07 7317 SvLEN_set(sv, 0);
1c846c1f
NIS
7318 SvREADONLY_on(sv);
7319 SvFAKE_on(sv);
7320 SvPOK_on(sv);
c3654f1a
IH
7321 if (is_utf8)
7322 SvUTF8_on(sv);
1c846c1f
NIS
7323 return sv;
7324}
7325
645c22ef 7326
cea2e8a9 7327#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7328
7329/* pTHX_ magic can't cope with varargs, so this is a no-context
7330 * version of the main function, (which may itself be aliased to us).
7331 * Don't access this version directly.
7332 */
7333
46fc3d4c 7334SV *
cea2e8a9 7335Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 7336{
cea2e8a9 7337 dTHX;
46fc3d4c 7338 register SV *sv;
7339 va_list args;
46fc3d4c 7340 va_start(args, pat);
c5be433b 7341 sv = vnewSVpvf(pat, &args);
46fc3d4c 7342 va_end(args);
7343 return sv;
7344}
cea2e8a9 7345#endif
46fc3d4c 7346
954c1994
GS
7347/*
7348=for apidoc newSVpvf
7349
645c22ef 7350Creates a new SV and initializes it with the string formatted like
954c1994
GS
7351C<sprintf>.
7352
7353=cut
7354*/
7355
cea2e8a9
GS
7356SV *
7357Perl_newSVpvf(pTHX_ const char* pat, ...)
7358{
7359 register SV *sv;
7360 va_list args;
cea2e8a9 7361 va_start(args, pat);
c5be433b 7362 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
7363 va_end(args);
7364 return sv;
7365}
46fc3d4c 7366
645c22ef
DM
7367/* backend for newSVpvf() and newSVpvf_nocontext() */
7368
79072805 7369SV *
c5be433b
GS
7370Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
7371{
7372 register SV *sv;
7373 new_SV(sv);
7374 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7375 return sv;
7376}
7377
954c1994
GS
7378/*
7379=for apidoc newSVnv
7380
7381Creates a new SV and copies a floating point value into it.
7382The reference count for the SV is set to 1.
7383
7384=cut
7385*/
7386
c5be433b 7387SV *
65202027 7388Perl_newSVnv(pTHX_ NV n)
79072805 7389{
463ee0b2 7390 register SV *sv;
79072805 7391
4561caa4 7392 new_SV(sv);
79072805
LW
7393 sv_setnv(sv,n);
7394 return sv;
7395}
7396
954c1994
GS
7397/*
7398=for apidoc newSViv
7399
7400Creates a new SV and copies an integer into it. The reference count for the
7401SV is set to 1.
7402
7403=cut
7404*/
7405
79072805 7406SV *
864dbfa3 7407Perl_newSViv(pTHX_ IV i)
79072805 7408{
463ee0b2 7409 register SV *sv;
79072805 7410
4561caa4 7411 new_SV(sv);
79072805
LW
7412 sv_setiv(sv,i);
7413 return sv;
7414}
7415
954c1994 7416/*
1a3327fb
JH
7417=for apidoc newSVuv
7418
7419Creates a new SV and copies an unsigned integer into it.
7420The reference count for the SV is set to 1.
7421
7422=cut
7423*/
7424
7425SV *
7426Perl_newSVuv(pTHX_ UV u)
7427{
7428 register SV *sv;
7429
7430 new_SV(sv);
7431 sv_setuv(sv,u);
7432 return sv;
7433}
7434
7435/*
954c1994
GS
7436=for apidoc newRV_noinc
7437
7438Creates an RV wrapper for an SV. The reference count for the original
7439SV is B<not> incremented.
7440
7441=cut
7442*/
7443
2304df62 7444SV *
864dbfa3 7445Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
7446{
7447 register SV *sv;
7448
4561caa4 7449 new_SV(sv);
2304df62 7450 sv_upgrade(sv, SVt_RV);
76e3520e 7451 SvTEMP_off(tmpRef);
b162af07 7452 SvRV_set(sv, tmpRef);
2304df62 7453 SvROK_on(sv);
2304df62
AD
7454 return sv;
7455}
7456
ff276b08 7457/* newRV_inc is the official function name to use now.
645c22ef
DM
7458 * newRV_inc is in fact #defined to newRV in sv.h
7459 */
7460
5f05dabc 7461SV *
864dbfa3 7462Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 7463{
5f6447b6 7464 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 7465}
5f05dabc 7466
954c1994
GS
7467/*
7468=for apidoc newSVsv
7469
7470Creates a new SV which is an exact duplicate of the original SV.
645c22ef 7471(Uses C<sv_setsv>).
954c1994
GS
7472
7473=cut
7474*/
7475
79072805 7476SV *
864dbfa3 7477Perl_newSVsv(pTHX_ register SV *old)
79072805 7478{
463ee0b2 7479 register SV *sv;
79072805
LW
7480
7481 if (!old)
7482 return Nullsv;
8990e307 7483 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 7484 if (ckWARN_d(WARN_INTERNAL))
9014280d 7485 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
79072805
LW
7486 return Nullsv;
7487 }
4561caa4 7488 new_SV(sv);
e90aabeb
NC
7489 /* SV_GMAGIC is the default for sv_setv()
7490 SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
7491 with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
7492 sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
463ee0b2 7493 return sv;
79072805
LW
7494}
7495
645c22ef
DM
7496/*
7497=for apidoc sv_reset
7498
7499Underlying implementation for the C<reset> Perl function.
7500Note that the perl-level function is vaguely deprecated.
7501
7502=cut
7503*/
7504
79072805 7505void
e1ec3a88 7506Perl_sv_reset(pTHX_ register const char *s, HV *stash)
79072805 7507{
27da23d5 7508 dVAR;
4802d5d7 7509 char todo[PERL_UCHAR_MAX+1];
79072805 7510
49d8d3a1
MB
7511 if (!stash)
7512 return;
7513
79072805 7514 if (!*s) { /* reset ?? searches */
8d2f4536
NC
7515 MAGIC *mg = mg_find((SV *)stash, PERL_MAGIC_symtab);
7516 if (mg) {
7517 PMOP *pm = (PMOP *) mg->mg_obj;
7518 while (pm) {
7519 pm->op_pmdynflags &= ~PMdf_USED;
7520 pm = pm->op_pmnext;
7521 }
79072805
LW
7522 }
7523 return;
7524 }
7525
7526 /* reset variables */
7527
7528 if (!HvARRAY(stash))
7529 return;
463ee0b2
LW
7530
7531 Zero(todo, 256, char);
79072805 7532 while (*s) {
b464bac0
AL
7533 I32 max;
7534 I32 i = (unsigned char)*s;
79072805
LW
7535 if (s[1] == '-') {
7536 s += 2;
7537 }
4802d5d7 7538 max = (unsigned char)*s++;
79072805 7539 for ( ; i <= max; i++) {
463ee0b2
LW
7540 todo[i] = 1;
7541 }
a0d0e21e 7542 for (i = 0; i <= (I32) HvMAX(stash); i++) {
b464bac0 7543 HE *entry;
79072805 7544 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7545 entry;
7546 entry = HeNEXT(entry))
7547 {
b464bac0
AL
7548 register GV *gv;
7549 register SV *sv;
7550
1edc1566 7551 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7552 continue;
1edc1566 7553 gv = (GV*)HeVAL(entry);
79072805 7554 sv = GvSV(gv);
9e35f4b3
GS
7555 if (SvTHINKFIRST(sv)) {
7556 if (!SvREADONLY(sv) && SvROK(sv))
7557 sv_unref(sv);
7558 continue;
7559 }
0c34ef67 7560 SvOK_off(sv);
79072805
LW
7561 if (SvTYPE(sv) >= SVt_PV) {
7562 SvCUR_set(sv, 0);
3f7c398e 7563 if (SvPVX_const(sv) != Nullch)
463ee0b2 7564 *SvPVX(sv) = '\0';
44a8e56a 7565 SvTAINT(sv);
79072805
LW
7566 }
7567 if (GvAV(gv)) {
7568 av_clear(GvAV(gv));
7569 }
bfcb3514 7570 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
463ee0b2 7571 hv_clear(GvHV(gv));
2f42fcb0 7572#ifndef PERL_MICRO
fa6a1c44 7573#ifdef USE_ENVIRON_ARRAY
4efc5df6
GS
7574 if (gv == PL_envgv
7575# ifdef USE_ITHREADS
7576 && PL_curinterp == aTHX
7577# endif
7578 )
7579 {
79072805 7580 environ[0] = Nullch;
4efc5df6 7581 }
a0d0e21e 7582#endif
2f42fcb0 7583#endif /* !PERL_MICRO */
79072805
LW
7584 }
7585 }
7586 }
7587 }
7588}
7589
645c22ef
DM
7590/*
7591=for apidoc sv_2io
7592
7593Using various gambits, try to get an IO from an SV: the IO slot if its a
7594GV; or the recursive result if we're an RV; or the IO slot of the symbol
7595named after the PV if we're a string.
7596
7597=cut
7598*/
7599
46fc3d4c 7600IO*
864dbfa3 7601Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 7602{
7603 IO* io;
7604 GV* gv;
7605
7606 switch (SvTYPE(sv)) {
7607 case SVt_PVIO:
7608 io = (IO*)sv;
7609 break;
7610 case SVt_PVGV:
7611 gv = (GV*)sv;
7612 io = GvIO(gv);
7613 if (!io)
cea2e8a9 7614 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 7615 break;
7616 default:
7617 if (!SvOK(sv))
cea2e8a9 7618 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 7619 if (SvROK(sv))
7620 return sv_2io(SvRV(sv));
7a5fd60d 7621 gv = gv_fetchsv(sv, FALSE, SVt_PVIO);
46fc3d4c 7622 if (gv)
7623 io = GvIO(gv);
7624 else
7625 io = 0;
7626 if (!io)
35c1215d 7627 Perl_croak(aTHX_ "Bad filehandle: %"SVf, sv);
46fc3d4c 7628 break;
7629 }
7630 return io;
7631}
7632
645c22ef
DM
7633/*
7634=for apidoc sv_2cv
7635
7636Using various gambits, try to get a CV from an SV; in addition, try if
7637possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
7638
7639=cut
7640*/
7641
79072805 7642CV *
864dbfa3 7643Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 7644{
27da23d5 7645 dVAR;
c04a4dfe
JH
7646 GV *gv = Nullgv;
7647 CV *cv = Nullcv;
79072805
LW
7648
7649 if (!sv)
93a17b20 7650 return *gvp = Nullgv, Nullcv;
79072805 7651 switch (SvTYPE(sv)) {
79072805
LW
7652 case SVt_PVCV:
7653 *st = CvSTASH(sv);
7654 *gvp = Nullgv;
7655 return (CV*)sv;
7656 case SVt_PVHV:
7657 case SVt_PVAV:
7658 *gvp = Nullgv;
7659 return Nullcv;
8990e307
LW
7660 case SVt_PVGV:
7661 gv = (GV*)sv;
a0d0e21e 7662 *gvp = gv;
8990e307
LW
7663 *st = GvESTASH(gv);
7664 goto fix_gv;
7665
79072805 7666 default:
a0d0e21e
LW
7667 if (SvGMAGICAL(sv))
7668 mg_get(sv);
7669 if (SvROK(sv)) {
f5284f61
IZ
7670 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
7671 tryAMAGICunDEREF(to_cv);
7672
62f274bf
GS
7673 sv = SvRV(sv);
7674 if (SvTYPE(sv) == SVt_PVCV) {
7675 cv = (CV*)sv;
7676 *gvp = Nullgv;
7677 *st = CvSTASH(cv);
7678 return cv;
7679 }
7680 else if(isGV(sv))
7681 gv = (GV*)sv;
7682 else
cea2e8a9 7683 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 7684 }
62f274bf 7685 else if (isGV(sv))
79072805
LW
7686 gv = (GV*)sv;
7687 else
7a5fd60d 7688 gv = gv_fetchsv(sv, lref, SVt_PVCV);
79072805
LW
7689 *gvp = gv;
7690 if (!gv)
7691 return Nullcv;
7692 *st = GvESTASH(gv);
8990e307 7693 fix_gv:
8ebc5c01 7694 if (lref && !GvCVu(gv)) {
4633a7c4 7695 SV *tmpsv;
748a9306 7696 ENTER;
4633a7c4 7697 tmpsv = NEWSV(704,0);
16660edb 7698 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
7699 /* XXX this is probably not what they think they're getting.
7700 * It has the same effect as "sub name;", i.e. just a forward
7701 * declaration! */
774d564b 7702 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
7703 newSVOP(OP_CONST, 0, tmpsv),
7704 Nullop,
8990e307 7705 Nullop);
748a9306 7706 LEAVE;
8ebc5c01 7707 if (!GvCVu(gv))
35c1215d
NC
7708 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
7709 sv);
8990e307 7710 }
8ebc5c01 7711 return GvCVu(gv);
79072805
LW
7712 }
7713}
7714
c461cf8f
JH
7715/*
7716=for apidoc sv_true
7717
7718Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
7719Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
7720instead use an in-line version.
c461cf8f
JH
7721
7722=cut
7723*/
7724
79072805 7725I32
864dbfa3 7726Perl_sv_true(pTHX_ register SV *sv)
79072805 7727{
8990e307
LW
7728 if (!sv)
7729 return 0;
79072805 7730 if (SvPOK(sv)) {
e1ec3a88 7731 const register XPV* tXpv;
4e35701f 7732 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 7733 (tXpv->xpv_cur > 1 ||
339049b0 7734 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
79072805
LW
7735 return 1;
7736 else
7737 return 0;
7738 }
7739 else {
7740 if (SvIOK(sv))
463ee0b2 7741 return SvIVX(sv) != 0;
79072805
LW
7742 else {
7743 if (SvNOK(sv))
463ee0b2 7744 return SvNVX(sv) != 0.0;
79072805 7745 else
463ee0b2 7746 return sv_2bool(sv);
79072805
LW
7747 }
7748 }
7749}
79072805 7750
645c22ef
DM
7751/*
7752=for apidoc sv_iv
7753
7754A private implementation of the C<SvIVx> macro for compilers which can't
7755cope with complex macro expressions. Always use the macro instead.
7756
7757=cut
7758*/
7759
ff68c719 7760IV
864dbfa3 7761Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 7762{
25da4f38
IZ
7763 if (SvIOK(sv)) {
7764 if (SvIsUV(sv))
7765 return (IV)SvUVX(sv);
ff68c719 7766 return SvIVX(sv);
25da4f38 7767 }
ff68c719 7768 return sv_2iv(sv);
85e6fe83 7769}
85e6fe83 7770
645c22ef
DM
7771/*
7772=for apidoc sv_uv
7773
7774A private implementation of the C<SvUVx> macro for compilers which can't
7775cope with complex macro expressions. Always use the macro instead.
7776
7777=cut
7778*/
7779
ff68c719 7780UV
864dbfa3 7781Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 7782{
25da4f38
IZ
7783 if (SvIOK(sv)) {
7784 if (SvIsUV(sv))
7785 return SvUVX(sv);
7786 return (UV)SvIVX(sv);
7787 }
ff68c719 7788 return sv_2uv(sv);
7789}
85e6fe83 7790
645c22ef
DM
7791/*
7792=for apidoc sv_nv
7793
7794A private implementation of the C<SvNVx> macro for compilers which can't
7795cope with complex macro expressions. Always use the macro instead.
7796
7797=cut
7798*/
7799
65202027 7800NV
864dbfa3 7801Perl_sv_nv(pTHX_ register SV *sv)
79072805 7802{
ff68c719 7803 if (SvNOK(sv))
7804 return SvNVX(sv);
7805 return sv_2nv(sv);
79072805 7806}
79072805 7807
09540bc3
JH
7808/* sv_pv() is now a macro using SvPV_nolen();
7809 * this function provided for binary compatibility only
7810 */
7811
7812char *
7813Perl_sv_pv(pTHX_ SV *sv)
7814{
09540bc3
JH
7815 if (SvPOK(sv))
7816 return SvPVX(sv);
7817
93524f2b 7818 return sv_2pv(sv, 0);
09540bc3
JH
7819}
7820
645c22ef
DM
7821/*
7822=for apidoc sv_pv
7823
baca2b92 7824Use the C<SvPV_nolen> macro instead
645c22ef 7825
645c22ef
DM
7826=for apidoc sv_pvn
7827
7828A private implementation of the C<SvPV> macro for compilers which can't
7829cope with complex macro expressions. Always use the macro instead.
7830
7831=cut
7832*/
7833
1fa8b10d 7834char *
864dbfa3 7835Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 7836{
85e6fe83
LW
7837 if (SvPOK(sv)) {
7838 *lp = SvCUR(sv);
a0d0e21e 7839 return SvPVX(sv);
85e6fe83 7840 }
463ee0b2 7841 return sv_2pv(sv, lp);
79072805 7842}
79072805 7843
6e9d1081
NC
7844
7845char *
7846Perl_sv_pvn_nomg(pTHX_ register SV *sv, STRLEN *lp)
7847{
7848 if (SvPOK(sv)) {
7849 *lp = SvCUR(sv);
7850 return SvPVX(sv);
7851 }
7852 return sv_2pv_flags(sv, lp, 0);
7853}
7854
09540bc3
JH
7855/* sv_pvn_force() is now a macro using Perl_sv_pvn_force_flags();
7856 * this function provided for binary compatibility only
7857 */
7858
7859char *
7860Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
7861{
7862 return sv_pvn_force_flags(sv, lp, SV_GMAGIC);
7863}
7864
c461cf8f
JH
7865/*
7866=for apidoc sv_pvn_force
7867
7868Get a sensible string out of the SV somehow.
645c22ef
DM
7869A private implementation of the C<SvPV_force> macro for compilers which
7870can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 7871
8d6d96c1
HS
7872=for apidoc sv_pvn_force_flags
7873
7874Get a sensible string out of the SV somehow.
7875If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
7876appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
7877implemented in terms of this function.
645c22ef
DM
7878You normally want to use the various wrapper macros instead: see
7879C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
7880
7881=cut
7882*/
7883
7884char *
7885Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
7886{
a0d0e21e 7887
6fc92669 7888 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 7889 sv_force_normal_flags(sv, 0);
1c846c1f 7890
a0d0e21e 7891 if (SvPOK(sv)) {
13c5b33c
NC
7892 if (lp)
7893 *lp = SvCUR(sv);
a0d0e21e
LW
7894 }
7895 else {
a3b680e6 7896 char *s;
13c5b33c
NC
7897 STRLEN len;
7898
4d84ee25
NC
7899 if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
7900 if (PL_op)
7901 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
7902 sv_reftype(sv,0), OP_NAME(PL_op));
7903 else
7904 Perl_croak(aTHX_ "Can't coerce readonly %s to string",
7905 sv_reftype(sv,0));
7906 }
748a9306 7907 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 7908 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 7909 OP_NAME(PL_op));
a0d0e21e 7910 }
4633a7c4 7911 else
13c5b33c
NC
7912 s = sv_2pv_flags(sv, &len, flags);
7913 if (lp)
7914 *lp = len;
7915
3f7c398e 7916 if (s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */
a0d0e21e
LW
7917 if (SvROK(sv))
7918 sv_unref(sv);
862a34c6 7919 SvUPGRADE(sv, SVt_PV); /* Never FALSE */
a0d0e21e 7920 SvGROW(sv, len + 1);
3f7c398e 7921 Move(s,SvPVX_const(sv),len,char);
a0d0e21e
LW
7922 SvCUR_set(sv, len);
7923 *SvEND(sv) = '\0';
7924 }
7925 if (!SvPOK(sv)) {
7926 SvPOK_on(sv); /* validate pointer */
7927 SvTAINT(sv);
1d7c1841 7928 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 7929 PTR2UV(sv),SvPVX_const(sv)));
a0d0e21e
LW
7930 }
7931 }
4d84ee25 7932 return SvPVX_mutable(sv);
a0d0e21e
LW
7933}
7934
09540bc3
JH
7935/* sv_pvbyte () is now a macro using Perl_sv_2pv_flags();
7936 * this function provided for binary compatibility only
7937 */
7938
7939char *
7940Perl_sv_pvbyte(pTHX_ SV *sv)
7941{
7942 sv_utf8_downgrade(sv,0);
7943 return sv_pv(sv);
7944}
7945
645c22ef
DM
7946/*
7947=for apidoc sv_pvbyte
7948
baca2b92 7949Use C<SvPVbyte_nolen> instead.
645c22ef 7950
645c22ef
DM
7951=for apidoc sv_pvbyten
7952
7953A private implementation of the C<SvPVbyte> macro for compilers
7954which can't cope with complex macro expressions. Always use the macro
7955instead.
7956
7957=cut
7958*/
7959
7340a771
GS
7960char *
7961Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
7962{
ffebcc3e 7963 sv_utf8_downgrade(sv,0);
7340a771
GS
7964 return sv_pvn(sv,lp);
7965}
7966
645c22ef
DM
7967/*
7968=for apidoc sv_pvbyten_force
7969
7970A private implementation of the C<SvPVbytex_force> macro for compilers
7971which can't cope with complex macro expressions. Always use the macro
7972instead.
7973
7974=cut
7975*/
7976
7340a771
GS
7977char *
7978Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
7979{
46ec2f14 7980 sv_pvn_force(sv,lp);
ffebcc3e 7981 sv_utf8_downgrade(sv,0);
46ec2f14
TS
7982 *lp = SvCUR(sv);
7983 return SvPVX(sv);
7340a771
GS
7984}
7985
09540bc3
JH
7986/* sv_pvutf8 () is now a macro using Perl_sv_2pv_flags();
7987 * this function provided for binary compatibility only
7988 */
7989
7990char *
7991Perl_sv_pvutf8(pTHX_ SV *sv)
7992{
7993 sv_utf8_upgrade(sv);
7994 return sv_pv(sv);
7995}
7996
645c22ef
DM
7997/*
7998=for apidoc sv_pvutf8
7999
baca2b92 8000Use the C<SvPVutf8_nolen> macro instead
645c22ef 8001
645c22ef
DM
8002=for apidoc sv_pvutf8n
8003
8004A private implementation of the C<SvPVutf8> macro for compilers
8005which can't cope with complex macro expressions. Always use the macro
8006instead.
8007
8008=cut
8009*/
8010
7340a771
GS
8011char *
8012Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
8013{
560a288e 8014 sv_utf8_upgrade(sv);
7340a771
GS
8015 return sv_pvn(sv,lp);
8016}
8017
c461cf8f
JH
8018/*
8019=for apidoc sv_pvutf8n_force
8020
645c22ef
DM
8021A private implementation of the C<SvPVutf8_force> macro for compilers
8022which can't cope with complex macro expressions. Always use the macro
8023instead.
c461cf8f
JH
8024
8025=cut
8026*/
8027
7340a771
GS
8028char *
8029Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
8030{
46ec2f14 8031 sv_pvn_force(sv,lp);
560a288e 8032 sv_utf8_upgrade(sv);
46ec2f14
TS
8033 *lp = SvCUR(sv);
8034 return SvPVX(sv);
7340a771
GS
8035}
8036
c461cf8f
JH
8037/*
8038=for apidoc sv_reftype
8039
8040Returns a string describing what the SV is a reference to.
8041
8042=cut
8043*/
8044
1cb0ed9b 8045char *
bfed75c6 8046Perl_sv_reftype(pTHX_ const SV *sv, int ob)
a0d0e21e 8047{
07409e01
NC
8048 /* The fact that I don't need to downcast to char * everywhere, only in ?:
8049 inside return suggests a const propagation bug in g++. */
c86bf373 8050 if (ob && SvOBJECT(sv)) {
1b6737cc 8051 char * const name = HvNAME_get(SvSTASH(sv));
07409e01 8052 return name ? name : (char *) "__ANON__";
c86bf373 8053 }
a0d0e21e
LW
8054 else {
8055 switch (SvTYPE(sv)) {
8056 case SVt_NULL:
8057 case SVt_IV:
8058 case SVt_NV:
8059 case SVt_RV:
8060 case SVt_PV:
8061 case SVt_PVIV:
8062 case SVt_PVNV:
8063 case SVt_PVMG:
8064 case SVt_PVBM:
1cb0ed9b 8065 if (SvVOK(sv))
439cb1c4 8066 return "VSTRING";
a0d0e21e
LW
8067 if (SvROK(sv))
8068 return "REF";
8069 else
8070 return "SCALAR";
1cb0ed9b 8071
07409e01 8072 case SVt_PVLV: return (char *) (SvROK(sv) ? "REF"
be65207d
DM
8073 /* tied lvalues should appear to be
8074 * scalars for backwards compatitbility */
8075 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
07409e01 8076 ? "SCALAR" : "LVALUE");
a0d0e21e
LW
8077 case SVt_PVAV: return "ARRAY";
8078 case SVt_PVHV: return "HASH";
8079 case SVt_PVCV: return "CODE";
8080 case SVt_PVGV: return "GLOB";
1d2dff63 8081 case SVt_PVFM: return "FORMAT";
27f9d8f3 8082 case SVt_PVIO: return "IO";
a0d0e21e
LW
8083 default: return "UNKNOWN";
8084 }
8085 }
8086}
8087
954c1994
GS
8088/*
8089=for apidoc sv_isobject
8090
8091Returns a boolean indicating whether the SV is an RV pointing to a blessed
8092object. If the SV is not an RV, or if the object is not blessed, then this
8093will return false.
8094
8095=cut
8096*/
8097
463ee0b2 8098int
864dbfa3 8099Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 8100{
68dc0745 8101 if (!sv)
8102 return 0;
8103 if (SvGMAGICAL(sv))
8104 mg_get(sv);
85e6fe83
LW
8105 if (!SvROK(sv))
8106 return 0;
8107 sv = (SV*)SvRV(sv);
8108 if (!SvOBJECT(sv))
8109 return 0;
8110 return 1;
8111}
8112
954c1994
GS
8113/*
8114=for apidoc sv_isa
8115
8116Returns a boolean indicating whether the SV is blessed into the specified
8117class. This does not check for subtypes; use C<sv_derived_from> to verify
8118an inheritance relationship.
8119
8120=cut
8121*/
8122
85e6fe83 8123int
864dbfa3 8124Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 8125{
bfcb3514 8126 const char *hvname;
68dc0745 8127 if (!sv)
8128 return 0;
8129 if (SvGMAGICAL(sv))
8130 mg_get(sv);
ed6116ce 8131 if (!SvROK(sv))
463ee0b2 8132 return 0;
ed6116ce
LW
8133 sv = (SV*)SvRV(sv);
8134 if (!SvOBJECT(sv))
463ee0b2 8135 return 0;
bfcb3514
NC
8136 hvname = HvNAME_get(SvSTASH(sv));
8137 if (!hvname)
e27ad1f2 8138 return 0;
463ee0b2 8139
bfcb3514 8140 return strEQ(hvname, name);
463ee0b2
LW
8141}
8142
954c1994
GS
8143/*
8144=for apidoc newSVrv
8145
8146Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
8147it will be upgraded to one. If C<classname> is non-null then the new SV will
8148be blessed in the specified package. The new SV is returned and its
8149reference count is 1.
8150
8151=cut
8152*/
8153
463ee0b2 8154SV*
864dbfa3 8155Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 8156{
463ee0b2
LW
8157 SV *sv;
8158
4561caa4 8159 new_SV(sv);
51cf62d8 8160
765f542d 8161 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 8162 SvAMAGIC_off(rv);
51cf62d8 8163
0199fce9 8164 if (SvTYPE(rv) >= SVt_PVMG) {
a3b680e6 8165 const U32 refcnt = SvREFCNT(rv);
0199fce9
JD
8166 SvREFCNT(rv) = 0;
8167 sv_clear(rv);
8168 SvFLAGS(rv) = 0;
8169 SvREFCNT(rv) = refcnt;
8170 }
8171
51cf62d8 8172 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
8173 sv_upgrade(rv, SVt_RV);
8174 else if (SvTYPE(rv) > SVt_RV) {
8bd4d4c5 8175 SvPV_free(rv);
0199fce9
JD
8176 SvCUR_set(rv, 0);
8177 SvLEN_set(rv, 0);
8178 }
51cf62d8 8179
0c34ef67 8180 SvOK_off(rv);
b162af07 8181 SvRV_set(rv, sv);
ed6116ce 8182 SvROK_on(rv);
463ee0b2 8183
a0d0e21e 8184 if (classname) {
1b6737cc 8185 HV* const stash = gv_stashpv(classname, TRUE);
a0d0e21e
LW
8186 (void)sv_bless(rv, stash);
8187 }
8188 return sv;
8189}
8190
954c1994
GS
8191/*
8192=for apidoc sv_setref_pv
8193
8194Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
8195argument will be upgraded to an RV. That RV will be modified to point to
8196the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
8197into the SV. The C<classname> argument indicates the package for the
8198blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8199will have a reference count of 1, and the RV will be returned.
954c1994
GS
8200
8201Do not use with other Perl types such as HV, AV, SV, CV, because those
8202objects will become corrupted by the pointer copy process.
8203
8204Note that C<sv_setref_pvn> copies the string while this copies the pointer.
8205
8206=cut
8207*/
8208
a0d0e21e 8209SV*
864dbfa3 8210Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 8211{
189b2af5 8212 if (!pv) {
3280af22 8213 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
8214 SvSETMAGIC(rv);
8215 }
a0d0e21e 8216 else
56431972 8217 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
8218 return rv;
8219}
8220
954c1994
GS
8221/*
8222=for apidoc sv_setref_iv
8223
8224Copies an integer into a new SV, optionally blessing the SV. The C<rv>
8225argument will be upgraded to an RV. That RV will be modified to point to
8226the new SV. The C<classname> argument indicates the package for the
8227blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8228will have a reference count of 1, and the RV will be returned.
954c1994
GS
8229
8230=cut
8231*/
8232
a0d0e21e 8233SV*
864dbfa3 8234Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
8235{
8236 sv_setiv(newSVrv(rv,classname), iv);
8237 return rv;
8238}
8239
954c1994 8240/*
e1c57cef
JH
8241=for apidoc sv_setref_uv
8242
8243Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
8244argument will be upgraded to an RV. That RV will be modified to point to
8245the new SV. The C<classname> argument indicates the package for the
8246blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8247will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
8248
8249=cut
8250*/
8251
8252SV*
8253Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
8254{
8255 sv_setuv(newSVrv(rv,classname), uv);
8256 return rv;
8257}
8258
8259/*
954c1994
GS
8260=for apidoc sv_setref_nv
8261
8262Copies a double into a new SV, optionally blessing the SV. The C<rv>
8263argument will be upgraded to an RV. That RV will be modified to point to
8264the new SV. The C<classname> argument indicates the package for the
8265blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
d34c2299 8266will have a reference count of 1, and the RV will be returned.
954c1994
GS
8267
8268=cut
8269*/
8270
a0d0e21e 8271SV*
65202027 8272Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
8273{
8274 sv_setnv(newSVrv(rv,classname), nv);
8275 return rv;
8276}
463ee0b2 8277
954c1994
GS
8278/*
8279=for apidoc sv_setref_pvn
8280
8281Copies a string into a new SV, optionally blessing the SV. The length of the
8282string must be specified with C<n>. The C<rv> argument will be upgraded to
8283an RV. That RV will be modified to point to the new SV. The C<classname>
8284argument indicates the package for the blessing. Set C<classname> to
7a5fa8a2 8285C<Nullch> to avoid the blessing. The new SV will have a reference count
d34c2299 8286of 1, and the RV will be returned.
954c1994
GS
8287
8288Note that C<sv_setref_pv> copies the pointer while this copies the string.
8289
8290=cut
8291*/
8292
a0d0e21e 8293SV*
1b6737cc 8294Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, const char *pv, STRLEN n)
a0d0e21e
LW
8295{
8296 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
8297 return rv;
8298}
8299
954c1994
GS
8300/*
8301=for apidoc sv_bless
8302
8303Blesses an SV into a specified package. The SV must be an RV. The package
8304must be designated by its stash (see C<gv_stashpv()>). The reference count
8305of the SV is unaffected.
8306
8307=cut
8308*/
8309
a0d0e21e 8310SV*
864dbfa3 8311Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 8312{
76e3520e 8313 SV *tmpRef;
a0d0e21e 8314 if (!SvROK(sv))
cea2e8a9 8315 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
8316 tmpRef = SvRV(sv);
8317 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
8318 if (SvREADONLY(tmpRef))
cea2e8a9 8319 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
8320 if (SvOBJECT(tmpRef)) {
8321 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8322 --PL_sv_objcount;
76e3520e 8323 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 8324 }
a0d0e21e 8325 }
76e3520e
GS
8326 SvOBJECT_on(tmpRef);
8327 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8328 ++PL_sv_objcount;
862a34c6 8329 SvUPGRADE(tmpRef, SVt_PVMG);
b162af07 8330 SvSTASH_set(tmpRef, (HV*)SvREFCNT_inc(stash));
a0d0e21e 8331
2e3febc6
CS
8332 if (Gv_AMG(stash))
8333 SvAMAGIC_on(sv);
8334 else
8335 SvAMAGIC_off(sv);
a0d0e21e 8336
1edbfb88
AB
8337 if(SvSMAGICAL(tmpRef))
8338 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8339 mg_set(tmpRef);
8340
8341
ecdeb87c 8342
a0d0e21e
LW
8343 return sv;
8344}
8345
645c22ef 8346/* Downgrades a PVGV to a PVMG.
645c22ef
DM
8347 */
8348
76e3520e 8349STATIC void
cea2e8a9 8350S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 8351{
850fabdf
GS
8352 void *xpvmg;
8353
a0d0e21e
LW
8354 assert(SvTYPE(sv) == SVt_PVGV);
8355 SvFAKE_off(sv);
8356 if (GvGP(sv))
1edc1566 8357 gp_free((GV*)sv);
e826b3c7
GS
8358 if (GvSTASH(sv)) {
8359 SvREFCNT_dec(GvSTASH(sv));
8360 GvSTASH(sv) = Nullhv;
8361 }
14befaf4 8362 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 8363 Safefree(GvNAME(sv));
a5f75d66 8364 GvMULTI_off(sv);
850fabdf
GS
8365
8366 /* need to keep SvANY(sv) in the right arena */
8367 xpvmg = new_XPVMG();
8368 StructCopy(SvANY(sv), xpvmg, XPVMG);
8369 del_XPVGV(SvANY(sv));
8370 SvANY(sv) = xpvmg;
8371
a0d0e21e
LW
8372 SvFLAGS(sv) &= ~SVTYPEMASK;
8373 SvFLAGS(sv) |= SVt_PVMG;
8374}
8375
954c1994 8376/*
840a7b70 8377=for apidoc sv_unref_flags
954c1994
GS
8378
8379Unsets the RV status of the SV, and decrements the reference count of
8380whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
8381as a reversal of C<newSVrv>. The C<cflags> argument can contain
8382C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8383(otherwise the decrementing is conditional on the reference count being
8384different from one or the reference being a readonly SV).
7889fe52 8385See C<SvROK_off>.
954c1994
GS
8386
8387=cut
8388*/
8389
ed6116ce 8390void
840a7b70 8391Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 8392{
a0d0e21e 8393 SV* rv = SvRV(sv);
810b8aa5
GS
8394
8395 if (SvWEAKREF(sv)) {
8396 sv_del_backref(sv);
8397 SvWEAKREF_off(sv);
b162af07 8398 SvRV_set(sv, NULL);
810b8aa5
GS
8399 return;
8400 }
b162af07 8401 SvRV_set(sv, NULL);
ed6116ce 8402 SvROK_off(sv);
04ca4930
NC
8403 /* You can't have a || SvREADONLY(rv) here, as $a = $$a, where $a was
8404 assigned to as BEGIN {$a = \"Foo"} will fail. */
8405 if (SvREFCNT(rv) != 1 || (flags & SV_IMMEDIATE_UNREF))
4633a7c4 8406 SvREFCNT_dec(rv);
840a7b70 8407 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 8408 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 8409}
8990e307 8410
840a7b70
IZ
8411/*
8412=for apidoc sv_unref
8413
8414Unsets the RV status of the SV, and decrements the reference count of
8415whatever was being referenced by the RV. This can almost be thought of
8416as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 8417being zero. See C<SvROK_off>.
840a7b70
IZ
8418
8419=cut
8420*/
8421
8422void
8423Perl_sv_unref(pTHX_ SV *sv)
8424{
8425 sv_unref_flags(sv, 0);
8426}
8427
645c22ef
DM
8428/*
8429=for apidoc sv_taint
8430
8431Taint an SV. Use C<SvTAINTED_on> instead.
8432=cut
8433*/
8434
bbce6d69 8435void
864dbfa3 8436Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 8437{
14befaf4 8438 sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
bbce6d69 8439}
8440
645c22ef
DM
8441/*
8442=for apidoc sv_untaint
8443
8444Untaint an SV. Use C<SvTAINTED_off> instead.
8445=cut
8446*/
8447
bbce6d69 8448void
864dbfa3 8449Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 8450{
13f57bf8 8451 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8452 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 8453 if (mg)
565764a8 8454 mg->mg_len &= ~1;
36477c24 8455 }
bbce6d69 8456}
8457
645c22ef
DM
8458/*
8459=for apidoc sv_tainted
8460
8461Test an SV for taintedness. Use C<SvTAINTED> instead.
8462=cut
8463*/
8464
bbce6d69 8465bool
864dbfa3 8466Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 8467{
13f57bf8 8468 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
a28509cc 8469 MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
2ddb8a4f 8470 if (mg && (mg->mg_len & 1) )
36477c24 8471 return TRUE;
8472 }
8473 return FALSE;
bbce6d69 8474}
8475
09540bc3
JH
8476/*
8477=for apidoc sv_setpviv
8478
8479Copies an integer into the given SV, also updating its string value.
8480Does not handle 'set' magic. See C<sv_setpviv_mg>.
8481
8482=cut
8483*/
8484
8485void
8486Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
8487{
8488 char buf[TYPE_CHARS(UV)];
8489 char *ebuf;
8490 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8491
8492 sv_setpvn(sv, ptr, ebuf - ptr);
8493}
8494
8495/*
8496=for apidoc sv_setpviv_mg
8497
8498Like C<sv_setpviv>, but also handles 'set' magic.
8499
8500=cut
8501*/
8502
8503void
8504Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
8505{
8506 char buf[TYPE_CHARS(UV)];
8507 char *ebuf;
8508 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8509
8510 sv_setpvn(sv, ptr, ebuf - ptr);
8511 SvSETMAGIC(sv);
8512}
8513
cea2e8a9 8514#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8515
8516/* pTHX_ magic can't cope with varargs, so this is a no-context
8517 * version of the main function, (which may itself be aliased to us).
8518 * Don't access this version directly.
8519 */
8520
cea2e8a9
GS
8521void
8522Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
8523{
8524 dTHX;
8525 va_list args;
8526 va_start(args, pat);
c5be433b 8527 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
8528 va_end(args);
8529}
8530
645c22ef
DM
8531/* pTHX_ magic can't cope with varargs, so this is a no-context
8532 * version of the main function, (which may itself be aliased to us).
8533 * Don't access this version directly.
8534 */
cea2e8a9
GS
8535
8536void
8537Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
8538{
8539 dTHX;
8540 va_list args;
8541 va_start(args, pat);
c5be433b 8542 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 8543 va_end(args);
cea2e8a9
GS
8544}
8545#endif
8546
954c1994
GS
8547/*
8548=for apidoc sv_setpvf
8549
bffc3d17
SH
8550Works like C<sv_catpvf> but copies the text into the SV instead of
8551appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
8552
8553=cut
8554*/
8555
46fc3d4c 8556void
864dbfa3 8557Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8558{
8559 va_list args;
46fc3d4c 8560 va_start(args, pat);
c5be433b 8561 sv_vsetpvf(sv, pat, &args);
46fc3d4c 8562 va_end(args);
8563}
8564
bffc3d17
SH
8565/*
8566=for apidoc sv_vsetpvf
8567
8568Works like C<sv_vcatpvf> but copies the text into the SV instead of
8569appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
8570
8571Usually used via its frontend C<sv_setpvf>.
8572
8573=cut
8574*/
645c22ef 8575
c5be433b
GS
8576void
8577Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8578{
8579 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8580}
ef50df4b 8581
954c1994
GS
8582/*
8583=for apidoc sv_setpvf_mg
8584
8585Like C<sv_setpvf>, but also handles 'set' magic.
8586
8587=cut
8588*/
8589
ef50df4b 8590void
864dbfa3 8591Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8592{
8593 va_list args;
ef50df4b 8594 va_start(args, pat);
c5be433b 8595 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 8596 va_end(args);
c5be433b
GS
8597}
8598
bffc3d17
SH
8599/*
8600=for apidoc sv_vsetpvf_mg
8601
8602Like C<sv_vsetpvf>, but also handles 'set' magic.
8603
8604Usually used via its frontend C<sv_setpvf_mg>.
8605
8606=cut
8607*/
645c22ef 8608
c5be433b
GS
8609void
8610Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8611{
8612 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
8613 SvSETMAGIC(sv);
8614}
8615
cea2e8a9 8616#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8617
8618/* pTHX_ magic can't cope with varargs, so this is a no-context
8619 * version of the main function, (which may itself be aliased to us).
8620 * Don't access this version directly.
8621 */
8622
cea2e8a9
GS
8623void
8624Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
8625{
8626 dTHX;
8627 va_list args;
8628 va_start(args, pat);
c5be433b 8629 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
8630 va_end(args);
8631}
8632
645c22ef
DM
8633/* pTHX_ magic can't cope with varargs, so this is a no-context
8634 * version of the main function, (which may itself be aliased to us).
8635 * Don't access this version directly.
8636 */
8637
cea2e8a9
GS
8638void
8639Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
8640{
8641 dTHX;
8642 va_list args;
8643 va_start(args, pat);
c5be433b 8644 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 8645 va_end(args);
cea2e8a9
GS
8646}
8647#endif
8648
954c1994
GS
8649/*
8650=for apidoc sv_catpvf
8651
d5ce4a7c
GA
8652Processes its arguments like C<sprintf> and appends the formatted
8653output to an SV. If the appended data contains "wide" characters
8654(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
8655and characters >255 formatted with %c), the original SV might get
bffc3d17 8656upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
8657C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
8658valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 8659
d5ce4a7c 8660=cut */
954c1994 8661
46fc3d4c 8662void
864dbfa3 8663Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8664{
8665 va_list args;
46fc3d4c 8666 va_start(args, pat);
c5be433b 8667 sv_vcatpvf(sv, pat, &args);
46fc3d4c 8668 va_end(args);
8669}
8670
bffc3d17
SH
8671/*
8672=for apidoc sv_vcatpvf
8673
8674Processes its arguments like C<vsprintf> and appends the formatted output
8675to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
8676
8677Usually used via its frontend C<sv_catpvf>.
8678
8679=cut
8680*/
645c22ef 8681
ef50df4b 8682void
c5be433b
GS
8683Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8684{
8685 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8686}
8687
954c1994
GS
8688/*
8689=for apidoc sv_catpvf_mg
8690
8691Like C<sv_catpvf>, but also handles 'set' magic.
8692
8693=cut
8694*/
8695
c5be433b 8696void
864dbfa3 8697Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8698{
8699 va_list args;
ef50df4b 8700 va_start(args, pat);
c5be433b 8701 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 8702 va_end(args);
c5be433b
GS
8703}
8704
bffc3d17
SH
8705/*
8706=for apidoc sv_vcatpvf_mg
8707
8708Like C<sv_vcatpvf>, but also handles 'set' magic.
8709
8710Usually used via its frontend C<sv_catpvf_mg>.
8711
8712=cut
8713*/
645c22ef 8714
c5be433b
GS
8715void
8716Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8717{
8718 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
8719 SvSETMAGIC(sv);
8720}
8721
954c1994
GS
8722/*
8723=for apidoc sv_vsetpvfn
8724
bffc3d17 8725Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
8726appending it.
8727
bffc3d17 8728Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 8729
954c1994
GS
8730=cut
8731*/
8732
46fc3d4c 8733void
7d5ea4e7 8734Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8735{
8736 sv_setpvn(sv, "", 0);
7d5ea4e7 8737 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 8738}
8739
645c22ef
DM
8740/* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
8741
2d00ba3b 8742STATIC I32
9dd79c3f 8743S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
8744{
8745 I32 var = 0;
8746 switch (**pattern) {
8747 case '1': case '2': case '3':
8748 case '4': case '5': case '6':
8749 case '7': case '8': case '9':
8750 while (isDIGIT(**pattern))
8751 var = var * 10 + (*(*pattern)++ - '0');
8752 }
8753 return var;
8754}
9dd79c3f 8755#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 8756
4151a5fe
IZ
8757static char *
8758F0convert(NV nv, char *endbuf, STRLEN *len)
8759{
a3b680e6 8760 const int neg = nv < 0;
4151a5fe 8761 UV uv;
4151a5fe
IZ
8762
8763 if (neg)
8764 nv = -nv;
8765 if (nv < UV_MAX) {
b464bac0 8766 char *p = endbuf;
4151a5fe 8767 nv += 0.5;
028f8eaa 8768 uv = (UV)nv;
4151a5fe
IZ
8769 if (uv & 1 && uv == nv)
8770 uv--; /* Round to even */
8771 do {
a3b680e6 8772 const unsigned dig = uv % 10;
4151a5fe
IZ
8773 *--p = '0' + dig;
8774 } while (uv /= 10);
8775 if (neg)
8776 *--p = '-';
8777 *len = endbuf - p;
8778 return p;
8779 }
8780 return Nullch;
8781}
8782
8783
954c1994
GS
8784/*
8785=for apidoc sv_vcatpvfn
8786
8787Processes its arguments like C<vsprintf> and appends the formatted output
8788to an SV. Uses an array of SVs if the C style variable argument list is
8789missing (NULL). When running with taint checks enabled, indicates via
8790C<maybe_tainted> if results are untrustworthy (often due to the use of
8791locales).
8792
bffc3d17 8793Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 8794
954c1994
GS
8795=cut
8796*/
8797
1ef29b0e
RGS
8798/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
8799
46fc3d4c 8800void
7d5ea4e7 8801Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8802{
8803 char *p;
8804 char *q;
a3b680e6 8805 const char *patend;
fc36a67e 8806 STRLEN origlen;
46fc3d4c 8807 I32 svix = 0;
27da23d5 8808 static const char nullstr[] = "(null)";
9c5ffd7c 8809 SV *argsv = Nullsv;
b464bac0
AL
8810 bool has_utf8 = DO_UTF8(sv); /* has the result utf8? */
8811 const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
db79b45b 8812 SV *nsv = Nullsv;
4151a5fe
IZ
8813 /* Times 4: a decimal digit takes more than 3 binary digits.
8814 * NV_DIG: mantissa takes than many decimal digits.
8815 * Plus 32: Playing safe. */
8816 char ebuf[IV_DIG * 4 + NV_DIG + 32];
8817 /* large enough for "%#.#f" --chip */
8818 /* what about long double NVs? --jhi */
db79b45b 8819
53c1dcc0
AL
8820 PERL_UNUSED_ARG(maybe_tainted);
8821
46fc3d4c 8822 /* no matter what, this is a string now */
fc36a67e 8823 (void)SvPV_force(sv, origlen);
46fc3d4c 8824
0dbb1585 8825 /* special-case "", "%s", and "%-p" (SVf) */
46fc3d4c 8826 if (patlen == 0)
8827 return;
0dbb1585 8828 if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
c635e13b 8829 if (args) {
53c1dcc0 8830 const char * const s = va_arg(*args, char*);
c635e13b 8831 sv_catpv(sv, s ? s : nullstr);
8832 }
7e2040f0 8833 else if (svix < svmax) {
fc36a67e 8834 sv_catsv(sv, *svargs);
7e2040f0
GS
8835 if (DO_UTF8(*svargs))
8836 SvUTF8_on(sv);
8837 }
fc36a67e 8838 return;
0dbb1585
AL
8839 }
8840 if (patlen == 3 && pat[0] == '%' &&
8841 pat[1] == '-' && pat[2] == 'p') {
fc36a67e 8842 if (args) {
7e2040f0
GS
8843 argsv = va_arg(*args, SV*);
8844 sv_catsv(sv, argsv);
8845 if (DO_UTF8(argsv))
8846 SvUTF8_on(sv);
fc36a67e 8847 return;
8848 }
46fc3d4c 8849 }
8850
1d917b39 8851#ifndef USE_LONG_DOUBLE
4151a5fe 8852 /* special-case "%.<number>[gf]" */
7af36d83 8853 if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
4151a5fe
IZ
8854 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
8855 unsigned digits = 0;
8856 const char *pp;
8857
8858 pp = pat + 2;
8859 while (*pp >= '0' && *pp <= '9')
8860 digits = 10 * digits + (*pp++ - '0');
028f8eaa 8861 if (pp - pat == (int)patlen - 1) {
4151a5fe
IZ
8862 NV nv;
8863
7af36d83 8864 if (svix < svmax)
4151a5fe
IZ
8865 nv = SvNV(*svargs);
8866 else
8867 return;
8868 if (*pp == 'g') {
2873255c
NC
8869 /* Add check for digits != 0 because it seems that some
8870 gconverts are buggy in this case, and we don't yet have
8871 a Configure test for this. */
8872 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
8873 /* 0, point, slack */
2e59c212 8874 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
8875 sv_catpv(sv, ebuf);
8876 if (*ebuf) /* May return an empty string for digits==0 */
8877 return;
8878 }
8879 } else if (!digits) {
8880 STRLEN l;
8881
8882 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
8883 sv_catpvn(sv, p, l);
8884 return;
8885 }
8886 }
8887 }
8888 }
1d917b39 8889#endif /* !USE_LONG_DOUBLE */
4151a5fe 8890
2cf2cfc6 8891 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 8892 has_utf8 = TRUE;
2cf2cfc6 8893
46fc3d4c 8894 patend = (char*)pat + patlen;
8895 for (p = (char*)pat; p < patend; p = q) {
8896 bool alt = FALSE;
8897 bool left = FALSE;
b22c7a20 8898 bool vectorize = FALSE;
211dfcf1 8899 bool vectorarg = FALSE;
2cf2cfc6 8900 bool vec_utf8 = FALSE;
46fc3d4c 8901 char fill = ' ';
8902 char plus = 0;
8903 char intsize = 0;
8904 STRLEN width = 0;
fc36a67e 8905 STRLEN zeros = 0;
46fc3d4c 8906 bool has_precis = FALSE;
8907 STRLEN precis = 0;
58e33a90 8908 I32 osvix = svix;
2cf2cfc6 8909 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
8910#ifdef HAS_LDBL_SPRINTF_BUG
8911 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 8912 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
8913 bool fix_ldbl_sprintf_bug = FALSE;
8914#endif
205f51d8 8915
46fc3d4c 8916 char esignbuf[4];
89ebb4a3 8917 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 8918 STRLEN esignlen = 0;
8919
4d84ee25 8920 const char *eptr = Nullch;
fc36a67e 8921 STRLEN elen = 0;
81f715da 8922 SV *vecsv = Nullsv;
245d4a47 8923 const U8 *vecstr = Null(U8*);
b22c7a20 8924 STRLEN veclen = 0;
934abaf1 8925 char c = 0;
46fc3d4c 8926 int i;
9c5ffd7c 8927 unsigned base = 0;
8c8eb53c
RB
8928 IV iv = 0;
8929 UV uv = 0;
9e5b023a
JH
8930 /* we need a long double target in case HAS_LONG_DOUBLE but
8931 not USE_LONG_DOUBLE
8932 */
35fff930 8933#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
8934 long double nv;
8935#else
65202027 8936 NV nv;
9e5b023a 8937#endif
46fc3d4c 8938 STRLEN have;
8939 STRLEN need;
8940 STRLEN gap;
7af36d83 8941 const char *dotstr = ".";
b22c7a20 8942 STRLEN dotstrlen = 1;
211dfcf1 8943 I32 efix = 0; /* explicit format parameter index */
eb3fce90 8944 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
8945 I32 epix = 0; /* explicit precision index */
8946 I32 evix = 0; /* explicit vector index */
eb3fce90 8947 bool asterisk = FALSE;
46fc3d4c 8948
211dfcf1 8949 /* echo everything up to the next format specification */
46fc3d4c 8950 for (q = p; q < patend && *q != '%'; ++q) ;
8951 if (q > p) {
db79b45b
JH
8952 if (has_utf8 && !pat_utf8)
8953 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
8954 else
8955 sv_catpvn(sv, p, q - p);
46fc3d4c 8956 p = q;
8957 }
8958 if (q++ >= patend)
8959 break;
8960
211dfcf1
HS
8961/*
8962 We allow format specification elements in this order:
8963 \d+\$ explicit format parameter index
8964 [-+ 0#]+ flags
a472f209 8965 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 8966 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
8967 \d+|\*(\d+\$)? width using optional (optionally specified) arg
8968 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
8969 [hlqLV] size
8970 [%bcdefginopsux_DFOUX] format (mandatory)
8971*/
8972 if (EXPECT_NUMBER(q, width)) {
8973 if (*q == '$') {
8974 ++q;
8975 efix = width;
8976 } else {
8977 goto gotwidth;
8978 }
8979 }
8980
fc36a67e 8981 /* FLAGS */
8982
46fc3d4c 8983 while (*q) {
8984 switch (*q) {
8985 case ' ':
8986 case '+':
8987 plus = *q++;
8988 continue;
8989
8990 case '-':
8991 left = TRUE;
8992 q++;
8993 continue;
8994
8995 case '0':
8996 fill = *q++;
8997 continue;
8998
8999 case '#':
9000 alt = TRUE;
9001 q++;
9002 continue;
9003
fc36a67e 9004 default:
9005 break;
9006 }
9007 break;
9008 }
46fc3d4c 9009
211dfcf1 9010 tryasterisk:
eb3fce90 9011 if (*q == '*') {
211dfcf1
HS
9012 q++;
9013 if (EXPECT_NUMBER(q, ewix))
9014 if (*q++ != '$')
9015 goto unknown;
eb3fce90 9016 asterisk = TRUE;
211dfcf1
HS
9017 }
9018 if (*q == 'v') {
eb3fce90 9019 q++;
211dfcf1
HS
9020 if (vectorize)
9021 goto unknown;
9cbac4c7 9022 if ((vectorarg = asterisk)) {
211dfcf1
HS
9023 evix = ewix;
9024 ewix = 0;
9025 asterisk = FALSE;
9026 }
9027 vectorize = TRUE;
9028 goto tryasterisk;
eb3fce90
JH
9029 }
9030
211dfcf1 9031 if (!asterisk)
7a5fa8a2 9032 if( *q == '0' )
f3583277 9033 fill = *q++;
211dfcf1
HS
9034 EXPECT_NUMBER(q, width);
9035
9036 if (vectorize) {
9037 if (vectorarg) {
9038 if (args)
9039 vecsv = va_arg(*args, SV*);
9040 else
9041 vecsv = (evix ? evix <= svmax : svix < svmax) ?
3a7a539e 9042 svargs[evix ? evix-1 : svix++] : &PL_sv_undef;
245d4a47 9043 dotstr = SvPV_const(vecsv, dotstrlen);
211dfcf1 9044 if (DO_UTF8(vecsv))
2cf2cfc6 9045 is_utf8 = TRUE;
211dfcf1
HS
9046 }
9047 if (args) {
9048 vecsv = va_arg(*args, SV*);
245d4a47 9049 vecstr = (U8*)SvPV_const(vecsv,veclen);
2cf2cfc6 9050 vec_utf8 = DO_UTF8(vecsv);
eb3fce90 9051 }
211dfcf1
HS
9052 else if (efix ? efix <= svmax : svix < svmax) {
9053 vecsv = svargs[efix ? efix-1 : svix++];
245d4a47 9054 vecstr = (U8*)SvPV_const(vecsv,veclen);
2cf2cfc6 9055 vec_utf8 = DO_UTF8(vecsv);
d7aa5382 9056 /* if this is a version object, we need to return the
3f7c398e 9057 * stringified representation (which the SvPVX_const has
d7aa5382
JP
9058 * already done for us), but not vectorize the args
9059 */
9060 if ( *q == 'd' && sv_derived_from(vecsv,"version") )
9061 {
9062 q++; /* skip past the rest of the %vd format */
245d4a47 9063 eptr = (const char *) vecstr;
d7aa5382
JP
9064 elen = strlen(eptr);
9065 vectorize=FALSE;
9066 goto string;
9067 }
211dfcf1
HS
9068 }
9069 else {
9070 vecstr = (U8*)"";
9071 veclen = 0;
9072 }
eb3fce90 9073 }
fc36a67e 9074
eb3fce90 9075 if (asterisk) {
fc36a67e 9076 if (args)
9077 i = va_arg(*args, int);
9078 else
eb3fce90
JH
9079 i = (ewix ? ewix <= svmax : svix < svmax) ?
9080 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 9081 left |= (i < 0);
9082 width = (i < 0) ? -i : i;
fc36a67e 9083 }
211dfcf1 9084 gotwidth:
fc36a67e 9085
9086 /* PRECISION */
46fc3d4c 9087
fc36a67e 9088 if (*q == '.') {
9089 q++;
9090 if (*q == '*') {
211dfcf1 9091 q++;
7b8dd722
HS
9092 if (EXPECT_NUMBER(q, epix) && *q++ != '$')
9093 goto unknown;
9094 /* XXX: todo, support specified precision parameter */
9095 if (epix)
211dfcf1 9096 goto unknown;
46fc3d4c 9097 if (args)
9098 i = va_arg(*args, int);
9099 else
eb3fce90
JH
9100 i = (ewix ? ewix <= svmax : svix < svmax)
9101 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 9102 precis = (i < 0) ? 0 : i;
fc36a67e 9103 }
9104 else {
9105 precis = 0;
9106 while (isDIGIT(*q))
9107 precis = precis * 10 + (*q++ - '0');
9108 }
9109 has_precis = TRUE;
9110 }
46fc3d4c 9111
fc36a67e 9112 /* SIZE */
46fc3d4c 9113
fc36a67e 9114 switch (*q) {
c623ac67
GS
9115#ifdef WIN32
9116 case 'I': /* Ix, I32x, and I64x */
9117# ifdef WIN64
9118 if (q[1] == '6' && q[2] == '4') {
9119 q += 3;
9120 intsize = 'q';
9121 break;
9122 }
9123# endif
9124 if (q[1] == '3' && q[2] == '2') {
9125 q += 3;
9126 break;
9127 }
9128# ifdef WIN64
9129 intsize = 'q';
9130# endif
9131 q++;
9132 break;
9133#endif
9e5b023a 9134#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 9135 case 'L': /* Ld */
e5c81feb 9136 /* FALL THROUGH */
e5c81feb 9137#ifdef HAS_QUAD
6f9bb7fd 9138 case 'q': /* qd */
9e5b023a 9139#endif
6f9bb7fd
GS
9140 intsize = 'q';
9141 q++;
9142 break;
9143#endif
fc36a67e 9144 case 'l':
9e5b023a 9145#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 9146 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 9147 intsize = 'q';
9148 q += 2;
46fc3d4c 9149 break;
cf2093f6 9150 }
fc36a67e 9151#endif
6f9bb7fd 9152 /* FALL THROUGH */
fc36a67e 9153 case 'h':
cf2093f6 9154 /* FALL THROUGH */
fc36a67e 9155 case 'V':
9156 intsize = *q++;
46fc3d4c 9157 break;
9158 }
9159
fc36a67e 9160 /* CONVERSION */
9161
211dfcf1
HS
9162 if (*q == '%') {
9163 eptr = q++;
9164 elen = 1;
9165 goto string;
9166 }
9167
be75b157
HS
9168 if (vectorize)
9169 argsv = vecsv;
9170 else if (!args)
211dfcf1
HS
9171 argsv = (efix ? efix <= svmax : svix < svmax) ?
9172 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
9173
46fc3d4c 9174 switch (c = *q++) {
9175
9176 /* STRINGS */
9177
46fc3d4c 9178 case 'c':
be75b157 9179 uv = (args && !vectorize) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
9180 if ((uv > 255 ||
9181 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 9182 && !IN_BYTES) {
dfe13c55 9183 eptr = (char*)utf8buf;
9041c2e3 9184 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 9185 is_utf8 = TRUE;
7e2040f0
GS
9186 }
9187 else {
9188 c = (char)uv;
9189 eptr = &c;
9190 elen = 1;
a0ed51b3 9191 }
46fc3d4c 9192 goto string;
9193
46fc3d4c 9194 case 's':
be75b157 9195 if (args && !vectorize) {
fc36a67e 9196 eptr = va_arg(*args, char*);
c635e13b 9197 if (eptr)
1d7c1841
GS
9198#ifdef MACOS_TRADITIONAL
9199 /* On MacOS, %#s format is used for Pascal strings */
9200 if (alt)
9201 elen = *eptr++;
9202 else
9203#endif
c635e13b 9204 elen = strlen(eptr);
9205 else {
27da23d5 9206 eptr = (char *)nullstr;
c635e13b 9207 elen = sizeof nullstr - 1;
9208 }
46fc3d4c 9209 }
211dfcf1 9210 else {
4d84ee25 9211 eptr = SvPVx_const(argsv, elen);
7e2040f0 9212 if (DO_UTF8(argsv)) {
a0ed51b3
LW
9213 if (has_precis && precis < elen) {
9214 I32 p = precis;
7e2040f0 9215 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
9216 precis = p;
9217 }
9218 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 9219 width += elen - sv_len_utf8(argsv);
a0ed51b3 9220 }
2cf2cfc6 9221 is_utf8 = TRUE;
a0ed51b3
LW
9222 }
9223 }
fc36a67e 9224
46fc3d4c 9225 string:
b22c7a20 9226 vectorize = FALSE;
46fc3d4c 9227 if (has_precis && elen > precis)
9228 elen = precis;
9229 break;
9230
9231 /* INTEGERS */
9232
fc36a67e 9233 case 'p':
0dbb1585 9234 if (left && args) { /* SVf */
5df617be 9235 left = FALSE;
0dbb1585
AL
9236 if (width) {
9237 precis = width;
9238 has_precis = TRUE;
9239 width = 0;
9240 }
9241 if (vectorize)
9242 goto unknown;
9243 argsv = va_arg(*args, SV*);
4d84ee25 9244 eptr = SvPVx_const(argsv, elen);
0dbb1585
AL
9245 if (DO_UTF8(argsv))
9246 is_utf8 = TRUE;
9247 goto string;
5df617be 9248 }
be75b157 9249 if (alt || vectorize)
c2e66d9e 9250 goto unknown;
211dfcf1 9251 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 9252 base = 16;
9253 goto integer;
9254
46fc3d4c 9255 case 'D':
29fe7a80 9256#ifdef IV_IS_QUAD
22f3ae8c 9257 intsize = 'q';
29fe7a80 9258#else
46fc3d4c 9259 intsize = 'l';
29fe7a80 9260#endif
46fc3d4c 9261 /* FALL THROUGH */
9262 case 'd':
9263 case 'i':
b22c7a20 9264 if (vectorize) {
ba210ebe 9265 STRLEN ulen;
211dfcf1
HS
9266 if (!veclen)
9267 continue;
2cf2cfc6
A
9268 if (vec_utf8)
9269 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9270 UTF8_ALLOW_ANYUV);
b22c7a20 9271 else {
e83d50c9 9272 uv = *vecstr;
b22c7a20
GS
9273 ulen = 1;
9274 }
9275 vecstr += ulen;
9276 veclen -= ulen;
e83d50c9
JP
9277 if (plus)
9278 esignbuf[esignlen++] = plus;
b22c7a20
GS
9279 }
9280 else if (args) {
46fc3d4c 9281 switch (intsize) {
9282 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 9283 case 'l': iv = va_arg(*args, long); break;
fc36a67e 9284 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 9285 default: iv = va_arg(*args, int); break;
cf2093f6
JH
9286#ifdef HAS_QUAD
9287 case 'q': iv = va_arg(*args, Quad_t); break;
9288#endif
46fc3d4c 9289 }
9290 }
9291 else {
b10c0dba 9292 IV tiv = SvIVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 9293 switch (intsize) {
b10c0dba
MHM
9294 case 'h': iv = (short)tiv; break;
9295 case 'l': iv = (long)tiv; break;
9296 case 'V':
9297 default: iv = tiv; break;
cf2093f6 9298#ifdef HAS_QUAD
b10c0dba 9299 case 'q': iv = (Quad_t)tiv; break;
cf2093f6 9300#endif
46fc3d4c 9301 }
9302 }
e83d50c9
JP
9303 if ( !vectorize ) /* we already set uv above */
9304 {
9305 if (iv >= 0) {
9306 uv = iv;
9307 if (plus)
9308 esignbuf[esignlen++] = plus;
9309 }
9310 else {
9311 uv = -iv;
9312 esignbuf[esignlen++] = '-';
9313 }
46fc3d4c 9314 }
9315 base = 10;
9316 goto integer;
9317
fc36a67e 9318 case 'U':
29fe7a80 9319#ifdef IV_IS_QUAD
22f3ae8c 9320 intsize = 'q';
29fe7a80 9321#else
fc36a67e 9322 intsize = 'l';
29fe7a80 9323#endif
fc36a67e 9324 /* FALL THROUGH */
9325 case 'u':
9326 base = 10;
9327 goto uns_integer;
9328
4f19785b
WSI
9329 case 'b':
9330 base = 2;
9331 goto uns_integer;
9332
46fc3d4c 9333 case 'O':
29fe7a80 9334#ifdef IV_IS_QUAD
22f3ae8c 9335 intsize = 'q';
29fe7a80 9336#else
46fc3d4c 9337 intsize = 'l';
29fe7a80 9338#endif
46fc3d4c 9339 /* FALL THROUGH */
9340 case 'o':
9341 base = 8;
9342 goto uns_integer;
9343
9344 case 'X':
46fc3d4c 9345 case 'x':
9346 base = 16;
46fc3d4c 9347
9348 uns_integer:
b22c7a20 9349 if (vectorize) {
ba210ebe 9350 STRLEN ulen;
b22c7a20 9351 vector:
211dfcf1
HS
9352 if (!veclen)
9353 continue;
2cf2cfc6
A
9354 if (vec_utf8)
9355 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9356 UTF8_ALLOW_ANYUV);
b22c7a20 9357 else {
a05b299f 9358 uv = *vecstr;
b22c7a20
GS
9359 ulen = 1;
9360 }
9361 vecstr += ulen;
9362 veclen -= ulen;
9363 }
9364 else if (args) {
46fc3d4c 9365 switch (intsize) {
9366 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 9367 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 9368 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 9369 default: uv = va_arg(*args, unsigned); break;
cf2093f6 9370#ifdef HAS_QUAD
9e3321a5 9371 case 'q': uv = va_arg(*args, Uquad_t); break;
cf2093f6 9372#endif
46fc3d4c 9373 }
9374 }
9375 else {
b10c0dba 9376 UV tuv = SvUVx(argsv); /* work around GCC bug #13488 */
46fc3d4c 9377 switch (intsize) {
b10c0dba
MHM
9378 case 'h': uv = (unsigned short)tuv; break;
9379 case 'l': uv = (unsigned long)tuv; break;
9380 case 'V':
9381 default: uv = tuv; break;
cf2093f6 9382#ifdef HAS_QUAD
b10c0dba 9383 case 'q': uv = (Uquad_t)tuv; break;
cf2093f6 9384#endif
46fc3d4c 9385 }
9386 }
9387
9388 integer:
4d84ee25
NC
9389 {
9390 char *ptr = ebuf + sizeof ebuf;
9391 switch (base) {
9392 unsigned dig;
9393 case 16:
9394 if (!uv)
9395 alt = FALSE;
9396 p = (char*)((c == 'X')
9397 ? "0123456789ABCDEF" : "0123456789abcdef");
9398 do {
9399 dig = uv & 15;
9400 *--ptr = p[dig];
9401 } while (uv >>= 4);
9402 if (alt) {
9403 esignbuf[esignlen++] = '0';
9404 esignbuf[esignlen++] = c; /* 'x' or 'X' */
9405 }
9406 break;
9407 case 8:
9408 do {
9409 dig = uv & 7;
9410 *--ptr = '0' + dig;
9411 } while (uv >>= 3);
9412 if (alt && *ptr != '0')
9413 *--ptr = '0';
9414 break;
9415 case 2:
9416 do {
9417 dig = uv & 1;
9418 *--ptr = '0' + dig;
9419 } while (uv >>= 1);
9420 if (alt) {
9421 esignbuf[esignlen++] = '0';
9422 esignbuf[esignlen++] = 'b';
9423 }
9424 break;
9425 default: /* it had better be ten or less */
9426 do {
9427 dig = uv % base;
9428 *--ptr = '0' + dig;
9429 } while (uv /= base);
9430 break;
46fc3d4c 9431 }
4d84ee25
NC
9432 elen = (ebuf + sizeof ebuf) - ptr;
9433 eptr = ptr;
9434 if (has_precis) {
9435 if (precis > elen)
9436 zeros = precis - elen;
9437 else if (precis == 0 && elen == 1 && *eptr == '0')
9438 elen = 0;
eda88b6d 9439 }
c10ed8b9 9440 }
46fc3d4c 9441 break;
9442
9443 /* FLOATING POINT */
9444
fc36a67e 9445 case 'F':
9446 c = 'f'; /* maybe %F isn't supported here */
9447 /* FALL THROUGH */
46fc3d4c 9448 case 'e': case 'E':
fc36a67e 9449 case 'f':
46fc3d4c 9450 case 'g': case 'G':
9451
9452 /* This is evil, but floating point is even more evil */
9453
9e5b023a
JH
9454 /* for SV-style calling, we can only get NV
9455 for C-style calling, we assume %f is double;
9456 for simplicity we allow any of %Lf, %llf, %qf for long double
9457 */
9458 switch (intsize) {
9459 case 'V':
9460#if defined(USE_LONG_DOUBLE)
9461 intsize = 'q';
9462#endif
9463 break;
8a2e3f14 9464/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364
HS
9465 case 'l':
9466 /* FALL THROUGH */
9e5b023a
JH
9467 default:
9468#if defined(USE_LONG_DOUBLE)
9469 intsize = args ? 0 : 'q';
9470#endif
9471 break;
9472 case 'q':
9473#if defined(HAS_LONG_DOUBLE)
9474 break;
9475#else
9476 /* FALL THROUGH */
9477#endif
9478 case 'h':
9e5b023a
JH
9479 goto unknown;
9480 }
9481
9482 /* now we need (long double) if intsize == 'q', else (double) */
be75b157 9483 nv = (args && !vectorize) ?
35fff930
JH
9484#if LONG_DOUBLESIZE > DOUBLESIZE
9485 intsize == 'q' ?
205f51d8
AS
9486 va_arg(*args, long double) :
9487 va_arg(*args, double)
35fff930 9488#else
205f51d8 9489 va_arg(*args, double)
35fff930 9490#endif
9e5b023a 9491 : SvNVx(argsv);
fc36a67e 9492
9493 need = 0;
be75b157 9494 vectorize = FALSE;
fc36a67e 9495 if (c != 'e' && c != 'E') {
9496 i = PERL_INT_MIN;
9e5b023a
JH
9497 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9498 will cast our (long double) to (double) */
73b309ea 9499 (void)Perl_frexp(nv, &i);
fc36a67e 9500 if (i == PERL_INT_MIN)
cea2e8a9 9501 Perl_die(aTHX_ "panic: frexp");
c635e13b 9502 if (i > 0)
fc36a67e 9503 need = BIT_DIGITS(i);
9504 }
9505 need += has_precis ? precis : 6; /* known default */
20f6aaab 9506
fc36a67e 9507 if (need < width)
9508 need = width;
9509
20f6aaab
AS
9510#ifdef HAS_LDBL_SPRINTF_BUG
9511 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9512 with sfio - Allen <allens@cpan.org> */
9513
9514# ifdef DBL_MAX
9515# define MY_DBL_MAX DBL_MAX
9516# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9517# if DOUBLESIZE >= 8
9518# define MY_DBL_MAX 1.7976931348623157E+308L
9519# else
9520# define MY_DBL_MAX 3.40282347E+38L
9521# endif
9522# endif
9523
9524# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9525# define MY_DBL_MAX_BUG 1L
20f6aaab 9526# else
205f51d8 9527# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9528# endif
20f6aaab 9529
205f51d8
AS
9530# ifdef DBL_MIN
9531# define MY_DBL_MIN DBL_MIN
9532# else /* XXX guessing! -Allen */
9533# if DOUBLESIZE >= 8
9534# define MY_DBL_MIN 2.2250738585072014E-308L
9535# else
9536# define MY_DBL_MIN 1.17549435E-38L
9537# endif
9538# endif
20f6aaab 9539
205f51d8
AS
9540 if ((intsize == 'q') && (c == 'f') &&
9541 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9542 (need < DBL_DIG)) {
9543 /* it's going to be short enough that
9544 * long double precision is not needed */
9545
9546 if ((nv <= 0L) && (nv >= -0L))
9547 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9548 else {
9549 /* would use Perl_fp_class as a double-check but not
9550 * functional on IRIX - see perl.h comments */
9551
9552 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9553 /* It's within the range that a double can represent */
9554#if defined(DBL_MAX) && !defined(DBL_MIN)
9555 if ((nv >= ((long double)1/DBL_MAX)) ||
9556 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9557#endif
205f51d8 9558 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9559 }
205f51d8
AS
9560 }
9561 if (fix_ldbl_sprintf_bug == TRUE) {
9562 double temp;
9563
9564 intsize = 0;
9565 temp = (double)nv;
9566 nv = (NV)temp;
9567 }
20f6aaab 9568 }
205f51d8
AS
9569
9570# undef MY_DBL_MAX
9571# undef MY_DBL_MAX_BUG
9572# undef MY_DBL_MIN
9573
20f6aaab
AS
9574#endif /* HAS_LDBL_SPRINTF_BUG */
9575
46fc3d4c 9576 need += 20; /* fudge factor */
80252599
GS
9577 if (PL_efloatsize < need) {
9578 Safefree(PL_efloatbuf);
9579 PL_efloatsize = need + 20; /* more fudge */
9580 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9581 PL_efloatbuf[0] = '\0';
46fc3d4c 9582 }
9583
4151a5fe
IZ
9584 if ( !(width || left || plus || alt) && fill != '0'
9585 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
9586 /* See earlier comment about buggy Gconvert when digits,
9587 aka precis is 0 */
9588 if ( c == 'g' && precis) {
2e59c212 9589 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4151a5fe
IZ
9590 if (*PL_efloatbuf) /* May return an empty string for digits==0 */
9591 goto float_converted;
9592 } else if ( c == 'f' && !precis) {
9593 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9594 break;
9595 }
9596 }
4d84ee25
NC
9597 {
9598 char *ptr = ebuf + sizeof ebuf;
9599 *--ptr = '\0';
9600 *--ptr = c;
9601 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9e5b023a 9602#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
4d84ee25
NC
9603 if (intsize == 'q') {
9604 /* Copy the one or more characters in a long double
9605 * format before the 'base' ([efgEFG]) character to
9606 * the format string. */
9607 static char const prifldbl[] = PERL_PRIfldbl;
9608 char const *p = prifldbl + sizeof(prifldbl) - 3;
9609 while (p >= prifldbl) { *--ptr = *p--; }
9610 }
65202027 9611#endif
4d84ee25
NC
9612 if (has_precis) {
9613 base = precis;
9614 do { *--ptr = '0' + (base % 10); } while (base /= 10);
9615 *--ptr = '.';
9616 }
9617 if (width) {
9618 base = width;
9619 do { *--ptr = '0' + (base % 10); } while (base /= 10);
9620 }
9621 if (fill == '0')
9622 *--ptr = fill;
9623 if (left)
9624 *--ptr = '-';
9625 if (plus)
9626 *--ptr = plus;
9627 if (alt)
9628 *--ptr = '#';
9629 *--ptr = '%';
9630
9631 /* No taint. Otherwise we are in the strange situation
9632 * where printf() taints but print($float) doesn't.
9633 * --jhi */
9e5b023a 9634#if defined(HAS_LONG_DOUBLE)
4d84ee25
NC
9635 if (intsize == 'q')
9636 (void)sprintf(PL_efloatbuf, ptr, nv);
9637 else
9638 (void)sprintf(PL_efloatbuf, ptr, (double)nv);
9e5b023a 9639#else
4d84ee25 9640 (void)sprintf(PL_efloatbuf, ptr, nv);
9e5b023a 9641#endif
4d84ee25 9642 }
4151a5fe 9643 float_converted:
80252599
GS
9644 eptr = PL_efloatbuf;
9645 elen = strlen(PL_efloatbuf);
46fc3d4c 9646 break;
9647
fc36a67e 9648 /* SPECIAL */
9649
9650 case 'n':
9651 i = SvCUR(sv) - origlen;
be75b157 9652 if (args && !vectorize) {
c635e13b 9653 switch (intsize) {
9654 case 'h': *(va_arg(*args, short*)) = i; break;
9655 default: *(va_arg(*args, int*)) = i; break;
9656 case 'l': *(va_arg(*args, long*)) = i; break;
9657 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
9658#ifdef HAS_QUAD
9659 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
9660#endif
c635e13b 9661 }
fc36a67e 9662 }
9dd79c3f 9663 else
211dfcf1 9664 sv_setuv_mg(argsv, (UV)i);
be75b157 9665 vectorize = FALSE;
fc36a67e 9666 continue; /* not "break" */
9667
9668 /* UNKNOWN */
9669
46fc3d4c 9670 default:
fc36a67e 9671 unknown:
599cee73 9672 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 9673 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 9674 SV *msg = sv_newmortal();
35c1215d
NC
9675 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9676 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 9677 if (c) {
0f4b6630 9678 if (isPRINT(c))
1c846c1f 9679 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
9680 "\"%%%c\"", c & 0xFF);
9681 else
9682 Perl_sv_catpvf(aTHX_ msg,
57def98f 9683 "\"%%\\%03"UVof"\"",
0f4b6630 9684 (UV)c & 0xFF);
0f4b6630 9685 } else
c635e13b 9686 sv_catpv(msg, "end of string");
9014280d 9687 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 9688 }
fb73857a 9689
9690 /* output mangled stuff ... */
9691 if (c == '\0')
9692 --q;
46fc3d4c 9693 eptr = p;
9694 elen = q - p;
fb73857a 9695
9696 /* ... right here, because formatting flags should not apply */
9697 SvGROW(sv, SvCUR(sv) + elen + 1);
9698 p = SvEND(sv);
4459522c 9699 Copy(eptr, p, elen, char);
fb73857a 9700 p += elen;
9701 *p = '\0';
3f7c398e 9702 SvCUR_set(sv, p - SvPVX_const(sv));
58e33a90 9703 svix = osvix;
fb73857a 9704 continue; /* not "break" */
46fc3d4c 9705 }
9706
6c94ec8b
HS
9707 /* calculate width before utf8_upgrade changes it */
9708 have = esignlen + zeros + elen;
9709
d2876be5
JH
9710 if (is_utf8 != has_utf8) {
9711 if (is_utf8) {
9712 if (SvCUR(sv))
9713 sv_utf8_upgrade(sv);
9714 }
9715 else {
53c1dcc0 9716 SV * const nsv = sv_2mortal(newSVpvn(eptr, elen));
d2876be5 9717 sv_utf8_upgrade(nsv);
93524f2b 9718 eptr = SvPVX_const(nsv);
d2876be5
JH
9719 elen = SvCUR(nsv);
9720 }
9721 SvGROW(sv, SvCUR(sv) + elen + 1);
9722 p = SvEND(sv);
9723 *p = '\0';
9724 }
6af65485 9725
46fc3d4c 9726 need = (have > width ? have : width);
9727 gap = need - have;
9728
b22c7a20 9729 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 9730 p = SvEND(sv);
9731 if (esignlen && fill == '0') {
53c1dcc0 9732 int i;
eb160463 9733 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9734 *p++ = esignbuf[i];
9735 }
9736 if (gap && !left) {
9737 memset(p, fill, gap);
9738 p += gap;
9739 }
9740 if (esignlen && fill != '0') {
53c1dcc0 9741 int i;
eb160463 9742 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9743 *p++ = esignbuf[i];
9744 }
fc36a67e 9745 if (zeros) {
53c1dcc0 9746 int i;
fc36a67e 9747 for (i = zeros; i; i--)
9748 *p++ = '0';
9749 }
46fc3d4c 9750 if (elen) {
4459522c 9751 Copy(eptr, p, elen, char);
46fc3d4c 9752 p += elen;
9753 }
9754 if (gap && left) {
9755 memset(p, ' ', gap);
9756 p += gap;
9757 }
b22c7a20
GS
9758 if (vectorize) {
9759 if (veclen) {
4459522c 9760 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
9761 p += dotstrlen;
9762 }
9763 else
9764 vectorize = FALSE; /* done iterating over vecstr */
9765 }
2cf2cfc6
A
9766 if (is_utf8)
9767 has_utf8 = TRUE;
9768 if (has_utf8)
7e2040f0 9769 SvUTF8_on(sv);
46fc3d4c 9770 *p = '\0';
3f7c398e 9771 SvCUR_set(sv, p - SvPVX_const(sv));
b22c7a20
GS
9772 if (vectorize) {
9773 esignlen = 0;
9774 goto vector;
9775 }
46fc3d4c 9776 }
9777}
51371543 9778
645c22ef
DM
9779/* =========================================================================
9780
9781=head1 Cloning an interpreter
9782
9783All the macros and functions in this section are for the private use of
9784the main function, perl_clone().
9785
9786The foo_dup() functions make an exact copy of an existing foo thinngy.
9787During the course of a cloning, a hash table is used to map old addresses
9788to new addresses. The table is created and manipulated with the
9789ptr_table_* functions.
9790
9791=cut
9792
9793============================================================================*/
9794
9795
1d7c1841
GS
9796#if defined(USE_ITHREADS)
9797
1d7c1841
GS
9798#ifndef GpREFCNT_inc
9799# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
9800#endif
9801
9802
d2d73c3e
AB
9803#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
9804#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
9805#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9806#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
9807#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9808#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
9809#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9810#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
9811#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
9812#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
9813#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
9814#define SAVEPV(p) (p ? savepv(p) : Nullch)
9815#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 9816
d2d73c3e 9817
d2f185dc
AMS
9818/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
9819 regcomp.c. AMS 20010712 */
645c22ef 9820
1d7c1841 9821REGEXP *
53c1dcc0 9822Perl_re_dup(pTHX_ const REGEXP *r, CLONE_PARAMS *param)
1d7c1841 9823{
27da23d5 9824 dVAR;
d2f185dc
AMS
9825 REGEXP *ret;
9826 int i, len, npar;
9827 struct reg_substr_datum *s;
9828
9829 if (!r)
9830 return (REGEXP *)NULL;
9831
9832 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
9833 return ret;
9834
9835 len = r->offsets[0];
9836 npar = r->nparens+1;
9837
9838 Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
9839 Copy(r->program, ret->program, len+1, regnode);
9840
9841 New(0, ret->startp, npar, I32);
9842 Copy(r->startp, ret->startp, npar, I32);
9843 New(0, ret->endp, npar, I32);
9844 Copy(r->startp, ret->startp, npar, I32);
9845
d2f185dc
AMS
9846 New(0, ret->substrs, 1, struct reg_substr_data);
9847 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
9848 s->min_offset = r->substrs->data[i].min_offset;
9849 s->max_offset = r->substrs->data[i].max_offset;
9850 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 9851 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
9852 }
9853
70612e96 9854 ret->regstclass = NULL;
d2f185dc
AMS
9855 if (r->data) {
9856 struct reg_data *d;
e1ec3a88 9857 const int count = r->data->count;
53c1dcc0 9858 int i;
d2f185dc
AMS
9859
9860 Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
9861 char, struct reg_data);
9862 New(0, d->what, count, U8);
9863
9864 d->count = count;
9865 for (i = 0; i < count; i++) {
9866 d->what[i] = r->data->what[i];
9867 switch (d->what[i]) {
a3621e74
YO
9868 /* legal options are one of: sfpont
9869 see also regcomp.h and pregfree() */
d2f185dc
AMS
9870 case 's':
9871 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
9872 break;
9873 case 'p':
9874 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
9875 break;
9876 case 'f':
9877 /* This is cheating. */
9878 New(0, d->data[i], 1, struct regnode_charclass_class);
9879 StructCopy(r->data->data[i], d->data[i],
9880 struct regnode_charclass_class);
70612e96 9881 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
9882 break;
9883 case 'o':
33773810
AMS
9884 /* Compiled op trees are readonly, and can thus be
9885 shared without duplication. */
b34c0dd4 9886 OP_REFCNT_LOCK;
9b978d73 9887 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
b34c0dd4 9888 OP_REFCNT_UNLOCK;
9b978d73 9889 break;
d2f185dc
AMS
9890 case 'n':
9891 d->data[i] = r->data->data[i];
9892 break;
a3621e74
YO
9893 case 't':
9894 d->data[i] = r->data->data[i];
9895 OP_REFCNT_LOCK;
9896 ((reg_trie_data*)d->data[i])->refcount++;
9897 OP_REFCNT_UNLOCK;
9898 break;
9899 default:
9900 Perl_croak(aTHX_ "panic: re_dup unknown data code '%c'", r->data->what[i]);
d2f185dc
AMS
9901 }
9902 }
9903
9904 ret->data = d;
9905 }
9906 else
9907 ret->data = NULL;
9908
9909 New(0, ret->offsets, 2*len+1, U32);
9910 Copy(r->offsets, ret->offsets, 2*len+1, U32);
9911
e01c5899 9912 ret->precomp = SAVEPVN(r->precomp, r->prelen);
d2f185dc
AMS
9913 ret->refcnt = r->refcnt;
9914 ret->minlen = r->minlen;
9915 ret->prelen = r->prelen;
9916 ret->nparens = r->nparens;
9917 ret->lastparen = r->lastparen;
9918 ret->lastcloseparen = r->lastcloseparen;
9919 ret->reganch = r->reganch;
9920
70612e96
RG
9921 ret->sublen = r->sublen;
9922
9923 if (RX_MATCH_COPIED(ret))
e01c5899 9924 ret->subbeg = SAVEPVN(r->subbeg, r->sublen);
70612e96
RG
9925 else
9926 ret->subbeg = Nullch;
f8c7b90f 9927#ifdef PERL_OLD_COPY_ON_WRITE
9a26048b
NC
9928 ret->saved_copy = Nullsv;
9929#endif
70612e96 9930
d2f185dc
AMS
9931 ptr_table_store(PL_ptr_table, r, ret);
9932 return ret;
1d7c1841
GS
9933}
9934
d2d73c3e 9935/* duplicate a file handle */
645c22ef 9936
1d7c1841 9937PerlIO *
a8fc9800 9938Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
9939{
9940 PerlIO *ret;
53c1dcc0
AL
9941
9942 PERL_UNUSED_ARG(type);
73d840c0 9943
1d7c1841
GS
9944 if (!fp)
9945 return (PerlIO*)NULL;
9946
9947 /* look for it in the table first */
9948 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
9949 if (ret)
9950 return ret;
9951
9952 /* create anew and remember what it is */
ecdeb87c 9953 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
9954 ptr_table_store(PL_ptr_table, fp, ret);
9955 return ret;
9956}
9957
645c22ef
DM
9958/* duplicate a directory handle */
9959
1d7c1841
GS
9960DIR *
9961Perl_dirp_dup(pTHX_ DIR *dp)
9962{
9963 if (!dp)
9964 return (DIR*)NULL;
9965 /* XXX TODO */
9966 return dp;
9967}
9968
ff276b08 9969/* duplicate a typeglob */
645c22ef 9970
1d7c1841 9971GP *
a8fc9800 9972Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
9973{
9974 GP *ret;
9975 if (!gp)
9976 return (GP*)NULL;
9977 /* look for it in the table first */
9978 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
9979 if (ret)
9980 return ret;
9981
9982 /* create anew and remember what it is */
9983 Newz(0, ret, 1, GP);
9984 ptr_table_store(PL_ptr_table, gp, ret);
9985
9986 /* clone */
9987 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
9988 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
9989 ret->gp_io = io_dup_inc(gp->gp_io, param);
9990 ret->gp_form = cv_dup_inc(gp->gp_form, param);
9991 ret->gp_av = av_dup_inc(gp->gp_av, param);
9992 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
9993 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
9994 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
9995 ret->gp_cvgen = gp->gp_cvgen;
9996 ret->gp_flags = gp->gp_flags;
9997 ret->gp_line = gp->gp_line;
9998 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
9999 return ret;
10000}
10001
645c22ef
DM
10002/* duplicate a chain of magic */
10003
1d7c1841 10004MAGIC *
a8fc9800 10005Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 10006{
cb359b41
JH
10007 MAGIC *mgprev = (MAGIC*)NULL;
10008 MAGIC *mgret;
1d7c1841
GS
10009 if (!mg)
10010 return (MAGIC*)NULL;
10011 /* look for it in the table first */
10012 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
10013 if (mgret)
10014 return mgret;
10015
10016 for (; mg; mg = mg->mg_moremagic) {
10017 MAGIC *nmg;
10018 Newz(0, nmg, 1, MAGIC);
cb359b41 10019 if (mgprev)
1d7c1841 10020 mgprev->mg_moremagic = nmg;
cb359b41
JH
10021 else
10022 mgret = nmg;
1d7c1841
GS
10023 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
10024 nmg->mg_private = mg->mg_private;
10025 nmg->mg_type = mg->mg_type;
10026 nmg->mg_flags = mg->mg_flags;
14befaf4 10027 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 10028 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 10029 }
05bd4103 10030 else if(mg->mg_type == PERL_MAGIC_backref) {
7fc63493 10031 const AV * const av = (AV*) mg->mg_obj;
fdc9a813
AE
10032 SV **svp;
10033 I32 i;
7fc63493 10034 (void)SvREFCNT_inc(nmg->mg_obj = (SV*)newAV());
fdc9a813
AE
10035 svp = AvARRAY(av);
10036 for (i = AvFILLp(av); i >= 0; i--) {
3a81978b 10037 if (!svp[i]) continue;
fdc9a813
AE
10038 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
10039 }
05bd4103 10040 }
8d2f4536
NC
10041 else if (mg->mg_type == PERL_MAGIC_symtab) {
10042 nmg->mg_obj = mg->mg_obj;
10043 }
1d7c1841
GS
10044 else {
10045 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
10046 ? sv_dup_inc(mg->mg_obj, param)
10047 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
10048 }
10049 nmg->mg_len = mg->mg_len;
10050 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 10051 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 10052 if (mg->mg_len > 0) {
1d7c1841 10053 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
10054 if (mg->mg_type == PERL_MAGIC_overload_table &&
10055 AMT_AMAGIC((AMT*)mg->mg_ptr))
10056 {
1d7c1841
GS
10057 AMT *amtp = (AMT*)mg->mg_ptr;
10058 AMT *namtp = (AMT*)nmg->mg_ptr;
10059 I32 i;
10060 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 10061 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
10062 }
10063 }
10064 }
10065 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 10066 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 10067 }
68795e93
NIS
10068 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
10069 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
10070 }
1d7c1841
GS
10071 mgprev = nmg;
10072 }
10073 return mgret;
10074}
10075
645c22ef
DM
10076/* create a new pointer-mapping table */
10077
1d7c1841
GS
10078PTR_TBL_t *
10079Perl_ptr_table_new(pTHX)
10080{
10081 PTR_TBL_t *tbl;
10082 Newz(0, tbl, 1, PTR_TBL_t);
10083 tbl->tbl_max = 511;
10084 tbl->tbl_items = 0;
10085 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
10086 return tbl;
10087}
10088
134ca3d6
DM
10089#if (PTRSIZE == 8)
10090# define PTR_TABLE_HASH(ptr) (PTR2UV(ptr) >> 3)
10091#else
10092# define PTR_TABLE_HASH(ptr) (PTR2UV(ptr) >> 2)
10093#endif
10094
437a6bf1 10095#define new_pte() new_body(struct ptr_tbl_ent, pte)
cb4415b8 10096#define del_pte(p) del_body_type(p, struct ptr_tbl_ent, pte)
32e691d0 10097
645c22ef
DM
10098/* map an existing pointer using a table */
10099
1d7c1841 10100void *
53c1dcc0 10101Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, const void *sv)
1d7c1841
GS
10102{
10103 PTR_TBL_ENT_t *tblent;
4373e329 10104 const UV hash = PTR_TABLE_HASH(sv);
1d7c1841
GS
10105 assert(tbl);
10106 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
10107 for (; tblent; tblent = tblent->next) {
10108 if (tblent->oldval == sv)
10109 return tblent->newval;
10110 }
10111 return (void*)NULL;
10112}
10113
645c22ef
DM
10114/* add a new entry to a pointer-mapping table */
10115
1d7c1841 10116void
53c1dcc0 10117Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, const void *oldv, void *newv)
1d7c1841
GS
10118{
10119 PTR_TBL_ENT_t *tblent, **otblent;
10120 /* XXX this may be pessimal on platforms where pointers aren't good
10121 * hash values e.g. if they grow faster in the most significant
10122 * bits */
4373e329 10123 const UV hash = PTR_TABLE_HASH(oldv);
14cade97 10124 bool empty = 1;
1d7c1841
GS
10125
10126 assert(tbl);
10127 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
14cade97 10128 for (tblent = *otblent; tblent; empty=0, tblent = tblent->next) {
1d7c1841
GS
10129 if (tblent->oldval == oldv) {
10130 tblent->newval = newv;
1d7c1841
GS
10131 return;
10132 }
10133 }
437a6bf1 10134 tblent = new_pte();
1d7c1841
GS
10135 tblent->oldval = oldv;
10136 tblent->newval = newv;
10137 tblent->next = *otblent;
10138 *otblent = tblent;
10139 tbl->tbl_items++;
14cade97 10140 if (!empty && tbl->tbl_items > tbl->tbl_max)
1d7c1841
GS
10141 ptr_table_split(tbl);
10142}
10143
645c22ef
DM
10144/* double the hash bucket size of an existing ptr table */
10145
1d7c1841
GS
10146void
10147Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
10148{
10149 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
4373e329 10150 const UV oldsize = tbl->tbl_max + 1;
1d7c1841
GS
10151 UV newsize = oldsize * 2;
10152 UV i;
10153
10154 Renew(ary, newsize, PTR_TBL_ENT_t*);
10155 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
10156 tbl->tbl_max = --newsize;
10157 tbl->tbl_ary = ary;
10158 for (i=0; i < oldsize; i++, ary++) {
10159 PTR_TBL_ENT_t **curentp, **entp, *ent;
10160 if (!*ary)
10161 continue;
10162 curentp = ary + oldsize;
10163 for (entp = ary, ent = *ary; ent; ent = *entp) {
134ca3d6 10164 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
10165 *entp = ent->next;
10166 ent->next = *curentp;
10167 *curentp = ent;
10168 continue;
10169 }
10170 else
10171 entp = &ent->next;
10172 }
10173 }
10174}
10175
645c22ef
DM
10176/* remove all the entries from a ptr table */
10177
a0739874
DM
10178void
10179Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
10180{
10181 register PTR_TBL_ENT_t **array;
10182 register PTR_TBL_ENT_t *entry;
a0739874
DM
10183 UV riter = 0;
10184 UV max;
10185
10186 if (!tbl || !tbl->tbl_items) {
10187 return;
10188 }
10189
10190 array = tbl->tbl_ary;
10191 entry = array[0];
10192 max = tbl->tbl_max;
10193
10194 for (;;) {
10195 if (entry) {
4373e329 10196 PTR_TBL_ENT_t *oentry = entry;
a0739874 10197 entry = entry->next;
437a6bf1 10198 del_pte(oentry);
a0739874
DM
10199 }
10200 if (!entry) {
10201 if (++riter > max) {
10202 break;
10203 }
10204 entry = array[riter];
10205 }
10206 }
10207
10208 tbl->tbl_items = 0;
10209}
10210
645c22ef
DM
10211/* clear and free a ptr table */
10212
a0739874
DM
10213void
10214Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
10215{
10216 if (!tbl) {
10217 return;
10218 }
10219 ptr_table_clear(tbl);
10220 Safefree(tbl->tbl_ary);
10221 Safefree(tbl);
10222}
10223
645c22ef
DM
10224/* attempt to make everything in the typeglob readonly */
10225
5bd07a3d 10226STATIC SV *
59b40662 10227S_gv_share(pTHX_ SV *sstr, CLONE_PARAMS *param)
5bd07a3d
DM
10228{
10229 GV *gv = (GV*)sstr;
59b40662 10230 SV *sv = &param->proto_perl->Isv_no; /* just need SvREADONLY-ness */
5bd07a3d
DM
10231
10232 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 10233 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
10234 }
10235 else if (!GvCV(gv)) {
10236 GvCV(gv) = (CV*)sv;
10237 }
10238 else {
10239 /* CvPADLISTs cannot be shared */
37e20706 10240 if (!SvREADONLY(GvCV(gv)) && !CvXSUB(GvCV(gv))) {
7fb37951 10241 GvUNIQUE_off(gv);
5bd07a3d
DM
10242 }
10243 }
10244
7fb37951 10245 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
10246#if 0
10247 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
bfcb3514 10248 HvNAME_get(GvSTASH(gv)), GvNAME(gv));
5bd07a3d
DM
10249#endif
10250 return Nullsv;
10251 }
10252
4411f3b6 10253 /*
5bd07a3d
DM
10254 * write attempts will die with
10255 * "Modification of a read-only value attempted"
10256 */
10257 if (!GvSV(gv)) {
10258 GvSV(gv) = sv;
10259 }
10260 else {
10261 SvREADONLY_on(GvSV(gv));
10262 }
10263
10264 if (!GvAV(gv)) {
10265 GvAV(gv) = (AV*)sv;
10266 }
10267 else {
10268 SvREADONLY_on(GvAV(gv));
10269 }
10270
10271 if (!GvHV(gv)) {
10272 GvHV(gv) = (HV*)sv;
10273 }
10274 else {
53c33732 10275 SvREADONLY_on(GvHV(gv));
5bd07a3d
DM
10276 }
10277
10278 return sstr; /* he_dup() will SvREFCNT_inc() */
10279}
10280
83841fad
NIS
10281void
10282Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
10283{
10284 if (SvROK(sstr)) {
b162af07
SP
10285 SvRV_set(dstr, SvWEAKREF(sstr)
10286 ? sv_dup(SvRV(sstr), param)
10287 : sv_dup_inc(SvRV(sstr), param));
f880fe2f 10288
83841fad 10289 }
3f7c398e 10290 else if (SvPVX_const(sstr)) {
83841fad
NIS
10291 /* Has something there */
10292 if (SvLEN(sstr)) {
68795e93 10293 /* Normal PV - clone whole allocated space */
3f7c398e 10294 SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
d3d0e6f1
NC
10295 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10296 /* Not that normal - actually sstr is copy on write.
10297 But we are a true, independant SV, so: */
10298 SvREADONLY_off(dstr);
10299 SvFAKE_off(dstr);
10300 }
68795e93 10301 }
83841fad
NIS
10302 else {
10303 /* Special case - not normally malloced for some reason */
ef10be65
NC
10304 if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
10305 /* A "shared" PV - clone it as "shared" PV */
10306 SvPV_set(dstr,
10307 HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
10308 param)));
83841fad
NIS
10309 }
10310 else {
10311 /* Some other special case - random pointer */
f880fe2f 10312 SvPV_set(dstr, SvPVX(sstr));
d3d0e6f1 10313 }
83841fad
NIS
10314 }
10315 }
10316 else {
10317 /* Copy the Null */
f880fe2f 10318 if (SvTYPE(dstr) == SVt_RV)
b162af07 10319 SvRV_set(dstr, NULL);
f880fe2f
SP
10320 else
10321 SvPV_set(dstr, 0);
83841fad
NIS
10322 }
10323}
10324
662fb8b2
NC
10325/* duplicate an SV of any type (including AV, HV etc) */
10326
1d7c1841 10327SV *
a8fc9800 10328Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
1d7c1841 10329{
27da23d5 10330 dVAR;
1d7c1841
GS
10331 SV *dstr;
10332
10333 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
10334 return Nullsv;
10335 /* look for it in the table first */
10336 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
10337 if (dstr)
10338 return dstr;
10339
0405e91e
AB
10340 if(param->flags & CLONEf_JOIN_IN) {
10341 /** We are joining here so we don't want do clone
10342 something that is bad **/
bfcb3514 10343 const char *hvname;
0405e91e
AB
10344
10345 if(SvTYPE(sstr) == SVt_PVHV &&
bfcb3514 10346 (hvname = HvNAME_get(sstr))) {
0405e91e 10347 /** don't clone stashes if they already exist **/
bfcb3514 10348 HV* old_stash = gv_stashpv(hvname,0);
0405e91e
AB
10349 return (SV*) old_stash;
10350 }
10351 }
10352
1d7c1841
GS
10353 /* create anew and remember what it is */
10354 new_SV(dstr);
fd0854ff
DM
10355
10356#ifdef DEBUG_LEAKING_SCALARS
10357 dstr->sv_debug_optype = sstr->sv_debug_optype;
10358 dstr->sv_debug_line = sstr->sv_debug_line;
10359 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
10360 dstr->sv_debug_cloned = 1;
10361# ifdef NETWARE
10362 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
10363# else
10364 dstr->sv_debug_file = savesharedpv(sstr->sv_debug_file);
10365# endif
10366#endif
10367
1d7c1841
GS
10368 ptr_table_store(PL_ptr_table, sstr, dstr);
10369
10370 /* clone */
10371 SvFLAGS(dstr) = SvFLAGS(sstr);
10372 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
10373 SvREFCNT(dstr) = 0; /* must be before any other dups! */
10374
10375#ifdef DEBUGGING
3f7c398e 10376 if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
1d7c1841 10377 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
3f7c398e 10378 PL_watch_pvx, SvPVX_const(sstr));
1d7c1841
GS
10379#endif
10380
9660f481
DM
10381 /* don't clone objects whose class has asked us not to */
10382 if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
10383 SvFLAGS(dstr) &= ~SVTYPEMASK;
10384 SvOBJECT_off(dstr);
10385 return dstr;
10386 }
10387
1d7c1841
GS
10388 switch (SvTYPE(sstr)) {
10389 case SVt_NULL:
10390 SvANY(dstr) = NULL;
10391 break;
10392 case SVt_IV:
339049b0 10393 SvANY(dstr) = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
45977657 10394 SvIV_set(dstr, SvIVX(sstr));
1d7c1841
GS
10395 break;
10396 case SVt_NV:
10397 SvANY(dstr) = new_XNV();
9d6ce603 10398 SvNV_set(dstr, SvNVX(sstr));
1d7c1841
GS
10399 break;
10400 case SVt_RV:
339049b0 10401 SvANY(dstr) = &(dstr->sv_u.svu_rv);
83841fad 10402 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841 10403 break;
662fb8b2
NC
10404 default:
10405 {
10406 /* These are all the types that need complex bodies allocating. */
10407 size_t new_body_length;
10408 size_t new_body_offset = 0;
10409 void **new_body_arena;
10410 void **new_body_arenaroot;
10411 void *new_body;
10412
10413 switch (SvTYPE(sstr)) {
10414 default:
10415 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]",
10416 (IV)SvTYPE(sstr));
10417 break;
10418
10419 case SVt_PVIO:
10420 new_body = new_XPVIO();
10421 new_body_length = sizeof(XPVIO);
10422 break;
10423 case SVt_PVFM:
10424 new_body = new_XPVFM();
10425 new_body_length = sizeof(XPVFM);
10426 break;
10427
10428 case SVt_PVHV:
10429 new_body_arena = (void **) &PL_xpvhv_root;
10430 new_body_arenaroot = (void **) &PL_xpvhv_arenaroot;
10431 new_body_offset = STRUCT_OFFSET(XPVHV, xhv_fill)
10432 - STRUCT_OFFSET(xpvhv_allocated, xhv_fill);
10433 new_body_length = STRUCT_OFFSET(XPVHV, xmg_stash)
10434 + sizeof (((XPVHV*)SvANY(sstr))->xmg_stash)
10435 - new_body_offset;
10436 goto new_body;
10437 case SVt_PVAV:
10438 new_body_arena = (void **) &PL_xpvav_root;
10439 new_body_arenaroot = (void **) &PL_xpvav_arenaroot;
10440 new_body_offset = STRUCT_OFFSET(XPVAV, xav_fill)
10441 - STRUCT_OFFSET(xpvav_allocated, xav_fill);
10442 new_body_length = STRUCT_OFFSET(XPVHV, xmg_stash)
10443 + sizeof (((XPVHV*)SvANY(sstr))->xmg_stash)
10444 - new_body_offset;
10445 goto new_body;
10446 case SVt_PVBM:
10447 new_body_length = sizeof(XPVBM);
10448 new_body_arena = (void **) &PL_xpvbm_root;
10449 new_body_arenaroot = (void **) &PL_xpvbm_arenaroot;
10450 goto new_body;
10451 case SVt_PVGV:
10452 if (GvUNIQUE((GV*)sstr)) {
10453 SV *share;
10454 if ((share = gv_share(sstr, param))) {
10455 del_SV(dstr);
10456 dstr = share;
10457 ptr_table_store(PL_ptr_table, sstr, dstr);
5bd07a3d 10458#if 0
662fb8b2
NC
10459 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
10460 HvNAME_get(GvSTASH(share)), GvNAME(share));
10461#endif
10462 goto done_share;
10463 }
10464 }
10465 new_body_length = sizeof(XPVGV);
10466 new_body_arena = (void **) &PL_xpvgv_root;
10467 new_body_arenaroot = (void **) &PL_xpvgv_arenaroot;
10468 goto new_body;
10469 case SVt_PVCV:
10470 new_body_length = sizeof(XPVCV);
10471 new_body_arena = (void **) &PL_xpvcv_root;
10472 new_body_arenaroot = (void **) &PL_xpvcv_arenaroot;
10473 goto new_body;
10474 case SVt_PVLV:
10475 new_body_length = sizeof(XPVLV);
10476 new_body_arena = (void **) &PL_xpvlv_root;
10477 new_body_arenaroot = (void **) &PL_xpvlv_arenaroot;
10478 goto new_body;
10479 case SVt_PVMG:
10480 new_body_length = sizeof(XPVMG);
10481 new_body_arena = (void **) &PL_xpvmg_root;
10482 new_body_arenaroot = (void **) &PL_xpvmg_arenaroot;
10483 goto new_body;
10484 case SVt_PVNV:
10485 new_body_length = sizeof(XPVNV);
10486 new_body_arena = (void **) &PL_xpvnv_root;
10487 new_body_arenaroot = (void **) &PL_xpvnv_arenaroot;
10488 goto new_body;
10489 case SVt_PVIV:
10490 new_body_offset = STRUCT_OFFSET(XPVIV, xpv_cur)
10491 - STRUCT_OFFSET(xpviv_allocated, xpv_cur);
10492 new_body_length = sizeof(XPVIV) - new_body_offset;
10493 new_body_arena = (void **) &PL_xpviv_root;
10494 new_body_arenaroot = (void **) &PL_xpviv_arenaroot;
10495 goto new_body;
10496 case SVt_PV:
10497 new_body_offset = STRUCT_OFFSET(XPV, xpv_cur)
10498 - STRUCT_OFFSET(xpv_allocated, xpv_cur);
10499 new_body_length = sizeof(XPV) - new_body_offset;
10500 new_body_arena = (void **) &PL_xpv_root;
10501 new_body_arenaroot = (void **) &PL_xpv_arenaroot;
10502 new_body:
10503 assert(new_body_length);
10504#ifndef PURIFY
dd690478
NC
10505 new_body = (void*)((char*)S_new_body(aTHX_ new_body_arenaroot,
10506 new_body_arena,
10507 new_body_length)
10508 - new_body_offset);
662fb8b2
NC
10509#else
10510 /* We always allocated the full length item with PURIFY */
10511 new_body_length += new_body_offset;
10512 new_body_offset = 0;
10513 new_body = my_safemalloc(new_body_length);
5bd07a3d 10514#endif
1d7c1841 10515 }
662fb8b2
NC
10516 assert(new_body);
10517 SvANY(dstr) = new_body;
10518
10519 Copy(((char*)SvANY(sstr)) + new_body_offset,
10520 ((char*)SvANY(dstr)) + new_body_offset,
10521 new_body_length, char);
10522
10523 if (SvTYPE(sstr) != SVt_PVAV && SvTYPE(sstr) != SVt_PVHV)
10524 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10525
10526 /* The Copy above means that all the source (unduplicated) pointers
10527 are now in the destination. We can check the flags and the
10528 pointers in either, but it's possible that there's less cache
10529 missing by always going for the destination.
10530 FIXME - instrument and check that assumption */
10531 if (SvTYPE(sstr) >= SVt_PVMG) {
10532 if (SvMAGIC(dstr))
10533 SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
10534 if (SvSTASH(dstr))
10535 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
1d7c1841 10536 }
662fb8b2
NC
10537
10538 switch (SvTYPE(sstr)) {
10539 case SVt_PV:
10540 break;
10541 case SVt_PVIV:
10542 break;
10543 case SVt_PVNV:
10544 break;
10545 case SVt_PVMG:
10546 break;
10547 case SVt_PVBM:
10548 break;
10549 case SVt_PVLV:
10550 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
10551 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
10552 LvTARG(dstr) = dstr;
10553 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
10554 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(dstr), 0, param);
10555 else
10556 LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
10557 break;
10558 case SVt_PVGV:
10559 GvNAME(dstr) = SAVEPVN(GvNAME(dstr), GvNAMELEN(dstr));
10560 GvSTASH(dstr) = hv_dup_inc(GvSTASH(dstr), param);
10561 GvGP(dstr) = gp_dup(GvGP(dstr), param);
10562 (void)GpREFCNT_inc(GvGP(dstr));
10563 break;
10564 case SVt_PVIO:
10565 IoIFP(dstr) = fp_dup(IoIFP(dstr), IoTYPE(dstr), param);
10566 if (IoOFP(dstr) == IoIFP(sstr))
10567 IoOFP(dstr) = IoIFP(dstr);
10568 else
10569 IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
10570 /* PL_rsfp_filters entries have fake IoDIRP() */
10571 if (IoDIRP(dstr) && !(IoFLAGS(dstr) & IOf_FAKE_DIRP))
10572 IoDIRP(dstr) = dirp_dup(IoDIRP(dstr));
10573 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
10574 /* I have no idea why fake dirp (rsfps)
10575 should be treated differently but otherwise
10576 we end up with leaks -- sky*/
10577 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(dstr), param);
10578 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(dstr), param);
10579 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(dstr), param);
10580 } else {
10581 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(dstr), param);
10582 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(dstr), param);
10583 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(dstr), param);
10584 }
10585 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(dstr));
10586 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(dstr));
10587 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(dstr));
10588 break;
10589 case SVt_PVAV:
10590 if (AvARRAY((AV*)sstr)) {
10591 SV **dst_ary, **src_ary;
10592 SSize_t items = AvFILLp((AV*)sstr) + 1;
10593
10594 src_ary = AvARRAY((AV*)sstr);
10595 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
10596 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
10597 SvPV_set(dstr, (char*)dst_ary);
10598 AvALLOC((AV*)dstr) = dst_ary;
10599 if (AvREAL((AV*)sstr)) {
10600 while (items-- > 0)
10601 *dst_ary++ = sv_dup_inc(*src_ary++, param);
10602 }
10603 else {
10604 while (items-- > 0)
10605 *dst_ary++ = sv_dup(*src_ary++, param);
10606 }
10607 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10608 while (items-- > 0) {
10609 *dst_ary++ = &PL_sv_undef;
10610 }
bfcb3514 10611 }
662fb8b2
NC
10612 else {
10613 SvPV_set(dstr, Nullch);
10614 AvALLOC((AV*)dstr) = (SV**)NULL;
b79f7545 10615 }
662fb8b2
NC
10616 break;
10617 case SVt_PVHV:
10618 {
10619 HEK *hvname = 0;
10620
10621 if (HvARRAY((HV*)sstr)) {
10622 STRLEN i = 0;
10623 const bool sharekeys = !!HvSHAREKEYS(sstr);
10624 XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
10625 XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
10626 char *darray;
10627 New(0, darray,
10628 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
10629 + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
10630 char);
10631 HvARRAY(dstr) = (HE**)darray;
10632 while (i <= sxhv->xhv_max) {
10633 HE *source = HvARRAY(sstr)[i];
10634 HvARRAY(dstr)[i] = source
10635 ? he_dup(source, sharekeys, param) : 0;
10636 ++i;
10637 }
10638 if (SvOOK(sstr)) {
10639 struct xpvhv_aux *saux = HvAUX(sstr);
10640 struct xpvhv_aux *daux = HvAUX(dstr);
10641 /* This flag isn't copied. */
10642 /* SvOOK_on(hv) attacks the IV flags. */
10643 SvFLAGS(dstr) |= SVf_OOK;
10644
10645 hvname = saux->xhv_name;
dd690478
NC
10646 daux->xhv_name
10647 = hvname ? hek_dup(hvname, param) : hvname;
662fb8b2
NC
10648
10649 daux->xhv_riter = saux->xhv_riter;
10650 daux->xhv_eiter = saux->xhv_eiter
dd690478
NC
10651 ? he_dup(saux->xhv_eiter,
10652 (bool)!!HvSHAREKEYS(sstr), param) : 0;
662fb8b2
NC
10653 }
10654 }
10655 else {
10656 SvPV_set(dstr, Nullch);
10657 }
10658 /* Record stashes for possible cloning in Perl_clone(). */
10659 if(hvname)
10660 av_push(param->stashes, dstr);
10661 }
10662 break;
10663 case SVt_PVFM:
10664 case SVt_PVCV:
10665 /* NOTE: not refcounted */
10666 CvSTASH(dstr) = hv_dup(CvSTASH(dstr), param);
10667 OP_REFCNT_LOCK;
10668 CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
10669 OP_REFCNT_UNLOCK;
10670 if (CvCONST(dstr)) {
10671 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(dstr)) ?
10672 SvREFCNT_inc(CvXSUBANY(dstr).any_ptr) :
10673 sv_dup_inc((SV *)CvXSUBANY(dstr).any_ptr, param);
10674 }
10675 /* don't dup if copying back - CvGV isn't refcounted, so the
10676 * duped GV may never be freed. A bit of a hack! DAPM */
10677 CvGV(dstr) = (param->flags & CLONEf_JOIN_IN) ?
10678 Nullgv : gv_dup(CvGV(dstr), param) ;
10679 if (!(param->flags & CLONEf_COPY_STACKS)) {
10680 CvDEPTH(dstr) = 0;
10681 }
10682 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
10683 CvOUTSIDE(dstr) =
10684 CvWEAKOUTSIDE(sstr)
10685 ? cv_dup( CvOUTSIDE(dstr), param)
10686 : cv_dup_inc(CvOUTSIDE(dstr), param);
10687 if (!CvXSUB(dstr))
10688 CvFILE(dstr) = SAVEPV(CvFILE(dstr));
10689 break;
bfcb3514 10690 }
1d7c1841 10691 }
1d7c1841
GS
10692 }
10693
662fb8b2 10694 done_share:
1d7c1841
GS
10695 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
10696 ++PL_sv_objcount;
10697
10698 return dstr;
d2d73c3e 10699 }
1d7c1841 10700
645c22ef
DM
10701/* duplicate a context */
10702
1d7c1841 10703PERL_CONTEXT *
a8fc9800 10704Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
10705{
10706 PERL_CONTEXT *ncxs;
10707
10708 if (!cxs)
10709 return (PERL_CONTEXT*)NULL;
10710
10711 /* look for it in the table first */
10712 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
10713 if (ncxs)
10714 return ncxs;
10715
10716 /* create anew and remember what it is */
10717 Newz(56, ncxs, max + 1, PERL_CONTEXT);
10718 ptr_table_store(PL_ptr_table, cxs, ncxs);
10719
10720 while (ix >= 0) {
10721 PERL_CONTEXT *cx = &cxs[ix];
10722 PERL_CONTEXT *ncx = &ncxs[ix];
10723 ncx->cx_type = cx->cx_type;
10724 if (CxTYPE(cx) == CXt_SUBST) {
10725 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
10726 }
10727 else {
10728 ncx->blk_oldsp = cx->blk_oldsp;
10729 ncx->blk_oldcop = cx->blk_oldcop;
1d7c1841
GS
10730 ncx->blk_oldmarksp = cx->blk_oldmarksp;
10731 ncx->blk_oldscopesp = cx->blk_oldscopesp;
10732 ncx->blk_oldpm = cx->blk_oldpm;
10733 ncx->blk_gimme = cx->blk_gimme;
10734 switch (CxTYPE(cx)) {
10735 case CXt_SUB:
10736 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
10737 ? cv_dup_inc(cx->blk_sub.cv, param)
10738 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 10739 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 10740 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 10741 : Nullav);
d2d73c3e 10742 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
10743 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
10744 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10745 ncx->blk_sub.lval = cx->blk_sub.lval;
f39bc417 10746 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
10747 break;
10748 case CXt_EVAL:
10749 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
10750 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 10751 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 10752 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 10753 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
f39bc417 10754 ncx->blk_eval.retop = cx->blk_eval.retop;
1d7c1841
GS
10755 break;
10756 case CXt_LOOP:
10757 ncx->blk_loop.label = cx->blk_loop.label;
10758 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
10759 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
10760 ncx->blk_loop.next_op = cx->blk_loop.next_op;
10761 ncx->blk_loop.last_op = cx->blk_loop.last_op;
10762 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
10763 ? cx->blk_loop.iterdata
d2d73c3e 10764 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
10765 ncx->blk_loop.oldcomppad
10766 = (PAD*)ptr_table_fetch(PL_ptr_table,
10767 cx->blk_loop.oldcomppad);
d2d73c3e
AB
10768 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
10769 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
10770 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
10771 ncx->blk_loop.iterix = cx->blk_loop.iterix;
10772 ncx->blk_loop.itermax = cx->blk_loop.itermax;
10773 break;
10774 case CXt_FORMAT:
d2d73c3e
AB
10775 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
10776 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
10777 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841 10778 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
f39bc417 10779 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
10780 break;
10781 case CXt_BLOCK:
10782 case CXt_NULL:
10783 break;
10784 }
10785 }
10786 --ix;
10787 }
10788 return ncxs;
10789}
10790
645c22ef
DM
10791/* duplicate a stack info structure */
10792
1d7c1841 10793PERL_SI *
a8fc9800 10794Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
10795{
10796 PERL_SI *nsi;
10797
10798 if (!si)
10799 return (PERL_SI*)NULL;
10800
10801 /* look for it in the table first */
10802 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
10803 if (nsi)
10804 return nsi;
10805
10806 /* create anew and remember what it is */
10807 Newz(56, nsi, 1, PERL_SI);
10808 ptr_table_store(PL_ptr_table, si, nsi);
10809
d2d73c3e 10810 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
10811 nsi->si_cxix = si->si_cxix;
10812 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 10813 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 10814 nsi->si_type = si->si_type;
d2d73c3e
AB
10815 nsi->si_prev = si_dup(si->si_prev, param);
10816 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
10817 nsi->si_markoff = si->si_markoff;
10818
10819 return nsi;
10820}
10821
10822#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
10823#define TOPINT(ss,ix) ((ss)[ix].any_i32)
10824#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
10825#define TOPLONG(ss,ix) ((ss)[ix].any_long)
10826#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
10827#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
10828#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
10829#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
10830#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
10831#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
10832#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
10833#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
10834#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
10835#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
10836
10837/* XXXXX todo */
10838#define pv_dup_inc(p) SAVEPV(p)
10839#define pv_dup(p) SAVEPV(p)
10840#define svp_dup_inc(p,pp) any_dup(p,pp)
10841
645c22ef
DM
10842/* map any object to the new equivent - either something in the
10843 * ptr table, or something in the interpreter structure
10844 */
10845
1d7c1841 10846void *
53c1dcc0 10847Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
1d7c1841
GS
10848{
10849 void *ret;
10850
10851 if (!v)
10852 return (void*)NULL;
10853
10854 /* look for it in the table first */
10855 ret = ptr_table_fetch(PL_ptr_table, v);
10856 if (ret)
10857 return ret;
10858
10859 /* see if it is part of the interpreter structure */
10860 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 10861 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 10862 else {
1d7c1841 10863 ret = v;
05ec9bb3 10864 }
1d7c1841
GS
10865
10866 return ret;
10867}
10868
645c22ef
DM
10869/* duplicate the save stack */
10870
1d7c1841 10871ANY *
a8fc9800 10872Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841 10873{
53c1dcc0
AL
10874 ANY * const ss = proto_perl->Tsavestack;
10875 const I32 max = proto_perl->Tsavestack_max;
10876 I32 ix = proto_perl->Tsavestack_ix;
1d7c1841
GS
10877 ANY *nss;
10878 SV *sv;
10879 GV *gv;
10880 AV *av;
10881 HV *hv;
10882 void* ptr;
10883 int intval;
10884 long longval;
10885 GP *gp;
10886 IV iv;
c4e33207 10887 char *c = NULL;
1d7c1841 10888 void (*dptr) (void*);
acfe0abc 10889 void (*dxptr) (pTHX_ void*);
1d7c1841
GS
10890
10891 Newz(54, nss, max, ANY);
10892
10893 while (ix > 0) {
b464bac0 10894 I32 i = POPINT(ss,ix);
1d7c1841
GS
10895 TOPINT(nss,ix) = i;
10896 switch (i) {
10897 case SAVEt_ITEM: /* normal string */
10898 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10899 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10900 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10901 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10902 break;
10903 case SAVEt_SV: /* scalar reference */
10904 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10905 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10906 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10907 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 10908 break;
f4dd75d9
GS
10909 case SAVEt_GENERIC_PVREF: /* generic char* */
10910 c = (char*)POPPTR(ss,ix);
10911 TOPPTR(nss,ix) = pv_dup(c);
10912 ptr = POPPTR(ss,ix);
10913 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10914 break;
05ec9bb3
NIS
10915 case SAVEt_SHARED_PVREF: /* char* in shared space */
10916 c = (char*)POPPTR(ss,ix);
10917 TOPPTR(nss,ix) = savesharedpv(c);
10918 ptr = POPPTR(ss,ix);
10919 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10920 break;
1d7c1841
GS
10921 case SAVEt_GENERIC_SVREF: /* generic sv */
10922 case SAVEt_SVREF: /* scalar reference */
10923 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10924 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10925 ptr = POPPTR(ss,ix);
10926 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
10927 break;
10928 case SAVEt_AV: /* array reference */
10929 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10930 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 10931 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10932 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10933 break;
10934 case SAVEt_HV: /* hash reference */
10935 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10936 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 10937 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10938 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10939 break;
10940 case SAVEt_INT: /* int reference */
10941 ptr = POPPTR(ss,ix);
10942 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10943 intval = (int)POPINT(ss,ix);
10944 TOPINT(nss,ix) = intval;
10945 break;
10946 case SAVEt_LONG: /* long reference */
10947 ptr = POPPTR(ss,ix);
10948 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10949 longval = (long)POPLONG(ss,ix);
10950 TOPLONG(nss,ix) = longval;
10951 break;
10952 case SAVEt_I32: /* I32 reference */
10953 case SAVEt_I16: /* I16 reference */
10954 case SAVEt_I8: /* I8 reference */
10955 ptr = POPPTR(ss,ix);
10956 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10957 i = POPINT(ss,ix);
10958 TOPINT(nss,ix) = i;
10959 break;
10960 case SAVEt_IV: /* IV reference */
10961 ptr = POPPTR(ss,ix);
10962 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10963 iv = POPIV(ss,ix);
10964 TOPIV(nss,ix) = iv;
10965 break;
10966 case SAVEt_SPTR: /* SV* reference */
10967 ptr = POPPTR(ss,ix);
10968 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10969 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10970 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
10971 break;
10972 case SAVEt_VPTR: /* random* reference */
10973 ptr = POPPTR(ss,ix);
10974 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10975 ptr = POPPTR(ss,ix);
10976 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10977 break;
10978 case SAVEt_PPTR: /* char* reference */
10979 ptr = POPPTR(ss,ix);
10980 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10981 c = (char*)POPPTR(ss,ix);
10982 TOPPTR(nss,ix) = pv_dup(c);
10983 break;
10984 case SAVEt_HPTR: /* HV* reference */
10985 ptr = POPPTR(ss,ix);
10986 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10987 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10988 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
10989 break;
10990 case SAVEt_APTR: /* AV* reference */
10991 ptr = POPPTR(ss,ix);
10992 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10993 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10994 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
10995 break;
10996 case SAVEt_NSTAB:
10997 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10998 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10999 break;
11000 case SAVEt_GP: /* scalar reference */
11001 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 11002 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
11003 (void)GpREFCNT_inc(gp);
11004 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 11005 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
11006 c = (char*)POPPTR(ss,ix);
11007 TOPPTR(nss,ix) = pv_dup(c);
11008 iv = POPIV(ss,ix);
11009 TOPIV(nss,ix) = iv;
11010 iv = POPIV(ss,ix);
11011 TOPIV(nss,ix) = iv;
11012 break;
11013 case SAVEt_FREESV:
26d9b02f 11014 case SAVEt_MORTALIZESV:
1d7c1841 11015 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11016 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11017 break;
11018 case SAVEt_FREEOP:
11019 ptr = POPPTR(ss,ix);
11020 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
11021 /* these are assumed to be refcounted properly */
53c1dcc0 11022 OP *o;
1d7c1841
GS
11023 switch (((OP*)ptr)->op_type) {
11024 case OP_LEAVESUB:
11025 case OP_LEAVESUBLV:
11026 case OP_LEAVEEVAL:
11027 case OP_LEAVE:
11028 case OP_SCOPE:
11029 case OP_LEAVEWRITE:
e977893f
GS
11030 TOPPTR(nss,ix) = ptr;
11031 o = (OP*)ptr;
11032 OpREFCNT_inc(o);
1d7c1841
GS
11033 break;
11034 default:
11035 TOPPTR(nss,ix) = Nullop;
11036 break;
11037 }
11038 }
11039 else
11040 TOPPTR(nss,ix) = Nullop;
11041 break;
11042 case SAVEt_FREEPV:
11043 c = (char*)POPPTR(ss,ix);
11044 TOPPTR(nss,ix) = pv_dup_inc(c);
11045 break;
11046 case SAVEt_CLEARSV:
11047 longval = POPLONG(ss,ix);
11048 TOPLONG(nss,ix) = longval;
11049 break;
11050 case SAVEt_DELETE:
11051 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11052 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
11053 c = (char*)POPPTR(ss,ix);
11054 TOPPTR(nss,ix) = pv_dup_inc(c);
11055 i = POPINT(ss,ix);
11056 TOPINT(nss,ix) = i;
11057 break;
11058 case SAVEt_DESTRUCTOR:
11059 ptr = POPPTR(ss,ix);
11060 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11061 dptr = POPDPTR(ss,ix);
8141890a
JH
11062 TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
11063 any_dup(FPTR2DPTR(void *, dptr),
11064 proto_perl));
1d7c1841
GS
11065 break;
11066 case SAVEt_DESTRUCTOR_X:
11067 ptr = POPPTR(ss,ix);
11068 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11069 dxptr = POPDXPTR(ss,ix);
8141890a
JH
11070 TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
11071 any_dup(FPTR2DPTR(void *, dxptr),
11072 proto_perl));
1d7c1841
GS
11073 break;
11074 case SAVEt_REGCONTEXT:
11075 case SAVEt_ALLOC:
11076 i = POPINT(ss,ix);
11077 TOPINT(nss,ix) = i;
11078 ix -= i;
11079 break;
11080 case SAVEt_STACK_POS: /* Position on Perl stack */
11081 i = POPINT(ss,ix);
11082 TOPINT(nss,ix) = i;
11083 break;
11084 case SAVEt_AELEM: /* array element */
11085 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11086 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11087 i = POPINT(ss,ix);
11088 TOPINT(nss,ix) = i;
11089 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11090 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
11091 break;
11092 case SAVEt_HELEM: /* hash element */
11093 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11094 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11095 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11096 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11097 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11098 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
11099 break;
11100 case SAVEt_OP:
11101 ptr = POPPTR(ss,ix);
11102 TOPPTR(nss,ix) = ptr;
11103 break;
11104 case SAVEt_HINTS:
11105 i = POPINT(ss,ix);
11106 TOPINT(nss,ix) = i;
11107 break;
c4410b1b
GS
11108 case SAVEt_COMPPAD:
11109 av = (AV*)POPPTR(ss,ix);
58ed4fbe 11110 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 11111 break;
c3564e5c
GS
11112 case SAVEt_PADSV:
11113 longval = (long)POPLONG(ss,ix);
11114 TOPLONG(nss,ix) = longval;
11115 ptr = POPPTR(ss,ix);
11116 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11117 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11118 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 11119 break;
a1bb4754 11120 case SAVEt_BOOL:
38d8b13e 11121 ptr = POPPTR(ss,ix);
b9609c01 11122 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 11123 longval = (long)POPBOOL(ss,ix);
b9609c01 11124 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 11125 break;
8bd2680e
MHM
11126 case SAVEt_SET_SVFLAGS:
11127 i = POPINT(ss,ix);
11128 TOPINT(nss,ix) = i;
11129 i = POPINT(ss,ix);
11130 TOPINT(nss,ix) = i;
11131 sv = (SV*)POPPTR(ss,ix);
11132 TOPPTR(nss,ix) = sv_dup(sv, param);
11133 break;
1d7c1841
GS
11134 default:
11135 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
11136 }
11137 }
11138
11139 return nss;
11140}
11141
9660f481
DM
11142
11143/* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
11144 * flag to the result. This is done for each stash before cloning starts,
11145 * so we know which stashes want their objects cloned */
11146
11147static void
11148do_mark_cloneable_stash(pTHX_ SV *sv)
11149{
53c1dcc0 11150 const HEK * const hvname = HvNAME_HEK((HV*)sv);
bfcb3514 11151 if (hvname) {
53c1dcc0 11152 GV* const cloner = gv_fetchmethod_autoload((HV*)sv, "CLONE_SKIP", 0);
9660f481
DM
11153 SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
11154 if (cloner && GvCV(cloner)) {
11155 dSP;
11156 UV status;
11157
11158 ENTER;
11159 SAVETMPS;
11160 PUSHMARK(SP);
84bda14a 11161 XPUSHs(sv_2mortal(newSVhek(hvname)));
9660f481
DM
11162 PUTBACK;
11163 call_sv((SV*)GvCV(cloner), G_SCALAR);
11164 SPAGAIN;
11165 status = POPu;
11166 PUTBACK;
11167 FREETMPS;
11168 LEAVE;
11169 if (status)
11170 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
11171 }
11172 }
11173}
11174
11175
11176
645c22ef
DM
11177/*
11178=for apidoc perl_clone
11179
11180Create and return a new interpreter by cloning the current one.
11181
4be49ee6 11182perl_clone takes these flags as parameters:
6a78b4db 11183
7a5fa8a2
NIS
11184CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
11185without it we only clone the data and zero the stacks,
11186with it we copy the stacks and the new perl interpreter is
11187ready to run at the exact same point as the previous one.
11188The pseudo-fork code uses COPY_STACKS while the
6a78b4db
AB
11189threads->new doesn't.
11190
11191CLONEf_KEEP_PTR_TABLE
7a5fa8a2
NIS
11192perl_clone keeps a ptr_table with the pointer of the old
11193variable as a key and the new variable as a value,
11194this allows it to check if something has been cloned and not
11195clone it again but rather just use the value and increase the
11196refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
11197the ptr_table using the function
11198C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
11199reason to keep it around is if you want to dup some of your own
11200variable who are outside the graph perl scans, example of this
6a78b4db
AB
11201code is in threads.xs create
11202
11203CLONEf_CLONE_HOST
7a5fa8a2
NIS
11204This is a win32 thing, it is ignored on unix, it tells perls
11205win32host code (which is c++) to clone itself, this is needed on
11206win32 if you want to run two threads at the same time,
11207if you just want to do some stuff in a separate perl interpreter
11208and then throw it away and return to the original one,
6a78b4db
AB
11209you don't need to do anything.
11210
645c22ef
DM
11211=cut
11212*/
11213
11214/* XXX the above needs expanding by someone who actually understands it ! */
3fc56081
NK
11215EXTERN_C PerlInterpreter *
11216perl_clone_host(PerlInterpreter* proto_perl, UV flags);
645c22ef 11217
1d7c1841
GS
11218PerlInterpreter *
11219perl_clone(PerlInterpreter *proto_perl, UV flags)
11220{
27da23d5 11221 dVAR;
1d7c1841 11222#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
11223
11224 /* perlhost.h so we need to call into it
11225 to clone the host, CPerlHost should have a c interface, sky */
11226
11227 if (flags & CLONEf_CLONE_HOST) {
11228 return perl_clone_host(proto_perl,flags);
11229 }
11230 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
11231 proto_perl->IMem,
11232 proto_perl->IMemShared,
11233 proto_perl->IMemParse,
11234 proto_perl->IEnv,
11235 proto_perl->IStdIO,
11236 proto_perl->ILIO,
11237 proto_perl->IDir,
11238 proto_perl->ISock,
11239 proto_perl->IProc);
11240}
11241
11242PerlInterpreter *
11243perl_clone_using(PerlInterpreter *proto_perl, UV flags,
11244 struct IPerlMem* ipM, struct IPerlMem* ipMS,
11245 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
11246 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
11247 struct IPerlDir* ipD, struct IPerlSock* ipS,
11248 struct IPerlProc* ipP)
11249{
11250 /* XXX many of the string copies here can be optimized if they're
11251 * constants; they need to be allocated as common memory and just
11252 * their pointers copied. */
11253
8fc9efbd 11254 IV i;
64aa0685
GS
11255 CLONE_PARAMS clone_params;
11256 CLONE_PARAMS* param = &clone_params;
d2d73c3e 11257
1d7c1841 11258 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
9660f481
DM
11259 /* for each stash, determine whether its objects should be cloned */
11260 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
ba869deb 11261 PERL_SET_THX(my_perl);
1d7c1841 11262
acfe0abc 11263# ifdef DEBUGGING
a4530404 11264 Poison(my_perl, 1, PerlInterpreter);
fd0854ff 11265 PL_op = Nullop;
c008732b 11266 PL_curcop = (COP *)Nullop;
1d7c1841
GS
11267 PL_markstack = 0;
11268 PL_scopestack = 0;
11269 PL_savestack = 0;
22f7c9c9
JH
11270 PL_savestack_ix = 0;
11271 PL_savestack_max = -1;
66fe0623 11272 PL_sig_pending = 0;
25596c82 11273 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
acfe0abc 11274# else /* !DEBUGGING */
1d7c1841 11275 Zero(my_perl, 1, PerlInterpreter);
acfe0abc 11276# endif /* DEBUGGING */
1d7c1841
GS
11277
11278 /* host pointers */
11279 PL_Mem = ipM;
11280 PL_MemShared = ipMS;
11281 PL_MemParse = ipMP;
11282 PL_Env = ipE;
11283 PL_StdIO = ipStd;
11284 PL_LIO = ipLIO;
11285 PL_Dir = ipD;
11286 PL_Sock = ipS;
11287 PL_Proc = ipP;
1d7c1841
GS
11288#else /* !PERL_IMPLICIT_SYS */
11289 IV i;
64aa0685
GS
11290 CLONE_PARAMS clone_params;
11291 CLONE_PARAMS* param = &clone_params;
1d7c1841 11292 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
9660f481
DM
11293 /* for each stash, determine whether its objects should be cloned */
11294 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
ba869deb 11295 PERL_SET_THX(my_perl);
1d7c1841
GS
11296
11297# ifdef DEBUGGING
a4530404 11298 Poison(my_perl, 1, PerlInterpreter);
fd0854ff 11299 PL_op = Nullop;
c008732b 11300 PL_curcop = (COP *)Nullop;
1d7c1841
GS
11301 PL_markstack = 0;
11302 PL_scopestack = 0;
11303 PL_savestack = 0;
22f7c9c9
JH
11304 PL_savestack_ix = 0;
11305 PL_savestack_max = -1;
66fe0623 11306 PL_sig_pending = 0;
25596c82 11307 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
1d7c1841
GS
11308# else /* !DEBUGGING */
11309 Zero(my_perl, 1, PerlInterpreter);
11310# endif /* DEBUGGING */
11311#endif /* PERL_IMPLICIT_SYS */
83236556 11312 param->flags = flags;
59b40662 11313 param->proto_perl = proto_perl;
1d7c1841
GS
11314
11315 /* arena roots */
612f20c3 11316 PL_xnv_arenaroot = NULL;
1d7c1841 11317 PL_xnv_root = NULL;
612f20c3 11318 PL_xpv_arenaroot = NULL;
1d7c1841 11319 PL_xpv_root = NULL;
612f20c3 11320 PL_xpviv_arenaroot = NULL;
1d7c1841 11321 PL_xpviv_root = NULL;
612f20c3 11322 PL_xpvnv_arenaroot = NULL;
1d7c1841 11323 PL_xpvnv_root = NULL;
612f20c3 11324 PL_xpvcv_arenaroot = NULL;
1d7c1841 11325 PL_xpvcv_root = NULL;
612f20c3 11326 PL_xpvav_arenaroot = NULL;
1d7c1841 11327 PL_xpvav_root = NULL;
612f20c3 11328 PL_xpvhv_arenaroot = NULL;
1d7c1841 11329 PL_xpvhv_root = NULL;
612f20c3 11330 PL_xpvmg_arenaroot = NULL;
1d7c1841 11331 PL_xpvmg_root = NULL;
7552b40b
DM
11332 PL_xpvgv_arenaroot = NULL;
11333 PL_xpvgv_root = NULL;
612f20c3 11334 PL_xpvlv_arenaroot = NULL;
1d7c1841 11335 PL_xpvlv_root = NULL;
612f20c3 11336 PL_xpvbm_arenaroot = NULL;
1d7c1841 11337 PL_xpvbm_root = NULL;
612f20c3 11338 PL_he_arenaroot = NULL;
1d7c1841 11339 PL_he_root = NULL;
892b45be 11340#if defined(USE_ITHREADS)
32e691d0
NC
11341 PL_pte_arenaroot = NULL;
11342 PL_pte_root = NULL;
892b45be 11343#endif
1d7c1841
GS
11344 PL_nice_chunk = NULL;
11345 PL_nice_chunk_size = 0;
11346 PL_sv_count = 0;
11347 PL_sv_objcount = 0;
11348 PL_sv_root = Nullsv;
11349 PL_sv_arenaroot = Nullsv;
11350
11351 PL_debug = proto_perl->Idebug;
11352
8df990a8
NC
11353 PL_hash_seed = proto_perl->Ihash_seed;
11354 PL_rehash_seed = proto_perl->Irehash_seed;
11355
e5dd39fc 11356#ifdef USE_REENTRANT_API
68853529
SB
11357 /* XXX: things like -Dm will segfault here in perlio, but doing
11358 * PERL_SET_CONTEXT(proto_perl);
11359 * breaks too many other things
11360 */
59bd0823 11361 Perl_reentrant_init(aTHX);
e5dd39fc
AB
11362#endif
11363
1d7c1841
GS
11364 /* create SV map for pointer relocation */
11365 PL_ptr_table = ptr_table_new();
11366
11367 /* initialize these special pointers as early as possible */
11368 SvANY(&PL_sv_undef) = NULL;
11369 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
11370 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
11371 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
11372
1d7c1841 11373 SvANY(&PL_sv_no) = new_XPVNV();
1d7c1841 11374 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
0309f36e
NC
11375 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11376 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
f880fe2f 11377 SvPV_set(&PL_sv_no, SAVEPVN(PL_No, 0));
b162af07
SP
11378 SvCUR_set(&PL_sv_no, 0);
11379 SvLEN_set(&PL_sv_no, 1);
45977657 11380 SvIV_set(&PL_sv_no, 0);
9d6ce603 11381 SvNV_set(&PL_sv_no, 0);
1d7c1841
GS
11382 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
11383
1d7c1841 11384 SvANY(&PL_sv_yes) = new_XPVNV();
1d7c1841 11385 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
0309f36e
NC
11386 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11387 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
f880fe2f 11388 SvPV_set(&PL_sv_yes, SAVEPVN(PL_Yes, 1));
b162af07
SP
11389 SvCUR_set(&PL_sv_yes, 1);
11390 SvLEN_set(&PL_sv_yes, 2);
45977657 11391 SvIV_set(&PL_sv_yes, 1);
9d6ce603 11392 SvNV_set(&PL_sv_yes, 1);
1d7c1841
GS
11393 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
11394
05ec9bb3 11395 /* create (a non-shared!) shared string table */
1d7c1841
GS
11396 PL_strtab = newHV();
11397 HvSHAREKEYS_off(PL_strtab);
c4a9c09d 11398 hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
1d7c1841
GS
11399 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
11400
05ec9bb3
NIS
11401 PL_compiling = proto_perl->Icompiling;
11402
11403 /* These two PVs will be free'd special way so must set them same way op.c does */
11404 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
11405 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
11406
11407 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
11408 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
11409
1d7c1841
GS
11410 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
11411 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 11412 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 11413 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 11414 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
11415 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
11416
11417 /* pseudo environmental stuff */
11418 PL_origargc = proto_perl->Iorigargc;
e2975953 11419 PL_origargv = proto_perl->Iorigargv;
d2d73c3e 11420
d2d73c3e
AB
11421 param->stashes = newAV(); /* Setup array of objects to call clone on */
11422
a1ea730d 11423#ifdef PERLIO_LAYERS
3a1ee7e8
NIS
11424 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11425 PerlIO_clone(aTHX_ proto_perl, param);
a1ea730d 11426#endif
d2d73c3e
AB
11427
11428 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
11429 PL_incgv = gv_dup(proto_perl->Iincgv, param);
11430 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 11431 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
11432 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
11433 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
11434
11435 /* switches */
11436 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 11437 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
11438 PL_localpatches = proto_perl->Ilocalpatches;
11439 PL_splitstr = proto_perl->Isplitstr;
11440 PL_preprocess = proto_perl->Ipreprocess;
11441 PL_minus_n = proto_perl->Iminus_n;
11442 PL_minus_p = proto_perl->Iminus_p;
11443 PL_minus_l = proto_perl->Iminus_l;
11444 PL_minus_a = proto_perl->Iminus_a;
11445 PL_minus_F = proto_perl->Iminus_F;
11446 PL_doswitches = proto_perl->Idoswitches;
11447 PL_dowarn = proto_perl->Idowarn;
11448 PL_doextract = proto_perl->Idoextract;
11449 PL_sawampersand = proto_perl->Isawampersand;
11450 PL_unsafe = proto_perl->Iunsafe;
11451 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 11452 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
11453 PL_perldb = proto_perl->Iperldb;
11454 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
1cbb0781 11455 PL_exit_flags = proto_perl->Iexit_flags;
1d7c1841
GS
11456
11457 /* magical thingies */
11458 /* XXX time(&PL_basetime) when asked for? */
11459 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 11460 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
11461
11462 PL_maxsysfd = proto_perl->Imaxsysfd;
11463 PL_multiline = proto_perl->Imultiline;
11464 PL_statusvalue = proto_perl->Istatusvalue;
11465#ifdef VMS
11466 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
11467#endif
0a378802 11468 PL_encoding = sv_dup(proto_perl->Iencoding, param);
1d7c1841 11469
4a4c6fe3 11470 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
1f483ca1
JH
11471 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
11472 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
4a4c6fe3 11473
d2f185dc
AMS
11474 /* Clone the regex array */
11475 PL_regex_padav = newAV();
11476 {
a3b680e6 11477 const I32 len = av_len((AV*)proto_perl->Iregex_padav);
53c1dcc0 11478 SV** const regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
b464bac0 11479 IV i;
0f95fc41
AB
11480 av_push(PL_regex_padav,
11481 sv_dup_inc(regexen[0],param));
11482 for(i = 1; i <= len; i++) {
11483 if(SvREPADTMP(regexen[i])) {
11484 av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
8cf8f3d1 11485 } else {
0f95fc41
AB
11486 av_push(PL_regex_padav,
11487 SvREFCNT_inc(
8cf8f3d1 11488 newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
cbfa9890 11489 SvIVX(regexen[i])), param)))
0f95fc41
AB
11490 ));
11491 }
d2f185dc
AMS
11492 }
11493 }
11494 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 11495
1d7c1841 11496 /* shortcuts to various I/O objects */
d2d73c3e
AB
11497 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
11498 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
11499 PL_defgv = gv_dup(proto_perl->Idefgv, param);
11500 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
11501 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
11502 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
11503
11504 /* shortcuts to regexp stuff */
d2d73c3e 11505 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
11506
11507 /* shortcuts to misc objects */
d2d73c3e 11508 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
11509
11510 /* shortcuts to debugging objects */
d2d73c3e
AB
11511 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
11512 PL_DBline = gv_dup(proto_perl->IDBline, param);
11513 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
11514 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
11515 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
11516 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
06492da6 11517 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
d2d73c3e
AB
11518 PL_lineary = av_dup(proto_perl->Ilineary, param);
11519 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
11520
11521 /* symbol tables */
d2d73c3e
AB
11522 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
11523 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
d2d73c3e
AB
11524 PL_debstash = hv_dup(proto_perl->Idebstash, param);
11525 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
11526 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
11527
11528 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
ee1c5a4e 11529 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
ece599bd 11530 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
d2d73c3e
AB
11531 PL_endav = av_dup_inc(proto_perl->Iendav, param);
11532 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
11533 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
11534
11535 PL_sub_generation = proto_perl->Isub_generation;
11536
11537 /* funky return mechanisms */
11538 PL_forkprocess = proto_perl->Iforkprocess;
11539
11540 /* subprocess state */
d2d73c3e 11541 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
11542
11543 /* internal state */
11544 PL_tainting = proto_perl->Itainting;
7135f00b 11545 PL_taint_warn = proto_perl->Itaint_warn;
1d7c1841
GS
11546 PL_maxo = proto_perl->Imaxo;
11547 if (proto_perl->Iop_mask)
11548 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11549 else
11550 PL_op_mask = Nullch;
06492da6 11551 /* PL_asserting = proto_perl->Iasserting; */
1d7c1841
GS
11552
11553 /* current interpreter roots */
d2d73c3e 11554 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
11555 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
11556 PL_main_start = proto_perl->Imain_start;
e977893f 11557 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
11558 PL_eval_start = proto_perl->Ieval_start;
11559
11560 /* runtime control stuff */
11561 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
11562 PL_copline = proto_perl->Icopline;
11563
11564 PL_filemode = proto_perl->Ifilemode;
11565 PL_lastfd = proto_perl->Ilastfd;
11566 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
11567 PL_Argv = NULL;
11568 PL_Cmd = Nullch;
11569 PL_gensym = proto_perl->Igensym;
11570 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 11571 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
11572 PL_laststatval = proto_perl->Ilaststatval;
11573 PL_laststype = proto_perl->Ilaststype;
11574 PL_mess_sv = Nullsv;
11575
d2d73c3e 11576 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
11577
11578 /* interpreter atexit processing */
11579 PL_exitlistlen = proto_perl->Iexitlistlen;
11580 if (PL_exitlistlen) {
11581 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11582 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11583 }
11584 else
11585 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 11586 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
19e8ce8e
AB
11587 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
11588 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1d7c1841
GS
11589
11590 PL_profiledata = NULL;
a8fc9800 11591 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
1d7c1841 11592 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 11593 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 11594
d2d73c3e 11595 PL_compcv = cv_dup(proto_perl->Icompcv, param);
dd2155a4
DM
11596
11597 PAD_CLONE_VARS(proto_perl, param);
1d7c1841
GS
11598
11599#ifdef HAVE_INTERP_INTERN
11600 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11601#endif
11602
11603 /* more statics moved here */
11604 PL_generation = proto_perl->Igeneration;
d2d73c3e 11605 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
11606
11607 PL_in_clean_objs = proto_perl->Iin_clean_objs;
11608 PL_in_clean_all = proto_perl->Iin_clean_all;
11609
11610 PL_uid = proto_perl->Iuid;
11611 PL_euid = proto_perl->Ieuid;
11612 PL_gid = proto_perl->Igid;
11613 PL_egid = proto_perl->Iegid;
11614 PL_nomemok = proto_perl->Inomemok;
11615 PL_an = proto_perl->Ian;
1d7c1841
GS
11616 PL_evalseq = proto_perl->Ievalseq;
11617 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
11618 PL_origalen = proto_perl->Iorigalen;
11619 PL_pidstatus = newHV(); /* XXX flag for cloning? */
11620 PL_osname = SAVEPV(proto_perl->Iosname);
5c728af0 11621 PL_sh_path_compat = proto_perl->Ish_path_compat; /* XXX never deallocated */
1d7c1841
GS
11622 PL_sighandlerp = proto_perl->Isighandlerp;
11623
11624
11625 PL_runops = proto_perl->Irunops;
11626
11627 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
11628
11629#ifdef CSH
11630 PL_cshlen = proto_perl->Icshlen;
74f1b2b8 11631 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
1d7c1841
GS
11632#endif
11633
11634 PL_lex_state = proto_perl->Ilex_state;
11635 PL_lex_defer = proto_perl->Ilex_defer;
11636 PL_lex_expect = proto_perl->Ilex_expect;
11637 PL_lex_formbrack = proto_perl->Ilex_formbrack;
11638 PL_lex_dojoin = proto_perl->Ilex_dojoin;
11639 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
11640 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
11641 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
11642 PL_lex_op = proto_perl->Ilex_op;
11643 PL_lex_inpat = proto_perl->Ilex_inpat;
11644 PL_lex_inwhat = proto_perl->Ilex_inwhat;
11645 PL_lex_brackets = proto_perl->Ilex_brackets;
11646 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
11647 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
11648 PL_lex_casemods = proto_perl->Ilex_casemods;
11649 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
11650 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
11651
11652 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
11653 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
11654 PL_nexttoke = proto_perl->Inexttoke;
11655
1d773130
TB
11656 /* XXX This is probably masking the deeper issue of why
11657 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
11658 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
11659 * (A little debugging with a watchpoint on it may help.)
11660 */
389edf32
TB
11661 if (SvANY(proto_perl->Ilinestr)) {
11662 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
3f7c398e 11663 i = proto_perl->Ibufptr - SvPVX_const(proto_perl->Ilinestr);
389edf32 11664 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
3f7c398e 11665 i = proto_perl->Ioldbufptr - SvPVX_const(proto_perl->Ilinestr);
389edf32 11666 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
3f7c398e 11667 i = proto_perl->Ioldoldbufptr - SvPVX_const(proto_perl->Ilinestr);
389edf32 11668 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
3f7c398e 11669 i = proto_perl->Ilinestart - SvPVX_const(proto_perl->Ilinestr);
389edf32
TB
11670 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11671 }
11672 else {
11673 PL_linestr = NEWSV(65,79);
11674 sv_upgrade(PL_linestr,SVt_PVIV);
11675 sv_setpvn(PL_linestr,"",0);
11676 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
11677 }
1d7c1841 11678 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1d7c1841
GS
11679 PL_pending_ident = proto_perl->Ipending_ident;
11680 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
11681
11682 PL_expect = proto_perl->Iexpect;
11683
11684 PL_multi_start = proto_perl->Imulti_start;
11685 PL_multi_end = proto_perl->Imulti_end;
11686 PL_multi_open = proto_perl->Imulti_open;
11687 PL_multi_close = proto_perl->Imulti_close;
11688
11689 PL_error_count = proto_perl->Ierror_count;
11690 PL_subline = proto_perl->Isubline;
d2d73c3e 11691 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841 11692
1d773130 11693 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
389edf32 11694 if (SvANY(proto_perl->Ilinestr)) {
3f7c398e 11695 i = proto_perl->Ilast_uni - SvPVX_const(proto_perl->Ilinestr);
389edf32 11696 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
3f7c398e 11697 i = proto_perl->Ilast_lop - SvPVX_const(proto_perl->Ilinestr);
389edf32
TB
11698 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11699 PL_last_lop_op = proto_perl->Ilast_lop_op;
11700 }
11701 else {
11702 PL_last_uni = SvPVX(PL_linestr);
11703 PL_last_lop = SvPVX(PL_linestr);
11704 PL_last_lop_op = 0;
11705 }
1d7c1841 11706 PL_in_my = proto_perl->Iin_my;
d2d73c3e 11707 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
11708#ifdef FCRYPT
11709 PL_cryptseen = proto_perl->Icryptseen;
11710#endif
11711
11712 PL_hints = proto_perl->Ihints;
11713
11714 PL_amagic_generation = proto_perl->Iamagic_generation;
11715
11716#ifdef USE_LOCALE_COLLATE
11717 PL_collation_ix = proto_perl->Icollation_ix;
11718 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
11719 PL_collation_standard = proto_perl->Icollation_standard;
11720 PL_collxfrm_base = proto_perl->Icollxfrm_base;
11721 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
11722#endif /* USE_LOCALE_COLLATE */
11723
11724#ifdef USE_LOCALE_NUMERIC
11725 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
11726 PL_numeric_standard = proto_perl->Inumeric_standard;
11727 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 11728 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
11729#endif /* !USE_LOCALE_NUMERIC */
11730
11731 /* utf8 character classes */
d2d73c3e
AB
11732 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
11733 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
11734 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
11735 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
11736 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
11737 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
11738 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
11739 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
11740 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
11741 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
11742 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
11743 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
11744 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
11745 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
11746 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
11747 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
11748 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
b4e400f9 11749 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
82686b01
JH
11750 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
11751 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 11752
6c3182a5 11753 /* Did the locale setup indicate UTF-8? */
9769094f 11754 PL_utf8locale = proto_perl->Iutf8locale;
6c3182a5
JH
11755 /* Unicode features (see perlrun/-C) */
11756 PL_unicode = proto_perl->Iunicode;
11757
11758 /* Pre-5.8 signals control */
11759 PL_signals = proto_perl->Isignals;
11760
11761 /* times() ticks per second */
11762 PL_clocktick = proto_perl->Iclocktick;
11763
11764 /* Recursion stopper for PerlIO_find_layer */
11765 PL_in_load_module = proto_perl->Iin_load_module;
11766
11767 /* sort() routine */
11768 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
11769
57c6e6d2
JH
11770 /* Not really needed/useful since the reenrant_retint is "volatile",
11771 * but do it for consistency's sake. */
11772 PL_reentrant_retint = proto_perl->Ireentrant_retint;
11773
15a5279a
JH
11774 /* Hooks to shared SVs and locks. */
11775 PL_sharehook = proto_perl->Isharehook;
11776 PL_lockhook = proto_perl->Ilockhook;
11777 PL_unlockhook = proto_perl->Iunlockhook;
11778 PL_threadhook = proto_perl->Ithreadhook;
11779
bce260cd
JH
11780 PL_runops_std = proto_perl->Irunops_std;
11781 PL_runops_dbg = proto_perl->Irunops_dbg;
11782
11783#ifdef THREADS_HAVE_PIDS
11784 PL_ppid = proto_perl->Ippid;
11785#endif
11786
1d7c1841
GS
11787 /* swatch cache */
11788 PL_last_swash_hv = Nullhv; /* reinits on demand */
11789 PL_last_swash_klen = 0;
11790 PL_last_swash_key[0]= '\0';
11791 PL_last_swash_tmps = (U8*)NULL;
11792 PL_last_swash_slen = 0;
11793
1d7c1841
GS
11794 PL_glob_index = proto_perl->Iglob_index;
11795 PL_srand_called = proto_perl->Isrand_called;
11796 PL_uudmap['M'] = 0; /* reinits on demand */
11797 PL_bitcount = Nullch; /* reinits on demand */
11798
66fe0623
NIS
11799 if (proto_perl->Ipsig_pend) {
11800 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 11801 }
66fe0623
NIS
11802 else {
11803 PL_psig_pend = (int*)NULL;
11804 }
11805
1d7c1841 11806 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
11807 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
11808 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 11809 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
11810 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
11811 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
11812 }
11813 }
11814 else {
11815 PL_psig_ptr = (SV**)NULL;
11816 PL_psig_name = (SV**)NULL;
11817 }
11818
11819 /* thrdvar.h stuff */
11820
a0739874 11821 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
11822 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
11823 PL_tmps_ix = proto_perl->Ttmps_ix;
11824 PL_tmps_max = proto_perl->Ttmps_max;
11825 PL_tmps_floor = proto_perl->Ttmps_floor;
11826 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
11827 i = 0;
11828 while (i <= PL_tmps_ix) {
d2d73c3e 11829 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
11830 ++i;
11831 }
11832
11833 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
11834 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
11835 Newz(54, PL_markstack, i, I32);
11836 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
11837 - proto_perl->Tmarkstack);
11838 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
11839 - proto_perl->Tmarkstack);
11840 Copy(proto_perl->Tmarkstack, PL_markstack,
11841 PL_markstack_ptr - PL_markstack + 1, I32);
11842
11843 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
11844 * NOTE: unlike the others! */
11845 PL_scopestack_ix = proto_perl->Tscopestack_ix;
11846 PL_scopestack_max = proto_perl->Tscopestack_max;
11847 Newz(54, PL_scopestack, PL_scopestack_max, I32);
11848 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
11849
1d7c1841 11850 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 11851 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
11852
11853 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
11854 PL_curstack = av_dup(proto_perl->Tcurstack, param);
11855 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
11856
11857 /* next PUSHs() etc. set *(PL_stack_sp+1) */
11858 PL_stack_base = AvARRAY(PL_curstack);
11859 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
11860 - proto_perl->Tstack_base);
11861 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
11862
11863 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
11864 * NOTE: unlike the others! */
11865 PL_savestack_ix = proto_perl->Tsavestack_ix;
11866 PL_savestack_max = proto_perl->Tsavestack_max;
11867 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 11868 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
11869 }
11870 else {
11871 init_stacks();
985e7056 11872 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
11873 }
11874
11875 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
11876 PL_top_env = &PL_start_env;
11877
11878 PL_op = proto_perl->Top;
11879
11880 PL_Sv = Nullsv;
11881 PL_Xpv = (XPV*)NULL;
11882 PL_na = proto_perl->Tna;
11883
11884 PL_statbuf = proto_perl->Tstatbuf;
11885 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
11886 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
11887 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
11888#ifdef HAS_TIMES
11889 PL_timesbuf = proto_perl->Ttimesbuf;
11890#endif
11891
11892 PL_tainted = proto_perl->Ttainted;
11893 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
11894 PL_rs = sv_dup_inc(proto_perl->Trs, param);
11895 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
11896 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
11897 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 11898 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
11899 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
11900 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
11901 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
11902
11903 PL_restartop = proto_perl->Trestartop;
11904 PL_in_eval = proto_perl->Tin_eval;
11905 PL_delaymagic = proto_perl->Tdelaymagic;
11906 PL_dirty = proto_perl->Tdirty;
11907 PL_localizing = proto_perl->Tlocalizing;
11908
d2d73c3e 11909 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
dd28f7bb 11910 PL_hv_fetch_ent_mh = Nullhe;
1d7c1841
GS
11911 PL_modcount = proto_perl->Tmodcount;
11912 PL_lastgotoprobe = Nullop;
11913 PL_dumpindent = proto_perl->Tdumpindent;
11914
11915 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
11916 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
11917 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
11918 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
11919 PL_sortcxix = proto_perl->Tsortcxix;
11920 PL_efloatbuf = Nullch; /* reinits on demand */
11921 PL_efloatsize = 0; /* reinits on demand */
11922
11923 /* regex stuff */
11924
11925 PL_screamfirst = NULL;
11926 PL_screamnext = NULL;
11927 PL_maxscream = -1; /* reinits on demand */
11928 PL_lastscream = Nullsv;
11929
11930 PL_watchaddr = NULL;
11931 PL_watchok = Nullch;
11932
11933 PL_regdummy = proto_perl->Tregdummy;
1d7c1841
GS
11934 PL_regprecomp = Nullch;
11935 PL_regnpar = 0;
11936 PL_regsize = 0;
1d7c1841
GS
11937 PL_colorset = 0; /* reinits PL_colors[] */
11938 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841
GS
11939 PL_reginput = Nullch;
11940 PL_regbol = Nullch;
11941 PL_regeol = Nullch;
11942 PL_regstartp = (I32*)NULL;
11943 PL_regendp = (I32*)NULL;
11944 PL_reglastparen = (U32*)NULL;
2d862feb 11945 PL_reglastcloseparen = (U32*)NULL;
1d7c1841 11946 PL_regtill = Nullch;
1d7c1841
GS
11947 PL_reg_start_tmp = (char**)NULL;
11948 PL_reg_start_tmpl = 0;
11949 PL_regdata = (struct reg_data*)NULL;
11950 PL_bostr = Nullch;
11951 PL_reg_flags = 0;
11952 PL_reg_eval_set = 0;
11953 PL_regnarrate = 0;
11954 PL_regprogram = (regnode*)NULL;
11955 PL_regindent = 0;
11956 PL_regcc = (CURCUR*)NULL;
11957 PL_reg_call_cc = (struct re_cc_state*)NULL;
11958 PL_reg_re = (regexp*)NULL;
11959 PL_reg_ganch = Nullch;
11960 PL_reg_sv = Nullsv;
53c4c00c 11961 PL_reg_match_utf8 = FALSE;
1d7c1841
GS
11962 PL_reg_magic = (MAGIC*)NULL;
11963 PL_reg_oldpos = 0;
11964 PL_reg_oldcurpm = (PMOP*)NULL;
11965 PL_reg_curpm = (PMOP*)NULL;
11966 PL_reg_oldsaved = Nullch;
11967 PL_reg_oldsavedlen = 0;
f8c7b90f 11968#ifdef PERL_OLD_COPY_ON_WRITE
504cff3b 11969 PL_nrs = Nullsv;
ed252734 11970#endif
1d7c1841
GS
11971 PL_reg_maxiter = 0;
11972 PL_reg_leftiter = 0;
11973 PL_reg_poscache = Nullch;
11974 PL_reg_poscache_size= 0;
11975
11976 /* RE engine - function pointers */
11977 PL_regcompp = proto_perl->Tregcompp;
11978 PL_regexecp = proto_perl->Tregexecp;
11979 PL_regint_start = proto_perl->Tregint_start;
11980 PL_regint_string = proto_perl->Tregint_string;
11981 PL_regfree = proto_perl->Tregfree;
11982
11983 PL_reginterp_cnt = 0;
11984 PL_reg_starttry = 0;
11985
a2efc822
SC
11986 /* Pluggable optimizer */
11987 PL_peepp = proto_perl->Tpeepp;
11988
081fc587
AB
11989 PL_stashcache = newHV();
11990
a0739874
DM
11991 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
11992 ptr_table_free(PL_ptr_table);
11993 PL_ptr_table = NULL;
11994 }
8cf8f3d1 11995
f284b03f
AMS
11996 /* Call the ->CLONE method, if it exists, for each of the stashes
11997 identified by sv_dup() above.
11998 */
d2d73c3e 11999 while(av_len(param->stashes) != -1) {
53c1dcc0
AL
12000 HV* const stash = (HV*) av_shift(param->stashes);
12001 GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
f284b03f
AMS
12002 if (cloner && GvCV(cloner)) {
12003 dSP;
12004 ENTER;
12005 SAVETMPS;
12006 PUSHMARK(SP);
84bda14a 12007 XPUSHs(sv_2mortal(newSVhek(HvNAME_HEK(stash))));
f284b03f
AMS
12008 PUTBACK;
12009 call_sv((SV*)GvCV(cloner), G_DISCARD);
12010 FREETMPS;
12011 LEAVE;
12012 }
4a09accc 12013 }
a0739874 12014
dc507217 12015 SvREFCNT_dec(param->stashes);
dc507217 12016
6d26897e
DM
12017 /* orphaned? eg threads->new inside BEGIN or use */
12018 if (PL_compcv && ! SvREFCNT(PL_compcv)) {
a3b680e6 12019 (void)SvREFCNT_inc(PL_compcv);
6d26897e
DM
12020 SAVEFREESV(PL_compcv);
12021 }
12022
1d7c1841 12023 return my_perl;
1d7c1841
GS
12024}
12025
1d7c1841 12026#endif /* USE_ITHREADS */
a0ae6670 12027
9f4817db 12028/*
ccfc67b7
JH
12029=head1 Unicode Support
12030
9f4817db
JH
12031=for apidoc sv_recode_to_utf8
12032
5d170f3a
JH
12033The encoding is assumed to be an Encode object, on entry the PV
12034of the sv is assumed to be octets in that encoding, and the sv
12035will be converted into Unicode (and UTF-8).
9f4817db 12036
5d170f3a
JH
12037If the sv already is UTF-8 (or if it is not POK), or if the encoding
12038is not a reference, nothing is done to the sv. If the encoding is not
1768d7eb
JH
12039an C<Encode::XS> Encoding object, bad things will happen.
12040(See F<lib/encoding.pm> and L<Encode>).
9f4817db 12041
5d170f3a 12042The PV of the sv is returned.
9f4817db 12043
5d170f3a
JH
12044=cut */
12045
12046char *
12047Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
12048{
27da23d5 12049 dVAR;
220e2d4e 12050 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
d0063567
DK
12051 SV *uni;
12052 STRLEN len;
93524f2b 12053 const char *s;
d0063567
DK
12054 dSP;
12055 ENTER;
12056 SAVETMPS;
220e2d4e 12057 save_re_context();
d0063567
DK
12058 PUSHMARK(sp);
12059 EXTEND(SP, 3);
12060 XPUSHs(encoding);
12061 XPUSHs(sv);
7a5fa8a2 12062/*
f9893866
NIS
12063 NI-S 2002/07/09
12064 Passing sv_yes is wrong - it needs to be or'ed set of constants
7a5fa8a2 12065 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
f9893866
NIS
12066 remove converted chars from source.
12067
12068 Both will default the value - let them.
7a5fa8a2 12069
d0063567 12070 XPUSHs(&PL_sv_yes);
f9893866 12071*/
d0063567
DK
12072 PUTBACK;
12073 call_method("decode", G_SCALAR);
12074 SPAGAIN;
12075 uni = POPs;
12076 PUTBACK;
93524f2b 12077 s = SvPV_const(uni, len);
3f7c398e 12078 if (s != SvPVX_const(sv)) {
d0063567 12079 SvGROW(sv, len + 1);
93524f2b 12080 Move(s, SvPVX(sv), len + 1, char);
d0063567 12081 SvCUR_set(sv, len);
d0063567
DK
12082 }
12083 FREETMPS;
12084 LEAVE;
d0063567 12085 SvUTF8_on(sv);
95899a2a 12086 return SvPVX(sv);
f9893866 12087 }
95899a2a 12088 return SvPOKp(sv) ? SvPVX(sv) : NULL;
9f4817db
JH
12089}
12090
220e2d4e
IH
12091/*
12092=for apidoc sv_cat_decode
12093
12094The encoding is assumed to be an Encode object, the PV of the ssv is
12095assumed to be octets in that encoding and decoding the input starts
12096from the position which (PV + *offset) pointed to. The dsv will be
12097concatenated the decoded UTF-8 string from ssv. Decoding will terminate
12098when the string tstr appears in decoding output or the input ends on
12099the PV of the ssv. The value which the offset points will be modified
12100to the last input position on the ssv.
68795e93 12101
220e2d4e
IH
12102Returns TRUE if the terminator was found, else returns FALSE.
12103
12104=cut */
12105
12106bool
12107Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
12108 SV *ssv, int *offset, char *tstr, int tlen)
12109{
27da23d5 12110 dVAR;
a73e8557 12111 bool ret = FALSE;
220e2d4e 12112 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
220e2d4e
IH
12113 SV *offsv;
12114 dSP;
12115 ENTER;
12116 SAVETMPS;
12117 save_re_context();
12118 PUSHMARK(sp);
12119 EXTEND(SP, 6);
12120 XPUSHs(encoding);
12121 XPUSHs(dsv);
12122 XPUSHs(ssv);
12123 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
12124 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
12125 PUTBACK;
12126 call_method("cat_decode", G_SCALAR);
12127 SPAGAIN;
12128 ret = SvTRUE(TOPs);
12129 *offset = SvIV(offsv);
12130 PUTBACK;
12131 FREETMPS;
12132 LEAVE;
220e2d4e 12133 }
a73e8557
JH
12134 else
12135 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
12136 return ret;
220e2d4e 12137}
f9893866 12138
241d1a3b
NC
12139/*
12140 * Local variables:
12141 * c-indentation-style: bsd
12142 * c-basic-offset: 4
12143 * indent-tabs-mode: t
12144 * End:
12145 *
37442d52
RGS
12146 * ex: set ts=8 sts=4 sw=4 noet:
12147 */