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