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