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