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