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