This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
clear PL_exitlist in perl_destruct
[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
LW
1587 }
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;
463ee0b2 3686 case SVt_PV:
fc36a67e 3687 case SVt_PVFM:
8990e307 3688 if (dtype < SVt_PV)
463ee0b2 3689 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
3690 break;
3691 case SVt_PVIV:
8990e307 3692 if (dtype < SVt_PVIV)
463ee0b2 3693 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
3694 break;
3695 case SVt_PVNV:
8990e307 3696 if (dtype < SVt_PVNV)
463ee0b2 3697 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 3698 break;
4633a7c4
LW
3699 case SVt_PVAV:
3700 case SVt_PVHV:
3701 case SVt_PVCV:
4633a7c4 3702 case SVt_PVIO:
533c011a 3703 if (PL_op)
cea2e8a9 3704 Perl_croak(aTHX_ "Bizarre copy of %s in %s", sv_reftype(sstr, 0),
53e06cf0 3705 OP_NAME(PL_op));
4633a7c4 3706 else
cea2e8a9 3707 Perl_croak(aTHX_ "Bizarre copy of %s", sv_reftype(sstr, 0));
4633a7c4
LW
3708 break;
3709
79072805 3710 case SVt_PVGV:
8990e307 3711 if (dtype <= SVt_PVGV) {
c07a80fd 3712 glob_assign:
a5f75d66 3713 if (dtype != SVt_PVGV) {
a0d0e21e
LW
3714 char *name = GvNAME(sstr);
3715 STRLEN len = GvNAMELEN(sstr);
463ee0b2 3716 sv_upgrade(dstr, SVt_PVGV);
14befaf4 3717 sv_magic(dstr, dstr, PERL_MAGIC_glob, Nullch, 0);
85aff577 3718 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
3719 GvNAME(dstr) = savepvn(name, len);
3720 GvNAMELEN(dstr) = len;
3721 SvFAKE_on(dstr); /* can coerce to non-glob */
3722 }
7bac28a0 3723 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
3724 else if (PL_curstackinfo->si_type == PERLSI_SORT
3725 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
cea2e8a9 3726 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
7bac28a0 3727 GvNAME(dstr));
5bd07a3d 3728
7fb37951
AMS
3729#ifdef GV_UNIQUE_CHECK
3730 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
3731 Perl_croak(aTHX_ PL_no_modify);
3732 }
3733#endif
3734
a0d0e21e 3735 (void)SvOK_off(dstr);
a5f75d66 3736 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 3737 gp_free((GV*)dstr);
79072805 3738 GvGP(dstr) = gp_ref(GvGP(sstr));
27c9684d
AP
3739 if (SvTAINTED(sstr))
3740 SvTAINT(dstr);
1d7c1841
GS
3741 if (GvIMPORTED(dstr) != GVf_IMPORTED
3742 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3743 {
a5f75d66 3744 GvIMPORTED_on(dstr);
1d7c1841 3745 }
a5f75d66 3746 GvMULTI_on(dstr);
79072805
LW
3747 return;
3748 }
3749 /* FALL THROUGH */
3750
3751 default:
8d6d96c1 3752 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 3753 mg_get(sstr);
eb160463 3754 if ((int)SvTYPE(sstr) != stype) {
973f89ab
CS
3755 stype = SvTYPE(sstr);
3756 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
3757 goto glob_assign;
3758 }
3759 }
ded42b9f 3760 if (stype == SVt_PVLV)
6fc92669 3761 (void)SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 3762 else
eb160463 3763 (void)SvUPGRADE(dstr, (U32)stype);
79072805
LW
3764 }
3765
8990e307
LW
3766 sflags = SvFLAGS(sstr);
3767
3768 if (sflags & SVf_ROK) {
3769 if (dtype >= SVt_PV) {
3770 if (dtype == SVt_PVGV) {
3771 SV *sref = SvREFCNT_inc(SvRV(sstr));
3772 SV *dref = 0;
a5f75d66 3773 int intro = GvINTRO(dstr);
a0d0e21e 3774
7fb37951
AMS
3775#ifdef GV_UNIQUE_CHECK
3776 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
3777 Perl_croak(aTHX_ PL_no_modify);
3778 }
3779#endif
3780
a0d0e21e 3781 if (intro) {
a5f75d66 3782 GvINTRO_off(dstr); /* one-shot flag */
1d7c1841 3783 GvLINE(dstr) = CopLINE(PL_curcop);
1edc1566 3784 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 3785 }
a5f75d66 3786 GvMULTI_on(dstr);
8990e307
LW
3787 switch (SvTYPE(sref)) {
3788 case SVt_PVAV:
a0d0e21e 3789 if (intro)
890ed176 3790 SAVEGENERICSV(GvAV(dstr));
a0d0e21e
LW
3791 else
3792 dref = (SV*)GvAV(dstr);
8990e307 3793 GvAV(dstr) = (AV*)sref;
39bac7f7 3794 if (!GvIMPORTED_AV(dstr)
1d7c1841
GS
3795 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3796 {
a5f75d66 3797 GvIMPORTED_AV_on(dstr);
1d7c1841 3798 }
8990e307
LW
3799 break;
3800 case SVt_PVHV:
a0d0e21e 3801 if (intro)
890ed176 3802 SAVEGENERICSV(GvHV(dstr));
a0d0e21e
LW
3803 else
3804 dref = (SV*)GvHV(dstr);
8990e307 3805 GvHV(dstr) = (HV*)sref;
39bac7f7 3806 if (!GvIMPORTED_HV(dstr)
1d7c1841
GS
3807 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3808 {
a5f75d66 3809 GvIMPORTED_HV_on(dstr);
1d7c1841 3810 }
8990e307
LW
3811 break;
3812 case SVt_PVCV:
8ebc5c01 3813 if (intro) {
3814 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
3815 SvREFCNT_dec(GvCV(dstr));
3816 GvCV(dstr) = Nullcv;
68dc0745 3817 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 3818 PL_sub_generation++;
8ebc5c01 3819 }
890ed176 3820 SAVEGENERICSV(GvCV(dstr));
8ebc5c01 3821 }
68dc0745 3822 else
3823 dref = (SV*)GvCV(dstr);
3824 if (GvCV(dstr) != (CV*)sref) {
748a9306 3825 CV* cv = GvCV(dstr);
4633a7c4 3826 if (cv) {
68dc0745 3827 if (!GvCVGEN((GV*)dstr) &&
3828 (CvROOT(cv) || CvXSUB(cv)))
3829 {
7bac28a0 3830 /* ahem, death to those who redefine
3831 * active sort subs */
3280af22
NIS
3832 if (PL_curstackinfo->si_type == PERLSI_SORT &&
3833 PL_sortcop == CvSTART(cv))
1c846c1f 3834 Perl_croak(aTHX_
7bac28a0 3835 "Can't redefine active sort subroutine %s",
3836 GvENAME((GV*)dstr));
beab0874
JT
3837 /* Redefining a sub - warning is mandatory if
3838 it was a const and its value changed. */
3839 if (ckWARN(WARN_REDEFINE)
3840 || (CvCONST(cv)
3841 && (!CvCONST((CV*)sref)
3842 || sv_cmp(cv_const_sv(cv),
3843 cv_const_sv((CV*)sref)))))
3844 {
9014280d 3845 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
beab0874 3846 CvCONST(cv)
910764e6
RGS
3847 ? "Constant subroutine %s::%s redefined"
3848 : "Subroutine %s::%s redefined",
3849 HvNAME(GvSTASH((GV*)dstr)),
beab0874
JT
3850 GvENAME((GV*)dstr));
3851 }
9607fc9c 3852 }
fb24441d
RGS
3853 if (!intro)
3854 cv_ckproto(cv, (GV*)dstr,
3855 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 3856 }
a5f75d66 3857 GvCV(dstr) = (CV*)sref;
7a4c00b4 3858 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 3859 GvASSUMECV_on(dstr);
3280af22 3860 PL_sub_generation++;
a5f75d66 3861 }
39bac7f7 3862 if (!GvIMPORTED_CV(dstr)
1d7c1841
GS
3863 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3864 {
a5f75d66 3865 GvIMPORTED_CV_on(dstr);
1d7c1841 3866 }
8990e307 3867 break;
91bba347
LW
3868 case SVt_PVIO:
3869 if (intro)
890ed176 3870 SAVEGENERICSV(GvIOp(dstr));
91bba347
LW
3871 else
3872 dref = (SV*)GvIOp(dstr);
3873 GvIOp(dstr) = (IO*)sref;
3874 break;
f4d13ee9
JH
3875 case SVt_PVFM:
3876 if (intro)
890ed176 3877 SAVEGENERICSV(GvFORM(dstr));
f4d13ee9
JH
3878 else
3879 dref = (SV*)GvFORM(dstr);
3880 GvFORM(dstr) = (CV*)sref;
3881 break;
8990e307 3882 default:
a0d0e21e 3883 if (intro)
890ed176 3884 SAVEGENERICSV(GvSV(dstr));
a0d0e21e
LW
3885 else
3886 dref = (SV*)GvSV(dstr);
8990e307 3887 GvSV(dstr) = sref;
39bac7f7 3888 if (!GvIMPORTED_SV(dstr)
1d7c1841
GS
3889 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3890 {
a5f75d66 3891 GvIMPORTED_SV_on(dstr);
1d7c1841 3892 }
8990e307
LW
3893 break;
3894 }
3895 if (dref)
3896 SvREFCNT_dec(dref);
27c9684d
AP
3897 if (SvTAINTED(sstr))
3898 SvTAINT(dstr);
8990e307
LW
3899 return;
3900 }
a0d0e21e 3901 if (SvPVX(dstr)) {
760ac839 3902 (void)SvOOK_off(dstr); /* backoff */
50483b2c
JD
3903 if (SvLEN(dstr))
3904 Safefree(SvPVX(dstr));
a0d0e21e
LW
3905 SvLEN(dstr)=SvCUR(dstr)=0;
3906 }
8990e307 3907 }
a0d0e21e 3908 (void)SvOK_off(dstr);
8990e307 3909 SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
ed6116ce 3910 SvROK_on(dstr);
8990e307 3911 if (sflags & SVp_NOK) {
3332b3c1
JH
3912 SvNOKp_on(dstr);
3913 /* Only set the public OK flag if the source has public OK. */
3914 if (sflags & SVf_NOK)
3915 SvFLAGS(dstr) |= SVf_NOK;
ed6116ce
LW
3916 SvNVX(dstr) = SvNVX(sstr);
3917 }
8990e307 3918 if (sflags & SVp_IOK) {
3332b3c1
JH
3919 (void)SvIOKp_on(dstr);
3920 if (sflags & SVf_IOK)
3921 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 3922 if (sflags & SVf_IVisUV)
25da4f38 3923 SvIsUV_on(dstr);
3332b3c1 3924 SvIVX(dstr) = SvIVX(sstr);
ed6116ce 3925 }
a0d0e21e
LW
3926 if (SvAMAGIC(sstr)) {
3927 SvAMAGIC_on(dstr);
3928 }
ed6116ce 3929 }
8990e307 3930 else if (sflags & SVp_POK) {
765f542d 3931 bool isSwipe = 0;
79072805
LW
3932
3933 /*
3934 * Check to see if we can just swipe the string. If so, it's a
3935 * possible small lose on short strings, but a big win on long ones.
463ee0b2
LW
3936 * It might even be a win on short strings if SvPVX(dstr)
3937 * has to be allocated and SvPVX(sstr) has to be freed.
79072805
LW
3938 */
3939
765f542d
NC
3940 if (
3941#ifdef PERL_COPY_ON_WRITE
3942 (sflags & (SVf_FAKE | SVf_READONLY)) != (SVf_FAKE | SVf_READONLY)
3943 &&
3944#endif
3945 !(isSwipe =
3946 (sflags & SVs_TEMP) && /* slated for free anyway? */
3947 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
3948 SvREFCNT(sstr) == 1 && /* and no other references to it? */
3949 SvLEN(sstr) && /* and really is a string */
645c22ef 3950 /* and won't be needed again, potentially */
765f542d
NC
3951 !(PL_op && PL_op->op_type == OP_AASSIGN))
3952#ifdef PERL_COPY_ON_WRITE
3953 && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
3954 && SvTYPE(sstr) >= SVt_PVIV)
3955#endif
3956 ) {
3957 /* Failed the swipe test, and it's not a shared hash key either.
3958 Have to copy the string. */
3959 STRLEN len = SvCUR(sstr);
3960 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3961 Move(SvPVX(sstr),SvPVX(dstr),len,char);
3962 SvCUR_set(dstr, len);
3963 *SvEND(dstr) = '\0';
3964 (void)SvPOK_only(dstr);
3965 } else {
3966 /* If PERL_COPY_ON_WRITE is not defined, then isSwipe will always
3967 be true in here. */
3968#ifdef PERL_COPY_ON_WRITE
3969 /* Either it's a shared hash key, or it's suitable for
3970 copy-on-write or we can swipe the string. */
46187eeb 3971 if (DEBUG_C_TEST) {
ed252734 3972 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
3973 sv_dump(sstr);
3974 sv_dump(dstr);
46187eeb 3975 }
765f542d
NC
3976 if (!isSwipe) {
3977 /* I believe I should acquire a global SV mutex if
3978 it's a COW sv (not a shared hash key) to stop
3979 it going un copy-on-write.
3980 If the source SV has gone un copy on write between up there
3981 and down here, then (assert() that) it is of the correct
3982 form to make it copy on write again */
3983 if ((sflags & (SVf_FAKE | SVf_READONLY))
3984 != (SVf_FAKE | SVf_READONLY)) {
3985 SvREADONLY_on(sstr);
3986 SvFAKE_on(sstr);
3987 /* Make the source SV into a loop of 1.
3988 (about to become 2) */
a29f6d03 3989 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
3990 }
3991 }
3992#endif
3993 /* Initial code is common. */
adbc6bb1 3994 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
3995 if (SvOOK(dstr)) {
3996 SvFLAGS(dstr) &= ~SVf_OOK;
3997 Safefree(SvPVX(dstr) - SvIVX(dstr));
3998 }
50483b2c 3999 else if (SvLEN(dstr))
a5f75d66 4000 Safefree(SvPVX(dstr));
79072805 4001 }
a5f75d66 4002 (void)SvPOK_only(dstr);
765f542d
NC
4003
4004#ifdef PERL_COPY_ON_WRITE
4005 if (!isSwipe) {
4006 /* making another shared SV. */
4007 STRLEN cur = SvCUR(sstr);
4008 STRLEN len = SvLEN(sstr);
4009 if (len) {
4010 /* SvIsCOW_normal */
4011 /* splice us in between source and next-after-source. */
a29f6d03
NC
4012 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4013 SV_COW_NEXT_SV_SET(sstr, dstr);
765f542d
NC
4014 SvPV_set(dstr, SvPVX(sstr));
4015 } else {
4016 /* SvIsCOW_shared_hash */
4017 UV hash = SvUVX(sstr);
46187eeb
NC
4018 DEBUG_C(PerlIO_printf(Perl_debug_log,
4019 "Copy on write: Sharing hash\n"));
765f542d
NC
4020 SvPV_set(dstr,
4021 sharepvn(SvPVX(sstr),
4022 (sflags & SVf_UTF8?-cur:cur), hash));
4023 SvUVX(dstr) = hash;
4024 }
4025 SvLEN(dstr) = len;
4026 SvCUR(dstr) = cur;
4027 SvREADONLY_on(dstr);
4028 SvFAKE_on(dstr);
4029 /* Relesase a global SV mutex. */
4030 }
4031 else
4032#endif
4033 { /* Passes the swipe test. */
4034 SvPV_set(dstr, SvPVX(sstr));
4035 SvLEN_set(dstr, SvLEN(sstr));
4036 SvCUR_set(dstr, SvCUR(sstr));
4037
4038 SvTEMP_off(dstr);
4039 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
4040 SvPV_set(sstr, Nullch);
4041 SvLEN_set(sstr, 0);
4042 SvCUR_set(sstr, 0);
4043 SvTEMP_off(sstr);
4044 }
4045 }
9aa983d2 4046 if (sflags & SVf_UTF8)
a7cb1f99 4047 SvUTF8_on(dstr);
79072805 4048 /*SUPPRESS 560*/
8990e307 4049 if (sflags & SVp_NOK) {
3332b3c1
JH
4050 SvNOKp_on(dstr);
4051 if (sflags & SVf_NOK)
4052 SvFLAGS(dstr) |= SVf_NOK;
463ee0b2 4053 SvNVX(dstr) = SvNVX(sstr);
79072805 4054 }
8990e307 4055 if (sflags & SVp_IOK) {
3332b3c1
JH
4056 (void)SvIOKp_on(dstr);
4057 if (sflags & SVf_IOK)
4058 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 4059 if (sflags & SVf_IVisUV)
25da4f38 4060 SvIsUV_on(dstr);
463ee0b2 4061 SvIVX(dstr) = SvIVX(sstr);
79072805 4062 }
92f0c265 4063 if (SvVOK(sstr)) {
ece467f9
JP
4064 MAGIC *smg = mg_find(sstr,PERL_MAGIC_vstring);
4065 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4066 smg->mg_ptr, smg->mg_len);
439cb1c4 4067 SvRMAGICAL_on(dstr);
92f0c265 4068 }
79072805 4069 }
8990e307 4070 else if (sflags & SVp_IOK) {
3332b3c1
JH
4071 if (sflags & SVf_IOK)
4072 (void)SvIOK_only(dstr);
4073 else {
9cbac4c7
DM
4074 (void)SvOK_off(dstr);
4075 (void)SvIOKp_on(dstr);
3332b3c1
JH
4076 }
4077 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2b1c7e3e 4078 if (sflags & SVf_IVisUV)
25da4f38 4079 SvIsUV_on(dstr);
3332b3c1
JH
4080 SvIVX(dstr) = SvIVX(sstr);
4081 if (sflags & SVp_NOK) {
4082 if (sflags & SVf_NOK)
4083 (void)SvNOK_on(dstr);
4084 else
4085 (void)SvNOKp_on(dstr);
4086 SvNVX(dstr) = SvNVX(sstr);
4087 }
4088 }
4089 else if (sflags & SVp_NOK) {
4090 if (sflags & SVf_NOK)
4091 (void)SvNOK_only(dstr);
4092 else {
9cbac4c7 4093 (void)SvOK_off(dstr);
3332b3c1
JH
4094 SvNOKp_on(dstr);
4095 }
4096 SvNVX(dstr) = SvNVX(sstr);
79072805
LW
4097 }
4098 else {
20408e3c 4099 if (dtype == SVt_PVGV) {
e476b1b5 4100 if (ckWARN(WARN_MISC))
9014280d 4101 Perl_warner(aTHX_ packWARN(WARN_MISC), "Undefined value assigned to typeglob");
20408e3c
GS
4102 }
4103 else
4104 (void)SvOK_off(dstr);
a0d0e21e 4105 }
27c9684d
AP
4106 if (SvTAINTED(sstr))
4107 SvTAINT(dstr);
79072805
LW
4108}
4109
954c1994
GS
4110/*
4111=for apidoc sv_setsv_mg
4112
4113Like C<sv_setsv>, but also handles 'set' magic.
4114
4115=cut
4116*/
4117
79072805 4118void
864dbfa3 4119Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
4120{
4121 sv_setsv(dstr,sstr);
4122 SvSETMAGIC(dstr);
4123}
4124
ed252734
NC
4125#ifdef PERL_COPY_ON_WRITE
4126SV *
4127Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4128{
4129 STRLEN cur = SvCUR(sstr);
4130 STRLEN len = SvLEN(sstr);
4131 register char *new_pv;
4132
4133 if (DEBUG_C_TEST) {
4134 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4135 sstr, dstr);
4136 sv_dump(sstr);
4137 if (dstr)
4138 sv_dump(dstr);
4139 }
4140
4141 if (dstr) {
4142 if (SvTHINKFIRST(dstr))
4143 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
4144 else if (SvPVX(dstr))
4145 Safefree(SvPVX(dstr));
4146 }
4147 else
4148 new_SV(dstr);
4149 SvUPGRADE (dstr, SVt_PVIV);
4150
4151 assert (SvPOK(sstr));
4152 assert (SvPOKp(sstr));
4153 assert (!SvIOK(sstr));
4154 assert (!SvIOKp(sstr));
4155 assert (!SvNOK(sstr));
4156 assert (!SvNOKp(sstr));
4157
4158 if (SvIsCOW(sstr)) {
4159
4160 if (SvLEN(sstr) == 0) {
4161 /* source is a COW shared hash key. */
4162 UV hash = SvUVX(sstr);
4163 DEBUG_C(PerlIO_printf(Perl_debug_log,
4164 "Fast copy on write: Sharing hash\n"));
4165 SvUVX(dstr) = hash;
4166 new_pv = sharepvn(SvPVX(sstr), (SvUTF8(sstr)?-cur:cur), hash);
4167 goto common_exit;
4168 }
4169 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4170 } else {
4171 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
4172 SvUPGRADE (sstr, SVt_PVIV);
4173 SvREADONLY_on(sstr);
4174 SvFAKE_on(sstr);
4175 DEBUG_C(PerlIO_printf(Perl_debug_log,
4176 "Fast copy on write: Converting sstr to COW\n"));
4177 SV_COW_NEXT_SV_SET(dstr, sstr);
4178 }
4179 SV_COW_NEXT_SV_SET(sstr, dstr);
4180 new_pv = SvPVX(sstr);
4181
4182 common_exit:
4183 SvPV_set(dstr, new_pv);
4184 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4185 if (SvUTF8(sstr))
4186 SvUTF8_on(dstr);
4187 SvLEN(dstr) = len;
4188 SvCUR(dstr) = cur;
4189 if (DEBUG_C_TEST) {
4190 sv_dump(dstr);
4191 }
4192 return dstr;
4193}
4194#endif
4195
954c1994
GS
4196/*
4197=for apidoc sv_setpvn
4198
4199Copies a string into an SV. The C<len> parameter indicates the number of
4200bytes to be copied. Does not handle 'set' magic. See C<sv_setpvn_mg>.
4201
4202=cut
4203*/
4204
ef50df4b 4205void
864dbfa3 4206Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 4207{
c6f8c383 4208 register char *dptr;
22c522df 4209
765f542d 4210 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4211 if (!ptr) {
a0d0e21e 4212 (void)SvOK_off(sv);
463ee0b2
LW
4213 return;
4214 }
22c522df
JH
4215 else {
4216 /* len is STRLEN which is unsigned, need to copy to signed */
4217 IV iv = len;
9c5ffd7c
JH
4218 if (iv < 0)
4219 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 4220 }
6fc92669 4221 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4222
79072805 4223 SvGROW(sv, len + 1);
c6f8c383
GA
4224 dptr = SvPVX(sv);
4225 Move(ptr,dptr,len,char);
4226 dptr[len] = '\0';
79072805 4227 SvCUR_set(sv, len);
1aa99e6b 4228 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4229 SvTAINT(sv);
79072805
LW
4230}
4231
954c1994
GS
4232/*
4233=for apidoc sv_setpvn_mg
4234
4235Like C<sv_setpvn>, but also handles 'set' magic.
4236
4237=cut
4238*/
4239
79072805 4240void
864dbfa3 4241Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4242{
4243 sv_setpvn(sv,ptr,len);
4244 SvSETMAGIC(sv);
4245}
4246
954c1994
GS
4247/*
4248=for apidoc sv_setpv
4249
4250Copies a string into an SV. The string must be null-terminated. Does not
4251handle 'set' magic. See C<sv_setpv_mg>.
4252
4253=cut
4254*/
4255
ef50df4b 4256void
864dbfa3 4257Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4258{
4259 register STRLEN len;
4260
765f542d 4261 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4262 if (!ptr) {
a0d0e21e 4263 (void)SvOK_off(sv);
463ee0b2
LW
4264 return;
4265 }
79072805 4266 len = strlen(ptr);
6fc92669 4267 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 4268
79072805 4269 SvGROW(sv, len + 1);
463ee0b2 4270 Move(ptr,SvPVX(sv),len+1,char);
79072805 4271 SvCUR_set(sv, len);
1aa99e6b 4272 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
4273 SvTAINT(sv);
4274}
4275
954c1994
GS
4276/*
4277=for apidoc sv_setpv_mg
4278
4279Like C<sv_setpv>, but also handles 'set' magic.
4280
4281=cut
4282*/
4283
463ee0b2 4284void
864dbfa3 4285Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
4286{
4287 sv_setpv(sv,ptr);
4288 SvSETMAGIC(sv);
4289}
4290
954c1994
GS
4291/*
4292=for apidoc sv_usepvn
4293
4294Tells an SV to use C<ptr> to find its string value. Normally the string is
1c846c1f 4295stored inside the SV but sv_usepvn allows the SV to use an outside string.
954c1994
GS
4296The C<ptr> should point to memory that was allocated by C<malloc>. The
4297string length, C<len>, must be supplied. This function will realloc the
4298memory pointed to by C<ptr>, so that pointer should not be freed or used by
4299the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
4300See C<sv_usepvn_mg>.
4301
4302=cut
4303*/
4304
ef50df4b 4305void
864dbfa3 4306Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 4307{
765f542d 4308 SV_CHECK_THINKFIRST_COW_DROP(sv);
c6f8c383 4309 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 4310 if (!ptr) {
a0d0e21e 4311 (void)SvOK_off(sv);
463ee0b2
LW
4312 return;
4313 }
a0ed51b3 4314 (void)SvOOK_off(sv);
50483b2c 4315 if (SvPVX(sv) && SvLEN(sv))
463ee0b2
LW
4316 Safefree(SvPVX(sv));
4317 Renew(ptr, len+1, char);
4318 SvPVX(sv) = ptr;
4319 SvCUR_set(sv, len);
4320 SvLEN_set(sv, len+1);
4321 *SvEND(sv) = '\0';
1aa99e6b 4322 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4323 SvTAINT(sv);
79072805
LW
4324}
4325
954c1994
GS
4326/*
4327=for apidoc sv_usepvn_mg
4328
4329Like C<sv_usepvn>, but also handles 'set' magic.
4330
4331=cut
4332*/
4333
ef50df4b 4334void
864dbfa3 4335Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 4336{
51c1089b 4337 sv_usepvn(sv,ptr,len);
ef50df4b
GS
4338 SvSETMAGIC(sv);
4339}
4340
765f542d
NC
4341#ifdef PERL_COPY_ON_WRITE
4342/* Need to do this *after* making the SV normal, as we need the buffer
4343 pointer to remain valid until after we've copied it. If we let go too early,
4344 another thread could invalidate it by unsharing last of the same hash key
4345 (which it can do by means other than releasing copy-on-write Svs)
4346 or by changing the other copy-on-write SVs in the loop. */
4347STATIC void
4348S_sv_release_COW(pTHX_ register SV *sv, char *pvx, STRLEN cur, STRLEN len,
4349 U32 hash, SV *after)
4350{
4351 if (len) { /* this SV was SvIsCOW_normal(sv) */
4352 /* we need to find the SV pointing to us. */
4353 SV *current = SV_COW_NEXT_SV(after);
4354
4355 if (current == sv) {
4356 /* The SV we point to points back to us (there were only two of us
4357 in the loop.)
4358 Hence other SV is no longer copy on write either. */
4359 SvFAKE_off(after);
4360 SvREADONLY_off(after);
4361 } else {
4362 /* We need to follow the pointers around the loop. */
4363 SV *next;
4364 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4365 assert (next);
4366 current = next;
4367 /* don't loop forever if the structure is bust, and we have
4368 a pointer into a closed loop. */
4369 assert (current != after);
e419cbc5 4370 assert (SvPVX(current) == pvx);
765f542d
NC
4371 }
4372 /* Make the SV before us point to the SV after us. */
a29f6d03 4373 SV_COW_NEXT_SV_SET(current, after);
765f542d
NC
4374 }
4375 } else {
4376 unsharepvn(pvx, SvUTF8(sv) ? -(I32)cur : cur, hash);
4377 }
4378}
4379
4380int
4381Perl_sv_release_IVX(pTHX_ register SV *sv)
4382{
4383 if (SvIsCOW(sv))
4384 sv_force_normal_flags(sv, 0);
4385 return SvOOK_off(sv);
4386}
4387#endif
645c22ef
DM
4388/*
4389=for apidoc sv_force_normal_flags
4390
4391Undo various types of fakery on an SV: if the PV is a shared string, make
4392a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4393an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4394we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4395then a copy-on-write scalar drops its PV buffer (if any) and becomes
4396SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 4397set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
4398C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4399with flags set to 0.
645c22ef
DM
4400
4401=cut
4402*/
4403
6fc92669 4404void
840a7b70 4405Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 4406{
765f542d
NC
4407#ifdef PERL_COPY_ON_WRITE
4408 if (SvREADONLY(sv)) {
4409 /* At this point I believe I should acquire a global SV mutex. */
4410 if (SvFAKE(sv)) {
4411 char *pvx = SvPVX(sv);
4412 STRLEN len = SvLEN(sv);
4413 STRLEN cur = SvCUR(sv);
4414 U32 hash = SvUVX(sv);
4415 SV *next = SV_COW_NEXT_SV(sv); /* next COW sv in the loop. */
46187eeb
NC
4416 if (DEBUG_C_TEST) {
4417 PerlIO_printf(Perl_debug_log,
4418 "Copy on write: Force normal %ld\n",
4419 (long) flags);
e419cbc5 4420 sv_dump(sv);
46187eeb 4421 }
765f542d
NC
4422 SvFAKE_off(sv);
4423 SvREADONLY_off(sv);
4424 /* This SV doesn't own the buffer, so need to New() a new one: */
4425 SvPVX(sv) = 0;
4426 SvLEN(sv) = 0;
4427 if (flags & SV_COW_DROP_PV) {
4428 /* OK, so we don't need to copy our buffer. */
4429 SvPOK_off(sv);
4430 } else {
4431 SvGROW(sv, cur + 1);
4432 Move(pvx,SvPVX(sv),cur,char);
4433 SvCUR(sv) = cur;
4434 *SvEND(sv) = '\0';
4435 }
e419cbc5 4436 sv_release_COW(sv, pvx, cur, len, hash, next);
46187eeb 4437 if (DEBUG_C_TEST) {
e419cbc5 4438 sv_dump(sv);
46187eeb 4439 }
765f542d
NC
4440 }
4441 else if (PL_curcop != &PL_compiling)
4442 Perl_croak(aTHX_ PL_no_modify);
4443 /* At this point I believe that I can drop the global SV mutex. */
4444 }
4445#else
2213622d 4446 if (SvREADONLY(sv)) {
1c846c1f
NIS
4447 if (SvFAKE(sv)) {
4448 char *pvx = SvPVX(sv);
4449 STRLEN len = SvCUR(sv);
4450 U32 hash = SvUVX(sv);
4451 SvGROW(sv, len + 1);
4452 Move(pvx,SvPVX(sv),len,char);
4453 *SvEND(sv) = '\0';
4454 SvFAKE_off(sv);
4455 SvREADONLY_off(sv);
25716404 4456 unsharepvn(pvx, SvUTF8(sv) ? -(I32)len : len, hash);
1c846c1f
NIS
4457 }
4458 else if (PL_curcop != &PL_compiling)
cea2e8a9 4459 Perl_croak(aTHX_ PL_no_modify);
0f15f207 4460 }
765f542d 4461#endif
2213622d 4462 if (SvROK(sv))
840a7b70 4463 sv_unref_flags(sv, flags);
6fc92669
GS
4464 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4465 sv_unglob(sv);
0f15f207 4466}
1c846c1f 4467
645c22ef
DM
4468/*
4469=for apidoc sv_force_normal
4470
4471Undo various types of fakery on an SV: if the PV is a shared string, make
4472a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4473an xpvmg. See also C<sv_force_normal_flags>.
4474
4475=cut
4476*/
4477
840a7b70
IZ
4478void
4479Perl_sv_force_normal(pTHX_ register SV *sv)
4480{
4481 sv_force_normal_flags(sv, 0);
4482}
4483
954c1994
GS
4484/*
4485=for apidoc sv_chop
4486
1c846c1f 4487Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4488SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4489the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4490string. Uses the "OOK hack".
954c1994
GS
4491
4492=cut
4493*/
4494
79072805 4495void
645c22ef 4496Perl_sv_chop(pTHX_ register SV *sv, register char *ptr)
79072805
LW
4497{
4498 register STRLEN delta;
4499
a0d0e21e 4500 if (!ptr || !SvPOKp(sv))
79072805 4501 return;
2213622d 4502 SV_CHECK_THINKFIRST(sv);
79072805
LW
4503 if (SvTYPE(sv) < SVt_PVIV)
4504 sv_upgrade(sv,SVt_PVIV);
4505
4506 if (!SvOOK(sv)) {
50483b2c
JD
4507 if (!SvLEN(sv)) { /* make copy of shared string */
4508 char *pvx = SvPVX(sv);
4509 STRLEN len = SvCUR(sv);
4510 SvGROW(sv, len + 1);
4511 Move(pvx,SvPVX(sv),len,char);
4512 *SvEND(sv) = '\0';
4513 }
463ee0b2 4514 SvIVX(sv) = 0;
a4bfb290
AB
4515 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
4516 and we do that anyway inside the SvNIOK_off
4517 */
4518 SvFLAGS(sv) |= SVf_OOK;
79072805 4519 }
a4bfb290 4520 SvNIOK_off(sv);
463ee0b2 4521 delta = ptr - SvPVX(sv);
79072805
LW
4522 SvLEN(sv) -= delta;
4523 SvCUR(sv) -= delta;
463ee0b2
LW
4524 SvPVX(sv) += delta;
4525 SvIVX(sv) += delta;
79072805
LW
4526}
4527
09540bc3
JH
4528/* sv_catpvn() is now a macro using Perl_sv_catpvn_flags();
4529 * this function provided for binary compatibility only
4530 */
4531
4532void
4533Perl_sv_catpvn(pTHX_ SV *dsv, const char* sstr, STRLEN slen)
4534{
4535 sv_catpvn_flags(dsv, sstr, slen, SV_GMAGIC);
4536}
4537
954c1994
GS
4538/*
4539=for apidoc sv_catpvn
4540
4541Concatenates the string onto the end of the string which is in the SV. The
d5ce4a7c
GA
4542C<len> indicates number of bytes to copy. If the SV has the UTF8
4543status set, then the bytes appended should be valid UTF8.
4544Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 4545
8d6d96c1
HS
4546=for apidoc sv_catpvn_flags
4547
4548Concatenates the string onto the end of the string which is in the SV. The
4549C<len> indicates number of bytes to copy. If the SV has the UTF8
4550status set, then the bytes appended should be valid UTF8.
4551If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4552appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4553in terms of this function.
4554
4555=cut
4556*/
4557
4558void
4559Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
4560{
4561 STRLEN dlen;
4562 char *dstr;
4563
4564 dstr = SvPV_force_flags(dsv, dlen, flags);
4565 SvGROW(dsv, dlen + slen + 1);
4566 if (sstr == dstr)
4567 sstr = SvPVX(dsv);
4568 Move(sstr, SvPVX(dsv) + dlen, slen, char);
4569 SvCUR(dsv) += slen;
4570 *SvEND(dsv) = '\0';
4571 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
4572 SvTAINT(dsv);
79072805
LW
4573}
4574
954c1994
GS
4575/*
4576=for apidoc sv_catpvn_mg
4577
4578Like C<sv_catpvn>, but also handles 'set' magic.
4579
4580=cut
4581*/
4582
79072805 4583void
864dbfa3 4584Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
4585{
4586 sv_catpvn(sv,ptr,len);
4587 SvSETMAGIC(sv);
4588}
4589
09540bc3
JH
4590/* sv_catsv() is now a macro using Perl_sv_catsv_flags();
4591 * this function provided for binary compatibility only
4592 */
4593
4594void
4595Perl_sv_catsv(pTHX_ SV *dstr, register SV *sstr)
4596{
4597 sv_catsv_flags(dstr, sstr, SV_GMAGIC);
4598}
4599
954c1994
GS
4600/*
4601=for apidoc sv_catsv
4602
13e8c8e3
JH
4603Concatenates the string from SV C<ssv> onto the end of the string in
4604SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
4605not 'set' magic. See C<sv_catsv_mg>.
954c1994 4606
8d6d96c1
HS
4607=for apidoc sv_catsv_flags
4608
4609Concatenates the string from SV C<ssv> onto the end of the string in
4610SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
4611bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4612and C<sv_catsv_nomg> are implemented in terms of this function.
4613
4614=cut */
4615
ef50df4b 4616void
8d6d96c1 4617Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 4618{
13e8c8e3
JH
4619 char *spv;
4620 STRLEN slen;
46199a12 4621 if (!ssv)
79072805 4622 return;
46199a12 4623 if ((spv = SvPV(ssv, slen))) {
4fd84b44
AD
4624 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4625 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
8cf8f3d1
NIS
4626 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4627 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4fd84b44
AD
4628 dsv->sv_flags doesn't have that bit set.
4629 Andy Dougherty 12 Oct 2001
4630 */
4631 I32 sutf8 = DO_UTF8(ssv);
4632 I32 dutf8;
13e8c8e3 4633
8d6d96c1
HS
4634 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4635 mg_get(dsv);
4636 dutf8 = DO_UTF8(dsv);
4637
4638 if (dutf8 != sutf8) {
13e8c8e3 4639 if (dutf8) {
46199a12 4640 /* Not modifying source SV, so taking a temporary copy. */
8d6d96c1 4641 SV* csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 4642
46199a12 4643 sv_utf8_upgrade(csv);
8d6d96c1 4644 spv = SvPV(csv, slen);
13e8c8e3 4645 }
8d6d96c1
HS
4646 else
4647 sv_utf8_upgrade_nomg(dsv);
e84ff256 4648 }
8d6d96c1 4649 sv_catpvn_nomg(dsv, spv, slen);
560a288e 4650 }
79072805
LW
4651}
4652
954c1994
GS
4653/*
4654=for apidoc sv_catsv_mg
4655
4656Like C<sv_catsv>, but also handles 'set' magic.
4657
4658=cut
4659*/
4660
79072805 4661void
46199a12 4662Perl_sv_catsv_mg(pTHX_ SV *dsv, register SV *ssv)
ef50df4b 4663{
46199a12
JH
4664 sv_catsv(dsv,ssv);
4665 SvSETMAGIC(dsv);
ef50df4b
GS
4666}
4667
954c1994
GS
4668/*
4669=for apidoc sv_catpv
4670
4671Concatenates the string onto the end of the string which is in the SV.
d5ce4a7c
GA
4672If the SV has the UTF8 status set, then the bytes appended should be
4673valid UTF8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 4674
d5ce4a7c 4675=cut */
954c1994 4676
ef50df4b 4677void
0c981600 4678Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4679{
4680 register STRLEN len;
463ee0b2 4681 STRLEN tlen;
748a9306 4682 char *junk;
79072805 4683
0c981600 4684 if (!ptr)
79072805 4685 return;
748a9306 4686 junk = SvPV_force(sv, tlen);
0c981600 4687 len = strlen(ptr);
463ee0b2 4688 SvGROW(sv, tlen + len + 1);
0c981600
JH
4689 if (ptr == junk)
4690 ptr = SvPVX(sv);
4691 Move(ptr,SvPVX(sv)+tlen,len+1,char);
79072805 4692 SvCUR(sv) += len;
d41ff1b8 4693 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4694 SvTAINT(sv);
79072805
LW
4695}
4696
954c1994
GS
4697/*
4698=for apidoc sv_catpv_mg
4699
4700Like C<sv_catpv>, but also handles 'set' magic.
4701
4702=cut
4703*/
4704
ef50df4b 4705void
0c981600 4706Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 4707{
0c981600 4708 sv_catpv(sv,ptr);
ef50df4b
GS
4709 SvSETMAGIC(sv);
4710}
4711
645c22ef
DM
4712/*
4713=for apidoc newSV
4714
4715Create a new null SV, or if len > 0, create a new empty SVt_PV type SV
4716with an initial PV allocation of len+1. Normally accessed via the C<NEWSV>
4717macro.
4718
4719=cut
4720*/
4721
79072805 4722SV *
864dbfa3 4723Perl_newSV(pTHX_ STRLEN len)
79072805
LW
4724{
4725 register SV *sv;
1c846c1f 4726
4561caa4 4727 new_SV(sv);
79072805
LW
4728 if (len) {
4729 sv_upgrade(sv, SVt_PV);
4730 SvGROW(sv, len + 1);
4731 }
4732 return sv;
4733}
954c1994 4734/*
92110913 4735=for apidoc sv_magicext
954c1994 4736
68795e93 4737Adds magic to an SV, upgrading it if necessary. Applies the
92110913
NIS
4738supplied vtable and returns pointer to the magic added.
4739
4740Note that sv_magicext will allow things that sv_magic will not.
68795e93 4741In particular you can add magic to SvREADONLY SVs and and more than
92110913 4742one instance of the same 'how'
645c22ef 4743
92110913 4744I C<namelen> is greater then zero then a savepvn() I<copy> of C<name> is stored,
68795e93
NIS
4745if C<namelen> is zero then C<name> is stored as-is and - as another special
4746case - if C<(name && namelen == HEf_SVKEY)> then C<name> is assumed to contain
92110913
NIS
4747an C<SV*> and has its REFCNT incremented
4748
4749(This is now used as a subroutine by sv_magic.)
954c1994
GS
4750
4751=cut
4752*/
92110913
NIS
4753MAGIC *
4754Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, MGVTBL *vtable,
4755 const char* name, I32 namlen)
79072805
LW
4756{
4757 MAGIC* mg;
68795e93 4758
92110913
NIS
4759 if (SvTYPE(sv) < SVt_PVMG) {
4760 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 4761 }
79072805
LW
4762 Newz(702,mg, 1, MAGIC);
4763 mg->mg_moremagic = SvMAGIC(sv);
79072805 4764 SvMAGIC(sv) = mg;
75f9d97a 4765
18808301 4766 /* Some magic sontains a reference loop, where the sv and object refer to
bb03859b
RS
4767 each other. To prevent a reference loop that would prevent such
4768 objects being freed, we look for such loops and if we find one we
87f0b213
JH
4769 avoid incrementing the object refcount.
4770
4771 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 4772 have its REFCNT incremented to keep it in existence.
87f0b213
JH
4773
4774 */
14befaf4
DM
4775 if (!obj || obj == sv ||
4776 how == PERL_MAGIC_arylen ||
4777 how == PERL_MAGIC_qr ||
75f9d97a
JH
4778 (SvTYPE(obj) == SVt_PVGV &&
4779 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4780 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 4781 GvFORM(obj) == (CV*)sv)))
75f9d97a 4782 {
8990e307 4783 mg->mg_obj = obj;
75f9d97a 4784 }
85e6fe83 4785 else {
8990e307 4786 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
4787 mg->mg_flags |= MGf_REFCOUNTED;
4788 }
b5ccf5f2
YST
4789
4790 /* Normal self-ties simply pass a null object, and instead of
4791 using mg_obj directly, use the SvTIED_obj macro to produce a
4792 new RV as needed. For glob "self-ties", we are tieing the PVIO
4793 with an RV obj pointing to the glob containing the PVIO. In
4794 this case, to avoid a reference loop, we need to weaken the
4795 reference.
4796 */
4797
4798 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4799 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
4800 {
4801 sv_rvweaken(obj);
4802 }
4803
79072805 4804 mg->mg_type = how;
565764a8 4805 mg->mg_len = namlen;
9cbac4c7 4806 if (name) {
92110913 4807 if (namlen > 0)
1edc1566 4808 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 4809 else if (namlen == HEf_SVKEY)
1edc1566 4810 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
68795e93 4811 else
92110913 4812 mg->mg_ptr = (char *) name;
9cbac4c7 4813 }
92110913 4814 mg->mg_virtual = vtable;
68795e93 4815
92110913
NIS
4816 mg_magical(sv);
4817 if (SvGMAGICAL(sv))
4818 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4819 return mg;
4820}
4821
4822/*
4823=for apidoc sv_magic
1c846c1f 4824
92110913
NIS
4825Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4826then adds a new magic item of type C<how> to the head of the magic list.
4827
4828=cut
4829*/
4830
4831void
4832Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 4833{
92110913
NIS
4834 MAGIC* mg;
4835 MGVTBL *vtable = 0;
4836
765f542d
NC
4837#ifdef PERL_COPY_ON_WRITE
4838 if (SvIsCOW(sv))
4839 sv_force_normal_flags(sv, 0);
4840#endif
92110913
NIS
4841 if (SvREADONLY(sv)) {
4842 if (PL_curcop != &PL_compiling
4843 && how != PERL_MAGIC_regex_global
4844 && how != PERL_MAGIC_bm
4845 && how != PERL_MAGIC_fm
4846 && how != PERL_MAGIC_sv
4847 )
4848 {
4849 Perl_croak(aTHX_ PL_no_modify);
4850 }
4851 }
4852 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4853 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
4854 /* sv_magic() refuses to add a magic of the same 'how' as an
4855 existing one
92110913
NIS
4856 */
4857 if (how == PERL_MAGIC_taint)
4858 mg->mg_len |= 1;
4859 return;
4860 }
4861 }
68795e93 4862
79072805 4863 switch (how) {
14befaf4 4864 case PERL_MAGIC_sv:
92110913 4865 vtable = &PL_vtbl_sv;
79072805 4866 break;
14befaf4 4867 case PERL_MAGIC_overload:
92110913 4868 vtable = &PL_vtbl_amagic;
a0d0e21e 4869 break;
14befaf4 4870 case PERL_MAGIC_overload_elem:
92110913 4871 vtable = &PL_vtbl_amagicelem;
a0d0e21e 4872 break;
14befaf4 4873 case PERL_MAGIC_overload_table:
92110913 4874 vtable = &PL_vtbl_ovrld;
a0d0e21e 4875 break;
14befaf4 4876 case PERL_MAGIC_bm:
92110913 4877 vtable = &PL_vtbl_bm;
79072805 4878 break;
14befaf4 4879 case PERL_MAGIC_regdata:
92110913 4880 vtable = &PL_vtbl_regdata;
6cef1e77 4881 break;
14befaf4 4882 case PERL_MAGIC_regdatum:
92110913 4883 vtable = &PL_vtbl_regdatum;
6cef1e77 4884 break;
14befaf4 4885 case PERL_MAGIC_env:
92110913 4886 vtable = &PL_vtbl_env;
79072805 4887 break;
14befaf4 4888 case PERL_MAGIC_fm:
92110913 4889 vtable = &PL_vtbl_fm;
55497cff 4890 break;
14befaf4 4891 case PERL_MAGIC_envelem:
92110913 4892 vtable = &PL_vtbl_envelem;
79072805 4893 break;
14befaf4 4894 case PERL_MAGIC_regex_global:
92110913 4895 vtable = &PL_vtbl_mglob;
93a17b20 4896 break;
14befaf4 4897 case PERL_MAGIC_isa:
92110913 4898 vtable = &PL_vtbl_isa;
463ee0b2 4899 break;
14befaf4 4900 case PERL_MAGIC_isaelem:
92110913 4901 vtable = &PL_vtbl_isaelem;
463ee0b2 4902 break;
14befaf4 4903 case PERL_MAGIC_nkeys:
92110913 4904 vtable = &PL_vtbl_nkeys;
16660edb 4905 break;
14befaf4 4906 case PERL_MAGIC_dbfile:
92110913 4907 vtable = 0;
93a17b20 4908 break;
14befaf4 4909 case PERL_MAGIC_dbline:
92110913 4910 vtable = &PL_vtbl_dbline;
79072805 4911 break;
36477c24 4912#ifdef USE_LOCALE_COLLATE
14befaf4 4913 case PERL_MAGIC_collxfrm:
92110913 4914 vtable = &PL_vtbl_collxfrm;
bbce6d69 4915 break;
36477c24 4916#endif /* USE_LOCALE_COLLATE */
14befaf4 4917 case PERL_MAGIC_tied:
92110913 4918 vtable = &PL_vtbl_pack;
463ee0b2 4919 break;
14befaf4
DM
4920 case PERL_MAGIC_tiedelem:
4921 case PERL_MAGIC_tiedscalar:
92110913 4922 vtable = &PL_vtbl_packelem;
463ee0b2 4923 break;
14befaf4 4924 case PERL_MAGIC_qr:
92110913 4925 vtable = &PL_vtbl_regexp;
c277df42 4926 break;
14befaf4 4927 case PERL_MAGIC_sig:
92110913 4928 vtable = &PL_vtbl_sig;
79072805 4929 break;
14befaf4 4930 case PERL_MAGIC_sigelem:
92110913 4931 vtable = &PL_vtbl_sigelem;
79072805 4932 break;
14befaf4 4933 case PERL_MAGIC_taint:
92110913 4934 vtable = &PL_vtbl_taint;
463ee0b2 4935 break;
14befaf4 4936 case PERL_MAGIC_uvar:
92110913 4937 vtable = &PL_vtbl_uvar;
79072805 4938 break;
14befaf4 4939 case PERL_MAGIC_vec:
92110913 4940 vtable = &PL_vtbl_vec;
79072805 4941 break;
ece467f9
JP
4942 case PERL_MAGIC_vstring:
4943 vtable = 0;
4944 break;
7e8c5dac
HS
4945 case PERL_MAGIC_utf8:
4946 vtable = &PL_vtbl_utf8;
4947 break;
14befaf4 4948 case PERL_MAGIC_substr:
92110913 4949 vtable = &PL_vtbl_substr;
79072805 4950 break;
14befaf4 4951 case PERL_MAGIC_defelem:
92110913 4952 vtable = &PL_vtbl_defelem;
5f05dabc 4953 break;
14befaf4 4954 case PERL_MAGIC_glob:
92110913 4955 vtable = &PL_vtbl_glob;
79072805 4956 break;
14befaf4 4957 case PERL_MAGIC_arylen:
92110913 4958 vtable = &PL_vtbl_arylen;
79072805 4959 break;
14befaf4 4960 case PERL_MAGIC_pos:
92110913 4961 vtable = &PL_vtbl_pos;
a0d0e21e 4962 break;
14befaf4 4963 case PERL_MAGIC_backref:
92110913 4964 vtable = &PL_vtbl_backref;
810b8aa5 4965 break;
14befaf4
DM
4966 case PERL_MAGIC_ext:
4967 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
4968 /* Useful for attaching extension internal data to perl vars. */
4969 /* Note that multiple extensions may clash if magical scalars */
4970 /* etc holding private data from one are passed to another. */
a0d0e21e 4971 break;
79072805 4972 default:
14befaf4 4973 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 4974 }
68795e93 4975
92110913
NIS
4976 /* Rest of work is done else where */
4977 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 4978
92110913
NIS
4979 switch (how) {
4980 case PERL_MAGIC_taint:
4981 mg->mg_len = 1;
4982 break;
4983 case PERL_MAGIC_ext:
4984 case PERL_MAGIC_dbfile:
4985 SvRMAGICAL_on(sv);
4986 break;
4987 }
463ee0b2
LW
4988}
4989
c461cf8f
JH
4990/*
4991=for apidoc sv_unmagic
4992
645c22ef 4993Removes all magic of type C<type> from an SV.
c461cf8f
JH
4994
4995=cut
4996*/
4997
463ee0b2 4998int
864dbfa3 4999Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
5000{
5001 MAGIC* mg;
5002 MAGIC** mgp;
91bba347 5003 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
5004 return 0;
5005 mgp = &SvMAGIC(sv);
5006 for (mg = *mgp; mg; mg = *mgp) {
5007 if (mg->mg_type == type) {
5008 MGVTBL* vtbl = mg->mg_virtual;
5009 *mgp = mg->mg_moremagic;
1d7c1841 5010 if (vtbl && vtbl->svt_free)
fc0dc3b3 5011 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 5012 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 5013 if (mg->mg_len > 0)
1edc1566 5014 Safefree(mg->mg_ptr);
565764a8 5015 else if (mg->mg_len == HEf_SVKEY)
1edc1566 5016 SvREFCNT_dec((SV*)mg->mg_ptr);
7e8c5dac
HS
5017 else if (mg->mg_type == PERL_MAGIC_utf8 && mg->mg_ptr)
5018 Safefree(mg->mg_ptr);
9cbac4c7 5019 }
a0d0e21e
LW
5020 if (mg->mg_flags & MGf_REFCOUNTED)
5021 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
5022 Safefree(mg);
5023 }
5024 else
5025 mgp = &mg->mg_moremagic;
79072805 5026 }
91bba347 5027 if (!SvMAGIC(sv)) {
463ee0b2 5028 SvMAGICAL_off(sv);
06759ea0 5029 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
5030 }
5031
5032 return 0;
79072805
LW
5033}
5034
c461cf8f
JH
5035/*
5036=for apidoc sv_rvweaken
5037
645c22ef
DM
5038Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5039referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5040push a back-reference to this RV onto the array of backreferences
5041associated with that magic.
c461cf8f
JH
5042
5043=cut
5044*/
5045
810b8aa5 5046SV *
864dbfa3 5047Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
5048{
5049 SV *tsv;
5050 if (!SvOK(sv)) /* let undefs pass */
5051 return sv;
5052 if (!SvROK(sv))
cea2e8a9 5053 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 5054 else if (SvWEAKREF(sv)) {
810b8aa5 5055 if (ckWARN(WARN_MISC))
9014280d 5056 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
5057 return sv;
5058 }
5059 tsv = SvRV(sv);
5060 sv_add_backref(tsv, sv);
5061 SvWEAKREF_on(sv);
1c846c1f 5062 SvREFCNT_dec(tsv);
810b8aa5
GS
5063 return sv;
5064}
5065
645c22ef
DM
5066/* Give tsv backref magic if it hasn't already got it, then push a
5067 * back-reference to sv onto the array associated with the backref magic.
5068 */
5069
810b8aa5 5070STATIC void
cea2e8a9 5071S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
5072{
5073 AV *av;
5074 MAGIC *mg;
14befaf4 5075 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, PERL_MAGIC_backref)))
810b8aa5
GS
5076 av = (AV*)mg->mg_obj;
5077 else {
5078 av = newAV();
14befaf4 5079 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
810b8aa5
GS
5080 SvREFCNT_dec(av); /* for sv_magic */
5081 }
d91d49e8
MM
5082 if (AvFILLp(av) >= AvMAX(av)) {
5083 SV **svp = AvARRAY(av);
5084 I32 i = AvFILLp(av);
5085 while (i >= 0) {
5086 if (svp[i] == &PL_sv_undef) {
5087 svp[i] = sv; /* reuse the slot */
5088 return;
5089 }
5090 i--;
5091 }
5092 av_extend(av, AvFILLp(av)+1);
5093 }
5094 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
5095}
5096
645c22ef
DM
5097/* delete a back-reference to ourselves from the backref magic associated
5098 * with the SV we point to.
5099 */
5100
1c846c1f 5101STATIC void
cea2e8a9 5102S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
5103{
5104 AV *av;
5105 SV **svp;
5106 I32 i;
5107 SV *tsv = SvRV(sv);
c04a4dfe 5108 MAGIC *mg = NULL;
14befaf4 5109 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, PERL_MAGIC_backref)))
cea2e8a9 5110 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
5111 av = (AV *)mg->mg_obj;
5112 svp = AvARRAY(av);
5113 i = AvFILLp(av);
5114 while (i >= 0) {
5115 if (svp[i] == sv) {
5116 svp[i] = &PL_sv_undef; /* XXX */
5117 }
5118 i--;
5119 }
5120}
5121
954c1994
GS
5122/*
5123=for apidoc sv_insert
5124
5125Inserts a string at the specified offset/length within the SV. Similar to
5126the Perl substr() function.
5127
5128=cut
5129*/
5130
79072805 5131void
864dbfa3 5132Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
79072805
LW
5133{
5134 register char *big;
5135 register char *mid;
5136 register char *midend;
5137 register char *bigend;
5138 register I32 i;
6ff81951 5139 STRLEN curlen;
1c846c1f 5140
79072805 5141
8990e307 5142 if (!bigstr)
cea2e8a9 5143 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 5144 SvPV_force(bigstr, curlen);
60fa28ff 5145 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
5146 if (offset + len > curlen) {
5147 SvGROW(bigstr, offset+len+1);
5148 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
5149 SvCUR_set(bigstr, offset+len);
5150 }
79072805 5151
69b47968 5152 SvTAINT(bigstr);
79072805
LW
5153 i = littlelen - len;
5154 if (i > 0) { /* string might grow */
a0d0e21e 5155 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
5156 mid = big + offset + len;
5157 midend = bigend = big + SvCUR(bigstr);
5158 bigend += i;
5159 *bigend = '\0';
5160 while (midend > mid) /* shove everything down */
5161 *--bigend = *--midend;
5162 Move(little,big+offset,littlelen,char);
5163 SvCUR(bigstr) += i;
5164 SvSETMAGIC(bigstr);
5165 return;
5166 }
5167 else if (i == 0) {
463ee0b2 5168 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
5169 SvSETMAGIC(bigstr);
5170 return;
5171 }
5172
463ee0b2 5173 big = SvPVX(bigstr);
79072805
LW
5174 mid = big + offset;
5175 midend = mid + len;
5176 bigend = big + SvCUR(bigstr);
5177
5178 if (midend > bigend)
cea2e8a9 5179 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5180
5181 if (mid - big > bigend - midend) { /* faster to shorten from end */
5182 if (littlelen) {
5183 Move(little, mid, littlelen,char);
5184 mid += littlelen;
5185 }
5186 i = bigend - midend;
5187 if (i > 0) {
5188 Move(midend, mid, i,char);
5189 mid += i;
5190 }
5191 *mid = '\0';
5192 SvCUR_set(bigstr, mid - big);
5193 }
5194 /*SUPPRESS 560*/
155aba94 5195 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5196 midend -= littlelen;
5197 mid = midend;
5198 sv_chop(bigstr,midend-i);
5199 big += i;
5200 while (i--)
5201 *--midend = *--big;
5202 if (littlelen)
5203 Move(little, mid, littlelen,char);
5204 }
5205 else if (littlelen) {
5206 midend -= littlelen;
5207 sv_chop(bigstr,midend);
5208 Move(little,midend,littlelen,char);
5209 }
5210 else {
5211 sv_chop(bigstr,midend);
5212 }
5213 SvSETMAGIC(bigstr);
5214}
5215
c461cf8f
JH
5216/*
5217=for apidoc sv_replace
5218
5219Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5220The target SV physically takes over ownership of the body of the source SV
5221and inherits its flags; however, the target keeps any magic it owns,
5222and any magic in the source is discarded.
ff276b08 5223Note that this is a rather specialist SV copying operation; most of the
645c22ef 5224time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5225
5226=cut
5227*/
79072805
LW
5228
5229void
864dbfa3 5230Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805
LW
5231{
5232 U32 refcnt = SvREFCNT(sv);
765f542d 5233 SV_CHECK_THINKFIRST_COW_DROP(sv);
0453d815 5234 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
9014280d 5235 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
93a17b20 5236 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5237 if (SvMAGICAL(nsv))
5238 mg_free(nsv);
5239 else
5240 sv_upgrade(nsv, SVt_PVMG);
93a17b20 5241 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 5242 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
5243 SvMAGICAL_off(sv);
5244 SvMAGIC(sv) = 0;
5245 }
79072805
LW
5246 SvREFCNT(sv) = 0;
5247 sv_clear(sv);
477f5d66 5248 assert(!SvREFCNT(sv));
79072805 5249 StructCopy(nsv,sv,SV);
d3d0e6f1
NC
5250#ifdef PERL_COPY_ON_WRITE
5251 if (SvIsCOW_normal(nsv)) {
5252 /* We need to follow the pointers around the loop to make the
5253 previous SV point to sv, rather than nsv. */
5254 SV *next;
5255 SV *current = nsv;
5256 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5257 assert(next);
5258 current = next;
5259 assert(SvPVX(current) == SvPVX(nsv));
5260 }
5261 /* Make the SV before us point to the SV after us. */
5262 if (DEBUG_C_TEST) {
5263 PerlIO_printf(Perl_debug_log, "previous is\n");
5264 sv_dump(current);
a29f6d03
NC
5265 PerlIO_printf(Perl_debug_log,
5266 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5267 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5268 }
a29f6d03 5269 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5270 }
5271#endif
79072805 5272 SvREFCNT(sv) = refcnt;
1edc1566 5273 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
463ee0b2 5274 del_SV(nsv);
79072805
LW
5275}
5276
c461cf8f
JH
5277/*
5278=for apidoc sv_clear
5279
645c22ef
DM
5280Clear an SV: call any destructors, free up any memory used by the body,
5281and free the body itself. The SV's head is I<not> freed, although
5282its type is set to all 1's so that it won't inadvertently be assumed
5283to be live during global destruction etc.
5284This function should only be called when REFCNT is zero. Most of the time
5285you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5286instead.
c461cf8f
JH
5287
5288=cut
5289*/
5290
79072805 5291void
864dbfa3 5292Perl_sv_clear(pTHX_ register SV *sv)
79072805 5293{
ec12f114 5294 HV* stash;
79072805
LW
5295 assert(sv);
5296 assert(SvREFCNT(sv) == 0);
5297
ed6116ce 5298 if (SvOBJECT(sv)) {
3280af22 5299 if (PL_defstash) { /* Still have a symbol table? */
39644a26 5300 dSP;
32251b26 5301 CV* destructor;
837485b6 5302 SV tmpref;
a0d0e21e 5303
837485b6
GS
5304 Zero(&tmpref, 1, SV);
5305 sv_upgrade(&tmpref, SVt_RV);
5306 SvROK_on(&tmpref);
5307 SvREADONLY_on(&tmpref); /* DESTROY() could be naughty */
5308 SvREFCNT(&tmpref) = 1;
8ebc5c01 5309
d460ef45 5310 do {
4e8e7886 5311 stash = SvSTASH(sv);
32251b26 5312 destructor = StashHANDLER(stash,DESTROY);
4e8e7886
GS
5313 if (destructor) {
5314 ENTER;
e788e7d3 5315 PUSHSTACKi(PERLSI_DESTROY);
837485b6 5316 SvRV(&tmpref) = SvREFCNT_inc(sv);
4e8e7886
GS
5317 EXTEND(SP, 2);
5318 PUSHMARK(SP);
837485b6 5319 PUSHs(&tmpref);
4e8e7886 5320 PUTBACK;
44389ee9 5321 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
4e8e7886 5322 SvREFCNT(sv)--;
d3acc0f7 5323 POPSTACK;
3095d977 5324 SPAGAIN;
4e8e7886
GS
5325 LEAVE;
5326 }
5327 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5328
837485b6 5329 del_XRV(SvANY(&tmpref));
6f44e0a4
JP
5330
5331 if (SvREFCNT(sv)) {
5332 if (PL_in_clean_objs)
cea2e8a9 5333 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
6f44e0a4
JP
5334 HvNAME(stash));
5335 /* DESTROY gave object new lease on life */
5336 return;
5337 }
a0d0e21e 5338 }
4e8e7886 5339
a0d0e21e 5340 if (SvOBJECT(sv)) {
4e8e7886 5341 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
5342 SvOBJECT_off(sv); /* Curse the object. */
5343 if (SvTYPE(sv) != SVt_PVIO)
3280af22 5344 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5345 }
463ee0b2 5346 }
524189f1
JH
5347 if (SvTYPE(sv) >= SVt_PVMG) {
5348 if (SvMAGIC(sv))
5349 mg_free(sv);
5350 if (SvFLAGS(sv) & SVpad_TYPED)
5351 SvREFCNT_dec(SvSTASH(sv));
5352 }
ec12f114 5353 stash = NULL;
79072805 5354 switch (SvTYPE(sv)) {
8990e307 5355 case SVt_PVIO:
df0bd2f4
GS
5356 if (IoIFP(sv) &&
5357 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5358 IoIFP(sv) != PerlIO_stdout() &&
5359 IoIFP(sv) != PerlIO_stderr())
93578b34 5360 {
f2b5be74 5361 io_close((IO*)sv, FALSE);
93578b34 5362 }
1d7c1841 5363 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5364 PerlDir_close(IoDIRP(sv));
1d7c1841 5365 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5366 Safefree(IoTOP_NAME(sv));
5367 Safefree(IoFMT_NAME(sv));
5368 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 5369 /* FALL THROUGH */
79072805 5370 case SVt_PVBM:
a0d0e21e 5371 goto freescalar;
79072805 5372 case SVt_PVCV:
748a9306 5373 case SVt_PVFM:
85e6fe83 5374 cv_undef((CV*)sv);
a0d0e21e 5375 goto freescalar;
79072805 5376 case SVt_PVHV:
85e6fe83 5377 hv_undef((HV*)sv);
a0d0e21e 5378 break;
79072805 5379 case SVt_PVAV:
85e6fe83 5380 av_undef((AV*)sv);
a0d0e21e 5381 break;
02270b4e
GS
5382 case SVt_PVLV:
5383 SvREFCNT_dec(LvTARG(sv));
5384 goto freescalar;
a0d0e21e 5385 case SVt_PVGV:
1edc1566 5386 gp_free((GV*)sv);
a0d0e21e 5387 Safefree(GvNAME(sv));
ec12f114
JPC
5388 /* cannot decrease stash refcount yet, as we might recursively delete
5389 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
5390 of stash until current sv is completely gone.
5391 -- JohnPC, 27 Mar 1998 */
5392 stash = GvSTASH(sv);
a0d0e21e 5393 /* FALL THROUGH */
79072805 5394 case SVt_PVMG:
79072805
LW
5395 case SVt_PVNV:
5396 case SVt_PVIV:
a0d0e21e
LW
5397 freescalar:
5398 (void)SvOOK_off(sv);
79072805
LW
5399 /* FALL THROUGH */
5400 case SVt_PV:
a0d0e21e 5401 case SVt_RV:
810b8aa5
GS
5402 if (SvROK(sv)) {
5403 if (SvWEAKREF(sv))
5404 sv_del_backref(sv);
5405 else
5406 SvREFCNT_dec(SvRV(sv));
5407 }
765f542d
NC
5408#ifdef PERL_COPY_ON_WRITE
5409 else if (SvPVX(sv)) {
5410 if (SvIsCOW(sv)) {
5411 /* I believe I need to grab the global SV mutex here and
5412 then recheck the COW status. */
46187eeb
NC
5413 if (DEBUG_C_TEST) {
5414 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5415 sv_dump(sv);
46187eeb 5416 }
e419cbc5 5417 sv_release_COW(sv, SvPVX(sv), SvCUR(sv), SvLEN(sv),
765f542d
NC
5418 SvUVX(sv), SV_COW_NEXT_SV(sv));
5419 /* And drop it here. */
5420 SvFAKE_off(sv);
5421 } else if (SvLEN(sv)) {
5422 Safefree(SvPVX(sv));
5423 }
5424 }
5425#else
1edc1566 5426 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 5427 Safefree(SvPVX(sv));
1c846c1f 5428 else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
25716404
GS
5429 unsharepvn(SvPVX(sv),
5430 SvUTF8(sv) ? -(I32)SvCUR(sv) : SvCUR(sv),
5431 SvUVX(sv));
1c846c1f
NIS
5432 SvFAKE_off(sv);
5433 }
765f542d 5434#endif
79072805 5435 break;
a0d0e21e 5436/*
79072805 5437 case SVt_NV:
79072805 5438 case SVt_IV:
79072805
LW
5439 case SVt_NULL:
5440 break;
a0d0e21e 5441*/
79072805
LW
5442 }
5443
5444 switch (SvTYPE(sv)) {
5445 case SVt_NULL:
5446 break;
79072805
LW
5447 case SVt_IV:
5448 del_XIV(SvANY(sv));
5449 break;
5450 case SVt_NV:
5451 del_XNV(SvANY(sv));
5452 break;
ed6116ce
LW
5453 case SVt_RV:
5454 del_XRV(SvANY(sv));
5455 break;
79072805
LW
5456 case SVt_PV:
5457 del_XPV(SvANY(sv));
5458 break;
5459 case SVt_PVIV:
5460 del_XPVIV(SvANY(sv));
5461 break;
5462 case SVt_PVNV:
5463 del_XPVNV(SvANY(sv));
5464 break;
5465 case SVt_PVMG:
5466 del_XPVMG(SvANY(sv));
5467 break;
5468 case SVt_PVLV:
5469 del_XPVLV(SvANY(sv));
5470 break;
5471 case SVt_PVAV:
5472 del_XPVAV(SvANY(sv));
5473 break;
5474 case SVt_PVHV:
5475 del_XPVHV(SvANY(sv));
5476 break;
5477 case SVt_PVCV:
5478 del_XPVCV(SvANY(sv));
5479 break;
5480 case SVt_PVGV:
5481 del_XPVGV(SvANY(sv));
ec12f114
JPC
5482 /* code duplication for increased performance. */
5483 SvFLAGS(sv) &= SVf_BREAK;
5484 SvFLAGS(sv) |= SVTYPEMASK;
5485 /* decrease refcount of the stash that owns this GV, if any */
5486 if (stash)
5487 SvREFCNT_dec(stash);
5488 return; /* not break, SvFLAGS reset already happened */
79072805
LW
5489 case SVt_PVBM:
5490 del_XPVBM(SvANY(sv));
5491 break;
5492 case SVt_PVFM:
5493 del_XPVFM(SvANY(sv));
5494 break;
8990e307
LW
5495 case SVt_PVIO:
5496 del_XPVIO(SvANY(sv));
5497 break;
79072805 5498 }
a0d0e21e 5499 SvFLAGS(sv) &= SVf_BREAK;
8990e307 5500 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
5501}
5502
645c22ef
DM
5503/*
5504=for apidoc sv_newref
5505
5506Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5507instead.
5508
5509=cut
5510*/
5511
79072805 5512SV *
864dbfa3 5513Perl_sv_newref(pTHX_ SV *sv)
79072805 5514{
463ee0b2 5515 if (sv)
4db098f4 5516 (SvREFCNT(sv))++;
79072805
LW
5517 return sv;
5518}
5519
c461cf8f
JH
5520/*
5521=for apidoc sv_free
5522
645c22ef
DM
5523Decrement an SV's reference count, and if it drops to zero, call
5524C<sv_clear> to invoke destructors and free up any memory used by
5525the body; finally, deallocate the SV's head itself.
5526Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5527
5528=cut
5529*/
5530
79072805 5531void
864dbfa3 5532Perl_sv_free(pTHX_ SV *sv)
79072805
LW
5533{
5534 if (!sv)
5535 return;
a0d0e21e
LW
5536 if (SvREFCNT(sv) == 0) {
5537 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5538 /* this SV's refcnt has been artificially decremented to
5539 * trigger cleanup */
a0d0e21e 5540 return;
3280af22 5541 if (PL_in_clean_all) /* All is fair */
1edc1566 5542 return;
d689ffdd
JP
5543 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5544 /* make sure SvREFCNT(sv)==0 happens very seldom */
5545 SvREFCNT(sv) = (~(U32)0)/2;
5546 return;
5547 }
0453d815 5548 if (ckWARN_d(WARN_INTERNAL))
9014280d 5549 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Attempt to free unreferenced scalar");
79072805
LW
5550 return;
5551 }
4db098f4 5552 if (--(SvREFCNT(sv)) > 0)
8990e307 5553 return;
8c4d3c90
NC
5554 Perl_sv_free2(aTHX_ sv);
5555}
5556
5557void
5558Perl_sv_free2(pTHX_ SV *sv)
5559{
463ee0b2
LW
5560#ifdef DEBUGGING
5561 if (SvTEMP(sv)) {
0453d815 5562 if (ckWARN_d(WARN_DEBUGGING))
9014280d 5563 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
1d7c1841
GS
5564 "Attempt to free temp prematurely: SV 0x%"UVxf,
5565 PTR2UV(sv));
79072805 5566 return;
79072805 5567 }
463ee0b2 5568#endif
d689ffdd
JP
5569 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5570 /* make sure SvREFCNT(sv)==0 happens very seldom */
5571 SvREFCNT(sv) = (~(U32)0)/2;
5572 return;
5573 }
79072805 5574 sv_clear(sv);
477f5d66
CS
5575 if (! SvREFCNT(sv))
5576 del_SV(sv);
79072805
LW
5577}
5578
954c1994
GS
5579/*
5580=for apidoc sv_len
5581
645c22ef
DM
5582Returns the length of the string in the SV. Handles magic and type
5583coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5584
5585=cut
5586*/
5587
79072805 5588STRLEN
864dbfa3 5589Perl_sv_len(pTHX_ register SV *sv)
79072805 5590{
463ee0b2 5591 STRLEN len;
79072805
LW
5592
5593 if (!sv)
5594 return 0;
5595
8990e307 5596 if (SvGMAGICAL(sv))
565764a8 5597 len = mg_length(sv);
8990e307 5598 else
497b47a8 5599 (void)SvPV(sv, len);
463ee0b2 5600 return len;
79072805
LW
5601}
5602
c461cf8f
JH
5603/*
5604=for apidoc sv_len_utf8
5605
5606Returns the number of characters in the string in an SV, counting wide
645c22ef 5607UTF8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5608
5609=cut
5610*/
5611
7e8c5dac
HS
5612/*
5613 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
5614 * mg_ptr is used, by sv_pos_u2b(), see the comments of S_utf8_mg_pos_init().
5615 * (Note that the mg_len is not the length of the mg_ptr field.)
5616 *
5617 */
5618
a0ed51b3 5619STRLEN
864dbfa3 5620Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 5621{
a0ed51b3
LW
5622 if (!sv)
5623 return 0;
5624
a0ed51b3 5625 if (SvGMAGICAL(sv))
b76347f2 5626 return mg_length(sv);
a0ed51b3 5627 else
b76347f2 5628 {
7e8c5dac 5629 STRLEN len, ulen;
b76347f2 5630 U8 *s = (U8*)SvPV(sv, len);
7e8c5dac
HS
5631 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
5632
5633 if (mg && mg->mg_len != -1 && (mg->mg_len > 0 || len == 0))
5634 ulen = mg->mg_len;
5635 else {
5636 ulen = Perl_utf8_length(aTHX_ s, s + len);
5637 if (!mg && !SvREADONLY(sv)) {
5638 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
5639 mg = mg_find(sv, PERL_MAGIC_utf8);
5640 assert(mg);
5641 }
5642 if (mg)
5643 mg->mg_len = ulen;
5644 }
5645 return ulen;
5646 }
5647}
5648
5649/* S_utf8_mg_pos_init() is used to initialize the mg_ptr field of
5650 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5651 * between UTF-8 and byte offsets. There are two (substr offset and substr
5652 * length, the i offset, PERL_MAGIC_UTF8_CACHESIZE) times two (UTF-8 offset
5653 * and byte offset) cache positions.
5654 *
5655 * The mg_len field is used by sv_len_utf8(), see its comments.
5656 * Note that the mg_len is not the length of the mg_ptr field.
5657 *
5658 */
5659STATIC bool
6e551876 5660S_utf8_mg_pos_init(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, U8 *s, U8 *start)
7e8c5dac
HS
5661{
5662 bool found = FALSE;
5663
5664 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
5665 if (!*mgp) {
5666 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
5667 *mgp = mg_find(sv, PERL_MAGIC_utf8);
5668 }
5669 assert(*mgp);
b76347f2 5670
7e8c5dac
HS
5671 if ((*mgp)->mg_ptr)
5672 *cachep = (STRLEN *) (*mgp)->mg_ptr;
5673 else {
5674 Newz(0, *cachep, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
5675 (*mgp)->mg_ptr = (char *) *cachep;
5676 }
5677 assert(*cachep);
5678
5679 (*cachep)[i] = *offsetp;
5680 (*cachep)[i+1] = s - start;
5681 found = TRUE;
a0ed51b3 5682 }
7e8c5dac
HS
5683
5684 return found;
a0ed51b3
LW
5685}
5686
645c22ef 5687/*
7e8c5dac
HS
5688 * S_utf8_mg_pos() is used to query and update mg_ptr field of
5689 * a PERL_UTF8_magic. The mg_ptr is used to store the mapping
5690 * between UTF-8 and byte offsets. See also the comments of
5691 * S_utf8_mg_pos_init().
5692 *
5693 */
5694STATIC bool
6e551876 5695S_utf8_mg_pos(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, I32 uoff, U8 **sp, U8 *start, U8 *send)
7e8c5dac
HS
5696{
5697 bool found = FALSE;
5698
5699 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
5700 if (!*mgp)
5701 *mgp = mg_find(sv, PERL_MAGIC_utf8);
5702 if (*mgp && (*mgp)->mg_ptr) {
5703 *cachep = (STRLEN *) (*mgp)->mg_ptr;
667208dd 5704 if ((*cachep)[i] == (STRLEN)uoff) /* An exact match. */
7e8c5dac
HS
5705 found = TRUE;
5706 else { /* We will skip to the right spot. */
5707 STRLEN forw = 0;
5708 STRLEN backw = 0;
5709 U8* p = NULL;
5710
5711 /* The assumption is that going backward is half
5712 * the speed of going forward (that's where the
5713 * 2 * backw in the below comes from). (The real
5714 * figure of course depends on the UTF-8 data.) */
5715
667208dd 5716 if ((*cachep)[i] > (STRLEN)uoff) {
7e8c5dac 5717 forw = uoff;
667208dd 5718 backw = (*cachep)[i] - (STRLEN)uoff;
7e8c5dac
HS
5719
5720 if (forw < 2 * backw)
5721 p = start;
5722 else
5723 p = start + (*cachep)[i+1];
5724 }
5725 /* Try this only for the substr offset (i == 0),
5726 * not for the substr length (i == 2). */
5727 else if (i == 0) { /* (*cachep)[i] < uoff */
5728 STRLEN ulen = sv_len_utf8(sv);
5729
667208dd
JH
5730 if ((STRLEN)uoff < ulen) {
5731 forw = (STRLEN)uoff - (*cachep)[i];
5732 backw = ulen - (STRLEN)uoff;
7e8c5dac
HS
5733
5734 if (forw < 2 * backw)
5735 p = start + (*cachep)[i+1];
5736 else
5737 p = send;
5738 }
5739
5740 /* If the string is not long enough for uoff,
5741 * we could extend it, but not at this low a level. */
5742 }
5743
5744 if (p) {
5745 if (forw < 2 * backw) {
5746 while (forw--)
5747 p += UTF8SKIP(p);
5748 }
5749 else {
5750 while (backw--) {
5751 p--;
5752 while (UTF8_IS_CONTINUATION(*p))
5753 p--;
5754 }
5755 }
5756
5757 /* Update the cache. */
667208dd 5758 (*cachep)[i] = (STRLEN)uoff;
7e8c5dac
HS
5759 (*cachep)[i+1] = p - start;
5760
5761 found = TRUE;
5762 }
5763 }
5764 if (found) { /* Setup the return values. */
5765 *offsetp = (*cachep)[i+1];
5766 *sp = start + *offsetp;
5767 if (*sp >= send) {
5768 *sp = send;
5769 *offsetp = send - start;
5770 }
5771 else if (*sp < start) {
5772 *sp = start;
5773 *offsetp = 0;
5774 }
5775 }
5776 }
5777 }
5778 return found;
5779}
5780
5781/*
645c22ef
DM
5782=for apidoc sv_pos_u2b
5783
5784Converts the value pointed to by offsetp from a count of UTF8 chars from
5785the start of the string, to a count of the equivalent number of bytes; if
5786lenp is non-zero, it does the same to lenp, but this time starting from
5787the offset, rather than from the start of the string. Handles magic and
5788type coercion.
5789
5790=cut
5791*/
5792
7e8c5dac
HS
5793/*
5794 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
5795 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5796 * byte offsets. See also the comments of S_utf8_mg_pos().
5797 *
5798 */
5799
a0ed51b3 5800void
864dbfa3 5801Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 5802{
dfe13c55
GS
5803 U8 *start;
5804 U8 *s;
a0ed51b3 5805 STRLEN len;
7e8c5dac
HS
5806 STRLEN *cache = 0;
5807 STRLEN boffset = 0;
a0ed51b3
LW
5808
5809 if (!sv)
5810 return;
5811
dfe13c55 5812 start = s = (U8*)SvPV(sv, len);
7e8c5dac
HS
5813 if (len) {
5814 I32 uoffset = *offsetp;
5815 U8 *send = s + len;
5816 MAGIC *mg = 0;
5817 bool found = FALSE;
5818
bdf77a2a 5819 if (utf8_mg_pos(sv, &mg, &cache, 0, offsetp, *offsetp, &s, start, send))
7e8c5dac
HS
5820 found = TRUE;
5821 if (!found && uoffset > 0) {
5822 while (s < send && uoffset--)
5823 s += UTF8SKIP(s);
5824 if (s >= send)
5825 s = send;
bdf77a2a 5826 if (utf8_mg_pos_init(sv, &mg, &cache, 0, offsetp, s, start))
7e8c5dac
HS
5827 boffset = cache[1];
5828 *offsetp = s - start;
5829 }
5830 if (lenp) {
5831 found = FALSE;
5832 start = s;
bdf77a2a 5833 if (utf8_mg_pos(sv, &mg, &cache, 2, lenp, *lenp + *offsetp, &s, start, send)) {
7e8c5dac
HS
5834 *lenp -= boffset;
5835 found = TRUE;
5836 }
5837 if (!found && *lenp > 0) {
5838 I32 ulen = *lenp;
5839 if (ulen > 0)
5840 while (s < send && ulen--)
5841 s += UTF8SKIP(s);
5842 if (s >= send)
5843 s = send;
bdf77a2a 5844 if (utf8_mg_pos_init(sv, &mg, &cache, 2, lenp, s, start))
7e8c5dac
HS
5845 cache[2] += *offsetp;
5846 }
5847 *lenp = s - start;
5848 }
5849 }
5850 else {
5851 *offsetp = 0;
5852 if (lenp)
5853 *lenp = 0;
a0ed51b3
LW
5854 }
5855 return;
5856}
5857
645c22ef
DM
5858/*
5859=for apidoc sv_pos_b2u
5860
5861Converts the value pointed to by offsetp from a count of bytes from the
5862start of the string, to a count of the equivalent number of UTF8 chars.
5863Handles magic and type coercion.
5864
5865=cut
5866*/
5867
7e8c5dac
HS
5868/*
5869 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
5870 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5871 * byte offsets. See also the comments of S_utf8_mg_pos().
5872 *
5873 */
5874
a0ed51b3 5875void
7e8c5dac 5876Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 5877{
7e8c5dac 5878 U8* s;
a0ed51b3
LW
5879 STRLEN len;
5880
5881 if (!sv)
5882 return;
5883
dfe13c55 5884 s = (U8*)SvPV(sv, len);
eb160463 5885 if ((I32)len < *offsetp)
a0dbb045 5886 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac
HS
5887 else {
5888 U8* send = s + *offsetp;
5889 MAGIC* mg = NULL;
5890 STRLEN *cache = NULL;
5891
5892 len = 0;
5893
5894 if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
5895 mg = mg_find(sv, PERL_MAGIC_utf8);
5896 if (mg && mg->mg_ptr) {
5897 cache = (STRLEN *) mg->mg_ptr;
5898 if (cache[1] == *offsetp) {
5899 /* An exact match. */
5900 *offsetp = cache[0];
5901
5902 return;
5903 }
5904 else if (cache[1] < *offsetp) {
5905 /* We already know part of the way. */
5906 len = cache[0];
5907 s += cache[1];
5908 /* Let the below loop do the rest. */
5909 }
5910 else { /* cache[1] > *offsetp */
5911 /* We already know all of the way, now we may
5912 * be able to walk back. The same assumption
5913 * is made as in S_utf8_mg_pos(), namely that
5914 * walking backward is twice slower than
5915 * walking forward. */
5916 STRLEN forw = *offsetp;
5917 STRLEN backw = cache[1] - *offsetp;
5918
5919 if (!(forw < 2 * backw)) {
5920 U8 *p = s + cache[1];
5921 STRLEN ubackw = 0;
5922
a5b510f2
AE
5923 cache[1] -= backw;
5924
7e8c5dac
HS
5925 while (backw--) {
5926 p--;
5927 while (UTF8_IS_CONTINUATION(*p))
5928 p--;
5929 ubackw++;
5930 }
5931
5932 cache[0] -= ubackw;
7e8c5dac
HS
5933
5934 return;
5935 }
5936 }
5937 }
a0dbb045 5938 }
7e8c5dac
HS
5939
5940 while (s < send) {
5941 STRLEN n = 1;
5942
5943 /* Call utf8n_to_uvchr() to validate the sequence
5944 * (unless a simple non-UTF character) */
5945 if (!UTF8_IS_INVARIANT(*s))
5946 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
5947 if (n > 0) {
5948 s += n;
5949 len++;
5950 }
5951 else
5952 break;
5953 }
5954
5955 if (!SvREADONLY(sv)) {
5956 if (!mg) {
5957 sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
5958 mg = mg_find(sv, PERL_MAGIC_utf8);
5959 }
5960 assert(mg);
5961
5962 if (!mg->mg_ptr) {
5963 Newz(0, cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
5964 mg->mg_ptr = (char *) cache;
5965 }
5966 assert(cache);
5967
5968 cache[0] = len;
5969 cache[1] = *offsetp;
5970 }
5971
5972 *offsetp = len;
a0ed51b3 5973 }
a0ed51b3
LW
5974 return;
5975}
5976
954c1994
GS
5977/*
5978=for apidoc sv_eq
5979
5980Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
5981identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5982coerce its args to strings if necessary.
954c1994
GS
5983
5984=cut
5985*/
5986
79072805 5987I32
e01b9e88 5988Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805
LW
5989{
5990 char *pv1;
463ee0b2 5991 STRLEN cur1;
79072805 5992 char *pv2;
463ee0b2 5993 STRLEN cur2;
e01b9e88 5994 I32 eq = 0;
553e1bcc
AT
5995 char *tpv = Nullch;
5996 SV* svrecode = Nullsv;
79072805 5997
e01b9e88 5998 if (!sv1) {
79072805
LW
5999 pv1 = "";
6000 cur1 = 0;
6001 }
463ee0b2 6002 else
e01b9e88 6003 pv1 = SvPV(sv1, cur1);
79072805 6004
e01b9e88
SC
6005 if (!sv2){
6006 pv2 = "";
6007 cur2 = 0;
92d29cee 6008 }
e01b9e88
SC
6009 else
6010 pv2 = SvPV(sv2, cur2);
79072805 6011
cf48d248 6012 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6013 /* Differing utf8ness.
6014 * Do not UTF8size the comparands as a side-effect. */
6015 if (PL_encoding) {
6016 if (SvUTF8(sv1)) {
553e1bcc
AT
6017 svrecode = newSVpvn(pv2, cur2);
6018 sv_recode_to_utf8(svrecode, PL_encoding);
6019 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6020 }
6021 else {
553e1bcc
AT
6022 svrecode = newSVpvn(pv1, cur1);
6023 sv_recode_to_utf8(svrecode, PL_encoding);
6024 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6025 }
6026 /* Now both are in UTF-8. */
6027 if (cur1 != cur2)
6028 return FALSE;
6029 }
6030 else {
6031 bool is_utf8 = TRUE;
6032
6033 if (SvUTF8(sv1)) {
6034 /* sv1 is the UTF-8 one,
6035 * if is equal it must be downgrade-able */
6036 char *pv = (char*)bytes_from_utf8((U8*)pv1,
6037 &cur1, &is_utf8);
6038 if (pv != pv1)
553e1bcc 6039 pv1 = tpv = pv;
799ef3cb
JH
6040 }
6041 else {
6042 /* sv2 is the UTF-8 one,
6043 * if is equal it must be downgrade-able */
6044 char *pv = (char *)bytes_from_utf8((U8*)pv2,
6045 &cur2, &is_utf8);
6046 if (pv != pv2)
553e1bcc 6047 pv2 = tpv = pv;
799ef3cb
JH
6048 }
6049 if (is_utf8) {
6050 /* Downgrade not possible - cannot be eq */
6051 return FALSE;
6052 }
6053 }
cf48d248
JH
6054 }
6055
6056 if (cur1 == cur2)
765f542d 6057 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 6058
553e1bcc
AT
6059 if (svrecode)
6060 SvREFCNT_dec(svrecode);
799ef3cb 6061
553e1bcc
AT
6062 if (tpv)
6063 Safefree(tpv);
cf48d248 6064
e01b9e88 6065 return eq;
79072805
LW
6066}
6067
954c1994
GS
6068/*
6069=for apidoc sv_cmp
6070
6071Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
6072string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
6073C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6074coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
6075
6076=cut
6077*/
6078
79072805 6079I32
e01b9e88 6080Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 6081{
560a288e 6082 STRLEN cur1, cur2;
553e1bcc 6083 char *pv1, *pv2, *tpv = Nullch;
cf48d248 6084 I32 cmp;
553e1bcc 6085 SV *svrecode = Nullsv;
560a288e 6086
e01b9e88
SC
6087 if (!sv1) {
6088 pv1 = "";
560a288e
GS
6089 cur1 = 0;
6090 }
e01b9e88
SC
6091 else
6092 pv1 = SvPV(sv1, cur1);
560a288e 6093
553e1bcc 6094 if (!sv2) {
e01b9e88 6095 pv2 = "";
560a288e
GS
6096 cur2 = 0;
6097 }
e01b9e88
SC
6098 else
6099 pv2 = SvPV(sv2, cur2);
79072805 6100
cf48d248 6101 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6102 /* Differing utf8ness.
6103 * Do not UTF8size the comparands as a side-effect. */
cf48d248 6104 if (SvUTF8(sv1)) {
799ef3cb 6105 if (PL_encoding) {
553e1bcc
AT
6106 svrecode = newSVpvn(pv2, cur2);
6107 sv_recode_to_utf8(svrecode, PL_encoding);
6108 pv2 = SvPV(svrecode, cur2);
799ef3cb
JH
6109 }
6110 else {
553e1bcc 6111 pv2 = tpv = (char*)bytes_to_utf8((U8*)pv2, &cur2);
799ef3cb 6112 }
cf48d248
JH
6113 }
6114 else {
799ef3cb 6115 if (PL_encoding) {
553e1bcc
AT
6116 svrecode = newSVpvn(pv1, cur1);
6117 sv_recode_to_utf8(svrecode, PL_encoding);
6118 pv1 = SvPV(svrecode, cur1);
799ef3cb
JH
6119 }
6120 else {
553e1bcc 6121 pv1 = tpv = (char*)bytes_to_utf8((U8*)pv1, &cur1);
799ef3cb 6122 }
cf48d248
JH
6123 }
6124 }
6125
e01b9e88 6126 if (!cur1) {
cf48d248 6127 cmp = cur2 ? -1 : 0;
e01b9e88 6128 } else if (!cur2) {
cf48d248
JH
6129 cmp = 1;
6130 } else {
6131 I32 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
6132
6133 if (retval) {
cf48d248 6134 cmp = retval < 0 ? -1 : 1;
e01b9e88 6135 } else if (cur1 == cur2) {
cf48d248
JH
6136 cmp = 0;
6137 } else {
6138 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 6139 }
cf48d248 6140 }
16660edb 6141
553e1bcc
AT
6142 if (svrecode)
6143 SvREFCNT_dec(svrecode);
799ef3cb 6144
553e1bcc
AT
6145 if (tpv)
6146 Safefree(tpv);
cf48d248
JH
6147
6148 return cmp;
bbce6d69 6149}
16660edb 6150
c461cf8f
JH
6151/*
6152=for apidoc sv_cmp_locale
6153
645c22ef
DM
6154Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6155'use bytes' aware, handles get magic, and will coerce its args to strings
6156if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
6157
6158=cut
6159*/
6160
bbce6d69 6161I32
864dbfa3 6162Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 6163{
36477c24 6164#ifdef USE_LOCALE_COLLATE
16660edb 6165
bbce6d69 6166 char *pv1, *pv2;
6167 STRLEN len1, len2;
6168 I32 retval;
16660edb 6169
3280af22 6170 if (PL_collation_standard)
bbce6d69 6171 goto raw_compare;
16660edb 6172
bbce6d69 6173 len1 = 0;
8ac85365 6174 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 6175 len2 = 0;
8ac85365 6176 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 6177
bbce6d69 6178 if (!pv1 || !len1) {
6179 if (pv2 && len2)
6180 return -1;
6181 else
6182 goto raw_compare;
6183 }
6184 else {
6185 if (!pv2 || !len2)
6186 return 1;
6187 }
16660edb 6188
bbce6d69 6189 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 6190
bbce6d69 6191 if (retval)
16660edb 6192 return retval < 0 ? -1 : 1;
6193
bbce6d69 6194 /*
6195 * When the result of collation is equality, that doesn't mean
6196 * that there are no differences -- some locales exclude some
6197 * characters from consideration. So to avoid false equalities,
6198 * we use the raw string as a tiebreaker.
6199 */
16660edb 6200
bbce6d69 6201 raw_compare:
6202 /* FALL THROUGH */
16660edb 6203
36477c24 6204#endif /* USE_LOCALE_COLLATE */
16660edb 6205
bbce6d69 6206 return sv_cmp(sv1, sv2);
6207}
79072805 6208
645c22ef 6209
36477c24 6210#ifdef USE_LOCALE_COLLATE
645c22ef 6211
7a4c00b4 6212/*
645c22ef
DM
6213=for apidoc sv_collxfrm
6214
6215Add Collate Transform magic to an SV if it doesn't already have it.
6216
6217Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6218scalar data of the variable, but transformed to such a format that a normal
6219memory comparison can be used to compare the data according to the locale
6220settings.
6221
6222=cut
6223*/
6224
bbce6d69 6225char *
864dbfa3 6226Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 6227{
7a4c00b4 6228 MAGIC *mg;
16660edb 6229
14befaf4 6230 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 6231 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 6232 char *s, *xf;
6233 STRLEN len, xlen;
6234
7a4c00b4 6235 if (mg)
6236 Safefree(mg->mg_ptr);
bbce6d69 6237 s = SvPV(sv, len);
6238 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 6239 if (SvREADONLY(sv)) {
6240 SAVEFREEPV(xf);
6241 *nxp = xlen;
3280af22 6242 return xf + sizeof(PL_collation_ix);
ff0cee69 6243 }
7a4c00b4 6244 if (! mg) {
14befaf4
DM
6245 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
6246 mg = mg_find(sv, PERL_MAGIC_collxfrm);
7a4c00b4 6247 assert(mg);
bbce6d69 6248 }
7a4c00b4 6249 mg->mg_ptr = xf;
565764a8 6250 mg->mg_len = xlen;
7a4c00b4 6251 }
6252 else {
ff0cee69 6253 if (mg) {
6254 mg->mg_ptr = NULL;
565764a8 6255 mg->mg_len = -1;
ff0cee69 6256 }
bbce6d69 6257 }
6258 }
7a4c00b4 6259 if (mg && mg->mg_ptr) {
565764a8 6260 *nxp = mg->mg_len;
3280af22 6261 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 6262 }
6263 else {
6264 *nxp = 0;
6265 return NULL;
16660edb 6266 }
79072805
LW
6267}
6268
36477c24 6269#endif /* USE_LOCALE_COLLATE */
bbce6d69 6270
c461cf8f
JH
6271/*
6272=for apidoc sv_gets
6273
6274Get a line from the filehandle and store it into the SV, optionally
6275appending to the currently-stored string.
6276
6277=cut
6278*/
6279
79072805 6280char *
864dbfa3 6281Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 6282{
c07a80fd 6283 char *rsptr;
6284 STRLEN rslen;
6285 register STDCHAR rslast;
6286 register STDCHAR *bp;
6287 register I32 cnt;
9c5ffd7c 6288 I32 i = 0;
8bfdd7d9 6289 I32 rspara = 0;
e311fd51 6290 I32 recsize;
c07a80fd 6291
765f542d
NC
6292 SV_CHECK_THINKFIRST_COW_DROP(sv);
6293 /* XXX. If you make this PVIV, then copy on write can copy scalars read
6294 from <>.
6295 However, perlbench says it's slower, because the existing swipe code
6296 is faster than copy on write.
6297 Swings and roundabouts. */
6fc92669 6298 (void)SvUPGRADE(sv, SVt_PV);
99491443 6299
ff68c719 6300 SvSCREAM_off(sv);
efd8b2ba
AE
6301
6302 if (append) {
6303 if (PerlIO_isutf8(fp)) {
6304 if (!SvUTF8(sv)) {
6305 sv_utf8_upgrade_nomg(sv);
6306 sv_pos_u2b(sv,&append,0);
6307 }
6308 } else if (SvUTF8(sv)) {
6309 SV *tsv = NEWSV(0,0);
6310 sv_gets(tsv, fp, 0);
6311 sv_utf8_upgrade_nomg(tsv);
6312 SvCUR_set(sv,append);
6313 sv_catsv(sv,tsv);
6314 sv_free(tsv);
6315 goto return_string_or_null;
6316 }
6317 }
6318
6319 SvPOK_only(sv);
6320 if (PerlIO_isutf8(fp))
6321 SvUTF8_on(sv);
c07a80fd 6322
8bfdd7d9
HS
6323 if (PL_curcop == &PL_compiling) {
6324 /* we always read code in line mode */
6325 rsptr = "\n";
6326 rslen = 1;
6327 }
6328 else if (RsSNARF(PL_rs)) {
e468d35b
NIS
6329 /* If it is a regular disk file use size from stat() as estimate
6330 of amount we are going to read - may result in malloc-ing
6331 more memory than we realy need if layers bellow reduce
6332 size we read (e.g. CRLF or a gzip layer)
6333 */
e311fd51 6334 Stat_t st;
e468d35b
NIS
6335 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
6336 Off_t offset = PerlIO_tell(fp);
6337 if (offset != (Off_t) -1) {
6338 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6339 }
6340 }
c07a80fd 6341 rsptr = NULL;
6342 rslen = 0;
6343 }
3280af22 6344 else if (RsRECORD(PL_rs)) {
e311fd51 6345 I32 bytesread;
5b2b9c68
HM
6346 char *buffer;
6347
6348 /* Grab the size of the record we're getting */
3280af22 6349 recsize = SvIV(SvRV(PL_rs));
e311fd51 6350 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
6351 /* Go yank in */
6352#ifdef VMS
6353 /* VMS wants read instead of fread, because fread doesn't respect */
6354 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
6355 /* doing, but we've got no other real choice - except avoid stdio
6356 as implementation - perhaps write a :vms layer ?
6357 */
5b2b9c68
HM
6358 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
6359#else
6360 bytesread = PerlIO_read(fp, buffer, recsize);
6361#endif
e311fd51 6362 SvCUR_set(sv, bytesread += append);
e670df4e 6363 buffer[bytesread] = '\0';
efd8b2ba 6364 goto return_string_or_null;
5b2b9c68 6365 }
3280af22 6366 else if (RsPARA(PL_rs)) {
c07a80fd 6367 rsptr = "\n\n";
6368 rslen = 2;
8bfdd7d9 6369 rspara = 1;
c07a80fd 6370 }
7d59b7e4
NIS
6371 else {
6372 /* Get $/ i.e. PL_rs into same encoding as stream wants */
6373 if (PerlIO_isutf8(fp)) {
6374 rsptr = SvPVutf8(PL_rs, rslen);
6375 }
6376 else {
6377 if (SvUTF8(PL_rs)) {
6378 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
6379 Perl_croak(aTHX_ "Wide character in $/");
6380 }
6381 }
6382 rsptr = SvPV(PL_rs, rslen);
6383 }
6384 }
6385
c07a80fd 6386 rslast = rslen ? rsptr[rslen - 1] : '\0';
6387
8bfdd7d9 6388 if (rspara) { /* have to do this both before and after */
79072805 6389 do { /* to make sure file boundaries work right */
760ac839 6390 if (PerlIO_eof(fp))
a0d0e21e 6391 return 0;
760ac839 6392 i = PerlIO_getc(fp);
79072805 6393 if (i != '\n') {
a0d0e21e
LW
6394 if (i == -1)
6395 return 0;
760ac839 6396 PerlIO_ungetc(fp,i);
79072805
LW
6397 break;
6398 }
6399 } while (i != EOF);
6400 }
c07a80fd 6401
760ac839
LW
6402 /* See if we know enough about I/O mechanism to cheat it ! */
6403
6404 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 6405 of abstracting out stdio interface. One call should be cheap
760ac839
LW
6406 enough here - and may even be a macro allowing compile
6407 time optimization.
6408 */
6409
6410 if (PerlIO_fast_gets(fp)) {
6411
6412 /*
6413 * We're going to steal some values from the stdio struct
6414 * and put EVERYTHING in the innermost loop into registers.
6415 */
6416 register STDCHAR *ptr;
6417 STRLEN bpx;
6418 I32 shortbuffered;
6419
16660edb 6420#if defined(VMS) && defined(PERLIO_IS_STDIO)
6421 /* An ungetc()d char is handled separately from the regular
6422 * buffer, so we getc() it back out and stuff it in the buffer.
6423 */
6424 i = PerlIO_getc(fp);
6425 if (i == EOF) return 0;
6426 *(--((*fp)->_ptr)) = (unsigned char) i;
6427 (*fp)->_cnt++;
6428#endif
c07a80fd 6429
c2960299 6430 /* Here is some breathtakingly efficient cheating */
c07a80fd 6431
a20bf0c3 6432 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b
NIS
6433 /* make sure we have the room */
6434 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
6435 /* Not room for all of it
6436 if we are looking for a separator and room for some
6437 */
6438 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
6439 /* just process what we have room for */
79072805
LW
6440 shortbuffered = cnt - SvLEN(sv) + append + 1;
6441 cnt -= shortbuffered;
6442 }
6443 else {
6444 shortbuffered = 0;
bbce6d69 6445 /* remember that cnt can be negative */
eb160463 6446 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
6447 }
6448 }
e468d35b 6449 else
79072805 6450 shortbuffered = 0;
c07a80fd 6451 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
a20bf0c3 6452 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 6453 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6454 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 6455 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 6456 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6457 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6458 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
6459 for (;;) {
6460 screamer:
93a17b20 6461 if (cnt > 0) {
c07a80fd 6462 if (rslen) {
760ac839
LW
6463 while (cnt > 0) { /* this | eat */
6464 cnt--;
c07a80fd 6465 if ((*bp++ = *ptr++) == rslast) /* really | dust */
6466 goto thats_all_folks; /* screams | sed :-) */
6467 }
6468 }
6469 else {
1c846c1f
NIS
6470 Copy(ptr, bp, cnt, char); /* this | eat */
6471 bp += cnt; /* screams | dust */
c07a80fd 6472 ptr += cnt; /* louder | sed :-) */
a5f75d66 6473 cnt = 0;
93a17b20 6474 }
79072805
LW
6475 }
6476
748a9306 6477 if (shortbuffered) { /* oh well, must extend */
79072805
LW
6478 cnt = shortbuffered;
6479 shortbuffered = 0;
c07a80fd 6480 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
6481 SvCUR_set(sv, bpx);
6482 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 6483 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
6484 continue;
6485 }
6486
16660edb 6487 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
6488 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
6489 PTR2UV(ptr),(long)cnt));
cc00df79 6490 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 6491#if 0
16660edb 6492 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6493 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6494 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6495 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6496#endif
1c846c1f 6497 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 6498 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
6499 another abstraction. */
760ac839 6500 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 6501#if 0
16660edb 6502 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6503 "Screamer: post: 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
a20bf0c3
JH
6507 cnt = PerlIO_get_cnt(fp);
6508 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 6509 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6510 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 6511
748a9306
LW
6512 if (i == EOF) /* all done for ever? */
6513 goto thats_really_all_folks;
6514
c07a80fd 6515 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
6516 SvCUR_set(sv, bpx);
6517 SvGROW(sv, bpx + cnt + 2);
c07a80fd 6518 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
6519
eb160463 6520 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 6521
c07a80fd 6522 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 6523 goto thats_all_folks;
79072805
LW
6524 }
6525
6526thats_all_folks:
eb160463 6527 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX(sv)) < rslen) ||
36477c24 6528 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 6529 goto screamer; /* go back to the fray */
79072805
LW
6530thats_really_all_folks:
6531 if (shortbuffered)
6532 cnt += shortbuffered;
16660edb 6533 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6534 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 6535 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 6536 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6537 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6538 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6539 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 6540 *bp = '\0';
760ac839 6541 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 6542 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 6543 "Screamer: done, len=%ld, string=|%.*s|\n",
6544 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
6545 }
6546 else
79072805 6547 {
4d2c4e07 6548#ifndef EPOC
760ac839 6549 /*The big, slow, and stupid way */
c07a80fd 6550 STDCHAR buf[8192];
4d2c4e07
OF
6551#else
6552 /* Need to work around EPOC SDK features */
6553 /* On WINS: MS VC5 generates calls to _chkstk, */
6554 /* if a `large' stack frame is allocated */
6555 /* gcc on MARM does not generate calls like these */
6556 STDCHAR buf[1024];
6557#endif
79072805 6558
760ac839 6559screamer2:
c07a80fd 6560 if (rslen) {
760ac839
LW
6561 register STDCHAR *bpe = buf + sizeof(buf);
6562 bp = buf;
eb160463 6563 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
6564 ; /* keep reading */
6565 cnt = bp - buf;
c07a80fd 6566 }
6567 else {
760ac839 6568 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 6569 /* Accomodate broken VAXC compiler, which applies U8 cast to
6570 * both args of ?: operator, causing EOF to change into 255
6571 */
37be0adf 6572 if (cnt > 0)
cbe9e203
JH
6573 i = (U8)buf[cnt - 1];
6574 else
37be0adf 6575 i = EOF;
c07a80fd 6576 }
79072805 6577
cbe9e203
JH
6578 if (cnt < 0)
6579 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
6580 if (append)
6581 sv_catpvn(sv, (char *) buf, cnt);
6582 else
6583 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 6584
6585 if (i != EOF && /* joy */
6586 (!rslen ||
6587 SvCUR(sv) < rslen ||
36477c24 6588 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
6589 {
6590 append = -1;
63e4d877
CS
6591 /*
6592 * If we're reading from a TTY and we get a short read,
6593 * indicating that the user hit his EOF character, we need
6594 * to notice it now, because if we try to read from the TTY
6595 * again, the EOF condition will disappear.
6596 *
6597 * The comparison of cnt to sizeof(buf) is an optimization
6598 * that prevents unnecessary calls to feof().
6599 *
6600 * - jik 9/25/96
6601 */
6602 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
6603 goto screamer2;
79072805
LW
6604 }
6605 }
6606
8bfdd7d9 6607 if (rspara) { /* have to do this both before and after */
c07a80fd 6608 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 6609 i = PerlIO_getc(fp);
79072805 6610 if (i != '\n') {
760ac839 6611 PerlIO_ungetc(fp,i);
79072805
LW
6612 break;
6613 }
6614 }
6615 }
c07a80fd 6616
efd8b2ba 6617return_string_or_null:
c07a80fd 6618 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
6619}
6620
954c1994
GS
6621/*
6622=for apidoc sv_inc
6623
645c22ef
DM
6624Auto-increment of the value in the SV, doing string to numeric conversion
6625if necessary. Handles 'get' magic.
954c1994
GS
6626
6627=cut
6628*/
6629
79072805 6630void
864dbfa3 6631Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
6632{
6633 register char *d;
463ee0b2 6634 int flags;
79072805
LW
6635
6636 if (!sv)
6637 return;
b23a5f78
GB
6638 if (SvGMAGICAL(sv))
6639 mg_get(sv);
ed6116ce 6640 if (SvTHINKFIRST(sv)) {
765f542d
NC
6641 if (SvIsCOW(sv))
6642 sv_force_normal_flags(sv, 0);
0f15f207 6643 if (SvREADONLY(sv)) {
3280af22 6644 if (PL_curcop != &PL_compiling)
cea2e8a9 6645 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6646 }
a0d0e21e 6647 if (SvROK(sv)) {
b5be31e9 6648 IV i;
9e7bc3e8
JD
6649 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
6650 return;
56431972 6651 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6652 sv_unref(sv);
6653 sv_setiv(sv, i);
a0d0e21e 6654 }
ed6116ce 6655 }
8990e307 6656 flags = SvFLAGS(sv);
28e5dec8
JH
6657 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
6658 /* It's (privately or publicly) a float, but not tested as an
6659 integer, so test it to see. */
d460ef45 6660 (void) SvIV(sv);
28e5dec8
JH
6661 flags = SvFLAGS(sv);
6662 }
6663 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6664 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6665#ifdef PERL_PRESERVE_IVUV
28e5dec8 6666 oops_its_int:
59d8ce62 6667#endif
25da4f38
IZ
6668 if (SvIsUV(sv)) {
6669 if (SvUVX(sv) == UV_MAX)
a1e868e7 6670 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
6671 else
6672 (void)SvIOK_only_UV(sv);
6673 ++SvUVX(sv);
6674 } else {
6675 if (SvIVX(sv) == IV_MAX)
28e5dec8 6676 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
6677 else {
6678 (void)SvIOK_only(sv);
6679 ++SvIVX(sv);
1c846c1f 6680 }
55497cff 6681 }
79072805
LW
6682 return;
6683 }
28e5dec8
JH
6684 if (flags & SVp_NOK) {
6685 (void)SvNOK_only(sv);
6686 SvNVX(sv) += 1.0;
6687 return;
6688 }
6689
8990e307 6690 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
28e5dec8
JH
6691 if ((flags & SVTYPEMASK) < SVt_PVIV)
6692 sv_upgrade(sv, SVt_IV);
6693 (void)SvIOK_only(sv);
6694 SvIVX(sv) = 1;
79072805
LW
6695 return;
6696 }
463ee0b2 6697 d = SvPVX(sv);
79072805
LW
6698 while (isALPHA(*d)) d++;
6699 while (isDIGIT(*d)) d++;
6700 if (*d) {
28e5dec8 6701#ifdef PERL_PRESERVE_IVUV
d1be9408 6702 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
6703 warnings. Probably ought to make the sv_iv_please() that does
6704 the conversion if possible, and silently. */
c2988b20 6705 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
6706 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6707 /* Need to try really hard to see if it's an integer.
6708 9.22337203685478e+18 is an integer.
6709 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6710 so $a="9.22337203685478e+18"; $a+0; $a++
6711 needs to be the same as $a="9.22337203685478e+18"; $a++
6712 or we go insane. */
d460ef45 6713
28e5dec8
JH
6714 (void) sv_2iv(sv);
6715 if (SvIOK(sv))
6716 goto oops_its_int;
6717
6718 /* sv_2iv *should* have made this an NV */
6719 if (flags & SVp_NOK) {
6720 (void)SvNOK_only(sv);
6721 SvNVX(sv) += 1.0;
6722 return;
6723 }
6724 /* I don't think we can get here. Maybe I should assert this
6725 And if we do get here I suspect that sv_setnv will croak. NWC
6726 Fall through. */
6727#if defined(USE_LONG_DOUBLE)
6728 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",
6729 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6730#else
1779d84d 6731 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
6732 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6733#endif
6734 }
6735#endif /* PERL_PRESERVE_IVUV */
6736 sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
79072805
LW
6737 return;
6738 }
6739 d--;
463ee0b2 6740 while (d >= SvPVX(sv)) {
79072805
LW
6741 if (isDIGIT(*d)) {
6742 if (++*d <= '9')
6743 return;
6744 *(d--) = '0';
6745 }
6746 else {
9d116dd7
JH
6747#ifdef EBCDIC
6748 /* MKS: The original code here died if letters weren't consecutive.
6749 * at least it didn't have to worry about non-C locales. The
6750 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 6751 * arranged in order (although not consecutively) and that only
9d116dd7
JH
6752 * [A-Za-z] are accepted by isALPHA in the C locale.
6753 */
6754 if (*d != 'z' && *d != 'Z') {
6755 do { ++*d; } while (!isALPHA(*d));
6756 return;
6757 }
6758 *(d--) -= 'z' - 'a';
6759#else
79072805
LW
6760 ++*d;
6761 if (isALPHA(*d))
6762 return;
6763 *(d--) -= 'z' - 'a' + 1;
9d116dd7 6764#endif
79072805
LW
6765 }
6766 }
6767 /* oh,oh, the number grew */
6768 SvGROW(sv, SvCUR(sv) + 2);
6769 SvCUR(sv)++;
463ee0b2 6770 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
6771 *d = d[-1];
6772 if (isDIGIT(d[1]))
6773 *d = '1';
6774 else
6775 *d = d[1];
6776}
6777
954c1994
GS
6778/*
6779=for apidoc sv_dec
6780
645c22ef
DM
6781Auto-decrement of the value in the SV, doing string to numeric conversion
6782if necessary. Handles 'get' magic.
954c1994
GS
6783
6784=cut
6785*/
6786
79072805 6787void
864dbfa3 6788Perl_sv_dec(pTHX_ register SV *sv)
79072805 6789{
463ee0b2
LW
6790 int flags;
6791
79072805
LW
6792 if (!sv)
6793 return;
b23a5f78
GB
6794 if (SvGMAGICAL(sv))
6795 mg_get(sv);
ed6116ce 6796 if (SvTHINKFIRST(sv)) {
765f542d
NC
6797 if (SvIsCOW(sv))
6798 sv_force_normal_flags(sv, 0);
0f15f207 6799 if (SvREADONLY(sv)) {
3280af22 6800 if (PL_curcop != &PL_compiling)
cea2e8a9 6801 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6802 }
a0d0e21e 6803 if (SvROK(sv)) {
b5be31e9 6804 IV i;
9e7bc3e8
JD
6805 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6806 return;
56431972 6807 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6808 sv_unref(sv);
6809 sv_setiv(sv, i);
a0d0e21e 6810 }
ed6116ce 6811 }
28e5dec8
JH
6812 /* Unlike sv_inc we don't have to worry about string-never-numbers
6813 and keeping them magic. But we mustn't warn on punting */
8990e307 6814 flags = SvFLAGS(sv);
28e5dec8
JH
6815 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6816 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6817#ifdef PERL_PRESERVE_IVUV
28e5dec8 6818 oops_its_int:
59d8ce62 6819#endif
25da4f38
IZ
6820 if (SvIsUV(sv)) {
6821 if (SvUVX(sv) == 0) {
6822 (void)SvIOK_only(sv);
6823 SvIVX(sv) = -1;
6824 }
6825 else {
6826 (void)SvIOK_only_UV(sv);
6827 --SvUVX(sv);
1c846c1f 6828 }
25da4f38
IZ
6829 } else {
6830 if (SvIVX(sv) == IV_MIN)
65202027 6831 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
6832 else {
6833 (void)SvIOK_only(sv);
6834 --SvIVX(sv);
1c846c1f 6835 }
55497cff 6836 }
6837 return;
6838 }
28e5dec8
JH
6839 if (flags & SVp_NOK) {
6840 SvNVX(sv) -= 1.0;
6841 (void)SvNOK_only(sv);
6842 return;
6843 }
8990e307 6844 if (!(flags & SVp_POK)) {
4633a7c4
LW
6845 if ((flags & SVTYPEMASK) < SVt_PVNV)
6846 sv_upgrade(sv, SVt_NV);
463ee0b2 6847 SvNVX(sv) = -1.0;
a0d0e21e 6848 (void)SvNOK_only(sv);
79072805
LW
6849 return;
6850 }
28e5dec8
JH
6851#ifdef PERL_PRESERVE_IVUV
6852 {
c2988b20 6853 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
6854 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6855 /* Need to try really hard to see if it's an integer.
6856 9.22337203685478e+18 is an integer.
6857 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6858 so $a="9.22337203685478e+18"; $a+0; $a--
6859 needs to be the same as $a="9.22337203685478e+18"; $a--
6860 or we go insane. */
d460ef45 6861
28e5dec8
JH
6862 (void) sv_2iv(sv);
6863 if (SvIOK(sv))
6864 goto oops_its_int;
6865
6866 /* sv_2iv *should* have made this an NV */
6867 if (flags & SVp_NOK) {
6868 (void)SvNOK_only(sv);
6869 SvNVX(sv) -= 1.0;
6870 return;
6871 }
6872 /* I don't think we can get here. Maybe I should assert this
6873 And if we do get here I suspect that sv_setnv will croak. NWC
6874 Fall through. */
6875#if defined(USE_LONG_DOUBLE)
6876 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",
6877 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6878#else
1779d84d 6879 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
6880 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6881#endif
6882 }
6883 }
6884#endif /* PERL_PRESERVE_IVUV */
097ee67d 6885 sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
6886}
6887
954c1994
GS
6888/*
6889=for apidoc sv_mortalcopy
6890
645c22ef 6891Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
6892The new SV is marked as mortal. It will be destroyed "soon", either by an
6893explicit call to FREETMPS, or by an implicit call at places such as
6894statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
6895
6896=cut
6897*/
6898
79072805
LW
6899/* Make a string that will exist for the duration of the expression
6900 * evaluation. Actually, it may have to last longer than that, but
6901 * hopefully we won't free it until it has been assigned to a
6902 * permanent location. */
6903
6904SV *
864dbfa3 6905Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 6906{
463ee0b2 6907 register SV *sv;
b881518d 6908
4561caa4 6909 new_SV(sv);
79072805 6910 sv_setsv(sv,oldstr);
677b06e3
GS
6911 EXTEND_MORTAL(1);
6912 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
6913 SvTEMP_on(sv);
6914 return sv;
6915}
6916
954c1994
GS
6917/*
6918=for apidoc sv_newmortal
6919
645c22ef 6920Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
6921set to 1. It will be destroyed "soon", either by an explicit call to
6922FREETMPS, or by an implicit call at places such as statement boundaries.
6923See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
6924
6925=cut
6926*/
6927
8990e307 6928SV *
864dbfa3 6929Perl_sv_newmortal(pTHX)
8990e307
LW
6930{
6931 register SV *sv;
6932
4561caa4 6933 new_SV(sv);
8990e307 6934 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
6935 EXTEND_MORTAL(1);
6936 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
6937 return sv;
6938}
6939
954c1994
GS
6940/*
6941=for apidoc sv_2mortal
6942
d4236ebc
DM
6943Marks an existing SV as mortal. The SV will be destroyed "soon", either
6944by an explicit call to FREETMPS, or by an implicit call at places such as
6945statement boundaries. See also C<sv_newmortal> and C<sv_mortalcopy>.
954c1994
GS
6946
6947=cut
6948*/
6949
79072805 6950SV *
864dbfa3 6951Perl_sv_2mortal(pTHX_ register SV *sv)
79072805
LW
6952{
6953 if (!sv)
6954 return sv;
d689ffdd 6955 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 6956 return sv;
677b06e3
GS
6957 EXTEND_MORTAL(1);
6958 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 6959 SvTEMP_on(sv);
79072805
LW
6960 return sv;
6961}
6962
954c1994
GS
6963/*
6964=for apidoc newSVpv
6965
6966Creates a new SV and copies a string into it. The reference count for the
6967SV is set to 1. If C<len> is zero, Perl will compute the length using
6968strlen(). For efficiency, consider using C<newSVpvn> instead.
6969
6970=cut
6971*/
6972
79072805 6973SV *
864dbfa3 6974Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 6975{
463ee0b2 6976 register SV *sv;
79072805 6977
4561caa4 6978 new_SV(sv);
79072805
LW
6979 if (!len)
6980 len = strlen(s);
6981 sv_setpvn(sv,s,len);
6982 return sv;
6983}
6984
954c1994
GS
6985/*
6986=for apidoc newSVpvn
6987
6988Creates a new SV and copies a string into it. The reference count for the
1c846c1f 6989SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994
GS
6990string. You are responsible for ensuring that the source string is at least
6991C<len> bytes long.
6992
6993=cut
6994*/
6995
9da1e3b5 6996SV *
864dbfa3 6997Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
6998{
6999 register SV *sv;
7000
7001 new_SV(sv);
9da1e3b5
MUN
7002 sv_setpvn(sv,s,len);
7003 return sv;
7004}
7005
1c846c1f
NIS
7006/*
7007=for apidoc newSVpvn_share
7008
645c22ef
DM
7009Creates a new SV with its SvPVX pointing to a shared string in the string
7010table. If the string does not already exist in the table, it is created
7011first. Turns on READONLY and FAKE. The string's hash is stored in the UV
7012slot of the SV; if the C<hash> parameter is non-zero, that value is used;
7013otherwise the hash is computed. The idea here is that as the string table
7014is used for shared hash keys these strings will have SvPVX == HeKEY and
7015hash lookup will avoid string compare.
1c846c1f
NIS
7016
7017=cut
7018*/
7019
7020SV *
c3654f1a 7021Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
7022{
7023 register SV *sv;
c3654f1a
IH
7024 bool is_utf8 = FALSE;
7025 if (len < 0) {
77caf834 7026 STRLEN tmplen = -len;
c3654f1a 7027 is_utf8 = TRUE;
75a54232
JH
7028 /* See the note in hv.c:hv_fetch() --jhi */
7029 src = (char*)bytes_from_utf8((U8*)src, &tmplen, &is_utf8);
7030 len = tmplen;
7031 }
1c846c1f 7032 if (!hash)
5afd6d42 7033 PERL_HASH(hash, src, len);
1c846c1f
NIS
7034 new_SV(sv);
7035 sv_upgrade(sv, SVt_PVIV);
c3654f1a 7036 SvPVX(sv) = sharepvn(src, is_utf8?-len:len, hash);
1c846c1f
NIS
7037 SvCUR(sv) = len;
7038 SvUVX(sv) = hash;
7039 SvLEN(sv) = 0;
7040 SvREADONLY_on(sv);
7041 SvFAKE_on(sv);
7042 SvPOK_on(sv);
c3654f1a
IH
7043 if (is_utf8)
7044 SvUTF8_on(sv);
1c846c1f
NIS
7045 return sv;
7046}
7047
645c22ef 7048
cea2e8a9 7049#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7050
7051/* pTHX_ magic can't cope with varargs, so this is a no-context
7052 * version of the main function, (which may itself be aliased to us).
7053 * Don't access this version directly.
7054 */
7055
46fc3d4c 7056SV *
cea2e8a9 7057Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 7058{
cea2e8a9 7059 dTHX;
46fc3d4c 7060 register SV *sv;
7061 va_list args;
46fc3d4c 7062 va_start(args, pat);
c5be433b 7063 sv = vnewSVpvf(pat, &args);
46fc3d4c 7064 va_end(args);
7065 return sv;
7066}
cea2e8a9 7067#endif
46fc3d4c 7068
954c1994
GS
7069/*
7070=for apidoc newSVpvf
7071
645c22ef 7072Creates a new SV and initializes it with the string formatted like
954c1994
GS
7073C<sprintf>.
7074
7075=cut
7076*/
7077
cea2e8a9
GS
7078SV *
7079Perl_newSVpvf(pTHX_ const char* pat, ...)
7080{
7081 register SV *sv;
7082 va_list args;
cea2e8a9 7083 va_start(args, pat);
c5be433b 7084 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
7085 va_end(args);
7086 return sv;
7087}
46fc3d4c 7088
645c22ef
DM
7089/* backend for newSVpvf() and newSVpvf_nocontext() */
7090
79072805 7091SV *
c5be433b
GS
7092Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
7093{
7094 register SV *sv;
7095 new_SV(sv);
7096 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7097 return sv;
7098}
7099
954c1994
GS
7100/*
7101=for apidoc newSVnv
7102
7103Creates a new SV and copies a floating point value into it.
7104The reference count for the SV is set to 1.
7105
7106=cut
7107*/
7108
c5be433b 7109SV *
65202027 7110Perl_newSVnv(pTHX_ NV n)
79072805 7111{
463ee0b2 7112 register SV *sv;
79072805 7113
4561caa4 7114 new_SV(sv);
79072805
LW
7115 sv_setnv(sv,n);
7116 return sv;
7117}
7118
954c1994
GS
7119/*
7120=for apidoc newSViv
7121
7122Creates a new SV and copies an integer into it. The reference count for the
7123SV is set to 1.
7124
7125=cut
7126*/
7127
79072805 7128SV *
864dbfa3 7129Perl_newSViv(pTHX_ IV i)
79072805 7130{
463ee0b2 7131 register SV *sv;
79072805 7132
4561caa4 7133 new_SV(sv);
79072805
LW
7134 sv_setiv(sv,i);
7135 return sv;
7136}
7137
954c1994 7138/*
1a3327fb
JH
7139=for apidoc newSVuv
7140
7141Creates a new SV and copies an unsigned integer into it.
7142The reference count for the SV is set to 1.
7143
7144=cut
7145*/
7146
7147SV *
7148Perl_newSVuv(pTHX_ UV u)
7149{
7150 register SV *sv;
7151
7152 new_SV(sv);
7153 sv_setuv(sv,u);
7154 return sv;
7155}
7156
7157/*
954c1994
GS
7158=for apidoc newRV_noinc
7159
7160Creates an RV wrapper for an SV. The reference count for the original
7161SV is B<not> incremented.
7162
7163=cut
7164*/
7165
2304df62 7166SV *
864dbfa3 7167Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
7168{
7169 register SV *sv;
7170
4561caa4 7171 new_SV(sv);
2304df62 7172 sv_upgrade(sv, SVt_RV);
76e3520e 7173 SvTEMP_off(tmpRef);
d689ffdd 7174 SvRV(sv) = tmpRef;
2304df62 7175 SvROK_on(sv);
2304df62
AD
7176 return sv;
7177}
7178
ff276b08 7179/* newRV_inc is the official function name to use now.
645c22ef
DM
7180 * newRV_inc is in fact #defined to newRV in sv.h
7181 */
7182
5f05dabc 7183SV *
864dbfa3 7184Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 7185{
5f6447b6 7186 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 7187}
5f05dabc 7188
954c1994
GS
7189/*
7190=for apidoc newSVsv
7191
7192Creates a new SV which is an exact duplicate of the original SV.
645c22ef 7193(Uses C<sv_setsv>).
954c1994
GS
7194
7195=cut
7196*/
7197
79072805 7198SV *
864dbfa3 7199Perl_newSVsv(pTHX_ register SV *old)
79072805 7200{
463ee0b2 7201 register SV *sv;
79072805
LW
7202
7203 if (!old)
7204 return Nullsv;
8990e307 7205 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 7206 if (ckWARN_d(WARN_INTERNAL))
9014280d 7207 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
79072805
LW
7208 return Nullsv;
7209 }
4561caa4 7210 new_SV(sv);
ff68c719 7211 if (SvTEMP(old)) {
7212 SvTEMP_off(old);
463ee0b2 7213 sv_setsv(sv,old);
ff68c719 7214 SvTEMP_on(old);
79072805
LW
7215 }
7216 else
463ee0b2
LW
7217 sv_setsv(sv,old);
7218 return sv;
79072805
LW
7219}
7220
645c22ef
DM
7221/*
7222=for apidoc sv_reset
7223
7224Underlying implementation for the C<reset> Perl function.
7225Note that the perl-level function is vaguely deprecated.
7226
7227=cut
7228*/
7229
79072805 7230void
864dbfa3 7231Perl_sv_reset(pTHX_ register char *s, HV *stash)
79072805
LW
7232{
7233 register HE *entry;
7234 register GV *gv;
7235 register SV *sv;
7236 register I32 i;
7237 register PMOP *pm;
7238 register I32 max;
4802d5d7 7239 char todo[PERL_UCHAR_MAX+1];
79072805 7240
49d8d3a1
MB
7241 if (!stash)
7242 return;
7243
79072805
LW
7244 if (!*s) { /* reset ?? searches */
7245 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
48c036b1 7246 pm->op_pmdynflags &= ~PMdf_USED;
79072805
LW
7247 }
7248 return;
7249 }
7250
7251 /* reset variables */
7252
7253 if (!HvARRAY(stash))
7254 return;
463ee0b2
LW
7255
7256 Zero(todo, 256, char);
79072805 7257 while (*s) {
4802d5d7 7258 i = (unsigned char)*s;
79072805
LW
7259 if (s[1] == '-') {
7260 s += 2;
7261 }
4802d5d7 7262 max = (unsigned char)*s++;
79072805 7263 for ( ; i <= max; i++) {
463ee0b2
LW
7264 todo[i] = 1;
7265 }
a0d0e21e 7266 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 7267 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7268 entry;
7269 entry = HeNEXT(entry))
7270 {
1edc1566 7271 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7272 continue;
1edc1566 7273 gv = (GV*)HeVAL(entry);
79072805 7274 sv = GvSV(gv);
9e35f4b3
GS
7275 if (SvTHINKFIRST(sv)) {
7276 if (!SvREADONLY(sv) && SvROK(sv))
7277 sv_unref(sv);
7278 continue;
7279 }
a0d0e21e 7280 (void)SvOK_off(sv);
79072805
LW
7281 if (SvTYPE(sv) >= SVt_PV) {
7282 SvCUR_set(sv, 0);
463ee0b2
LW
7283 if (SvPVX(sv) != Nullch)
7284 *SvPVX(sv) = '\0';
44a8e56a 7285 SvTAINT(sv);
79072805
LW
7286 }
7287 if (GvAV(gv)) {
7288 av_clear(GvAV(gv));
7289 }
44a8e56a 7290 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
463ee0b2 7291 hv_clear(GvHV(gv));
fa6a1c44 7292#ifdef USE_ENVIRON_ARRAY
4efc5df6
GS
7293 if (gv == PL_envgv
7294# ifdef USE_ITHREADS
7295 && PL_curinterp == aTHX
7296# endif
7297 )
7298 {
79072805 7299 environ[0] = Nullch;
4efc5df6 7300 }
a0d0e21e 7301#endif
79072805
LW
7302 }
7303 }
7304 }
7305 }
7306}
7307
645c22ef
DM
7308/*
7309=for apidoc sv_2io
7310
7311Using various gambits, try to get an IO from an SV: the IO slot if its a
7312GV; or the recursive result if we're an RV; or the IO slot of the symbol
7313named after the PV if we're a string.
7314
7315=cut
7316*/
7317
46fc3d4c 7318IO*
864dbfa3 7319Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 7320{
7321 IO* io;
7322 GV* gv;
2d8e6c8d 7323 STRLEN n_a;
46fc3d4c 7324
7325 switch (SvTYPE(sv)) {
7326 case SVt_PVIO:
7327 io = (IO*)sv;
7328 break;
7329 case SVt_PVGV:
7330 gv = (GV*)sv;
7331 io = GvIO(gv);
7332 if (!io)
cea2e8a9 7333 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 7334 break;
7335 default:
7336 if (!SvOK(sv))
cea2e8a9 7337 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 7338 if (SvROK(sv))
7339 return sv_2io(SvRV(sv));
2d8e6c8d 7340 gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
46fc3d4c 7341 if (gv)
7342 io = GvIO(gv);
7343 else
7344 io = 0;
7345 if (!io)
35c1215d 7346 Perl_croak(aTHX_ "Bad filehandle: %"SVf, sv);
46fc3d4c 7347 break;
7348 }
7349 return io;
7350}
7351
645c22ef
DM
7352/*
7353=for apidoc sv_2cv
7354
7355Using various gambits, try to get a CV from an SV; in addition, try if
7356possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
7357
7358=cut
7359*/
7360
79072805 7361CV *
864dbfa3 7362Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 7363{
c04a4dfe
JH
7364 GV *gv = Nullgv;
7365 CV *cv = Nullcv;
2d8e6c8d 7366 STRLEN n_a;
79072805
LW
7367
7368 if (!sv)
93a17b20 7369 return *gvp = Nullgv, Nullcv;
79072805 7370 switch (SvTYPE(sv)) {
79072805
LW
7371 case SVt_PVCV:
7372 *st = CvSTASH(sv);
7373 *gvp = Nullgv;
7374 return (CV*)sv;
7375 case SVt_PVHV:
7376 case SVt_PVAV:
7377 *gvp = Nullgv;
7378 return Nullcv;
8990e307
LW
7379 case SVt_PVGV:
7380 gv = (GV*)sv;
a0d0e21e 7381 *gvp = gv;
8990e307
LW
7382 *st = GvESTASH(gv);
7383 goto fix_gv;
7384
79072805 7385 default:
a0d0e21e
LW
7386 if (SvGMAGICAL(sv))
7387 mg_get(sv);
7388 if (SvROK(sv)) {
f5284f61
IZ
7389 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
7390 tryAMAGICunDEREF(to_cv);
7391
62f274bf
GS
7392 sv = SvRV(sv);
7393 if (SvTYPE(sv) == SVt_PVCV) {
7394 cv = (CV*)sv;
7395 *gvp = Nullgv;
7396 *st = CvSTASH(cv);
7397 return cv;
7398 }
7399 else if(isGV(sv))
7400 gv = (GV*)sv;
7401 else
cea2e8a9 7402 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 7403 }
62f274bf 7404 else if (isGV(sv))
79072805
LW
7405 gv = (GV*)sv;
7406 else
2d8e6c8d 7407 gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
79072805
LW
7408 *gvp = gv;
7409 if (!gv)
7410 return Nullcv;
7411 *st = GvESTASH(gv);
8990e307 7412 fix_gv:
8ebc5c01 7413 if (lref && !GvCVu(gv)) {
4633a7c4 7414 SV *tmpsv;
748a9306 7415 ENTER;
4633a7c4 7416 tmpsv = NEWSV(704,0);
16660edb 7417 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
7418 /* XXX this is probably not what they think they're getting.
7419 * It has the same effect as "sub name;", i.e. just a forward
7420 * declaration! */
774d564b 7421 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
7422 newSVOP(OP_CONST, 0, tmpsv),
7423 Nullop,
8990e307 7424 Nullop);
748a9306 7425 LEAVE;
8ebc5c01 7426 if (!GvCVu(gv))
35c1215d
NC
7427 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
7428 sv);
8990e307 7429 }
8ebc5c01 7430 return GvCVu(gv);
79072805
LW
7431 }
7432}
7433
c461cf8f
JH
7434/*
7435=for apidoc sv_true
7436
7437Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
7438Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
7439instead use an in-line version.
c461cf8f
JH
7440
7441=cut
7442*/
7443
79072805 7444I32
864dbfa3 7445Perl_sv_true(pTHX_ register SV *sv)
79072805 7446{
8990e307
LW
7447 if (!sv)
7448 return 0;
79072805 7449 if (SvPOK(sv)) {
4e35701f
NIS
7450 register XPV* tXpv;
7451 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 7452 (tXpv->xpv_cur > 1 ||
4e35701f 7453 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
79072805
LW
7454 return 1;
7455 else
7456 return 0;
7457 }
7458 else {
7459 if (SvIOK(sv))
463ee0b2 7460 return SvIVX(sv) != 0;
79072805
LW
7461 else {
7462 if (SvNOK(sv))
463ee0b2 7463 return SvNVX(sv) != 0.0;
79072805 7464 else
463ee0b2 7465 return sv_2bool(sv);
79072805
LW
7466 }
7467 }
7468}
79072805 7469
645c22ef
DM
7470/*
7471=for apidoc sv_iv
7472
7473A private implementation of the C<SvIVx> macro for compilers which can't
7474cope with complex macro expressions. Always use the macro instead.
7475
7476=cut
7477*/
7478
ff68c719 7479IV
864dbfa3 7480Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 7481{
25da4f38
IZ
7482 if (SvIOK(sv)) {
7483 if (SvIsUV(sv))
7484 return (IV)SvUVX(sv);
ff68c719 7485 return SvIVX(sv);
25da4f38 7486 }
ff68c719 7487 return sv_2iv(sv);
85e6fe83 7488}
85e6fe83 7489
645c22ef
DM
7490/*
7491=for apidoc sv_uv
7492
7493A private implementation of the C<SvUVx> macro for compilers which can't
7494cope with complex macro expressions. Always use the macro instead.
7495
7496=cut
7497*/
7498
ff68c719 7499UV
864dbfa3 7500Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 7501{
25da4f38
IZ
7502 if (SvIOK(sv)) {
7503 if (SvIsUV(sv))
7504 return SvUVX(sv);
7505 return (UV)SvIVX(sv);
7506 }
ff68c719 7507 return sv_2uv(sv);
7508}
85e6fe83 7509
645c22ef
DM
7510/*
7511=for apidoc sv_nv
7512
7513A private implementation of the C<SvNVx> macro for compilers which can't
7514cope with complex macro expressions. Always use the macro instead.
7515
7516=cut
7517*/
7518
65202027 7519NV
864dbfa3 7520Perl_sv_nv(pTHX_ register SV *sv)
79072805 7521{
ff68c719 7522 if (SvNOK(sv))
7523 return SvNVX(sv);
7524 return sv_2nv(sv);
79072805 7525}
79072805 7526
09540bc3
JH
7527/* sv_pv() is now a macro using SvPV_nolen();
7528 * this function provided for binary compatibility only
7529 */
7530
7531char *
7532Perl_sv_pv(pTHX_ SV *sv)
7533{
7534 STRLEN n_a;
7535
7536 if (SvPOK(sv))
7537 return SvPVX(sv);
7538
7539 return sv_2pv(sv, &n_a);
7540}
7541
645c22ef
DM
7542/*
7543=for apidoc sv_pv
7544
baca2b92 7545Use the C<SvPV_nolen> macro instead
645c22ef 7546
645c22ef
DM
7547=for apidoc sv_pvn
7548
7549A private implementation of the C<SvPV> macro for compilers which can't
7550cope with complex macro expressions. Always use the macro instead.
7551
7552=cut
7553*/
7554
1fa8b10d 7555char *
864dbfa3 7556Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 7557{
85e6fe83
LW
7558 if (SvPOK(sv)) {
7559 *lp = SvCUR(sv);
a0d0e21e 7560 return SvPVX(sv);
85e6fe83 7561 }
463ee0b2 7562 return sv_2pv(sv, lp);
79072805 7563}
79072805 7564
6e9d1081
NC
7565
7566char *
7567Perl_sv_pvn_nomg(pTHX_ register SV *sv, STRLEN *lp)
7568{
7569 if (SvPOK(sv)) {
7570 *lp = SvCUR(sv);
7571 return SvPVX(sv);
7572 }
7573 return sv_2pv_flags(sv, lp, 0);
7574}
7575
09540bc3
JH
7576/* sv_pvn_force() is now a macro using Perl_sv_pvn_force_flags();
7577 * this function provided for binary compatibility only
7578 */
7579
7580char *
7581Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
7582{
7583 return sv_pvn_force_flags(sv, lp, SV_GMAGIC);
7584}
7585
c461cf8f
JH
7586/*
7587=for apidoc sv_pvn_force
7588
7589Get a sensible string out of the SV somehow.
645c22ef
DM
7590A private implementation of the C<SvPV_force> macro for compilers which
7591can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 7592
8d6d96c1
HS
7593=for apidoc sv_pvn_force_flags
7594
7595Get a sensible string out of the SV somehow.
7596If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
7597appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
7598implemented in terms of this function.
645c22ef
DM
7599You normally want to use the various wrapper macros instead: see
7600C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
7601
7602=cut
7603*/
7604
7605char *
7606Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
7607{
c04a4dfe 7608 char *s = NULL;
a0d0e21e 7609
6fc92669 7610 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 7611 sv_force_normal_flags(sv, 0);
1c846c1f 7612
a0d0e21e
LW
7613 if (SvPOK(sv)) {
7614 *lp = SvCUR(sv);
7615 }
7616 else {
748a9306 7617 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 7618 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 7619 OP_NAME(PL_op));
a0d0e21e 7620 }
4633a7c4 7621 else
8d6d96c1 7622 s = sv_2pv_flags(sv, lp, flags);
a0d0e21e
LW
7623 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
7624 STRLEN len = *lp;
1c846c1f 7625
a0d0e21e
LW
7626 if (SvROK(sv))
7627 sv_unref(sv);
7628 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
7629 SvGROW(sv, len + 1);
7630 Move(s,SvPVX(sv),len,char);
7631 SvCUR_set(sv, len);
7632 *SvEND(sv) = '\0';
7633 }
7634 if (!SvPOK(sv)) {
7635 SvPOK_on(sv); /* validate pointer */
7636 SvTAINT(sv);
1d7c1841
GS
7637 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
7638 PTR2UV(sv),SvPVX(sv)));
a0d0e21e
LW
7639 }
7640 }
7641 return SvPVX(sv);
7642}
7643
09540bc3
JH
7644/* sv_pvbyte () is now a macro using Perl_sv_2pv_flags();
7645 * this function provided for binary compatibility only
7646 */
7647
7648char *
7649Perl_sv_pvbyte(pTHX_ SV *sv)
7650{
7651 sv_utf8_downgrade(sv,0);
7652 return sv_pv(sv);
7653}
7654
645c22ef
DM
7655/*
7656=for apidoc sv_pvbyte
7657
baca2b92 7658Use C<SvPVbyte_nolen> instead.
645c22ef 7659
645c22ef
DM
7660=for apidoc sv_pvbyten
7661
7662A private implementation of the C<SvPVbyte> macro for compilers
7663which can't cope with complex macro expressions. Always use the macro
7664instead.
7665
7666=cut
7667*/
7668
7340a771
GS
7669char *
7670Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
7671{
ffebcc3e 7672 sv_utf8_downgrade(sv,0);
7340a771
GS
7673 return sv_pvn(sv,lp);
7674}
7675
645c22ef
DM
7676/*
7677=for apidoc sv_pvbyten_force
7678
7679A private implementation of the C<SvPVbytex_force> macro for compilers
7680which can't cope with complex macro expressions. Always use the macro
7681instead.
7682
7683=cut
7684*/
7685
7340a771
GS
7686char *
7687Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
7688{
ffebcc3e 7689 sv_utf8_downgrade(sv,0);
7340a771
GS
7690 return sv_pvn_force(sv,lp);
7691}
7692
09540bc3
JH
7693/* sv_pvutf8 () is now a macro using Perl_sv_2pv_flags();
7694 * this function provided for binary compatibility only
7695 */
7696
7697char *
7698Perl_sv_pvutf8(pTHX_ SV *sv)
7699{
7700 sv_utf8_upgrade(sv);
7701 return sv_pv(sv);
7702}
7703
645c22ef
DM
7704/*
7705=for apidoc sv_pvutf8
7706
baca2b92 7707Use the C<SvPVutf8_nolen> macro instead
645c22ef 7708
645c22ef
DM
7709=for apidoc sv_pvutf8n
7710
7711A private implementation of the C<SvPVutf8> macro for compilers
7712which can't cope with complex macro expressions. Always use the macro
7713instead.
7714
7715=cut
7716*/
7717
7340a771
GS
7718char *
7719Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
7720{
560a288e 7721 sv_utf8_upgrade(sv);
7340a771
GS
7722 return sv_pvn(sv,lp);
7723}
7724
c461cf8f
JH
7725/*
7726=for apidoc sv_pvutf8n_force
7727
645c22ef
DM
7728A private implementation of the C<SvPVutf8_force> macro for compilers
7729which can't cope with complex macro expressions. Always use the macro
7730instead.
c461cf8f
JH
7731
7732=cut
7733*/
7734
7340a771
GS
7735char *
7736Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
7737{
560a288e 7738 sv_utf8_upgrade(sv);
7340a771
GS
7739 return sv_pvn_force(sv,lp);
7740}
7741
c461cf8f
JH
7742/*
7743=for apidoc sv_reftype
7744
7745Returns a string describing what the SV is a reference to.
7746
7747=cut
7748*/
7749
7340a771 7750char *
864dbfa3 7751Perl_sv_reftype(pTHX_ SV *sv, int ob)
a0d0e21e 7752{
c86bf373 7753 if (ob && SvOBJECT(sv)) {
de11ba31 7754 return HvNAME(SvSTASH(sv));
c86bf373 7755 }
a0d0e21e
LW
7756 else {
7757 switch (SvTYPE(sv)) {
7758 case SVt_NULL:
7759 case SVt_IV:
7760 case SVt_NV:
7761 case SVt_RV:
7762 case SVt_PV:
7763 case SVt_PVIV:
7764 case SVt_PVNV:
7765 case SVt_PVMG:
7766 case SVt_PVBM:
439cb1c4
JP
7767 if (SvVOK(sv))
7768 return "VSTRING";
a0d0e21e
LW
7769 if (SvROK(sv))
7770 return "REF";
7771 else
7772 return "SCALAR";
7773 case SVt_PVLV: return "LVALUE";
7774 case SVt_PVAV: return "ARRAY";
7775 case SVt_PVHV: return "HASH";
7776 case SVt_PVCV: return "CODE";
7777 case SVt_PVGV: return "GLOB";
1d2dff63 7778 case SVt_PVFM: return "FORMAT";
27f9d8f3 7779 case SVt_PVIO: return "IO";
a0d0e21e
LW
7780 default: return "UNKNOWN";
7781 }
7782 }
7783}
7784
954c1994
GS
7785/*
7786=for apidoc sv_isobject
7787
7788Returns a boolean indicating whether the SV is an RV pointing to a blessed
7789object. If the SV is not an RV, or if the object is not blessed, then this
7790will return false.
7791
7792=cut
7793*/
7794
463ee0b2 7795int
864dbfa3 7796Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 7797{
68dc0745 7798 if (!sv)
7799 return 0;
7800 if (SvGMAGICAL(sv))
7801 mg_get(sv);
85e6fe83
LW
7802 if (!SvROK(sv))
7803 return 0;
7804 sv = (SV*)SvRV(sv);
7805 if (!SvOBJECT(sv))
7806 return 0;
7807 return 1;
7808}
7809
954c1994
GS
7810/*
7811=for apidoc sv_isa
7812
7813Returns a boolean indicating whether the SV is blessed into the specified
7814class. This does not check for subtypes; use C<sv_derived_from> to verify
7815an inheritance relationship.
7816
7817=cut
7818*/
7819
85e6fe83 7820int
864dbfa3 7821Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 7822{
68dc0745 7823 if (!sv)
7824 return 0;
7825 if (SvGMAGICAL(sv))
7826 mg_get(sv);
ed6116ce 7827 if (!SvROK(sv))
463ee0b2 7828 return 0;
ed6116ce
LW
7829 sv = (SV*)SvRV(sv);
7830 if (!SvOBJECT(sv))
463ee0b2
LW
7831 return 0;
7832
7833 return strEQ(HvNAME(SvSTASH(sv)), name);
7834}
7835
954c1994
GS
7836/*
7837=for apidoc newSVrv
7838
7839Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
7840it will be upgraded to one. If C<classname> is non-null then the new SV will
7841be blessed in the specified package. The new SV is returned and its
7842reference count is 1.
7843
7844=cut
7845*/
7846
463ee0b2 7847SV*
864dbfa3 7848Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 7849{
463ee0b2
LW
7850 SV *sv;
7851
4561caa4 7852 new_SV(sv);
51cf62d8 7853
765f542d 7854 SV_CHECK_THINKFIRST_COW_DROP(rv);
51cf62d8 7855 SvAMAGIC_off(rv);
51cf62d8 7856
0199fce9
JD
7857 if (SvTYPE(rv) >= SVt_PVMG) {
7858 U32 refcnt = SvREFCNT(rv);
7859 SvREFCNT(rv) = 0;
7860 sv_clear(rv);
7861 SvFLAGS(rv) = 0;
7862 SvREFCNT(rv) = refcnt;
7863 }
7864
51cf62d8 7865 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
7866 sv_upgrade(rv, SVt_RV);
7867 else if (SvTYPE(rv) > SVt_RV) {
7868 (void)SvOOK_off(rv);
7869 if (SvPVX(rv) && SvLEN(rv))
7870 Safefree(SvPVX(rv));
7871 SvCUR_set(rv, 0);
7872 SvLEN_set(rv, 0);
7873 }
51cf62d8
OT
7874
7875 (void)SvOK_off(rv);
053fc874 7876 SvRV(rv) = sv;
ed6116ce 7877 SvROK_on(rv);
463ee0b2 7878
a0d0e21e
LW
7879 if (classname) {
7880 HV* stash = gv_stashpv(classname, TRUE);
7881 (void)sv_bless(rv, stash);
7882 }
7883 return sv;
7884}
7885
954c1994
GS
7886/*
7887=for apidoc sv_setref_pv
7888
7889Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
7890argument will be upgraded to an RV. That RV will be modified to point to
7891the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7892into the SV. The C<classname> argument indicates the package for the
7893blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7894will be returned and will have a reference count of 1.
7895
7896Do not use with other Perl types such as HV, AV, SV, CV, because those
7897objects will become corrupted by the pointer copy process.
7898
7899Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7900
7901=cut
7902*/
7903
a0d0e21e 7904SV*
864dbfa3 7905Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 7906{
189b2af5 7907 if (!pv) {
3280af22 7908 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
7909 SvSETMAGIC(rv);
7910 }
a0d0e21e 7911 else
56431972 7912 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
7913 return rv;
7914}
7915
954c1994
GS
7916/*
7917=for apidoc sv_setref_iv
7918
7919Copies an integer into a new SV, optionally blessing the SV. The C<rv>
7920argument will be upgraded to an RV. That RV will be modified to point to
7921the new SV. The C<classname> argument indicates the package for the
7922blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7923will be returned and will have a reference count of 1.
7924
7925=cut
7926*/
7927
a0d0e21e 7928SV*
864dbfa3 7929Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
7930{
7931 sv_setiv(newSVrv(rv,classname), iv);
7932 return rv;
7933}
7934
954c1994 7935/*
e1c57cef
JH
7936=for apidoc sv_setref_uv
7937
7938Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
7939argument will be upgraded to an RV. That RV will be modified to point to
7940the new SV. The C<classname> argument indicates the package for the
7941blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7942will be returned and will have a reference count of 1.
7943
7944=cut
7945*/
7946
7947SV*
7948Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
7949{
7950 sv_setuv(newSVrv(rv,classname), uv);
7951 return rv;
7952}
7953
7954/*
954c1994
GS
7955=for apidoc sv_setref_nv
7956
7957Copies a double into a new SV, optionally blessing the SV. The C<rv>
7958argument will be upgraded to an RV. That RV will be modified to point to
7959the new SV. The C<classname> argument indicates the package for the
7960blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7961will be returned and will have a reference count of 1.
7962
7963=cut
7964*/
7965
a0d0e21e 7966SV*
65202027 7967Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
7968{
7969 sv_setnv(newSVrv(rv,classname), nv);
7970 return rv;
7971}
463ee0b2 7972
954c1994
GS
7973/*
7974=for apidoc sv_setref_pvn
7975
7976Copies a string into a new SV, optionally blessing the SV. The length of the
7977string must be specified with C<n>. The C<rv> argument will be upgraded to
7978an RV. That RV will be modified to point to the new SV. The C<classname>
7979argument indicates the package for the blessing. Set C<classname> to
7980C<Nullch> to avoid the blessing. The new SV will be returned and will have
7981a reference count of 1.
7982
7983Note that C<sv_setref_pv> copies the pointer while this copies the string.
7984
7985=cut
7986*/
7987
a0d0e21e 7988SV*
864dbfa3 7989Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
7990{
7991 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
7992 return rv;
7993}
7994
954c1994
GS
7995/*
7996=for apidoc sv_bless
7997
7998Blesses an SV into a specified package. The SV must be an RV. The package
7999must be designated by its stash (see C<gv_stashpv()>). The reference count
8000of the SV is unaffected.
8001
8002=cut
8003*/
8004
a0d0e21e 8005SV*
864dbfa3 8006Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 8007{
76e3520e 8008 SV *tmpRef;
a0d0e21e 8009 if (!SvROK(sv))
cea2e8a9 8010 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
8011 tmpRef = SvRV(sv);
8012 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
8013 if (SvREADONLY(tmpRef))
cea2e8a9 8014 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
8015 if (SvOBJECT(tmpRef)) {
8016 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8017 --PL_sv_objcount;
76e3520e 8018 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 8019 }
a0d0e21e 8020 }
76e3520e
GS
8021 SvOBJECT_on(tmpRef);
8022 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8023 ++PL_sv_objcount;
76e3520e
GS
8024 (void)SvUPGRADE(tmpRef, SVt_PVMG);
8025 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
a0d0e21e 8026
2e3febc6
CS
8027 if (Gv_AMG(stash))
8028 SvAMAGIC_on(sv);
8029 else
8030 SvAMAGIC_off(sv);
a0d0e21e 8031
1edbfb88
AB
8032 if(SvSMAGICAL(tmpRef))
8033 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8034 mg_set(tmpRef);
8035
8036
ecdeb87c 8037
a0d0e21e
LW
8038 return sv;
8039}
8040
645c22ef 8041/* Downgrades a PVGV to a PVMG.
645c22ef
DM
8042 */
8043
76e3520e 8044STATIC void
cea2e8a9 8045S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 8046{
850fabdf
GS
8047 void *xpvmg;
8048
a0d0e21e
LW
8049 assert(SvTYPE(sv) == SVt_PVGV);
8050 SvFAKE_off(sv);
8051 if (GvGP(sv))
1edc1566 8052 gp_free((GV*)sv);
e826b3c7
GS
8053 if (GvSTASH(sv)) {
8054 SvREFCNT_dec(GvSTASH(sv));
8055 GvSTASH(sv) = Nullhv;
8056 }
14befaf4 8057 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 8058 Safefree(GvNAME(sv));
a5f75d66 8059 GvMULTI_off(sv);
850fabdf
GS
8060
8061 /* need to keep SvANY(sv) in the right arena */
8062 xpvmg = new_XPVMG();
8063 StructCopy(SvANY(sv), xpvmg, XPVMG);
8064 del_XPVGV(SvANY(sv));
8065 SvANY(sv) = xpvmg;
8066
a0d0e21e
LW
8067 SvFLAGS(sv) &= ~SVTYPEMASK;
8068 SvFLAGS(sv) |= SVt_PVMG;
8069}
8070
954c1994 8071/*
840a7b70 8072=for apidoc sv_unref_flags
954c1994
GS
8073
8074Unsets the RV status of the SV, and decrements the reference count of
8075whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
8076as a reversal of C<newSVrv>. The C<cflags> argument can contain
8077C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8078(otherwise the decrementing is conditional on the reference count being
8079different from one or the reference being a readonly SV).
7889fe52 8080See C<SvROK_off>.
954c1994
GS
8081
8082=cut
8083*/
8084
ed6116ce 8085void
840a7b70 8086Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 8087{
a0d0e21e 8088 SV* rv = SvRV(sv);
810b8aa5
GS
8089
8090 if (SvWEAKREF(sv)) {
8091 sv_del_backref(sv);
8092 SvWEAKREF_off(sv);
8093 SvRV(sv) = 0;
8094 return;
8095 }
ed6116ce
LW
8096 SvRV(sv) = 0;
8097 SvROK_off(sv);
04ca4930
NC
8098 /* You can't have a || SvREADONLY(rv) here, as $a = $$a, where $a was
8099 assigned to as BEGIN {$a = \"Foo"} will fail. */
8100 if (SvREFCNT(rv) != 1 || (flags & SV_IMMEDIATE_UNREF))
4633a7c4 8101 SvREFCNT_dec(rv);
840a7b70 8102 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 8103 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 8104}
8990e307 8105
840a7b70
IZ
8106/*
8107=for apidoc sv_unref
8108
8109Unsets the RV status of the SV, and decrements the reference count of
8110whatever was being referenced by the RV. This can almost be thought of
8111as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 8112being zero. See C<SvROK_off>.
840a7b70
IZ
8113
8114=cut
8115*/
8116
8117void
8118Perl_sv_unref(pTHX_ SV *sv)
8119{
8120 sv_unref_flags(sv, 0);
8121}
8122
645c22ef
DM
8123/*
8124=for apidoc sv_taint
8125
8126Taint an SV. Use C<SvTAINTED_on> instead.
8127=cut
8128*/
8129
bbce6d69 8130void
864dbfa3 8131Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 8132{
14befaf4 8133 sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
bbce6d69 8134}
8135
645c22ef
DM
8136/*
8137=for apidoc sv_untaint
8138
8139Untaint an SV. Use C<SvTAINTED_off> instead.
8140=cut
8141*/
8142
bbce6d69 8143void
864dbfa3 8144Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 8145{
13f57bf8 8146 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8147 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 8148 if (mg)
565764a8 8149 mg->mg_len &= ~1;
36477c24 8150 }
bbce6d69 8151}
8152
645c22ef
DM
8153/*
8154=for apidoc sv_tainted
8155
8156Test an SV for taintedness. Use C<SvTAINTED> instead.
8157=cut
8158*/
8159
bbce6d69 8160bool
864dbfa3 8161Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 8162{
13f57bf8 8163 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 8164 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
155aba94 8165 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 8166 return TRUE;
8167 }
8168 return FALSE;
bbce6d69 8169}
8170
09540bc3
JH
8171/*
8172=for apidoc sv_setpviv
8173
8174Copies an integer into the given SV, also updating its string value.
8175Does not handle 'set' magic. See C<sv_setpviv_mg>.
8176
8177=cut
8178*/
8179
8180void
8181Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
8182{
8183 char buf[TYPE_CHARS(UV)];
8184 char *ebuf;
8185 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8186
8187 sv_setpvn(sv, ptr, ebuf - ptr);
8188}
8189
8190/*
8191=for apidoc sv_setpviv_mg
8192
8193Like C<sv_setpviv>, but also handles 'set' magic.
8194
8195=cut
8196*/
8197
8198void
8199Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
8200{
8201 char buf[TYPE_CHARS(UV)];
8202 char *ebuf;
8203 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8204
8205 sv_setpvn(sv, ptr, ebuf - ptr);
8206 SvSETMAGIC(sv);
8207}
8208
cea2e8a9 8209#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8210
8211/* pTHX_ magic can't cope with varargs, so this is a no-context
8212 * version of the main function, (which may itself be aliased to us).
8213 * Don't access this version directly.
8214 */
8215
cea2e8a9
GS
8216void
8217Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
8218{
8219 dTHX;
8220 va_list args;
8221 va_start(args, pat);
c5be433b 8222 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
8223 va_end(args);
8224}
8225
645c22ef
DM
8226/* pTHX_ magic can't cope with varargs, so this is a no-context
8227 * version of the main function, (which may itself be aliased to us).
8228 * Don't access this version directly.
8229 */
cea2e8a9
GS
8230
8231void
8232Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
8233{
8234 dTHX;
8235 va_list args;
8236 va_start(args, pat);
c5be433b 8237 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 8238 va_end(args);
cea2e8a9
GS
8239}
8240#endif
8241
954c1994
GS
8242/*
8243=for apidoc sv_setpvf
8244
8245Processes its arguments like C<sprintf> and sets an SV to the formatted
8246output. Does not handle 'set' magic. See C<sv_setpvf_mg>.
8247
8248=cut
8249*/
8250
46fc3d4c 8251void
864dbfa3 8252Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8253{
8254 va_list args;
46fc3d4c 8255 va_start(args, pat);
c5be433b 8256 sv_vsetpvf(sv, pat, &args);
46fc3d4c 8257 va_end(args);
8258}
8259
645c22ef
DM
8260/* backend for C<sv_setpvf> and C<sv_setpvf_nocontext> */
8261
c5be433b
GS
8262void
8263Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8264{
8265 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8266}
ef50df4b 8267
954c1994
GS
8268/*
8269=for apidoc sv_setpvf_mg
8270
8271Like C<sv_setpvf>, but also handles 'set' magic.
8272
8273=cut
8274*/
8275
ef50df4b 8276void
864dbfa3 8277Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8278{
8279 va_list args;
ef50df4b 8280 va_start(args, pat);
c5be433b 8281 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 8282 va_end(args);
c5be433b
GS
8283}
8284
645c22ef
DM
8285/* backend for C<sv_setpvf_mg> C<setpvf_mg_nocontext> */
8286
c5be433b
GS
8287void
8288Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8289{
8290 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
8291 SvSETMAGIC(sv);
8292}
8293
cea2e8a9 8294#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8295
8296/* pTHX_ magic can't cope with varargs, so this is a no-context
8297 * version of the main function, (which may itself be aliased to us).
8298 * Don't access this version directly.
8299 */
8300
cea2e8a9
GS
8301void
8302Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
8303{
8304 dTHX;
8305 va_list args;
8306 va_start(args, pat);
c5be433b 8307 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
8308 va_end(args);
8309}
8310
645c22ef
DM
8311/* pTHX_ magic can't cope with varargs, so this is a no-context
8312 * version of the main function, (which may itself be aliased to us).
8313 * Don't access this version directly.
8314 */
8315
cea2e8a9
GS
8316void
8317Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
8318{
8319 dTHX;
8320 va_list args;
8321 va_start(args, pat);
c5be433b 8322 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 8323 va_end(args);
cea2e8a9
GS
8324}
8325#endif
8326
954c1994
GS
8327/*
8328=for apidoc sv_catpvf
8329
d5ce4a7c
GA
8330Processes its arguments like C<sprintf> and appends the formatted
8331output to an SV. If the appended data contains "wide" characters
8332(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
8333and characters >255 formatted with %c), the original SV might get
8334upgraded to UTF-8. Handles 'get' magic, but not 'set' magic.
8335C<SvSETMAGIC()> must typically be called after calling this function
8336to handle 'set' magic.
954c1994 8337
d5ce4a7c 8338=cut */
954c1994 8339
46fc3d4c 8340void
864dbfa3 8341Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8342{
8343 va_list args;
46fc3d4c 8344 va_start(args, pat);
c5be433b 8345 sv_vcatpvf(sv, pat, &args);
46fc3d4c 8346 va_end(args);
8347}
8348
645c22ef
DM
8349/* backend for C<sv_catpvf> and C<catpvf_mg_nocontext> */
8350
ef50df4b 8351void
c5be433b
GS
8352Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8353{
8354 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
8355}
8356
954c1994
GS
8357/*
8358=for apidoc sv_catpvf_mg
8359
8360Like C<sv_catpvf>, but also handles 'set' magic.
8361
8362=cut
8363*/
8364
c5be433b 8365void
864dbfa3 8366Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8367{
8368 va_list args;
ef50df4b 8369 va_start(args, pat);
c5be433b 8370 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 8371 va_end(args);
c5be433b
GS
8372}
8373
645c22ef
DM
8374/* backend for C<catpvf_mg> and C<catpvf_mg_nocontext> */
8375
c5be433b
GS
8376void
8377Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8378{
8379 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
8380 SvSETMAGIC(sv);
8381}
8382
954c1994
GS
8383/*
8384=for apidoc sv_vsetpvfn
8385
8386Works like C<vcatpvfn> but copies the text into the SV instead of
8387appending it.
8388
645c22ef
DM
8389Usually used via one of its frontends C<sv_setpvf> and C<sv_setpvf_mg>.
8390
954c1994
GS
8391=cut
8392*/
8393
46fc3d4c 8394void
7d5ea4e7 8395Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8396{
8397 sv_setpvn(sv, "", 0);
7d5ea4e7 8398 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 8399}
8400
645c22ef
DM
8401/* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
8402
2d00ba3b 8403STATIC I32
9dd79c3f 8404S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
8405{
8406 I32 var = 0;
8407 switch (**pattern) {
8408 case '1': case '2': case '3':
8409 case '4': case '5': case '6':
8410 case '7': case '8': case '9':
8411 while (isDIGIT(**pattern))
8412 var = var * 10 + (*(*pattern)++ - '0');
8413 }
8414 return var;
8415}
9dd79c3f 8416#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 8417
954c1994
GS
8418/*
8419=for apidoc sv_vcatpvfn
8420
8421Processes its arguments like C<vsprintf> and appends the formatted output
8422to an SV. Uses an array of SVs if the C style variable argument list is
8423missing (NULL). When running with taint checks enabled, indicates via
8424C<maybe_tainted> if results are untrustworthy (often due to the use of
8425locales).
8426
645c22ef
DM
8427Usually used via one of its frontends C<sv_catpvf> and C<sv_catpvf_mg>.
8428
954c1994
GS
8429=cut
8430*/
8431
46fc3d4c 8432void
7d5ea4e7 8433Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8434{
8435 char *p;
8436 char *q;
8437 char *patend;
fc36a67e 8438 STRLEN origlen;
46fc3d4c 8439 I32 svix = 0;
c635e13b 8440 static char nullstr[] = "(null)";
9c5ffd7c 8441 SV *argsv = Nullsv;
db79b45b
JH
8442 bool has_utf8; /* has the result utf8? */
8443 bool pat_utf8; /* the pattern is in utf8? */
8444 SV *nsv = Nullsv;
8445
8446 has_utf8 = pat_utf8 = DO_UTF8(sv);
46fc3d4c 8447
8448 /* no matter what, this is a string now */
fc36a67e 8449 (void)SvPV_force(sv, origlen);
46fc3d4c 8450
fc36a67e 8451 /* special-case "", "%s", and "%_" */
46fc3d4c 8452 if (patlen == 0)
8453 return;
fc36a67e 8454 if (patlen == 2 && pat[0] == '%') {
8455 switch (pat[1]) {
8456 case 's':
c635e13b 8457 if (args) {
8458 char *s = va_arg(*args, char*);
8459 sv_catpv(sv, s ? s : nullstr);
8460 }
7e2040f0 8461 else if (svix < svmax) {
fc36a67e 8462 sv_catsv(sv, *svargs);
7e2040f0
GS
8463 if (DO_UTF8(*svargs))
8464 SvUTF8_on(sv);
8465 }
fc36a67e 8466 return;
8467 case '_':
8468 if (args) {
7e2040f0
GS
8469 argsv = va_arg(*args, SV*);
8470 sv_catsv(sv, argsv);
8471 if (DO_UTF8(argsv))
8472 SvUTF8_on(sv);
fc36a67e 8473 return;
8474 }
8475 /* See comment on '_' below */
8476 break;
8477 }
46fc3d4c 8478 }
8479
2cf2cfc6 8480 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 8481 has_utf8 = TRUE;
2cf2cfc6 8482
46fc3d4c 8483 patend = (char*)pat + patlen;
8484 for (p = (char*)pat; p < patend; p = q) {
8485 bool alt = FALSE;
8486 bool left = FALSE;
b22c7a20 8487 bool vectorize = FALSE;
211dfcf1 8488 bool vectorarg = FALSE;
2cf2cfc6 8489 bool vec_utf8 = FALSE;
46fc3d4c 8490 char fill = ' ';
8491 char plus = 0;
8492 char intsize = 0;
8493 STRLEN width = 0;
fc36a67e 8494 STRLEN zeros = 0;
46fc3d4c 8495 bool has_precis = FALSE;
8496 STRLEN precis = 0;
58e33a90 8497 I32 osvix = svix;
2cf2cfc6 8498 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
8499#ifdef HAS_LDBL_SPRINTF_BUG
8500 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 8501 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
8502 bool fix_ldbl_sprintf_bug = FALSE;
8503#endif
205f51d8 8504
46fc3d4c 8505 char esignbuf[4];
ad391ad9 8506 U8 utf8buf[UTF8_MAXLEN+1];
46fc3d4c 8507 STRLEN esignlen = 0;
8508
8509 char *eptr = Nullch;
fc36a67e 8510 STRLEN elen = 0;
089c015b
JH
8511 /* Times 4: a decimal digit takes more than 3 binary digits.
8512 * NV_DIG: mantissa takes than many decimal digits.
8513 * Plus 32: Playing safe. */
8514 char ebuf[IV_DIG * 4 + NV_DIG + 32];
205f51d8 8515 /* large enough for "%#.#f" --chip */
2d4389e4 8516 /* what about long double NVs? --jhi */
b22c7a20 8517
81f715da 8518 SV *vecsv = Nullsv;
a05b299f 8519 U8 *vecstr = Null(U8*);
b22c7a20 8520 STRLEN veclen = 0;
934abaf1 8521 char c = 0;
46fc3d4c 8522 int i;
9c5ffd7c 8523 unsigned base = 0;
8c8eb53c
RB
8524 IV iv = 0;
8525 UV uv = 0;
9e5b023a
JH
8526 /* we need a long double target in case HAS_LONG_DOUBLE but
8527 not USE_LONG_DOUBLE
8528 */
35fff930 8529#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
8530 long double nv;
8531#else
65202027 8532 NV nv;
9e5b023a 8533#endif
46fc3d4c 8534 STRLEN have;
8535 STRLEN need;
8536 STRLEN gap;
b22c7a20
GS
8537 char *dotstr = ".";
8538 STRLEN dotstrlen = 1;
211dfcf1 8539 I32 efix = 0; /* explicit format parameter index */
eb3fce90 8540 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
8541 I32 epix = 0; /* explicit precision index */
8542 I32 evix = 0; /* explicit vector index */
eb3fce90 8543 bool asterisk = FALSE;
46fc3d4c 8544
211dfcf1 8545 /* echo everything up to the next format specification */
46fc3d4c 8546 for (q = p; q < patend && *q != '%'; ++q) ;
8547 if (q > p) {
db79b45b
JH
8548 if (has_utf8 && !pat_utf8)
8549 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
8550 else
8551 sv_catpvn(sv, p, q - p);
46fc3d4c 8552 p = q;
8553 }
8554 if (q++ >= patend)
8555 break;
8556
211dfcf1
HS
8557/*
8558 We allow format specification elements in this order:
8559 \d+\$ explicit format parameter index
8560 [-+ 0#]+ flags
a472f209 8561 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 8562 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
8563 \d+|\*(\d+\$)? width using optional (optionally specified) arg
8564 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
8565 [hlqLV] size
8566 [%bcdefginopsux_DFOUX] format (mandatory)
8567*/
8568 if (EXPECT_NUMBER(q, width)) {
8569 if (*q == '$') {
8570 ++q;
8571 efix = width;
8572 } else {
8573 goto gotwidth;
8574 }
8575 }
8576
fc36a67e 8577 /* FLAGS */
8578
46fc3d4c 8579 while (*q) {
8580 switch (*q) {
8581 case ' ':
8582 case '+':
8583 plus = *q++;
8584 continue;
8585
8586 case '-':
8587 left = TRUE;
8588 q++;
8589 continue;
8590
8591 case '0':
8592 fill = *q++;
8593 continue;
8594
8595 case '#':
8596 alt = TRUE;
8597 q++;
8598 continue;
8599
fc36a67e 8600 default:
8601 break;
8602 }
8603 break;
8604 }
46fc3d4c 8605
211dfcf1 8606 tryasterisk:
eb3fce90 8607 if (*q == '*') {
211dfcf1
HS
8608 q++;
8609 if (EXPECT_NUMBER(q, ewix))
8610 if (*q++ != '$')
8611 goto unknown;
eb3fce90 8612 asterisk = TRUE;
211dfcf1
HS
8613 }
8614 if (*q == 'v') {
eb3fce90 8615 q++;
211dfcf1
HS
8616 if (vectorize)
8617 goto unknown;
9cbac4c7 8618 if ((vectorarg = asterisk)) {
211dfcf1
HS
8619 evix = ewix;
8620 ewix = 0;
8621 asterisk = FALSE;
8622 }
8623 vectorize = TRUE;
8624 goto tryasterisk;
eb3fce90
JH
8625 }
8626
211dfcf1 8627 if (!asterisk)
f3583277
RB
8628 if( *q == '0' )
8629 fill = *q++;
211dfcf1
HS
8630 EXPECT_NUMBER(q, width);
8631
8632 if (vectorize) {
8633 if (vectorarg) {
8634 if (args)
8635 vecsv = va_arg(*args, SV*);
8636 else
8637 vecsv = (evix ? evix <= svmax : svix < svmax) ?
8638 svargs[ewix ? ewix-1 : svix++] : &PL_sv_undef;
4459522c 8639 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1 8640 if (DO_UTF8(vecsv))
2cf2cfc6 8641 is_utf8 = TRUE;
211dfcf1
HS
8642 }
8643 if (args) {
8644 vecsv = va_arg(*args, SV*);
8645 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 8646 vec_utf8 = DO_UTF8(vecsv);
eb3fce90 8647 }
211dfcf1
HS
8648 else if (efix ? efix <= svmax : svix < svmax) {
8649 vecsv = svargs[efix ? efix-1 : svix++];
8650 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 8651 vec_utf8 = DO_UTF8(vecsv);
211dfcf1
HS
8652 }
8653 else {
8654 vecstr = (U8*)"";
8655 veclen = 0;
8656 }
eb3fce90 8657 }
fc36a67e 8658
eb3fce90 8659 if (asterisk) {
fc36a67e 8660 if (args)
8661 i = va_arg(*args, int);
8662 else
eb3fce90
JH
8663 i = (ewix ? ewix <= svmax : svix < svmax) ?
8664 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8665 left |= (i < 0);
8666 width = (i < 0) ? -i : i;
fc36a67e 8667 }
211dfcf1 8668 gotwidth:
fc36a67e 8669
8670 /* PRECISION */
46fc3d4c 8671
fc36a67e 8672 if (*q == '.') {
8673 q++;
8674 if (*q == '*') {
211dfcf1 8675 q++;
7b8dd722
HS
8676 if (EXPECT_NUMBER(q, epix) && *q++ != '$')
8677 goto unknown;
8678 /* XXX: todo, support specified precision parameter */
8679 if (epix)
211dfcf1 8680 goto unknown;
46fc3d4c 8681 if (args)
8682 i = va_arg(*args, int);
8683 else
eb3fce90
JH
8684 i = (ewix ? ewix <= svmax : svix < svmax)
8685 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8686 precis = (i < 0) ? 0 : i;
fc36a67e 8687 }
8688 else {
8689 precis = 0;
8690 while (isDIGIT(*q))
8691 precis = precis * 10 + (*q++ - '0');
8692 }
8693 has_precis = TRUE;
8694 }
46fc3d4c 8695
fc36a67e 8696 /* SIZE */
46fc3d4c 8697
fc36a67e 8698 switch (*q) {
c623ac67
GS
8699#ifdef WIN32
8700 case 'I': /* Ix, I32x, and I64x */
8701# ifdef WIN64
8702 if (q[1] == '6' && q[2] == '4') {
8703 q += 3;
8704 intsize = 'q';
8705 break;
8706 }
8707# endif
8708 if (q[1] == '3' && q[2] == '2') {
8709 q += 3;
8710 break;
8711 }
8712# ifdef WIN64
8713 intsize = 'q';
8714# endif
8715 q++;
8716 break;
8717#endif
9e5b023a 8718#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 8719 case 'L': /* Ld */
e5c81feb 8720 /* FALL THROUGH */
e5c81feb 8721#ifdef HAS_QUAD
6f9bb7fd 8722 case 'q': /* qd */
9e5b023a 8723#endif
6f9bb7fd
GS
8724 intsize = 'q';
8725 q++;
8726 break;
8727#endif
fc36a67e 8728 case 'l':
9e5b023a 8729#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 8730 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 8731 intsize = 'q';
8732 q += 2;
46fc3d4c 8733 break;
cf2093f6 8734 }
fc36a67e 8735#endif
6f9bb7fd 8736 /* FALL THROUGH */
fc36a67e 8737 case 'h':
cf2093f6 8738 /* FALL THROUGH */
fc36a67e 8739 case 'V':
8740 intsize = *q++;
46fc3d4c 8741 break;
8742 }
8743
fc36a67e 8744 /* CONVERSION */
8745
211dfcf1
HS
8746 if (*q == '%') {
8747 eptr = q++;
8748 elen = 1;
8749 goto string;
8750 }
8751
be75b157
HS
8752 if (vectorize)
8753 argsv = vecsv;
8754 else if (!args)
211dfcf1
HS
8755 argsv = (efix ? efix <= svmax : svix < svmax) ?
8756 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
8757
46fc3d4c 8758 switch (c = *q++) {
8759
8760 /* STRINGS */
8761
46fc3d4c 8762 case 'c':
be75b157 8763 uv = (args && !vectorize) ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
8764 if ((uv > 255 ||
8765 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 8766 && !IN_BYTES) {
dfe13c55 8767 eptr = (char*)utf8buf;
9041c2e3 8768 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 8769 is_utf8 = TRUE;
7e2040f0
GS
8770 }
8771 else {
8772 c = (char)uv;
8773 eptr = &c;
8774 elen = 1;
a0ed51b3 8775 }
46fc3d4c 8776 goto string;
8777
46fc3d4c 8778 case 's':
be75b157 8779 if (args && !vectorize) {
fc36a67e 8780 eptr = va_arg(*args, char*);
c635e13b 8781 if (eptr)
1d7c1841
GS
8782#ifdef MACOS_TRADITIONAL
8783 /* On MacOS, %#s format is used for Pascal strings */
8784 if (alt)
8785 elen = *eptr++;
8786 else
8787#endif
c635e13b 8788 elen = strlen(eptr);
8789 else {
8790 eptr = nullstr;
8791 elen = sizeof nullstr - 1;
8792 }
46fc3d4c 8793 }
211dfcf1 8794 else {
7e2040f0
GS
8795 eptr = SvPVx(argsv, elen);
8796 if (DO_UTF8(argsv)) {
a0ed51b3
LW
8797 if (has_precis && precis < elen) {
8798 I32 p = precis;
7e2040f0 8799 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
8800 precis = p;
8801 }
8802 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 8803 width += elen - sv_len_utf8(argsv);
a0ed51b3 8804 }
2cf2cfc6 8805 is_utf8 = TRUE;
a0ed51b3
LW
8806 }
8807 }
46fc3d4c 8808 goto string;
8809
fc36a67e 8810 case '_':
8811 /*
8812 * The "%_" hack might have to be changed someday,
8813 * if ISO or ANSI decide to use '_' for something.
8814 * So we keep it hidden from users' code.
8815 */
be75b157 8816 if (!args || vectorize)
fc36a67e 8817 goto unknown;
211dfcf1 8818 argsv = va_arg(*args, SV*);
7e2040f0
GS
8819 eptr = SvPVx(argsv, elen);
8820 if (DO_UTF8(argsv))
2cf2cfc6 8821 is_utf8 = TRUE;
fc36a67e 8822
46fc3d4c 8823 string:
b22c7a20 8824 vectorize = FALSE;
46fc3d4c 8825 if (has_precis && elen > precis)
8826 elen = precis;
8827 break;
8828
8829 /* INTEGERS */
8830
fc36a67e 8831 case 'p':
be75b157 8832 if (alt || vectorize)
c2e66d9e 8833 goto unknown;
211dfcf1 8834 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 8835 base = 16;
8836 goto integer;
8837
46fc3d4c 8838 case 'D':
29fe7a80 8839#ifdef IV_IS_QUAD
22f3ae8c 8840 intsize = 'q';
29fe7a80 8841#else
46fc3d4c 8842 intsize = 'l';
29fe7a80 8843#endif
46fc3d4c 8844 /* FALL THROUGH */
8845 case 'd':
8846 case 'i':
b22c7a20 8847 if (vectorize) {
ba210ebe 8848 STRLEN ulen;
211dfcf1
HS
8849 if (!veclen)
8850 continue;
2cf2cfc6
A
8851 if (vec_utf8)
8852 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8853 UTF8_ALLOW_ANYUV);
b22c7a20 8854 else {
e83d50c9 8855 uv = *vecstr;
b22c7a20
GS
8856 ulen = 1;
8857 }
8858 vecstr += ulen;
8859 veclen -= ulen;
e83d50c9
JP
8860 if (plus)
8861 esignbuf[esignlen++] = plus;
b22c7a20
GS
8862 }
8863 else if (args) {
46fc3d4c 8864 switch (intsize) {
8865 case 'h': iv = (short)va_arg(*args, int); break;
8866 default: iv = va_arg(*args, int); break;
8867 case 'l': iv = va_arg(*args, long); break;
fc36a67e 8868 case 'V': iv = va_arg(*args, IV); break;
cf2093f6
JH
8869#ifdef HAS_QUAD
8870 case 'q': iv = va_arg(*args, Quad_t); break;
8871#endif
46fc3d4c 8872 }
8873 }
8874 else {
211dfcf1 8875 iv = SvIVx(argsv);
46fc3d4c 8876 switch (intsize) {
8877 case 'h': iv = (short)iv; break;
be28567c 8878 default: break;
46fc3d4c 8879 case 'l': iv = (long)iv; break;
fc36a67e 8880 case 'V': break;
cf2093f6
JH
8881#ifdef HAS_QUAD
8882 case 'q': iv = (Quad_t)iv; break;
8883#endif
46fc3d4c 8884 }
8885 }
e83d50c9
JP
8886 if ( !vectorize ) /* we already set uv above */
8887 {
8888 if (iv >= 0) {
8889 uv = iv;
8890 if (plus)
8891 esignbuf[esignlen++] = plus;
8892 }
8893 else {
8894 uv = -iv;
8895 esignbuf[esignlen++] = '-';
8896 }
46fc3d4c 8897 }
8898 base = 10;
8899 goto integer;
8900
fc36a67e 8901 case 'U':
29fe7a80 8902#ifdef IV_IS_QUAD
22f3ae8c 8903 intsize = 'q';
29fe7a80 8904#else
fc36a67e 8905 intsize = 'l';
29fe7a80 8906#endif
fc36a67e 8907 /* FALL THROUGH */
8908 case 'u':
8909 base = 10;
8910 goto uns_integer;
8911
4f19785b
WSI
8912 case 'b':
8913 base = 2;
8914 goto uns_integer;
8915
46fc3d4c 8916 case 'O':
29fe7a80 8917#ifdef IV_IS_QUAD
22f3ae8c 8918 intsize = 'q';
29fe7a80 8919#else
46fc3d4c 8920 intsize = 'l';
29fe7a80 8921#endif
46fc3d4c 8922 /* FALL THROUGH */
8923 case 'o':
8924 base = 8;
8925 goto uns_integer;
8926
8927 case 'X':
46fc3d4c 8928 case 'x':
8929 base = 16;
46fc3d4c 8930
8931 uns_integer:
b22c7a20 8932 if (vectorize) {
ba210ebe 8933 STRLEN ulen;
b22c7a20 8934 vector:
211dfcf1
HS
8935 if (!veclen)
8936 continue;
2cf2cfc6
A
8937 if (vec_utf8)
8938 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8939 UTF8_ALLOW_ANYUV);
b22c7a20 8940 else {
a05b299f 8941 uv = *vecstr;
b22c7a20
GS
8942 ulen = 1;
8943 }
8944 vecstr += ulen;
8945 veclen -= ulen;
8946 }
8947 else if (args) {
46fc3d4c 8948 switch (intsize) {
8949 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
8950 default: uv = va_arg(*args, unsigned); break;
8951 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 8952 case 'V': uv = va_arg(*args, UV); break;
cf2093f6
JH
8953#ifdef HAS_QUAD
8954 case 'q': uv = va_arg(*args, Quad_t); break;
8955#endif
46fc3d4c 8956 }
8957 }
8958 else {
211dfcf1 8959 uv = SvUVx(argsv);
46fc3d4c 8960 switch (intsize) {
8961 case 'h': uv = (unsigned short)uv; break;
be28567c 8962 default: break;
46fc3d4c 8963 case 'l': uv = (unsigned long)uv; break;
fc36a67e 8964 case 'V': break;
cf2093f6
JH
8965#ifdef HAS_QUAD
8966 case 'q': uv = (Quad_t)uv; break;
8967#endif
46fc3d4c 8968 }
8969 }
8970
8971 integer:
46fc3d4c 8972 eptr = ebuf + sizeof ebuf;
fc36a67e 8973 switch (base) {
8974 unsigned dig;
8975 case 16:
c10ed8b9
HS
8976 if (!uv)
8977 alt = FALSE;
1d7c1841
GS
8978 p = (char*)((c == 'X')
8979 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 8980 do {
8981 dig = uv & 15;
8982 *--eptr = p[dig];
8983 } while (uv >>= 4);
8984 if (alt) {
46fc3d4c 8985 esignbuf[esignlen++] = '0';
fc36a67e 8986 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 8987 }
fc36a67e 8988 break;
8989 case 8:
8990 do {
8991 dig = uv & 7;
8992 *--eptr = '0' + dig;
8993 } while (uv >>= 3);
8994 if (alt && *eptr != '0')
8995 *--eptr = '0';
8996 break;
4f19785b
WSI
8997 case 2:
8998 do {
8999 dig = uv & 1;
9000 *--eptr = '0' + dig;
9001 } while (uv >>= 1);
eda88b6d
JH
9002 if (alt) {
9003 esignbuf[esignlen++] = '0';
7481bb52 9004 esignbuf[esignlen++] = 'b';
eda88b6d 9005 }
4f19785b 9006 break;
fc36a67e 9007 default: /* it had better be ten or less */
6bc102ca 9008#if defined(PERL_Y2KWARN)
e476b1b5 9009 if (ckWARN(WARN_Y2K)) {
6bc102ca
GS
9010 STRLEN n;
9011 char *s = SvPV(sv,n);
9012 if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
9013 && (n == 2 || !isDIGIT(s[n-3])))
9014 {
9014280d 9015 Perl_warner(aTHX_ packWARN(WARN_Y2K),
6bc102ca
GS
9016 "Possible Y2K bug: %%%c %s",
9017 c, "format string following '19'");
9018 }
9019 }
9020#endif
fc36a67e 9021 do {
9022 dig = uv % base;
9023 *--eptr = '0' + dig;
9024 } while (uv /= base);
9025 break;
46fc3d4c 9026 }
9027 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
9028 if (has_precis) {
9029 if (precis > elen)
9030 zeros = precis - elen;
9031 else if (precis == 0 && elen == 1 && *eptr == '0')
9032 elen = 0;
9033 }
46fc3d4c 9034 break;
9035
9036 /* FLOATING POINT */
9037
fc36a67e 9038 case 'F':
9039 c = 'f'; /* maybe %F isn't supported here */
9040 /* FALL THROUGH */
46fc3d4c 9041 case 'e': case 'E':
fc36a67e 9042 case 'f':
46fc3d4c 9043 case 'g': case 'G':
9044
9045 /* This is evil, but floating point is even more evil */
9046
9e5b023a
JH
9047 /* for SV-style calling, we can only get NV
9048 for C-style calling, we assume %f is double;
9049 for simplicity we allow any of %Lf, %llf, %qf for long double
9050 */
9051 switch (intsize) {
9052 case 'V':
9053#if defined(USE_LONG_DOUBLE)
9054 intsize = 'q';
9055#endif
9056 break;
8a2e3f14 9057/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364
HS
9058 case 'l':
9059 /* FALL THROUGH */
9e5b023a
JH
9060 default:
9061#if defined(USE_LONG_DOUBLE)
9062 intsize = args ? 0 : 'q';
9063#endif
9064 break;
9065 case 'q':
9066#if defined(HAS_LONG_DOUBLE)
9067 break;
9068#else
9069 /* FALL THROUGH */
9070#endif
9071 case 'h':
9e5b023a
JH
9072 goto unknown;
9073 }
9074
9075 /* now we need (long double) if intsize == 'q', else (double) */
be75b157 9076 nv = (args && !vectorize) ?
35fff930
JH
9077#if LONG_DOUBLESIZE > DOUBLESIZE
9078 intsize == 'q' ?
205f51d8
AS
9079 va_arg(*args, long double) :
9080 va_arg(*args, double)
35fff930 9081#else
205f51d8 9082 va_arg(*args, double)
35fff930 9083#endif
9e5b023a 9084 : SvNVx(argsv);
fc36a67e 9085
9086 need = 0;
be75b157 9087 vectorize = FALSE;
fc36a67e 9088 if (c != 'e' && c != 'E') {
9089 i = PERL_INT_MIN;
9e5b023a
JH
9090 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9091 will cast our (long double) to (double) */
73b309ea 9092 (void)Perl_frexp(nv, &i);
fc36a67e 9093 if (i == PERL_INT_MIN)
cea2e8a9 9094 Perl_die(aTHX_ "panic: frexp");
c635e13b 9095 if (i > 0)
fc36a67e 9096 need = BIT_DIGITS(i);
9097 }
9098 need += has_precis ? precis : 6; /* known default */
20f6aaab 9099
fc36a67e 9100 if (need < width)
9101 need = width;
9102
20f6aaab
AS
9103#ifdef HAS_LDBL_SPRINTF_BUG
9104 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9105 with sfio - Allen <allens@cpan.org> */
9106
9107# ifdef DBL_MAX
9108# define MY_DBL_MAX DBL_MAX
9109# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9110# if DOUBLESIZE >= 8
9111# define MY_DBL_MAX 1.7976931348623157E+308L
9112# else
9113# define MY_DBL_MAX 3.40282347E+38L
9114# endif
9115# endif
9116
9117# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9118# define MY_DBL_MAX_BUG 1L
20f6aaab 9119# else
205f51d8 9120# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9121# endif
20f6aaab 9122
205f51d8
AS
9123# ifdef DBL_MIN
9124# define MY_DBL_MIN DBL_MIN
9125# else /* XXX guessing! -Allen */
9126# if DOUBLESIZE >= 8
9127# define MY_DBL_MIN 2.2250738585072014E-308L
9128# else
9129# define MY_DBL_MIN 1.17549435E-38L
9130# endif
9131# endif
20f6aaab 9132
205f51d8
AS
9133 if ((intsize == 'q') && (c == 'f') &&
9134 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9135 (need < DBL_DIG)) {
9136 /* it's going to be short enough that
9137 * long double precision is not needed */
9138
9139 if ((nv <= 0L) && (nv >= -0L))
9140 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9141 else {
9142 /* would use Perl_fp_class as a double-check but not
9143 * functional on IRIX - see perl.h comments */
9144
9145 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9146 /* It's within the range that a double can represent */
9147#if defined(DBL_MAX) && !defined(DBL_MIN)
9148 if ((nv >= ((long double)1/DBL_MAX)) ||
9149 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9150#endif
205f51d8 9151 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9152 }
205f51d8
AS
9153 }
9154 if (fix_ldbl_sprintf_bug == TRUE) {
9155 double temp;
9156
9157 intsize = 0;
9158 temp = (double)nv;
9159 nv = (NV)temp;
9160 }
20f6aaab 9161 }
205f51d8
AS
9162
9163# undef MY_DBL_MAX
9164# undef MY_DBL_MAX_BUG
9165# undef MY_DBL_MIN
9166
20f6aaab
AS
9167#endif /* HAS_LDBL_SPRINTF_BUG */
9168
46fc3d4c 9169 need += 20; /* fudge factor */
80252599
GS
9170 if (PL_efloatsize < need) {
9171 Safefree(PL_efloatbuf);
9172 PL_efloatsize = need + 20; /* more fudge */
9173 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9174 PL_efloatbuf[0] = '\0';
46fc3d4c 9175 }
9176
9177 eptr = ebuf + sizeof ebuf;
9178 *--eptr = '\0';
9179 *--eptr = c;
9e5b023a
JH
9180 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9181#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
9182 if (intsize == 'q') {
e5c81feb
JH
9183 /* Copy the one or more characters in a long double
9184 * format before the 'base' ([efgEFG]) character to
9185 * the format string. */
9186 static char const prifldbl[] = PERL_PRIfldbl;
9187 char const *p = prifldbl + sizeof(prifldbl) - 3;
9188 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 9189 }
65202027 9190#endif
46fc3d4c 9191 if (has_precis) {
9192 base = precis;
9193 do { *--eptr = '0' + (base % 10); } while (base /= 10);
9194 *--eptr = '.';
9195 }
9196 if (width) {
9197 base = width;
9198 do { *--eptr = '0' + (base % 10); } while (base /= 10);
9199 }
9200 if (fill == '0')
9201 *--eptr = fill;
84902520
TB
9202 if (left)
9203 *--eptr = '-';
46fc3d4c 9204 if (plus)
9205 *--eptr = plus;
9206 if (alt)
9207 *--eptr = '#';
9208 *--eptr = '%';
9209
ff9121f8
JH
9210 /* No taint. Otherwise we are in the strange situation
9211 * where printf() taints but print($float) doesn't.
bda0f7a5 9212 * --jhi */
9e5b023a
JH
9213#if defined(HAS_LONG_DOUBLE)
9214 if (intsize == 'q')
9215 (void)sprintf(PL_efloatbuf, eptr, nv);
9216 else
9217 (void)sprintf(PL_efloatbuf, eptr, (double)nv);
9218#else
dd8482fc 9219 (void)sprintf(PL_efloatbuf, eptr, nv);
9e5b023a 9220#endif
80252599
GS
9221 eptr = PL_efloatbuf;
9222 elen = strlen(PL_efloatbuf);
46fc3d4c 9223 break;
9224
fc36a67e 9225 /* SPECIAL */
9226
9227 case 'n':
9228 i = SvCUR(sv) - origlen;
be75b157 9229 if (args && !vectorize) {
c635e13b 9230 switch (intsize) {
9231 case 'h': *(va_arg(*args, short*)) = i; break;
9232 default: *(va_arg(*args, int*)) = i; break;
9233 case 'l': *(va_arg(*args, long*)) = i; break;
9234 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
9235#ifdef HAS_QUAD
9236 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
9237#endif
c635e13b 9238 }
fc36a67e 9239 }
9dd79c3f 9240 else
211dfcf1 9241 sv_setuv_mg(argsv, (UV)i);
be75b157 9242 vectorize = FALSE;
fc36a67e 9243 continue; /* not "break" */
9244
9245 /* UNKNOWN */
9246
46fc3d4c 9247 default:
fc36a67e 9248 unknown:
599cee73 9249 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 9250 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 9251 SV *msg = sv_newmortal();
35c1215d
NC
9252 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9253 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 9254 if (c) {
0f4b6630 9255 if (isPRINT(c))
1c846c1f 9256 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
9257 "\"%%%c\"", c & 0xFF);
9258 else
9259 Perl_sv_catpvf(aTHX_ msg,
57def98f 9260 "\"%%\\%03"UVof"\"",
0f4b6630 9261 (UV)c & 0xFF);
0f4b6630 9262 } else
c635e13b 9263 sv_catpv(msg, "end of string");
9014280d 9264 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
c635e13b 9265 }
fb73857a 9266
9267 /* output mangled stuff ... */
9268 if (c == '\0')
9269 --q;
46fc3d4c 9270 eptr = p;
9271 elen = q - p;
fb73857a 9272
9273 /* ... right here, because formatting flags should not apply */
9274 SvGROW(sv, SvCUR(sv) + elen + 1);
9275 p = SvEND(sv);
4459522c 9276 Copy(eptr, p, elen, char);
fb73857a 9277 p += elen;
9278 *p = '\0';
9279 SvCUR(sv) = p - SvPVX(sv);
58e33a90 9280 svix = osvix;
fb73857a 9281 continue; /* not "break" */
46fc3d4c 9282 }
9283
d2876be5
JH
9284 if (is_utf8 != has_utf8) {
9285 if (is_utf8) {
9286 if (SvCUR(sv))
9287 sv_utf8_upgrade(sv);
9288 }
9289 else {
9290 SV *nsv = sv_2mortal(newSVpvn(eptr, elen));
9291 sv_utf8_upgrade(nsv);
9292 eptr = SvPVX(nsv);
9293 elen = SvCUR(nsv);
9294 }
9295 SvGROW(sv, SvCUR(sv) + elen + 1);
9296 p = SvEND(sv);
9297 *p = '\0';
9298 }
9299
fc36a67e 9300 have = esignlen + zeros + elen;
46fc3d4c 9301 need = (have > width ? have : width);
9302 gap = need - have;
9303
b22c7a20 9304 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 9305 p = SvEND(sv);
9306 if (esignlen && fill == '0') {
eb160463 9307 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9308 *p++ = esignbuf[i];
9309 }
9310 if (gap && !left) {
9311 memset(p, fill, gap);
9312 p += gap;
9313 }
9314 if (esignlen && fill != '0') {
eb160463 9315 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9316 *p++ = esignbuf[i];
9317 }
fc36a67e 9318 if (zeros) {
9319 for (i = zeros; i; i--)
9320 *p++ = '0';
9321 }
46fc3d4c 9322 if (elen) {
4459522c 9323 Copy(eptr, p, elen, char);
46fc3d4c 9324 p += elen;
9325 }
9326 if (gap && left) {
9327 memset(p, ' ', gap);
9328 p += gap;
9329 }
b22c7a20
GS
9330 if (vectorize) {
9331 if (veclen) {
4459522c 9332 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
9333 p += dotstrlen;
9334 }
9335 else
9336 vectorize = FALSE; /* done iterating over vecstr */
9337 }
2cf2cfc6
A
9338 if (is_utf8)
9339 has_utf8 = TRUE;
9340 if (has_utf8)
7e2040f0 9341 SvUTF8_on(sv);
46fc3d4c 9342 *p = '\0';
9343 SvCUR(sv) = p - SvPVX(sv);
b22c7a20
GS
9344 if (vectorize) {
9345 esignlen = 0;
9346 goto vector;
9347 }
46fc3d4c 9348 }
9349}
51371543 9350
645c22ef
DM
9351/* =========================================================================
9352
9353=head1 Cloning an interpreter
9354
9355All the macros and functions in this section are for the private use of
9356the main function, perl_clone().
9357
9358The foo_dup() functions make an exact copy of an existing foo thinngy.
9359During the course of a cloning, a hash table is used to map old addresses
9360to new addresses. The table is created and manipulated with the
9361ptr_table_* functions.
9362
9363=cut
9364
9365============================================================================*/
9366
9367
1d7c1841
GS
9368#if defined(USE_ITHREADS)
9369
1d7c1841
GS
9370#ifndef GpREFCNT_inc
9371# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
9372#endif
9373
9374
d2d73c3e
AB
9375#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
9376#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
9377#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9378#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
9379#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9380#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
9381#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9382#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
9383#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
9384#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
9385#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
9386#define SAVEPV(p) (p ? savepv(p) : Nullch)
9387#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 9388
d2d73c3e 9389
d2f185dc
AMS
9390/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
9391 regcomp.c. AMS 20010712 */
645c22ef 9392
1d7c1841 9393REGEXP *
a8fc9800 9394Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
1d7c1841 9395{
d2f185dc
AMS
9396 REGEXP *ret;
9397 int i, len, npar;
9398 struct reg_substr_datum *s;
9399
9400 if (!r)
9401 return (REGEXP *)NULL;
9402
9403 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
9404 return ret;
9405
9406 len = r->offsets[0];
9407 npar = r->nparens+1;
9408
9409 Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
9410 Copy(r->program, ret->program, len+1, regnode);
9411
9412 New(0, ret->startp, npar, I32);
9413 Copy(r->startp, ret->startp, npar, I32);
9414 New(0, ret->endp, npar, I32);
9415 Copy(r->startp, ret->startp, npar, I32);
9416
d2f185dc
AMS
9417 New(0, ret->substrs, 1, struct reg_substr_data);
9418 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
9419 s->min_offset = r->substrs->data[i].min_offset;
9420 s->max_offset = r->substrs->data[i].max_offset;
9421 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
33b8afdf 9422 s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
d2f185dc
AMS
9423 }
9424
70612e96 9425 ret->regstclass = NULL;
d2f185dc
AMS
9426 if (r->data) {
9427 struct reg_data *d;
9428 int count = r->data->count;
9429
9430 Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
9431 char, struct reg_data);
9432 New(0, d->what, count, U8);
9433
9434 d->count = count;
9435 for (i = 0; i < count; i++) {
9436 d->what[i] = r->data->what[i];
9437 switch (d->what[i]) {
9438 case 's':
9439 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
9440 break;
9441 case 'p':
9442 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
9443 break;
9444 case 'f':
9445 /* This is cheating. */
9446 New(0, d->data[i], 1, struct regnode_charclass_class);
9447 StructCopy(r->data->data[i], d->data[i],
9448 struct regnode_charclass_class);
70612e96 9449 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
9450 break;
9451 case 'o':
33773810
AMS
9452 /* Compiled op trees are readonly, and can thus be
9453 shared without duplication. */
9b978d73
DM
9454 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
9455 break;
d2f185dc
AMS
9456 case 'n':
9457 d->data[i] = r->data->data[i];
9458 break;
9459 }
9460 }
9461
9462 ret->data = d;
9463 }
9464 else
9465 ret->data = NULL;
9466
9467 New(0, ret->offsets, 2*len+1, U32);
9468 Copy(r->offsets, ret->offsets, 2*len+1, U32);
9469
9470 ret->precomp = SAVEPV(r->precomp);
d2f185dc
AMS
9471 ret->refcnt = r->refcnt;
9472 ret->minlen = r->minlen;
9473 ret->prelen = r->prelen;
9474 ret->nparens = r->nparens;
9475 ret->lastparen = r->lastparen;
9476 ret->lastcloseparen = r->lastcloseparen;
9477 ret->reganch = r->reganch;
9478
70612e96
RG
9479 ret->sublen = r->sublen;
9480
9481 if (RX_MATCH_COPIED(ret))
9482 ret->subbeg = SAVEPV(r->subbeg);
9483 else
9484 ret->subbeg = Nullch;
9a26048b
NC
9485#ifdef PERL_COPY_ON_WRITE
9486 ret->saved_copy = Nullsv;
9487#endif
70612e96 9488
d2f185dc
AMS
9489 ptr_table_store(PL_ptr_table, r, ret);
9490 return ret;
1d7c1841
GS
9491}
9492
d2d73c3e 9493/* duplicate a file handle */
645c22ef 9494
1d7c1841 9495PerlIO *
a8fc9800 9496Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
9497{
9498 PerlIO *ret;
9499 if (!fp)
9500 return (PerlIO*)NULL;
9501
9502 /* look for it in the table first */
9503 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
9504 if (ret)
9505 return ret;
9506
9507 /* create anew and remember what it is */
ecdeb87c 9508 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
9509 ptr_table_store(PL_ptr_table, fp, ret);
9510 return ret;
9511}
9512
645c22ef
DM
9513/* duplicate a directory handle */
9514
1d7c1841
GS
9515DIR *
9516Perl_dirp_dup(pTHX_ DIR *dp)
9517{
9518 if (!dp)
9519 return (DIR*)NULL;
9520 /* XXX TODO */
9521 return dp;
9522}
9523
ff276b08 9524/* duplicate a typeglob */
645c22ef 9525
1d7c1841 9526GP *
a8fc9800 9527Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
9528{
9529 GP *ret;
9530 if (!gp)
9531 return (GP*)NULL;
9532 /* look for it in the table first */
9533 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
9534 if (ret)
9535 return ret;
9536
9537 /* create anew and remember what it is */
9538 Newz(0, ret, 1, GP);
9539 ptr_table_store(PL_ptr_table, gp, ret);
9540
9541 /* clone */
9542 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
9543 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
9544 ret->gp_io = io_dup_inc(gp->gp_io, param);
9545 ret->gp_form = cv_dup_inc(gp->gp_form, param);
9546 ret->gp_av = av_dup_inc(gp->gp_av, param);
9547 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
9548 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
9549 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
9550 ret->gp_cvgen = gp->gp_cvgen;
9551 ret->gp_flags = gp->gp_flags;
9552 ret->gp_line = gp->gp_line;
9553 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
9554 return ret;
9555}
9556
645c22ef
DM
9557/* duplicate a chain of magic */
9558
1d7c1841 9559MAGIC *
a8fc9800 9560Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 9561{
cb359b41
JH
9562 MAGIC *mgprev = (MAGIC*)NULL;
9563 MAGIC *mgret;
1d7c1841
GS
9564 if (!mg)
9565 return (MAGIC*)NULL;
9566 /* look for it in the table first */
9567 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
9568 if (mgret)
9569 return mgret;
9570
9571 for (; mg; mg = mg->mg_moremagic) {
9572 MAGIC *nmg;
9573 Newz(0, nmg, 1, MAGIC);
cb359b41 9574 if (mgprev)
1d7c1841 9575 mgprev->mg_moremagic = nmg;
cb359b41
JH
9576 else
9577 mgret = nmg;
1d7c1841
GS
9578 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
9579 nmg->mg_private = mg->mg_private;
9580 nmg->mg_type = mg->mg_type;
9581 nmg->mg_flags = mg->mg_flags;
14befaf4 9582 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 9583 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 9584 }
05bd4103
JH
9585 else if(mg->mg_type == PERL_MAGIC_backref) {
9586 AV *av = (AV*) mg->mg_obj;
9587 SV **svp;
9588 I32 i;
9589 nmg->mg_obj = (SV*)newAV();
9590 svp = AvARRAY(av);
9591 i = AvFILLp(av);
9592 while (i >= 0) {
9593 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
9594 i--;
9595 }
9596 }
1d7c1841
GS
9597 else {
9598 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
9599 ? sv_dup_inc(mg->mg_obj, param)
9600 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
9601 }
9602 nmg->mg_len = mg->mg_len;
9603 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 9604 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 9605 if (mg->mg_len > 0) {
1d7c1841 9606 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
9607 if (mg->mg_type == PERL_MAGIC_overload_table &&
9608 AMT_AMAGIC((AMT*)mg->mg_ptr))
9609 {
1d7c1841
GS
9610 AMT *amtp = (AMT*)mg->mg_ptr;
9611 AMT *namtp = (AMT*)nmg->mg_ptr;
9612 I32 i;
9613 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 9614 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
9615 }
9616 }
9617 }
9618 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 9619 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 9620 }
68795e93
NIS
9621 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
9622 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
9623 }
1d7c1841
GS
9624 mgprev = nmg;
9625 }
9626 return mgret;
9627}
9628
645c22ef
DM
9629/* create a new pointer-mapping table */
9630
1d7c1841
GS
9631PTR_TBL_t *
9632Perl_ptr_table_new(pTHX)
9633{
9634 PTR_TBL_t *tbl;
9635 Newz(0, tbl, 1, PTR_TBL_t);
9636 tbl->tbl_max = 511;
9637 tbl->tbl_items = 0;
9638 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
9639 return tbl;
9640}
9641
645c22ef
DM
9642/* map an existing pointer using a table */
9643
1d7c1841
GS
9644void *
9645Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
9646{
9647 PTR_TBL_ENT_t *tblent;
d2a79402 9648 UV hash = PTR2UV(sv);
1d7c1841
GS
9649 assert(tbl);
9650 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
9651 for (; tblent; tblent = tblent->next) {
9652 if (tblent->oldval == sv)
9653 return tblent->newval;
9654 }
9655 return (void*)NULL;
9656}
9657
645c22ef
DM
9658/* add a new entry to a pointer-mapping table */
9659
1d7c1841
GS
9660void
9661Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
9662{
9663 PTR_TBL_ENT_t *tblent, **otblent;
9664 /* XXX this may be pessimal on platforms where pointers aren't good
9665 * hash values e.g. if they grow faster in the most significant
9666 * bits */
d2a79402 9667 UV hash = PTR2UV(oldv);
1d7c1841
GS
9668 bool i = 1;
9669
9670 assert(tbl);
9671 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
9672 for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
9673 if (tblent->oldval == oldv) {
9674 tblent->newval = newv;
1d7c1841
GS
9675 return;
9676 }
9677 }
9678 Newz(0, tblent, 1, PTR_TBL_ENT_t);
9679 tblent->oldval = oldv;
9680 tblent->newval = newv;
9681 tblent->next = *otblent;
9682 *otblent = tblent;
9683 tbl->tbl_items++;
9684 if (i && tbl->tbl_items > tbl->tbl_max)
9685 ptr_table_split(tbl);
9686}
9687
645c22ef
DM
9688/* double the hash bucket size of an existing ptr table */
9689
1d7c1841
GS
9690void
9691Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
9692{
9693 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
9694 UV oldsize = tbl->tbl_max + 1;
9695 UV newsize = oldsize * 2;
9696 UV i;
9697
9698 Renew(ary, newsize, PTR_TBL_ENT_t*);
9699 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
9700 tbl->tbl_max = --newsize;
9701 tbl->tbl_ary = ary;
9702 for (i=0; i < oldsize; i++, ary++) {
9703 PTR_TBL_ENT_t **curentp, **entp, *ent;
9704 if (!*ary)
9705 continue;
9706 curentp = ary + oldsize;
9707 for (entp = ary, ent = *ary; ent; ent = *entp) {
d2a79402 9708 if ((newsize & PTR2UV(ent->oldval)) != i) {
1d7c1841
GS
9709 *entp = ent->next;
9710 ent->next = *curentp;
9711 *curentp = ent;
9712 continue;
9713 }
9714 else
9715 entp = &ent->next;
9716 }
9717 }
9718}
9719
645c22ef
DM
9720/* remove all the entries from a ptr table */
9721
a0739874
DM
9722void
9723Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
9724{
9725 register PTR_TBL_ENT_t **array;
9726 register PTR_TBL_ENT_t *entry;
9727 register PTR_TBL_ENT_t *oentry = Null(PTR_TBL_ENT_t*);
9728 UV riter = 0;
9729 UV max;
9730
9731 if (!tbl || !tbl->tbl_items) {
9732 return;
9733 }
9734
9735 array = tbl->tbl_ary;
9736 entry = array[0];
9737 max = tbl->tbl_max;
9738
9739 for (;;) {
9740 if (entry) {
9741 oentry = entry;
9742 entry = entry->next;
9743 Safefree(oentry);
9744 }
9745 if (!entry) {
9746 if (++riter > max) {
9747 break;
9748 }
9749 entry = array[riter];
9750 }
9751 }
9752
9753 tbl->tbl_items = 0;
9754}
9755
645c22ef
DM
9756/* clear and free a ptr table */
9757
a0739874
DM
9758void
9759Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
9760{
9761 if (!tbl) {
9762 return;
9763 }
9764 ptr_table_clear(tbl);
9765 Safefree(tbl->tbl_ary);
9766 Safefree(tbl);
9767}
9768
1d7c1841
GS
9769#ifdef DEBUGGING
9770char *PL_watch_pvx;
9771#endif
9772
645c22ef
DM
9773/* attempt to make everything in the typeglob readonly */
9774
5bd07a3d 9775STATIC SV *
59b40662 9776S_gv_share(pTHX_ SV *sstr, CLONE_PARAMS *param)
5bd07a3d
DM
9777{
9778 GV *gv = (GV*)sstr;
59b40662 9779 SV *sv = &param->proto_perl->Isv_no; /* just need SvREADONLY-ness */
5bd07a3d
DM
9780
9781 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 9782 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
9783 }
9784 else if (!GvCV(gv)) {
9785 GvCV(gv) = (CV*)sv;
9786 }
9787 else {
9788 /* CvPADLISTs cannot be shared */
37e20706 9789 if (!SvREADONLY(GvCV(gv)) && !CvXSUB(GvCV(gv))) {
7fb37951 9790 GvUNIQUE_off(gv);
5bd07a3d
DM
9791 }
9792 }
9793
7fb37951 9794 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
9795#if 0
9796 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
9797 HvNAME(GvSTASH(gv)), GvNAME(gv));
9798#endif
9799 return Nullsv;
9800 }
9801
4411f3b6 9802 /*
5bd07a3d
DM
9803 * write attempts will die with
9804 * "Modification of a read-only value attempted"
9805 */
9806 if (!GvSV(gv)) {
9807 GvSV(gv) = sv;
9808 }
9809 else {
9810 SvREADONLY_on(GvSV(gv));
9811 }
9812
9813 if (!GvAV(gv)) {
9814 GvAV(gv) = (AV*)sv;
9815 }
9816 else {
9817 SvREADONLY_on(GvAV(gv));
9818 }
9819
9820 if (!GvHV(gv)) {
9821 GvHV(gv) = (HV*)sv;
9822 }
9823 else {
9824 SvREADONLY_on(GvAV(gv));
9825 }
9826
9827 return sstr; /* he_dup() will SvREFCNT_inc() */
9828}
9829
645c22ef
DM
9830/* duplicate an SV of any type (including AV, HV etc) */
9831
83841fad
NIS
9832void
9833Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
9834{
9835 if (SvROK(sstr)) {
d3d0e6f1 9836 SvRV(dstr) = SvWEAKREF(sstr)
83841fad
NIS
9837 ? sv_dup(SvRV(sstr), param)
9838 : sv_dup_inc(SvRV(sstr), param);
9839 }
9840 else if (SvPVX(sstr)) {
9841 /* Has something there */
9842 if (SvLEN(sstr)) {
68795e93 9843 /* Normal PV - clone whole allocated space */
83841fad 9844 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
d3d0e6f1
NC
9845 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
9846 /* Not that normal - actually sstr is copy on write.
9847 But we are a true, independant SV, so: */
9848 SvREADONLY_off(dstr);
9849 SvFAKE_off(dstr);
9850 }
68795e93 9851 }
83841fad
NIS
9852 else {
9853 /* Special case - not normally malloced for some reason */
9854 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
9855 /* A "shared" PV - clone it as unshared string */
9856 SvFAKE_off(dstr);
9857 SvREADONLY_off(dstr);
9858 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvCUR(sstr));
9859 }
9860 else {
9861 /* Some other special case - random pointer */
9862 SvPVX(dstr) = SvPVX(sstr);
d3d0e6f1 9863 }
83841fad
NIS
9864 }
9865 }
9866 else {
9867 /* Copy the Null */
9868 SvPVX(dstr) = SvPVX(sstr);
9869 }
9870}
9871
1d7c1841 9872SV *
a8fc9800 9873Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
1d7c1841 9874{
1d7c1841
GS
9875 SV *dstr;
9876
9877 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
9878 return Nullsv;
9879 /* look for it in the table first */
9880 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
9881 if (dstr)
9882 return dstr;
9883
0405e91e
AB
9884 if(param->flags & CLONEf_JOIN_IN) {
9885 /** We are joining here so we don't want do clone
9886 something that is bad **/
9887
9888 if(SvTYPE(sstr) == SVt_PVHV &&
9889 HvNAME(sstr)) {
9890 /** don't clone stashes if they already exist **/
9891 HV* old_stash = gv_stashpv(HvNAME(sstr),0);
9892 return (SV*) old_stash;
9893 }
9894 }
9895
1d7c1841
GS
9896 /* create anew and remember what it is */
9897 new_SV(dstr);
9898 ptr_table_store(PL_ptr_table, sstr, dstr);
9899
9900 /* clone */
9901 SvFLAGS(dstr) = SvFLAGS(sstr);
9902 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
9903 SvREFCNT(dstr) = 0; /* must be before any other dups! */
9904
9905#ifdef DEBUGGING
9906 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
9907 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
9908 PL_watch_pvx, SvPVX(sstr));
9909#endif
9910
9911 switch (SvTYPE(sstr)) {
9912 case SVt_NULL:
9913 SvANY(dstr) = NULL;
9914 break;
9915 case SVt_IV:
9916 SvANY(dstr) = new_XIV();
9917 SvIVX(dstr) = SvIVX(sstr);
9918 break;
9919 case SVt_NV:
9920 SvANY(dstr) = new_XNV();
9921 SvNVX(dstr) = SvNVX(sstr);
9922 break;
9923 case SVt_RV:
9924 SvANY(dstr) = new_XRV();
83841fad 9925 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9926 break;
9927 case SVt_PV:
9928 SvANY(dstr) = new_XPV();
9929 SvCUR(dstr) = SvCUR(sstr);
9930 SvLEN(dstr) = SvLEN(sstr);
83841fad 9931 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9932 break;
9933 case SVt_PVIV:
9934 SvANY(dstr) = new_XPVIV();
9935 SvCUR(dstr) = SvCUR(sstr);
9936 SvLEN(dstr) = SvLEN(sstr);
9937 SvIVX(dstr) = SvIVX(sstr);
83841fad 9938 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9939 break;
9940 case SVt_PVNV:
9941 SvANY(dstr) = new_XPVNV();
9942 SvCUR(dstr) = SvCUR(sstr);
9943 SvLEN(dstr) = SvLEN(sstr);
9944 SvIVX(dstr) = SvIVX(sstr);
9945 SvNVX(dstr) = SvNVX(sstr);
83841fad 9946 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9947 break;
9948 case SVt_PVMG:
9949 SvANY(dstr) = new_XPVMG();
9950 SvCUR(dstr) = SvCUR(sstr);
9951 SvLEN(dstr) = SvLEN(sstr);
9952 SvIVX(dstr) = SvIVX(sstr);
9953 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9954 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9955 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9956 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9957 break;
9958 case SVt_PVBM:
9959 SvANY(dstr) = new_XPVBM();
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 BmRARE(dstr) = BmRARE(sstr);
9968 BmUSEFUL(dstr) = BmUSEFUL(sstr);
9969 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
9970 break;
9971 case SVt_PVLV:
9972 SvANY(dstr) = new_XPVLV();
9973 SvCUR(dstr) = SvCUR(sstr);
9974 SvLEN(dstr) = SvLEN(sstr);
9975 SvIVX(dstr) = SvIVX(sstr);
9976 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9977 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9978 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9979 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9980 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
9981 LvTARGLEN(dstr) = LvTARGLEN(sstr);
d2d73c3e 9982 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr), param);
1d7c1841
GS
9983 LvTYPE(dstr) = LvTYPE(sstr);
9984 break;
9985 case SVt_PVGV:
7fb37951 9986 if (GvUNIQUE((GV*)sstr)) {
5bd07a3d 9987 SV *share;
59b40662 9988 if ((share = gv_share(sstr, param))) {
5bd07a3d
DM
9989 del_SV(dstr);
9990 dstr = share;
37e20706 9991 ptr_table_store(PL_ptr_table, sstr, dstr);
5bd07a3d
DM
9992#if 0
9993 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
9994 HvNAME(GvSTASH(share)), GvNAME(share));
9995#endif
9996 break;
9997 }
9998 }
1d7c1841
GS
9999 SvANY(dstr) = new_XPVGV();
10000 SvCUR(dstr) = SvCUR(sstr);
10001 SvLEN(dstr) = SvLEN(sstr);
10002 SvIVX(dstr) = SvIVX(sstr);
10003 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10004 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10005 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10006 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
10007 GvNAMELEN(dstr) = GvNAMELEN(sstr);
10008 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
d2d73c3e 10009 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr), param);
1d7c1841 10010 GvFLAGS(dstr) = GvFLAGS(sstr);
d2d73c3e 10011 GvGP(dstr) = gp_dup(GvGP(sstr), param);
1d7c1841
GS
10012 (void)GpREFCNT_inc(GvGP(dstr));
10013 break;
10014 case SVt_PVIO:
10015 SvANY(dstr) = new_XPVIO();
10016 SvCUR(dstr) = SvCUR(sstr);
10017 SvLEN(dstr) = SvLEN(sstr);
10018 SvIVX(dstr) = SvIVX(sstr);
10019 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10020 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10021 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10022 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
a8fc9800 10023 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10024 if (IoOFP(sstr) == IoIFP(sstr))
10025 IoOFP(dstr) = IoIFP(dstr);
10026 else
a8fc9800 10027 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
10028 /* PL_rsfp_filters entries have fake IoDIRP() */
10029 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
10030 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
10031 else
10032 IoDIRP(dstr) = IoDIRP(sstr);
10033 IoLINES(dstr) = IoLINES(sstr);
10034 IoPAGE(dstr) = IoPAGE(sstr);
10035 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
10036 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
10037 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
d2d73c3e 10038 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr), param);
1d7c1841 10039 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
d2d73c3e 10040 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr), param);
1d7c1841 10041 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
d2d73c3e 10042 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr), param);
1d7c1841
GS
10043 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
10044 IoTYPE(dstr) = IoTYPE(sstr);
10045 IoFLAGS(dstr) = IoFLAGS(sstr);
10046 break;
10047 case SVt_PVAV:
10048 SvANY(dstr) = new_XPVAV();
10049 SvCUR(dstr) = SvCUR(sstr);
10050 SvLEN(dstr) = SvLEN(sstr);
10051 SvIVX(dstr) = SvIVX(sstr);
10052 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10053 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10054 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
10055 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
1d7c1841
GS
10056 AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
10057 if (AvARRAY((AV*)sstr)) {
10058 SV **dst_ary, **src_ary;
10059 SSize_t items = AvFILLp((AV*)sstr) + 1;
10060
10061 src_ary = AvARRAY((AV*)sstr);
10062 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
10063 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
10064 SvPVX(dstr) = (char*)dst_ary;
10065 AvALLOC((AV*)dstr) = dst_ary;
10066 if (AvREAL((AV*)sstr)) {
10067 while (items-- > 0)
d2d73c3e 10068 *dst_ary++ = sv_dup_inc(*src_ary++, param);
1d7c1841
GS
10069 }
10070 else {
10071 while (items-- > 0)
d2d73c3e 10072 *dst_ary++ = sv_dup(*src_ary++, param);
1d7c1841
GS
10073 }
10074 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10075 while (items-- > 0) {
10076 *dst_ary++ = &PL_sv_undef;
10077 }
10078 }
10079 else {
10080 SvPVX(dstr) = Nullch;
10081 AvALLOC((AV*)dstr) = (SV**)NULL;
10082 }
10083 break;
10084 case SVt_PVHV:
10085 SvANY(dstr) = new_XPVHV();
10086 SvCUR(dstr) = SvCUR(sstr);
10087 SvLEN(dstr) = SvLEN(sstr);
10088 SvIVX(dstr) = SvIVX(sstr);
10089 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10090 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10091 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841
GS
10092 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
10093 if (HvARRAY((HV*)sstr)) {
1d7c1841
GS
10094 STRLEN i = 0;
10095 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
10096 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
10097 Newz(0, dxhv->xhv_array,
10098 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
10099 while (i <= sxhv->xhv_max) {
10100 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
eb160463
GS
10101 (bool)!!HvSHAREKEYS(sstr),
10102 param);
1d7c1841
GS
10103 ++i;
10104 }
eb160463
GS
10105 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter,
10106 (bool)!!HvSHAREKEYS(sstr), param);
1d7c1841
GS
10107 }
10108 else {
10109 SvPVX(dstr) = Nullch;
10110 HvEITER((HV*)dstr) = (HE*)NULL;
10111 }
10112 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
10113 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
c43294b8 10114 /* Record stashes for possible cloning in Perl_clone(). */
6676db26 10115 if(HvNAME((HV*)dstr))
d2d73c3e 10116 av_push(param->stashes, dstr);
1d7c1841
GS
10117 break;
10118 case SVt_PVFM:
10119 SvANY(dstr) = new_XPVFM();
10120 FmLINES(dstr) = FmLINES(sstr);
10121 goto dup_pvcv;
10122 /* NOTREACHED */
10123 case SVt_PVCV:
10124 SvANY(dstr) = new_XPVCV();
d2d73c3e 10125 dup_pvcv:
1d7c1841
GS
10126 SvCUR(dstr) = SvCUR(sstr);
10127 SvLEN(dstr) = SvLEN(sstr);
10128 SvIVX(dstr) = SvIVX(sstr);
10129 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
10130 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
10131 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 10132 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
d2d73c3e 10133 CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
1d7c1841
GS
10134 CvSTART(dstr) = CvSTART(sstr);
10135 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
10136 CvXSUB(dstr) = CvXSUB(sstr);
10137 CvXSUBANY(dstr) = CvXSUBANY(sstr);
01485f8b
DM
10138 if (CvCONST(sstr)) {
10139 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
10140 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
10141 sv_dup_inc(CvXSUBANY(sstr).any_ptr, param);
10142 }
d2d73c3e
AB
10143 CvGV(dstr) = gv_dup(CvGV(sstr), param);
10144 if (param->flags & CLONEf_COPY_STACKS) {
10145 CvDEPTH(dstr) = CvDEPTH(sstr);
10146 } else {
10147 CvDEPTH(dstr) = 0;
10148 }
dd2155a4 10149 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
7dafbf52
DM
10150 CvOUTSIDE_SEQ(dstr) = CvOUTSIDE_SEQ(sstr);
10151 CvOUTSIDE(dstr) =
10152 CvWEAKOUTSIDE(sstr)
10153 ? cv_dup( CvOUTSIDE(sstr), param)
10154 : cv_dup_inc(CvOUTSIDE(sstr), param);
1d7c1841 10155 CvFLAGS(dstr) = CvFLAGS(sstr);
54356c7d 10156 CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
1d7c1841
GS
10157 break;
10158 default:
c803eecc 10159 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
1d7c1841
GS
10160 break;
10161 }
10162
10163 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
10164 ++PL_sv_objcount;
10165
10166 return dstr;
d2d73c3e 10167 }
1d7c1841 10168
645c22ef
DM
10169/* duplicate a context */
10170
1d7c1841 10171PERL_CONTEXT *
a8fc9800 10172Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
10173{
10174 PERL_CONTEXT *ncxs;
10175
10176 if (!cxs)
10177 return (PERL_CONTEXT*)NULL;
10178
10179 /* look for it in the table first */
10180 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
10181 if (ncxs)
10182 return ncxs;
10183
10184 /* create anew and remember what it is */
10185 Newz(56, ncxs, max + 1, PERL_CONTEXT);
10186 ptr_table_store(PL_ptr_table, cxs, ncxs);
10187
10188 while (ix >= 0) {
10189 PERL_CONTEXT *cx = &cxs[ix];
10190 PERL_CONTEXT *ncx = &ncxs[ix];
10191 ncx->cx_type = cx->cx_type;
10192 if (CxTYPE(cx) == CXt_SUBST) {
10193 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
10194 }
10195 else {
10196 ncx->blk_oldsp = cx->blk_oldsp;
10197 ncx->blk_oldcop = cx->blk_oldcop;
10198 ncx->blk_oldretsp = cx->blk_oldretsp;
10199 ncx->blk_oldmarksp = cx->blk_oldmarksp;
10200 ncx->blk_oldscopesp = cx->blk_oldscopesp;
10201 ncx->blk_oldpm = cx->blk_oldpm;
10202 ncx->blk_gimme = cx->blk_gimme;
10203 switch (CxTYPE(cx)) {
10204 case CXt_SUB:
10205 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
10206 ? cv_dup_inc(cx->blk_sub.cv, param)
10207 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 10208 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 10209 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 10210 : Nullav);
d2d73c3e 10211 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
10212 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
10213 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10214 ncx->blk_sub.lval = cx->blk_sub.lval;
10215 break;
10216 case CXt_EVAL:
10217 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
10218 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 10219 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 10220 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 10221 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
1d7c1841
GS
10222 break;
10223 case CXt_LOOP:
10224 ncx->blk_loop.label = cx->blk_loop.label;
10225 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
10226 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
10227 ncx->blk_loop.next_op = cx->blk_loop.next_op;
10228 ncx->blk_loop.last_op = cx->blk_loop.last_op;
10229 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
10230 ? cx->blk_loop.iterdata
d2d73c3e 10231 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
10232 ncx->blk_loop.oldcomppad
10233 = (PAD*)ptr_table_fetch(PL_ptr_table,
10234 cx->blk_loop.oldcomppad);
d2d73c3e
AB
10235 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
10236 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
10237 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
10238 ncx->blk_loop.iterix = cx->blk_loop.iterix;
10239 ncx->blk_loop.itermax = cx->blk_loop.itermax;
10240 break;
10241 case CXt_FORMAT:
d2d73c3e
AB
10242 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
10243 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
10244 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841
GS
10245 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10246 break;
10247 case CXt_BLOCK:
10248 case CXt_NULL:
10249 break;
10250 }
10251 }
10252 --ix;
10253 }
10254 return ncxs;
10255}
10256
645c22ef
DM
10257/* duplicate a stack info structure */
10258
1d7c1841 10259PERL_SI *
a8fc9800 10260Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
10261{
10262 PERL_SI *nsi;
10263
10264 if (!si)
10265 return (PERL_SI*)NULL;
10266
10267 /* look for it in the table first */
10268 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
10269 if (nsi)
10270 return nsi;
10271
10272 /* create anew and remember what it is */
10273 Newz(56, nsi, 1, PERL_SI);
10274 ptr_table_store(PL_ptr_table, si, nsi);
10275
d2d73c3e 10276 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
10277 nsi->si_cxix = si->si_cxix;
10278 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 10279 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 10280 nsi->si_type = si->si_type;
d2d73c3e
AB
10281 nsi->si_prev = si_dup(si->si_prev, param);
10282 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
10283 nsi->si_markoff = si->si_markoff;
10284
10285 return nsi;
10286}
10287
10288#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
10289#define TOPINT(ss,ix) ((ss)[ix].any_i32)
10290#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
10291#define TOPLONG(ss,ix) ((ss)[ix].any_long)
10292#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
10293#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
10294#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
10295#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
10296#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
10297#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
10298#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
10299#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
10300#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
10301#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
10302
10303/* XXXXX todo */
10304#define pv_dup_inc(p) SAVEPV(p)
10305#define pv_dup(p) SAVEPV(p)
10306#define svp_dup_inc(p,pp) any_dup(p,pp)
10307
645c22ef
DM
10308/* map any object to the new equivent - either something in the
10309 * ptr table, or something in the interpreter structure
10310 */
10311
1d7c1841
GS
10312void *
10313Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
10314{
10315 void *ret;
10316
10317 if (!v)
10318 return (void*)NULL;
10319
10320 /* look for it in the table first */
10321 ret = ptr_table_fetch(PL_ptr_table, v);
10322 if (ret)
10323 return ret;
10324
10325 /* see if it is part of the interpreter structure */
10326 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 10327 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 10328 else {
1d7c1841 10329 ret = v;
05ec9bb3 10330 }
1d7c1841
GS
10331
10332 return ret;
10333}
10334
645c22ef
DM
10335/* duplicate the save stack */
10336
1d7c1841 10337ANY *
a8fc9800 10338Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841
GS
10339{
10340 ANY *ss = proto_perl->Tsavestack;
10341 I32 ix = proto_perl->Tsavestack_ix;
10342 I32 max = proto_perl->Tsavestack_max;
10343 ANY *nss;
10344 SV *sv;
10345 GV *gv;
10346 AV *av;
10347 HV *hv;
10348 void* ptr;
10349 int intval;
10350 long longval;
10351 GP *gp;
10352 IV iv;
10353 I32 i;
c4e33207 10354 char *c = NULL;
1d7c1841 10355 void (*dptr) (void*);
acfe0abc 10356 void (*dxptr) (pTHX_ void*);
e977893f 10357 OP *o;
1d7c1841
GS
10358
10359 Newz(54, nss, max, ANY);
10360
10361 while (ix > 0) {
10362 i = POPINT(ss,ix);
10363 TOPINT(nss,ix) = i;
10364 switch (i) {
10365 case SAVEt_ITEM: /* normal string */
10366 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10367 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10368 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10369 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10370 break;
10371 case SAVEt_SV: /* scalar reference */
10372 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10373 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10374 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10375 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 10376 break;
f4dd75d9
GS
10377 case SAVEt_GENERIC_PVREF: /* generic char* */
10378 c = (char*)POPPTR(ss,ix);
10379 TOPPTR(nss,ix) = pv_dup(c);
10380 ptr = POPPTR(ss,ix);
10381 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10382 break;
05ec9bb3
NIS
10383 case SAVEt_SHARED_PVREF: /* char* in shared space */
10384 c = (char*)POPPTR(ss,ix);
10385 TOPPTR(nss,ix) = savesharedpv(c);
10386 ptr = POPPTR(ss,ix);
10387 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10388 break;
1d7c1841
GS
10389 case SAVEt_GENERIC_SVREF: /* generic sv */
10390 case SAVEt_SVREF: /* scalar reference */
10391 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10392 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10393 ptr = POPPTR(ss,ix);
10394 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
10395 break;
10396 case SAVEt_AV: /* array reference */
10397 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10398 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 10399 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10400 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10401 break;
10402 case SAVEt_HV: /* hash reference */
10403 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10404 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 10405 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10406 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10407 break;
10408 case SAVEt_INT: /* int reference */
10409 ptr = POPPTR(ss,ix);
10410 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10411 intval = (int)POPINT(ss,ix);
10412 TOPINT(nss,ix) = intval;
10413 break;
10414 case SAVEt_LONG: /* long reference */
10415 ptr = POPPTR(ss,ix);
10416 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10417 longval = (long)POPLONG(ss,ix);
10418 TOPLONG(nss,ix) = longval;
10419 break;
10420 case SAVEt_I32: /* I32 reference */
10421 case SAVEt_I16: /* I16 reference */
10422 case SAVEt_I8: /* I8 reference */
10423 ptr = POPPTR(ss,ix);
10424 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10425 i = POPINT(ss,ix);
10426 TOPINT(nss,ix) = i;
10427 break;
10428 case SAVEt_IV: /* IV reference */
10429 ptr = POPPTR(ss,ix);
10430 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10431 iv = POPIV(ss,ix);
10432 TOPIV(nss,ix) = iv;
10433 break;
10434 case SAVEt_SPTR: /* SV* reference */
10435 ptr = POPPTR(ss,ix);
10436 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10437 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10438 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
10439 break;
10440 case SAVEt_VPTR: /* random* reference */
10441 ptr = POPPTR(ss,ix);
10442 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10443 ptr = POPPTR(ss,ix);
10444 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10445 break;
10446 case SAVEt_PPTR: /* char* reference */
10447 ptr = POPPTR(ss,ix);
10448 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10449 c = (char*)POPPTR(ss,ix);
10450 TOPPTR(nss,ix) = pv_dup(c);
10451 break;
10452 case SAVEt_HPTR: /* HV* reference */
10453 ptr = POPPTR(ss,ix);
10454 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10455 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10456 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
10457 break;
10458 case SAVEt_APTR: /* AV* reference */
10459 ptr = POPPTR(ss,ix);
10460 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10461 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10462 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
10463 break;
10464 case SAVEt_NSTAB:
10465 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 10466 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
10467 break;
10468 case SAVEt_GP: /* scalar reference */
10469 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 10470 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
10471 (void)GpREFCNT_inc(gp);
10472 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 10473 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
10474 c = (char*)POPPTR(ss,ix);
10475 TOPPTR(nss,ix) = pv_dup(c);
10476 iv = POPIV(ss,ix);
10477 TOPIV(nss,ix) = iv;
10478 iv = POPIV(ss,ix);
10479 TOPIV(nss,ix) = iv;
10480 break;
10481 case SAVEt_FREESV:
26d9b02f 10482 case SAVEt_MORTALIZESV:
1d7c1841 10483 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10484 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10485 break;
10486 case SAVEt_FREEOP:
10487 ptr = POPPTR(ss,ix);
10488 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
10489 /* these are assumed to be refcounted properly */
10490 switch (((OP*)ptr)->op_type) {
10491 case OP_LEAVESUB:
10492 case OP_LEAVESUBLV:
10493 case OP_LEAVEEVAL:
10494 case OP_LEAVE:
10495 case OP_SCOPE:
10496 case OP_LEAVEWRITE:
e977893f
GS
10497 TOPPTR(nss,ix) = ptr;
10498 o = (OP*)ptr;
10499 OpREFCNT_inc(o);
1d7c1841
GS
10500 break;
10501 default:
10502 TOPPTR(nss,ix) = Nullop;
10503 break;
10504 }
10505 }
10506 else
10507 TOPPTR(nss,ix) = Nullop;
10508 break;
10509 case SAVEt_FREEPV:
10510 c = (char*)POPPTR(ss,ix);
10511 TOPPTR(nss,ix) = pv_dup_inc(c);
10512 break;
10513 case SAVEt_CLEARSV:
10514 longval = POPLONG(ss,ix);
10515 TOPLONG(nss,ix) = longval;
10516 break;
10517 case SAVEt_DELETE:
10518 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10519 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10520 c = (char*)POPPTR(ss,ix);
10521 TOPPTR(nss,ix) = pv_dup_inc(c);
10522 i = POPINT(ss,ix);
10523 TOPINT(nss,ix) = i;
10524 break;
10525 case SAVEt_DESTRUCTOR:
10526 ptr = POPPTR(ss,ix);
10527 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10528 dptr = POPDPTR(ss,ix);
ef75a179 10529 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
10530 break;
10531 case SAVEt_DESTRUCTOR_X:
10532 ptr = POPPTR(ss,ix);
10533 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10534 dxptr = POPDXPTR(ss,ix);
acfe0abc 10535 TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
10536 break;
10537 case SAVEt_REGCONTEXT:
10538 case SAVEt_ALLOC:
10539 i = POPINT(ss,ix);
10540 TOPINT(nss,ix) = i;
10541 ix -= i;
10542 break;
10543 case SAVEt_STACK_POS: /* Position on Perl stack */
10544 i = POPINT(ss,ix);
10545 TOPINT(nss,ix) = i;
10546 break;
10547 case SAVEt_AELEM: /* array element */
10548 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10549 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10550 i = POPINT(ss,ix);
10551 TOPINT(nss,ix) = i;
10552 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10553 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
10554 break;
10555 case SAVEt_HELEM: /* hash element */
10556 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10557 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10558 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10559 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10560 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10561 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10562 break;
10563 case SAVEt_OP:
10564 ptr = POPPTR(ss,ix);
10565 TOPPTR(nss,ix) = ptr;
10566 break;
10567 case SAVEt_HINTS:
10568 i = POPINT(ss,ix);
10569 TOPINT(nss,ix) = i;
10570 break;
c4410b1b
GS
10571 case SAVEt_COMPPAD:
10572 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10573 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 10574 break;
c3564e5c
GS
10575 case SAVEt_PADSV:
10576 longval = (long)POPLONG(ss,ix);
10577 TOPLONG(nss,ix) = longval;
10578 ptr = POPPTR(ss,ix);
10579 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10580 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10581 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 10582 break;
a1bb4754 10583 case SAVEt_BOOL:
38d8b13e 10584 ptr = POPPTR(ss,ix);
b9609c01 10585 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 10586 longval = (long)POPBOOL(ss,ix);
b9609c01 10587 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 10588 break;
1d7c1841
GS
10589 default:
10590 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
10591 }
10592 }
10593
10594 return nss;
10595}
10596
645c22ef
DM
10597/*
10598=for apidoc perl_clone
10599
10600Create and return a new interpreter by cloning the current one.
10601
6a78b4db
AB
10602perl_clone takes these flags as paramters:
10603
10604CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
10605without it we only clone the data and zero the stacks,
10606with it we copy the stacks and the new perl interpreter is
10607ready to run at the exact same point as the previous one.
10608The pseudo-fork code uses COPY_STACKS while the
10609threads->new doesn't.
10610
10611CLONEf_KEEP_PTR_TABLE
10612perl_clone keeps a ptr_table with the pointer of the old
10613variable as a key and the new variable as a value,
10614this allows it to check if something has been cloned and not
10615clone it again but rather just use the value and increase the
10616refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
10617the ptr_table using the function
10618C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
10619reason to keep it around is if you want to dup some of your own
10620variable who are outside the graph perl scans, example of this
10621code is in threads.xs create
10622
10623CLONEf_CLONE_HOST
10624This is a win32 thing, it is ignored on unix, it tells perls
10625win32host code (which is c++) to clone itself, this is needed on
10626win32 if you want to run two threads at the same time,
10627if you just want to do some stuff in a separate perl interpreter
10628and then throw it away and return to the original one,
10629you don't need to do anything.
10630
645c22ef
DM
10631=cut
10632*/
10633
10634/* XXX the above needs expanding by someone who actually understands it ! */
3fc56081
NK
10635EXTERN_C PerlInterpreter *
10636perl_clone_host(PerlInterpreter* proto_perl, UV flags);
645c22ef 10637
1d7c1841
GS
10638PerlInterpreter *
10639perl_clone(PerlInterpreter *proto_perl, UV flags)
10640{
1d7c1841 10641#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
10642
10643 /* perlhost.h so we need to call into it
10644 to clone the host, CPerlHost should have a c interface, sky */
10645
10646 if (flags & CLONEf_CLONE_HOST) {
10647 return perl_clone_host(proto_perl,flags);
10648 }
10649 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
10650 proto_perl->IMem,
10651 proto_perl->IMemShared,
10652 proto_perl->IMemParse,
10653 proto_perl->IEnv,
10654 proto_perl->IStdIO,
10655 proto_perl->ILIO,
10656 proto_perl->IDir,
10657 proto_perl->ISock,
10658 proto_perl->IProc);
10659}
10660
10661PerlInterpreter *
10662perl_clone_using(PerlInterpreter *proto_perl, UV flags,
10663 struct IPerlMem* ipM, struct IPerlMem* ipMS,
10664 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
10665 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
10666 struct IPerlDir* ipD, struct IPerlSock* ipS,
10667 struct IPerlProc* ipP)
10668{
10669 /* XXX many of the string copies here can be optimized if they're
10670 * constants; they need to be allocated as common memory and just
10671 * their pointers copied. */
10672
10673 IV i;
64aa0685
GS
10674 CLONE_PARAMS clone_params;
10675 CLONE_PARAMS* param = &clone_params;
d2d73c3e 10676
1d7c1841 10677 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
ba869deb 10678 PERL_SET_THX(my_perl);
1d7c1841 10679
acfe0abc 10680# ifdef DEBUGGING
a4530404 10681 Poison(my_perl, 1, PerlInterpreter);
1d7c1841
GS
10682 PL_markstack = 0;
10683 PL_scopestack = 0;
10684 PL_savestack = 0;
10685 PL_retstack = 0;
66fe0623 10686 PL_sig_pending = 0;
25596c82 10687 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
acfe0abc 10688# else /* !DEBUGGING */
1d7c1841 10689 Zero(my_perl, 1, PerlInterpreter);
acfe0abc 10690# endif /* DEBUGGING */
1d7c1841
GS
10691
10692 /* host pointers */
10693 PL_Mem = ipM;
10694 PL_MemShared = ipMS;
10695 PL_MemParse = ipMP;
10696 PL_Env = ipE;
10697 PL_StdIO = ipStd;
10698 PL_LIO = ipLIO;
10699 PL_Dir = ipD;
10700 PL_Sock = ipS;
10701 PL_Proc = ipP;
1d7c1841
GS
10702#else /* !PERL_IMPLICIT_SYS */
10703 IV i;
64aa0685
GS
10704 CLONE_PARAMS clone_params;
10705 CLONE_PARAMS* param = &clone_params;
1d7c1841 10706 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 10707 PERL_SET_THX(my_perl);
1d7c1841 10708
d2d73c3e
AB
10709
10710
1d7c1841 10711# ifdef DEBUGGING
a4530404 10712 Poison(my_perl, 1, PerlInterpreter);
1d7c1841
GS
10713 PL_markstack = 0;
10714 PL_scopestack = 0;
10715 PL_savestack = 0;
10716 PL_retstack = 0;
66fe0623 10717 PL_sig_pending = 0;
25596c82 10718 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
1d7c1841
GS
10719# else /* !DEBUGGING */
10720 Zero(my_perl, 1, PerlInterpreter);
10721# endif /* DEBUGGING */
10722#endif /* PERL_IMPLICIT_SYS */
83236556 10723 param->flags = flags;
59b40662 10724 param->proto_perl = proto_perl;
1d7c1841
GS
10725
10726 /* arena roots */
10727 PL_xiv_arenaroot = NULL;
10728 PL_xiv_root = NULL;
612f20c3 10729 PL_xnv_arenaroot = NULL;
1d7c1841 10730 PL_xnv_root = NULL;
612f20c3 10731 PL_xrv_arenaroot = NULL;
1d7c1841 10732 PL_xrv_root = NULL;
612f20c3 10733 PL_xpv_arenaroot = NULL;
1d7c1841 10734 PL_xpv_root = NULL;
612f20c3 10735 PL_xpviv_arenaroot = NULL;
1d7c1841 10736 PL_xpviv_root = NULL;
612f20c3 10737 PL_xpvnv_arenaroot = NULL;
1d7c1841 10738 PL_xpvnv_root = NULL;
612f20c3 10739 PL_xpvcv_arenaroot = NULL;
1d7c1841 10740 PL_xpvcv_root = NULL;
612f20c3 10741 PL_xpvav_arenaroot = NULL;
1d7c1841 10742 PL_xpvav_root = NULL;
612f20c3 10743 PL_xpvhv_arenaroot = NULL;
1d7c1841 10744 PL_xpvhv_root = NULL;
612f20c3 10745 PL_xpvmg_arenaroot = NULL;
1d7c1841 10746 PL_xpvmg_root = NULL;
612f20c3 10747 PL_xpvlv_arenaroot = NULL;
1d7c1841 10748 PL_xpvlv_root = NULL;
612f20c3 10749 PL_xpvbm_arenaroot = NULL;
1d7c1841 10750 PL_xpvbm_root = NULL;
612f20c3 10751 PL_he_arenaroot = NULL;
1d7c1841
GS
10752 PL_he_root = NULL;
10753 PL_nice_chunk = NULL;
10754 PL_nice_chunk_size = 0;
10755 PL_sv_count = 0;
10756 PL_sv_objcount = 0;
10757 PL_sv_root = Nullsv;
10758 PL_sv_arenaroot = Nullsv;
10759
10760 PL_debug = proto_perl->Idebug;
10761
e5dd39fc 10762#ifdef USE_REENTRANT_API
59bd0823 10763 Perl_reentrant_init(aTHX);
e5dd39fc
AB
10764#endif
10765
1d7c1841
GS
10766 /* create SV map for pointer relocation */
10767 PL_ptr_table = ptr_table_new();
10768
10769 /* initialize these special pointers as early as possible */
10770 SvANY(&PL_sv_undef) = NULL;
10771 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
10772 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
10773 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
10774
1d7c1841 10775 SvANY(&PL_sv_no) = new_XPVNV();
1d7c1841
GS
10776 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
10777 SvFLAGS(&PL_sv_no) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
10778 SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
10779 SvCUR(&PL_sv_no) = 0;
10780 SvLEN(&PL_sv_no) = 1;
10781 SvNVX(&PL_sv_no) = 0;
10782 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
10783
1d7c1841 10784 SvANY(&PL_sv_yes) = new_XPVNV();
1d7c1841
GS
10785 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
10786 SvFLAGS(&PL_sv_yes) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
10787 SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
10788 SvCUR(&PL_sv_yes) = 1;
10789 SvLEN(&PL_sv_yes) = 2;
10790 SvNVX(&PL_sv_yes) = 1;
10791 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
10792
05ec9bb3 10793 /* create (a non-shared!) shared string table */
1d7c1841
GS
10794 PL_strtab = newHV();
10795 HvSHAREKEYS_off(PL_strtab);
10796 hv_ksplit(PL_strtab, 512);
10797 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
10798
05ec9bb3
NIS
10799 PL_compiling = proto_perl->Icompiling;
10800
10801 /* These two PVs will be free'd special way so must set them same way op.c does */
10802 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
10803 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
10804
10805 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
10806 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
10807
1d7c1841
GS
10808 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
10809 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 10810 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 10811 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 10812 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
10813 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
10814
10815 /* pseudo environmental stuff */
10816 PL_origargc = proto_perl->Iorigargc;
e2975953 10817 PL_origargv = proto_perl->Iorigargv;
d2d73c3e 10818
d2d73c3e
AB
10819 param->stashes = newAV(); /* Setup array of objects to call clone on */
10820
a1ea730d 10821#ifdef PERLIO_LAYERS
3a1ee7e8
NIS
10822 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
10823 PerlIO_clone(aTHX_ proto_perl, param);
a1ea730d 10824#endif
d2d73c3e
AB
10825
10826 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
10827 PL_incgv = gv_dup(proto_perl->Iincgv, param);
10828 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 10829 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
10830 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
10831 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
10832
10833 /* switches */
10834 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 10835 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
10836 PL_localpatches = proto_perl->Ilocalpatches;
10837 PL_splitstr = proto_perl->Isplitstr;
10838 PL_preprocess = proto_perl->Ipreprocess;
10839 PL_minus_n = proto_perl->Iminus_n;
10840 PL_minus_p = proto_perl->Iminus_p;
10841 PL_minus_l = proto_perl->Iminus_l;
10842 PL_minus_a = proto_perl->Iminus_a;
10843 PL_minus_F = proto_perl->Iminus_F;
10844 PL_doswitches = proto_perl->Idoswitches;
10845 PL_dowarn = proto_perl->Idowarn;
10846 PL_doextract = proto_perl->Idoextract;
10847 PL_sawampersand = proto_perl->Isawampersand;
10848 PL_unsafe = proto_perl->Iunsafe;
10849 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 10850 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
10851 PL_perldb = proto_perl->Iperldb;
10852 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
1cbb0781 10853 PL_exit_flags = proto_perl->Iexit_flags;
1d7c1841
GS
10854
10855 /* magical thingies */
10856 /* XXX time(&PL_basetime) when asked for? */
10857 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 10858 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
10859
10860 PL_maxsysfd = proto_perl->Imaxsysfd;
10861 PL_multiline = proto_perl->Imultiline;
10862 PL_statusvalue = proto_perl->Istatusvalue;
10863#ifdef VMS
10864 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
10865#endif
0a378802 10866 PL_encoding = sv_dup(proto_perl->Iencoding, param);
1d7c1841 10867
4a4c6fe3 10868 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
1f483ca1
JH
10869 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
10870 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
4a4c6fe3 10871
d2f185dc
AMS
10872 /* Clone the regex array */
10873 PL_regex_padav = newAV();
10874 {
10875 I32 len = av_len((AV*)proto_perl->Iregex_padav);
10876 SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
0f95fc41
AB
10877 av_push(PL_regex_padav,
10878 sv_dup_inc(regexen[0],param));
10879 for(i = 1; i <= len; i++) {
10880 if(SvREPADTMP(regexen[i])) {
10881 av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
8cf8f3d1 10882 } else {
0f95fc41
AB
10883 av_push(PL_regex_padav,
10884 SvREFCNT_inc(
8cf8f3d1 10885 newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
cbfa9890 10886 SvIVX(regexen[i])), param)))
0f95fc41
AB
10887 ));
10888 }
d2f185dc
AMS
10889 }
10890 }
10891 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 10892
1d7c1841 10893 /* shortcuts to various I/O objects */
d2d73c3e
AB
10894 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
10895 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
10896 PL_defgv = gv_dup(proto_perl->Idefgv, param);
10897 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
10898 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
10899 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
10900
10901 /* shortcuts to regexp stuff */
d2d73c3e 10902 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
10903
10904 /* shortcuts to misc objects */
d2d73c3e 10905 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
10906
10907 /* shortcuts to debugging objects */
d2d73c3e
AB
10908 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
10909 PL_DBline = gv_dup(proto_perl->IDBline, param);
10910 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
10911 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
10912 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
10913 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
06492da6 10914 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
d2d73c3e
AB
10915 PL_lineary = av_dup(proto_perl->Ilineary, param);
10916 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
10917
10918 /* symbol tables */
d2d73c3e
AB
10919 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
10920 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
d2d73c3e
AB
10921 PL_debstash = hv_dup(proto_perl->Idebstash, param);
10922 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
10923 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
10924
10925 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
ee1c5a4e 10926 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
ece599bd 10927 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
d2d73c3e
AB
10928 PL_endav = av_dup_inc(proto_perl->Iendav, param);
10929 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
10930 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
10931
10932 PL_sub_generation = proto_perl->Isub_generation;
10933
10934 /* funky return mechanisms */
10935 PL_forkprocess = proto_perl->Iforkprocess;
10936
10937 /* subprocess state */
d2d73c3e 10938 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
10939
10940 /* internal state */
10941 PL_tainting = proto_perl->Itainting;
7135f00b 10942 PL_taint_warn = proto_perl->Itaint_warn;
1d7c1841
GS
10943 PL_maxo = proto_perl->Imaxo;
10944 if (proto_perl->Iop_mask)
10945 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
10946 else
10947 PL_op_mask = Nullch;
06492da6 10948 /* PL_asserting = proto_perl->Iasserting; */
1d7c1841
GS
10949
10950 /* current interpreter roots */
d2d73c3e 10951 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
10952 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
10953 PL_main_start = proto_perl->Imain_start;
e977893f 10954 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
10955 PL_eval_start = proto_perl->Ieval_start;
10956
10957 /* runtime control stuff */
10958 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
10959 PL_copline = proto_perl->Icopline;
10960
10961 PL_filemode = proto_perl->Ifilemode;
10962 PL_lastfd = proto_perl->Ilastfd;
10963 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
10964 PL_Argv = NULL;
10965 PL_Cmd = Nullch;
10966 PL_gensym = proto_perl->Igensym;
10967 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 10968 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
10969 PL_laststatval = proto_perl->Ilaststatval;
10970 PL_laststype = proto_perl->Ilaststype;
10971 PL_mess_sv = Nullsv;
10972
d2d73c3e 10973 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
10974 PL_ofmt = SAVEPV(proto_perl->Iofmt);
10975
10976 /* interpreter atexit processing */
10977 PL_exitlistlen = proto_perl->Iexitlistlen;
10978 if (PL_exitlistlen) {
10979 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
10980 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
10981 }
10982 else
10983 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 10984 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
19e8ce8e
AB
10985 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
10986 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1d7c1841
GS
10987
10988 PL_profiledata = NULL;
a8fc9800 10989 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
1d7c1841 10990 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 10991 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 10992
d2d73c3e 10993 PL_compcv = cv_dup(proto_perl->Icompcv, param);
dd2155a4
DM
10994
10995 PAD_CLONE_VARS(proto_perl, param);
1d7c1841
GS
10996
10997#ifdef HAVE_INTERP_INTERN
10998 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
10999#endif
11000
11001 /* more statics moved here */
11002 PL_generation = proto_perl->Igeneration;
d2d73c3e 11003 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
11004
11005 PL_in_clean_objs = proto_perl->Iin_clean_objs;
11006 PL_in_clean_all = proto_perl->Iin_clean_all;
11007
11008 PL_uid = proto_perl->Iuid;
11009 PL_euid = proto_perl->Ieuid;
11010 PL_gid = proto_perl->Igid;
11011 PL_egid = proto_perl->Iegid;
11012 PL_nomemok = proto_perl->Inomemok;
11013 PL_an = proto_perl->Ian;
1d7c1841
GS
11014 PL_op_seqmax = proto_perl->Iop_seqmax;
11015 PL_evalseq = proto_perl->Ievalseq;
11016 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
11017 PL_origalen = proto_perl->Iorigalen;
11018 PL_pidstatus = newHV(); /* XXX flag for cloning? */
11019 PL_osname = SAVEPV(proto_perl->Iosname);
0bb09c15 11020 PL_sh_path = proto_perl->Ish_path; /* XXX never deallocated */
1d7c1841
GS
11021 PL_sighandlerp = proto_perl->Isighandlerp;
11022
11023
11024 PL_runops = proto_perl->Irunops;
11025
11026 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
11027
11028#ifdef CSH
11029 PL_cshlen = proto_perl->Icshlen;
74f1b2b8 11030 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
1d7c1841
GS
11031#endif
11032
11033 PL_lex_state = proto_perl->Ilex_state;
11034 PL_lex_defer = proto_perl->Ilex_defer;
11035 PL_lex_expect = proto_perl->Ilex_expect;
11036 PL_lex_formbrack = proto_perl->Ilex_formbrack;
11037 PL_lex_dojoin = proto_perl->Ilex_dojoin;
11038 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
11039 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
11040 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
11041 PL_lex_op = proto_perl->Ilex_op;
11042 PL_lex_inpat = proto_perl->Ilex_inpat;
11043 PL_lex_inwhat = proto_perl->Ilex_inwhat;
11044 PL_lex_brackets = proto_perl->Ilex_brackets;
11045 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
11046 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
11047 PL_lex_casemods = proto_perl->Ilex_casemods;
11048 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
11049 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
11050
11051 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
11052 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
11053 PL_nexttoke = proto_perl->Inexttoke;
11054
1d773130
TB
11055 /* XXX This is probably masking the deeper issue of why
11056 * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case:
11057 * http://archive.develooper.com/perl5-porters%40perl.org/msg83298.html
11058 * (A little debugging with a watchpoint on it may help.)
11059 */
389edf32
TB
11060 if (SvANY(proto_perl->Ilinestr)) {
11061 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
11062 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
11063 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11064 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
11065 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11066 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
11067 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11068 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
11069 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11070 }
11071 else {
11072 PL_linestr = NEWSV(65,79);
11073 sv_upgrade(PL_linestr,SVt_PVIV);
11074 sv_setpvn(PL_linestr,"",0);
11075 PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
11076 }
1d7c1841 11077 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1d7c1841
GS
11078 PL_pending_ident = proto_perl->Ipending_ident;
11079 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
11080
11081 PL_expect = proto_perl->Iexpect;
11082
11083 PL_multi_start = proto_perl->Imulti_start;
11084 PL_multi_end = proto_perl->Imulti_end;
11085 PL_multi_open = proto_perl->Imulti_open;
11086 PL_multi_close = proto_perl->Imulti_close;
11087
11088 PL_error_count = proto_perl->Ierror_count;
11089 PL_subline = proto_perl->Isubline;
d2d73c3e 11090 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841 11091
1d773130 11092 /* XXX See comment on SvANY(proto_perl->Ilinestr) above */
389edf32
TB
11093 if (SvANY(proto_perl->Ilinestr)) {
11094 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
11095 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11096 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
11097 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
11098 PL_last_lop_op = proto_perl->Ilast_lop_op;
11099 }
11100 else {
11101 PL_last_uni = SvPVX(PL_linestr);
11102 PL_last_lop = SvPVX(PL_linestr);
11103 PL_last_lop_op = 0;
11104 }
1d7c1841 11105 PL_in_my = proto_perl->Iin_my;
d2d73c3e 11106 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
11107#ifdef FCRYPT
11108 PL_cryptseen = proto_perl->Icryptseen;
11109#endif
11110
11111 PL_hints = proto_perl->Ihints;
11112
11113 PL_amagic_generation = proto_perl->Iamagic_generation;
11114
11115#ifdef USE_LOCALE_COLLATE
11116 PL_collation_ix = proto_perl->Icollation_ix;
11117 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
11118 PL_collation_standard = proto_perl->Icollation_standard;
11119 PL_collxfrm_base = proto_perl->Icollxfrm_base;
11120 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
11121#endif /* USE_LOCALE_COLLATE */
11122
11123#ifdef USE_LOCALE_NUMERIC
11124 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
11125 PL_numeric_standard = proto_perl->Inumeric_standard;
11126 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 11127 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
11128#endif /* !USE_LOCALE_NUMERIC */
11129
11130 /* utf8 character classes */
d2d73c3e
AB
11131 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
11132 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
11133 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
11134 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
11135 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
11136 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
11137 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
11138 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
11139 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
11140 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
11141 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
11142 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
11143 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
11144 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
11145 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
11146 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
11147 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
b4e400f9 11148 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
82686b01
JH
11149 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
11150 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 11151
6c3182a5
JH
11152 /* Did the locale setup indicate UTF-8? */
11153 PL_utf8locale = proto_perl->Iutf8_locale;
11154 /* Unicode features (see perlrun/-C) */
11155 PL_unicode = proto_perl->Iunicode;
11156
11157 /* Pre-5.8 signals control */
11158 PL_signals = proto_perl->Isignals;
11159
11160 /* times() ticks per second */
11161 PL_clocktick = proto_perl->Iclocktick;
11162
11163 /* Recursion stopper for PerlIO_find_layer */
11164 PL_in_load_module = proto_perl->Iin_load_module;
11165
11166 /* sort() routine */
11167 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
11168
1d7c1841
GS
11169 /* swatch cache */
11170 PL_last_swash_hv = Nullhv; /* reinits on demand */
11171 PL_last_swash_klen = 0;
11172 PL_last_swash_key[0]= '\0';
11173 PL_last_swash_tmps = (U8*)NULL;
11174 PL_last_swash_slen = 0;
11175
11176 /* perly.c globals */
11177 PL_yydebug = proto_perl->Iyydebug;
11178 PL_yynerrs = proto_perl->Iyynerrs;
11179 PL_yyerrflag = proto_perl->Iyyerrflag;
11180 PL_yychar = proto_perl->Iyychar;
11181 PL_yyval = proto_perl->Iyyval;
11182 PL_yylval = proto_perl->Iyylval;
11183
11184 PL_glob_index = proto_perl->Iglob_index;
11185 PL_srand_called = proto_perl->Isrand_called;
11186 PL_uudmap['M'] = 0; /* reinits on demand */
11187 PL_bitcount = Nullch; /* reinits on demand */
11188
66fe0623
NIS
11189 if (proto_perl->Ipsig_pend) {
11190 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 11191 }
66fe0623
NIS
11192 else {
11193 PL_psig_pend = (int*)NULL;
11194 }
11195
1d7c1841 11196 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
11197 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
11198 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 11199 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
11200 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
11201 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
11202 }
11203 }
11204 else {
11205 PL_psig_ptr = (SV**)NULL;
11206 PL_psig_name = (SV**)NULL;
11207 }
11208
11209 /* thrdvar.h stuff */
11210
a0739874 11211 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
11212 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
11213 PL_tmps_ix = proto_perl->Ttmps_ix;
11214 PL_tmps_max = proto_perl->Ttmps_max;
11215 PL_tmps_floor = proto_perl->Ttmps_floor;
11216 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
11217 i = 0;
11218 while (i <= PL_tmps_ix) {
d2d73c3e 11219 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
11220 ++i;
11221 }
11222
11223 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
11224 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
11225 Newz(54, PL_markstack, i, I32);
11226 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
11227 - proto_perl->Tmarkstack);
11228 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
11229 - proto_perl->Tmarkstack);
11230 Copy(proto_perl->Tmarkstack, PL_markstack,
11231 PL_markstack_ptr - PL_markstack + 1, I32);
11232
11233 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
11234 * NOTE: unlike the others! */
11235 PL_scopestack_ix = proto_perl->Tscopestack_ix;
11236 PL_scopestack_max = proto_perl->Tscopestack_max;
11237 Newz(54, PL_scopestack, PL_scopestack_max, I32);
11238 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
11239
11240 /* next push_return() sets PL_retstack[PL_retstack_ix]
11241 * NOTE: unlike the others! */
11242 PL_retstack_ix = proto_perl->Tretstack_ix;
11243 PL_retstack_max = proto_perl->Tretstack_max;
11244 Newz(54, PL_retstack, PL_retstack_max, OP*);
ce0a1ae0 11245 Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, OP*);
1d7c1841
GS
11246
11247 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 11248 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
11249
11250 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
11251 PL_curstack = av_dup(proto_perl->Tcurstack, param);
11252 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
11253
11254 /* next PUSHs() etc. set *(PL_stack_sp+1) */
11255 PL_stack_base = AvARRAY(PL_curstack);
11256 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
11257 - proto_perl->Tstack_base);
11258 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
11259
11260 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
11261 * NOTE: unlike the others! */
11262 PL_savestack_ix = proto_perl->Tsavestack_ix;
11263 PL_savestack_max = proto_perl->Tsavestack_max;
11264 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 11265 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
11266 }
11267 else {
11268 init_stacks();
985e7056 11269 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
11270 }
11271
11272 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
11273 PL_top_env = &PL_start_env;
11274
11275 PL_op = proto_perl->Top;
11276
11277 PL_Sv = Nullsv;
11278 PL_Xpv = (XPV*)NULL;
11279 PL_na = proto_perl->Tna;
11280
11281 PL_statbuf = proto_perl->Tstatbuf;
11282 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
11283 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
11284 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
11285#ifdef HAS_TIMES
11286 PL_timesbuf = proto_perl->Ttimesbuf;
11287#endif
11288
11289 PL_tainted = proto_perl->Ttainted;
11290 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
11291 PL_rs = sv_dup_inc(proto_perl->Trs, param);
11292 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
11293 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
11294 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 11295 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
11296 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
11297 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
11298 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
11299
11300 PL_restartop = proto_perl->Trestartop;
11301 PL_in_eval = proto_perl->Tin_eval;
11302 PL_delaymagic = proto_perl->Tdelaymagic;
11303 PL_dirty = proto_perl->Tdirty;
11304 PL_localizing = proto_perl->Tlocalizing;
11305
14dd3ad8 11306#ifdef PERL_FLEXIBLE_EXCEPTIONS
1d7c1841 11307 PL_protect = proto_perl->Tprotect;
14dd3ad8 11308#endif
d2d73c3e 11309 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
1d7c1841
GS
11310 PL_av_fetch_sv = Nullsv;
11311 PL_hv_fetch_sv = Nullsv;
11312 Zero(&PL_hv_fetch_ent_mh, 1, HE); /* XXX */
11313 PL_modcount = proto_perl->Tmodcount;
11314 PL_lastgotoprobe = Nullop;
11315 PL_dumpindent = proto_perl->Tdumpindent;
11316
11317 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
11318 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
11319 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
11320 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
11321 PL_sortcxix = proto_perl->Tsortcxix;
11322 PL_efloatbuf = Nullch; /* reinits on demand */
11323 PL_efloatsize = 0; /* reinits on demand */
11324
11325 /* regex stuff */
11326
11327 PL_screamfirst = NULL;
11328 PL_screamnext = NULL;
11329 PL_maxscream = -1; /* reinits on demand */
11330 PL_lastscream = Nullsv;
11331
11332 PL_watchaddr = NULL;
11333 PL_watchok = Nullch;
11334
11335 PL_regdummy = proto_perl->Tregdummy;
1d7c1841
GS
11336 PL_regprecomp = Nullch;
11337 PL_regnpar = 0;
11338 PL_regsize = 0;
1d7c1841
GS
11339 PL_colorset = 0; /* reinits PL_colors[] */
11340 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841
GS
11341 PL_reginput = Nullch;
11342 PL_regbol = Nullch;
11343 PL_regeol = Nullch;
11344 PL_regstartp = (I32*)NULL;
11345 PL_regendp = (I32*)NULL;
11346 PL_reglastparen = (U32*)NULL;
11347 PL_regtill = Nullch;
1d7c1841
GS
11348 PL_reg_start_tmp = (char**)NULL;
11349 PL_reg_start_tmpl = 0;
11350 PL_regdata = (struct reg_data*)NULL;
11351 PL_bostr = Nullch;
11352 PL_reg_flags = 0;
11353 PL_reg_eval_set = 0;
11354 PL_regnarrate = 0;
11355 PL_regprogram = (regnode*)NULL;
11356 PL_regindent = 0;
11357 PL_regcc = (CURCUR*)NULL;
11358 PL_reg_call_cc = (struct re_cc_state*)NULL;
11359 PL_reg_re = (regexp*)NULL;
11360 PL_reg_ganch = Nullch;
11361 PL_reg_sv = Nullsv;
53c4c00c 11362 PL_reg_match_utf8 = FALSE;
1d7c1841
GS
11363 PL_reg_magic = (MAGIC*)NULL;
11364 PL_reg_oldpos = 0;
11365 PL_reg_oldcurpm = (PMOP*)NULL;
11366 PL_reg_curpm = (PMOP*)NULL;
11367 PL_reg_oldsaved = Nullch;
11368 PL_reg_oldsavedlen = 0;
ed252734 11369#ifdef PERL_COPY_ON_WRITE
504cff3b 11370 PL_nrs = Nullsv;
ed252734 11371#endif
1d7c1841
GS
11372 PL_reg_maxiter = 0;
11373 PL_reg_leftiter = 0;
11374 PL_reg_poscache = Nullch;
11375 PL_reg_poscache_size= 0;
11376
11377 /* RE engine - function pointers */
11378 PL_regcompp = proto_perl->Tregcompp;
11379 PL_regexecp = proto_perl->Tregexecp;
11380 PL_regint_start = proto_perl->Tregint_start;
11381 PL_regint_string = proto_perl->Tregint_string;
11382 PL_regfree = proto_perl->Tregfree;
11383
11384 PL_reginterp_cnt = 0;
11385 PL_reg_starttry = 0;
11386
a2efc822
SC
11387 /* Pluggable optimizer */
11388 PL_peepp = proto_perl->Tpeepp;
11389
a0739874
DM
11390 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
11391 ptr_table_free(PL_ptr_table);
11392 PL_ptr_table = NULL;
11393 }
8cf8f3d1 11394
f284b03f
AMS
11395 /* Call the ->CLONE method, if it exists, for each of the stashes
11396 identified by sv_dup() above.
11397 */
d2d73c3e
AB
11398 while(av_len(param->stashes) != -1) {
11399 HV* stash = (HV*) av_shift(param->stashes);
f284b03f
AMS
11400 GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
11401 if (cloner && GvCV(cloner)) {
11402 dSP;
11403 ENTER;
11404 SAVETMPS;
11405 PUSHMARK(SP);
dc507217 11406 XPUSHs(sv_2mortal(newSVpv(HvNAME(stash), 0)));
f284b03f
AMS
11407 PUTBACK;
11408 call_sv((SV*)GvCV(cloner), G_DISCARD);
11409 FREETMPS;
11410 LEAVE;
11411 }
4a09accc 11412 }
a0739874 11413
dc507217 11414 SvREFCNT_dec(param->stashes);
dc507217 11415
1d7c1841 11416 return my_perl;
1d7c1841
GS
11417}
11418
1d7c1841 11419#endif /* USE_ITHREADS */
a0ae6670 11420
9f4817db 11421/*
ccfc67b7
JH
11422=head1 Unicode Support
11423
9f4817db
JH
11424=for apidoc sv_recode_to_utf8
11425
5d170f3a
JH
11426The encoding is assumed to be an Encode object, on entry the PV
11427of the sv is assumed to be octets in that encoding, and the sv
11428will be converted into Unicode (and UTF-8).
9f4817db 11429
5d170f3a
JH
11430If the sv already is UTF-8 (or if it is not POK), or if the encoding
11431is not a reference, nothing is done to the sv. If the encoding is not
1768d7eb
JH
11432an C<Encode::XS> Encoding object, bad things will happen.
11433(See F<lib/encoding.pm> and L<Encode>).
9f4817db 11434
5d170f3a 11435The PV of the sv is returned.
9f4817db 11436
5d170f3a
JH
11437=cut */
11438
11439char *
11440Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
11441{
220e2d4e 11442 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
d0063567
DK
11443 SV *uni;
11444 STRLEN len;
11445 char *s;
11446 dSP;
11447 ENTER;
11448 SAVETMPS;
220e2d4e 11449 save_re_context();
d0063567
DK
11450 PUSHMARK(sp);
11451 EXTEND(SP, 3);
11452 XPUSHs(encoding);
11453 XPUSHs(sv);
f9893866
NIS
11454/*
11455 NI-S 2002/07/09
11456 Passing sv_yes is wrong - it needs to be or'ed set of constants
11457 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
11458 remove converted chars from source.
11459
11460 Both will default the value - let them.
11461
d0063567 11462 XPUSHs(&PL_sv_yes);
f9893866 11463*/
d0063567
DK
11464 PUTBACK;
11465 call_method("decode", G_SCALAR);
11466 SPAGAIN;
11467 uni = POPs;
11468 PUTBACK;
11469 s = SvPV(uni, len);
d0063567
DK
11470 if (s != SvPVX(sv)) {
11471 SvGROW(sv, len + 1);
11472 Move(s, SvPVX(sv), len, char);
11473 SvCUR_set(sv, len);
11474 SvPVX(sv)[len] = 0;
11475 }
11476 FREETMPS;
11477 LEAVE;
d0063567 11478 SvUTF8_on(sv);
f9893866
NIS
11479 }
11480 return SvPVX(sv);
9f4817db
JH
11481}
11482
220e2d4e
IH
11483/*
11484=for apidoc sv_cat_decode
11485
11486The encoding is assumed to be an Encode object, the PV of the ssv is
11487assumed to be octets in that encoding and decoding the input starts
11488from the position which (PV + *offset) pointed to. The dsv will be
11489concatenated the decoded UTF-8 string from ssv. Decoding will terminate
11490when the string tstr appears in decoding output or the input ends on
11491the PV of the ssv. The value which the offset points will be modified
11492to the last input position on the ssv.
68795e93 11493
220e2d4e
IH
11494Returns TRUE if the terminator was found, else returns FALSE.
11495
11496=cut */
11497
11498bool
11499Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
11500 SV *ssv, int *offset, char *tstr, int tlen)
11501{
11502 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
11503 bool ret = FALSE;
11504 SV *offsv;
11505 dSP;
11506 ENTER;
11507 SAVETMPS;
11508 save_re_context();
11509 PUSHMARK(sp);
11510 EXTEND(SP, 6);
11511 XPUSHs(encoding);
11512 XPUSHs(dsv);
11513 XPUSHs(ssv);
11514 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
11515 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
11516 PUTBACK;
11517 call_method("cat_decode", G_SCALAR);
11518 SPAGAIN;
11519 ret = SvTRUE(TOPs);
11520 *offset = SvIV(offsv);
11521 PUTBACK;
11522 FREETMPS;
11523 LEAVE;
11524 return ret;
11525 }
11526 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode.");
11527}
f9893866 11528