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