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