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