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