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