This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Split out core of sv_magic() into sv_magicext().
[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}
954c1994 4418/*
92110913 4419=for apidoc sv_magicext
954c1994 4420
92110913
NIS
4421Adds magic to an SV, upgrading it if necessary. Applies the
4422supplied vtable and returns pointer to the magic added.
4423
4424Note that sv_magicext will allow things that sv_magic will not.
4425In particular you can add magic to SvREADONLY SVs and and more than
4426one instance of the same 'how'
645c22ef 4427
92110913
NIS
4428I C<namelen> is greater then zero then a savepvn() I<copy> of C<name> is stored,
4429(if C<name> is NULL then namelen bytes are allocated and Zero()-ed),
4430if C<namelen> is zero then C<name> is stored as-is and - as another special
4431case - if C<(name && namelen == HEf_SVKEY)> then C<name> is assumed to contain
4432an C<SV*> and has its REFCNT incremented
4433
4434(This is now used as a subroutine by sv_magic.)
954c1994
GS
4435
4436=cut
4437*/
92110913
NIS
4438MAGIC *
4439Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, MGVTBL *vtable,
4440 const char* name, I32 namlen)
79072805
LW
4441{
4442 MAGIC* mg;
92110913
NIS
4443
4444 if (SvTYPE(sv) < SVt_PVMG) {
4445 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 4446 }
79072805
LW
4447 Newz(702,mg, 1, MAGIC);
4448 mg->mg_moremagic = SvMAGIC(sv);
79072805 4449 SvMAGIC(sv) = mg;
75f9d97a 4450
18808301 4451 /* Some magic sontains a reference loop, where the sv and object refer to
bb03859b
RS
4452 each other. To prevent a reference loop that would prevent such
4453 objects being freed, we look for such loops and if we find one we
4454 avoid incrementing the object refcount. */
14befaf4
DM
4455 if (!obj || obj == sv ||
4456 how == PERL_MAGIC_arylen ||
4457 how == PERL_MAGIC_qr ||
75f9d97a
JH
4458 (SvTYPE(obj) == SVt_PVGV &&
4459 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4460 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
4461 GvFORM(obj) == (CV*)sv)))
4462 {
8990e307 4463 mg->mg_obj = obj;
75f9d97a 4464 }
85e6fe83 4465 else {
8990e307 4466 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
4467 mg->mg_flags |= MGf_REFCOUNTED;
4468 }
79072805 4469 mg->mg_type = how;
565764a8 4470 mg->mg_len = namlen;
9cbac4c7 4471 if (name) {
92110913 4472 if (namlen > 0)
1edc1566 4473 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 4474 else if (namlen == HEf_SVKEY)
1edc1566 4475 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
92110913
NIS
4476 else
4477 mg->mg_ptr = (char *) name;
9cbac4c7 4478 }
92110913
NIS
4479 mg->mg_virtual = vtable;
4480
4481 mg_magical(sv);
4482 if (SvGMAGICAL(sv))
4483 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4484 return mg;
4485}
4486
4487/*
4488=for apidoc sv_magic
1c846c1f 4489
92110913
NIS
4490Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4491then adds a new magic item of type C<how> to the head of the magic list.
4492
4493=cut
4494*/
4495
4496void
4497Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
4498{
4499 MAGIC* mg;
4500 MGVTBL *vtable = 0;
4501
4502 if (SvREADONLY(sv)) {
4503 if (PL_curcop != &PL_compiling
4504 && how != PERL_MAGIC_regex_global
4505 && how != PERL_MAGIC_bm
4506 && how != PERL_MAGIC_fm
4507 && how != PERL_MAGIC_sv
4508 )
4509 {
4510 Perl_croak(aTHX_ PL_no_modify);
4511 }
4512 }
4513 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4514 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
4515 /* sv_magic() refuses to add a magic of the same 'how' as an
4516 existing one
4517 */
4518 if (how == PERL_MAGIC_taint)
4519 mg->mg_len |= 1;
4520 return;
4521 }
4522 }
4523
79072805 4524 switch (how) {
14befaf4 4525 case PERL_MAGIC_sv:
92110913 4526 vtable = &PL_vtbl_sv;
79072805 4527 break;
14befaf4 4528 case PERL_MAGIC_overload:
92110913 4529 vtable = &PL_vtbl_amagic;
a0d0e21e 4530 break;
14befaf4 4531 case PERL_MAGIC_overload_elem:
92110913 4532 vtable = &PL_vtbl_amagicelem;
a0d0e21e 4533 break;
14befaf4 4534 case PERL_MAGIC_overload_table:
92110913 4535 vtable = &PL_vtbl_ovrld;
a0d0e21e 4536 break;
14befaf4 4537 case PERL_MAGIC_bm:
92110913 4538 vtable = &PL_vtbl_bm;
79072805 4539 break;
14befaf4 4540 case PERL_MAGIC_regdata:
92110913 4541 vtable = &PL_vtbl_regdata;
6cef1e77 4542 break;
14befaf4 4543 case PERL_MAGIC_regdatum:
92110913 4544 vtable = &PL_vtbl_regdatum;
6cef1e77 4545 break;
14befaf4 4546 case PERL_MAGIC_env:
92110913 4547 vtable = &PL_vtbl_env;
79072805 4548 break;
14befaf4 4549 case PERL_MAGIC_fm:
92110913 4550 vtable = &PL_vtbl_fm;
55497cff 4551 break;
14befaf4 4552 case PERL_MAGIC_envelem:
92110913 4553 vtable = &PL_vtbl_envelem;
79072805 4554 break;
14befaf4 4555 case PERL_MAGIC_regex_global:
92110913 4556 vtable = &PL_vtbl_mglob;
93a17b20 4557 break;
14befaf4 4558 case PERL_MAGIC_isa:
92110913 4559 vtable = &PL_vtbl_isa;
463ee0b2 4560 break;
14befaf4 4561 case PERL_MAGIC_isaelem:
92110913 4562 vtable = &PL_vtbl_isaelem;
463ee0b2 4563 break;
14befaf4 4564 case PERL_MAGIC_nkeys:
92110913 4565 vtable = &PL_vtbl_nkeys;
16660edb 4566 break;
14befaf4 4567 case PERL_MAGIC_dbfile:
92110913 4568 vtable = 0;
93a17b20 4569 break;
14befaf4 4570 case PERL_MAGIC_dbline:
92110913 4571 vtable = &PL_vtbl_dbline;
79072805 4572 break;
4d1ff10f 4573#ifdef USE_5005THREADS
14befaf4 4574 case PERL_MAGIC_mutex:
92110913 4575 vtable = &PL_vtbl_mutex;
f93b4edd 4576 break;
4d1ff10f 4577#endif /* USE_5005THREADS */
36477c24 4578#ifdef USE_LOCALE_COLLATE
14befaf4 4579 case PERL_MAGIC_collxfrm:
92110913 4580 vtable = &PL_vtbl_collxfrm;
bbce6d69 4581 break;
36477c24 4582#endif /* USE_LOCALE_COLLATE */
14befaf4 4583 case PERL_MAGIC_tied:
92110913 4584 vtable = &PL_vtbl_pack;
463ee0b2 4585 break;
14befaf4
DM
4586 case PERL_MAGIC_tiedelem:
4587 case PERL_MAGIC_tiedscalar:
92110913 4588 vtable = &PL_vtbl_packelem;
463ee0b2 4589 break;
14befaf4 4590 case PERL_MAGIC_qr:
92110913 4591 vtable = &PL_vtbl_regexp;
c277df42 4592 break;
14befaf4 4593 case PERL_MAGIC_sig:
92110913 4594 vtable = &PL_vtbl_sig;
79072805 4595 break;
14befaf4 4596 case PERL_MAGIC_sigelem:
92110913 4597 vtable = &PL_vtbl_sigelem;
79072805 4598 break;
14befaf4 4599 case PERL_MAGIC_taint:
92110913 4600 vtable = &PL_vtbl_taint;
463ee0b2 4601 break;
14befaf4 4602 case PERL_MAGIC_uvar:
92110913 4603 vtable = &PL_vtbl_uvar;
79072805 4604 break;
14befaf4 4605 case PERL_MAGIC_vec:
92110913 4606 vtable = &PL_vtbl_vec;
79072805 4607 break;
14befaf4 4608 case PERL_MAGIC_substr:
92110913 4609 vtable = &PL_vtbl_substr;
79072805 4610 break;
14befaf4 4611 case PERL_MAGIC_defelem:
92110913 4612 vtable = &PL_vtbl_defelem;
5f05dabc 4613 break;
14befaf4 4614 case PERL_MAGIC_glob:
92110913 4615 vtable = &PL_vtbl_glob;
79072805 4616 break;
14befaf4 4617 case PERL_MAGIC_arylen:
92110913 4618 vtable = &PL_vtbl_arylen;
79072805 4619 break;
14befaf4 4620 case PERL_MAGIC_pos:
92110913 4621 vtable = &PL_vtbl_pos;
a0d0e21e 4622 break;
14befaf4 4623 case PERL_MAGIC_backref:
92110913 4624 vtable = &PL_vtbl_backref;
810b8aa5 4625 break;
14befaf4
DM
4626 case PERL_MAGIC_ext:
4627 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
4628 /* Useful for attaching extension internal data to perl vars. */
4629 /* Note that multiple extensions may clash if magical scalars */
4630 /* etc holding private data from one are passed to another. */
a0d0e21e 4631 break;
79072805 4632 default:
14befaf4 4633 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 4634 }
92110913
NIS
4635
4636 /* Rest of work is done else where */
4637 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
4638
4639 switch (how) {
4640 case PERL_MAGIC_taint:
4641 mg->mg_len = 1;
4642 break;
4643 case PERL_MAGIC_ext:
4644 case PERL_MAGIC_dbfile:
4645 SvRMAGICAL_on(sv);
4646 break;
4647 }
463ee0b2
LW
4648}
4649
c461cf8f
JH
4650/*
4651=for apidoc sv_unmagic
4652
645c22ef 4653Removes all magic of type C<type> from an SV.
c461cf8f
JH
4654
4655=cut
4656*/
4657
463ee0b2 4658int
864dbfa3 4659Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
4660{
4661 MAGIC* mg;
4662 MAGIC** mgp;
91bba347 4663 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
4664 return 0;
4665 mgp = &SvMAGIC(sv);
4666 for (mg = *mgp; mg; mg = *mgp) {
4667 if (mg->mg_type == type) {
4668 MGVTBL* vtbl = mg->mg_virtual;
4669 *mgp = mg->mg_moremagic;
1d7c1841 4670 if (vtbl && vtbl->svt_free)
fc0dc3b3 4671 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 4672 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 4673 if (mg->mg_len > 0)
1edc1566 4674 Safefree(mg->mg_ptr);
565764a8 4675 else if (mg->mg_len == HEf_SVKEY)
1edc1566 4676 SvREFCNT_dec((SV*)mg->mg_ptr);
9cbac4c7 4677 }
a0d0e21e
LW
4678 if (mg->mg_flags & MGf_REFCOUNTED)
4679 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
4680 Safefree(mg);
4681 }
4682 else
4683 mgp = &mg->mg_moremagic;
79072805 4684 }
91bba347 4685 if (!SvMAGIC(sv)) {
463ee0b2 4686 SvMAGICAL_off(sv);
06759ea0 4687 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
4688 }
4689
4690 return 0;
79072805
LW
4691}
4692
c461cf8f
JH
4693/*
4694=for apidoc sv_rvweaken
4695
645c22ef
DM
4696Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
4697referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
4698push a back-reference to this RV onto the array of backreferences
4699associated with that magic.
c461cf8f
JH
4700
4701=cut
4702*/
4703
810b8aa5 4704SV *
864dbfa3 4705Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
4706{
4707 SV *tsv;
4708 if (!SvOK(sv)) /* let undefs pass */
4709 return sv;
4710 if (!SvROK(sv))
cea2e8a9 4711 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 4712 else if (SvWEAKREF(sv)) {
810b8aa5 4713 if (ckWARN(WARN_MISC))
cea2e8a9 4714 Perl_warner(aTHX_ WARN_MISC, "Reference is already weak");
810b8aa5
GS
4715 return sv;
4716 }
4717 tsv = SvRV(sv);
4718 sv_add_backref(tsv, sv);
4719 SvWEAKREF_on(sv);
1c846c1f 4720 SvREFCNT_dec(tsv);
810b8aa5
GS
4721 return sv;
4722}
4723
645c22ef
DM
4724/* Give tsv backref magic if it hasn't already got it, then push a
4725 * back-reference to sv onto the array associated with the backref magic.
4726 */
4727
810b8aa5 4728STATIC void
cea2e8a9 4729S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
4730{
4731 AV *av;
4732 MAGIC *mg;
14befaf4 4733 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, PERL_MAGIC_backref)))
810b8aa5
GS
4734 av = (AV*)mg->mg_obj;
4735 else {
4736 av = newAV();
14befaf4 4737 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
810b8aa5
GS
4738 SvREFCNT_dec(av); /* for sv_magic */
4739 }
4740 av_push(av,sv);
4741}
4742
645c22ef
DM
4743/* delete a back-reference to ourselves from the backref magic associated
4744 * with the SV we point to.
4745 */
4746
1c846c1f 4747STATIC void
cea2e8a9 4748S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
4749{
4750 AV *av;
4751 SV **svp;
4752 I32 i;
4753 SV *tsv = SvRV(sv);
4754 MAGIC *mg;
14befaf4 4755 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, PERL_MAGIC_backref)))
cea2e8a9 4756 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
4757 av = (AV *)mg->mg_obj;
4758 svp = AvARRAY(av);
4759 i = AvFILLp(av);
4760 while (i >= 0) {
4761 if (svp[i] == sv) {
4762 svp[i] = &PL_sv_undef; /* XXX */
4763 }
4764 i--;
4765 }
4766}
4767
954c1994
GS
4768/*
4769=for apidoc sv_insert
4770
4771Inserts a string at the specified offset/length within the SV. Similar to
4772the Perl substr() function.
4773
4774=cut
4775*/
4776
79072805 4777void
864dbfa3 4778Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
79072805
LW
4779{
4780 register char *big;
4781 register char *mid;
4782 register char *midend;
4783 register char *bigend;
4784 register I32 i;
6ff81951 4785 STRLEN curlen;
1c846c1f 4786
79072805 4787
8990e307 4788 if (!bigstr)
cea2e8a9 4789 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 4790 SvPV_force(bigstr, curlen);
60fa28ff 4791 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
4792 if (offset + len > curlen) {
4793 SvGROW(bigstr, offset+len+1);
4794 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
4795 SvCUR_set(bigstr, offset+len);
4796 }
79072805 4797
69b47968 4798 SvTAINT(bigstr);
79072805
LW
4799 i = littlelen - len;
4800 if (i > 0) { /* string might grow */
a0d0e21e 4801 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
4802 mid = big + offset + len;
4803 midend = bigend = big + SvCUR(bigstr);
4804 bigend += i;
4805 *bigend = '\0';
4806 while (midend > mid) /* shove everything down */
4807 *--bigend = *--midend;
4808 Move(little,big+offset,littlelen,char);
4809 SvCUR(bigstr) += i;
4810 SvSETMAGIC(bigstr);
4811 return;
4812 }
4813 else if (i == 0) {
463ee0b2 4814 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
4815 SvSETMAGIC(bigstr);
4816 return;
4817 }
4818
463ee0b2 4819 big = SvPVX(bigstr);
79072805
LW
4820 mid = big + offset;
4821 midend = mid + len;
4822 bigend = big + SvCUR(bigstr);
4823
4824 if (midend > bigend)
cea2e8a9 4825 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
4826
4827 if (mid - big > bigend - midend) { /* faster to shorten from end */
4828 if (littlelen) {
4829 Move(little, mid, littlelen,char);
4830 mid += littlelen;
4831 }
4832 i = bigend - midend;
4833 if (i > 0) {
4834 Move(midend, mid, i,char);
4835 mid += i;
4836 }
4837 *mid = '\0';
4838 SvCUR_set(bigstr, mid - big);
4839 }
4840 /*SUPPRESS 560*/
155aba94 4841 else if ((i = mid - big)) { /* faster from front */
79072805
LW
4842 midend -= littlelen;
4843 mid = midend;
4844 sv_chop(bigstr,midend-i);
4845 big += i;
4846 while (i--)
4847 *--midend = *--big;
4848 if (littlelen)
4849 Move(little, mid, littlelen,char);
4850 }
4851 else if (littlelen) {
4852 midend -= littlelen;
4853 sv_chop(bigstr,midend);
4854 Move(little,midend,littlelen,char);
4855 }
4856 else {
4857 sv_chop(bigstr,midend);
4858 }
4859 SvSETMAGIC(bigstr);
4860}
4861
c461cf8f
JH
4862/*
4863=for apidoc sv_replace
4864
4865Make the first argument a copy of the second, then delete the original.
645c22ef
DM
4866The target SV physically takes over ownership of the body of the source SV
4867and inherits its flags; however, the target keeps any magic it owns,
4868and any magic in the source is discarded.
ff276b08 4869Note that this is a rather specialist SV copying operation; most of the
645c22ef 4870time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
4871
4872=cut
4873*/
79072805
LW
4874
4875void
864dbfa3 4876Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805
LW
4877{
4878 U32 refcnt = SvREFCNT(sv);
2213622d 4879 SV_CHECK_THINKFIRST(sv);
0453d815
PM
4880 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
4881 Perl_warner(aTHX_ WARN_INTERNAL, "Reference miscount in sv_replace()");
93a17b20 4882 if (SvMAGICAL(sv)) {
a0d0e21e
LW
4883 if (SvMAGICAL(nsv))
4884 mg_free(nsv);
4885 else
4886 sv_upgrade(nsv, SVt_PVMG);
93a17b20 4887 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 4888 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
4889 SvMAGICAL_off(sv);
4890 SvMAGIC(sv) = 0;
4891 }
79072805
LW
4892 SvREFCNT(sv) = 0;
4893 sv_clear(sv);
477f5d66 4894 assert(!SvREFCNT(sv));
79072805
LW
4895 StructCopy(nsv,sv,SV);
4896 SvREFCNT(sv) = refcnt;
1edc1566 4897 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
463ee0b2 4898 del_SV(nsv);
79072805
LW
4899}
4900
c461cf8f
JH
4901/*
4902=for apidoc sv_clear
4903
645c22ef
DM
4904Clear an SV: call any destructors, free up any memory used by the body,
4905and free the body itself. The SV's head is I<not> freed, although
4906its type is set to all 1's so that it won't inadvertently be assumed
4907to be live during global destruction etc.
4908This function should only be called when REFCNT is zero. Most of the time
4909you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
4910instead.
c461cf8f
JH
4911
4912=cut
4913*/
4914
79072805 4915void
864dbfa3 4916Perl_sv_clear(pTHX_ register SV *sv)
79072805 4917{
ec12f114 4918 HV* stash;
79072805
LW
4919 assert(sv);
4920 assert(SvREFCNT(sv) == 0);
4921
ed6116ce 4922 if (SvOBJECT(sv)) {
3280af22 4923 if (PL_defstash) { /* Still have a symbol table? */
39644a26 4924 dSP;
32251b26 4925 CV* destructor;
837485b6 4926 SV tmpref;
a0d0e21e 4927
837485b6
GS
4928 Zero(&tmpref, 1, SV);
4929 sv_upgrade(&tmpref, SVt_RV);
4930 SvROK_on(&tmpref);
4931 SvREADONLY_on(&tmpref); /* DESTROY() could be naughty */
4932 SvREFCNT(&tmpref) = 1;
8ebc5c01 4933
d460ef45 4934 do {
4e8e7886 4935 stash = SvSTASH(sv);
32251b26 4936 destructor = StashHANDLER(stash,DESTROY);
4e8e7886
GS
4937 if (destructor) {
4938 ENTER;
e788e7d3 4939 PUSHSTACKi(PERLSI_DESTROY);
837485b6 4940 SvRV(&tmpref) = SvREFCNT_inc(sv);
4e8e7886
GS
4941 EXTEND(SP, 2);
4942 PUSHMARK(SP);
837485b6 4943 PUSHs(&tmpref);
4e8e7886 4944 PUTBACK;
32251b26 4945 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR);
4e8e7886 4946 SvREFCNT(sv)--;
d3acc0f7 4947 POPSTACK;
3095d977 4948 SPAGAIN;
4e8e7886
GS
4949 LEAVE;
4950 }
4951 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 4952
837485b6 4953 del_XRV(SvANY(&tmpref));
6f44e0a4
JP
4954
4955 if (SvREFCNT(sv)) {
4956 if (PL_in_clean_objs)
cea2e8a9 4957 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
6f44e0a4
JP
4958 HvNAME(stash));
4959 /* DESTROY gave object new lease on life */
4960 return;
4961 }
a0d0e21e 4962 }
4e8e7886 4963
a0d0e21e 4964 if (SvOBJECT(sv)) {
4e8e7886 4965 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
4966 SvOBJECT_off(sv); /* Curse the object. */
4967 if (SvTYPE(sv) != SVt_PVIO)
3280af22 4968 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 4969 }
463ee0b2 4970 }
524189f1
JH
4971 if (SvTYPE(sv) >= SVt_PVMG) {
4972 if (SvMAGIC(sv))
4973 mg_free(sv);
4974 if (SvFLAGS(sv) & SVpad_TYPED)
4975 SvREFCNT_dec(SvSTASH(sv));
4976 }
ec12f114 4977 stash = NULL;
79072805 4978 switch (SvTYPE(sv)) {
8990e307 4979 case SVt_PVIO:
df0bd2f4
GS
4980 if (IoIFP(sv) &&
4981 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 4982 IoIFP(sv) != PerlIO_stdout() &&
4983 IoIFP(sv) != PerlIO_stderr())
93578b34 4984 {
f2b5be74 4985 io_close((IO*)sv, FALSE);
93578b34 4986 }
1d7c1841 4987 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 4988 PerlDir_close(IoDIRP(sv));
1d7c1841 4989 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
4990 Safefree(IoTOP_NAME(sv));
4991 Safefree(IoFMT_NAME(sv));
4992 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 4993 /* FALL THROUGH */
79072805 4994 case SVt_PVBM:
a0d0e21e 4995 goto freescalar;
79072805 4996 case SVt_PVCV:
748a9306 4997 case SVt_PVFM:
85e6fe83 4998 cv_undef((CV*)sv);
a0d0e21e 4999 goto freescalar;
79072805 5000 case SVt_PVHV:
85e6fe83 5001 hv_undef((HV*)sv);
a0d0e21e 5002 break;
79072805 5003 case SVt_PVAV:
85e6fe83 5004 av_undef((AV*)sv);
a0d0e21e 5005 break;
02270b4e
GS
5006 case SVt_PVLV:
5007 SvREFCNT_dec(LvTARG(sv));
5008 goto freescalar;
a0d0e21e 5009 case SVt_PVGV:
1edc1566 5010 gp_free((GV*)sv);
a0d0e21e 5011 Safefree(GvNAME(sv));
ec12f114
JPC
5012 /* cannot decrease stash refcount yet, as we might recursively delete
5013 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
5014 of stash until current sv is completely gone.
5015 -- JohnPC, 27 Mar 1998 */
5016 stash = GvSTASH(sv);
a0d0e21e 5017 /* FALL THROUGH */
79072805 5018 case SVt_PVMG:
79072805
LW
5019 case SVt_PVNV:
5020 case SVt_PVIV:
a0d0e21e
LW
5021 freescalar:
5022 (void)SvOOK_off(sv);
79072805
LW
5023 /* FALL THROUGH */
5024 case SVt_PV:
a0d0e21e 5025 case SVt_RV:
810b8aa5
GS
5026 if (SvROK(sv)) {
5027 if (SvWEAKREF(sv))
5028 sv_del_backref(sv);
5029 else
5030 SvREFCNT_dec(SvRV(sv));
5031 }
1edc1566 5032 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 5033 Safefree(SvPVX(sv));
1c846c1f 5034 else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
25716404
GS
5035 unsharepvn(SvPVX(sv),
5036 SvUTF8(sv) ? -(I32)SvCUR(sv) : SvCUR(sv),
5037 SvUVX(sv));
1c846c1f
NIS
5038 SvFAKE_off(sv);
5039 }
79072805 5040 break;
a0d0e21e 5041/*
79072805 5042 case SVt_NV:
79072805 5043 case SVt_IV:
79072805
LW
5044 case SVt_NULL:
5045 break;
a0d0e21e 5046*/
79072805
LW
5047 }
5048
5049 switch (SvTYPE(sv)) {
5050 case SVt_NULL:
5051 break;
79072805
LW
5052 case SVt_IV:
5053 del_XIV(SvANY(sv));
5054 break;
5055 case SVt_NV:
5056 del_XNV(SvANY(sv));
5057 break;
ed6116ce
LW
5058 case SVt_RV:
5059 del_XRV(SvANY(sv));
5060 break;
79072805
LW
5061 case SVt_PV:
5062 del_XPV(SvANY(sv));
5063 break;
5064 case SVt_PVIV:
5065 del_XPVIV(SvANY(sv));
5066 break;
5067 case SVt_PVNV:
5068 del_XPVNV(SvANY(sv));
5069 break;
5070 case SVt_PVMG:
5071 del_XPVMG(SvANY(sv));
5072 break;
5073 case SVt_PVLV:
5074 del_XPVLV(SvANY(sv));
5075 break;
5076 case SVt_PVAV:
5077 del_XPVAV(SvANY(sv));
5078 break;
5079 case SVt_PVHV:
5080 del_XPVHV(SvANY(sv));
5081 break;
5082 case SVt_PVCV:
5083 del_XPVCV(SvANY(sv));
5084 break;
5085 case SVt_PVGV:
5086 del_XPVGV(SvANY(sv));
ec12f114
JPC
5087 /* code duplication for increased performance. */
5088 SvFLAGS(sv) &= SVf_BREAK;
5089 SvFLAGS(sv) |= SVTYPEMASK;
5090 /* decrease refcount of the stash that owns this GV, if any */
5091 if (stash)
5092 SvREFCNT_dec(stash);
5093 return; /* not break, SvFLAGS reset already happened */
79072805
LW
5094 case SVt_PVBM:
5095 del_XPVBM(SvANY(sv));
5096 break;
5097 case SVt_PVFM:
5098 del_XPVFM(SvANY(sv));
5099 break;
8990e307
LW
5100 case SVt_PVIO:
5101 del_XPVIO(SvANY(sv));
5102 break;
79072805 5103 }
a0d0e21e 5104 SvFLAGS(sv) &= SVf_BREAK;
8990e307 5105 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
5106}
5107
645c22ef
DM
5108/*
5109=for apidoc sv_newref
5110
5111Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5112instead.
5113
5114=cut
5115*/
5116
79072805 5117SV *
864dbfa3 5118Perl_sv_newref(pTHX_ SV *sv)
79072805 5119{
463ee0b2 5120 if (sv)
dce16143 5121 ATOMIC_INC(SvREFCNT(sv));
79072805
LW
5122 return sv;
5123}
5124
c461cf8f
JH
5125/*
5126=for apidoc sv_free
5127
645c22ef
DM
5128Decrement an SV's reference count, and if it drops to zero, call
5129C<sv_clear> to invoke destructors and free up any memory used by
5130the body; finally, deallocate the SV's head itself.
5131Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5132
5133=cut
5134*/
5135
79072805 5136void
864dbfa3 5137Perl_sv_free(pTHX_ SV *sv)
79072805 5138{
dce16143
MB
5139 int refcount_is_zero;
5140
79072805
LW
5141 if (!sv)
5142 return;
a0d0e21e
LW
5143 if (SvREFCNT(sv) == 0) {
5144 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5145 /* this SV's refcnt has been artificially decremented to
5146 * trigger cleanup */
a0d0e21e 5147 return;
3280af22 5148 if (PL_in_clean_all) /* All is fair */
1edc1566 5149 return;
d689ffdd
JP
5150 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5151 /* make sure SvREFCNT(sv)==0 happens very seldom */
5152 SvREFCNT(sv) = (~(U32)0)/2;
5153 return;
5154 }
0453d815
PM
5155 if (ckWARN_d(WARN_INTERNAL))
5156 Perl_warner(aTHX_ WARN_INTERNAL, "Attempt to free unreferenced scalar");
79072805
LW
5157 return;
5158 }
dce16143
MB
5159 ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
5160 if (!refcount_is_zero)
8990e307 5161 return;
463ee0b2
LW
5162#ifdef DEBUGGING
5163 if (SvTEMP(sv)) {
0453d815 5164 if (ckWARN_d(WARN_DEBUGGING))
f248d071 5165 Perl_warner(aTHX_ WARN_DEBUGGING,
1d7c1841
GS
5166 "Attempt to free temp prematurely: SV 0x%"UVxf,
5167 PTR2UV(sv));
79072805 5168 return;
79072805 5169 }
463ee0b2 5170#endif
d689ffdd
JP
5171 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5172 /* make sure SvREFCNT(sv)==0 happens very seldom */
5173 SvREFCNT(sv) = (~(U32)0)/2;
5174 return;
5175 }
79072805 5176 sv_clear(sv);
477f5d66
CS
5177 if (! SvREFCNT(sv))
5178 del_SV(sv);
79072805
LW
5179}
5180
954c1994
GS
5181/*
5182=for apidoc sv_len
5183
645c22ef
DM
5184Returns the length of the string in the SV. Handles magic and type
5185coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5186
5187=cut
5188*/
5189
79072805 5190STRLEN
864dbfa3 5191Perl_sv_len(pTHX_ register SV *sv)
79072805 5192{
463ee0b2 5193 STRLEN len;
79072805
LW
5194
5195 if (!sv)
5196 return 0;
5197
8990e307 5198 if (SvGMAGICAL(sv))
565764a8 5199 len = mg_length(sv);
8990e307 5200 else
497b47a8 5201 (void)SvPV(sv, len);
463ee0b2 5202 return len;
79072805
LW
5203}
5204
c461cf8f
JH
5205/*
5206=for apidoc sv_len_utf8
5207
5208Returns the number of characters in the string in an SV, counting wide
645c22ef 5209UTF8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5210
5211=cut
5212*/
5213
a0ed51b3 5214STRLEN
864dbfa3 5215Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 5216{
a0ed51b3
LW
5217 if (!sv)
5218 return 0;
5219
a0ed51b3 5220 if (SvGMAGICAL(sv))
b76347f2 5221 return mg_length(sv);
a0ed51b3 5222 else
b76347f2
JH
5223 {
5224 STRLEN len;
5225 U8 *s = (U8*)SvPV(sv, len);
5226
d6efbbad 5227 return Perl_utf8_length(aTHX_ s, s + len);
a0ed51b3 5228 }
a0ed51b3
LW
5229}
5230
645c22ef
DM
5231/*
5232=for apidoc sv_pos_u2b
5233
5234Converts the value pointed to by offsetp from a count of UTF8 chars from
5235the start of the string, to a count of the equivalent number of bytes; if
5236lenp is non-zero, it does the same to lenp, but this time starting from
5237the offset, rather than from the start of the string. Handles magic and
5238type coercion.
5239
5240=cut
5241*/
5242
a0ed51b3 5243void
864dbfa3 5244Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 5245{
dfe13c55
GS
5246 U8 *start;
5247 U8 *s;
5248 U8 *send;
a0ed51b3
LW
5249 I32 uoffset = *offsetp;
5250 STRLEN len;
5251
5252 if (!sv)
5253 return;
5254
dfe13c55 5255 start = s = (U8*)SvPV(sv, len);
a0ed51b3
LW
5256 send = s + len;
5257 while (s < send && uoffset--)
5258 s += UTF8SKIP(s);
bb40f870
GA
5259 if (s >= send)
5260 s = send;
a0ed51b3
LW
5261 *offsetp = s - start;
5262 if (lenp) {
5263 I32 ulen = *lenp;
5264 start = s;
5265 while (s < send && ulen--)
5266 s += UTF8SKIP(s);
bb40f870
GA
5267 if (s >= send)
5268 s = send;
a0ed51b3
LW
5269 *lenp = s - start;
5270 }
5271 return;
5272}
5273
645c22ef
DM
5274/*
5275=for apidoc sv_pos_b2u
5276
5277Converts the value pointed to by offsetp from a count of bytes from the
5278start of the string, to a count of the equivalent number of UTF8 chars.
5279Handles magic and type coercion.
5280
5281=cut
5282*/
5283
a0ed51b3 5284void
864dbfa3 5285Perl_sv_pos_b2u(pTHX_ register SV *sv, I32* offsetp)
a0ed51b3 5286{
dfe13c55
GS
5287 U8 *s;
5288 U8 *send;
a0ed51b3
LW
5289 STRLEN len;
5290
5291 if (!sv)
5292 return;
5293
dfe13c55 5294 s = (U8*)SvPV(sv, len);
a0ed51b3 5295 if (len < *offsetp)
a0dbb045 5296 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
a0ed51b3
LW
5297 send = s + *offsetp;
5298 len = 0;
5299 while (s < send) {
a0dbb045 5300 STRLEN n;
2b9d42f0
NIS
5301 /* Call utf8n_to_uvchr() to validate the sequence */
5302 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
5303 if (n > 0) {
a0dbb045
JH
5304 s += n;
5305 len++;
5306 }
5307 else
5308 break;
a0ed51b3
LW
5309 }
5310 *offsetp = len;
5311 return;
5312}
5313
954c1994
GS
5314/*
5315=for apidoc sv_eq
5316
5317Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
5318identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5319coerce its args to strings if necessary.
954c1994
GS
5320
5321=cut
5322*/
5323
79072805 5324I32
e01b9e88 5325Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805
LW
5326{
5327 char *pv1;
463ee0b2 5328 STRLEN cur1;
79072805 5329 char *pv2;
463ee0b2 5330 STRLEN cur2;
e01b9e88 5331 I32 eq = 0;
db42d148 5332 char *tpv = Nullch;
79072805 5333
e01b9e88 5334 if (!sv1) {
79072805
LW
5335 pv1 = "";
5336 cur1 = 0;
5337 }
463ee0b2 5338 else
e01b9e88 5339 pv1 = SvPV(sv1, cur1);
79072805 5340
e01b9e88
SC
5341 if (!sv2){
5342 pv2 = "";
5343 cur2 = 0;
92d29cee 5344 }
e01b9e88
SC
5345 else
5346 pv2 = SvPV(sv2, cur2);
79072805 5347
e01b9e88 5348 /* do not utf8ize the comparands as a side-effect */
0064a8a9 5349 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
f9a63242 5350 bool is_utf8 = TRUE;
db42d148 5351 /* UTF-8ness differs */
1aa99e6b 5352
e01b9e88 5353 if (SvUTF8(sv1)) {
db42d148 5354 /* sv1 is the UTF-8 one , If is equal it must be downgrade-able */
f34ff0a8 5355 char *pv = (char*)bytes_from_utf8((U8*)pv1, &cur1, &is_utf8);
db42d148
NIS
5356 if (pv != pv1)
5357 pv1 = tpv = pv;
e01b9e88
SC
5358 }
5359 else {
db42d148 5360 /* sv2 is the UTF-8 one , If is equal it must be downgrade-able */
f34ff0a8 5361 char *pv = (char *)bytes_from_utf8((U8*)pv2, &cur2, &is_utf8);
db42d148
NIS
5362 if (pv != pv2)
5363 pv2 = tpv = pv;
5364 }
5365 if (is_utf8) {
5366 /* Downgrade not possible - cannot be eq */
5367 return FALSE;
e01b9e88
SC
5368 }
5369 }
79072805 5370
e01b9e88
SC
5371 if (cur1 == cur2)
5372 eq = memEQ(pv1, pv2, cur1);
5373
db42d148
NIS
5374 if (tpv != Nullch)
5375 Safefree(tpv);
e01b9e88
SC
5376
5377 return eq;
79072805
LW
5378}
5379
954c1994
GS
5380/*
5381=for apidoc sv_cmp
5382
5383Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
5384string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
5385C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5386coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
5387
5388=cut
5389*/
5390
79072805 5391I32
e01b9e88 5392Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 5393{
560a288e
GS
5394 STRLEN cur1, cur2;
5395 char *pv1, *pv2;
1c846c1f 5396 I32 cmp;
e01b9e88
SC
5397 bool pv1tmp = FALSE;
5398 bool pv2tmp = FALSE;
560a288e 5399
e01b9e88
SC
5400 if (!sv1) {
5401 pv1 = "";
560a288e
GS
5402 cur1 = 0;
5403 }
e01b9e88
SC
5404 else
5405 pv1 = SvPV(sv1, cur1);
560a288e 5406
e01b9e88
SC
5407 if (!sv2){
5408 pv2 = "";
560a288e
GS
5409 cur2 = 0;
5410 }
e01b9e88
SC
5411 else
5412 pv2 = SvPV(sv2, cur2);
79072805 5413
e01b9e88 5414 /* do not utf8ize the comparands as a side-effect */
0064a8a9 5415 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
e01b9e88
SC
5416 if (SvUTF8(sv1)) {
5417 pv2 = (char*)bytes_to_utf8((U8*)pv2, &cur2);
5418 pv2tmp = TRUE;
5419 }
5420 else {
5421 pv1 = (char*)bytes_to_utf8((U8*)pv1, &cur1);
5422 pv1tmp = TRUE;
5423 }
5424 }
79072805 5425
e01b9e88
SC
5426 if (!cur1) {
5427 cmp = cur2 ? -1 : 0;
5428 } else if (!cur2) {
5429 cmp = 1;
5430 } else {
5431 I32 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
5432
5433 if (retval) {
5434 cmp = retval < 0 ? -1 : 1;
5435 } else if (cur1 == cur2) {
5436 cmp = 0;
5437 } else {
5438 cmp = cur1 < cur2 ? -1 : 1;
5439 }
5440 }
16660edb 5441
e01b9e88
SC
5442 if (pv1tmp)
5443 Safefree(pv1);
5444 if (pv2tmp)
5445 Safefree(pv2);
16660edb 5446
e01b9e88 5447 return cmp;
bbce6d69 5448}
16660edb 5449
c461cf8f
JH
5450/*
5451=for apidoc sv_cmp_locale
5452
645c22ef
DM
5453Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
5454'use bytes' aware, handles get magic, and will coerce its args to strings
5455if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
5456
5457=cut
5458*/
5459
bbce6d69 5460I32
864dbfa3 5461Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 5462{
36477c24 5463#ifdef USE_LOCALE_COLLATE
16660edb 5464
bbce6d69 5465 char *pv1, *pv2;
5466 STRLEN len1, len2;
5467 I32 retval;
16660edb 5468
3280af22 5469 if (PL_collation_standard)
bbce6d69 5470 goto raw_compare;
16660edb 5471
bbce6d69 5472 len1 = 0;
8ac85365 5473 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 5474 len2 = 0;
8ac85365 5475 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 5476
bbce6d69 5477 if (!pv1 || !len1) {
5478 if (pv2 && len2)
5479 return -1;
5480 else
5481 goto raw_compare;
5482 }
5483 else {
5484 if (!pv2 || !len2)
5485 return 1;
5486 }
16660edb 5487
bbce6d69 5488 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 5489
bbce6d69 5490 if (retval)
16660edb 5491 return retval < 0 ? -1 : 1;
5492
bbce6d69 5493 /*
5494 * When the result of collation is equality, that doesn't mean
5495 * that there are no differences -- some locales exclude some
5496 * characters from consideration. So to avoid false equalities,
5497 * we use the raw string as a tiebreaker.
5498 */
16660edb 5499
bbce6d69 5500 raw_compare:
5501 /* FALL THROUGH */
16660edb 5502
36477c24 5503#endif /* USE_LOCALE_COLLATE */
16660edb 5504
bbce6d69 5505 return sv_cmp(sv1, sv2);
5506}
79072805 5507
645c22ef 5508
36477c24 5509#ifdef USE_LOCALE_COLLATE
645c22ef 5510
7a4c00b4 5511/*
645c22ef
DM
5512=for apidoc sv_collxfrm
5513
5514Add Collate Transform magic to an SV if it doesn't already have it.
5515
5516Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
5517scalar data of the variable, but transformed to such a format that a normal
5518memory comparison can be used to compare the data according to the locale
5519settings.
5520
5521=cut
5522*/
5523
bbce6d69 5524char *
864dbfa3 5525Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 5526{
7a4c00b4 5527 MAGIC *mg;
16660edb 5528
14befaf4 5529 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 5530 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 5531 char *s, *xf;
5532 STRLEN len, xlen;
5533
7a4c00b4 5534 if (mg)
5535 Safefree(mg->mg_ptr);
bbce6d69 5536 s = SvPV(sv, len);
5537 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 5538 if (SvREADONLY(sv)) {
5539 SAVEFREEPV(xf);
5540 *nxp = xlen;
3280af22 5541 return xf + sizeof(PL_collation_ix);
ff0cee69 5542 }
7a4c00b4 5543 if (! mg) {
14befaf4
DM
5544 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
5545 mg = mg_find(sv, PERL_MAGIC_collxfrm);
7a4c00b4 5546 assert(mg);
bbce6d69 5547 }
7a4c00b4 5548 mg->mg_ptr = xf;
565764a8 5549 mg->mg_len = xlen;
7a4c00b4 5550 }
5551 else {
ff0cee69 5552 if (mg) {
5553 mg->mg_ptr = NULL;
565764a8 5554 mg->mg_len = -1;
ff0cee69 5555 }
bbce6d69 5556 }
5557 }
7a4c00b4 5558 if (mg && mg->mg_ptr) {
565764a8 5559 *nxp = mg->mg_len;
3280af22 5560 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 5561 }
5562 else {
5563 *nxp = 0;
5564 return NULL;
16660edb 5565 }
79072805
LW
5566}
5567
36477c24 5568#endif /* USE_LOCALE_COLLATE */
bbce6d69 5569
c461cf8f
JH
5570/*
5571=for apidoc sv_gets
5572
5573Get a line from the filehandle and store it into the SV, optionally
5574appending to the currently-stored string.
5575
5576=cut
5577*/
5578
79072805 5579char *
864dbfa3 5580Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 5581{
c07a80fd 5582 char *rsptr;
5583 STRLEN rslen;
5584 register STDCHAR rslast;
5585 register STDCHAR *bp;
5586 register I32 cnt;
9c5ffd7c 5587 I32 i = 0;
8bfdd7d9 5588 I32 rspara = 0;
c07a80fd 5589
2213622d 5590 SV_CHECK_THINKFIRST(sv);
6fc92669 5591 (void)SvUPGRADE(sv, SVt_PV);
99491443 5592
ff68c719 5593 SvSCREAM_off(sv);
c07a80fd 5594
8bfdd7d9
HS
5595 if (PL_curcop == &PL_compiling) {
5596 /* we always read code in line mode */
5597 rsptr = "\n";
5598 rslen = 1;
5599 }
5600 else if (RsSNARF(PL_rs)) {
c07a80fd 5601 rsptr = NULL;
5602 rslen = 0;
5603 }
3280af22 5604 else if (RsRECORD(PL_rs)) {
5b2b9c68
HM
5605 I32 recsize, bytesread;
5606 char *buffer;
5607
5608 /* Grab the size of the record we're getting */
3280af22 5609 recsize = SvIV(SvRV(PL_rs));
5b2b9c68 5610 (void)SvPOK_only(sv); /* Validate pointer */
e670df4e 5611 buffer = SvGROW(sv, recsize + 1);
5b2b9c68
HM
5612 /* Go yank in */
5613#ifdef VMS
5614 /* VMS wants read instead of fread, because fread doesn't respect */
5615 /* RMS record boundaries. This is not necessarily a good thing to be */
5616 /* doing, but we've got no other real choice */
5617 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
5618#else
5619 bytesread = PerlIO_read(fp, buffer, recsize);
5620#endif
5621 SvCUR_set(sv, bytesread);
e670df4e 5622 buffer[bytesread] = '\0';
7d59b7e4
NIS
5623 if (PerlIO_isutf8(fp))
5624 SvUTF8_on(sv);
5625 else
5626 SvUTF8_off(sv);
5b2b9c68
HM
5627 return(SvCUR(sv) ? SvPVX(sv) : Nullch);
5628 }
3280af22 5629 else if (RsPARA(PL_rs)) {
c07a80fd 5630 rsptr = "\n\n";
5631 rslen = 2;
8bfdd7d9 5632 rspara = 1;
c07a80fd 5633 }
7d59b7e4
NIS
5634 else {
5635 /* Get $/ i.e. PL_rs into same encoding as stream wants */
5636 if (PerlIO_isutf8(fp)) {
5637 rsptr = SvPVutf8(PL_rs, rslen);
5638 }
5639 else {
5640 if (SvUTF8(PL_rs)) {
5641 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
5642 Perl_croak(aTHX_ "Wide character in $/");
5643 }
5644 }
5645 rsptr = SvPV(PL_rs, rslen);
5646 }
5647 }
5648
c07a80fd 5649 rslast = rslen ? rsptr[rslen - 1] : '\0';
5650
8bfdd7d9 5651 if (rspara) { /* have to do this both before and after */
79072805 5652 do { /* to make sure file boundaries work right */
760ac839 5653 if (PerlIO_eof(fp))
a0d0e21e 5654 return 0;
760ac839 5655 i = PerlIO_getc(fp);
79072805 5656 if (i != '\n') {
a0d0e21e
LW
5657 if (i == -1)
5658 return 0;
760ac839 5659 PerlIO_ungetc(fp,i);
79072805
LW
5660 break;
5661 }
5662 } while (i != EOF);
5663 }
c07a80fd 5664
760ac839
LW
5665 /* See if we know enough about I/O mechanism to cheat it ! */
5666
5667 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 5668 of abstracting out stdio interface. One call should be cheap
760ac839
LW
5669 enough here - and may even be a macro allowing compile
5670 time optimization.
5671 */
5672
5673 if (PerlIO_fast_gets(fp)) {
5674
5675 /*
5676 * We're going to steal some values from the stdio struct
5677 * and put EVERYTHING in the innermost loop into registers.
5678 */
5679 register STDCHAR *ptr;
5680 STRLEN bpx;
5681 I32 shortbuffered;
5682
16660edb 5683#if defined(VMS) && defined(PERLIO_IS_STDIO)
5684 /* An ungetc()d char is handled separately from the regular
5685 * buffer, so we getc() it back out and stuff it in the buffer.
5686 */
5687 i = PerlIO_getc(fp);
5688 if (i == EOF) return 0;
5689 *(--((*fp)->_ptr)) = (unsigned char) i;
5690 (*fp)->_cnt++;
5691#endif
c07a80fd 5692
c2960299 5693 /* Here is some breathtakingly efficient cheating */
c07a80fd 5694
a20bf0c3 5695 cnt = PerlIO_get_cnt(fp); /* get count into register */
a0d0e21e 5696 (void)SvPOK_only(sv); /* validate pointer */
79072805
LW
5697 if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
5698 if (cnt > 80 && SvLEN(sv) > append) {
5699 shortbuffered = cnt - SvLEN(sv) + append + 1;
5700 cnt -= shortbuffered;
5701 }
5702 else {
5703 shortbuffered = 0;
bbce6d69 5704 /* remember that cnt can be negative */
5705 SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
79072805
LW
5706 }
5707 }
5708 else
5709 shortbuffered = 0;
c07a80fd 5710 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
a20bf0c3 5711 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 5712 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5713 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 5714 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 5715 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5716 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5717 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
5718 for (;;) {
5719 screamer:
93a17b20 5720 if (cnt > 0) {
c07a80fd 5721 if (rslen) {
760ac839
LW
5722 while (cnt > 0) { /* this | eat */
5723 cnt--;
c07a80fd 5724 if ((*bp++ = *ptr++) == rslast) /* really | dust */
5725 goto thats_all_folks; /* screams | sed :-) */
5726 }
5727 }
5728 else {
1c846c1f
NIS
5729 Copy(ptr, bp, cnt, char); /* this | eat */
5730 bp += cnt; /* screams | dust */
c07a80fd 5731 ptr += cnt; /* louder | sed :-) */
a5f75d66 5732 cnt = 0;
93a17b20 5733 }
79072805
LW
5734 }
5735
748a9306 5736 if (shortbuffered) { /* oh well, must extend */
79072805
LW
5737 cnt = shortbuffered;
5738 shortbuffered = 0;
c07a80fd 5739 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
5740 SvCUR_set(sv, bpx);
5741 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 5742 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
5743 continue;
5744 }
5745
16660edb 5746 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
5747 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
5748 PTR2UV(ptr),(long)cnt));
cc00df79 5749 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 5750#if 0
16660edb 5751 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5752 "Screamer: pre: 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)));
ba7abf9d 5755#endif
1c846c1f 5756 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 5757 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
5758 another abstraction. */
760ac839 5759 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 5760#if 0
16660edb 5761 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5762 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5763 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5764 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 5765#endif
a20bf0c3
JH
5766 cnt = PerlIO_get_cnt(fp);
5767 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 5768 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5769 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 5770
748a9306
LW
5771 if (i == EOF) /* all done for ever? */
5772 goto thats_really_all_folks;
5773
c07a80fd 5774 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
5775 SvCUR_set(sv, bpx);
5776 SvGROW(sv, bpx + cnt + 2);
c07a80fd 5777 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
5778
760ac839 5779 *bp++ = i; /* store character from PerlIO_getc */
79072805 5780
c07a80fd 5781 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 5782 goto thats_all_folks;
79072805
LW
5783 }
5784
5785thats_all_folks:
c07a80fd 5786 if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
36477c24 5787 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 5788 goto screamer; /* go back to the fray */
79072805
LW
5789thats_really_all_folks:
5790 if (shortbuffered)
5791 cnt += shortbuffered;
16660edb 5792 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5793 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 5794 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 5795 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5796 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5797 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5798 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 5799 *bp = '\0';
760ac839 5800 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 5801 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 5802 "Screamer: done, len=%ld, string=|%.*s|\n",
5803 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
5804 }
5805 else
79072805 5806 {
4d2c4e07 5807#ifndef EPOC
760ac839 5808 /*The big, slow, and stupid way */
c07a80fd 5809 STDCHAR buf[8192];
4d2c4e07
OF
5810#else
5811 /* Need to work around EPOC SDK features */
5812 /* On WINS: MS VC5 generates calls to _chkstk, */
5813 /* if a `large' stack frame is allocated */
5814 /* gcc on MARM does not generate calls like these */
5815 STDCHAR buf[1024];
5816#endif
79072805 5817
760ac839 5818screamer2:
c07a80fd 5819 if (rslen) {
760ac839
LW
5820 register STDCHAR *bpe = buf + sizeof(buf);
5821 bp = buf;
5822 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = i) != rslast && bp < bpe)
5823 ; /* keep reading */
5824 cnt = bp - buf;
c07a80fd 5825 }
5826 else {
760ac839 5827 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 5828 /* Accomodate broken VAXC compiler, which applies U8 cast to
5829 * both args of ?: operator, causing EOF to change into 255
5830 */
5831 if (cnt) { i = (U8)buf[cnt - 1]; } else { i = EOF; }
c07a80fd 5832 }
79072805
LW
5833
5834 if (append)
760ac839 5835 sv_catpvn(sv, (char *) buf, cnt);
79072805 5836 else
760ac839 5837 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 5838
5839 if (i != EOF && /* joy */
5840 (!rslen ||
5841 SvCUR(sv) < rslen ||
36477c24 5842 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
5843 {
5844 append = -1;
63e4d877
CS
5845 /*
5846 * If we're reading from a TTY and we get a short read,
5847 * indicating that the user hit his EOF character, we need
5848 * to notice it now, because if we try to read from the TTY
5849 * again, the EOF condition will disappear.
5850 *
5851 * The comparison of cnt to sizeof(buf) is an optimization
5852 * that prevents unnecessary calls to feof().
5853 *
5854 * - jik 9/25/96
5855 */
5856 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
5857 goto screamer2;
79072805
LW
5858 }
5859 }
5860
8bfdd7d9 5861 if (rspara) { /* have to do this both before and after */
c07a80fd 5862 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 5863 i = PerlIO_getc(fp);
79072805 5864 if (i != '\n') {
760ac839 5865 PerlIO_ungetc(fp,i);
79072805
LW
5866 break;
5867 }
5868 }
5869 }
c07a80fd 5870
7d59b7e4
NIS
5871 if (PerlIO_isutf8(fp))
5872 SvUTF8_on(sv);
5873 else
5874 SvUTF8_off(sv);
5875
c07a80fd 5876 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
5877}
5878
954c1994
GS
5879/*
5880=for apidoc sv_inc
5881
645c22ef
DM
5882Auto-increment of the value in the SV, doing string to numeric conversion
5883if necessary. Handles 'get' magic.
954c1994
GS
5884
5885=cut
5886*/
5887
79072805 5888void
864dbfa3 5889Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
5890{
5891 register char *d;
463ee0b2 5892 int flags;
79072805
LW
5893
5894 if (!sv)
5895 return;
b23a5f78
GB
5896 if (SvGMAGICAL(sv))
5897 mg_get(sv);
ed6116ce 5898 if (SvTHINKFIRST(sv)) {
3510b4a1
NC
5899 if (SvREADONLY(sv) && SvFAKE(sv))
5900 sv_force_normal(sv);
0f15f207 5901 if (SvREADONLY(sv)) {
3280af22 5902 if (PL_curcop != &PL_compiling)
cea2e8a9 5903 Perl_croak(aTHX_ PL_no_modify);
0f15f207 5904 }
a0d0e21e 5905 if (SvROK(sv)) {
b5be31e9 5906 IV i;
9e7bc3e8
JD
5907 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
5908 return;
56431972 5909 i = PTR2IV(SvRV(sv));
b5be31e9
SM
5910 sv_unref(sv);
5911 sv_setiv(sv, i);
a0d0e21e 5912 }
ed6116ce 5913 }
8990e307 5914 flags = SvFLAGS(sv);
28e5dec8
JH
5915 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
5916 /* It's (privately or publicly) a float, but not tested as an
5917 integer, so test it to see. */
d460ef45 5918 (void) SvIV(sv);
28e5dec8
JH
5919 flags = SvFLAGS(sv);
5920 }
5921 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
5922 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 5923#ifdef PERL_PRESERVE_IVUV
28e5dec8 5924 oops_its_int:
59d8ce62 5925#endif
25da4f38
IZ
5926 if (SvIsUV(sv)) {
5927 if (SvUVX(sv) == UV_MAX)
a1e868e7 5928 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
5929 else
5930 (void)SvIOK_only_UV(sv);
5931 ++SvUVX(sv);
5932 } else {
5933 if (SvIVX(sv) == IV_MAX)
28e5dec8 5934 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
5935 else {
5936 (void)SvIOK_only(sv);
5937 ++SvIVX(sv);
1c846c1f 5938 }
55497cff 5939 }
79072805
LW
5940 return;
5941 }
28e5dec8
JH
5942 if (flags & SVp_NOK) {
5943 (void)SvNOK_only(sv);
5944 SvNVX(sv) += 1.0;
5945 return;
5946 }
5947
8990e307 5948 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
28e5dec8
JH
5949 if ((flags & SVTYPEMASK) < SVt_PVIV)
5950 sv_upgrade(sv, SVt_IV);
5951 (void)SvIOK_only(sv);
5952 SvIVX(sv) = 1;
79072805
LW
5953 return;
5954 }
463ee0b2 5955 d = SvPVX(sv);
79072805
LW
5956 while (isALPHA(*d)) d++;
5957 while (isDIGIT(*d)) d++;
5958 if (*d) {
28e5dec8 5959#ifdef PERL_PRESERVE_IVUV
d1be9408 5960 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
5961 warnings. Probably ought to make the sv_iv_please() that does
5962 the conversion if possible, and silently. */
c2988b20 5963 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
5964 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
5965 /* Need to try really hard to see if it's an integer.
5966 9.22337203685478e+18 is an integer.
5967 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
5968 so $a="9.22337203685478e+18"; $a+0; $a++
5969 needs to be the same as $a="9.22337203685478e+18"; $a++
5970 or we go insane. */
d460ef45 5971
28e5dec8
JH
5972 (void) sv_2iv(sv);
5973 if (SvIOK(sv))
5974 goto oops_its_int;
5975
5976 /* sv_2iv *should* have made this an NV */
5977 if (flags & SVp_NOK) {
5978 (void)SvNOK_only(sv);
5979 SvNVX(sv) += 1.0;
5980 return;
5981 }
5982 /* I don't think we can get here. Maybe I should assert this
5983 And if we do get here I suspect that sv_setnv will croak. NWC
5984 Fall through. */
5985#if defined(USE_LONG_DOUBLE)
5986 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",
5987 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
5988#else
1779d84d 5989 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
5990 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
5991#endif
5992 }
5993#endif /* PERL_PRESERVE_IVUV */
5994 sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
79072805
LW
5995 return;
5996 }
5997 d--;
463ee0b2 5998 while (d >= SvPVX(sv)) {
79072805
LW
5999 if (isDIGIT(*d)) {
6000 if (++*d <= '9')
6001 return;
6002 *(d--) = '0';
6003 }
6004 else {
9d116dd7
JH
6005#ifdef EBCDIC
6006 /* MKS: The original code here died if letters weren't consecutive.
6007 * at least it didn't have to worry about non-C locales. The
6008 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 6009 * arranged in order (although not consecutively) and that only
9d116dd7
JH
6010 * [A-Za-z] are accepted by isALPHA in the C locale.
6011 */
6012 if (*d != 'z' && *d != 'Z') {
6013 do { ++*d; } while (!isALPHA(*d));
6014 return;
6015 }
6016 *(d--) -= 'z' - 'a';
6017#else
79072805
LW
6018 ++*d;
6019 if (isALPHA(*d))
6020 return;
6021 *(d--) -= 'z' - 'a' + 1;
9d116dd7 6022#endif
79072805
LW
6023 }
6024 }
6025 /* oh,oh, the number grew */
6026 SvGROW(sv, SvCUR(sv) + 2);
6027 SvCUR(sv)++;
463ee0b2 6028 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
6029 *d = d[-1];
6030 if (isDIGIT(d[1]))
6031 *d = '1';
6032 else
6033 *d = d[1];
6034}
6035
954c1994
GS
6036/*
6037=for apidoc sv_dec
6038
645c22ef
DM
6039Auto-decrement of the value in the SV, doing string to numeric conversion
6040if necessary. Handles 'get' magic.
954c1994
GS
6041
6042=cut
6043*/
6044
79072805 6045void
864dbfa3 6046Perl_sv_dec(pTHX_ register SV *sv)
79072805 6047{
463ee0b2
LW
6048 int flags;
6049
79072805
LW
6050 if (!sv)
6051 return;
b23a5f78
GB
6052 if (SvGMAGICAL(sv))
6053 mg_get(sv);
ed6116ce 6054 if (SvTHINKFIRST(sv)) {
3510b4a1
NC
6055 if (SvREADONLY(sv) && SvFAKE(sv))
6056 sv_force_normal(sv);
0f15f207 6057 if (SvREADONLY(sv)) {
3280af22 6058 if (PL_curcop != &PL_compiling)
cea2e8a9 6059 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6060 }
a0d0e21e 6061 if (SvROK(sv)) {
b5be31e9 6062 IV i;
9e7bc3e8
JD
6063 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6064 return;
56431972 6065 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6066 sv_unref(sv);
6067 sv_setiv(sv, i);
a0d0e21e 6068 }
ed6116ce 6069 }
28e5dec8
JH
6070 /* Unlike sv_inc we don't have to worry about string-never-numbers
6071 and keeping them magic. But we mustn't warn on punting */
8990e307 6072 flags = SvFLAGS(sv);
28e5dec8
JH
6073 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6074 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6075#ifdef PERL_PRESERVE_IVUV
28e5dec8 6076 oops_its_int:
59d8ce62 6077#endif
25da4f38
IZ
6078 if (SvIsUV(sv)) {
6079 if (SvUVX(sv) == 0) {
6080 (void)SvIOK_only(sv);
6081 SvIVX(sv) = -1;
6082 }
6083 else {
6084 (void)SvIOK_only_UV(sv);
6085 --SvUVX(sv);
1c846c1f 6086 }
25da4f38
IZ
6087 } else {
6088 if (SvIVX(sv) == IV_MIN)
65202027 6089 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
6090 else {
6091 (void)SvIOK_only(sv);
6092 --SvIVX(sv);
1c846c1f 6093 }
55497cff 6094 }
6095 return;
6096 }
28e5dec8
JH
6097 if (flags & SVp_NOK) {
6098 SvNVX(sv) -= 1.0;
6099 (void)SvNOK_only(sv);
6100 return;
6101 }
8990e307 6102 if (!(flags & SVp_POK)) {
4633a7c4
LW
6103 if ((flags & SVTYPEMASK) < SVt_PVNV)
6104 sv_upgrade(sv, SVt_NV);
463ee0b2 6105 SvNVX(sv) = -1.0;
a0d0e21e 6106 (void)SvNOK_only(sv);
79072805
LW
6107 return;
6108 }
28e5dec8
JH
6109#ifdef PERL_PRESERVE_IVUV
6110 {
c2988b20 6111 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
6112 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6113 /* Need to try really hard to see if it's an integer.
6114 9.22337203685478e+18 is an integer.
6115 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6116 so $a="9.22337203685478e+18"; $a+0; $a--
6117 needs to be the same as $a="9.22337203685478e+18"; $a--
6118 or we go insane. */
d460ef45 6119
28e5dec8
JH
6120 (void) sv_2iv(sv);
6121 if (SvIOK(sv))
6122 goto oops_its_int;
6123
6124 /* sv_2iv *should* have made this an NV */
6125 if (flags & SVp_NOK) {
6126 (void)SvNOK_only(sv);
6127 SvNVX(sv) -= 1.0;
6128 return;
6129 }
6130 /* I don't think we can get here. Maybe I should assert this
6131 And if we do get here I suspect that sv_setnv will croak. NWC
6132 Fall through. */
6133#if defined(USE_LONG_DOUBLE)
6134 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",
6135 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6136#else
1779d84d 6137 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
6138 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6139#endif
6140 }
6141 }
6142#endif /* PERL_PRESERVE_IVUV */
097ee67d 6143 sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
6144}
6145
954c1994
GS
6146/*
6147=for apidoc sv_mortalcopy
6148
645c22ef 6149Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
6150The new SV is marked as mortal. It will be destroyed "soon", either by an
6151explicit call to FREETMPS, or by an implicit call at places such as
6152statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
6153
6154=cut
6155*/
6156
79072805
LW
6157/* Make a string that will exist for the duration of the expression
6158 * evaluation. Actually, it may have to last longer than that, but
6159 * hopefully we won't free it until it has been assigned to a
6160 * permanent location. */
6161
6162SV *
864dbfa3 6163Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 6164{
463ee0b2 6165 register SV *sv;
79072805 6166
4561caa4 6167 new_SV(sv);
79072805 6168 sv_setsv(sv,oldstr);
677b06e3
GS
6169 EXTEND_MORTAL(1);
6170 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
6171 SvTEMP_on(sv);
6172 return sv;
6173}
6174
954c1994
GS
6175/*
6176=for apidoc sv_newmortal
6177
645c22ef 6178Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
6179set to 1. It will be destroyed "soon", either by an explicit call to
6180FREETMPS, or by an implicit call at places such as statement boundaries.
6181See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
6182
6183=cut
6184*/
6185
8990e307 6186SV *
864dbfa3 6187Perl_sv_newmortal(pTHX)
8990e307
LW
6188{
6189 register SV *sv;
6190
4561caa4 6191 new_SV(sv);
8990e307 6192 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
6193 EXTEND_MORTAL(1);
6194 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
6195 return sv;
6196}
6197
954c1994
GS
6198/*
6199=for apidoc sv_2mortal
6200
d4236ebc
DM
6201Marks an existing SV as mortal. The SV will be destroyed "soon", either
6202by an explicit call to FREETMPS, or by an implicit call at places such as
6203statement boundaries. See also C<sv_newmortal> and C<sv_mortalcopy>.
954c1994
GS
6204
6205=cut
6206*/
6207
79072805 6208SV *
864dbfa3 6209Perl_sv_2mortal(pTHX_ register SV *sv)
79072805
LW
6210{
6211 if (!sv)
6212 return sv;
d689ffdd 6213 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 6214 return sv;
677b06e3
GS
6215 EXTEND_MORTAL(1);
6216 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 6217 SvTEMP_on(sv);
79072805
LW
6218 return sv;
6219}
6220
954c1994
GS
6221/*
6222=for apidoc newSVpv
6223
6224Creates a new SV and copies a string into it. The reference count for the
6225SV is set to 1. If C<len> is zero, Perl will compute the length using
6226strlen(). For efficiency, consider using C<newSVpvn> instead.
6227
6228=cut
6229*/
6230
79072805 6231SV *
864dbfa3 6232Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 6233{
463ee0b2 6234 register SV *sv;
79072805 6235
4561caa4 6236 new_SV(sv);
79072805
LW
6237 if (!len)
6238 len = strlen(s);
6239 sv_setpvn(sv,s,len);
6240 return sv;
6241}
6242
954c1994
GS
6243/*
6244=for apidoc newSVpvn
6245
6246Creates a new SV and copies a string into it. The reference count for the
1c846c1f 6247SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994
GS
6248string. You are responsible for ensuring that the source string is at least
6249C<len> bytes long.
6250
6251=cut
6252*/
6253
9da1e3b5 6254SV *
864dbfa3 6255Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
6256{
6257 register SV *sv;
6258
6259 new_SV(sv);
9da1e3b5
MUN
6260 sv_setpvn(sv,s,len);
6261 return sv;
6262}
6263
1c846c1f
NIS
6264/*
6265=for apidoc newSVpvn_share
6266
645c22ef
DM
6267Creates a new SV with its SvPVX pointing to a shared string in the string
6268table. If the string does not already exist in the table, it is created
6269first. Turns on READONLY and FAKE. The string's hash is stored in the UV
6270slot of the SV; if the C<hash> parameter is non-zero, that value is used;
6271otherwise the hash is computed. The idea here is that as the string table
6272is used for shared hash keys these strings will have SvPVX == HeKEY and
6273hash lookup will avoid string compare.
1c846c1f
NIS
6274
6275=cut
6276*/
6277
6278SV *
c3654f1a 6279Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
6280{
6281 register SV *sv;
c3654f1a
IH
6282 bool is_utf8 = FALSE;
6283 if (len < 0) {
77caf834 6284 STRLEN tmplen = -len;
c3654f1a 6285 is_utf8 = TRUE;
75a54232
JH
6286 /* See the note in hv.c:hv_fetch() --jhi */
6287 src = (char*)bytes_from_utf8((U8*)src, &tmplen, &is_utf8);
6288 len = tmplen;
6289 }
1c846c1f
NIS
6290 if (!hash)
6291 PERL_HASH(hash, src, len);
6292 new_SV(sv);
6293 sv_upgrade(sv, SVt_PVIV);
c3654f1a 6294 SvPVX(sv) = sharepvn(src, is_utf8?-len:len, hash);
1c846c1f
NIS
6295 SvCUR(sv) = len;
6296 SvUVX(sv) = hash;
6297 SvLEN(sv) = 0;
6298 SvREADONLY_on(sv);
6299 SvFAKE_on(sv);
6300 SvPOK_on(sv);
c3654f1a
IH
6301 if (is_utf8)
6302 SvUTF8_on(sv);
1c846c1f
NIS
6303 return sv;
6304}
6305
645c22ef 6306
cea2e8a9 6307#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
6308
6309/* pTHX_ magic can't cope with varargs, so this is a no-context
6310 * version of the main function, (which may itself be aliased to us).
6311 * Don't access this version directly.
6312 */
6313
46fc3d4c 6314SV *
cea2e8a9 6315Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 6316{
cea2e8a9 6317 dTHX;
46fc3d4c 6318 register SV *sv;
6319 va_list args;
46fc3d4c 6320 va_start(args, pat);
c5be433b 6321 sv = vnewSVpvf(pat, &args);
46fc3d4c 6322 va_end(args);
6323 return sv;
6324}
cea2e8a9 6325#endif
46fc3d4c 6326
954c1994
GS
6327/*
6328=for apidoc newSVpvf
6329
645c22ef 6330Creates a new SV and initializes it with the string formatted like
954c1994
GS
6331C<sprintf>.
6332
6333=cut
6334*/
6335
cea2e8a9
GS
6336SV *
6337Perl_newSVpvf(pTHX_ const char* pat, ...)
6338{
6339 register SV *sv;
6340 va_list args;
cea2e8a9 6341 va_start(args, pat);
c5be433b 6342 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
6343 va_end(args);
6344 return sv;
6345}
46fc3d4c 6346
645c22ef
DM
6347/* backend for newSVpvf() and newSVpvf_nocontext() */
6348
79072805 6349SV *
c5be433b
GS
6350Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
6351{
6352 register SV *sv;
6353 new_SV(sv);
6354 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
6355 return sv;
6356}
6357
954c1994
GS
6358/*
6359=for apidoc newSVnv
6360
6361Creates a new SV and copies a floating point value into it.
6362The reference count for the SV is set to 1.
6363
6364=cut
6365*/
6366
c5be433b 6367SV *
65202027 6368Perl_newSVnv(pTHX_ NV n)
79072805 6369{
463ee0b2 6370 register SV *sv;
79072805 6371
4561caa4 6372 new_SV(sv);
79072805
LW
6373 sv_setnv(sv,n);
6374 return sv;
6375}
6376
954c1994
GS
6377/*
6378=for apidoc newSViv
6379
6380Creates a new SV and copies an integer into it. The reference count for the
6381SV is set to 1.
6382
6383=cut
6384*/
6385
79072805 6386SV *
864dbfa3 6387Perl_newSViv(pTHX_ IV i)
79072805 6388{
463ee0b2 6389 register SV *sv;
79072805 6390
4561caa4 6391 new_SV(sv);
79072805
LW
6392 sv_setiv(sv,i);
6393 return sv;
6394}
6395
954c1994 6396/*
1a3327fb
JH
6397=for apidoc newSVuv
6398
6399Creates a new SV and copies an unsigned integer into it.
6400The reference count for the SV is set to 1.
6401
6402=cut
6403*/
6404
6405SV *
6406Perl_newSVuv(pTHX_ UV u)
6407{
6408 register SV *sv;
6409
6410 new_SV(sv);
6411 sv_setuv(sv,u);
6412 return sv;
6413}
6414
6415/*
954c1994
GS
6416=for apidoc newRV_noinc
6417
6418Creates an RV wrapper for an SV. The reference count for the original
6419SV is B<not> incremented.
6420
6421=cut
6422*/
6423
2304df62 6424SV *
864dbfa3 6425Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
6426{
6427 register SV *sv;
6428
4561caa4 6429 new_SV(sv);
2304df62 6430 sv_upgrade(sv, SVt_RV);
76e3520e 6431 SvTEMP_off(tmpRef);
d689ffdd 6432 SvRV(sv) = tmpRef;
2304df62 6433 SvROK_on(sv);
2304df62
AD
6434 return sv;
6435}
6436
ff276b08 6437/* newRV_inc is the official function name to use now.
645c22ef
DM
6438 * newRV_inc is in fact #defined to newRV in sv.h
6439 */
6440
5f05dabc 6441SV *
864dbfa3 6442Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 6443{
5f6447b6 6444 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 6445}
5f05dabc 6446
954c1994
GS
6447/*
6448=for apidoc newSVsv
6449
6450Creates a new SV which is an exact duplicate of the original SV.
645c22ef 6451(Uses C<sv_setsv>).
954c1994
GS
6452
6453=cut
6454*/
6455
79072805 6456SV *
864dbfa3 6457Perl_newSVsv(pTHX_ register SV *old)
79072805 6458{
463ee0b2 6459 register SV *sv;
79072805
LW
6460
6461 if (!old)
6462 return Nullsv;
8990e307 6463 if (SvTYPE(old) == SVTYPEMASK) {
0453d815
PM
6464 if (ckWARN_d(WARN_INTERNAL))
6465 Perl_warner(aTHX_ WARN_INTERNAL, "semi-panic: attempt to dup freed string");
79072805
LW
6466 return Nullsv;
6467 }
4561caa4 6468 new_SV(sv);
ff68c719 6469 if (SvTEMP(old)) {
6470 SvTEMP_off(old);
463ee0b2 6471 sv_setsv(sv,old);
ff68c719 6472 SvTEMP_on(old);
79072805
LW
6473 }
6474 else
463ee0b2
LW
6475 sv_setsv(sv,old);
6476 return sv;
79072805
LW
6477}
6478
645c22ef
DM
6479/*
6480=for apidoc sv_reset
6481
6482Underlying implementation for the C<reset> Perl function.
6483Note that the perl-level function is vaguely deprecated.
6484
6485=cut
6486*/
6487
79072805 6488void
864dbfa3 6489Perl_sv_reset(pTHX_ register char *s, HV *stash)
79072805
LW
6490{
6491 register HE *entry;
6492 register GV *gv;
6493 register SV *sv;
6494 register I32 i;
6495 register PMOP *pm;
6496 register I32 max;
4802d5d7 6497 char todo[PERL_UCHAR_MAX+1];
79072805 6498
49d8d3a1
MB
6499 if (!stash)
6500 return;
6501
79072805
LW
6502 if (!*s) { /* reset ?? searches */
6503 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
48c036b1 6504 pm->op_pmdynflags &= ~PMdf_USED;
79072805
LW
6505 }
6506 return;
6507 }
6508
6509 /* reset variables */
6510
6511 if (!HvARRAY(stash))
6512 return;
463ee0b2
LW
6513
6514 Zero(todo, 256, char);
79072805 6515 while (*s) {
4802d5d7 6516 i = (unsigned char)*s;
79072805
LW
6517 if (s[1] == '-') {
6518 s += 2;
6519 }
4802d5d7 6520 max = (unsigned char)*s++;
79072805 6521 for ( ; i <= max; i++) {
463ee0b2
LW
6522 todo[i] = 1;
6523 }
a0d0e21e 6524 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 6525 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
6526 entry;
6527 entry = HeNEXT(entry))
6528 {
1edc1566 6529 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 6530 continue;
1edc1566 6531 gv = (GV*)HeVAL(entry);
79072805 6532 sv = GvSV(gv);
9e35f4b3
GS
6533 if (SvTHINKFIRST(sv)) {
6534 if (!SvREADONLY(sv) && SvROK(sv))
6535 sv_unref(sv);
6536 continue;
6537 }
a0d0e21e 6538 (void)SvOK_off(sv);
79072805
LW
6539 if (SvTYPE(sv) >= SVt_PV) {
6540 SvCUR_set(sv, 0);
463ee0b2
LW
6541 if (SvPVX(sv) != Nullch)
6542 *SvPVX(sv) = '\0';
44a8e56a 6543 SvTAINT(sv);
79072805
LW
6544 }
6545 if (GvAV(gv)) {
6546 av_clear(GvAV(gv));
6547 }
44a8e56a 6548 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
463ee0b2 6549 hv_clear(GvHV(gv));
fa6a1c44 6550#ifdef USE_ENVIRON_ARRAY
3280af22 6551 if (gv == PL_envgv)
79072805 6552 environ[0] = Nullch;
a0d0e21e 6553#endif
79072805
LW
6554 }
6555 }
6556 }
6557 }
6558}
6559
645c22ef
DM
6560/*
6561=for apidoc sv_2io
6562
6563Using various gambits, try to get an IO from an SV: the IO slot if its a
6564GV; or the recursive result if we're an RV; or the IO slot of the symbol
6565named after the PV if we're a string.
6566
6567=cut
6568*/
6569
46fc3d4c 6570IO*
864dbfa3 6571Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 6572{
6573 IO* io;
6574 GV* gv;
2d8e6c8d 6575 STRLEN n_a;
46fc3d4c 6576
6577 switch (SvTYPE(sv)) {
6578 case SVt_PVIO:
6579 io = (IO*)sv;
6580 break;
6581 case SVt_PVGV:
6582 gv = (GV*)sv;
6583 io = GvIO(gv);
6584 if (!io)
cea2e8a9 6585 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 6586 break;
6587 default:
6588 if (!SvOK(sv))
cea2e8a9 6589 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 6590 if (SvROK(sv))
6591 return sv_2io(SvRV(sv));
2d8e6c8d 6592 gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
46fc3d4c 6593 if (gv)
6594 io = GvIO(gv);
6595 else
6596 io = 0;
6597 if (!io)
cea2e8a9 6598 Perl_croak(aTHX_ "Bad filehandle: %s", SvPV(sv,n_a));
46fc3d4c 6599 break;
6600 }
6601 return io;
6602}
6603
645c22ef
DM
6604/*
6605=for apidoc sv_2cv
6606
6607Using various gambits, try to get a CV from an SV; in addition, try if
6608possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
6609
6610=cut
6611*/
6612
79072805 6613CV *
864dbfa3 6614Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805
LW
6615{
6616 GV *gv;
6617 CV *cv;
2d8e6c8d 6618 STRLEN n_a;
79072805
LW
6619
6620 if (!sv)
93a17b20 6621 return *gvp = Nullgv, Nullcv;
79072805 6622 switch (SvTYPE(sv)) {
79072805
LW
6623 case SVt_PVCV:
6624 *st = CvSTASH(sv);
6625 *gvp = Nullgv;
6626 return (CV*)sv;
6627 case SVt_PVHV:
6628 case SVt_PVAV:
6629 *gvp = Nullgv;
6630 return Nullcv;
8990e307
LW
6631 case SVt_PVGV:
6632 gv = (GV*)sv;
a0d0e21e 6633 *gvp = gv;
8990e307
LW
6634 *st = GvESTASH(gv);
6635 goto fix_gv;
6636
79072805 6637 default:
a0d0e21e
LW
6638 if (SvGMAGICAL(sv))
6639 mg_get(sv);
6640 if (SvROK(sv)) {
f5284f61
IZ
6641 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
6642 tryAMAGICunDEREF(to_cv);
6643
62f274bf
GS
6644 sv = SvRV(sv);
6645 if (SvTYPE(sv) == SVt_PVCV) {
6646 cv = (CV*)sv;
6647 *gvp = Nullgv;
6648 *st = CvSTASH(cv);
6649 return cv;
6650 }
6651 else if(isGV(sv))
6652 gv = (GV*)sv;
6653 else
cea2e8a9 6654 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 6655 }
62f274bf 6656 else if (isGV(sv))
79072805
LW
6657 gv = (GV*)sv;
6658 else
2d8e6c8d 6659 gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
79072805
LW
6660 *gvp = gv;
6661 if (!gv)
6662 return Nullcv;
6663 *st = GvESTASH(gv);
8990e307 6664 fix_gv:
8ebc5c01 6665 if (lref && !GvCVu(gv)) {
4633a7c4 6666 SV *tmpsv;
748a9306 6667 ENTER;
4633a7c4 6668 tmpsv = NEWSV(704,0);
16660edb 6669 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
6670 /* XXX this is probably not what they think they're getting.
6671 * It has the same effect as "sub name;", i.e. just a forward
6672 * declaration! */
774d564b 6673 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
6674 newSVOP(OP_CONST, 0, tmpsv),
6675 Nullop,
8990e307 6676 Nullop);
748a9306 6677 LEAVE;
8ebc5c01 6678 if (!GvCVu(gv))
cea2e8a9 6679 Perl_croak(aTHX_ "Unable to create sub named \"%s\"", SvPV(sv,n_a));
8990e307 6680 }
8ebc5c01 6681 return GvCVu(gv);
79072805
LW
6682 }
6683}
6684
c461cf8f
JH
6685/*
6686=for apidoc sv_true
6687
6688Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
6689Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
6690instead use an in-line version.
c461cf8f
JH
6691
6692=cut
6693*/
6694
79072805 6695I32
864dbfa3 6696Perl_sv_true(pTHX_ register SV *sv)
79072805 6697{
8990e307
LW
6698 if (!sv)
6699 return 0;
79072805 6700 if (SvPOK(sv)) {
4e35701f
NIS
6701 register XPV* tXpv;
6702 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 6703 (tXpv->xpv_cur > 1 ||
4e35701f 6704 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
79072805
LW
6705 return 1;
6706 else
6707 return 0;
6708 }
6709 else {
6710 if (SvIOK(sv))
463ee0b2 6711 return SvIVX(sv) != 0;
79072805
LW
6712 else {
6713 if (SvNOK(sv))
463ee0b2 6714 return SvNVX(sv) != 0.0;
79072805 6715 else
463ee0b2 6716 return sv_2bool(sv);
79072805
LW
6717 }
6718 }
6719}
79072805 6720
645c22ef
DM
6721/*
6722=for apidoc sv_iv
6723
6724A private implementation of the C<SvIVx> macro for compilers which can't
6725cope with complex macro expressions. Always use the macro instead.
6726
6727=cut
6728*/
6729
ff68c719 6730IV
864dbfa3 6731Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 6732{
25da4f38
IZ
6733 if (SvIOK(sv)) {
6734 if (SvIsUV(sv))
6735 return (IV)SvUVX(sv);
ff68c719 6736 return SvIVX(sv);
25da4f38 6737 }
ff68c719 6738 return sv_2iv(sv);
85e6fe83 6739}
85e6fe83 6740
645c22ef
DM
6741/*
6742=for apidoc sv_uv
6743
6744A private implementation of the C<SvUVx> macro for compilers which can't
6745cope with complex macro expressions. Always use the macro instead.
6746
6747=cut
6748*/
6749
ff68c719 6750UV
864dbfa3 6751Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 6752{
25da4f38
IZ
6753 if (SvIOK(sv)) {
6754 if (SvIsUV(sv))
6755 return SvUVX(sv);
6756 return (UV)SvIVX(sv);
6757 }
ff68c719 6758 return sv_2uv(sv);
6759}
85e6fe83 6760
645c22ef
DM
6761/*
6762=for apidoc sv_nv
6763
6764A private implementation of the C<SvNVx> macro for compilers which can't
6765cope with complex macro expressions. Always use the macro instead.
6766
6767=cut
6768*/
6769
65202027 6770NV
864dbfa3 6771Perl_sv_nv(pTHX_ register SV *sv)
79072805 6772{
ff68c719 6773 if (SvNOK(sv))
6774 return SvNVX(sv);
6775 return sv_2nv(sv);
79072805 6776}
79072805 6777
645c22ef
DM
6778/*
6779=for apidoc sv_pv
6780
6781A private implementation of the C<SvPV_nolen> macro for compilers which can't
6782cope with complex macro expressions. Always use the macro instead.
6783
6784=cut
6785*/
6786
79072805 6787char *
864dbfa3 6788Perl_sv_pv(pTHX_ SV *sv)
1fa8b10d
JD
6789{
6790 STRLEN n_a;
6791
6792 if (SvPOK(sv))
6793 return SvPVX(sv);
6794
6795 return sv_2pv(sv, &n_a);
6796}
6797
645c22ef
DM
6798/*
6799=for apidoc sv_pvn
6800
6801A private implementation of the C<SvPV> macro for compilers which can't
6802cope with complex macro expressions. Always use the macro instead.
6803
6804=cut
6805*/
6806
1fa8b10d 6807char *
864dbfa3 6808Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 6809{
85e6fe83
LW
6810 if (SvPOK(sv)) {
6811 *lp = SvCUR(sv);
a0d0e21e 6812 return SvPVX(sv);
85e6fe83 6813 }
463ee0b2 6814 return sv_2pv(sv, lp);
79072805 6815}
79072805 6816
6e9d1081
NC
6817/* For -DCRIPPLED_CC only. See also C<sv_2pv_flags()>.
6818 */
6819
6820char *
6821Perl_sv_pvn_nomg(pTHX_ register SV *sv, STRLEN *lp)
6822{
6823 if (SvPOK(sv)) {
6824 *lp = SvCUR(sv);
6825 return SvPVX(sv);
6826 }
6827 return sv_2pv_flags(sv, lp, 0);
6828}
6829
c461cf8f
JH
6830/*
6831=for apidoc sv_pvn_force
6832
6833Get a sensible string out of the SV somehow.
645c22ef
DM
6834A private implementation of the C<SvPV_force> macro for compilers which
6835can't cope with complex macro expressions. Always use the macro instead.
c461cf8f
JH
6836
6837=cut
6838*/
6839
a0d0e21e 6840char *
864dbfa3 6841Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
a0d0e21e 6842{
36f65ada 6843 return sv_pvn_force_flags(sv, lp, SV_GMAGIC);
8d6d96c1
HS
6844}
6845
6846/*
6847=for apidoc sv_pvn_force_flags
6848
6849Get a sensible string out of the SV somehow.
6850If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
6851appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
6852implemented in terms of this function.
645c22ef
DM
6853You normally want to use the various wrapper macros instead: see
6854C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
6855
6856=cut
6857*/
6858
6859char *
6860Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
6861{
a0d0e21e
LW
6862 char *s;
6863
6fc92669
GS
6864 if (SvTHINKFIRST(sv) && !SvROK(sv))
6865 sv_force_normal(sv);
1c846c1f 6866
a0d0e21e
LW
6867 if (SvPOK(sv)) {
6868 *lp = SvCUR(sv);
6869 }
6870 else {
748a9306 6871 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 6872 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 6873 OP_NAME(PL_op));
a0d0e21e 6874 }
4633a7c4 6875 else
8d6d96c1 6876 s = sv_2pv_flags(sv, lp, flags);
a0d0e21e
LW
6877 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
6878 STRLEN len = *lp;
1c846c1f 6879
a0d0e21e
LW
6880 if (SvROK(sv))
6881 sv_unref(sv);
6882 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
6883 SvGROW(sv, len + 1);
6884 Move(s,SvPVX(sv),len,char);
6885 SvCUR_set(sv, len);
6886 *SvEND(sv) = '\0';
6887 }
6888 if (!SvPOK(sv)) {
6889 SvPOK_on(sv); /* validate pointer */
6890 SvTAINT(sv);
1d7c1841
GS
6891 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
6892 PTR2UV(sv),SvPVX(sv)));
a0d0e21e
LW
6893 }
6894 }
6895 return SvPVX(sv);
6896}
6897
645c22ef
DM
6898/*
6899=for apidoc sv_pvbyte
6900
6901A private implementation of the C<SvPVbyte_nolen> macro for compilers
6902which can't cope with complex macro expressions. Always use the macro
6903instead.
6904
6905=cut
6906*/
6907
a0d0e21e 6908char *
7340a771
GS
6909Perl_sv_pvbyte(pTHX_ SV *sv)
6910{
ffebcc3e 6911 sv_utf8_downgrade(sv,0);
7340a771
GS
6912 return sv_pv(sv);
6913}
6914
645c22ef
DM
6915/*
6916=for apidoc sv_pvbyten
6917
6918A private implementation of the C<SvPVbyte> macro for compilers
6919which can't cope with complex macro expressions. Always use the macro
6920instead.
6921
6922=cut
6923*/
6924
7340a771
GS
6925char *
6926Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
6927{
ffebcc3e 6928 sv_utf8_downgrade(sv,0);
7340a771
GS
6929 return sv_pvn(sv,lp);
6930}
6931
645c22ef
DM
6932/*
6933=for apidoc sv_pvbyten_force
6934
6935A private implementation of the C<SvPVbytex_force> macro for compilers
6936which can't cope with complex macro expressions. Always use the macro
6937instead.
6938
6939=cut
6940*/
6941
7340a771
GS
6942char *
6943Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
6944{
ffebcc3e 6945 sv_utf8_downgrade(sv,0);
7340a771
GS
6946 return sv_pvn_force(sv,lp);
6947}
6948
645c22ef
DM
6949/*
6950=for apidoc sv_pvutf8
6951
6952A private implementation of the C<SvPVutf8_nolen> macro for compilers
6953which can't cope with complex macro expressions. Always use the macro
6954instead.
6955
6956=cut
6957*/
6958
7340a771
GS
6959char *
6960Perl_sv_pvutf8(pTHX_ SV *sv)
6961{
560a288e 6962 sv_utf8_upgrade(sv);
7340a771
GS
6963 return sv_pv(sv);
6964}
6965
645c22ef
DM
6966/*
6967=for apidoc sv_pvutf8n
6968
6969A private implementation of the C<SvPVutf8> macro for compilers
6970which can't cope with complex macro expressions. Always use the macro
6971instead.
6972
6973=cut
6974*/
6975
7340a771
GS
6976char *
6977Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
6978{
560a288e 6979 sv_utf8_upgrade(sv);
7340a771
GS
6980 return sv_pvn(sv,lp);
6981}
6982
c461cf8f
JH
6983/*
6984=for apidoc sv_pvutf8n_force
6985
645c22ef
DM
6986A private implementation of the C<SvPVutf8_force> macro for compilers
6987which can't cope with complex macro expressions. Always use the macro
6988instead.
c461cf8f
JH
6989
6990=cut
6991*/
6992
7340a771
GS
6993char *
6994Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
6995{
560a288e 6996 sv_utf8_upgrade(sv);
7340a771
GS
6997 return sv_pvn_force(sv,lp);
6998}
6999
c461cf8f
JH
7000/*
7001=for apidoc sv_reftype
7002
7003Returns a string describing what the SV is a reference to.
7004
7005=cut
7006*/
7007
7340a771 7008char *
864dbfa3 7009Perl_sv_reftype(pTHX_ SV *sv, int ob)
a0d0e21e 7010{
c86bf373
AMS
7011 if (ob && SvOBJECT(sv)) {
7012 HV *svs = SvSTASH(sv);
7013 /* [20011101.072] This bandaid for C<package;> should eventually
7014 be removed. AMS 20011103 */
7015 return (svs ? HvNAME(svs) : "<none>");
7016 }
a0d0e21e
LW
7017 else {
7018 switch (SvTYPE(sv)) {
7019 case SVt_NULL:
7020 case SVt_IV:
7021 case SVt_NV:
7022 case SVt_RV:
7023 case SVt_PV:
7024 case SVt_PVIV:
7025 case SVt_PVNV:
7026 case SVt_PVMG:
7027 case SVt_PVBM:
7028 if (SvROK(sv))
7029 return "REF";
7030 else
7031 return "SCALAR";
7032 case SVt_PVLV: return "LVALUE";
7033 case SVt_PVAV: return "ARRAY";
7034 case SVt_PVHV: return "HASH";
7035 case SVt_PVCV: return "CODE";
7036 case SVt_PVGV: return "GLOB";
1d2dff63 7037 case SVt_PVFM: return "FORMAT";
27f9d8f3 7038 case SVt_PVIO: return "IO";
a0d0e21e
LW
7039 default: return "UNKNOWN";
7040 }
7041 }
7042}
7043
954c1994
GS
7044/*
7045=for apidoc sv_isobject
7046
7047Returns a boolean indicating whether the SV is an RV pointing to a blessed
7048object. If the SV is not an RV, or if the object is not blessed, then this
7049will return false.
7050
7051=cut
7052*/
7053
463ee0b2 7054int
864dbfa3 7055Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 7056{
68dc0745 7057 if (!sv)
7058 return 0;
7059 if (SvGMAGICAL(sv))
7060 mg_get(sv);
85e6fe83
LW
7061 if (!SvROK(sv))
7062 return 0;
7063 sv = (SV*)SvRV(sv);
7064 if (!SvOBJECT(sv))
7065 return 0;
7066 return 1;
7067}
7068
954c1994
GS
7069/*
7070=for apidoc sv_isa
7071
7072Returns a boolean indicating whether the SV is blessed into the specified
7073class. This does not check for subtypes; use C<sv_derived_from> to verify
7074an inheritance relationship.
7075
7076=cut
7077*/
7078
85e6fe83 7079int
864dbfa3 7080Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 7081{
68dc0745 7082 if (!sv)
7083 return 0;
7084 if (SvGMAGICAL(sv))
7085 mg_get(sv);
ed6116ce 7086 if (!SvROK(sv))
463ee0b2 7087 return 0;
ed6116ce
LW
7088 sv = (SV*)SvRV(sv);
7089 if (!SvOBJECT(sv))
463ee0b2
LW
7090 return 0;
7091
7092 return strEQ(HvNAME(SvSTASH(sv)), name);
7093}
7094
954c1994
GS
7095/*
7096=for apidoc newSVrv
7097
7098Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
7099it will be upgraded to one. If C<classname> is non-null then the new SV will
7100be blessed in the specified package. The new SV is returned and its
7101reference count is 1.
7102
7103=cut
7104*/
7105
463ee0b2 7106SV*
864dbfa3 7107Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 7108{
463ee0b2
LW
7109 SV *sv;
7110
4561caa4 7111 new_SV(sv);
51cf62d8 7112
2213622d 7113 SV_CHECK_THINKFIRST(rv);
51cf62d8 7114 SvAMAGIC_off(rv);
51cf62d8 7115
0199fce9
JD
7116 if (SvTYPE(rv) >= SVt_PVMG) {
7117 U32 refcnt = SvREFCNT(rv);
7118 SvREFCNT(rv) = 0;
7119 sv_clear(rv);
7120 SvFLAGS(rv) = 0;
7121 SvREFCNT(rv) = refcnt;
7122 }
7123
51cf62d8 7124 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
7125 sv_upgrade(rv, SVt_RV);
7126 else if (SvTYPE(rv) > SVt_RV) {
7127 (void)SvOOK_off(rv);
7128 if (SvPVX(rv) && SvLEN(rv))
7129 Safefree(SvPVX(rv));
7130 SvCUR_set(rv, 0);
7131 SvLEN_set(rv, 0);
7132 }
51cf62d8
OT
7133
7134 (void)SvOK_off(rv);
053fc874 7135 SvRV(rv) = sv;
ed6116ce 7136 SvROK_on(rv);
463ee0b2 7137
a0d0e21e
LW
7138 if (classname) {
7139 HV* stash = gv_stashpv(classname, TRUE);
7140 (void)sv_bless(rv, stash);
7141 }
7142 return sv;
7143}
7144
954c1994
GS
7145/*
7146=for apidoc sv_setref_pv
7147
7148Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
7149argument will be upgraded to an RV. That RV will be modified to point to
7150the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7151into the SV. The C<classname> argument indicates the package for the
7152blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7153will be returned and will have a reference count of 1.
7154
7155Do not use with other Perl types such as HV, AV, SV, CV, because those
7156objects will become corrupted by the pointer copy process.
7157
7158Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7159
7160=cut
7161*/
7162
a0d0e21e 7163SV*
864dbfa3 7164Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 7165{
189b2af5 7166 if (!pv) {
3280af22 7167 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
7168 SvSETMAGIC(rv);
7169 }
a0d0e21e 7170 else
56431972 7171 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
7172 return rv;
7173}
7174
954c1994
GS
7175/*
7176=for apidoc sv_setref_iv
7177
7178Copies an integer into a new SV, optionally blessing the SV. The C<rv>
7179argument will be upgraded to an RV. That RV will be modified to point to
7180the new SV. The C<classname> argument indicates the package for the
7181blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7182will be returned and will have a reference count of 1.
7183
7184=cut
7185*/
7186
a0d0e21e 7187SV*
864dbfa3 7188Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
7189{
7190 sv_setiv(newSVrv(rv,classname), iv);
7191 return rv;
7192}
7193
954c1994 7194/*
e1c57cef
JH
7195=for apidoc sv_setref_uv
7196
7197Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
7198argument will be upgraded to an RV. That RV will be modified to point to
7199the new SV. The C<classname> argument indicates the package for the
7200blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7201will be returned and will have a reference count of 1.
7202
7203=cut
7204*/
7205
7206SV*
7207Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
7208{
7209 sv_setuv(newSVrv(rv,classname), uv);
7210 return rv;
7211}
7212
7213/*
954c1994
GS
7214=for apidoc sv_setref_nv
7215
7216Copies a double into a new SV, optionally blessing the SV. The C<rv>
7217argument will be upgraded to an RV. That RV will be modified to point to
7218the new SV. The C<classname> argument indicates the package for the
7219blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7220will be returned and will have a reference count of 1.
7221
7222=cut
7223*/
7224
a0d0e21e 7225SV*
65202027 7226Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
7227{
7228 sv_setnv(newSVrv(rv,classname), nv);
7229 return rv;
7230}
463ee0b2 7231
954c1994
GS
7232/*
7233=for apidoc sv_setref_pvn
7234
7235Copies a string into a new SV, optionally blessing the SV. The length of the
7236string must be specified with C<n>. The C<rv> argument will be upgraded to
7237an RV. That RV will be modified to point to the new SV. The C<classname>
7238argument indicates the package for the blessing. Set C<classname> to
7239C<Nullch> to avoid the blessing. The new SV will be returned and will have
7240a reference count of 1.
7241
7242Note that C<sv_setref_pv> copies the pointer while this copies the string.
7243
7244=cut
7245*/
7246
a0d0e21e 7247SV*
864dbfa3 7248Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
7249{
7250 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
7251 return rv;
7252}
7253
954c1994
GS
7254/*
7255=for apidoc sv_bless
7256
7257Blesses an SV into a specified package. The SV must be an RV. The package
7258must be designated by its stash (see C<gv_stashpv()>). The reference count
7259of the SV is unaffected.
7260
7261=cut
7262*/
7263
a0d0e21e 7264SV*
864dbfa3 7265Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 7266{
76e3520e 7267 SV *tmpRef;
a0d0e21e 7268 if (!SvROK(sv))
cea2e8a9 7269 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
7270 tmpRef = SvRV(sv);
7271 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
7272 if (SvREADONLY(tmpRef))
cea2e8a9 7273 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
7274 if (SvOBJECT(tmpRef)) {
7275 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7276 --PL_sv_objcount;
76e3520e 7277 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 7278 }
a0d0e21e 7279 }
76e3520e
GS
7280 SvOBJECT_on(tmpRef);
7281 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7282 ++PL_sv_objcount;
76e3520e
GS
7283 (void)SvUPGRADE(tmpRef, SVt_PVMG);
7284 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
a0d0e21e 7285
2e3febc6
CS
7286 if (Gv_AMG(stash))
7287 SvAMAGIC_on(sv);
7288 else
7289 SvAMAGIC_off(sv);
a0d0e21e 7290
1edbfb88
AB
7291 if(SvSMAGICAL(tmpRef))
7292 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
7293 mg_set(tmpRef);
7294
7295
ecdeb87c 7296
a0d0e21e
LW
7297 return sv;
7298}
7299
645c22ef
DM
7300/* Downgrades a PVGV to a PVMG.
7301 *
7302 * XXX This function doesn't actually appear to be used anywhere
7303 * DAPM 15-Jun-01
7304 */
7305
76e3520e 7306STATIC void
cea2e8a9 7307S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 7308{
850fabdf
GS
7309 void *xpvmg;
7310
a0d0e21e
LW
7311 assert(SvTYPE(sv) == SVt_PVGV);
7312 SvFAKE_off(sv);
7313 if (GvGP(sv))
1edc1566 7314 gp_free((GV*)sv);
e826b3c7
GS
7315 if (GvSTASH(sv)) {
7316 SvREFCNT_dec(GvSTASH(sv));
7317 GvSTASH(sv) = Nullhv;
7318 }
14befaf4 7319 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 7320 Safefree(GvNAME(sv));
a5f75d66 7321 GvMULTI_off(sv);
850fabdf
GS
7322
7323 /* need to keep SvANY(sv) in the right arena */
7324 xpvmg = new_XPVMG();
7325 StructCopy(SvANY(sv), xpvmg, XPVMG);
7326 del_XPVGV(SvANY(sv));
7327 SvANY(sv) = xpvmg;
7328
a0d0e21e
LW
7329 SvFLAGS(sv) &= ~SVTYPEMASK;
7330 SvFLAGS(sv) |= SVt_PVMG;
7331}
7332
954c1994 7333/*
840a7b70 7334=for apidoc sv_unref_flags
954c1994
GS
7335
7336Unsets the RV status of the SV, and decrements the reference count of
7337whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
7338as a reversal of C<newSVrv>. The C<cflags> argument can contain
7339C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
7340(otherwise the decrementing is conditional on the reference count being
7341different from one or the reference being a readonly SV).
7889fe52 7342See C<SvROK_off>.
954c1994
GS
7343
7344=cut
7345*/
7346
ed6116ce 7347void
840a7b70 7348Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 7349{
a0d0e21e 7350 SV* rv = SvRV(sv);
810b8aa5
GS
7351
7352 if (SvWEAKREF(sv)) {
7353 sv_del_backref(sv);
7354 SvWEAKREF_off(sv);
7355 SvRV(sv) = 0;
7356 return;
7357 }
ed6116ce
LW
7358 SvRV(sv) = 0;
7359 SvROK_off(sv);
840a7b70 7360 if (SvREFCNT(rv) != 1 || SvREADONLY(rv) || flags) /* SV_IMMEDIATE_UNREF */
4633a7c4 7361 SvREFCNT_dec(rv);
840a7b70 7362 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 7363 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 7364}
8990e307 7365
840a7b70
IZ
7366/*
7367=for apidoc sv_unref
7368
7369Unsets the RV status of the SV, and decrements the reference count of
7370whatever was being referenced by the RV. This can almost be thought of
7371as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 7372being zero. See C<SvROK_off>.
840a7b70
IZ
7373
7374=cut
7375*/
7376
7377void
7378Perl_sv_unref(pTHX_ SV *sv)
7379{
7380 sv_unref_flags(sv, 0);
7381}
7382
645c22ef
DM
7383/*
7384=for apidoc sv_taint
7385
7386Taint an SV. Use C<SvTAINTED_on> instead.
7387=cut
7388*/
7389
bbce6d69 7390void
864dbfa3 7391Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 7392{
14befaf4 7393 sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
bbce6d69 7394}
7395
645c22ef
DM
7396/*
7397=for apidoc sv_untaint
7398
7399Untaint an SV. Use C<SvTAINTED_off> instead.
7400=cut
7401*/
7402
bbce6d69 7403void
864dbfa3 7404Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 7405{
13f57bf8 7406 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 7407 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 7408 if (mg)
565764a8 7409 mg->mg_len &= ~1;
36477c24 7410 }
bbce6d69 7411}
7412
645c22ef
DM
7413/*
7414=for apidoc sv_tainted
7415
7416Test an SV for taintedness. Use C<SvTAINTED> instead.
7417=cut
7418*/
7419
bbce6d69 7420bool
864dbfa3 7421Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 7422{
13f57bf8 7423 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 7424 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
155aba94 7425 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 7426 return TRUE;
7427 }
7428 return FALSE;
bbce6d69 7429}
7430
954c1994
GS
7431/*
7432=for apidoc sv_setpviv
7433
7434Copies an integer into the given SV, also updating its string value.
7435Does not handle 'set' magic. See C<sv_setpviv_mg>.
7436
7437=cut
7438*/
7439
84902520 7440void
864dbfa3 7441Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
84902520 7442{
25da4f38
IZ
7443 char buf[TYPE_CHARS(UV)];
7444 char *ebuf;
7445 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
84902520 7446
25da4f38 7447 sv_setpvn(sv, ptr, ebuf - ptr);
84902520
TB
7448}
7449
954c1994
GS
7450/*
7451=for apidoc sv_setpviv_mg
7452
7453Like C<sv_setpviv>, but also handles 'set' magic.
7454
7455=cut
7456*/
7457
ef50df4b 7458void
864dbfa3 7459Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
ef50df4b 7460{
25da4f38
IZ
7461 char buf[TYPE_CHARS(UV)];
7462 char *ebuf;
7463 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
7464
7465 sv_setpvn(sv, ptr, ebuf - ptr);
ef50df4b
GS
7466 SvSETMAGIC(sv);
7467}
7468
cea2e8a9 7469#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7470
7471/* pTHX_ magic can't cope with varargs, so this is a no-context
7472 * version of the main function, (which may itself be aliased to us).
7473 * Don't access this version directly.
7474 */
7475
cea2e8a9
GS
7476void
7477Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
7478{
7479 dTHX;
7480 va_list args;
7481 va_start(args, pat);
c5be433b 7482 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
7483 va_end(args);
7484}
7485
645c22ef
DM
7486/* pTHX_ magic can't cope with varargs, so this is a no-context
7487 * version of the main function, (which may itself be aliased to us).
7488 * Don't access this version directly.
7489 */
cea2e8a9
GS
7490
7491void
7492Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
7493{
7494 dTHX;
7495 va_list args;
7496 va_start(args, pat);
c5be433b 7497 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 7498 va_end(args);
cea2e8a9
GS
7499}
7500#endif
7501
954c1994
GS
7502/*
7503=for apidoc sv_setpvf
7504
7505Processes its arguments like C<sprintf> and sets an SV to the formatted
7506output. Does not handle 'set' magic. See C<sv_setpvf_mg>.
7507
7508=cut
7509*/
7510
46fc3d4c 7511void
864dbfa3 7512Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 7513{
7514 va_list args;
46fc3d4c 7515 va_start(args, pat);
c5be433b 7516 sv_vsetpvf(sv, pat, &args);
46fc3d4c 7517 va_end(args);
7518}
7519
645c22ef
DM
7520/* backend for C<sv_setpvf> and C<sv_setpvf_nocontext> */
7521
c5be433b
GS
7522void
7523Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7524{
7525 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7526}
ef50df4b 7527
954c1994
GS
7528/*
7529=for apidoc sv_setpvf_mg
7530
7531Like C<sv_setpvf>, but also handles 'set' magic.
7532
7533=cut
7534*/
7535
ef50df4b 7536void
864dbfa3 7537Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
7538{
7539 va_list args;
ef50df4b 7540 va_start(args, pat);
c5be433b 7541 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 7542 va_end(args);
c5be433b
GS
7543}
7544
645c22ef
DM
7545/* backend for C<sv_setpvf_mg> C<setpvf_mg_nocontext> */
7546
c5be433b
GS
7547void
7548Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7549{
7550 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
7551 SvSETMAGIC(sv);
7552}
7553
cea2e8a9 7554#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7555
7556/* pTHX_ magic can't cope with varargs, so this is a no-context
7557 * version of the main function, (which may itself be aliased to us).
7558 * Don't access this version directly.
7559 */
7560
cea2e8a9
GS
7561void
7562Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
7563{
7564 dTHX;
7565 va_list args;
7566 va_start(args, pat);
c5be433b 7567 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
7568 va_end(args);
7569}
7570
645c22ef
DM
7571/* pTHX_ magic can't cope with varargs, so this is a no-context
7572 * version of the main function, (which may itself be aliased to us).
7573 * Don't access this version directly.
7574 */
7575
cea2e8a9
GS
7576void
7577Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
7578{
7579 dTHX;
7580 va_list args;
7581 va_start(args, pat);
c5be433b 7582 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 7583 va_end(args);
cea2e8a9
GS
7584}
7585#endif
7586
954c1994
GS
7587/*
7588=for apidoc sv_catpvf
7589
d5ce4a7c
GA
7590Processes its arguments like C<sprintf> and appends the formatted
7591output to an SV. If the appended data contains "wide" characters
7592(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
7593and characters >255 formatted with %c), the original SV might get
7594upgraded to UTF-8. Handles 'get' magic, but not 'set' magic.
7595C<SvSETMAGIC()> must typically be called after calling this function
7596to handle 'set' magic.
954c1994 7597
d5ce4a7c 7598=cut */
954c1994 7599
46fc3d4c 7600void
864dbfa3 7601Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 7602{
7603 va_list args;
46fc3d4c 7604 va_start(args, pat);
c5be433b 7605 sv_vcatpvf(sv, pat, &args);
46fc3d4c 7606 va_end(args);
7607}
7608
645c22ef
DM
7609/* backend for C<sv_catpvf> and C<catpvf_mg_nocontext> */
7610
ef50df4b 7611void
c5be433b
GS
7612Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7613{
7614 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7615}
7616
954c1994
GS
7617/*
7618=for apidoc sv_catpvf_mg
7619
7620Like C<sv_catpvf>, but also handles 'set' magic.
7621
7622=cut
7623*/
7624
c5be433b 7625void
864dbfa3 7626Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
7627{
7628 va_list args;
ef50df4b 7629 va_start(args, pat);
c5be433b 7630 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 7631 va_end(args);
c5be433b
GS
7632}
7633
645c22ef
DM
7634/* backend for C<catpvf_mg> and C<catpvf_mg_nocontext> */
7635
c5be433b
GS
7636void
7637Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7638{
7639 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
7640 SvSETMAGIC(sv);
7641}
7642
954c1994
GS
7643/*
7644=for apidoc sv_vsetpvfn
7645
7646Works like C<vcatpvfn> but copies the text into the SV instead of
7647appending it.
7648
645c22ef
DM
7649Usually used via one of its frontends C<sv_setpvf> and C<sv_setpvf_mg>.
7650
954c1994
GS
7651=cut
7652*/
7653
46fc3d4c 7654void
7d5ea4e7 7655Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 7656{
7657 sv_setpvn(sv, "", 0);
7d5ea4e7 7658 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 7659}
7660
645c22ef
DM
7661/* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
7662
2d00ba3b 7663STATIC I32
9dd79c3f 7664S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
7665{
7666 I32 var = 0;
7667 switch (**pattern) {
7668 case '1': case '2': case '3':
7669 case '4': case '5': case '6':
7670 case '7': case '8': case '9':
7671 while (isDIGIT(**pattern))
7672 var = var * 10 + (*(*pattern)++ - '0');
7673 }
7674 return var;
7675}
9dd79c3f 7676#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 7677
954c1994
GS
7678/*
7679=for apidoc sv_vcatpvfn
7680
7681Processes its arguments like C<vsprintf> and appends the formatted output
7682to an SV. Uses an array of SVs if the C style variable argument list is
7683missing (NULL). When running with taint checks enabled, indicates via
7684C<maybe_tainted> if results are untrustworthy (often due to the use of
7685locales).
7686
645c22ef
DM
7687Usually used via one of its frontends C<sv_catpvf> and C<sv_catpvf_mg>.
7688
954c1994
GS
7689=cut
7690*/
7691
46fc3d4c 7692void
7d5ea4e7 7693Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 7694{
7695 char *p;
7696 char *q;
7697 char *patend;
fc36a67e 7698 STRLEN origlen;
46fc3d4c 7699 I32 svix = 0;
c635e13b 7700 static char nullstr[] = "(null)";
9c5ffd7c 7701 SV *argsv = Nullsv;
2cf2cfc6 7702 bool has_utf8 = FALSE; /* has the result utf8? */
46fc3d4c 7703
7704 /* no matter what, this is a string now */
fc36a67e 7705 (void)SvPV_force(sv, origlen);
46fc3d4c 7706
fc36a67e 7707 /* special-case "", "%s", and "%_" */
46fc3d4c 7708 if (patlen == 0)
7709 return;
fc36a67e 7710 if (patlen == 2 && pat[0] == '%') {
7711 switch (pat[1]) {
7712 case 's':
c635e13b 7713 if (args) {
7714 char *s = va_arg(*args, char*);
7715 sv_catpv(sv, s ? s : nullstr);
7716 }
7e2040f0 7717 else if (svix < svmax) {
fc36a67e 7718 sv_catsv(sv, *svargs);
7e2040f0
GS
7719 if (DO_UTF8(*svargs))
7720 SvUTF8_on(sv);
7721 }
fc36a67e 7722 return;
7723 case '_':
7724 if (args) {
7e2040f0
GS
7725 argsv = va_arg(*args, SV*);
7726 sv_catsv(sv, argsv);
7727 if (DO_UTF8(argsv))
7728 SvUTF8_on(sv);
fc36a67e 7729 return;
7730 }
7731 /* See comment on '_' below */
7732 break;
7733 }
46fc3d4c 7734 }
7735
2cf2cfc6
A
7736 if (!args && svix < svmax && DO_UTF8(*svargs))
7737 has_utf8 = TRUE;
7738
46fc3d4c 7739 patend = (char*)pat + patlen;
7740 for (p = (char*)pat; p < patend; p = q) {
7741 bool alt = FALSE;
7742 bool left = FALSE;
b22c7a20 7743 bool vectorize = FALSE;
211dfcf1 7744 bool vectorarg = FALSE;
2cf2cfc6 7745 bool vec_utf8 = FALSE;
46fc3d4c 7746 char fill = ' ';
7747 char plus = 0;
7748 char intsize = 0;
7749 STRLEN width = 0;
fc36a67e 7750 STRLEN zeros = 0;
46fc3d4c 7751 bool has_precis = FALSE;
7752 STRLEN precis = 0;
2cf2cfc6 7753 bool is_utf8 = FALSE; /* is this item utf8? */
eb3fce90 7754
46fc3d4c 7755 char esignbuf[4];
ad391ad9 7756 U8 utf8buf[UTF8_MAXLEN+1];
46fc3d4c 7757 STRLEN esignlen = 0;
7758
7759 char *eptr = Nullch;
fc36a67e 7760 STRLEN elen = 0;
089c015b
JH
7761 /* Times 4: a decimal digit takes more than 3 binary digits.
7762 * NV_DIG: mantissa takes than many decimal digits.
7763 * Plus 32: Playing safe. */
7764 char ebuf[IV_DIG * 4 + NV_DIG + 32];
2d4389e4
JH
7765 /* large enough for "%#.#f" --chip */
7766 /* what about long double NVs? --jhi */
b22c7a20
GS
7767
7768 SV *vecsv;
a05b299f 7769 U8 *vecstr = Null(U8*);
b22c7a20 7770 STRLEN veclen = 0;
46fc3d4c 7771 char c;
7772 int i;
9c5ffd7c 7773 unsigned base = 0;
8c8eb53c
RB
7774 IV iv = 0;
7775 UV uv = 0;
65202027 7776 NV nv;
46fc3d4c 7777 STRLEN have;
7778 STRLEN need;
7779 STRLEN gap;
b22c7a20
GS
7780 char *dotstr = ".";
7781 STRLEN dotstrlen = 1;
211dfcf1 7782 I32 efix = 0; /* explicit format parameter index */
eb3fce90 7783 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
7784 I32 epix = 0; /* explicit precision index */
7785 I32 evix = 0; /* explicit vector index */
eb3fce90 7786 bool asterisk = FALSE;
46fc3d4c 7787
211dfcf1 7788 /* echo everything up to the next format specification */
46fc3d4c 7789 for (q = p; q < patend && *q != '%'; ++q) ;
7790 if (q > p) {
7791 sv_catpvn(sv, p, q - p);
7792 p = q;
7793 }
7794 if (q++ >= patend)
7795 break;
7796
211dfcf1
HS
7797/*
7798 We allow format specification elements in this order:
7799 \d+\$ explicit format parameter index
7800 [-+ 0#]+ flags
7801 \*?(\d+\$)?v vector with optional (optionally specified) arg
7802 \d+|\*(\d+\$)? width using optional (optionally specified) arg
7803 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
7804 [hlqLV] size
7805 [%bcdefginopsux_DFOUX] format (mandatory)
7806*/
7807 if (EXPECT_NUMBER(q, width)) {
7808 if (*q == '$') {
7809 ++q;
7810 efix = width;
7811 } else {
7812 goto gotwidth;
7813 }
7814 }
7815
fc36a67e 7816 /* FLAGS */
7817
46fc3d4c 7818 while (*q) {
7819 switch (*q) {
7820 case ' ':
7821 case '+':
7822 plus = *q++;
7823 continue;
7824
7825 case '-':
7826 left = TRUE;
7827 q++;
7828 continue;
7829
7830 case '0':
7831 fill = *q++;
7832 continue;
7833
7834 case '#':
7835 alt = TRUE;
7836 q++;
7837 continue;
7838
fc36a67e 7839 default:
7840 break;
7841 }
7842 break;
7843 }
46fc3d4c 7844
211dfcf1 7845 tryasterisk:
eb3fce90 7846 if (*q == '*') {
211dfcf1
HS
7847 q++;
7848 if (EXPECT_NUMBER(q, ewix))
7849 if (*q++ != '$')
7850 goto unknown;
eb3fce90 7851 asterisk = TRUE;
211dfcf1
HS
7852 }
7853 if (*q == 'v') {
eb3fce90 7854 q++;
211dfcf1
HS
7855 if (vectorize)
7856 goto unknown;
9cbac4c7 7857 if ((vectorarg = asterisk)) {
211dfcf1
HS
7858 evix = ewix;
7859 ewix = 0;
7860 asterisk = FALSE;
7861 }
7862 vectorize = TRUE;
7863 goto tryasterisk;
eb3fce90
JH
7864 }
7865
211dfcf1
HS
7866 if (!asterisk)
7867 EXPECT_NUMBER(q, width);
7868
7869 if (vectorize) {
7870 if (vectorarg) {
7871 if (args)
7872 vecsv = va_arg(*args, SV*);
7873 else
7874 vecsv = (evix ? evix <= svmax : svix < svmax) ?
7875 svargs[ewix ? ewix-1 : svix++] : &PL_sv_undef;
4459522c 7876 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1 7877 if (DO_UTF8(vecsv))
2cf2cfc6 7878 is_utf8 = TRUE;
211dfcf1
HS
7879 }
7880 if (args) {
7881 vecsv = va_arg(*args, SV*);
7882 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 7883 vec_utf8 = DO_UTF8(vecsv);
eb3fce90 7884 }
211dfcf1
HS
7885 else if (efix ? efix <= svmax : svix < svmax) {
7886 vecsv = svargs[efix ? efix-1 : svix++];
7887 vecstr = (U8*)SvPVx(vecsv,veclen);
2cf2cfc6 7888 vec_utf8 = DO_UTF8(vecsv);
211dfcf1
HS
7889 }
7890 else {
7891 vecstr = (U8*)"";
7892 veclen = 0;
7893 }
eb3fce90 7894 }
fc36a67e 7895
eb3fce90 7896 if (asterisk) {
fc36a67e 7897 if (args)
7898 i = va_arg(*args, int);
7899 else
eb3fce90
JH
7900 i = (ewix ? ewix <= svmax : svix < svmax) ?
7901 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 7902 left |= (i < 0);
7903 width = (i < 0) ? -i : i;
fc36a67e 7904 }
211dfcf1 7905 gotwidth:
fc36a67e 7906
7907 /* PRECISION */
46fc3d4c 7908
fc36a67e 7909 if (*q == '.') {
7910 q++;
7911 if (*q == '*') {
211dfcf1 7912 q++;
497b47a8 7913 if (EXPECT_NUMBER(q, epix) && *q++ != '$') /* epix currently unused */
211dfcf1 7914 goto unknown;
46fc3d4c 7915 if (args)
7916 i = va_arg(*args, int);
7917 else
eb3fce90
JH
7918 i = (ewix ? ewix <= svmax : svix < svmax)
7919 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 7920 precis = (i < 0) ? 0 : i;
fc36a67e 7921 }
7922 else {
7923 precis = 0;
7924 while (isDIGIT(*q))
7925 precis = precis * 10 + (*q++ - '0');
7926 }
7927 has_precis = TRUE;
7928 }
46fc3d4c 7929
fc36a67e 7930 /* SIZE */
46fc3d4c 7931
fc36a67e 7932 switch (*q) {
e5c81feb 7933#if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
6f9bb7fd 7934 case 'L': /* Ld */
e5c81feb
JH
7935 /* FALL THROUGH */
7936#endif
7937#ifdef HAS_QUAD
6f9bb7fd
GS
7938 case 'q': /* qd */
7939 intsize = 'q';
7940 q++;
7941 break;
7942#endif
fc36a67e 7943 case 'l':
e5c81feb
JH
7944#if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
7945 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 7946 intsize = 'q';
7947 q += 2;
46fc3d4c 7948 break;
cf2093f6 7949 }
fc36a67e 7950#endif
6f9bb7fd 7951 /* FALL THROUGH */
fc36a67e 7952 case 'h':
cf2093f6 7953 /* FALL THROUGH */
fc36a67e 7954 case 'V':
7955 intsize = *q++;
46fc3d4c 7956 break;
7957 }
7958
fc36a67e 7959 /* CONVERSION */
7960
211dfcf1
HS
7961 if (*q == '%') {
7962 eptr = q++;
7963 elen = 1;
7964 goto string;
7965 }
7966
7967 if (!args)
7968 argsv = (efix ? efix <= svmax : svix < svmax) ?
7969 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
7970
46fc3d4c 7971 switch (c = *q++) {
7972
7973 /* STRINGS */
7974
46fc3d4c 7975 case 'c':
211dfcf1 7976 uv = args ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
7977 if ((uv > 255 ||
7978 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 7979 && !IN_BYTES) {
dfe13c55 7980 eptr = (char*)utf8buf;
9041c2e3 7981 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 7982 is_utf8 = TRUE;
7e2040f0
GS
7983 }
7984 else {
7985 c = (char)uv;
7986 eptr = &c;
7987 elen = 1;
a0ed51b3 7988 }
46fc3d4c 7989 goto string;
7990
46fc3d4c 7991 case 's':
7992 if (args) {
fc36a67e 7993 eptr = va_arg(*args, char*);
c635e13b 7994 if (eptr)
1d7c1841
GS
7995#ifdef MACOS_TRADITIONAL
7996 /* On MacOS, %#s format is used for Pascal strings */
7997 if (alt)
7998 elen = *eptr++;
7999 else
8000#endif
c635e13b 8001 elen = strlen(eptr);
8002 else {
8003 eptr = nullstr;
8004 elen = sizeof nullstr - 1;
8005 }
46fc3d4c 8006 }
211dfcf1 8007 else {
7e2040f0
GS
8008 eptr = SvPVx(argsv, elen);
8009 if (DO_UTF8(argsv)) {
a0ed51b3
LW
8010 if (has_precis && precis < elen) {
8011 I32 p = precis;
7e2040f0 8012 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
8013 precis = p;
8014 }
8015 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 8016 width += elen - sv_len_utf8(argsv);
a0ed51b3 8017 }
2cf2cfc6 8018 is_utf8 = TRUE;
a0ed51b3
LW
8019 }
8020 }
46fc3d4c 8021 goto string;
8022
fc36a67e 8023 case '_':
8024 /*
8025 * The "%_" hack might have to be changed someday,
8026 * if ISO or ANSI decide to use '_' for something.
8027 * So we keep it hidden from users' code.
8028 */
8029 if (!args)
8030 goto unknown;
211dfcf1 8031 argsv = va_arg(*args, SV*);
7e2040f0
GS
8032 eptr = SvPVx(argsv, elen);
8033 if (DO_UTF8(argsv))
2cf2cfc6 8034 is_utf8 = TRUE;
fc36a67e 8035
46fc3d4c 8036 string:
b22c7a20 8037 vectorize = FALSE;
46fc3d4c 8038 if (has_precis && elen > precis)
8039 elen = precis;
8040 break;
8041
8042 /* INTEGERS */
8043
fc36a67e 8044 case 'p':
c2e66d9e
GS
8045 if (alt)
8046 goto unknown;
211dfcf1 8047 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 8048 base = 16;
8049 goto integer;
8050
46fc3d4c 8051 case 'D':
29fe7a80 8052#ifdef IV_IS_QUAD
22f3ae8c 8053 intsize = 'q';
29fe7a80 8054#else
46fc3d4c 8055 intsize = 'l';
29fe7a80 8056#endif
46fc3d4c 8057 /* FALL THROUGH */
8058 case 'd':
8059 case 'i':
b22c7a20 8060 if (vectorize) {
ba210ebe 8061 STRLEN ulen;
211dfcf1
HS
8062 if (!veclen)
8063 continue;
2cf2cfc6
A
8064 if (vec_utf8)
8065 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8066 UTF8_ALLOW_ANYUV);
b22c7a20 8067 else {
e83d50c9 8068 uv = *vecstr;
b22c7a20
GS
8069 ulen = 1;
8070 }
8071 vecstr += ulen;
8072 veclen -= ulen;
e83d50c9
JP
8073 if (plus)
8074 esignbuf[esignlen++] = plus;
b22c7a20
GS
8075 }
8076 else if (args) {
46fc3d4c 8077 switch (intsize) {
8078 case 'h': iv = (short)va_arg(*args, int); break;
8079 default: iv = va_arg(*args, int); break;
8080 case 'l': iv = va_arg(*args, long); break;
fc36a67e 8081 case 'V': iv = va_arg(*args, IV); break;
cf2093f6
JH
8082#ifdef HAS_QUAD
8083 case 'q': iv = va_arg(*args, Quad_t); break;
8084#endif
46fc3d4c 8085 }
8086 }
8087 else {
211dfcf1 8088 iv = SvIVx(argsv);
46fc3d4c 8089 switch (intsize) {
8090 case 'h': iv = (short)iv; break;
be28567c 8091 default: break;
46fc3d4c 8092 case 'l': iv = (long)iv; break;
fc36a67e 8093 case 'V': break;
cf2093f6
JH
8094#ifdef HAS_QUAD
8095 case 'q': iv = (Quad_t)iv; break;
8096#endif
46fc3d4c 8097 }
8098 }
e83d50c9
JP
8099 if ( !vectorize ) /* we already set uv above */
8100 {
8101 if (iv >= 0) {
8102 uv = iv;
8103 if (plus)
8104 esignbuf[esignlen++] = plus;
8105 }
8106 else {
8107 uv = -iv;
8108 esignbuf[esignlen++] = '-';
8109 }
46fc3d4c 8110 }
8111 base = 10;
8112 goto integer;
8113
fc36a67e 8114 case 'U':
29fe7a80 8115#ifdef IV_IS_QUAD
22f3ae8c 8116 intsize = 'q';
29fe7a80 8117#else
fc36a67e 8118 intsize = 'l';
29fe7a80 8119#endif
fc36a67e 8120 /* FALL THROUGH */
8121 case 'u':
8122 base = 10;
8123 goto uns_integer;
8124
4f19785b
WSI
8125 case 'b':
8126 base = 2;
8127 goto uns_integer;
8128
46fc3d4c 8129 case 'O':
29fe7a80 8130#ifdef IV_IS_QUAD
22f3ae8c 8131 intsize = 'q';
29fe7a80 8132#else
46fc3d4c 8133 intsize = 'l';
29fe7a80 8134#endif
46fc3d4c 8135 /* FALL THROUGH */
8136 case 'o':
8137 base = 8;
8138 goto uns_integer;
8139
8140 case 'X':
46fc3d4c 8141 case 'x':
8142 base = 16;
46fc3d4c 8143
8144 uns_integer:
b22c7a20 8145 if (vectorize) {
ba210ebe 8146 STRLEN ulen;
b22c7a20 8147 vector:
211dfcf1
HS
8148 if (!veclen)
8149 continue;
2cf2cfc6
A
8150 if (vec_utf8)
8151 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8152 UTF8_ALLOW_ANYUV);
b22c7a20 8153 else {
a05b299f 8154 uv = *vecstr;
b22c7a20
GS
8155 ulen = 1;
8156 }
8157 vecstr += ulen;
8158 veclen -= ulen;
8159 }
8160 else if (args) {
46fc3d4c 8161 switch (intsize) {
8162 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
8163 default: uv = va_arg(*args, unsigned); break;
8164 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 8165 case 'V': uv = va_arg(*args, UV); break;
cf2093f6
JH
8166#ifdef HAS_QUAD
8167 case 'q': uv = va_arg(*args, Quad_t); break;
8168#endif
46fc3d4c 8169 }
8170 }
8171 else {
211dfcf1 8172 uv = SvUVx(argsv);
46fc3d4c 8173 switch (intsize) {
8174 case 'h': uv = (unsigned short)uv; break;
be28567c 8175 default: break;
46fc3d4c 8176 case 'l': uv = (unsigned long)uv; break;
fc36a67e 8177 case 'V': break;
cf2093f6
JH
8178#ifdef HAS_QUAD
8179 case 'q': uv = (Quad_t)uv; break;
8180#endif
46fc3d4c 8181 }
8182 }
8183
8184 integer:
46fc3d4c 8185 eptr = ebuf + sizeof ebuf;
fc36a67e 8186 switch (base) {
8187 unsigned dig;
8188 case 16:
c10ed8b9
HS
8189 if (!uv)
8190 alt = FALSE;
1d7c1841
GS
8191 p = (char*)((c == 'X')
8192 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 8193 do {
8194 dig = uv & 15;
8195 *--eptr = p[dig];
8196 } while (uv >>= 4);
8197 if (alt) {
46fc3d4c 8198 esignbuf[esignlen++] = '0';
fc36a67e 8199 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 8200 }
fc36a67e 8201 break;
8202 case 8:
8203 do {
8204 dig = uv & 7;
8205 *--eptr = '0' + dig;
8206 } while (uv >>= 3);
8207 if (alt && *eptr != '0')
8208 *--eptr = '0';
8209 break;
4f19785b
WSI
8210 case 2:
8211 do {
8212 dig = uv & 1;
8213 *--eptr = '0' + dig;
8214 } while (uv >>= 1);
eda88b6d
JH
8215 if (alt) {
8216 esignbuf[esignlen++] = '0';
7481bb52 8217 esignbuf[esignlen++] = 'b';
eda88b6d 8218 }
4f19785b 8219 break;
fc36a67e 8220 default: /* it had better be ten or less */
6bc102ca 8221#if defined(PERL_Y2KWARN)
e476b1b5 8222 if (ckWARN(WARN_Y2K)) {
6bc102ca
GS
8223 STRLEN n;
8224 char *s = SvPV(sv,n);
8225 if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
8226 && (n == 2 || !isDIGIT(s[n-3])))
8227 {
e476b1b5 8228 Perl_warner(aTHX_ WARN_Y2K,
6bc102ca
GS
8229 "Possible Y2K bug: %%%c %s",
8230 c, "format string following '19'");
8231 }
8232 }
8233#endif
fc36a67e 8234 do {
8235 dig = uv % base;
8236 *--eptr = '0' + dig;
8237 } while (uv /= base);
8238 break;
46fc3d4c 8239 }
8240 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
8241 if (has_precis) {
8242 if (precis > elen)
8243 zeros = precis - elen;
8244 else if (precis == 0 && elen == 1 && *eptr == '0')
8245 elen = 0;
8246 }
46fc3d4c 8247 break;
8248
8249 /* FLOATING POINT */
8250
fc36a67e 8251 case 'F':
8252 c = 'f'; /* maybe %F isn't supported here */
8253 /* FALL THROUGH */
46fc3d4c 8254 case 'e': case 'E':
fc36a67e 8255 case 'f':
46fc3d4c 8256 case 'g': case 'G':
8257
8258 /* This is evil, but floating point is even more evil */
8259
b22c7a20 8260 vectorize = FALSE;
211dfcf1 8261 nv = args ? va_arg(*args, NV) : SvNVx(argsv);
fc36a67e 8262
8263 need = 0;
8264 if (c != 'e' && c != 'E') {
8265 i = PERL_INT_MIN;
73b309ea 8266 (void)Perl_frexp(nv, &i);
fc36a67e 8267 if (i == PERL_INT_MIN)
cea2e8a9 8268 Perl_die(aTHX_ "panic: frexp");
c635e13b 8269 if (i > 0)
fc36a67e 8270 need = BIT_DIGITS(i);
8271 }
8272 need += has_precis ? precis : 6; /* known default */
8273 if (need < width)
8274 need = width;
8275
46fc3d4c 8276 need += 20; /* fudge factor */
80252599
GS
8277 if (PL_efloatsize < need) {
8278 Safefree(PL_efloatbuf);
8279 PL_efloatsize = need + 20; /* more fudge */
8280 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 8281 PL_efloatbuf[0] = '\0';
46fc3d4c 8282 }
8283
8284 eptr = ebuf + sizeof ebuf;
8285 *--eptr = '\0';
8286 *--eptr = c;
e5c81feb 8287#if defined(USE_LONG_DOUBLE) && defined(PERL_PRIfldbl)
cf2093f6 8288 {
e5c81feb
JH
8289 /* Copy the one or more characters in a long double
8290 * format before the 'base' ([efgEFG]) character to
8291 * the format string. */
8292 static char const prifldbl[] = PERL_PRIfldbl;
8293 char const *p = prifldbl + sizeof(prifldbl) - 3;
8294 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 8295 }
65202027 8296#endif
46fc3d4c 8297 if (has_precis) {
8298 base = precis;
8299 do { *--eptr = '0' + (base % 10); } while (base /= 10);
8300 *--eptr = '.';
8301 }
8302 if (width) {
8303 base = width;
8304 do { *--eptr = '0' + (base % 10); } while (base /= 10);
8305 }
8306 if (fill == '0')
8307 *--eptr = fill;
84902520
TB
8308 if (left)
8309 *--eptr = '-';
46fc3d4c 8310 if (plus)
8311 *--eptr = plus;
8312 if (alt)
8313 *--eptr = '#';
8314 *--eptr = '%';
8315
ff9121f8
JH
8316 /* No taint. Otherwise we are in the strange situation
8317 * where printf() taints but print($float) doesn't.
bda0f7a5 8318 * --jhi */
dd8482fc 8319 (void)sprintf(PL_efloatbuf, eptr, nv);
8af02333 8320
80252599
GS
8321 eptr = PL_efloatbuf;
8322 elen = strlen(PL_efloatbuf);
46fc3d4c 8323 break;
8324
fc36a67e 8325 /* SPECIAL */
8326
8327 case 'n':
b22c7a20 8328 vectorize = FALSE;
fc36a67e 8329 i = SvCUR(sv) - origlen;
8330 if (args) {
c635e13b 8331 switch (intsize) {
8332 case 'h': *(va_arg(*args, short*)) = i; break;
8333 default: *(va_arg(*args, int*)) = i; break;
8334 case 'l': *(va_arg(*args, long*)) = i; break;
8335 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
8336#ifdef HAS_QUAD
8337 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
8338#endif
c635e13b 8339 }
fc36a67e 8340 }
9dd79c3f 8341 else
211dfcf1 8342 sv_setuv_mg(argsv, (UV)i);
fc36a67e 8343 continue; /* not "break" */
8344
8345 /* UNKNOWN */
8346
46fc3d4c 8347 default:
fc36a67e 8348 unknown:
b22c7a20 8349 vectorize = FALSE;
599cee73 8350 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 8351 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 8352 SV *msg = sv_newmortal();
cea2e8a9 8353 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %s: ",
533c011a 8354 (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
0f4b6630 8355 if (c) {
0f4b6630 8356 if (isPRINT(c))
1c846c1f 8357 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
8358 "\"%%%c\"", c & 0xFF);
8359 else
8360 Perl_sv_catpvf(aTHX_ msg,
57def98f 8361 "\"%%\\%03"UVof"\"",
0f4b6630 8362 (UV)c & 0xFF);
0f4b6630 8363 } else
c635e13b 8364 sv_catpv(msg, "end of string");
894356b3 8365 Perl_warner(aTHX_ WARN_PRINTF, "%"SVf, msg); /* yes, this is reentrant */
c635e13b 8366 }
fb73857a 8367
8368 /* output mangled stuff ... */
8369 if (c == '\0')
8370 --q;
46fc3d4c 8371 eptr = p;
8372 elen = q - p;
fb73857a 8373
8374 /* ... right here, because formatting flags should not apply */
8375 SvGROW(sv, SvCUR(sv) + elen + 1);
8376 p = SvEND(sv);
4459522c 8377 Copy(eptr, p, elen, char);
fb73857a 8378 p += elen;
8379 *p = '\0';
8380 SvCUR(sv) = p - SvPVX(sv);
8381 continue; /* not "break" */
46fc3d4c 8382 }
8383
d2876be5
JH
8384 if (is_utf8 != has_utf8) {
8385 if (is_utf8) {
8386 if (SvCUR(sv))
8387 sv_utf8_upgrade(sv);
8388 }
8389 else {
8390 SV *nsv = sv_2mortal(newSVpvn(eptr, elen));
8391 sv_utf8_upgrade(nsv);
8392 eptr = SvPVX(nsv);
8393 elen = SvCUR(nsv);
8394 }
8395 SvGROW(sv, SvCUR(sv) + elen + 1);
8396 p = SvEND(sv);
8397 *p = '\0';
8398 }
8399
fc36a67e 8400 have = esignlen + zeros + elen;
46fc3d4c 8401 need = (have > width ? have : width);
8402 gap = need - have;
8403
b22c7a20 8404 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 8405 p = SvEND(sv);
8406 if (esignlen && fill == '0') {
8407 for (i = 0; i < esignlen; i++)
8408 *p++ = esignbuf[i];
8409 }
8410 if (gap && !left) {
8411 memset(p, fill, gap);
8412 p += gap;
8413 }
8414 if (esignlen && fill != '0') {
8415 for (i = 0; i < esignlen; i++)
8416 *p++ = esignbuf[i];
8417 }
fc36a67e 8418 if (zeros) {
8419 for (i = zeros; i; i--)
8420 *p++ = '0';
8421 }
46fc3d4c 8422 if (elen) {
4459522c 8423 Copy(eptr, p, elen, char);
46fc3d4c 8424 p += elen;
8425 }
8426 if (gap && left) {
8427 memset(p, ' ', gap);
8428 p += gap;
8429 }
b22c7a20
GS
8430 if (vectorize) {
8431 if (veclen) {
4459522c 8432 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
8433 p += dotstrlen;
8434 }
8435 else
8436 vectorize = FALSE; /* done iterating over vecstr */
8437 }
2cf2cfc6
A
8438 if (is_utf8)
8439 has_utf8 = TRUE;
8440 if (has_utf8)
7e2040f0 8441 SvUTF8_on(sv);
46fc3d4c 8442 *p = '\0';
8443 SvCUR(sv) = p - SvPVX(sv);
b22c7a20
GS
8444 if (vectorize) {
8445 esignlen = 0;
8446 goto vector;
8447 }
46fc3d4c 8448 }
8449}
51371543 8450
645c22ef
DM
8451/* =========================================================================
8452
8453=head1 Cloning an interpreter
8454
8455All the macros and functions in this section are for the private use of
8456the main function, perl_clone().
8457
8458The foo_dup() functions make an exact copy of an existing foo thinngy.
8459During the course of a cloning, a hash table is used to map old addresses
8460to new addresses. The table is created and manipulated with the
8461ptr_table_* functions.
8462
8463=cut
8464
8465============================================================================*/
8466
8467
1d7c1841
GS
8468#if defined(USE_ITHREADS)
8469
4d1ff10f
AB
8470#if defined(USE_5005THREADS)
8471# include "error: USE_5005THREADS and USE_ITHREADS are incompatible"
1d7c1841
GS
8472#endif
8473
1d7c1841
GS
8474#ifndef GpREFCNT_inc
8475# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
8476#endif
8477
8478
d2d73c3e
AB
8479#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
8480#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
8481#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8482#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
8483#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8484#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
8485#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8486#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
8487#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
8488#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
8489#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
8490#define SAVEPV(p) (p ? savepv(p) : Nullch)
8491#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 8492
d2d73c3e 8493
d2f185dc
AMS
8494/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
8495 regcomp.c. AMS 20010712 */
645c22ef 8496
1d7c1841 8497REGEXP *
a8fc9800 8498Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
1d7c1841 8499{
d2f185dc
AMS
8500 REGEXP *ret;
8501 int i, len, npar;
8502 struct reg_substr_datum *s;
8503
8504 if (!r)
8505 return (REGEXP *)NULL;
8506
8507 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
8508 return ret;
8509
8510 len = r->offsets[0];
8511 npar = r->nparens+1;
8512
8513 Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
8514 Copy(r->program, ret->program, len+1, regnode);
8515
8516 New(0, ret->startp, npar, I32);
8517 Copy(r->startp, ret->startp, npar, I32);
8518 New(0, ret->endp, npar, I32);
8519 Copy(r->startp, ret->startp, npar, I32);
8520
d2f185dc
AMS
8521 New(0, ret->substrs, 1, struct reg_substr_data);
8522 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
8523 s->min_offset = r->substrs->data[i].min_offset;
8524 s->max_offset = r->substrs->data[i].max_offset;
8525 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
8526 }
8527
70612e96 8528 ret->regstclass = NULL;
d2f185dc
AMS
8529 if (r->data) {
8530 struct reg_data *d;
8531 int count = r->data->count;
8532
8533 Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
8534 char, struct reg_data);
8535 New(0, d->what, count, U8);
8536
8537 d->count = count;
8538 for (i = 0; i < count; i++) {
8539 d->what[i] = r->data->what[i];
8540 switch (d->what[i]) {
8541 case 's':
8542 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
8543 break;
8544 case 'p':
8545 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
8546 break;
8547 case 'f':
8548 /* This is cheating. */
8549 New(0, d->data[i], 1, struct regnode_charclass_class);
8550 StructCopy(r->data->data[i], d->data[i],
8551 struct regnode_charclass_class);
70612e96 8552 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
8553 break;
8554 case 'o':
33773810
AMS
8555 /* Compiled op trees are readonly, and can thus be
8556 shared without duplication. */
9b978d73
DM
8557 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
8558 break;
d2f185dc
AMS
8559 case 'n':
8560 d->data[i] = r->data->data[i];
8561 break;
8562 }
8563 }
8564
8565 ret->data = d;
8566 }
8567 else
8568 ret->data = NULL;
8569
8570 New(0, ret->offsets, 2*len+1, U32);
8571 Copy(r->offsets, ret->offsets, 2*len+1, U32);
8572
8573 ret->precomp = SAVEPV(r->precomp);
d2f185dc
AMS
8574 ret->refcnt = r->refcnt;
8575 ret->minlen = r->minlen;
8576 ret->prelen = r->prelen;
8577 ret->nparens = r->nparens;
8578 ret->lastparen = r->lastparen;
8579 ret->lastcloseparen = r->lastcloseparen;
8580 ret->reganch = r->reganch;
8581
70612e96
RG
8582 ret->sublen = r->sublen;
8583
8584 if (RX_MATCH_COPIED(ret))
8585 ret->subbeg = SAVEPV(r->subbeg);
8586 else
8587 ret->subbeg = Nullch;
8588
d2f185dc
AMS
8589 ptr_table_store(PL_ptr_table, r, ret);
8590 return ret;
1d7c1841
GS
8591}
8592
d2d73c3e 8593/* duplicate a file handle */
645c22ef 8594
1d7c1841 8595PerlIO *
a8fc9800 8596Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
8597{
8598 PerlIO *ret;
8599 if (!fp)
8600 return (PerlIO*)NULL;
8601
8602 /* look for it in the table first */
8603 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
8604 if (ret)
8605 return ret;
8606
8607 /* create anew and remember what it is */
ecdeb87c 8608 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
8609 ptr_table_store(PL_ptr_table, fp, ret);
8610 return ret;
8611}
8612
645c22ef
DM
8613/* duplicate a directory handle */
8614
1d7c1841
GS
8615DIR *
8616Perl_dirp_dup(pTHX_ DIR *dp)
8617{
8618 if (!dp)
8619 return (DIR*)NULL;
8620 /* XXX TODO */
8621 return dp;
8622}
8623
ff276b08 8624/* duplicate a typeglob */
645c22ef 8625
1d7c1841 8626GP *
a8fc9800 8627Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
8628{
8629 GP *ret;
8630 if (!gp)
8631 return (GP*)NULL;
8632 /* look for it in the table first */
8633 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
8634 if (ret)
8635 return ret;
8636
8637 /* create anew and remember what it is */
8638 Newz(0, ret, 1, GP);
8639 ptr_table_store(PL_ptr_table, gp, ret);
8640
8641 /* clone */
8642 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
8643 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
8644 ret->gp_io = io_dup_inc(gp->gp_io, param);
8645 ret->gp_form = cv_dup_inc(gp->gp_form, param);
8646 ret->gp_av = av_dup_inc(gp->gp_av, param);
8647 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
8648 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
8649 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
8650 ret->gp_cvgen = gp->gp_cvgen;
8651 ret->gp_flags = gp->gp_flags;
8652 ret->gp_line = gp->gp_line;
8653 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
8654 return ret;
8655}
8656
645c22ef
DM
8657/* duplicate a chain of magic */
8658
1d7c1841 8659MAGIC *
a8fc9800 8660Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 8661{
cb359b41
JH
8662 MAGIC *mgprev = (MAGIC*)NULL;
8663 MAGIC *mgret;
1d7c1841
GS
8664 if (!mg)
8665 return (MAGIC*)NULL;
8666 /* look for it in the table first */
8667 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
8668 if (mgret)
8669 return mgret;
8670
8671 for (; mg; mg = mg->mg_moremagic) {
8672 MAGIC *nmg;
8673 Newz(0, nmg, 1, MAGIC);
cb359b41 8674 if (mgprev)
1d7c1841 8675 mgprev->mg_moremagic = nmg;
cb359b41
JH
8676 else
8677 mgret = nmg;
1d7c1841
GS
8678 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
8679 nmg->mg_private = mg->mg_private;
8680 nmg->mg_type = mg->mg_type;
8681 nmg->mg_flags = mg->mg_flags;
14befaf4 8682 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 8683 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 8684 }
05bd4103
JH
8685 else if(mg->mg_type == PERL_MAGIC_backref) {
8686 AV *av = (AV*) mg->mg_obj;
8687 SV **svp;
8688 I32 i;
8689 nmg->mg_obj = (SV*)newAV();
8690 svp = AvARRAY(av);
8691 i = AvFILLp(av);
8692 while (i >= 0) {
8693 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
8694 i--;
8695 }
8696 }
1d7c1841
GS
8697 else {
8698 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
8699 ? sv_dup_inc(mg->mg_obj, param)
8700 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
8701 }
8702 nmg->mg_len = mg->mg_len;
8703 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 8704 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
1d7c1841
GS
8705 if (mg->mg_len >= 0) {
8706 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
8707 if (mg->mg_type == PERL_MAGIC_overload_table &&
8708 AMT_AMAGIC((AMT*)mg->mg_ptr))
8709 {
1d7c1841
GS
8710 AMT *amtp = (AMT*)mg->mg_ptr;
8711 AMT *namtp = (AMT*)nmg->mg_ptr;
8712 I32 i;
8713 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 8714 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
8715 }
8716 }
8717 }
8718 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 8719 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841
GS
8720 }
8721 mgprev = nmg;
8722 }
8723 return mgret;
8724}
8725
645c22ef
DM
8726/* create a new pointer-mapping table */
8727
1d7c1841
GS
8728PTR_TBL_t *
8729Perl_ptr_table_new(pTHX)
8730{
8731 PTR_TBL_t *tbl;
8732 Newz(0, tbl, 1, PTR_TBL_t);
8733 tbl->tbl_max = 511;
8734 tbl->tbl_items = 0;
8735 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
8736 return tbl;
8737}
8738
645c22ef
DM
8739/* map an existing pointer using a table */
8740
1d7c1841
GS
8741void *
8742Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
8743{
8744 PTR_TBL_ENT_t *tblent;
d2a79402 8745 UV hash = PTR2UV(sv);
1d7c1841
GS
8746 assert(tbl);
8747 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
8748 for (; tblent; tblent = tblent->next) {
8749 if (tblent->oldval == sv)
8750 return tblent->newval;
8751 }
8752 return (void*)NULL;
8753}
8754
645c22ef
DM
8755/* add a new entry to a pointer-mapping table */
8756
1d7c1841
GS
8757void
8758Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
8759{
8760 PTR_TBL_ENT_t *tblent, **otblent;
8761 /* XXX this may be pessimal on platforms where pointers aren't good
8762 * hash values e.g. if they grow faster in the most significant
8763 * bits */
d2a79402 8764 UV hash = PTR2UV(oldv);
1d7c1841
GS
8765 bool i = 1;
8766
8767 assert(tbl);
8768 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
8769 for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
8770 if (tblent->oldval == oldv) {
8771 tblent->newval = newv;
8772 tbl->tbl_items++;
8773 return;
8774 }
8775 }
8776 Newz(0, tblent, 1, PTR_TBL_ENT_t);
8777 tblent->oldval = oldv;
8778 tblent->newval = newv;
8779 tblent->next = *otblent;
8780 *otblent = tblent;
8781 tbl->tbl_items++;
8782 if (i && tbl->tbl_items > tbl->tbl_max)
8783 ptr_table_split(tbl);
8784}
8785
645c22ef
DM
8786/* double the hash bucket size of an existing ptr table */
8787
1d7c1841
GS
8788void
8789Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
8790{
8791 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
8792 UV oldsize = tbl->tbl_max + 1;
8793 UV newsize = oldsize * 2;
8794 UV i;
8795
8796 Renew(ary, newsize, PTR_TBL_ENT_t*);
8797 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
8798 tbl->tbl_max = --newsize;
8799 tbl->tbl_ary = ary;
8800 for (i=0; i < oldsize; i++, ary++) {
8801 PTR_TBL_ENT_t **curentp, **entp, *ent;
8802 if (!*ary)
8803 continue;
8804 curentp = ary + oldsize;
8805 for (entp = ary, ent = *ary; ent; ent = *entp) {
d2a79402 8806 if ((newsize & PTR2UV(ent->oldval)) != i) {
1d7c1841
GS
8807 *entp = ent->next;
8808 ent->next = *curentp;
8809 *curentp = ent;
8810 continue;
8811 }
8812 else
8813 entp = &ent->next;
8814 }
8815 }
8816}
8817
645c22ef
DM
8818/* remove all the entries from a ptr table */
8819
a0739874
DM
8820void
8821Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
8822{
8823 register PTR_TBL_ENT_t **array;
8824 register PTR_TBL_ENT_t *entry;
8825 register PTR_TBL_ENT_t *oentry = Null(PTR_TBL_ENT_t*);
8826 UV riter = 0;
8827 UV max;
8828
8829 if (!tbl || !tbl->tbl_items) {
8830 return;
8831 }
8832
8833 array = tbl->tbl_ary;
8834 entry = array[0];
8835 max = tbl->tbl_max;
8836
8837 for (;;) {
8838 if (entry) {
8839 oentry = entry;
8840 entry = entry->next;
8841 Safefree(oentry);
8842 }
8843 if (!entry) {
8844 if (++riter > max) {
8845 break;
8846 }
8847 entry = array[riter];
8848 }
8849 }
8850
8851 tbl->tbl_items = 0;
8852}
8853
645c22ef
DM
8854/* clear and free a ptr table */
8855
a0739874
DM
8856void
8857Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
8858{
8859 if (!tbl) {
8860 return;
8861 }
8862 ptr_table_clear(tbl);
8863 Safefree(tbl->tbl_ary);
8864 Safefree(tbl);
8865}
8866
1d7c1841
GS
8867#ifdef DEBUGGING
8868char *PL_watch_pvx;
8869#endif
8870
645c22ef
DM
8871/* attempt to make everything in the typeglob readonly */
8872
5bd07a3d
DM
8873STATIC SV *
8874S_gv_share(pTHX_ SV *sstr)
8875{
8876 GV *gv = (GV*)sstr;
8877 SV *sv = &PL_sv_no; /* just need SvREADONLY-ness */
8878
8879 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 8880 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
8881 }
8882 else if (!GvCV(gv)) {
8883 GvCV(gv) = (CV*)sv;
8884 }
8885 else {
8886 /* CvPADLISTs cannot be shared */
8887 if (!CvXSUB(GvCV(gv))) {
7fb37951 8888 GvUNIQUE_off(gv);
5bd07a3d
DM
8889 }
8890 }
8891
7fb37951 8892 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
8893#if 0
8894 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
8895 HvNAME(GvSTASH(gv)), GvNAME(gv));
8896#endif
8897 return Nullsv;
8898 }
8899
4411f3b6 8900 /*
5bd07a3d
DM
8901 * write attempts will die with
8902 * "Modification of a read-only value attempted"
8903 */
8904 if (!GvSV(gv)) {
8905 GvSV(gv) = sv;
8906 }
8907 else {
8908 SvREADONLY_on(GvSV(gv));
8909 }
8910
8911 if (!GvAV(gv)) {
8912 GvAV(gv) = (AV*)sv;
8913 }
8914 else {
8915 SvREADONLY_on(GvAV(gv));
8916 }
8917
8918 if (!GvHV(gv)) {
8919 GvHV(gv) = (HV*)sv;
8920 }
8921 else {
8922 SvREADONLY_on(GvAV(gv));
8923 }
8924
8925 return sstr; /* he_dup() will SvREFCNT_inc() */
8926}
8927
645c22ef
DM
8928/* duplicate an SV of any type (including AV, HV etc) */
8929
83841fad
NIS
8930void
8931Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
8932{
8933 if (SvROK(sstr)) {
8934 SvRV(dstr) = SvWEAKREF(sstr)
8935 ? sv_dup(SvRV(sstr), param)
8936 : sv_dup_inc(SvRV(sstr), param);
8937 }
8938 else if (SvPVX(sstr)) {
8939 /* Has something there */
8940 if (SvLEN(sstr)) {
8941 /* Normal PV - clone whole allocated space */
8942 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8943 }
8944 else {
8945 /* Special case - not normally malloced for some reason */
8946 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
8947 /* A "shared" PV - clone it as unshared string */
8948 SvFAKE_off(dstr);
8949 SvREADONLY_off(dstr);
8950 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvCUR(sstr));
8951 }
8952 else {
8953 /* Some other special case - random pointer */
8954 SvPVX(dstr) = SvPVX(sstr);
8955 }
8956 }
8957 }
8958 else {
8959 /* Copy the Null */
8960 SvPVX(dstr) = SvPVX(sstr);
8961 }
8962}
8963
1d7c1841 8964SV *
a8fc9800 8965Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
1d7c1841 8966{
1d7c1841
GS
8967 SV *dstr;
8968
8969 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
8970 return Nullsv;
8971 /* look for it in the table first */
8972 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
8973 if (dstr)
8974 return dstr;
8975
8976 /* create anew and remember what it is */
8977 new_SV(dstr);
8978 ptr_table_store(PL_ptr_table, sstr, dstr);
8979
8980 /* clone */
8981 SvFLAGS(dstr) = SvFLAGS(sstr);
8982 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
8983 SvREFCNT(dstr) = 0; /* must be before any other dups! */
8984
8985#ifdef DEBUGGING
8986 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
8987 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
8988 PL_watch_pvx, SvPVX(sstr));
8989#endif
8990
8991 switch (SvTYPE(sstr)) {
8992 case SVt_NULL:
8993 SvANY(dstr) = NULL;
8994 break;
8995 case SVt_IV:
8996 SvANY(dstr) = new_XIV();
8997 SvIVX(dstr) = SvIVX(sstr);
8998 break;
8999 case SVt_NV:
9000 SvANY(dstr) = new_XNV();
9001 SvNVX(dstr) = SvNVX(sstr);
9002 break;
9003 case SVt_RV:
9004 SvANY(dstr) = new_XRV();
83841fad 9005 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9006 break;
9007 case SVt_PV:
9008 SvANY(dstr) = new_XPV();
9009 SvCUR(dstr) = SvCUR(sstr);
9010 SvLEN(dstr) = SvLEN(sstr);
83841fad 9011 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9012 break;
9013 case SVt_PVIV:
9014 SvANY(dstr) = new_XPVIV();
9015 SvCUR(dstr) = SvCUR(sstr);
9016 SvLEN(dstr) = SvLEN(sstr);
9017 SvIVX(dstr) = SvIVX(sstr);
83841fad 9018 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9019 break;
9020 case SVt_PVNV:
9021 SvANY(dstr) = new_XPVNV();
9022 SvCUR(dstr) = SvCUR(sstr);
9023 SvLEN(dstr) = SvLEN(sstr);
9024 SvIVX(dstr) = SvIVX(sstr);
9025 SvNVX(dstr) = SvNVX(sstr);
83841fad 9026 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9027 break;
9028 case SVt_PVMG:
9029 SvANY(dstr) = new_XPVMG();
9030 SvCUR(dstr) = SvCUR(sstr);
9031 SvLEN(dstr) = SvLEN(sstr);
9032 SvIVX(dstr) = SvIVX(sstr);
9033 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9034 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9035 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9036 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9037 break;
9038 case SVt_PVBM:
9039 SvANY(dstr) = new_XPVBM();
9040 SvCUR(dstr) = SvCUR(sstr);
9041 SvLEN(dstr) = SvLEN(sstr);
9042 SvIVX(dstr) = SvIVX(sstr);
9043 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9044 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9045 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9046 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9047 BmRARE(dstr) = BmRARE(sstr);
9048 BmUSEFUL(dstr) = BmUSEFUL(sstr);
9049 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
9050 break;
9051 case SVt_PVLV:
9052 SvANY(dstr) = new_XPVLV();
9053 SvCUR(dstr) = SvCUR(sstr);
9054 SvLEN(dstr) = SvLEN(sstr);
9055 SvIVX(dstr) = SvIVX(sstr);
9056 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9057 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9058 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9059 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9060 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
9061 LvTARGLEN(dstr) = LvTARGLEN(sstr);
d2d73c3e 9062 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr), param);
1d7c1841
GS
9063 LvTYPE(dstr) = LvTYPE(sstr);
9064 break;
9065 case SVt_PVGV:
7fb37951 9066 if (GvUNIQUE((GV*)sstr)) {
5bd07a3d
DM
9067 SV *share;
9068 if ((share = gv_share(sstr))) {
9069 del_SV(dstr);
9070 dstr = share;
9071#if 0
9072 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
9073 HvNAME(GvSTASH(share)), GvNAME(share));
9074#endif
9075 break;
9076 }
9077 }
1d7c1841
GS
9078 SvANY(dstr) = new_XPVGV();
9079 SvCUR(dstr) = SvCUR(sstr);
9080 SvLEN(dstr) = SvLEN(sstr);
9081 SvIVX(dstr) = SvIVX(sstr);
9082 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9083 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9084 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9085 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841
GS
9086 GvNAMELEN(dstr) = GvNAMELEN(sstr);
9087 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
d2d73c3e 9088 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr), param);
1d7c1841 9089 GvFLAGS(dstr) = GvFLAGS(sstr);
d2d73c3e 9090 GvGP(dstr) = gp_dup(GvGP(sstr), param);
1d7c1841
GS
9091 (void)GpREFCNT_inc(GvGP(dstr));
9092 break;
9093 case SVt_PVIO:
9094 SvANY(dstr) = new_XPVIO();
9095 SvCUR(dstr) = SvCUR(sstr);
9096 SvLEN(dstr) = SvLEN(sstr);
9097 SvIVX(dstr) = SvIVX(sstr);
9098 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9099 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9100 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9101 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
a8fc9800 9102 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
9103 if (IoOFP(sstr) == IoIFP(sstr))
9104 IoOFP(dstr) = IoIFP(dstr);
9105 else
a8fc9800 9106 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
9107 /* PL_rsfp_filters entries have fake IoDIRP() */
9108 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
9109 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
9110 else
9111 IoDIRP(dstr) = IoDIRP(sstr);
9112 IoLINES(dstr) = IoLINES(sstr);
9113 IoPAGE(dstr) = IoPAGE(sstr);
9114 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
9115 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
9116 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
d2d73c3e 9117 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr), param);
1d7c1841 9118 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
d2d73c3e 9119 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr), param);
1d7c1841 9120 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
d2d73c3e 9121 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr), param);
1d7c1841
GS
9122 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
9123 IoTYPE(dstr) = IoTYPE(sstr);
9124 IoFLAGS(dstr) = IoFLAGS(sstr);
9125 break;
9126 case SVt_PVAV:
9127 SvANY(dstr) = new_XPVAV();
9128 SvCUR(dstr) = SvCUR(sstr);
9129 SvLEN(dstr) = SvLEN(sstr);
9130 SvIVX(dstr) = SvIVX(sstr);
9131 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9132 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9133 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
9134 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
1d7c1841
GS
9135 AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
9136 if (AvARRAY((AV*)sstr)) {
9137 SV **dst_ary, **src_ary;
9138 SSize_t items = AvFILLp((AV*)sstr) + 1;
9139
9140 src_ary = AvARRAY((AV*)sstr);
9141 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
9142 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
9143 SvPVX(dstr) = (char*)dst_ary;
9144 AvALLOC((AV*)dstr) = dst_ary;
9145 if (AvREAL((AV*)sstr)) {
9146 while (items-- > 0)
d2d73c3e 9147 *dst_ary++ = sv_dup_inc(*src_ary++, param);
1d7c1841
GS
9148 }
9149 else {
9150 while (items-- > 0)
d2d73c3e 9151 *dst_ary++ = sv_dup(*src_ary++, param);
1d7c1841
GS
9152 }
9153 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
9154 while (items-- > 0) {
9155 *dst_ary++ = &PL_sv_undef;
9156 }
9157 }
9158 else {
9159 SvPVX(dstr) = Nullch;
9160 AvALLOC((AV*)dstr) = (SV**)NULL;
9161 }
9162 break;
9163 case SVt_PVHV:
9164 SvANY(dstr) = new_XPVHV();
9165 SvCUR(dstr) = SvCUR(sstr);
9166 SvLEN(dstr) = SvLEN(sstr);
9167 SvIVX(dstr) = SvIVX(sstr);
9168 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9169 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9170 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841
GS
9171 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
9172 if (HvARRAY((HV*)sstr)) {
1d7c1841
GS
9173 STRLEN i = 0;
9174 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
9175 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
9176 Newz(0, dxhv->xhv_array,
9177 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
9178 while (i <= sxhv->xhv_max) {
9179 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
d2d73c3e 9180 !!HvSHAREKEYS(sstr), param);
1d7c1841
GS
9181 ++i;
9182 }
d2d73c3e 9183 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter, !!HvSHAREKEYS(sstr), param);
1d7c1841
GS
9184 }
9185 else {
9186 SvPVX(dstr) = Nullch;
9187 HvEITER((HV*)dstr) = (HE*)NULL;
9188 }
9189 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
9190 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
c43294b8 9191 /* Record stashes for possible cloning in Perl_clone(). */
6676db26 9192 if(HvNAME((HV*)dstr))
d2d73c3e 9193 av_push(param->stashes, dstr);
1d7c1841
GS
9194 break;
9195 case SVt_PVFM:
9196 SvANY(dstr) = new_XPVFM();
9197 FmLINES(dstr) = FmLINES(sstr);
9198 goto dup_pvcv;
9199 /* NOTREACHED */
9200 case SVt_PVCV:
9201 SvANY(dstr) = new_XPVCV();
d2d73c3e 9202 dup_pvcv:
1d7c1841
GS
9203 SvCUR(dstr) = SvCUR(sstr);
9204 SvLEN(dstr) = SvLEN(sstr);
9205 SvIVX(dstr) = SvIVX(sstr);
9206 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9207 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9208 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
83841fad 9209 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
d2d73c3e 9210 CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
1d7c1841
GS
9211 CvSTART(dstr) = CvSTART(sstr);
9212 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
9213 CvXSUB(dstr) = CvXSUB(sstr);
9214 CvXSUBANY(dstr) = CvXSUBANY(sstr);
01485f8b
DM
9215 if (CvCONST(sstr)) {
9216 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
9217 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
9218 sv_dup_inc(CvXSUBANY(sstr).any_ptr, param);
9219 }
d2d73c3e
AB
9220 CvGV(dstr) = gv_dup(CvGV(sstr), param);
9221 if (param->flags & CLONEf_COPY_STACKS) {
9222 CvDEPTH(dstr) = CvDEPTH(sstr);
9223 } else {
9224 CvDEPTH(dstr) = 0;
9225 }
1d7c1841
GS
9226 if (CvPADLIST(sstr) && !AvREAL(CvPADLIST(sstr))) {
9227 /* XXX padlists are real, but pretend to be not */
9228 AvREAL_on(CvPADLIST(sstr));
d2d73c3e 9229 CvPADLIST(dstr) = av_dup_inc(CvPADLIST(sstr), param);
1d7c1841
GS
9230 AvREAL_off(CvPADLIST(sstr));
9231 AvREAL_off(CvPADLIST(dstr));
9232 }
9233 else
d2d73c3e 9234 CvPADLIST(dstr) = av_dup_inc(CvPADLIST(sstr), param);
282f25c9 9235 if (!CvANON(sstr) || CvCLONED(sstr))
d2d73c3e 9236 CvOUTSIDE(dstr) = cv_dup_inc(CvOUTSIDE(sstr), param);
282f25c9 9237 else
d2d73c3e 9238 CvOUTSIDE(dstr) = cv_dup(CvOUTSIDE(sstr), param);
1d7c1841 9239 CvFLAGS(dstr) = CvFLAGS(sstr);
54356c7d 9240 CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
1d7c1841
GS
9241 break;
9242 default:
9243 Perl_croak(aTHX_ "Bizarre SvTYPE [%d]", SvTYPE(sstr));
9244 break;
9245 }
9246
9247 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
9248 ++PL_sv_objcount;
9249
9250 return dstr;
d2d73c3e 9251 }
1d7c1841 9252
645c22ef
DM
9253/* duplicate a context */
9254
1d7c1841 9255PERL_CONTEXT *
a8fc9800 9256Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
9257{
9258 PERL_CONTEXT *ncxs;
9259
9260 if (!cxs)
9261 return (PERL_CONTEXT*)NULL;
9262
9263 /* look for it in the table first */
9264 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
9265 if (ncxs)
9266 return ncxs;
9267
9268 /* create anew and remember what it is */
9269 Newz(56, ncxs, max + 1, PERL_CONTEXT);
9270 ptr_table_store(PL_ptr_table, cxs, ncxs);
9271
9272 while (ix >= 0) {
9273 PERL_CONTEXT *cx = &cxs[ix];
9274 PERL_CONTEXT *ncx = &ncxs[ix];
9275 ncx->cx_type = cx->cx_type;
9276 if (CxTYPE(cx) == CXt_SUBST) {
9277 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
9278 }
9279 else {
9280 ncx->blk_oldsp = cx->blk_oldsp;
9281 ncx->blk_oldcop = cx->blk_oldcop;
9282 ncx->blk_oldretsp = cx->blk_oldretsp;
9283 ncx->blk_oldmarksp = cx->blk_oldmarksp;
9284 ncx->blk_oldscopesp = cx->blk_oldscopesp;
9285 ncx->blk_oldpm = cx->blk_oldpm;
9286 ncx->blk_gimme = cx->blk_gimme;
9287 switch (CxTYPE(cx)) {
9288 case CXt_SUB:
9289 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
9290 ? cv_dup_inc(cx->blk_sub.cv, param)
9291 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 9292 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 9293 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 9294 : Nullav);
d2d73c3e 9295 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
9296 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
9297 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
9298 ncx->blk_sub.lval = cx->blk_sub.lval;
9299 break;
9300 case CXt_EVAL:
9301 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
9302 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
d2d73c3e 9303 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);;
1d7c1841 9304 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 9305 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
1d7c1841
GS
9306 break;
9307 case CXt_LOOP:
9308 ncx->blk_loop.label = cx->blk_loop.label;
9309 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
9310 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
9311 ncx->blk_loop.next_op = cx->blk_loop.next_op;
9312 ncx->blk_loop.last_op = cx->blk_loop.last_op;
9313 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
9314 ? cx->blk_loop.iterdata
d2d73c3e 9315 : gv_dup((GV*)cx->blk_loop.iterdata, param));
a4b82a6f
GS
9316 ncx->blk_loop.oldcurpad
9317 = (SV**)ptr_table_fetch(PL_ptr_table,
9318 cx->blk_loop.oldcurpad);
d2d73c3e
AB
9319 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
9320 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
9321 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
9322 ncx->blk_loop.iterix = cx->blk_loop.iterix;
9323 ncx->blk_loop.itermax = cx->blk_loop.itermax;
9324 break;
9325 case CXt_FORMAT:
d2d73c3e
AB
9326 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
9327 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
9328 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841
GS
9329 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
9330 break;
9331 case CXt_BLOCK:
9332 case CXt_NULL:
9333 break;
9334 }
9335 }
9336 --ix;
9337 }
9338 return ncxs;
9339}
9340
645c22ef
DM
9341/* duplicate a stack info structure */
9342
1d7c1841 9343PERL_SI *
a8fc9800 9344Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
9345{
9346 PERL_SI *nsi;
9347
9348 if (!si)
9349 return (PERL_SI*)NULL;
9350
9351 /* look for it in the table first */
9352 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
9353 if (nsi)
9354 return nsi;
9355
9356 /* create anew and remember what it is */
9357 Newz(56, nsi, 1, PERL_SI);
9358 ptr_table_store(PL_ptr_table, si, nsi);
9359
d2d73c3e 9360 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
9361 nsi->si_cxix = si->si_cxix;
9362 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 9363 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 9364 nsi->si_type = si->si_type;
d2d73c3e
AB
9365 nsi->si_prev = si_dup(si->si_prev, param);
9366 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
9367 nsi->si_markoff = si->si_markoff;
9368
9369 return nsi;
9370}
9371
9372#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
9373#define TOPINT(ss,ix) ((ss)[ix].any_i32)
9374#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
9375#define TOPLONG(ss,ix) ((ss)[ix].any_long)
9376#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
9377#define TOPIV(ss,ix) ((ss)[ix].any_iv)
9378#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
9379#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
9380#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
9381#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
9382#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
9383#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
9384
9385/* XXXXX todo */
9386#define pv_dup_inc(p) SAVEPV(p)
9387#define pv_dup(p) SAVEPV(p)
9388#define svp_dup_inc(p,pp) any_dup(p,pp)
9389
645c22ef
DM
9390/* map any object to the new equivent - either something in the
9391 * ptr table, or something in the interpreter structure
9392 */
9393
1d7c1841
GS
9394void *
9395Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
9396{
9397 void *ret;
9398
9399 if (!v)
9400 return (void*)NULL;
9401
9402 /* look for it in the table first */
9403 ret = ptr_table_fetch(PL_ptr_table, v);
9404 if (ret)
9405 return ret;
9406
9407 /* see if it is part of the interpreter structure */
9408 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 9409 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 9410 else {
1d7c1841 9411 ret = v;
05ec9bb3 9412 }
1d7c1841
GS
9413
9414 return ret;
9415}
9416
645c22ef
DM
9417/* duplicate the save stack */
9418
1d7c1841 9419ANY *
a8fc9800 9420Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841
GS
9421{
9422 ANY *ss = proto_perl->Tsavestack;
9423 I32 ix = proto_perl->Tsavestack_ix;
9424 I32 max = proto_perl->Tsavestack_max;
9425 ANY *nss;
9426 SV *sv;
9427 GV *gv;
9428 AV *av;
9429 HV *hv;
9430 void* ptr;
9431 int intval;
9432 long longval;
9433 GP *gp;
9434 IV iv;
9435 I32 i;
c4e33207 9436 char *c = NULL;
1d7c1841 9437 void (*dptr) (void*);
acfe0abc 9438 void (*dxptr) (pTHX_ void*);
e977893f 9439 OP *o;
1d7c1841
GS
9440
9441 Newz(54, nss, max, ANY);
9442
9443 while (ix > 0) {
9444 i = POPINT(ss,ix);
9445 TOPINT(nss,ix) = i;
9446 switch (i) {
9447 case SAVEt_ITEM: /* normal string */
9448 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9449 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9450 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9451 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9452 break;
9453 case SAVEt_SV: /* scalar reference */
9454 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9455 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9456 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9457 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 9458 break;
f4dd75d9
GS
9459 case SAVEt_GENERIC_PVREF: /* generic char* */
9460 c = (char*)POPPTR(ss,ix);
9461 TOPPTR(nss,ix) = pv_dup(c);
9462 ptr = POPPTR(ss,ix);
9463 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9464 break;
05ec9bb3
NIS
9465 case SAVEt_SHARED_PVREF: /* char* in shared space */
9466 c = (char*)POPPTR(ss,ix);
9467 TOPPTR(nss,ix) = savesharedpv(c);
9468 ptr = POPPTR(ss,ix);
9469 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9470 break;
1d7c1841
GS
9471 case SAVEt_GENERIC_SVREF: /* generic sv */
9472 case SAVEt_SVREF: /* scalar reference */
9473 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9474 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9475 ptr = POPPTR(ss,ix);
9476 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
9477 break;
9478 case SAVEt_AV: /* array reference */
9479 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9480 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 9481 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9482 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9483 break;
9484 case SAVEt_HV: /* hash reference */
9485 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9486 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 9487 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9488 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9489 break;
9490 case SAVEt_INT: /* int reference */
9491 ptr = POPPTR(ss,ix);
9492 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9493 intval = (int)POPINT(ss,ix);
9494 TOPINT(nss,ix) = intval;
9495 break;
9496 case SAVEt_LONG: /* long reference */
9497 ptr = POPPTR(ss,ix);
9498 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9499 longval = (long)POPLONG(ss,ix);
9500 TOPLONG(nss,ix) = longval;
9501 break;
9502 case SAVEt_I32: /* I32 reference */
9503 case SAVEt_I16: /* I16 reference */
9504 case SAVEt_I8: /* I8 reference */
9505 ptr = POPPTR(ss,ix);
9506 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9507 i = POPINT(ss,ix);
9508 TOPINT(nss,ix) = i;
9509 break;
9510 case SAVEt_IV: /* IV reference */
9511 ptr = POPPTR(ss,ix);
9512 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9513 iv = POPIV(ss,ix);
9514 TOPIV(nss,ix) = iv;
9515 break;
9516 case SAVEt_SPTR: /* SV* reference */
9517 ptr = POPPTR(ss,ix);
9518 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9519 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9520 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
9521 break;
9522 case SAVEt_VPTR: /* random* reference */
9523 ptr = POPPTR(ss,ix);
9524 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9525 ptr = POPPTR(ss,ix);
9526 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9527 break;
9528 case SAVEt_PPTR: /* char* reference */
9529 ptr = POPPTR(ss,ix);
9530 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9531 c = (char*)POPPTR(ss,ix);
9532 TOPPTR(nss,ix) = pv_dup(c);
9533 break;
9534 case SAVEt_HPTR: /* HV* reference */
9535 ptr = POPPTR(ss,ix);
9536 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9537 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9538 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
9539 break;
9540 case SAVEt_APTR: /* AV* reference */
9541 ptr = POPPTR(ss,ix);
9542 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9543 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9544 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
9545 break;
9546 case SAVEt_NSTAB:
9547 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9548 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9549 break;
9550 case SAVEt_GP: /* scalar reference */
9551 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 9552 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
9553 (void)GpREFCNT_inc(gp);
9554 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 9555 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
9556 c = (char*)POPPTR(ss,ix);
9557 TOPPTR(nss,ix) = pv_dup(c);
9558 iv = POPIV(ss,ix);
9559 TOPIV(nss,ix) = iv;
9560 iv = POPIV(ss,ix);
9561 TOPIV(nss,ix) = iv;
9562 break;
9563 case SAVEt_FREESV:
26d9b02f 9564 case SAVEt_MORTALIZESV:
1d7c1841 9565 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9566 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9567 break;
9568 case SAVEt_FREEOP:
9569 ptr = POPPTR(ss,ix);
9570 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
9571 /* these are assumed to be refcounted properly */
9572 switch (((OP*)ptr)->op_type) {
9573 case OP_LEAVESUB:
9574 case OP_LEAVESUBLV:
9575 case OP_LEAVEEVAL:
9576 case OP_LEAVE:
9577 case OP_SCOPE:
9578 case OP_LEAVEWRITE:
e977893f
GS
9579 TOPPTR(nss,ix) = ptr;
9580 o = (OP*)ptr;
9581 OpREFCNT_inc(o);
1d7c1841
GS
9582 break;
9583 default:
9584 TOPPTR(nss,ix) = Nullop;
9585 break;
9586 }
9587 }
9588 else
9589 TOPPTR(nss,ix) = Nullop;
9590 break;
9591 case SAVEt_FREEPV:
9592 c = (char*)POPPTR(ss,ix);
9593 TOPPTR(nss,ix) = pv_dup_inc(c);
9594 break;
9595 case SAVEt_CLEARSV:
9596 longval = POPLONG(ss,ix);
9597 TOPLONG(nss,ix) = longval;
9598 break;
9599 case SAVEt_DELETE:
9600 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9601 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
9602 c = (char*)POPPTR(ss,ix);
9603 TOPPTR(nss,ix) = pv_dup_inc(c);
9604 i = POPINT(ss,ix);
9605 TOPINT(nss,ix) = i;
9606 break;
9607 case SAVEt_DESTRUCTOR:
9608 ptr = POPPTR(ss,ix);
9609 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
9610 dptr = POPDPTR(ss,ix);
ef75a179 9611 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
9612 break;
9613 case SAVEt_DESTRUCTOR_X:
9614 ptr = POPPTR(ss,ix);
9615 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
9616 dxptr = POPDXPTR(ss,ix);
acfe0abc 9617 TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
9618 break;
9619 case SAVEt_REGCONTEXT:
9620 case SAVEt_ALLOC:
9621 i = POPINT(ss,ix);
9622 TOPINT(nss,ix) = i;
9623 ix -= i;
9624 break;
9625 case SAVEt_STACK_POS: /* Position on Perl stack */
9626 i = POPINT(ss,ix);
9627 TOPINT(nss,ix) = i;
9628 break;
9629 case SAVEt_AELEM: /* array element */
9630 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9631 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9632 i = POPINT(ss,ix);
9633 TOPINT(nss,ix) = i;
9634 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9635 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
9636 break;
9637 case SAVEt_HELEM: /* hash element */
9638 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9639 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9640 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9641 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9642 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9643 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
9644 break;
9645 case SAVEt_OP:
9646 ptr = POPPTR(ss,ix);
9647 TOPPTR(nss,ix) = ptr;
9648 break;
9649 case SAVEt_HINTS:
9650 i = POPINT(ss,ix);
9651 TOPINT(nss,ix) = i;
9652 break;
c4410b1b
GS
9653 case SAVEt_COMPPAD:
9654 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9655 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 9656 break;
c3564e5c
GS
9657 case SAVEt_PADSV:
9658 longval = (long)POPLONG(ss,ix);
9659 TOPLONG(nss,ix) = longval;
9660 ptr = POPPTR(ss,ix);
9661 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9662 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9663 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 9664 break;
1d7c1841
GS
9665 default:
9666 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
9667 }
9668 }
9669
9670 return nss;
9671}
9672
645c22ef
DM
9673/*
9674=for apidoc perl_clone
9675
9676Create and return a new interpreter by cloning the current one.
9677
9678=cut
9679*/
9680
9681/* XXX the above needs expanding by someone who actually understands it ! */
3fc56081
NK
9682EXTERN_C PerlInterpreter *
9683perl_clone_host(PerlInterpreter* proto_perl, UV flags);
645c22ef 9684
1d7c1841
GS
9685PerlInterpreter *
9686perl_clone(PerlInterpreter *proto_perl, UV flags)
9687{
1d7c1841 9688#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
9689
9690 /* perlhost.h so we need to call into it
9691 to clone the host, CPerlHost should have a c interface, sky */
9692
9693 if (flags & CLONEf_CLONE_HOST) {
9694 return perl_clone_host(proto_perl,flags);
9695 }
9696 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
9697 proto_perl->IMem,
9698 proto_perl->IMemShared,
9699 proto_perl->IMemParse,
9700 proto_perl->IEnv,
9701 proto_perl->IStdIO,
9702 proto_perl->ILIO,
9703 proto_perl->IDir,
9704 proto_perl->ISock,
9705 proto_perl->IProc);
9706}
9707
9708PerlInterpreter *
9709perl_clone_using(PerlInterpreter *proto_perl, UV flags,
9710 struct IPerlMem* ipM, struct IPerlMem* ipMS,
9711 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
9712 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
9713 struct IPerlDir* ipD, struct IPerlSock* ipS,
9714 struct IPerlProc* ipP)
9715{
9716 /* XXX many of the string copies here can be optimized if they're
9717 * constants; they need to be allocated as common memory and just
9718 * their pointers copied. */
9719
9720 IV i;
64aa0685
GS
9721 CLONE_PARAMS clone_params;
9722 CLONE_PARAMS* param = &clone_params;
d2d73c3e 9723
1d7c1841 9724 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
ba869deb 9725 PERL_SET_THX(my_perl);
1d7c1841 9726
acfe0abc 9727# ifdef DEBUGGING
1d7c1841
GS
9728 memset(my_perl, 0xab, sizeof(PerlInterpreter));
9729 PL_markstack = 0;
9730 PL_scopestack = 0;
9731 PL_savestack = 0;
9732 PL_retstack = 0;
66fe0623 9733 PL_sig_pending = 0;
25596c82 9734 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
acfe0abc 9735# else /* !DEBUGGING */
1d7c1841 9736 Zero(my_perl, 1, PerlInterpreter);
acfe0abc 9737# endif /* DEBUGGING */
1d7c1841
GS
9738
9739 /* host pointers */
9740 PL_Mem = ipM;
9741 PL_MemShared = ipMS;
9742 PL_MemParse = ipMP;
9743 PL_Env = ipE;
9744 PL_StdIO = ipStd;
9745 PL_LIO = ipLIO;
9746 PL_Dir = ipD;
9747 PL_Sock = ipS;
9748 PL_Proc = ipP;
1d7c1841
GS
9749#else /* !PERL_IMPLICIT_SYS */
9750 IV i;
64aa0685
GS
9751 CLONE_PARAMS clone_params;
9752 CLONE_PARAMS* param = &clone_params;
1d7c1841 9753 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 9754 PERL_SET_THX(my_perl);
1d7c1841 9755
d2d73c3e
AB
9756
9757
1d7c1841
GS
9758# ifdef DEBUGGING
9759 memset(my_perl, 0xab, sizeof(PerlInterpreter));
9760 PL_markstack = 0;
9761 PL_scopestack = 0;
9762 PL_savestack = 0;
9763 PL_retstack = 0;
66fe0623 9764 PL_sig_pending = 0;
25596c82 9765 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
1d7c1841
GS
9766# else /* !DEBUGGING */
9767 Zero(my_perl, 1, PerlInterpreter);
9768# endif /* DEBUGGING */
9769#endif /* PERL_IMPLICIT_SYS */
83236556 9770 param->flags = flags;
1d7c1841
GS
9771
9772 /* arena roots */
9773 PL_xiv_arenaroot = NULL;
9774 PL_xiv_root = NULL;
612f20c3 9775 PL_xnv_arenaroot = NULL;
1d7c1841 9776 PL_xnv_root = NULL;
612f20c3 9777 PL_xrv_arenaroot = NULL;
1d7c1841 9778 PL_xrv_root = NULL;
612f20c3 9779 PL_xpv_arenaroot = NULL;
1d7c1841 9780 PL_xpv_root = NULL;
612f20c3 9781 PL_xpviv_arenaroot = NULL;
1d7c1841 9782 PL_xpviv_root = NULL;
612f20c3 9783 PL_xpvnv_arenaroot = NULL;
1d7c1841 9784 PL_xpvnv_root = NULL;
612f20c3 9785 PL_xpvcv_arenaroot = NULL;
1d7c1841 9786 PL_xpvcv_root = NULL;
612f20c3 9787 PL_xpvav_arenaroot = NULL;
1d7c1841 9788 PL_xpvav_root = NULL;
612f20c3 9789 PL_xpvhv_arenaroot = NULL;
1d7c1841 9790 PL_xpvhv_root = NULL;
612f20c3 9791 PL_xpvmg_arenaroot = NULL;
1d7c1841 9792 PL_xpvmg_root = NULL;
612f20c3 9793 PL_xpvlv_arenaroot = NULL;
1d7c1841 9794 PL_xpvlv_root = NULL;
612f20c3 9795 PL_xpvbm_arenaroot = NULL;
1d7c1841 9796 PL_xpvbm_root = NULL;
612f20c3 9797 PL_he_arenaroot = NULL;
1d7c1841
GS
9798 PL_he_root = NULL;
9799 PL_nice_chunk = NULL;
9800 PL_nice_chunk_size = 0;
9801 PL_sv_count = 0;
9802 PL_sv_objcount = 0;
9803 PL_sv_root = Nullsv;
9804 PL_sv_arenaroot = Nullsv;
9805
9806 PL_debug = proto_perl->Idebug;
9807
e5dd39fc
AB
9808#ifdef USE_REENTRANT_API
9809 New(31337, PL_reentrant_buffer,1, REBUF);
9810 New(31337, PL_reentrant_buffer->tmbuff,1, struct tm);
9811#endif
9812
1d7c1841
GS
9813 /* create SV map for pointer relocation */
9814 PL_ptr_table = ptr_table_new();
9815
9816 /* initialize these special pointers as early as possible */
9817 SvANY(&PL_sv_undef) = NULL;
9818 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
9819 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
9820 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
9821
1d7c1841 9822 SvANY(&PL_sv_no) = new_XPVNV();
1d7c1841
GS
9823 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
9824 SvFLAGS(&PL_sv_no) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
9825 SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
9826 SvCUR(&PL_sv_no) = 0;
9827 SvLEN(&PL_sv_no) = 1;
9828 SvNVX(&PL_sv_no) = 0;
9829 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
9830
1d7c1841 9831 SvANY(&PL_sv_yes) = new_XPVNV();
1d7c1841
GS
9832 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
9833 SvFLAGS(&PL_sv_yes) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
9834 SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
9835 SvCUR(&PL_sv_yes) = 1;
9836 SvLEN(&PL_sv_yes) = 2;
9837 SvNVX(&PL_sv_yes) = 1;
9838 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
9839
05ec9bb3 9840 /* create (a non-shared!) shared string table */
1d7c1841
GS
9841 PL_strtab = newHV();
9842 HvSHAREKEYS_off(PL_strtab);
9843 hv_ksplit(PL_strtab, 512);
9844 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
9845
05ec9bb3
NIS
9846 PL_compiling = proto_perl->Icompiling;
9847
9848 /* These two PVs will be free'd special way so must set them same way op.c does */
9849 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
9850 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
9851
9852 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
9853 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
9854
1d7c1841
GS
9855 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
9856 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 9857 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 9858 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 9859 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
9860 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
9861
9862 /* pseudo environmental stuff */
9863 PL_origargc = proto_perl->Iorigargc;
9864 i = PL_origargc;
9865 New(0, PL_origargv, i+1, char*);
9866 PL_origargv[i] = '\0';
9867 while (i-- > 0) {
9868 PL_origargv[i] = SAVEPV(proto_perl->Iorigargv[i]);
9869 }
d2d73c3e 9870
d2d73c3e
AB
9871 param->stashes = newAV(); /* Setup array of objects to call clone on */
9872
a1ea730d 9873#ifdef PERLIO_LAYERS
3a1ee7e8
NIS
9874 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
9875 PerlIO_clone(aTHX_ proto_perl, param);
a1ea730d 9876#endif
d2d73c3e
AB
9877
9878 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
9879 PL_incgv = gv_dup(proto_perl->Iincgv, param);
9880 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 9881 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
9882 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
9883 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
9884
9885 /* switches */
9886 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 9887 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
9888 PL_localpatches = proto_perl->Ilocalpatches;
9889 PL_splitstr = proto_perl->Isplitstr;
9890 PL_preprocess = proto_perl->Ipreprocess;
9891 PL_minus_n = proto_perl->Iminus_n;
9892 PL_minus_p = proto_perl->Iminus_p;
9893 PL_minus_l = proto_perl->Iminus_l;
9894 PL_minus_a = proto_perl->Iminus_a;
9895 PL_minus_F = proto_perl->Iminus_F;
9896 PL_doswitches = proto_perl->Idoswitches;
9897 PL_dowarn = proto_perl->Idowarn;
9898 PL_doextract = proto_perl->Idoextract;
9899 PL_sawampersand = proto_perl->Isawampersand;
9900 PL_unsafe = proto_perl->Iunsafe;
9901 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 9902 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
9903 PL_perldb = proto_perl->Iperldb;
9904 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
1cbb0781 9905 PL_exit_flags = proto_perl->Iexit_flags;
1d7c1841
GS
9906
9907 /* magical thingies */
9908 /* XXX time(&PL_basetime) when asked for? */
9909 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 9910 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
9911
9912 PL_maxsysfd = proto_perl->Imaxsysfd;
9913 PL_multiline = proto_perl->Imultiline;
9914 PL_statusvalue = proto_perl->Istatusvalue;
9915#ifdef VMS
9916 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
9917#endif
0a378802 9918 PL_encoding = sv_dup(proto_perl->Iencoding, param);
1d7c1841 9919
d2f185dc
AMS
9920 /* Clone the regex array */
9921 PL_regex_padav = newAV();
9922 {
9923 I32 len = av_len((AV*)proto_perl->Iregex_padav);
9924 SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
0f95fc41
AB
9925 av_push(PL_regex_padav,
9926 sv_dup_inc(regexen[0],param));
9927 for(i = 1; i <= len; i++) {
9928 if(SvREPADTMP(regexen[i])) {
9929 av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
8cf8f3d1 9930 } else {
0f95fc41
AB
9931 av_push(PL_regex_padav,
9932 SvREFCNT_inc(
8cf8f3d1 9933 newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
cbfa9890 9934 SvIVX(regexen[i])), param)))
0f95fc41
AB
9935 ));
9936 }
d2f185dc
AMS
9937 }
9938 }
9939 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 9940
1d7c1841 9941 /* shortcuts to various I/O objects */
d2d73c3e
AB
9942 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
9943 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
9944 PL_defgv = gv_dup(proto_perl->Idefgv, param);
9945 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
9946 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
9947 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
9948
9949 /* shortcuts to regexp stuff */
d2d73c3e 9950 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
9951
9952 /* shortcuts to misc objects */
d2d73c3e 9953 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
9954
9955 /* shortcuts to debugging objects */
d2d73c3e
AB
9956 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
9957 PL_DBline = gv_dup(proto_perl->IDBline, param);
9958 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
9959 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
9960 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
9961 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
9962 PL_lineary = av_dup(proto_perl->Ilineary, param);
9963 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
9964
9965 /* symbol tables */
d2d73c3e
AB
9966 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
9967 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
9968 PL_nullstash = hv_dup(proto_perl->Inullstash, param);
9969 PL_debstash = hv_dup(proto_perl->Idebstash, param);
9970 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
9971 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
9972
9973 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
ee1c5a4e 9974 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
d2d73c3e
AB
9975 PL_endav = av_dup_inc(proto_perl->Iendav, param);
9976 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
9977 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
9978
9979 PL_sub_generation = proto_perl->Isub_generation;
9980
9981 /* funky return mechanisms */
9982 PL_forkprocess = proto_perl->Iforkprocess;
9983
9984 /* subprocess state */
d2d73c3e 9985 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
9986
9987 /* internal state */
9988 PL_tainting = proto_perl->Itainting;
9989 PL_maxo = proto_perl->Imaxo;
9990 if (proto_perl->Iop_mask)
9991 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
9992 else
9993 PL_op_mask = Nullch;
9994
9995 /* current interpreter roots */
d2d73c3e 9996 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
9997 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
9998 PL_main_start = proto_perl->Imain_start;
e977893f 9999 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
10000 PL_eval_start = proto_perl->Ieval_start;
10001
10002 /* runtime control stuff */
10003 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
10004 PL_copline = proto_perl->Icopline;
10005
10006 PL_filemode = proto_perl->Ifilemode;
10007 PL_lastfd = proto_perl->Ilastfd;
10008 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
10009 PL_Argv = NULL;
10010 PL_Cmd = Nullch;
10011 PL_gensym = proto_perl->Igensym;
10012 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 10013 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
10014 PL_laststatval = proto_perl->Ilaststatval;
10015 PL_laststype = proto_perl->Ilaststype;
10016 PL_mess_sv = Nullsv;
10017
d2d73c3e 10018 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
10019 PL_ofmt = SAVEPV(proto_perl->Iofmt);
10020
10021 /* interpreter atexit processing */
10022 PL_exitlistlen = proto_perl->Iexitlistlen;
10023 if (PL_exitlistlen) {
10024 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
10025 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
10026 }
10027 else
10028 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 10029 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
19e8ce8e
AB
10030 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
10031 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1d7c1841
GS
10032
10033 PL_profiledata = NULL;
a8fc9800 10034 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
1d7c1841 10035 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 10036 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 10037
d2d73c3e
AB
10038 PL_compcv = cv_dup(proto_perl->Icompcv, param);
10039 PL_comppad = av_dup(proto_perl->Icomppad, param);
10040 PL_comppad_name = av_dup(proto_perl->Icomppad_name, param);
1d7c1841
GS
10041 PL_comppad_name_fill = proto_perl->Icomppad_name_fill;
10042 PL_comppad_name_floor = proto_perl->Icomppad_name_floor;
10043 PL_curpad = (SV**)ptr_table_fetch(PL_ptr_table,
10044 proto_perl->Tcurpad);
10045
10046#ifdef HAVE_INTERP_INTERN
10047 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
10048#endif
10049
10050 /* more statics moved here */
10051 PL_generation = proto_perl->Igeneration;
d2d73c3e 10052 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
10053
10054 PL_in_clean_objs = proto_perl->Iin_clean_objs;
10055 PL_in_clean_all = proto_perl->Iin_clean_all;
10056
10057 PL_uid = proto_perl->Iuid;
10058 PL_euid = proto_perl->Ieuid;
10059 PL_gid = proto_perl->Igid;
10060 PL_egid = proto_perl->Iegid;
10061 PL_nomemok = proto_perl->Inomemok;
10062 PL_an = proto_perl->Ian;
10063 PL_cop_seqmax = proto_perl->Icop_seqmax;
10064 PL_op_seqmax = proto_perl->Iop_seqmax;
10065 PL_evalseq = proto_perl->Ievalseq;
10066 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
10067 PL_origalen = proto_perl->Iorigalen;
10068 PL_pidstatus = newHV(); /* XXX flag for cloning? */
10069 PL_osname = SAVEPV(proto_perl->Iosname);
0bb09c15 10070 PL_sh_path = proto_perl->Ish_path; /* XXX never deallocated */
1d7c1841
GS
10071 PL_sighandlerp = proto_perl->Isighandlerp;
10072
10073
10074 PL_runops = proto_perl->Irunops;
10075
10076 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
10077
10078#ifdef CSH
10079 PL_cshlen = proto_perl->Icshlen;
74f1b2b8 10080 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
1d7c1841
GS
10081#endif
10082
10083 PL_lex_state = proto_perl->Ilex_state;
10084 PL_lex_defer = proto_perl->Ilex_defer;
10085 PL_lex_expect = proto_perl->Ilex_expect;
10086 PL_lex_formbrack = proto_perl->Ilex_formbrack;
10087 PL_lex_dojoin = proto_perl->Ilex_dojoin;
10088 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
10089 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
10090 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
10091 PL_lex_op = proto_perl->Ilex_op;
10092 PL_lex_inpat = proto_perl->Ilex_inpat;
10093 PL_lex_inwhat = proto_perl->Ilex_inwhat;
10094 PL_lex_brackets = proto_perl->Ilex_brackets;
10095 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
10096 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
10097 PL_lex_casemods = proto_perl->Ilex_casemods;
10098 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
10099 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
10100
10101 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
10102 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
10103 PL_nexttoke = proto_perl->Inexttoke;
10104
d2d73c3e 10105 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
1d7c1841
GS
10106 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
10107 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10108 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
10109 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10110 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
10111 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10112 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
10113 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
10114 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10115 PL_pending_ident = proto_perl->Ipending_ident;
10116 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
10117
10118 PL_expect = proto_perl->Iexpect;
10119
10120 PL_multi_start = proto_perl->Imulti_start;
10121 PL_multi_end = proto_perl->Imulti_end;
10122 PL_multi_open = proto_perl->Imulti_open;
10123 PL_multi_close = proto_perl->Imulti_close;
10124
10125 PL_error_count = proto_perl->Ierror_count;
10126 PL_subline = proto_perl->Isubline;
d2d73c3e 10127 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841
GS
10128
10129 PL_min_intro_pending = proto_perl->Imin_intro_pending;
10130 PL_max_intro_pending = proto_perl->Imax_intro_pending;
10131 PL_padix = proto_perl->Ipadix;
10132 PL_padix_floor = proto_perl->Ipadix_floor;
10133 PL_pad_reset_pending = proto_perl->Ipad_reset_pending;
10134
10135 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
10136 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10137 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
10138 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10139 PL_last_lop_op = proto_perl->Ilast_lop_op;
10140 PL_in_my = proto_perl->Iin_my;
d2d73c3e 10141 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
10142#ifdef FCRYPT
10143 PL_cryptseen = proto_perl->Icryptseen;
10144#endif
10145
10146 PL_hints = proto_perl->Ihints;
10147
10148 PL_amagic_generation = proto_perl->Iamagic_generation;
10149
10150#ifdef USE_LOCALE_COLLATE
10151 PL_collation_ix = proto_perl->Icollation_ix;
10152 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
10153 PL_collation_standard = proto_perl->Icollation_standard;
10154 PL_collxfrm_base = proto_perl->Icollxfrm_base;
10155 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
10156#endif /* USE_LOCALE_COLLATE */
10157
10158#ifdef USE_LOCALE_NUMERIC
10159 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
10160 PL_numeric_standard = proto_perl->Inumeric_standard;
10161 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 10162 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
10163#endif /* !USE_LOCALE_NUMERIC */
10164
10165 /* utf8 character classes */
d2d73c3e
AB
10166 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
10167 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
10168 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
10169 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
10170 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
10171 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
10172 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
10173 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
10174 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
10175 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
10176 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
10177 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
10178 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
10179 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
10180 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
10181 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
10182 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
b4e400f9 10183 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
1d7c1841
GS
10184
10185 /* swatch cache */
10186 PL_last_swash_hv = Nullhv; /* reinits on demand */
10187 PL_last_swash_klen = 0;
10188 PL_last_swash_key[0]= '\0';
10189 PL_last_swash_tmps = (U8*)NULL;
10190 PL_last_swash_slen = 0;
10191
10192 /* perly.c globals */
10193 PL_yydebug = proto_perl->Iyydebug;
10194 PL_yynerrs = proto_perl->Iyynerrs;
10195 PL_yyerrflag = proto_perl->Iyyerrflag;
10196 PL_yychar = proto_perl->Iyychar;
10197 PL_yyval = proto_perl->Iyyval;
10198 PL_yylval = proto_perl->Iyylval;
10199
10200 PL_glob_index = proto_perl->Iglob_index;
10201 PL_srand_called = proto_perl->Isrand_called;
10202 PL_uudmap['M'] = 0; /* reinits on demand */
10203 PL_bitcount = Nullch; /* reinits on demand */
10204
66fe0623
NIS
10205 if (proto_perl->Ipsig_pend) {
10206 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 10207 }
66fe0623
NIS
10208 else {
10209 PL_psig_pend = (int*)NULL;
10210 }
10211
1d7c1841 10212 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
10213 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
10214 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 10215 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
10216 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
10217 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
10218 }
10219 }
10220 else {
10221 PL_psig_ptr = (SV**)NULL;
10222 PL_psig_name = (SV**)NULL;
10223 }
10224
10225 /* thrdvar.h stuff */
10226
a0739874 10227 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
10228 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
10229 PL_tmps_ix = proto_perl->Ttmps_ix;
10230 PL_tmps_max = proto_perl->Ttmps_max;
10231 PL_tmps_floor = proto_perl->Ttmps_floor;
10232 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
10233 i = 0;
10234 while (i <= PL_tmps_ix) {
d2d73c3e 10235 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
10236 ++i;
10237 }
10238
10239 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
10240 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
10241 Newz(54, PL_markstack, i, I32);
10242 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
10243 - proto_perl->Tmarkstack);
10244 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
10245 - proto_perl->Tmarkstack);
10246 Copy(proto_perl->Tmarkstack, PL_markstack,
10247 PL_markstack_ptr - PL_markstack + 1, I32);
10248
10249 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
10250 * NOTE: unlike the others! */
10251 PL_scopestack_ix = proto_perl->Tscopestack_ix;
10252 PL_scopestack_max = proto_perl->Tscopestack_max;
10253 Newz(54, PL_scopestack, PL_scopestack_max, I32);
10254 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
10255
10256 /* next push_return() sets PL_retstack[PL_retstack_ix]
10257 * NOTE: unlike the others! */
10258 PL_retstack_ix = proto_perl->Tretstack_ix;
10259 PL_retstack_max = proto_perl->Tretstack_max;
10260 Newz(54, PL_retstack, PL_retstack_max, OP*);
10261 Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, I32);
10262
10263 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 10264 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
10265
10266 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
10267 PL_curstack = av_dup(proto_perl->Tcurstack, param);
10268 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
10269
10270 /* next PUSHs() etc. set *(PL_stack_sp+1) */
10271 PL_stack_base = AvARRAY(PL_curstack);
10272 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
10273 - proto_perl->Tstack_base);
10274 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
10275
10276 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
10277 * NOTE: unlike the others! */
10278 PL_savestack_ix = proto_perl->Tsavestack_ix;
10279 PL_savestack_max = proto_perl->Tsavestack_max;
10280 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 10281 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
10282 }
10283 else {
10284 init_stacks();
985e7056 10285 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
10286 }
10287
10288 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
10289 PL_top_env = &PL_start_env;
10290
10291 PL_op = proto_perl->Top;
10292
10293 PL_Sv = Nullsv;
10294 PL_Xpv = (XPV*)NULL;
10295 PL_na = proto_perl->Tna;
10296
10297 PL_statbuf = proto_perl->Tstatbuf;
10298 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
10299 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
10300 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
10301#ifdef HAS_TIMES
10302 PL_timesbuf = proto_perl->Ttimesbuf;
10303#endif
10304
10305 PL_tainted = proto_perl->Ttainted;
10306 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
10307 PL_rs = sv_dup_inc(proto_perl->Trs, param);
10308 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
10309 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
10310 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 10311 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
10312 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
10313 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
10314 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
10315
10316 PL_restartop = proto_perl->Trestartop;
10317 PL_in_eval = proto_perl->Tin_eval;
10318 PL_delaymagic = proto_perl->Tdelaymagic;
10319 PL_dirty = proto_perl->Tdirty;
10320 PL_localizing = proto_perl->Tlocalizing;
10321
14dd3ad8 10322#ifdef PERL_FLEXIBLE_EXCEPTIONS
1d7c1841 10323 PL_protect = proto_perl->Tprotect;
14dd3ad8 10324#endif
d2d73c3e 10325 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
1d7c1841
GS
10326 PL_av_fetch_sv = Nullsv;
10327 PL_hv_fetch_sv = Nullsv;
10328 Zero(&PL_hv_fetch_ent_mh, 1, HE); /* XXX */
10329 PL_modcount = proto_perl->Tmodcount;
10330 PL_lastgotoprobe = Nullop;
10331 PL_dumpindent = proto_perl->Tdumpindent;
10332
10333 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
10334 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
10335 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
10336 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
10337 PL_sortcxix = proto_perl->Tsortcxix;
10338 PL_efloatbuf = Nullch; /* reinits on demand */
10339 PL_efloatsize = 0; /* reinits on demand */
10340
10341 /* regex stuff */
10342
10343 PL_screamfirst = NULL;
10344 PL_screamnext = NULL;
10345 PL_maxscream = -1; /* reinits on demand */
10346 PL_lastscream = Nullsv;
10347
10348 PL_watchaddr = NULL;
10349 PL_watchok = Nullch;
10350
10351 PL_regdummy = proto_perl->Tregdummy;
10352 PL_regcomp_parse = Nullch;
10353 PL_regxend = Nullch;
10354 PL_regcode = (regnode*)NULL;
10355 PL_regnaughty = 0;
10356 PL_regsawback = 0;
10357 PL_regprecomp = Nullch;
10358 PL_regnpar = 0;
10359 PL_regsize = 0;
10360 PL_regflags = 0;
10361 PL_regseen = 0;
10362 PL_seen_zerolen = 0;
10363 PL_seen_evals = 0;
10364 PL_regcomp_rx = (regexp*)NULL;
10365 PL_extralen = 0;
10366 PL_colorset = 0; /* reinits PL_colors[] */
10367 /*PL_colors[6] = {0,0,0,0,0,0};*/
10368 PL_reg_whilem_seen = 0;
10369 PL_reginput = Nullch;
10370 PL_regbol = Nullch;
10371 PL_regeol = Nullch;
10372 PL_regstartp = (I32*)NULL;
10373 PL_regendp = (I32*)NULL;
10374 PL_reglastparen = (U32*)NULL;
10375 PL_regtill = Nullch;
1d7c1841
GS
10376 PL_reg_start_tmp = (char**)NULL;
10377 PL_reg_start_tmpl = 0;
10378 PL_regdata = (struct reg_data*)NULL;
10379 PL_bostr = Nullch;
10380 PL_reg_flags = 0;
10381 PL_reg_eval_set = 0;
10382 PL_regnarrate = 0;
10383 PL_regprogram = (regnode*)NULL;
10384 PL_regindent = 0;
10385 PL_regcc = (CURCUR*)NULL;
10386 PL_reg_call_cc = (struct re_cc_state*)NULL;
10387 PL_reg_re = (regexp*)NULL;
10388 PL_reg_ganch = Nullch;
10389 PL_reg_sv = Nullsv;
53c4c00c 10390 PL_reg_match_utf8 = FALSE;
1d7c1841
GS
10391 PL_reg_magic = (MAGIC*)NULL;
10392 PL_reg_oldpos = 0;
10393 PL_reg_oldcurpm = (PMOP*)NULL;
10394 PL_reg_curpm = (PMOP*)NULL;
10395 PL_reg_oldsaved = Nullch;
10396 PL_reg_oldsavedlen = 0;
10397 PL_reg_maxiter = 0;
10398 PL_reg_leftiter = 0;
10399 PL_reg_poscache = Nullch;
10400 PL_reg_poscache_size= 0;
10401
10402 /* RE engine - function pointers */
10403 PL_regcompp = proto_perl->Tregcompp;
10404 PL_regexecp = proto_perl->Tregexecp;
10405 PL_regint_start = proto_perl->Tregint_start;
10406 PL_regint_string = proto_perl->Tregint_string;
10407 PL_regfree = proto_perl->Tregfree;
10408
10409 PL_reginterp_cnt = 0;
10410 PL_reg_starttry = 0;
10411
a2efc822
SC
10412 /* Pluggable optimizer */
10413 PL_peepp = proto_perl->Tpeepp;
10414
a0739874
DM
10415 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
10416 ptr_table_free(PL_ptr_table);
10417 PL_ptr_table = NULL;
10418 }
8cf8f3d1 10419
f284b03f
AMS
10420 /* Call the ->CLONE method, if it exists, for each of the stashes
10421 identified by sv_dup() above.
10422 */
d2d73c3e
AB
10423 while(av_len(param->stashes) != -1) {
10424 HV* stash = (HV*) av_shift(param->stashes);
f284b03f
AMS
10425 GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
10426 if (cloner && GvCV(cloner)) {
10427 dSP;
10428 ENTER;
10429 SAVETMPS;
10430 PUSHMARK(SP);
dc507217 10431 XPUSHs(sv_2mortal(newSVpv(HvNAME(stash), 0)));
f284b03f
AMS
10432 PUTBACK;
10433 call_sv((SV*)GvCV(cloner), G_DISCARD);
10434 FREETMPS;
10435 LEAVE;
10436 }
4a09accc 10437 }
a0739874 10438
dc507217 10439 SvREFCNT_dec(param->stashes);
dc507217 10440
1d7c1841 10441 return my_perl;
1d7c1841
GS
10442}
10443
1d7c1841 10444#endif /* USE_ITHREADS */
a0ae6670 10445
9f4817db 10446/*
ccfc67b7
JH
10447=head1 Unicode Support
10448
9f4817db
JH
10449=for apidoc sv_recode_to_utf8
10450
5d170f3a
JH
10451The encoding is assumed to be an Encode object, on entry the PV
10452of the sv is assumed to be octets in that encoding, and the sv
10453will be converted into Unicode (and UTF-8).
9f4817db 10454
5d170f3a
JH
10455If the sv already is UTF-8 (or if it is not POK), or if the encoding
10456is not a reference, nothing is done to the sv. If the encoding is not
1768d7eb
JH
10457an C<Encode::XS> Encoding object, bad things will happen.
10458(See F<lib/encoding.pm> and L<Encode>).
9f4817db 10459
5d170f3a 10460The PV of the sv is returned.
9f4817db 10461
5d170f3a
JH
10462=cut */
10463
10464char *
10465Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
10466{
121910a4 10467 if (SvPOK(sv) && !DO_UTF8(sv) && SvROK(encoding)) {
5d170f3a
JH
10468 SV *uni;
10469 STRLEN len;
10470 char *s;
10471 dSP;
10472 ENTER;
10473 SAVETMPS;
10474 PUSHMARK(sp);
10475 EXTEND(SP, 3);
10476 XPUSHs(encoding);
10477 XPUSHs(sv);
10478 XPUSHs(&PL_sv_yes);
10479 PUTBACK;
10480 call_method("decode", G_SCALAR);
10481 SPAGAIN;
10482 uni = POPs;
10483 PUTBACK;
3e169325 10484 s = SvPV(uni, len);
5d170f3a
JH
10485 if (s != SvPVX(sv)) {
10486 SvGROW(sv, len);
10487 Move(s, SvPVX(sv), len, char);
10488 SvCUR_set(sv, len);
10489 }
10490 FREETMPS;
10491 LEAVE;
10492 SvUTF8_on(sv);
9f4817db 10493 }
5d170f3a 10494 return SvPVX(sv);
9f4817db
JH
10495}
10496