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