This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
unpack P* uses random length for item
[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;
1425 HvKEYS(sv) = 0;
1426 SvNVX(sv) = 0.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{
159fae86 1944 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_2iuv_non '%s', IV=0x%"UVxf" NV=%g inttype=%"UVXf"\n", SvPVX(sv), SvIVX(sv), SvNVX(sv), (UV)numtype));
28e5dec8
JH
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
c2988b20
NC
2198 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%g)\n",
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)) {
2254 Perl_croak(aTHX_ "sv_2iv assumed (U_V(fabs(SvNVX(sv))) < (UV)IV_MAX) but SvNVX(sv)=%g U_V is 0x%"UVxf", IV_MAX is 0x%"UVxf"\n", SvNVX(sv), U_V(SvNVX(sv)), (UV)IV_MAX);
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
c2988b20
NC
2486 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%g)\n",
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)) {
2541 Perl_croak(aTHX_ "sv_2uv assumed (U_V(fabs(SvNVX(sv))) < (UV)IV_MAX) but SvNVX(sv)=%g U_V is 0x%"UVxf", IV_MAX is 0x%"UVxf"\n", SvNVX(sv), U_V(SvNVX(sv)), (UV)IV_MAX);
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();
1d7c1841
GS
2637 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%g)\n",
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();
1d7c1841
GS
2766 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%g)\n",
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_)) &&
1dc13c17 3238 (SvTYPE(tmpsv) != SVt_RV || (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
55d27857
RG
4458 /* Some magic contains a reference loop, where the sv and object refer to
4459 each other. To avoid a reference loop that would prevent such objects
4460 being freed, we look for such loops and if we find one we avoid
75f9d97a 4461 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));
a20bf0c3 5703 PerlIO_set_ptrcnt(fp, 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));
a20bf0c3 5744 PerlIO_set_ptrcnt(fp, 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)) {
0f15f207 5849 if (SvREADONLY(sv)) {
3280af22 5850 if (PL_curcop != &PL_compiling)
cea2e8a9 5851 Perl_croak(aTHX_ PL_no_modify);
0f15f207 5852 }
a0d0e21e 5853 if (SvROK(sv)) {
b5be31e9 5854 IV i;
9e7bc3e8
JD
5855 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
5856 return;
56431972 5857 i = PTR2IV(SvRV(sv));
b5be31e9
SM
5858 sv_unref(sv);
5859 sv_setiv(sv, i);
a0d0e21e 5860 }
ed6116ce 5861 }
8990e307 5862 flags = SvFLAGS(sv);
28e5dec8
JH
5863 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
5864 /* It's (privately or publicly) a float, but not tested as an
5865 integer, so test it to see. */
d460ef45 5866 (void) SvIV(sv);
28e5dec8
JH
5867 flags = SvFLAGS(sv);
5868 }
5869 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
5870 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 5871#ifdef PERL_PRESERVE_IVUV
28e5dec8 5872 oops_its_int:
59d8ce62 5873#endif
25da4f38
IZ
5874 if (SvIsUV(sv)) {
5875 if (SvUVX(sv) == UV_MAX)
a1e868e7 5876 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
5877 else
5878 (void)SvIOK_only_UV(sv);
5879 ++SvUVX(sv);
5880 } else {
5881 if (SvIVX(sv) == IV_MAX)
28e5dec8 5882 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
5883 else {
5884 (void)SvIOK_only(sv);
5885 ++SvIVX(sv);
1c846c1f 5886 }
55497cff 5887 }
79072805
LW
5888 return;
5889 }
28e5dec8
JH
5890 if (flags & SVp_NOK) {
5891 (void)SvNOK_only(sv);
5892 SvNVX(sv) += 1.0;
5893 return;
5894 }
5895
8990e307 5896 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
28e5dec8
JH
5897 if ((flags & SVTYPEMASK) < SVt_PVIV)
5898 sv_upgrade(sv, SVt_IV);
5899 (void)SvIOK_only(sv);
5900 SvIVX(sv) = 1;
79072805
LW
5901 return;
5902 }
463ee0b2 5903 d = SvPVX(sv);
79072805
LW
5904 while (isALPHA(*d)) d++;
5905 while (isDIGIT(*d)) d++;
5906 if (*d) {
28e5dec8 5907#ifdef PERL_PRESERVE_IVUV
d1be9408 5908 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
5909 warnings. Probably ought to make the sv_iv_please() that does
5910 the conversion if possible, and silently. */
c2988b20 5911 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
5912 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
5913 /* Need to try really hard to see if it's an integer.
5914 9.22337203685478e+18 is an integer.
5915 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
5916 so $a="9.22337203685478e+18"; $a+0; $a++
5917 needs to be the same as $a="9.22337203685478e+18"; $a++
5918 or we go insane. */
d460ef45 5919
28e5dec8
JH
5920 (void) sv_2iv(sv);
5921 if (SvIOK(sv))
5922 goto oops_its_int;
5923
5924 /* sv_2iv *should* have made this an NV */
5925 if (flags & SVp_NOK) {
5926 (void)SvNOK_only(sv);
5927 SvNVX(sv) += 1.0;
5928 return;
5929 }
5930 /* I don't think we can get here. Maybe I should assert this
5931 And if we do get here I suspect that sv_setnv will croak. NWC
5932 Fall through. */
5933#if defined(USE_LONG_DOUBLE)
5934 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",
5935 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
5936#else
5937 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%g\n",
5938 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
5939#endif
5940 }
5941#endif /* PERL_PRESERVE_IVUV */
5942 sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
79072805
LW
5943 return;
5944 }
5945 d--;
463ee0b2 5946 while (d >= SvPVX(sv)) {
79072805
LW
5947 if (isDIGIT(*d)) {
5948 if (++*d <= '9')
5949 return;
5950 *(d--) = '0';
5951 }
5952 else {
9d116dd7
JH
5953#ifdef EBCDIC
5954 /* MKS: The original code here died if letters weren't consecutive.
5955 * at least it didn't have to worry about non-C locales. The
5956 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 5957 * arranged in order (although not consecutively) and that only
9d116dd7
JH
5958 * [A-Za-z] are accepted by isALPHA in the C locale.
5959 */
5960 if (*d != 'z' && *d != 'Z') {
5961 do { ++*d; } while (!isALPHA(*d));
5962 return;
5963 }
5964 *(d--) -= 'z' - 'a';
5965#else
79072805
LW
5966 ++*d;
5967 if (isALPHA(*d))
5968 return;
5969 *(d--) -= 'z' - 'a' + 1;
9d116dd7 5970#endif
79072805
LW
5971 }
5972 }
5973 /* oh,oh, the number grew */
5974 SvGROW(sv, SvCUR(sv) + 2);
5975 SvCUR(sv)++;
463ee0b2 5976 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
5977 *d = d[-1];
5978 if (isDIGIT(d[1]))
5979 *d = '1';
5980 else
5981 *d = d[1];
5982}
5983
954c1994
GS
5984/*
5985=for apidoc sv_dec
5986
645c22ef
DM
5987Auto-decrement of the value in the SV, doing string to numeric conversion
5988if necessary. Handles 'get' magic.
954c1994
GS
5989
5990=cut
5991*/
5992
79072805 5993void
864dbfa3 5994Perl_sv_dec(pTHX_ register SV *sv)
79072805 5995{
463ee0b2
LW
5996 int flags;
5997
79072805
LW
5998 if (!sv)
5999 return;
b23a5f78
GB
6000 if (SvGMAGICAL(sv))
6001 mg_get(sv);
ed6116ce 6002 if (SvTHINKFIRST(sv)) {
0f15f207 6003 if (SvREADONLY(sv)) {
3280af22 6004 if (PL_curcop != &PL_compiling)
cea2e8a9 6005 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6006 }
a0d0e21e 6007 if (SvROK(sv)) {
b5be31e9 6008 IV i;
9e7bc3e8
JD
6009 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6010 return;
56431972 6011 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6012 sv_unref(sv);
6013 sv_setiv(sv, i);
a0d0e21e 6014 }
ed6116ce 6015 }
28e5dec8
JH
6016 /* Unlike sv_inc we don't have to worry about string-never-numbers
6017 and keeping them magic. But we mustn't warn on punting */
8990e307 6018 flags = SvFLAGS(sv);
28e5dec8
JH
6019 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6020 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6021#ifdef PERL_PRESERVE_IVUV
28e5dec8 6022 oops_its_int:
59d8ce62 6023#endif
25da4f38
IZ
6024 if (SvIsUV(sv)) {
6025 if (SvUVX(sv) == 0) {
6026 (void)SvIOK_only(sv);
6027 SvIVX(sv) = -1;
6028 }
6029 else {
6030 (void)SvIOK_only_UV(sv);
6031 --SvUVX(sv);
1c846c1f 6032 }
25da4f38
IZ
6033 } else {
6034 if (SvIVX(sv) == IV_MIN)
65202027 6035 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
6036 else {
6037 (void)SvIOK_only(sv);
6038 --SvIVX(sv);
1c846c1f 6039 }
55497cff 6040 }
6041 return;
6042 }
28e5dec8
JH
6043 if (flags & SVp_NOK) {
6044 SvNVX(sv) -= 1.0;
6045 (void)SvNOK_only(sv);
6046 return;
6047 }
8990e307 6048 if (!(flags & SVp_POK)) {
4633a7c4
LW
6049 if ((flags & SVTYPEMASK) < SVt_PVNV)
6050 sv_upgrade(sv, SVt_NV);
463ee0b2 6051 SvNVX(sv) = -1.0;
a0d0e21e 6052 (void)SvNOK_only(sv);
79072805
LW
6053 return;
6054 }
28e5dec8
JH
6055#ifdef PERL_PRESERVE_IVUV
6056 {
c2988b20 6057 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
6058 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6059 /* Need to try really hard to see if it's an integer.
6060 9.22337203685478e+18 is an integer.
6061 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6062 so $a="9.22337203685478e+18"; $a+0; $a--
6063 needs to be the same as $a="9.22337203685478e+18"; $a--
6064 or we go insane. */
d460ef45 6065
28e5dec8
JH
6066 (void) sv_2iv(sv);
6067 if (SvIOK(sv))
6068 goto oops_its_int;
6069
6070 /* sv_2iv *should* have made this an NV */
6071 if (flags & SVp_NOK) {
6072 (void)SvNOK_only(sv);
6073 SvNVX(sv) -= 1.0;
6074 return;
6075 }
6076 /* I don't think we can get here. Maybe I should assert this
6077 And if we do get here I suspect that sv_setnv will croak. NWC
6078 Fall through. */
6079#if defined(USE_LONG_DOUBLE)
6080 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",
6081 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6082#else
6083 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%g\n",
6084 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6085#endif
6086 }
6087 }
6088#endif /* PERL_PRESERVE_IVUV */
097ee67d 6089 sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
6090}
6091
954c1994
GS
6092/*
6093=for apidoc sv_mortalcopy
6094
645c22ef 6095Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
6096The new SV is marked as mortal. It will be destroyed "soon", either by an
6097explicit call to FREETMPS, or by an implicit call at places such as
6098statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
6099
6100=cut
6101*/
6102
79072805
LW
6103/* Make a string that will exist for the duration of the expression
6104 * evaluation. Actually, it may have to last longer than that, but
6105 * hopefully we won't free it until it has been assigned to a
6106 * permanent location. */
6107
6108SV *
864dbfa3 6109Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 6110{
463ee0b2 6111 register SV *sv;
79072805 6112
4561caa4 6113 new_SV(sv);
79072805 6114 sv_setsv(sv,oldstr);
677b06e3
GS
6115 EXTEND_MORTAL(1);
6116 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
6117 SvTEMP_on(sv);
6118 return sv;
6119}
6120
954c1994
GS
6121/*
6122=for apidoc sv_newmortal
6123
645c22ef 6124Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
6125set to 1. It will be destroyed "soon", either by an explicit call to
6126FREETMPS, or by an implicit call at places such as statement boundaries.
6127See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
6128
6129=cut
6130*/
6131
8990e307 6132SV *
864dbfa3 6133Perl_sv_newmortal(pTHX)
8990e307
LW
6134{
6135 register SV *sv;
6136
4561caa4 6137 new_SV(sv);
8990e307 6138 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
6139 EXTEND_MORTAL(1);
6140 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
6141 return sv;
6142}
6143
954c1994
GS
6144/*
6145=for apidoc sv_2mortal
6146
d4236ebc
DM
6147Marks an existing SV as mortal. The SV will be destroyed "soon", either
6148by an explicit call to FREETMPS, or by an implicit call at places such as
6149statement boundaries. See also C<sv_newmortal> and C<sv_mortalcopy>.
954c1994
GS
6150
6151=cut
6152*/
6153
79072805 6154SV *
864dbfa3 6155Perl_sv_2mortal(pTHX_ register SV *sv)
79072805
LW
6156{
6157 if (!sv)
6158 return sv;
d689ffdd 6159 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 6160 return sv;
677b06e3
GS
6161 EXTEND_MORTAL(1);
6162 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 6163 SvTEMP_on(sv);
79072805
LW
6164 return sv;
6165}
6166
954c1994
GS
6167/*
6168=for apidoc newSVpv
6169
6170Creates a new SV and copies a string into it. The reference count for the
6171SV is set to 1. If C<len> is zero, Perl will compute the length using
6172strlen(). For efficiency, consider using C<newSVpvn> instead.
6173
6174=cut
6175*/
6176
79072805 6177SV *
864dbfa3 6178Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 6179{
463ee0b2 6180 register SV *sv;
79072805 6181
4561caa4 6182 new_SV(sv);
79072805
LW
6183 if (!len)
6184 len = strlen(s);
6185 sv_setpvn(sv,s,len);
6186 return sv;
6187}
6188
954c1994
GS
6189/*
6190=for apidoc newSVpvn
6191
6192Creates a new SV and copies a string into it. The reference count for the
1c846c1f 6193SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994
GS
6194string. You are responsible for ensuring that the source string is at least
6195C<len> bytes long.
6196
6197=cut
6198*/
6199
9da1e3b5 6200SV *
864dbfa3 6201Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
6202{
6203 register SV *sv;
6204
6205 new_SV(sv);
9da1e3b5
MUN
6206 sv_setpvn(sv,s,len);
6207 return sv;
6208}
6209
1c846c1f
NIS
6210/*
6211=for apidoc newSVpvn_share
6212
645c22ef
DM
6213Creates a new SV with its SvPVX pointing to a shared string in the string
6214table. If the string does not already exist in the table, it is created
6215first. Turns on READONLY and FAKE. The string's hash is stored in the UV
6216slot of the SV; if the C<hash> parameter is non-zero, that value is used;
6217otherwise the hash is computed. The idea here is that as the string table
6218is used for shared hash keys these strings will have SvPVX == HeKEY and
6219hash lookup will avoid string compare.
1c846c1f
NIS
6220
6221=cut
6222*/
6223
6224SV *
c3654f1a 6225Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
6226{
6227 register SV *sv;
c3654f1a
IH
6228 bool is_utf8 = FALSE;
6229 if (len < 0) {
77caf834 6230 STRLEN tmplen = -len;
c3654f1a 6231 is_utf8 = TRUE;
75a54232
JH
6232 /* See the note in hv.c:hv_fetch() --jhi */
6233 src = (char*)bytes_from_utf8((U8*)src, &tmplen, &is_utf8);
6234 len = tmplen;
6235 }
1c846c1f
NIS
6236 if (!hash)
6237 PERL_HASH(hash, src, len);
6238 new_SV(sv);
6239 sv_upgrade(sv, SVt_PVIV);
c3654f1a 6240 SvPVX(sv) = sharepvn(src, is_utf8?-len:len, hash);
1c846c1f
NIS
6241 SvCUR(sv) = len;
6242 SvUVX(sv) = hash;
6243 SvLEN(sv) = 0;
6244 SvREADONLY_on(sv);
6245 SvFAKE_on(sv);
6246 SvPOK_on(sv);
c3654f1a
IH
6247 if (is_utf8)
6248 SvUTF8_on(sv);
1c846c1f
NIS
6249 return sv;
6250}
6251
645c22ef 6252
cea2e8a9 6253#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
6254
6255/* pTHX_ magic can't cope with varargs, so this is a no-context
6256 * version of the main function, (which may itself be aliased to us).
6257 * Don't access this version directly.
6258 */
6259
46fc3d4c 6260SV *
cea2e8a9 6261Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 6262{
cea2e8a9 6263 dTHX;
46fc3d4c 6264 register SV *sv;
6265 va_list args;
46fc3d4c 6266 va_start(args, pat);
c5be433b 6267 sv = vnewSVpvf(pat, &args);
46fc3d4c 6268 va_end(args);
6269 return sv;
6270}
cea2e8a9 6271#endif
46fc3d4c 6272
954c1994
GS
6273/*
6274=for apidoc newSVpvf
6275
645c22ef 6276Creates a new SV and initializes it with the string formatted like
954c1994
GS
6277C<sprintf>.
6278
6279=cut
6280*/
6281
cea2e8a9
GS
6282SV *
6283Perl_newSVpvf(pTHX_ const char* pat, ...)
6284{
6285 register SV *sv;
6286 va_list args;
cea2e8a9 6287 va_start(args, pat);
c5be433b 6288 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
6289 va_end(args);
6290 return sv;
6291}
46fc3d4c 6292
645c22ef
DM
6293/* backend for newSVpvf() and newSVpvf_nocontext() */
6294
79072805 6295SV *
c5be433b
GS
6296Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
6297{
6298 register SV *sv;
6299 new_SV(sv);
6300 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
6301 return sv;
6302}
6303
954c1994
GS
6304/*
6305=for apidoc newSVnv
6306
6307Creates a new SV and copies a floating point value into it.
6308The reference count for the SV is set to 1.
6309
6310=cut
6311*/
6312
c5be433b 6313SV *
65202027 6314Perl_newSVnv(pTHX_ NV n)
79072805 6315{
463ee0b2 6316 register SV *sv;
79072805 6317
4561caa4 6318 new_SV(sv);
79072805
LW
6319 sv_setnv(sv,n);
6320 return sv;
6321}
6322
954c1994
GS
6323/*
6324=for apidoc newSViv
6325
6326Creates a new SV and copies an integer into it. The reference count for the
6327SV is set to 1.
6328
6329=cut
6330*/
6331
79072805 6332SV *
864dbfa3 6333Perl_newSViv(pTHX_ IV i)
79072805 6334{
463ee0b2 6335 register SV *sv;
79072805 6336
4561caa4 6337 new_SV(sv);
79072805
LW
6338 sv_setiv(sv,i);
6339 return sv;
6340}
6341
954c1994 6342/*
1a3327fb
JH
6343=for apidoc newSVuv
6344
6345Creates a new SV and copies an unsigned integer into it.
6346The reference count for the SV is set to 1.
6347
6348=cut
6349*/
6350
6351SV *
6352Perl_newSVuv(pTHX_ UV u)
6353{
6354 register SV *sv;
6355
6356 new_SV(sv);
6357 sv_setuv(sv,u);
6358 return sv;
6359}
6360
6361/*
954c1994
GS
6362=for apidoc newRV_noinc
6363
6364Creates an RV wrapper for an SV. The reference count for the original
6365SV is B<not> incremented.
6366
6367=cut
6368*/
6369
2304df62 6370SV *
864dbfa3 6371Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
6372{
6373 register SV *sv;
6374
4561caa4 6375 new_SV(sv);
2304df62 6376 sv_upgrade(sv, SVt_RV);
76e3520e 6377 SvTEMP_off(tmpRef);
d689ffdd 6378 SvRV(sv) = tmpRef;
2304df62 6379 SvROK_on(sv);
2304df62
AD
6380 return sv;
6381}
6382
ff276b08 6383/* newRV_inc is the official function name to use now.
645c22ef
DM
6384 * newRV_inc is in fact #defined to newRV in sv.h
6385 */
6386
5f05dabc 6387SV *
864dbfa3 6388Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 6389{
5f6447b6 6390 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 6391}
5f05dabc 6392
954c1994
GS
6393/*
6394=for apidoc newSVsv
6395
6396Creates a new SV which is an exact duplicate of the original SV.
645c22ef 6397(Uses C<sv_setsv>).
954c1994
GS
6398
6399=cut
6400*/
6401
79072805 6402SV *
864dbfa3 6403Perl_newSVsv(pTHX_ register SV *old)
79072805 6404{
463ee0b2 6405 register SV *sv;
79072805
LW
6406
6407 if (!old)
6408 return Nullsv;
8990e307 6409 if (SvTYPE(old) == SVTYPEMASK) {
0453d815
PM
6410 if (ckWARN_d(WARN_INTERNAL))
6411 Perl_warner(aTHX_ WARN_INTERNAL, "semi-panic: attempt to dup freed string");
79072805
LW
6412 return Nullsv;
6413 }
4561caa4 6414 new_SV(sv);
ff68c719 6415 if (SvTEMP(old)) {
6416 SvTEMP_off(old);
463ee0b2 6417 sv_setsv(sv,old);
ff68c719 6418 SvTEMP_on(old);
79072805
LW
6419 }
6420 else
463ee0b2
LW
6421 sv_setsv(sv,old);
6422 return sv;
79072805
LW
6423}
6424
645c22ef
DM
6425/*
6426=for apidoc sv_reset
6427
6428Underlying implementation for the C<reset> Perl function.
6429Note that the perl-level function is vaguely deprecated.
6430
6431=cut
6432*/
6433
79072805 6434void
864dbfa3 6435Perl_sv_reset(pTHX_ register char *s, HV *stash)
79072805
LW
6436{
6437 register HE *entry;
6438 register GV *gv;
6439 register SV *sv;
6440 register I32 i;
6441 register PMOP *pm;
6442 register I32 max;
4802d5d7 6443 char todo[PERL_UCHAR_MAX+1];
79072805 6444
49d8d3a1
MB
6445 if (!stash)
6446 return;
6447
79072805
LW
6448 if (!*s) { /* reset ?? searches */
6449 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
48c036b1 6450 pm->op_pmdynflags &= ~PMdf_USED;
79072805
LW
6451 }
6452 return;
6453 }
6454
6455 /* reset variables */
6456
6457 if (!HvARRAY(stash))
6458 return;
463ee0b2
LW
6459
6460 Zero(todo, 256, char);
79072805 6461 while (*s) {
4802d5d7 6462 i = (unsigned char)*s;
79072805
LW
6463 if (s[1] == '-') {
6464 s += 2;
6465 }
4802d5d7 6466 max = (unsigned char)*s++;
79072805 6467 for ( ; i <= max; i++) {
463ee0b2
LW
6468 todo[i] = 1;
6469 }
a0d0e21e 6470 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 6471 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
6472 entry;
6473 entry = HeNEXT(entry))
6474 {
1edc1566 6475 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 6476 continue;
1edc1566 6477 gv = (GV*)HeVAL(entry);
79072805 6478 sv = GvSV(gv);
9e35f4b3
GS
6479 if (SvTHINKFIRST(sv)) {
6480 if (!SvREADONLY(sv) && SvROK(sv))
6481 sv_unref(sv);
6482 continue;
6483 }
a0d0e21e 6484 (void)SvOK_off(sv);
79072805
LW
6485 if (SvTYPE(sv) >= SVt_PV) {
6486 SvCUR_set(sv, 0);
463ee0b2
LW
6487 if (SvPVX(sv) != Nullch)
6488 *SvPVX(sv) = '\0';
44a8e56a 6489 SvTAINT(sv);
79072805
LW
6490 }
6491 if (GvAV(gv)) {
6492 av_clear(GvAV(gv));
6493 }
44a8e56a 6494 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
463ee0b2 6495 hv_clear(GvHV(gv));
fa6a1c44 6496#ifdef USE_ENVIRON_ARRAY
3280af22 6497 if (gv == PL_envgv)
79072805 6498 environ[0] = Nullch;
a0d0e21e 6499#endif
79072805
LW
6500 }
6501 }
6502 }
6503 }
6504}
6505
645c22ef
DM
6506/*
6507=for apidoc sv_2io
6508
6509Using various gambits, try to get an IO from an SV: the IO slot if its a
6510GV; or the recursive result if we're an RV; or the IO slot of the symbol
6511named after the PV if we're a string.
6512
6513=cut
6514*/
6515
46fc3d4c 6516IO*
864dbfa3 6517Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 6518{
6519 IO* io;
6520 GV* gv;
2d8e6c8d 6521 STRLEN n_a;
46fc3d4c 6522
6523 switch (SvTYPE(sv)) {
6524 case SVt_PVIO:
6525 io = (IO*)sv;
6526 break;
6527 case SVt_PVGV:
6528 gv = (GV*)sv;
6529 io = GvIO(gv);
6530 if (!io)
cea2e8a9 6531 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 6532 break;
6533 default:
6534 if (!SvOK(sv))
cea2e8a9 6535 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 6536 if (SvROK(sv))
6537 return sv_2io(SvRV(sv));
2d8e6c8d 6538 gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
46fc3d4c 6539 if (gv)
6540 io = GvIO(gv);
6541 else
6542 io = 0;
6543 if (!io)
cea2e8a9 6544 Perl_croak(aTHX_ "Bad filehandle: %s", SvPV(sv,n_a));
46fc3d4c 6545 break;
6546 }
6547 return io;
6548}
6549
645c22ef
DM
6550/*
6551=for apidoc sv_2cv
6552
6553Using various gambits, try to get a CV from an SV; in addition, try if
6554possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
6555
6556=cut
6557*/
6558
79072805 6559CV *
864dbfa3 6560Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805
LW
6561{
6562 GV *gv;
6563 CV *cv;
2d8e6c8d 6564 STRLEN n_a;
79072805
LW
6565
6566 if (!sv)
93a17b20 6567 return *gvp = Nullgv, Nullcv;
79072805 6568 switch (SvTYPE(sv)) {
79072805
LW
6569 case SVt_PVCV:
6570 *st = CvSTASH(sv);
6571 *gvp = Nullgv;
6572 return (CV*)sv;
6573 case SVt_PVHV:
6574 case SVt_PVAV:
6575 *gvp = Nullgv;
6576 return Nullcv;
8990e307
LW
6577 case SVt_PVGV:
6578 gv = (GV*)sv;
a0d0e21e 6579 *gvp = gv;
8990e307
LW
6580 *st = GvESTASH(gv);
6581 goto fix_gv;
6582
79072805 6583 default:
a0d0e21e
LW
6584 if (SvGMAGICAL(sv))
6585 mg_get(sv);
6586 if (SvROK(sv)) {
f5284f61
IZ
6587 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
6588 tryAMAGICunDEREF(to_cv);
6589
62f274bf
GS
6590 sv = SvRV(sv);
6591 if (SvTYPE(sv) == SVt_PVCV) {
6592 cv = (CV*)sv;
6593 *gvp = Nullgv;
6594 *st = CvSTASH(cv);
6595 return cv;
6596 }
6597 else if(isGV(sv))
6598 gv = (GV*)sv;
6599 else
cea2e8a9 6600 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 6601 }
62f274bf 6602 else if (isGV(sv))
79072805
LW
6603 gv = (GV*)sv;
6604 else
2d8e6c8d 6605 gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
79072805
LW
6606 *gvp = gv;
6607 if (!gv)
6608 return Nullcv;
6609 *st = GvESTASH(gv);
8990e307 6610 fix_gv:
8ebc5c01 6611 if (lref && !GvCVu(gv)) {
4633a7c4 6612 SV *tmpsv;
748a9306 6613 ENTER;
4633a7c4 6614 tmpsv = NEWSV(704,0);
16660edb 6615 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
6616 /* XXX this is probably not what they think they're getting.
6617 * It has the same effect as "sub name;", i.e. just a forward
6618 * declaration! */
774d564b 6619 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
6620 newSVOP(OP_CONST, 0, tmpsv),
6621 Nullop,
8990e307 6622 Nullop);
748a9306 6623 LEAVE;
8ebc5c01 6624 if (!GvCVu(gv))
cea2e8a9 6625 Perl_croak(aTHX_ "Unable to create sub named \"%s\"", SvPV(sv,n_a));
8990e307 6626 }
8ebc5c01 6627 return GvCVu(gv);
79072805
LW
6628 }
6629}
6630
c461cf8f
JH
6631/*
6632=for apidoc sv_true
6633
6634Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
6635Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
6636instead use an in-line version.
c461cf8f
JH
6637
6638=cut
6639*/
6640
79072805 6641I32
864dbfa3 6642Perl_sv_true(pTHX_ register SV *sv)
79072805 6643{
8990e307
LW
6644 if (!sv)
6645 return 0;
79072805 6646 if (SvPOK(sv)) {
4e35701f
NIS
6647 register XPV* tXpv;
6648 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 6649 (tXpv->xpv_cur > 1 ||
4e35701f 6650 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
79072805
LW
6651 return 1;
6652 else
6653 return 0;
6654 }
6655 else {
6656 if (SvIOK(sv))
463ee0b2 6657 return SvIVX(sv) != 0;
79072805
LW
6658 else {
6659 if (SvNOK(sv))
463ee0b2 6660 return SvNVX(sv) != 0.0;
79072805 6661 else
463ee0b2 6662 return sv_2bool(sv);
79072805
LW
6663 }
6664 }
6665}
79072805 6666
645c22ef
DM
6667/*
6668=for apidoc sv_iv
6669
6670A private implementation of the C<SvIVx> macro for compilers which can't
6671cope with complex macro expressions. Always use the macro instead.
6672
6673=cut
6674*/
6675
ff68c719 6676IV
864dbfa3 6677Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 6678{
25da4f38
IZ
6679 if (SvIOK(sv)) {
6680 if (SvIsUV(sv))
6681 return (IV)SvUVX(sv);
ff68c719 6682 return SvIVX(sv);
25da4f38 6683 }
ff68c719 6684 return sv_2iv(sv);
85e6fe83 6685}
85e6fe83 6686
645c22ef
DM
6687/*
6688=for apidoc sv_uv
6689
6690A private implementation of the C<SvUVx> macro for compilers which can't
6691cope with complex macro expressions. Always use the macro instead.
6692
6693=cut
6694*/
6695
ff68c719 6696UV
864dbfa3 6697Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 6698{
25da4f38
IZ
6699 if (SvIOK(sv)) {
6700 if (SvIsUV(sv))
6701 return SvUVX(sv);
6702 return (UV)SvIVX(sv);
6703 }
ff68c719 6704 return sv_2uv(sv);
6705}
85e6fe83 6706
645c22ef
DM
6707/*
6708=for apidoc sv_nv
6709
6710A private implementation of the C<SvNVx> macro for compilers which can't
6711cope with complex macro expressions. Always use the macro instead.
6712
6713=cut
6714*/
6715
65202027 6716NV
864dbfa3 6717Perl_sv_nv(pTHX_ register SV *sv)
79072805 6718{
ff68c719 6719 if (SvNOK(sv))
6720 return SvNVX(sv);
6721 return sv_2nv(sv);
79072805 6722}
79072805 6723
645c22ef
DM
6724/*
6725=for apidoc sv_pv
6726
6727A private implementation of the C<SvPV_nolen> macro for compilers which can't
6728cope with complex macro expressions. Always use the macro instead.
6729
6730=cut
6731*/
6732
79072805 6733char *
864dbfa3 6734Perl_sv_pv(pTHX_ SV *sv)
1fa8b10d
JD
6735{
6736 STRLEN n_a;
6737
6738 if (SvPOK(sv))
6739 return SvPVX(sv);
6740
6741 return sv_2pv(sv, &n_a);
6742}
6743
645c22ef
DM
6744/*
6745=for apidoc sv_pvn
6746
6747A private implementation of the C<SvPV> macro for compilers which can't
6748cope with complex macro expressions. Always use the macro instead.
6749
6750=cut
6751*/
6752
1fa8b10d 6753char *
864dbfa3 6754Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 6755{
85e6fe83
LW
6756 if (SvPOK(sv)) {
6757 *lp = SvCUR(sv);
a0d0e21e 6758 return SvPVX(sv);
85e6fe83 6759 }
463ee0b2 6760 return sv_2pv(sv, lp);
79072805 6761}
79072805 6762
6e9d1081
NC
6763/* For -DCRIPPLED_CC only. See also C<sv_2pv_flags()>.
6764 */
6765
6766char *
6767Perl_sv_pvn_nomg(pTHX_ register SV *sv, STRLEN *lp)
6768{
6769 if (SvPOK(sv)) {
6770 *lp = SvCUR(sv);
6771 return SvPVX(sv);
6772 }
6773 return sv_2pv_flags(sv, lp, 0);
6774}
6775
c461cf8f
JH
6776/*
6777=for apidoc sv_pvn_force
6778
6779Get a sensible string out of the SV somehow.
645c22ef
DM
6780A private implementation of the C<SvPV_force> macro for compilers which
6781can't cope with complex macro expressions. Always use the macro instead.
c461cf8f
JH
6782
6783=cut
6784*/
6785
a0d0e21e 6786char *
864dbfa3 6787Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
a0d0e21e 6788{
36f65ada 6789 return sv_pvn_force_flags(sv, lp, SV_GMAGIC);
8d6d96c1
HS
6790}
6791
6792/*
6793=for apidoc sv_pvn_force_flags
6794
6795Get a sensible string out of the SV somehow.
6796If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
6797appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
6798implemented in terms of this function.
645c22ef
DM
6799You normally want to use the various wrapper macros instead: see
6800C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
6801
6802=cut
6803*/
6804
6805char *
6806Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
6807{
a0d0e21e
LW
6808 char *s;
6809
6fc92669
GS
6810 if (SvTHINKFIRST(sv) && !SvROK(sv))
6811 sv_force_normal(sv);
1c846c1f 6812
a0d0e21e
LW
6813 if (SvPOK(sv)) {
6814 *lp = SvCUR(sv);
6815 }
6816 else {
748a9306 6817 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 6818 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 6819 OP_NAME(PL_op));
a0d0e21e 6820 }
4633a7c4 6821 else
8d6d96c1 6822 s = sv_2pv_flags(sv, lp, flags);
a0d0e21e
LW
6823 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
6824 STRLEN len = *lp;
1c846c1f 6825
a0d0e21e
LW
6826 if (SvROK(sv))
6827 sv_unref(sv);
6828 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
6829 SvGROW(sv, len + 1);
6830 Move(s,SvPVX(sv),len,char);
6831 SvCUR_set(sv, len);
6832 *SvEND(sv) = '\0';
6833 }
6834 if (!SvPOK(sv)) {
6835 SvPOK_on(sv); /* validate pointer */
6836 SvTAINT(sv);
1d7c1841
GS
6837 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
6838 PTR2UV(sv),SvPVX(sv)));
a0d0e21e
LW
6839 }
6840 }
6841 return SvPVX(sv);
6842}
6843
645c22ef
DM
6844/*
6845=for apidoc sv_pvbyte
6846
6847A private implementation of the C<SvPVbyte_nolen> macro for compilers
6848which can't cope with complex macro expressions. Always use the macro
6849instead.
6850
6851=cut
6852*/
6853
a0d0e21e 6854char *
7340a771
GS
6855Perl_sv_pvbyte(pTHX_ SV *sv)
6856{
ffebcc3e 6857 sv_utf8_downgrade(sv,0);
7340a771
GS
6858 return sv_pv(sv);
6859}
6860
645c22ef
DM
6861/*
6862=for apidoc sv_pvbyten
6863
6864A private implementation of the C<SvPVbyte> macro for compilers
6865which can't cope with complex macro expressions. Always use the macro
6866instead.
6867
6868=cut
6869*/
6870
7340a771
GS
6871char *
6872Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
6873{
ffebcc3e 6874 sv_utf8_downgrade(sv,0);
7340a771
GS
6875 return sv_pvn(sv,lp);
6876}
6877
645c22ef
DM
6878/*
6879=for apidoc sv_pvbyten_force
6880
6881A private implementation of the C<SvPVbytex_force> macro for compilers
6882which can't cope with complex macro expressions. Always use the macro
6883instead.
6884
6885=cut
6886*/
6887
7340a771
GS
6888char *
6889Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
6890{
ffebcc3e 6891 sv_utf8_downgrade(sv,0);
7340a771
GS
6892 return sv_pvn_force(sv,lp);
6893}
6894
645c22ef
DM
6895/*
6896=for apidoc sv_pvutf8
6897
6898A private implementation of the C<SvPVutf8_nolen> macro for compilers
6899which can't cope with complex macro expressions. Always use the macro
6900instead.
6901
6902=cut
6903*/
6904
7340a771
GS
6905char *
6906Perl_sv_pvutf8(pTHX_ SV *sv)
6907{
560a288e 6908 sv_utf8_upgrade(sv);
7340a771
GS
6909 return sv_pv(sv);
6910}
6911
645c22ef
DM
6912/*
6913=for apidoc sv_pvutf8n
6914
6915A private implementation of the C<SvPVutf8> macro for compilers
6916which can't cope with complex macro expressions. Always use the macro
6917instead.
6918
6919=cut
6920*/
6921
7340a771
GS
6922char *
6923Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
6924{
560a288e 6925 sv_utf8_upgrade(sv);
7340a771
GS
6926 return sv_pvn(sv,lp);
6927}
6928
c461cf8f
JH
6929/*
6930=for apidoc sv_pvutf8n_force
6931
645c22ef
DM
6932A private implementation of the C<SvPVutf8_force> macro for compilers
6933which can't cope with complex macro expressions. Always use the macro
6934instead.
c461cf8f
JH
6935
6936=cut
6937*/
6938
7340a771
GS
6939char *
6940Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
6941{
560a288e 6942 sv_utf8_upgrade(sv);
7340a771
GS
6943 return sv_pvn_force(sv,lp);
6944}
6945
c461cf8f
JH
6946/*
6947=for apidoc sv_reftype
6948
6949Returns a string describing what the SV is a reference to.
6950
6951=cut
6952*/
6953
7340a771 6954char *
864dbfa3 6955Perl_sv_reftype(pTHX_ SV *sv, int ob)
a0d0e21e 6956{
c86bf373
AMS
6957 if (ob && SvOBJECT(sv)) {
6958 HV *svs = SvSTASH(sv);
6959 /* [20011101.072] This bandaid for C<package;> should eventually
6960 be removed. AMS 20011103 */
6961 return (svs ? HvNAME(svs) : "<none>");
6962 }
a0d0e21e
LW
6963 else {
6964 switch (SvTYPE(sv)) {
6965 case SVt_NULL:
6966 case SVt_IV:
6967 case SVt_NV:
6968 case SVt_RV:
6969 case SVt_PV:
6970 case SVt_PVIV:
6971 case SVt_PVNV:
6972 case SVt_PVMG:
6973 case SVt_PVBM:
6974 if (SvROK(sv))
6975 return "REF";
6976 else
6977 return "SCALAR";
6978 case SVt_PVLV: return "LVALUE";
6979 case SVt_PVAV: return "ARRAY";
6980 case SVt_PVHV: return "HASH";
6981 case SVt_PVCV: return "CODE";
6982 case SVt_PVGV: return "GLOB";
1d2dff63 6983 case SVt_PVFM: return "FORMAT";
27f9d8f3 6984 case SVt_PVIO: return "IO";
a0d0e21e
LW
6985 default: return "UNKNOWN";
6986 }
6987 }
6988}
6989
954c1994
GS
6990/*
6991=for apidoc sv_isobject
6992
6993Returns a boolean indicating whether the SV is an RV pointing to a blessed
6994object. If the SV is not an RV, or if the object is not blessed, then this
6995will return false.
6996
6997=cut
6998*/
6999
463ee0b2 7000int
864dbfa3 7001Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 7002{
68dc0745 7003 if (!sv)
7004 return 0;
7005 if (SvGMAGICAL(sv))
7006 mg_get(sv);
85e6fe83
LW
7007 if (!SvROK(sv))
7008 return 0;
7009 sv = (SV*)SvRV(sv);
7010 if (!SvOBJECT(sv))
7011 return 0;
7012 return 1;
7013}
7014
954c1994
GS
7015/*
7016=for apidoc sv_isa
7017
7018Returns a boolean indicating whether the SV is blessed into the specified
7019class. This does not check for subtypes; use C<sv_derived_from> to verify
7020an inheritance relationship.
7021
7022=cut
7023*/
7024
85e6fe83 7025int
864dbfa3 7026Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 7027{
68dc0745 7028 if (!sv)
7029 return 0;
7030 if (SvGMAGICAL(sv))
7031 mg_get(sv);
ed6116ce 7032 if (!SvROK(sv))
463ee0b2 7033 return 0;
ed6116ce
LW
7034 sv = (SV*)SvRV(sv);
7035 if (!SvOBJECT(sv))
463ee0b2
LW
7036 return 0;
7037
7038 return strEQ(HvNAME(SvSTASH(sv)), name);
7039}
7040
954c1994
GS
7041/*
7042=for apidoc newSVrv
7043
7044Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
7045it will be upgraded to one. If C<classname> is non-null then the new SV will
7046be blessed in the specified package. The new SV is returned and its
7047reference count is 1.
7048
7049=cut
7050*/
7051
463ee0b2 7052SV*
864dbfa3 7053Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 7054{
463ee0b2
LW
7055 SV *sv;
7056
4561caa4 7057 new_SV(sv);
51cf62d8 7058
2213622d 7059 SV_CHECK_THINKFIRST(rv);
51cf62d8 7060 SvAMAGIC_off(rv);
51cf62d8 7061
0199fce9
JD
7062 if (SvTYPE(rv) >= SVt_PVMG) {
7063 U32 refcnt = SvREFCNT(rv);
7064 SvREFCNT(rv) = 0;
7065 sv_clear(rv);
7066 SvFLAGS(rv) = 0;
7067 SvREFCNT(rv) = refcnt;
7068 }
7069
51cf62d8 7070 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
7071 sv_upgrade(rv, SVt_RV);
7072 else if (SvTYPE(rv) > SVt_RV) {
7073 (void)SvOOK_off(rv);
7074 if (SvPVX(rv) && SvLEN(rv))
7075 Safefree(SvPVX(rv));
7076 SvCUR_set(rv, 0);
7077 SvLEN_set(rv, 0);
7078 }
51cf62d8
OT
7079
7080 (void)SvOK_off(rv);
053fc874 7081 SvRV(rv) = sv;
ed6116ce 7082 SvROK_on(rv);
463ee0b2 7083
a0d0e21e
LW
7084 if (classname) {
7085 HV* stash = gv_stashpv(classname, TRUE);
7086 (void)sv_bless(rv, stash);
7087 }
7088 return sv;
7089}
7090
954c1994
GS
7091/*
7092=for apidoc sv_setref_pv
7093
7094Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
7095argument will be upgraded to an RV. That RV will be modified to point to
7096the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7097into the SV. The C<classname> argument indicates the package for the
7098blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7099will be returned and will have a reference count of 1.
7100
7101Do not use with other Perl types such as HV, AV, SV, CV, because those
7102objects will become corrupted by the pointer copy process.
7103
7104Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7105
7106=cut
7107*/
7108
a0d0e21e 7109SV*
864dbfa3 7110Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 7111{
189b2af5 7112 if (!pv) {
3280af22 7113 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
7114 SvSETMAGIC(rv);
7115 }
a0d0e21e 7116 else
56431972 7117 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
7118 return rv;
7119}
7120
954c1994
GS
7121/*
7122=for apidoc sv_setref_iv
7123
7124Copies an integer into a new SV, optionally blessing the SV. The C<rv>
7125argument will be upgraded to an RV. That RV will be modified to point to
7126the new SV. The C<classname> argument indicates the package for the
7127blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7128will be returned and will have a reference count of 1.
7129
7130=cut
7131*/
7132
a0d0e21e 7133SV*
864dbfa3 7134Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
7135{
7136 sv_setiv(newSVrv(rv,classname), iv);
7137 return rv;
7138}
7139
954c1994 7140/*
e1c57cef
JH
7141=for apidoc sv_setref_uv
7142
7143Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
7144argument will be upgraded to an RV. That RV will be modified to point to
7145the new SV. The C<classname> argument indicates the package for the
7146blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7147will be returned and will have a reference count of 1.
7148
7149=cut
7150*/
7151
7152SV*
7153Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
7154{
7155 sv_setuv(newSVrv(rv,classname), uv);
7156 return rv;
7157}
7158
7159/*
954c1994
GS
7160=for apidoc sv_setref_nv
7161
7162Copies a double into a new SV, optionally blessing the SV. The C<rv>
7163argument will be upgraded to an RV. That RV will be modified to point to
7164the new SV. The C<classname> argument indicates the package for the
7165blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7166will be returned and will have a reference count of 1.
7167
7168=cut
7169*/
7170
a0d0e21e 7171SV*
65202027 7172Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
7173{
7174 sv_setnv(newSVrv(rv,classname), nv);
7175 return rv;
7176}
463ee0b2 7177
954c1994
GS
7178/*
7179=for apidoc sv_setref_pvn
7180
7181Copies a string into a new SV, optionally blessing the SV. The length of the
7182string must be specified with C<n>. The C<rv> argument will be upgraded to
7183an RV. That RV will be modified to point to the new SV. The C<classname>
7184argument indicates the package for the blessing. Set C<classname> to
7185C<Nullch> to avoid the blessing. The new SV will be returned and will have
7186a reference count of 1.
7187
7188Note that C<sv_setref_pv> copies the pointer while this copies the string.
7189
7190=cut
7191*/
7192
a0d0e21e 7193SV*
864dbfa3 7194Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
7195{
7196 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
7197 return rv;
7198}
7199
954c1994
GS
7200/*
7201=for apidoc sv_bless
7202
7203Blesses an SV into a specified package. The SV must be an RV. The package
7204must be designated by its stash (see C<gv_stashpv()>). The reference count
7205of the SV is unaffected.
7206
7207=cut
7208*/
7209
a0d0e21e 7210SV*
864dbfa3 7211Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 7212{
76e3520e 7213 SV *tmpRef;
a0d0e21e 7214 if (!SvROK(sv))
cea2e8a9 7215 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
7216 tmpRef = SvRV(sv);
7217 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
7218 if (SvREADONLY(tmpRef))
cea2e8a9 7219 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
7220 if (SvOBJECT(tmpRef)) {
7221 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7222 --PL_sv_objcount;
76e3520e 7223 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 7224 }
a0d0e21e 7225 }
76e3520e
GS
7226 SvOBJECT_on(tmpRef);
7227 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7228 ++PL_sv_objcount;
76e3520e
GS
7229 (void)SvUPGRADE(tmpRef, SVt_PVMG);
7230 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
a0d0e21e 7231
2e3febc6
CS
7232 if (Gv_AMG(stash))
7233 SvAMAGIC_on(sv);
7234 else
7235 SvAMAGIC_off(sv);
a0d0e21e 7236
1edbfb88
AB
7237 if(SvSMAGICAL(tmpRef))
7238 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
7239 mg_set(tmpRef);
7240
7241
ecdeb87c 7242
a0d0e21e
LW
7243 return sv;
7244}
7245
645c22ef
DM
7246/* Downgrades a PVGV to a PVMG.
7247 *
7248 * XXX This function doesn't actually appear to be used anywhere
7249 * DAPM 15-Jun-01
7250 */
7251
76e3520e 7252STATIC void
cea2e8a9 7253S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 7254{
850fabdf
GS
7255 void *xpvmg;
7256
a0d0e21e
LW
7257 assert(SvTYPE(sv) == SVt_PVGV);
7258 SvFAKE_off(sv);
7259 if (GvGP(sv))
1edc1566 7260 gp_free((GV*)sv);
e826b3c7
GS
7261 if (GvSTASH(sv)) {
7262 SvREFCNT_dec(GvSTASH(sv));
7263 GvSTASH(sv) = Nullhv;
7264 }
14befaf4 7265 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 7266 Safefree(GvNAME(sv));
a5f75d66 7267 GvMULTI_off(sv);
850fabdf
GS
7268
7269 /* need to keep SvANY(sv) in the right arena */
7270 xpvmg = new_XPVMG();
7271 StructCopy(SvANY(sv), xpvmg, XPVMG);
7272 del_XPVGV(SvANY(sv));
7273 SvANY(sv) = xpvmg;
7274
a0d0e21e
LW
7275 SvFLAGS(sv) &= ~SVTYPEMASK;
7276 SvFLAGS(sv) |= SVt_PVMG;
7277}
7278
954c1994 7279/*
840a7b70 7280=for apidoc sv_unref_flags
954c1994
GS
7281
7282Unsets the RV status of the SV, and decrements the reference count of
7283whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
7284as a reversal of C<newSVrv>. The C<cflags> argument can contain
7285C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
7286(otherwise the decrementing is conditional on the reference count being
7287different from one or the reference being a readonly SV).
7889fe52 7288See C<SvROK_off>.
954c1994
GS
7289
7290=cut
7291*/
7292
ed6116ce 7293void
840a7b70 7294Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 7295{
a0d0e21e 7296 SV* rv = SvRV(sv);
810b8aa5
GS
7297
7298 if (SvWEAKREF(sv)) {
7299 sv_del_backref(sv);
7300 SvWEAKREF_off(sv);
7301 SvRV(sv) = 0;
7302 return;
7303 }
ed6116ce
LW
7304 SvRV(sv) = 0;
7305 SvROK_off(sv);
840a7b70 7306 if (SvREFCNT(rv) != 1 || SvREADONLY(rv) || flags) /* SV_IMMEDIATE_UNREF */
4633a7c4 7307 SvREFCNT_dec(rv);
840a7b70 7308 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 7309 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 7310}
8990e307 7311
840a7b70
IZ
7312/*
7313=for apidoc sv_unref
7314
7315Unsets the RV status of the SV, and decrements the reference count of
7316whatever was being referenced by the RV. This can almost be thought of
7317as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 7318being zero. See C<SvROK_off>.
840a7b70
IZ
7319
7320=cut
7321*/
7322
7323void
7324Perl_sv_unref(pTHX_ SV *sv)
7325{
7326 sv_unref_flags(sv, 0);
7327}
7328
645c22ef
DM
7329/*
7330=for apidoc sv_taint
7331
7332Taint an SV. Use C<SvTAINTED_on> instead.
7333=cut
7334*/
7335
bbce6d69 7336void
864dbfa3 7337Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 7338{
14befaf4 7339 sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
bbce6d69 7340}
7341
645c22ef
DM
7342/*
7343=for apidoc sv_untaint
7344
7345Untaint an SV. Use C<SvTAINTED_off> instead.
7346=cut
7347*/
7348
bbce6d69 7349void
864dbfa3 7350Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 7351{
13f57bf8 7352 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 7353 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 7354 if (mg)
565764a8 7355 mg->mg_len &= ~1;
36477c24 7356 }
bbce6d69 7357}
7358
645c22ef
DM
7359/*
7360=for apidoc sv_tainted
7361
7362Test an SV for taintedness. Use C<SvTAINTED> instead.
7363=cut
7364*/
7365
bbce6d69 7366bool
864dbfa3 7367Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 7368{
13f57bf8 7369 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 7370 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
155aba94 7371 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 7372 return TRUE;
7373 }
7374 return FALSE;
bbce6d69 7375}
7376
954c1994
GS
7377/*
7378=for apidoc sv_setpviv
7379
7380Copies an integer into the given SV, also updating its string value.
7381Does not handle 'set' magic. See C<sv_setpviv_mg>.
7382
7383=cut
7384*/
7385
84902520 7386void
864dbfa3 7387Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
84902520 7388{
25da4f38
IZ
7389 char buf[TYPE_CHARS(UV)];
7390 char *ebuf;
7391 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
84902520 7392
25da4f38 7393 sv_setpvn(sv, ptr, ebuf - ptr);
84902520
TB
7394}
7395
954c1994
GS
7396/*
7397=for apidoc sv_setpviv_mg
7398
7399Like C<sv_setpviv>, but also handles 'set' magic.
7400
7401=cut
7402*/
7403
ef50df4b 7404void
864dbfa3 7405Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
ef50df4b 7406{
25da4f38
IZ
7407 char buf[TYPE_CHARS(UV)];
7408 char *ebuf;
7409 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
7410
7411 sv_setpvn(sv, ptr, ebuf - ptr);
ef50df4b
GS
7412 SvSETMAGIC(sv);
7413}
7414
cea2e8a9 7415#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7416
7417/* pTHX_ magic can't cope with varargs, so this is a no-context
7418 * version of the main function, (which may itself be aliased to us).
7419 * Don't access this version directly.
7420 */
7421
cea2e8a9
GS
7422void
7423Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
7424{
7425 dTHX;
7426 va_list args;
7427 va_start(args, pat);
c5be433b 7428 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
7429 va_end(args);
7430}
7431
645c22ef
DM
7432/* pTHX_ magic can't cope with varargs, so this is a no-context
7433 * version of the main function, (which may itself be aliased to us).
7434 * Don't access this version directly.
7435 */
cea2e8a9
GS
7436
7437void
7438Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
7439{
7440 dTHX;
7441 va_list args;
7442 va_start(args, pat);
c5be433b 7443 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 7444 va_end(args);
cea2e8a9
GS
7445}
7446#endif
7447
954c1994
GS
7448/*
7449=for apidoc sv_setpvf
7450
7451Processes its arguments like C<sprintf> and sets an SV to the formatted
7452output. Does not handle 'set' magic. See C<sv_setpvf_mg>.
7453
7454=cut
7455*/
7456
46fc3d4c 7457void
864dbfa3 7458Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 7459{
7460 va_list args;
46fc3d4c 7461 va_start(args, pat);
c5be433b 7462 sv_vsetpvf(sv, pat, &args);
46fc3d4c 7463 va_end(args);
7464}
7465
645c22ef
DM
7466/* backend for C<sv_setpvf> and C<sv_setpvf_nocontext> */
7467
c5be433b
GS
7468void
7469Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7470{
7471 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7472}
ef50df4b 7473
954c1994
GS
7474/*
7475=for apidoc sv_setpvf_mg
7476
7477Like C<sv_setpvf>, but also handles 'set' magic.
7478
7479=cut
7480*/
7481
ef50df4b 7482void
864dbfa3 7483Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
7484{
7485 va_list args;
ef50df4b 7486 va_start(args, pat);
c5be433b 7487 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 7488 va_end(args);
c5be433b
GS
7489}
7490
645c22ef
DM
7491/* backend for C<sv_setpvf_mg> C<setpvf_mg_nocontext> */
7492
c5be433b
GS
7493void
7494Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7495{
7496 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
7497 SvSETMAGIC(sv);
7498}
7499
cea2e8a9 7500#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7501
7502/* pTHX_ magic can't cope with varargs, so this is a no-context
7503 * version of the main function, (which may itself be aliased to us).
7504 * Don't access this version directly.
7505 */
7506
cea2e8a9
GS
7507void
7508Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
7509{
7510 dTHX;
7511 va_list args;
7512 va_start(args, pat);
c5be433b 7513 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
7514 va_end(args);
7515}
7516
645c22ef
DM
7517/* pTHX_ magic can't cope with varargs, so this is a no-context
7518 * version of the main function, (which may itself be aliased to us).
7519 * Don't access this version directly.
7520 */
7521
cea2e8a9
GS
7522void
7523Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
7524{
7525 dTHX;
7526 va_list args;
7527 va_start(args, pat);
c5be433b 7528 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 7529 va_end(args);
cea2e8a9
GS
7530}
7531#endif
7532
954c1994
GS
7533/*
7534=for apidoc sv_catpvf
7535
d5ce4a7c
GA
7536Processes its arguments like C<sprintf> and appends the formatted
7537output to an SV. If the appended data contains "wide" characters
7538(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
7539and characters >255 formatted with %c), the original SV might get
7540upgraded to UTF-8. Handles 'get' magic, but not 'set' magic.
7541C<SvSETMAGIC()> must typically be called after calling this function
7542to handle 'set' magic.
954c1994 7543
d5ce4a7c 7544=cut */
954c1994 7545
46fc3d4c 7546void
864dbfa3 7547Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 7548{
7549 va_list args;
46fc3d4c 7550 va_start(args, pat);
c5be433b 7551 sv_vcatpvf(sv, pat, &args);
46fc3d4c 7552 va_end(args);
7553}
7554
645c22ef
DM
7555/* backend for C<sv_catpvf> and C<catpvf_mg_nocontext> */
7556
ef50df4b 7557void
c5be433b
GS
7558Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7559{
7560 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7561}
7562
954c1994
GS
7563/*
7564=for apidoc sv_catpvf_mg
7565
7566Like C<sv_catpvf>, but also handles 'set' magic.
7567
7568=cut
7569*/
7570
c5be433b 7571void
864dbfa3 7572Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
7573{
7574 va_list args;
ef50df4b 7575 va_start(args, pat);
c5be433b 7576 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 7577 va_end(args);
c5be433b
GS
7578}
7579
645c22ef
DM
7580/* backend for C<catpvf_mg> and C<catpvf_mg_nocontext> */
7581
c5be433b
GS
7582void
7583Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7584{
7585 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
7586 SvSETMAGIC(sv);
7587}
7588
954c1994
GS
7589/*
7590=for apidoc sv_vsetpvfn
7591
7592Works like C<vcatpvfn> but copies the text into the SV instead of
7593appending it.
7594
645c22ef
DM
7595Usually used via one of its frontends C<sv_setpvf> and C<sv_setpvf_mg>.
7596
954c1994
GS
7597=cut
7598*/
7599
46fc3d4c 7600void
7d5ea4e7 7601Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 7602{
7603 sv_setpvn(sv, "", 0);
7d5ea4e7 7604 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 7605}
7606
645c22ef
DM
7607/* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
7608
2d00ba3b 7609STATIC I32
9dd79c3f 7610S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
7611{
7612 I32 var = 0;
7613 switch (**pattern) {
7614 case '1': case '2': case '3':
7615 case '4': case '5': case '6':
7616 case '7': case '8': case '9':
7617 while (isDIGIT(**pattern))
7618 var = var * 10 + (*(*pattern)++ - '0');
7619 }
7620 return var;
7621}
9dd79c3f 7622#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 7623
954c1994
GS
7624/*
7625=for apidoc sv_vcatpvfn
7626
7627Processes its arguments like C<vsprintf> and appends the formatted output
7628to an SV. Uses an array of SVs if the C style variable argument list is
7629missing (NULL). When running with taint checks enabled, indicates via
7630C<maybe_tainted> if results are untrustworthy (often due to the use of
7631locales).
7632
645c22ef
DM
7633Usually used via one of its frontends C<sv_catpvf> and C<sv_catpvf_mg>.
7634
954c1994
GS
7635=cut
7636*/
7637
46fc3d4c 7638void
7d5ea4e7 7639Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 7640{
7641 char *p;
7642 char *q;
7643 char *patend;
fc36a67e 7644 STRLEN origlen;
46fc3d4c 7645 I32 svix = 0;
c635e13b 7646 static char nullstr[] = "(null)";
9c5ffd7c 7647 SV *argsv = Nullsv;
46fc3d4c 7648
7649 /* no matter what, this is a string now */
fc36a67e 7650 (void)SvPV_force(sv, origlen);
46fc3d4c 7651
fc36a67e 7652 /* special-case "", "%s", and "%_" */
46fc3d4c 7653 if (patlen == 0)
7654 return;
fc36a67e 7655 if (patlen == 2 && pat[0] == '%') {
7656 switch (pat[1]) {
7657 case 's':
c635e13b 7658 if (args) {
7659 char *s = va_arg(*args, char*);
7660 sv_catpv(sv, s ? s : nullstr);
7661 }
7e2040f0 7662 else if (svix < svmax) {
fc36a67e 7663 sv_catsv(sv, *svargs);
7e2040f0
GS
7664 if (DO_UTF8(*svargs))
7665 SvUTF8_on(sv);
7666 }
fc36a67e 7667 return;
7668 case '_':
7669 if (args) {
7e2040f0
GS
7670 argsv = va_arg(*args, SV*);
7671 sv_catsv(sv, argsv);
7672 if (DO_UTF8(argsv))
7673 SvUTF8_on(sv);
fc36a67e 7674 return;
7675 }
7676 /* See comment on '_' below */
7677 break;
7678 }
46fc3d4c 7679 }
7680
7681 patend = (char*)pat + patlen;
7682 for (p = (char*)pat; p < patend; p = q) {
7683 bool alt = FALSE;
7684 bool left = FALSE;
b22c7a20 7685 bool vectorize = FALSE;
211dfcf1 7686 bool vectorarg = FALSE;
b2e23cf9 7687 bool vec_utf = FALSE;
46fc3d4c 7688 char fill = ' ';
7689 char plus = 0;
7690 char intsize = 0;
7691 STRLEN width = 0;
fc36a67e 7692 STRLEN zeros = 0;
46fc3d4c 7693 bool has_precis = FALSE;
7694 STRLEN precis = 0;
7e2040f0 7695 bool is_utf = FALSE;
eb3fce90 7696
46fc3d4c 7697 char esignbuf[4];
ad391ad9 7698 U8 utf8buf[UTF8_MAXLEN+1];
46fc3d4c 7699 STRLEN esignlen = 0;
7700
7701 char *eptr = Nullch;
fc36a67e 7702 STRLEN elen = 0;
089c015b
JH
7703 /* Times 4: a decimal digit takes more than 3 binary digits.
7704 * NV_DIG: mantissa takes than many decimal digits.
7705 * Plus 32: Playing safe. */
7706 char ebuf[IV_DIG * 4 + NV_DIG + 32];
2d4389e4
JH
7707 /* large enough for "%#.#f" --chip */
7708 /* what about long double NVs? --jhi */
b22c7a20
GS
7709
7710 SV *vecsv;
a05b299f 7711 U8 *vecstr = Null(U8*);
b22c7a20 7712 STRLEN veclen = 0;
46fc3d4c 7713 char c;
7714 int i;
9c5ffd7c 7715 unsigned base = 0;
8c8eb53c
RB
7716 IV iv = 0;
7717 UV uv = 0;
65202027 7718 NV nv;
46fc3d4c 7719 STRLEN have;
7720 STRLEN need;
7721 STRLEN gap;
b22c7a20
GS
7722 char *dotstr = ".";
7723 STRLEN dotstrlen = 1;
211dfcf1 7724 I32 efix = 0; /* explicit format parameter index */
eb3fce90 7725 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
7726 I32 epix = 0; /* explicit precision index */
7727 I32 evix = 0; /* explicit vector index */
eb3fce90 7728 bool asterisk = FALSE;
46fc3d4c 7729
211dfcf1 7730 /* echo everything up to the next format specification */
46fc3d4c 7731 for (q = p; q < patend && *q != '%'; ++q) ;
7732 if (q > p) {
7733 sv_catpvn(sv, p, q - p);
7734 p = q;
7735 }
7736 if (q++ >= patend)
7737 break;
7738
211dfcf1
HS
7739/*
7740 We allow format specification elements in this order:
7741 \d+\$ explicit format parameter index
7742 [-+ 0#]+ flags
7743 \*?(\d+\$)?v vector with optional (optionally specified) arg
7744 \d+|\*(\d+\$)? width using optional (optionally specified) arg
7745 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
7746 [hlqLV] size
7747 [%bcdefginopsux_DFOUX] format (mandatory)
7748*/
7749 if (EXPECT_NUMBER(q, width)) {
7750 if (*q == '$') {
7751 ++q;
7752 efix = width;
7753 } else {
7754 goto gotwidth;
7755 }
7756 }
7757
fc36a67e 7758 /* FLAGS */
7759
46fc3d4c 7760 while (*q) {
7761 switch (*q) {
7762 case ' ':
7763 case '+':
7764 plus = *q++;
7765 continue;
7766
7767 case '-':
7768 left = TRUE;
7769 q++;
7770 continue;
7771
7772 case '0':
7773 fill = *q++;
7774 continue;
7775
7776 case '#':
7777 alt = TRUE;
7778 q++;
7779 continue;
7780
fc36a67e 7781 default:
7782 break;
7783 }
7784 break;
7785 }
46fc3d4c 7786
211dfcf1 7787 tryasterisk:
eb3fce90 7788 if (*q == '*') {
211dfcf1
HS
7789 q++;
7790 if (EXPECT_NUMBER(q, ewix))
7791 if (*q++ != '$')
7792 goto unknown;
eb3fce90 7793 asterisk = TRUE;
211dfcf1
HS
7794 }
7795 if (*q == 'v') {
eb3fce90 7796 q++;
211dfcf1
HS
7797 if (vectorize)
7798 goto unknown;
9cbac4c7 7799 if ((vectorarg = asterisk)) {
211dfcf1
HS
7800 evix = ewix;
7801 ewix = 0;
7802 asterisk = FALSE;
7803 }
7804 vectorize = TRUE;
7805 goto tryasterisk;
eb3fce90
JH
7806 }
7807
211dfcf1
HS
7808 if (!asterisk)
7809 EXPECT_NUMBER(q, width);
7810
7811 if (vectorize) {
7812 if (vectorarg) {
7813 if (args)
7814 vecsv = va_arg(*args, SV*);
7815 else
7816 vecsv = (evix ? evix <= svmax : svix < svmax) ?
7817 svargs[ewix ? ewix-1 : svix++] : &PL_sv_undef;
4459522c 7818 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1
HS
7819 if (DO_UTF8(vecsv))
7820 is_utf = TRUE;
7821 }
7822 if (args) {
7823 vecsv = va_arg(*args, SV*);
7824 vecstr = (U8*)SvPVx(vecsv,veclen);
b2e23cf9 7825 vec_utf = DO_UTF8(vecsv);
eb3fce90 7826 }
211dfcf1
HS
7827 else if (efix ? efix <= svmax : svix < svmax) {
7828 vecsv = svargs[efix ? efix-1 : svix++];
7829 vecstr = (U8*)SvPVx(vecsv,veclen);
b2e23cf9 7830 vec_utf = DO_UTF8(vecsv);
211dfcf1
HS
7831 }
7832 else {
7833 vecstr = (U8*)"";
7834 veclen = 0;
7835 }
eb3fce90 7836 }
fc36a67e 7837
eb3fce90 7838 if (asterisk) {
fc36a67e 7839 if (args)
7840 i = va_arg(*args, int);
7841 else
eb3fce90
JH
7842 i = (ewix ? ewix <= svmax : svix < svmax) ?
7843 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 7844 left |= (i < 0);
7845 width = (i < 0) ? -i : i;
fc36a67e 7846 }
211dfcf1 7847 gotwidth:
fc36a67e 7848
7849 /* PRECISION */
46fc3d4c 7850
fc36a67e 7851 if (*q == '.') {
7852 q++;
7853 if (*q == '*') {
211dfcf1 7854 q++;
497b47a8 7855 if (EXPECT_NUMBER(q, epix) && *q++ != '$') /* epix currently unused */
211dfcf1 7856 goto unknown;
46fc3d4c 7857 if (args)
7858 i = va_arg(*args, int);
7859 else
eb3fce90
JH
7860 i = (ewix ? ewix <= svmax : svix < svmax)
7861 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 7862 precis = (i < 0) ? 0 : i;
fc36a67e 7863 }
7864 else {
7865 precis = 0;
7866 while (isDIGIT(*q))
7867 precis = precis * 10 + (*q++ - '0');
7868 }
7869 has_precis = TRUE;
7870 }
46fc3d4c 7871
fc36a67e 7872 /* SIZE */
46fc3d4c 7873
fc36a67e 7874 switch (*q) {
e5c81feb 7875#if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
6f9bb7fd 7876 case 'L': /* Ld */
e5c81feb
JH
7877 /* FALL THROUGH */
7878#endif
7879#ifdef HAS_QUAD
6f9bb7fd
GS
7880 case 'q': /* qd */
7881 intsize = 'q';
7882 q++;
7883 break;
7884#endif
fc36a67e 7885 case 'l':
e5c81feb
JH
7886#if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
7887 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 7888 intsize = 'q';
7889 q += 2;
46fc3d4c 7890 break;
cf2093f6 7891 }
fc36a67e 7892#endif
6f9bb7fd 7893 /* FALL THROUGH */
fc36a67e 7894 case 'h':
cf2093f6 7895 /* FALL THROUGH */
fc36a67e 7896 case 'V':
7897 intsize = *q++;
46fc3d4c 7898 break;
7899 }
7900
fc36a67e 7901 /* CONVERSION */
7902
211dfcf1
HS
7903 if (*q == '%') {
7904 eptr = q++;
7905 elen = 1;
7906 goto string;
7907 }
7908
7909 if (!args)
7910 argsv = (efix ? efix <= svmax : svix < svmax) ?
7911 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
7912
46fc3d4c 7913 switch (c = *q++) {
7914
7915 /* STRINGS */
7916
46fc3d4c 7917 case 'c':
211dfcf1 7918 uv = args ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
7919 if ((uv > 255 ||
7920 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 7921 && !IN_BYTES) {
dfe13c55 7922 eptr = (char*)utf8buf;
9041c2e3 7923 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
7e2040f0
GS
7924 is_utf = TRUE;
7925 }
7926 else {
7927 c = (char)uv;
7928 eptr = &c;
7929 elen = 1;
a0ed51b3 7930 }
46fc3d4c 7931 goto string;
7932
46fc3d4c 7933 case 's':
7934 if (args) {
fc36a67e 7935 eptr = va_arg(*args, char*);
c635e13b 7936 if (eptr)
1d7c1841
GS
7937#ifdef MACOS_TRADITIONAL
7938 /* On MacOS, %#s format is used for Pascal strings */
7939 if (alt)
7940 elen = *eptr++;
7941 else
7942#endif
c635e13b 7943 elen = strlen(eptr);
7944 else {
7945 eptr = nullstr;
7946 elen = sizeof nullstr - 1;
7947 }
46fc3d4c 7948 }
211dfcf1 7949 else {
7e2040f0
GS
7950 eptr = SvPVx(argsv, elen);
7951 if (DO_UTF8(argsv)) {
a0ed51b3
LW
7952 if (has_precis && precis < elen) {
7953 I32 p = precis;
7e2040f0 7954 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
7955 precis = p;
7956 }
7957 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 7958 width += elen - sv_len_utf8(argsv);
a0ed51b3 7959 }
7e2040f0 7960 is_utf = TRUE;
a0ed51b3
LW
7961 }
7962 }
46fc3d4c 7963 goto string;
7964
fc36a67e 7965 case '_':
7966 /*
7967 * The "%_" hack might have to be changed someday,
7968 * if ISO or ANSI decide to use '_' for something.
7969 * So we keep it hidden from users' code.
7970 */
7971 if (!args)
7972 goto unknown;
211dfcf1 7973 argsv = va_arg(*args, SV*);
7e2040f0
GS
7974 eptr = SvPVx(argsv, elen);
7975 if (DO_UTF8(argsv))
7976 is_utf = TRUE;
fc36a67e 7977
46fc3d4c 7978 string:
b22c7a20 7979 vectorize = FALSE;
46fc3d4c 7980 if (has_precis && elen > precis)
7981 elen = precis;
7982 break;
7983
7984 /* INTEGERS */
7985
fc36a67e 7986 case 'p':
c2e66d9e
GS
7987 if (alt)
7988 goto unknown;
211dfcf1 7989 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 7990 base = 16;
7991 goto integer;
7992
46fc3d4c 7993 case 'D':
29fe7a80 7994#ifdef IV_IS_QUAD
22f3ae8c 7995 intsize = 'q';
29fe7a80 7996#else
46fc3d4c 7997 intsize = 'l';
29fe7a80 7998#endif
46fc3d4c 7999 /* FALL THROUGH */
8000 case 'd':
8001 case 'i':
b22c7a20 8002 if (vectorize) {
ba210ebe 8003 STRLEN ulen;
211dfcf1
HS
8004 if (!veclen)
8005 continue;
b2e23cf9 8006 if (vec_utf)
e83d50c9 8007 uv = utf8n_to_uvchr(vecstr, veclen, &ulen, UTF8_ALLOW_ANYUV);
b22c7a20 8008 else {
e83d50c9 8009 uv = *vecstr;
b22c7a20
GS
8010 ulen = 1;
8011 }
8012 vecstr += ulen;
8013 veclen -= ulen;
e83d50c9
JP
8014 if (plus)
8015 esignbuf[esignlen++] = plus;
b22c7a20
GS
8016 }
8017 else if (args) {
46fc3d4c 8018 switch (intsize) {
8019 case 'h': iv = (short)va_arg(*args, int); break;
8020 default: iv = va_arg(*args, int); break;
8021 case 'l': iv = va_arg(*args, long); break;
fc36a67e 8022 case 'V': iv = va_arg(*args, IV); break;
cf2093f6
JH
8023#ifdef HAS_QUAD
8024 case 'q': iv = va_arg(*args, Quad_t); break;
8025#endif
46fc3d4c 8026 }
8027 }
8028 else {
211dfcf1 8029 iv = SvIVx(argsv);
46fc3d4c 8030 switch (intsize) {
8031 case 'h': iv = (short)iv; break;
be28567c 8032 default: break;
46fc3d4c 8033 case 'l': iv = (long)iv; break;
fc36a67e 8034 case 'V': break;
cf2093f6
JH
8035#ifdef HAS_QUAD
8036 case 'q': iv = (Quad_t)iv; break;
8037#endif
46fc3d4c 8038 }
8039 }
e83d50c9
JP
8040 if ( !vectorize ) /* we already set uv above */
8041 {
8042 if (iv >= 0) {
8043 uv = iv;
8044 if (plus)
8045 esignbuf[esignlen++] = plus;
8046 }
8047 else {
8048 uv = -iv;
8049 esignbuf[esignlen++] = '-';
8050 }
46fc3d4c 8051 }
8052 base = 10;
8053 goto integer;
8054
fc36a67e 8055 case 'U':
29fe7a80 8056#ifdef IV_IS_QUAD
22f3ae8c 8057 intsize = 'q';
29fe7a80 8058#else
fc36a67e 8059 intsize = 'l';
29fe7a80 8060#endif
fc36a67e 8061 /* FALL THROUGH */
8062 case 'u':
8063 base = 10;
8064 goto uns_integer;
8065
4f19785b
WSI
8066 case 'b':
8067 base = 2;
8068 goto uns_integer;
8069
46fc3d4c 8070 case 'O':
29fe7a80 8071#ifdef IV_IS_QUAD
22f3ae8c 8072 intsize = 'q';
29fe7a80 8073#else
46fc3d4c 8074 intsize = 'l';
29fe7a80 8075#endif
46fc3d4c 8076 /* FALL THROUGH */
8077 case 'o':
8078 base = 8;
8079 goto uns_integer;
8080
8081 case 'X':
46fc3d4c 8082 case 'x':
8083 base = 16;
46fc3d4c 8084
8085 uns_integer:
b22c7a20 8086 if (vectorize) {
ba210ebe 8087 STRLEN ulen;
b22c7a20 8088 vector:
211dfcf1
HS
8089 if (!veclen)
8090 continue;
b2e23cf9 8091 if (vec_utf)
e83d50c9 8092 uv = utf8n_to_uvchr(vecstr, veclen, &ulen, UTF8_ALLOW_ANYUV);
b22c7a20 8093 else {
a05b299f 8094 uv = *vecstr;
b22c7a20
GS
8095 ulen = 1;
8096 }
8097 vecstr += ulen;
8098 veclen -= ulen;
8099 }
8100 else if (args) {
46fc3d4c 8101 switch (intsize) {
8102 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
8103 default: uv = va_arg(*args, unsigned); break;
8104 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 8105 case 'V': uv = va_arg(*args, UV); break;
cf2093f6
JH
8106#ifdef HAS_QUAD
8107 case 'q': uv = va_arg(*args, Quad_t); break;
8108#endif
46fc3d4c 8109 }
8110 }
8111 else {
211dfcf1 8112 uv = SvUVx(argsv);
46fc3d4c 8113 switch (intsize) {
8114 case 'h': uv = (unsigned short)uv; break;
be28567c 8115 default: break;
46fc3d4c 8116 case 'l': uv = (unsigned long)uv; break;
fc36a67e 8117 case 'V': break;
cf2093f6
JH
8118#ifdef HAS_QUAD
8119 case 'q': uv = (Quad_t)uv; break;
8120#endif
46fc3d4c 8121 }
8122 }
8123
8124 integer:
46fc3d4c 8125 eptr = ebuf + sizeof ebuf;
fc36a67e 8126 switch (base) {
8127 unsigned dig;
8128 case 16:
c10ed8b9
HS
8129 if (!uv)
8130 alt = FALSE;
1d7c1841
GS
8131 p = (char*)((c == 'X')
8132 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 8133 do {
8134 dig = uv & 15;
8135 *--eptr = p[dig];
8136 } while (uv >>= 4);
8137 if (alt) {
46fc3d4c 8138 esignbuf[esignlen++] = '0';
fc36a67e 8139 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 8140 }
fc36a67e 8141 break;
8142 case 8:
8143 do {
8144 dig = uv & 7;
8145 *--eptr = '0' + dig;
8146 } while (uv >>= 3);
8147 if (alt && *eptr != '0')
8148 *--eptr = '0';
8149 break;
4f19785b
WSI
8150 case 2:
8151 do {
8152 dig = uv & 1;
8153 *--eptr = '0' + dig;
8154 } while (uv >>= 1);
eda88b6d
JH
8155 if (alt) {
8156 esignbuf[esignlen++] = '0';
7481bb52 8157 esignbuf[esignlen++] = 'b';
eda88b6d 8158 }
4f19785b 8159 break;
fc36a67e 8160 default: /* it had better be ten or less */
6bc102ca 8161#if defined(PERL_Y2KWARN)
e476b1b5 8162 if (ckWARN(WARN_Y2K)) {
6bc102ca
GS
8163 STRLEN n;
8164 char *s = SvPV(sv,n);
8165 if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
8166 && (n == 2 || !isDIGIT(s[n-3])))
8167 {
e476b1b5 8168 Perl_warner(aTHX_ WARN_Y2K,
6bc102ca
GS
8169 "Possible Y2K bug: %%%c %s",
8170 c, "format string following '19'");
8171 }
8172 }
8173#endif
fc36a67e 8174 do {
8175 dig = uv % base;
8176 *--eptr = '0' + dig;
8177 } while (uv /= base);
8178 break;
46fc3d4c 8179 }
8180 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
8181 if (has_precis) {
8182 if (precis > elen)
8183 zeros = precis - elen;
8184 else if (precis == 0 && elen == 1 && *eptr == '0')
8185 elen = 0;
8186 }
46fc3d4c 8187 break;
8188
8189 /* FLOATING POINT */
8190
fc36a67e 8191 case 'F':
8192 c = 'f'; /* maybe %F isn't supported here */
8193 /* FALL THROUGH */
46fc3d4c 8194 case 'e': case 'E':
fc36a67e 8195 case 'f':
46fc3d4c 8196 case 'g': case 'G':
8197
8198 /* This is evil, but floating point is even more evil */
8199
b22c7a20 8200 vectorize = FALSE;
211dfcf1 8201 nv = args ? va_arg(*args, NV) : SvNVx(argsv);
fc36a67e 8202
8203 need = 0;
8204 if (c != 'e' && c != 'E') {
8205 i = PERL_INT_MIN;
73b309ea 8206 (void)Perl_frexp(nv, &i);
fc36a67e 8207 if (i == PERL_INT_MIN)
cea2e8a9 8208 Perl_die(aTHX_ "panic: frexp");
c635e13b 8209 if (i > 0)
fc36a67e 8210 need = BIT_DIGITS(i);
8211 }
8212 need += has_precis ? precis : 6; /* known default */
8213 if (need < width)
8214 need = width;
8215
46fc3d4c 8216 need += 20; /* fudge factor */
80252599
GS
8217 if (PL_efloatsize < need) {
8218 Safefree(PL_efloatbuf);
8219 PL_efloatsize = need + 20; /* more fudge */
8220 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 8221 PL_efloatbuf[0] = '\0';
46fc3d4c 8222 }
8223
8224 eptr = ebuf + sizeof ebuf;
8225 *--eptr = '\0';
8226 *--eptr = c;
e5c81feb 8227#if defined(USE_LONG_DOUBLE) && defined(PERL_PRIfldbl)
cf2093f6 8228 {
e5c81feb
JH
8229 /* Copy the one or more characters in a long double
8230 * format before the 'base' ([efgEFG]) character to
8231 * the format string. */
8232 static char const prifldbl[] = PERL_PRIfldbl;
8233 char const *p = prifldbl + sizeof(prifldbl) - 3;
8234 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 8235 }
65202027 8236#endif
46fc3d4c 8237 if (has_precis) {
8238 base = precis;
8239 do { *--eptr = '0' + (base % 10); } while (base /= 10);
8240 *--eptr = '.';
8241 }
8242 if (width) {
8243 base = width;
8244 do { *--eptr = '0' + (base % 10); } while (base /= 10);
8245 }
8246 if (fill == '0')
8247 *--eptr = fill;
84902520
TB
8248 if (left)
8249 *--eptr = '-';
46fc3d4c 8250 if (plus)
8251 *--eptr = plus;
8252 if (alt)
8253 *--eptr = '#';
8254 *--eptr = '%';
8255
ff9121f8
JH
8256 /* No taint. Otherwise we are in the strange situation
8257 * where printf() taints but print($float) doesn't.
bda0f7a5 8258 * --jhi */
dd8482fc 8259 (void)sprintf(PL_efloatbuf, eptr, nv);
8af02333 8260
80252599
GS
8261 eptr = PL_efloatbuf;
8262 elen = strlen(PL_efloatbuf);
46fc3d4c 8263 break;
8264
fc36a67e 8265 /* SPECIAL */
8266
8267 case 'n':
b22c7a20 8268 vectorize = FALSE;
fc36a67e 8269 i = SvCUR(sv) - origlen;
8270 if (args) {
c635e13b 8271 switch (intsize) {
8272 case 'h': *(va_arg(*args, short*)) = i; break;
8273 default: *(va_arg(*args, int*)) = i; break;
8274 case 'l': *(va_arg(*args, long*)) = i; break;
8275 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
8276#ifdef HAS_QUAD
8277 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
8278#endif
c635e13b 8279 }
fc36a67e 8280 }
9dd79c3f 8281 else
211dfcf1 8282 sv_setuv_mg(argsv, (UV)i);
fc36a67e 8283 continue; /* not "break" */
8284
8285 /* UNKNOWN */
8286
46fc3d4c 8287 default:
fc36a67e 8288 unknown:
b22c7a20 8289 vectorize = FALSE;
599cee73 8290 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 8291 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 8292 SV *msg = sv_newmortal();
cea2e8a9 8293 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %s: ",
533c011a 8294 (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
0f4b6630 8295 if (c) {
0f4b6630 8296 if (isPRINT(c))
1c846c1f 8297 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
8298 "\"%%%c\"", c & 0xFF);
8299 else
8300 Perl_sv_catpvf(aTHX_ msg,
57def98f 8301 "\"%%\\%03"UVof"\"",
0f4b6630 8302 (UV)c & 0xFF);
0f4b6630 8303 } else
c635e13b 8304 sv_catpv(msg, "end of string");
894356b3 8305 Perl_warner(aTHX_ WARN_PRINTF, "%"SVf, msg); /* yes, this is reentrant */
c635e13b 8306 }
fb73857a 8307
8308 /* output mangled stuff ... */
8309 if (c == '\0')
8310 --q;
46fc3d4c 8311 eptr = p;
8312 elen = q - p;
fb73857a 8313
8314 /* ... right here, because formatting flags should not apply */
8315 SvGROW(sv, SvCUR(sv) + elen + 1);
8316 p = SvEND(sv);
4459522c 8317 Copy(eptr, p, elen, char);
fb73857a 8318 p += elen;
8319 *p = '\0';
8320 SvCUR(sv) = p - SvPVX(sv);
8321 continue; /* not "break" */
46fc3d4c 8322 }
8323
fc36a67e 8324 have = esignlen + zeros + elen;
46fc3d4c 8325 need = (have > width ? have : width);
8326 gap = need - have;
8327
b22c7a20 8328 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 8329 p = SvEND(sv);
8330 if (esignlen && fill == '0') {
8331 for (i = 0; i < esignlen; i++)
8332 *p++ = esignbuf[i];
8333 }
8334 if (gap && !left) {
8335 memset(p, fill, gap);
8336 p += gap;
8337 }
8338 if (esignlen && fill != '0') {
8339 for (i = 0; i < esignlen; i++)
8340 *p++ = esignbuf[i];
8341 }
fc36a67e 8342 if (zeros) {
8343 for (i = zeros; i; i--)
8344 *p++ = '0';
8345 }
46fc3d4c 8346 if (elen) {
4459522c 8347 Copy(eptr, p, elen, char);
46fc3d4c 8348 p += elen;
8349 }
8350 if (gap && left) {
8351 memset(p, ' ', gap);
8352 p += gap;
8353 }
b22c7a20
GS
8354 if (vectorize) {
8355 if (veclen) {
4459522c 8356 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
8357 p += dotstrlen;
8358 }
8359 else
8360 vectorize = FALSE; /* done iterating over vecstr */
8361 }
7e2040f0
GS
8362 if (is_utf)
8363 SvUTF8_on(sv);
46fc3d4c 8364 *p = '\0';
8365 SvCUR(sv) = p - SvPVX(sv);
b22c7a20
GS
8366 if (vectorize) {
8367 esignlen = 0;
8368 goto vector;
8369 }
46fc3d4c 8370 }
8371}
51371543 8372
645c22ef
DM
8373/* =========================================================================
8374
8375=head1 Cloning an interpreter
8376
8377All the macros and functions in this section are for the private use of
8378the main function, perl_clone().
8379
8380The foo_dup() functions make an exact copy of an existing foo thinngy.
8381During the course of a cloning, a hash table is used to map old addresses
8382to new addresses. The table is created and manipulated with the
8383ptr_table_* functions.
8384
8385=cut
8386
8387============================================================================*/
8388
8389
1d7c1841
GS
8390#if defined(USE_ITHREADS)
8391
4d1ff10f
AB
8392#if defined(USE_5005THREADS)
8393# include "error: USE_5005THREADS and USE_ITHREADS are incompatible"
1d7c1841
GS
8394#endif
8395
1d7c1841
GS
8396#ifndef GpREFCNT_inc
8397# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
8398#endif
8399
8400
d2d73c3e
AB
8401#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
8402#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
8403#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8404#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
8405#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8406#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
8407#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8408#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
8409#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
8410#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
8411#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
8412#define SAVEPV(p) (p ? savepv(p) : Nullch)
8413#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
8cf8f3d1 8414
d2d73c3e 8415
d2f185dc
AMS
8416/* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
8417 regcomp.c. AMS 20010712 */
645c22ef 8418
1d7c1841 8419REGEXP *
a8fc9800 8420Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
1d7c1841 8421{
d2f185dc
AMS
8422 REGEXP *ret;
8423 int i, len, npar;
8424 struct reg_substr_datum *s;
8425
8426 if (!r)
8427 return (REGEXP *)NULL;
8428
8429 if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
8430 return ret;
8431
8432 len = r->offsets[0];
8433 npar = r->nparens+1;
8434
8435 Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
8436 Copy(r->program, ret->program, len+1, regnode);
8437
8438 New(0, ret->startp, npar, I32);
8439 Copy(r->startp, ret->startp, npar, I32);
8440 New(0, ret->endp, npar, I32);
8441 Copy(r->startp, ret->startp, npar, I32);
8442
d2f185dc
AMS
8443 New(0, ret->substrs, 1, struct reg_substr_data);
8444 for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
8445 s->min_offset = r->substrs->data[i].min_offset;
8446 s->max_offset = r->substrs->data[i].max_offset;
8447 s->substr = sv_dup_inc(r->substrs->data[i].substr, param);
8448 }
8449
70612e96 8450 ret->regstclass = NULL;
d2f185dc
AMS
8451 if (r->data) {
8452 struct reg_data *d;
8453 int count = r->data->count;
8454
8455 Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
8456 char, struct reg_data);
8457 New(0, d->what, count, U8);
8458
8459 d->count = count;
8460 for (i = 0; i < count; i++) {
8461 d->what[i] = r->data->what[i];
8462 switch (d->what[i]) {
8463 case 's':
8464 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
8465 break;
8466 case 'p':
8467 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
8468 break;
8469 case 'f':
8470 /* This is cheating. */
8471 New(0, d->data[i], 1, struct regnode_charclass_class);
8472 StructCopy(r->data->data[i], d->data[i],
8473 struct regnode_charclass_class);
70612e96 8474 ret->regstclass = (regnode*)d->data[i];
d2f185dc
AMS
8475 break;
8476 case 'o':
33773810
AMS
8477 /* Compiled op trees are readonly, and can thus be
8478 shared without duplication. */
9b978d73
DM
8479 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
8480 break;
d2f185dc
AMS
8481 case 'n':
8482 d->data[i] = r->data->data[i];
8483 break;
8484 }
8485 }
8486
8487 ret->data = d;
8488 }
8489 else
8490 ret->data = NULL;
8491
8492 New(0, ret->offsets, 2*len+1, U32);
8493 Copy(r->offsets, ret->offsets, 2*len+1, U32);
8494
8495 ret->precomp = SAVEPV(r->precomp);
d2f185dc
AMS
8496 ret->refcnt = r->refcnt;
8497 ret->minlen = r->minlen;
8498 ret->prelen = r->prelen;
8499 ret->nparens = r->nparens;
8500 ret->lastparen = r->lastparen;
8501 ret->lastcloseparen = r->lastcloseparen;
8502 ret->reganch = r->reganch;
8503
70612e96
RG
8504 ret->sublen = r->sublen;
8505
8506 if (RX_MATCH_COPIED(ret))
8507 ret->subbeg = SAVEPV(r->subbeg);
8508 else
8509 ret->subbeg = Nullch;
8510
d2f185dc
AMS
8511 ptr_table_store(PL_ptr_table, r, ret);
8512 return ret;
1d7c1841
GS
8513}
8514
d2d73c3e 8515/* duplicate a file handle */
645c22ef 8516
1d7c1841 8517PerlIO *
a8fc9800 8518Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
8519{
8520 PerlIO *ret;
8521 if (!fp)
8522 return (PerlIO*)NULL;
8523
8524 /* look for it in the table first */
8525 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
8526 if (ret)
8527 return ret;
8528
8529 /* create anew and remember what it is */
ecdeb87c 8530 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
8531 ptr_table_store(PL_ptr_table, fp, ret);
8532 return ret;
8533}
8534
645c22ef
DM
8535/* duplicate a directory handle */
8536
1d7c1841
GS
8537DIR *
8538Perl_dirp_dup(pTHX_ DIR *dp)
8539{
8540 if (!dp)
8541 return (DIR*)NULL;
8542 /* XXX TODO */
8543 return dp;
8544}
8545
ff276b08 8546/* duplicate a typeglob */
645c22ef 8547
1d7c1841 8548GP *
a8fc9800 8549Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
8550{
8551 GP *ret;
8552 if (!gp)
8553 return (GP*)NULL;
8554 /* look for it in the table first */
8555 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
8556 if (ret)
8557 return ret;
8558
8559 /* create anew and remember what it is */
8560 Newz(0, ret, 1, GP);
8561 ptr_table_store(PL_ptr_table, gp, ret);
8562
8563 /* clone */
8564 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
8565 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
8566 ret->gp_io = io_dup_inc(gp->gp_io, param);
8567 ret->gp_form = cv_dup_inc(gp->gp_form, param);
8568 ret->gp_av = av_dup_inc(gp->gp_av, param);
8569 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
8570 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
8571 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
8572 ret->gp_cvgen = gp->gp_cvgen;
8573 ret->gp_flags = gp->gp_flags;
8574 ret->gp_line = gp->gp_line;
8575 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
8576 return ret;
8577}
8578
645c22ef
DM
8579/* duplicate a chain of magic */
8580
1d7c1841 8581MAGIC *
a8fc9800 8582Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 8583{
cb359b41
JH
8584 MAGIC *mgprev = (MAGIC*)NULL;
8585 MAGIC *mgret;
1d7c1841
GS
8586 if (!mg)
8587 return (MAGIC*)NULL;
8588 /* look for it in the table first */
8589 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
8590 if (mgret)
8591 return mgret;
8592
8593 for (; mg; mg = mg->mg_moremagic) {
8594 MAGIC *nmg;
8595 Newz(0, nmg, 1, MAGIC);
cb359b41 8596 if (mgprev)
1d7c1841 8597 mgprev->mg_moremagic = nmg;
cb359b41
JH
8598 else
8599 mgret = nmg;
1d7c1841
GS
8600 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
8601 nmg->mg_private = mg->mg_private;
8602 nmg->mg_type = mg->mg_type;
8603 nmg->mg_flags = mg->mg_flags;
14befaf4 8604 if (mg->mg_type == PERL_MAGIC_qr) {
d2f185dc 8605 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
1d7c1841 8606 }
05bd4103
JH
8607 else if(mg->mg_type == PERL_MAGIC_backref) {
8608 AV *av = (AV*) mg->mg_obj;
8609 SV **svp;
8610 I32 i;
8611 nmg->mg_obj = (SV*)newAV();
8612 svp = AvARRAY(av);
8613 i = AvFILLp(av);
8614 while (i >= 0) {
8615 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
8616 i--;
8617 }
8618 }
1d7c1841
GS
8619 else {
8620 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
8621 ? sv_dup_inc(mg->mg_obj, param)
8622 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
8623 }
8624 nmg->mg_len = mg->mg_len;
8625 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 8626 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
1d7c1841
GS
8627 if (mg->mg_len >= 0) {
8628 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
8629 if (mg->mg_type == PERL_MAGIC_overload_table &&
8630 AMT_AMAGIC((AMT*)mg->mg_ptr))
8631 {
1d7c1841
GS
8632 AMT *amtp = (AMT*)mg->mg_ptr;
8633 AMT *namtp = (AMT*)nmg->mg_ptr;
8634 I32 i;
8635 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 8636 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
8637 }
8638 }
8639 }
8640 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 8641 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841
GS
8642 }
8643 mgprev = nmg;
8644 }
8645 return mgret;
8646}
8647
645c22ef
DM
8648/* create a new pointer-mapping table */
8649
1d7c1841
GS
8650PTR_TBL_t *
8651Perl_ptr_table_new(pTHX)
8652{
8653 PTR_TBL_t *tbl;
8654 Newz(0, tbl, 1, PTR_TBL_t);
8655 tbl->tbl_max = 511;
8656 tbl->tbl_items = 0;
8657 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
8658 return tbl;
8659}
8660
645c22ef
DM
8661/* map an existing pointer using a table */
8662
1d7c1841
GS
8663void *
8664Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
8665{
8666 PTR_TBL_ENT_t *tblent;
d2a79402 8667 UV hash = PTR2UV(sv);
1d7c1841
GS
8668 assert(tbl);
8669 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
8670 for (; tblent; tblent = tblent->next) {
8671 if (tblent->oldval == sv)
8672 return tblent->newval;
8673 }
8674 return (void*)NULL;
8675}
8676
645c22ef
DM
8677/* add a new entry to a pointer-mapping table */
8678
1d7c1841
GS
8679void
8680Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
8681{
8682 PTR_TBL_ENT_t *tblent, **otblent;
8683 /* XXX this may be pessimal on platforms where pointers aren't good
8684 * hash values e.g. if they grow faster in the most significant
8685 * bits */
d2a79402 8686 UV hash = PTR2UV(oldv);
1d7c1841
GS
8687 bool i = 1;
8688
8689 assert(tbl);
8690 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
8691 for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
8692 if (tblent->oldval == oldv) {
8693 tblent->newval = newv;
8694 tbl->tbl_items++;
8695 return;
8696 }
8697 }
8698 Newz(0, tblent, 1, PTR_TBL_ENT_t);
8699 tblent->oldval = oldv;
8700 tblent->newval = newv;
8701 tblent->next = *otblent;
8702 *otblent = tblent;
8703 tbl->tbl_items++;
8704 if (i && tbl->tbl_items > tbl->tbl_max)
8705 ptr_table_split(tbl);
8706}
8707
645c22ef
DM
8708/* double the hash bucket size of an existing ptr table */
8709
1d7c1841
GS
8710void
8711Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
8712{
8713 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
8714 UV oldsize = tbl->tbl_max + 1;
8715 UV newsize = oldsize * 2;
8716 UV i;
8717
8718 Renew(ary, newsize, PTR_TBL_ENT_t*);
8719 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
8720 tbl->tbl_max = --newsize;
8721 tbl->tbl_ary = ary;
8722 for (i=0; i < oldsize; i++, ary++) {
8723 PTR_TBL_ENT_t **curentp, **entp, *ent;
8724 if (!*ary)
8725 continue;
8726 curentp = ary + oldsize;
8727 for (entp = ary, ent = *ary; ent; ent = *entp) {
d2a79402 8728 if ((newsize & PTR2UV(ent->oldval)) != i) {
1d7c1841
GS
8729 *entp = ent->next;
8730 ent->next = *curentp;
8731 *curentp = ent;
8732 continue;
8733 }
8734 else
8735 entp = &ent->next;
8736 }
8737 }
8738}
8739
645c22ef
DM
8740/* remove all the entries from a ptr table */
8741
a0739874
DM
8742void
8743Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
8744{
8745 register PTR_TBL_ENT_t **array;
8746 register PTR_TBL_ENT_t *entry;
8747 register PTR_TBL_ENT_t *oentry = Null(PTR_TBL_ENT_t*);
8748 UV riter = 0;
8749 UV max;
8750
8751 if (!tbl || !tbl->tbl_items) {
8752 return;
8753 }
8754
8755 array = tbl->tbl_ary;
8756 entry = array[0];
8757 max = tbl->tbl_max;
8758
8759 for (;;) {
8760 if (entry) {
8761 oentry = entry;
8762 entry = entry->next;
8763 Safefree(oentry);
8764 }
8765 if (!entry) {
8766 if (++riter > max) {
8767 break;
8768 }
8769 entry = array[riter];
8770 }
8771 }
8772
8773 tbl->tbl_items = 0;
8774}
8775
645c22ef
DM
8776/* clear and free a ptr table */
8777
a0739874
DM
8778void
8779Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
8780{
8781 if (!tbl) {
8782 return;
8783 }
8784 ptr_table_clear(tbl);
8785 Safefree(tbl->tbl_ary);
8786 Safefree(tbl);
8787}
8788
1d7c1841
GS
8789#ifdef DEBUGGING
8790char *PL_watch_pvx;
8791#endif
8792
645c22ef
DM
8793/* attempt to make everything in the typeglob readonly */
8794
5bd07a3d
DM
8795STATIC SV *
8796S_gv_share(pTHX_ SV *sstr)
8797{
8798 GV *gv = (GV*)sstr;
8799 SV *sv = &PL_sv_no; /* just need SvREADONLY-ness */
8800
8801 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 8802 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
8803 }
8804 else if (!GvCV(gv)) {
8805 GvCV(gv) = (CV*)sv;
8806 }
8807 else {
8808 /* CvPADLISTs cannot be shared */
8809 if (!CvXSUB(GvCV(gv))) {
7fb37951 8810 GvUNIQUE_off(gv);
5bd07a3d
DM
8811 }
8812 }
8813
7fb37951 8814 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
8815#if 0
8816 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
8817 HvNAME(GvSTASH(gv)), GvNAME(gv));
8818#endif
8819 return Nullsv;
8820 }
8821
4411f3b6 8822 /*
5bd07a3d
DM
8823 * write attempts will die with
8824 * "Modification of a read-only value attempted"
8825 */
8826 if (!GvSV(gv)) {
8827 GvSV(gv) = sv;
8828 }
8829 else {
8830 SvREADONLY_on(GvSV(gv));
8831 }
8832
8833 if (!GvAV(gv)) {
8834 GvAV(gv) = (AV*)sv;
8835 }
8836 else {
8837 SvREADONLY_on(GvAV(gv));
8838 }
8839
8840 if (!GvHV(gv)) {
8841 GvHV(gv) = (HV*)sv;
8842 }
8843 else {
8844 SvREADONLY_on(GvAV(gv));
8845 }
8846
8847 return sstr; /* he_dup() will SvREFCNT_inc() */
8848}
8849
645c22ef
DM
8850/* duplicate an SV of any type (including AV, HV etc) */
8851
1d7c1841 8852SV *
a8fc9800 8853Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
1d7c1841 8854{
1d7c1841
GS
8855 SV *dstr;
8856
8857 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
8858 return Nullsv;
8859 /* look for it in the table first */
8860 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
8861 if (dstr)
8862 return dstr;
8863
8864 /* create anew and remember what it is */
8865 new_SV(dstr);
8866 ptr_table_store(PL_ptr_table, sstr, dstr);
8867
8868 /* clone */
8869 SvFLAGS(dstr) = SvFLAGS(sstr);
8870 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
8871 SvREFCNT(dstr) = 0; /* must be before any other dups! */
8872
8873#ifdef DEBUGGING
8874 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
8875 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
8876 PL_watch_pvx, SvPVX(sstr));
8877#endif
8878
8879 switch (SvTYPE(sstr)) {
8880 case SVt_NULL:
8881 SvANY(dstr) = NULL;
8882 break;
8883 case SVt_IV:
8884 SvANY(dstr) = new_XIV();
8885 SvIVX(dstr) = SvIVX(sstr);
8886 break;
8887 case SVt_NV:
8888 SvANY(dstr) = new_XNV();
8889 SvNVX(dstr) = SvNVX(sstr);
8890 break;
8891 case SVt_RV:
8892 SvANY(dstr) = new_XRV();
5f68ba95 8893 SvRV(dstr) = SvRV(sstr) && SvWEAKREF(sstr)
d2d73c3e
AB
8894 ? sv_dup(SvRV(sstr), param)
8895 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8896 break;
8897 case SVt_PV:
8898 SvANY(dstr) = new_XPV();
8899 SvCUR(dstr) = SvCUR(sstr);
8900 SvLEN(dstr) = SvLEN(sstr);
8901 if (SvROK(sstr))
5f68ba95 8902 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
8903 ? sv_dup(SvRV(sstr), param)
8904 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8905 else if (SvPVX(sstr) && SvLEN(sstr))
8906 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8907 else
8908 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
8909 break;
8910 case SVt_PVIV:
8911 SvANY(dstr) = new_XPVIV();
8912 SvCUR(dstr) = SvCUR(sstr);
8913 SvLEN(dstr) = SvLEN(sstr);
8914 SvIVX(dstr) = SvIVX(sstr);
8915 if (SvROK(sstr))
5f68ba95 8916 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
8917 ? sv_dup(SvRV(sstr), param)
8918 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8919 else if (SvPVX(sstr) && SvLEN(sstr))
8920 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8921 else
8922 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
8923 break;
8924 case SVt_PVNV:
8925 SvANY(dstr) = new_XPVNV();
8926 SvCUR(dstr) = SvCUR(sstr);
8927 SvLEN(dstr) = SvLEN(sstr);
8928 SvIVX(dstr) = SvIVX(sstr);
8929 SvNVX(dstr) = SvNVX(sstr);
8930 if (SvROK(sstr))
5f68ba95 8931 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
8932 ? sv_dup(SvRV(sstr), param)
8933 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8934 else if (SvPVX(sstr) && SvLEN(sstr))
8935 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8936 else
8937 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
8938 break;
8939 case SVt_PVMG:
8940 SvANY(dstr) = new_XPVMG();
8941 SvCUR(dstr) = SvCUR(sstr);
8942 SvLEN(dstr) = SvLEN(sstr);
8943 SvIVX(dstr) = SvIVX(sstr);
8944 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
8945 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
8946 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841 8947 if (SvROK(sstr))
5f68ba95 8948 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
8949 ? sv_dup(SvRV(sstr), param)
8950 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8951 else if (SvPVX(sstr) && SvLEN(sstr))
8952 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8953 else
8954 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
8955 break;
8956 case SVt_PVBM:
8957 SvANY(dstr) = new_XPVBM();
8958 SvCUR(dstr) = SvCUR(sstr);
8959 SvLEN(dstr) = SvLEN(sstr);
8960 SvIVX(dstr) = SvIVX(sstr);
8961 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
8962 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
8963 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841 8964 if (SvROK(sstr))
5f68ba95 8965 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
8966 ? sv_dup(SvRV(sstr), param)
8967 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8968 else if (SvPVX(sstr) && SvLEN(sstr))
8969 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8970 else
8971 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
8972 BmRARE(dstr) = BmRARE(sstr);
8973 BmUSEFUL(dstr) = BmUSEFUL(sstr);
8974 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
8975 break;
8976 case SVt_PVLV:
8977 SvANY(dstr) = new_XPVLV();
8978 SvCUR(dstr) = SvCUR(sstr);
8979 SvLEN(dstr) = SvLEN(sstr);
8980 SvIVX(dstr) = SvIVX(sstr);
8981 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
8982 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
8983 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841 8984 if (SvROK(sstr))
5f68ba95 8985 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
8986 ? sv_dup(SvRV(sstr), param)
8987 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8988 else if (SvPVX(sstr) && SvLEN(sstr))
8989 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8990 else
8991 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
8992 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
8993 LvTARGLEN(dstr) = LvTARGLEN(sstr);
d2d73c3e 8994 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr), param);
1d7c1841
GS
8995 LvTYPE(dstr) = LvTYPE(sstr);
8996 break;
8997 case SVt_PVGV:
7fb37951 8998 if (GvUNIQUE((GV*)sstr)) {
5bd07a3d
DM
8999 SV *share;
9000 if ((share = gv_share(sstr))) {
9001 del_SV(dstr);
9002 dstr = share;
9003#if 0
9004 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
9005 HvNAME(GvSTASH(share)), GvNAME(share));
9006#endif
9007 break;
9008 }
9009 }
1d7c1841
GS
9010 SvANY(dstr) = new_XPVGV();
9011 SvCUR(dstr) = SvCUR(sstr);
9012 SvLEN(dstr) = SvLEN(sstr);
9013 SvIVX(dstr) = SvIVX(sstr);
9014 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9015 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9016 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841 9017 if (SvROK(sstr))
5f68ba95 9018 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
9019 ? sv_dup(SvRV(sstr), param)
9020 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
9021 else if (SvPVX(sstr) && SvLEN(sstr))
9022 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
9023 else
9024 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
9025 GvNAMELEN(dstr) = GvNAMELEN(sstr);
9026 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
d2d73c3e 9027 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr), param);
1d7c1841 9028 GvFLAGS(dstr) = GvFLAGS(sstr);
d2d73c3e 9029 GvGP(dstr) = gp_dup(GvGP(sstr), param);
1d7c1841
GS
9030 (void)GpREFCNT_inc(GvGP(dstr));
9031 break;
9032 case SVt_PVIO:
9033 SvANY(dstr) = new_XPVIO();
9034 SvCUR(dstr) = SvCUR(sstr);
9035 SvLEN(dstr) = SvLEN(sstr);
9036 SvIVX(dstr) = SvIVX(sstr);
9037 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9038 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9039 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841 9040 if (SvROK(sstr))
5f68ba95 9041 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
9042 ? sv_dup(SvRV(sstr), param)
9043 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
9044 else if (SvPVX(sstr) && SvLEN(sstr))
9045 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
9046 else
9047 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
a8fc9800 9048 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
9049 if (IoOFP(sstr) == IoIFP(sstr))
9050 IoOFP(dstr) = IoIFP(dstr);
9051 else
a8fc9800 9052 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
1d7c1841
GS
9053 /* PL_rsfp_filters entries have fake IoDIRP() */
9054 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
9055 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
9056 else
9057 IoDIRP(dstr) = IoDIRP(sstr);
9058 IoLINES(dstr) = IoLINES(sstr);
9059 IoPAGE(dstr) = IoPAGE(sstr);
9060 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
9061 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
9062 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
d2d73c3e 9063 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr), param);
1d7c1841 9064 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
d2d73c3e 9065 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr), param);
1d7c1841 9066 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
d2d73c3e 9067 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr), param);
1d7c1841
GS
9068 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
9069 IoTYPE(dstr) = IoTYPE(sstr);
9070 IoFLAGS(dstr) = IoFLAGS(sstr);
9071 break;
9072 case SVt_PVAV:
9073 SvANY(dstr) = new_XPVAV();
9074 SvCUR(dstr) = SvCUR(sstr);
9075 SvLEN(dstr) = SvLEN(sstr);
9076 SvIVX(dstr) = SvIVX(sstr);
9077 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9078 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9079 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
9080 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
1d7c1841
GS
9081 AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
9082 if (AvARRAY((AV*)sstr)) {
9083 SV **dst_ary, **src_ary;
9084 SSize_t items = AvFILLp((AV*)sstr) + 1;
9085
9086 src_ary = AvARRAY((AV*)sstr);
9087 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
9088 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
9089 SvPVX(dstr) = (char*)dst_ary;
9090 AvALLOC((AV*)dstr) = dst_ary;
9091 if (AvREAL((AV*)sstr)) {
9092 while (items-- > 0)
d2d73c3e 9093 *dst_ary++ = sv_dup_inc(*src_ary++, param);
1d7c1841
GS
9094 }
9095 else {
9096 while (items-- > 0)
d2d73c3e 9097 *dst_ary++ = sv_dup(*src_ary++, param);
1d7c1841
GS
9098 }
9099 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
9100 while (items-- > 0) {
9101 *dst_ary++ = &PL_sv_undef;
9102 }
9103 }
9104 else {
9105 SvPVX(dstr) = Nullch;
9106 AvALLOC((AV*)dstr) = (SV**)NULL;
9107 }
9108 break;
9109 case SVt_PVHV:
9110 SvANY(dstr) = new_XPVHV();
9111 SvCUR(dstr) = SvCUR(sstr);
9112 SvLEN(dstr) = SvLEN(sstr);
9113 SvIVX(dstr) = SvIVX(sstr);
9114 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9115 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9116 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841
GS
9117 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
9118 if (HvARRAY((HV*)sstr)) {
1d7c1841
GS
9119 STRLEN i = 0;
9120 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
9121 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
9122 Newz(0, dxhv->xhv_array,
9123 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
9124 while (i <= sxhv->xhv_max) {
9125 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
d2d73c3e 9126 !!HvSHAREKEYS(sstr), param);
1d7c1841
GS
9127 ++i;
9128 }
d2d73c3e 9129 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter, !!HvSHAREKEYS(sstr), param);
1d7c1841
GS
9130 }
9131 else {
9132 SvPVX(dstr) = Nullch;
9133 HvEITER((HV*)dstr) = (HE*)NULL;
9134 }
9135 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
9136 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
c43294b8 9137 /* Record stashes for possible cloning in Perl_clone(). */
6676db26 9138 if(HvNAME((HV*)dstr))
d2d73c3e 9139 av_push(param->stashes, dstr);
1d7c1841
GS
9140 break;
9141 case SVt_PVFM:
9142 SvANY(dstr) = new_XPVFM();
9143 FmLINES(dstr) = FmLINES(sstr);
9144 goto dup_pvcv;
9145 /* NOTREACHED */
9146 case SVt_PVCV:
9147 SvANY(dstr) = new_XPVCV();
d2d73c3e 9148 dup_pvcv:
1d7c1841
GS
9149 SvCUR(dstr) = SvCUR(sstr);
9150 SvLEN(dstr) = SvLEN(sstr);
9151 SvIVX(dstr) = SvIVX(sstr);
9152 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
9153 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
9154 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841
GS
9155 if (SvPVX(sstr) && SvLEN(sstr))
9156 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
9157 else
9158 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
d2d73c3e 9159 CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
1d7c1841
GS
9160 CvSTART(dstr) = CvSTART(sstr);
9161 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
9162 CvXSUB(dstr) = CvXSUB(sstr);
9163 CvXSUBANY(dstr) = CvXSUBANY(sstr);
01485f8b
DM
9164 if (CvCONST(sstr)) {
9165 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
9166 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
9167 sv_dup_inc(CvXSUBANY(sstr).any_ptr, param);
9168 }
d2d73c3e
AB
9169 CvGV(dstr) = gv_dup(CvGV(sstr), param);
9170 if (param->flags & CLONEf_COPY_STACKS) {
9171 CvDEPTH(dstr) = CvDEPTH(sstr);
9172 } else {
9173 CvDEPTH(dstr) = 0;
9174 }
1d7c1841
GS
9175 if (CvPADLIST(sstr) && !AvREAL(CvPADLIST(sstr))) {
9176 /* XXX padlists are real, but pretend to be not */
9177 AvREAL_on(CvPADLIST(sstr));
d2d73c3e 9178 CvPADLIST(dstr) = av_dup_inc(CvPADLIST(sstr), param);
1d7c1841
GS
9179 AvREAL_off(CvPADLIST(sstr));
9180 AvREAL_off(CvPADLIST(dstr));
9181 }
9182 else
d2d73c3e 9183 CvPADLIST(dstr) = av_dup_inc(CvPADLIST(sstr), param);
282f25c9 9184 if (!CvANON(sstr) || CvCLONED(sstr))
d2d73c3e 9185 CvOUTSIDE(dstr) = cv_dup_inc(CvOUTSIDE(sstr), param);
282f25c9 9186 else
d2d73c3e 9187 CvOUTSIDE(dstr) = cv_dup(CvOUTSIDE(sstr), param);
1d7c1841 9188 CvFLAGS(dstr) = CvFLAGS(sstr);
54356c7d 9189 CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
1d7c1841
GS
9190 break;
9191 default:
9192 Perl_croak(aTHX_ "Bizarre SvTYPE [%d]", SvTYPE(sstr));
9193 break;
9194 }
9195
9196 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
9197 ++PL_sv_objcount;
9198
9199 return dstr;
d2d73c3e 9200 }
1d7c1841 9201
645c22ef
DM
9202/* duplicate a context */
9203
1d7c1841 9204PERL_CONTEXT *
a8fc9800 9205Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
9206{
9207 PERL_CONTEXT *ncxs;
9208
9209 if (!cxs)
9210 return (PERL_CONTEXT*)NULL;
9211
9212 /* look for it in the table first */
9213 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
9214 if (ncxs)
9215 return ncxs;
9216
9217 /* create anew and remember what it is */
9218 Newz(56, ncxs, max + 1, PERL_CONTEXT);
9219 ptr_table_store(PL_ptr_table, cxs, ncxs);
9220
9221 while (ix >= 0) {
9222 PERL_CONTEXT *cx = &cxs[ix];
9223 PERL_CONTEXT *ncx = &ncxs[ix];
9224 ncx->cx_type = cx->cx_type;
9225 if (CxTYPE(cx) == CXt_SUBST) {
9226 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
9227 }
9228 else {
9229 ncx->blk_oldsp = cx->blk_oldsp;
9230 ncx->blk_oldcop = cx->blk_oldcop;
9231 ncx->blk_oldretsp = cx->blk_oldretsp;
9232 ncx->blk_oldmarksp = cx->blk_oldmarksp;
9233 ncx->blk_oldscopesp = cx->blk_oldscopesp;
9234 ncx->blk_oldpm = cx->blk_oldpm;
9235 ncx->blk_gimme = cx->blk_gimme;
9236 switch (CxTYPE(cx)) {
9237 case CXt_SUB:
9238 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
9239 ? cv_dup_inc(cx->blk_sub.cv, param)
9240 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 9241 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 9242 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 9243 : Nullav);
d2d73c3e 9244 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
9245 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
9246 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
9247 ncx->blk_sub.lval = cx->blk_sub.lval;
9248 break;
9249 case CXt_EVAL:
9250 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
9251 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
d2d73c3e 9252 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);;
1d7c1841 9253 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 9254 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
1d7c1841
GS
9255 break;
9256 case CXt_LOOP:
9257 ncx->blk_loop.label = cx->blk_loop.label;
9258 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
9259 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
9260 ncx->blk_loop.next_op = cx->blk_loop.next_op;
9261 ncx->blk_loop.last_op = cx->blk_loop.last_op;
9262 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
9263 ? cx->blk_loop.iterdata
d2d73c3e 9264 : gv_dup((GV*)cx->blk_loop.iterdata, param));
a4b82a6f
GS
9265 ncx->blk_loop.oldcurpad
9266 = (SV**)ptr_table_fetch(PL_ptr_table,
9267 cx->blk_loop.oldcurpad);
d2d73c3e
AB
9268 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
9269 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
9270 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
9271 ncx->blk_loop.iterix = cx->blk_loop.iterix;
9272 ncx->blk_loop.itermax = cx->blk_loop.itermax;
9273 break;
9274 case CXt_FORMAT:
d2d73c3e
AB
9275 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
9276 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
9277 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841
GS
9278 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
9279 break;
9280 case CXt_BLOCK:
9281 case CXt_NULL:
9282 break;
9283 }
9284 }
9285 --ix;
9286 }
9287 return ncxs;
9288}
9289
645c22ef
DM
9290/* duplicate a stack info structure */
9291
1d7c1841 9292PERL_SI *
a8fc9800 9293Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
9294{
9295 PERL_SI *nsi;
9296
9297 if (!si)
9298 return (PERL_SI*)NULL;
9299
9300 /* look for it in the table first */
9301 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
9302 if (nsi)
9303 return nsi;
9304
9305 /* create anew and remember what it is */
9306 Newz(56, nsi, 1, PERL_SI);
9307 ptr_table_store(PL_ptr_table, si, nsi);
9308
d2d73c3e 9309 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
9310 nsi->si_cxix = si->si_cxix;
9311 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 9312 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 9313 nsi->si_type = si->si_type;
d2d73c3e
AB
9314 nsi->si_prev = si_dup(si->si_prev, param);
9315 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
9316 nsi->si_markoff = si->si_markoff;
9317
9318 return nsi;
9319}
9320
9321#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
9322#define TOPINT(ss,ix) ((ss)[ix].any_i32)
9323#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
9324#define TOPLONG(ss,ix) ((ss)[ix].any_long)
9325#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
9326#define TOPIV(ss,ix) ((ss)[ix].any_iv)
9327#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
9328#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
9329#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
9330#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
9331#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
9332#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
9333
9334/* XXXXX todo */
9335#define pv_dup_inc(p) SAVEPV(p)
9336#define pv_dup(p) SAVEPV(p)
9337#define svp_dup_inc(p,pp) any_dup(p,pp)
9338
645c22ef
DM
9339/* map any object to the new equivent - either something in the
9340 * ptr table, or something in the interpreter structure
9341 */
9342
1d7c1841
GS
9343void *
9344Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
9345{
9346 void *ret;
9347
9348 if (!v)
9349 return (void*)NULL;
9350
9351 /* look for it in the table first */
9352 ret = ptr_table_fetch(PL_ptr_table, v);
9353 if (ret)
9354 return ret;
9355
9356 /* see if it is part of the interpreter structure */
9357 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 9358 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
1d7c1841
GS
9359 else
9360 ret = v;
9361
9362 return ret;
9363}
9364
645c22ef
DM
9365/* duplicate the save stack */
9366
1d7c1841 9367ANY *
a8fc9800 9368Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841
GS
9369{
9370 ANY *ss = proto_perl->Tsavestack;
9371 I32 ix = proto_perl->Tsavestack_ix;
9372 I32 max = proto_perl->Tsavestack_max;
9373 ANY *nss;
9374 SV *sv;
9375 GV *gv;
9376 AV *av;
9377 HV *hv;
9378 void* ptr;
9379 int intval;
9380 long longval;
9381 GP *gp;
9382 IV iv;
9383 I32 i;
c4e33207 9384 char *c = NULL;
1d7c1841 9385 void (*dptr) (void*);
acfe0abc 9386 void (*dxptr) (pTHX_ void*);
e977893f 9387 OP *o;
1d7c1841
GS
9388
9389 Newz(54, nss, max, ANY);
9390
9391 while (ix > 0) {
9392 i = POPINT(ss,ix);
9393 TOPINT(nss,ix) = i;
9394 switch (i) {
9395 case SAVEt_ITEM: /* normal string */
9396 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9397 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9398 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9399 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9400 break;
9401 case SAVEt_SV: /* scalar reference */
9402 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9403 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9404 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9405 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 9406 break;
f4dd75d9
GS
9407 case SAVEt_GENERIC_PVREF: /* generic char* */
9408 c = (char*)POPPTR(ss,ix);
9409 TOPPTR(nss,ix) = pv_dup(c);
9410 ptr = POPPTR(ss,ix);
9411 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9412 break;
1d7c1841
GS
9413 case SAVEt_GENERIC_SVREF: /* generic sv */
9414 case SAVEt_SVREF: /* scalar reference */
9415 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9416 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9417 ptr = POPPTR(ss,ix);
9418 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
9419 break;
9420 case SAVEt_AV: /* array reference */
9421 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9422 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 9423 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9424 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9425 break;
9426 case SAVEt_HV: /* hash reference */
9427 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9428 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 9429 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9430 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9431 break;
9432 case SAVEt_INT: /* int reference */
9433 ptr = POPPTR(ss,ix);
9434 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9435 intval = (int)POPINT(ss,ix);
9436 TOPINT(nss,ix) = intval;
9437 break;
9438 case SAVEt_LONG: /* long reference */
9439 ptr = POPPTR(ss,ix);
9440 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9441 longval = (long)POPLONG(ss,ix);
9442 TOPLONG(nss,ix) = longval;
9443 break;
9444 case SAVEt_I32: /* I32 reference */
9445 case SAVEt_I16: /* I16 reference */
9446 case SAVEt_I8: /* I8 reference */
9447 ptr = POPPTR(ss,ix);
9448 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9449 i = POPINT(ss,ix);
9450 TOPINT(nss,ix) = i;
9451 break;
9452 case SAVEt_IV: /* IV reference */
9453 ptr = POPPTR(ss,ix);
9454 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9455 iv = POPIV(ss,ix);
9456 TOPIV(nss,ix) = iv;
9457 break;
9458 case SAVEt_SPTR: /* SV* reference */
9459 ptr = POPPTR(ss,ix);
9460 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9461 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9462 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
9463 break;
9464 case SAVEt_VPTR: /* random* reference */
9465 ptr = POPPTR(ss,ix);
9466 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9467 ptr = POPPTR(ss,ix);
9468 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9469 break;
9470 case SAVEt_PPTR: /* char* reference */
9471 ptr = POPPTR(ss,ix);
9472 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9473 c = (char*)POPPTR(ss,ix);
9474 TOPPTR(nss,ix) = pv_dup(c);
9475 break;
9476 case SAVEt_HPTR: /* HV* reference */
9477 ptr = POPPTR(ss,ix);
9478 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9479 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9480 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
9481 break;
9482 case SAVEt_APTR: /* AV* reference */
9483 ptr = POPPTR(ss,ix);
9484 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9485 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9486 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
9487 break;
9488 case SAVEt_NSTAB:
9489 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9490 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9491 break;
9492 case SAVEt_GP: /* scalar reference */
9493 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 9494 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
9495 (void)GpREFCNT_inc(gp);
9496 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 9497 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841
GS
9498 c = (char*)POPPTR(ss,ix);
9499 TOPPTR(nss,ix) = pv_dup(c);
9500 iv = POPIV(ss,ix);
9501 TOPIV(nss,ix) = iv;
9502 iv = POPIV(ss,ix);
9503 TOPIV(nss,ix) = iv;
9504 break;
9505 case SAVEt_FREESV:
26d9b02f 9506 case SAVEt_MORTALIZESV:
1d7c1841 9507 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9508 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9509 break;
9510 case SAVEt_FREEOP:
9511 ptr = POPPTR(ss,ix);
9512 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
9513 /* these are assumed to be refcounted properly */
9514 switch (((OP*)ptr)->op_type) {
9515 case OP_LEAVESUB:
9516 case OP_LEAVESUBLV:
9517 case OP_LEAVEEVAL:
9518 case OP_LEAVE:
9519 case OP_SCOPE:
9520 case OP_LEAVEWRITE:
e977893f
GS
9521 TOPPTR(nss,ix) = ptr;
9522 o = (OP*)ptr;
9523 OpREFCNT_inc(o);
1d7c1841
GS
9524 break;
9525 default:
9526 TOPPTR(nss,ix) = Nullop;
9527 break;
9528 }
9529 }
9530 else
9531 TOPPTR(nss,ix) = Nullop;
9532 break;
9533 case SAVEt_FREEPV:
9534 c = (char*)POPPTR(ss,ix);
9535 TOPPTR(nss,ix) = pv_dup_inc(c);
9536 break;
9537 case SAVEt_CLEARSV:
9538 longval = POPLONG(ss,ix);
9539 TOPLONG(nss,ix) = longval;
9540 break;
9541 case SAVEt_DELETE:
9542 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9543 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
9544 c = (char*)POPPTR(ss,ix);
9545 TOPPTR(nss,ix) = pv_dup_inc(c);
9546 i = POPINT(ss,ix);
9547 TOPINT(nss,ix) = i;
9548 break;
9549 case SAVEt_DESTRUCTOR:
9550 ptr = POPPTR(ss,ix);
9551 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
9552 dptr = POPDPTR(ss,ix);
ef75a179 9553 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
9554 break;
9555 case SAVEt_DESTRUCTOR_X:
9556 ptr = POPPTR(ss,ix);
9557 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
9558 dxptr = POPDXPTR(ss,ix);
acfe0abc 9559 TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
9560 break;
9561 case SAVEt_REGCONTEXT:
9562 case SAVEt_ALLOC:
9563 i = POPINT(ss,ix);
9564 TOPINT(nss,ix) = i;
9565 ix -= i;
9566 break;
9567 case SAVEt_STACK_POS: /* Position on Perl stack */
9568 i = POPINT(ss,ix);
9569 TOPINT(nss,ix) = i;
9570 break;
9571 case SAVEt_AELEM: /* array element */
9572 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9573 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9574 i = POPINT(ss,ix);
9575 TOPINT(nss,ix) = i;
9576 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9577 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
9578 break;
9579 case SAVEt_HELEM: /* hash element */
9580 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9581 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9582 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9583 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9584 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9585 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
9586 break;
9587 case SAVEt_OP:
9588 ptr = POPPTR(ss,ix);
9589 TOPPTR(nss,ix) = ptr;
9590 break;
9591 case SAVEt_HINTS:
9592 i = POPINT(ss,ix);
9593 TOPINT(nss,ix) = i;
9594 break;
c4410b1b
GS
9595 case SAVEt_COMPPAD:
9596 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9597 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 9598 break;
c3564e5c
GS
9599 case SAVEt_PADSV:
9600 longval = (long)POPLONG(ss,ix);
9601 TOPLONG(nss,ix) = longval;
9602 ptr = POPPTR(ss,ix);
9603 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9604 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9605 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 9606 break;
1d7c1841
GS
9607 default:
9608 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
9609 }
9610 }
9611
9612 return nss;
9613}
9614
645c22ef
DM
9615/*
9616=for apidoc perl_clone
9617
9618Create and return a new interpreter by cloning the current one.
9619
9620=cut
9621*/
9622
9623/* XXX the above needs expanding by someone who actually understands it ! */
3fc56081
NK
9624EXTERN_C PerlInterpreter *
9625perl_clone_host(PerlInterpreter* proto_perl, UV flags);
645c22ef 9626
1d7c1841
GS
9627PerlInterpreter *
9628perl_clone(PerlInterpreter *proto_perl, UV flags)
9629{
1d7c1841 9630#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
9631
9632 /* perlhost.h so we need to call into it
9633 to clone the host, CPerlHost should have a c interface, sky */
9634
9635 if (flags & CLONEf_CLONE_HOST) {
9636 return perl_clone_host(proto_perl,flags);
9637 }
9638 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
9639 proto_perl->IMem,
9640 proto_perl->IMemShared,
9641 proto_perl->IMemParse,
9642 proto_perl->IEnv,
9643 proto_perl->IStdIO,
9644 proto_perl->ILIO,
9645 proto_perl->IDir,
9646 proto_perl->ISock,
9647 proto_perl->IProc);
9648}
9649
9650PerlInterpreter *
9651perl_clone_using(PerlInterpreter *proto_perl, UV flags,
9652 struct IPerlMem* ipM, struct IPerlMem* ipMS,
9653 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
9654 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
9655 struct IPerlDir* ipD, struct IPerlSock* ipS,
9656 struct IPerlProc* ipP)
9657{
9658 /* XXX many of the string copies here can be optimized if they're
9659 * constants; they need to be allocated as common memory and just
9660 * their pointers copied. */
9661
9662 IV i;
a0ae6670 9663 CLONE_PARAMS* param = (CLONE_PARAMS*) malloc(sizeof(CLONE_PARAMS));
d2d73c3e 9664
1d7c1841 9665 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
ba869deb 9666 PERL_SET_THX(my_perl);
1d7c1841 9667
acfe0abc 9668# ifdef DEBUGGING
1d7c1841
GS
9669 memset(my_perl, 0xab, sizeof(PerlInterpreter));
9670 PL_markstack = 0;
9671 PL_scopestack = 0;
9672 PL_savestack = 0;
9673 PL_retstack = 0;
66fe0623 9674 PL_sig_pending = 0;
acfe0abc 9675# else /* !DEBUGGING */
1d7c1841 9676 Zero(my_perl, 1, PerlInterpreter);
acfe0abc 9677# endif /* DEBUGGING */
1d7c1841
GS
9678
9679 /* host pointers */
9680 PL_Mem = ipM;
9681 PL_MemShared = ipMS;
9682 PL_MemParse = ipMP;
9683 PL_Env = ipE;
9684 PL_StdIO = ipStd;
9685 PL_LIO = ipLIO;
9686 PL_Dir = ipD;
9687 PL_Sock = ipS;
9688 PL_Proc = ipP;
1d7c1841
GS
9689#else /* !PERL_IMPLICIT_SYS */
9690 IV i;
a8fc9800 9691 CLONE_PARAMS* param = (CLONE_PARAMS*) malloc(sizeof(CLONE_PARAMS));
1d7c1841 9692 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 9693 PERL_SET_THX(my_perl);
1d7c1841 9694
d2d73c3e
AB
9695
9696
1d7c1841
GS
9697# ifdef DEBUGGING
9698 memset(my_perl, 0xab, sizeof(PerlInterpreter));
9699 PL_markstack = 0;
9700 PL_scopestack = 0;
9701 PL_savestack = 0;
9702 PL_retstack = 0;
66fe0623 9703 PL_sig_pending = 0;
1d7c1841
GS
9704# else /* !DEBUGGING */
9705 Zero(my_perl, 1, PerlInterpreter);
9706# endif /* DEBUGGING */
9707#endif /* PERL_IMPLICIT_SYS */
83236556 9708 param->flags = flags;
1d7c1841
GS
9709
9710 /* arena roots */
9711 PL_xiv_arenaroot = NULL;
9712 PL_xiv_root = NULL;
612f20c3 9713 PL_xnv_arenaroot = NULL;
1d7c1841 9714 PL_xnv_root = NULL;
612f20c3 9715 PL_xrv_arenaroot = NULL;
1d7c1841 9716 PL_xrv_root = NULL;
612f20c3 9717 PL_xpv_arenaroot = NULL;
1d7c1841 9718 PL_xpv_root = NULL;
612f20c3 9719 PL_xpviv_arenaroot = NULL;
1d7c1841 9720 PL_xpviv_root = NULL;
612f20c3 9721 PL_xpvnv_arenaroot = NULL;
1d7c1841 9722 PL_xpvnv_root = NULL;
612f20c3 9723 PL_xpvcv_arenaroot = NULL;
1d7c1841 9724 PL_xpvcv_root = NULL;
612f20c3 9725 PL_xpvav_arenaroot = NULL;
1d7c1841 9726 PL_xpvav_root = NULL;
612f20c3 9727 PL_xpvhv_arenaroot = NULL;
1d7c1841 9728 PL_xpvhv_root = NULL;
612f20c3 9729 PL_xpvmg_arenaroot = NULL;
1d7c1841 9730 PL_xpvmg_root = NULL;
612f20c3 9731 PL_xpvlv_arenaroot = NULL;
1d7c1841 9732 PL_xpvlv_root = NULL;
612f20c3 9733 PL_xpvbm_arenaroot = NULL;
1d7c1841 9734 PL_xpvbm_root = NULL;
612f20c3 9735 PL_he_arenaroot = NULL;
1d7c1841
GS
9736 PL_he_root = NULL;
9737 PL_nice_chunk = NULL;
9738 PL_nice_chunk_size = 0;
9739 PL_sv_count = 0;
9740 PL_sv_objcount = 0;
9741 PL_sv_root = Nullsv;
9742 PL_sv_arenaroot = Nullsv;
9743
9744 PL_debug = proto_perl->Idebug;
9745
e5dd39fc
AB
9746#ifdef USE_REENTRANT_API
9747 New(31337, PL_reentrant_buffer,1, REBUF);
9748 New(31337, PL_reentrant_buffer->tmbuff,1, struct tm);
9749#endif
9750
1d7c1841
GS
9751 /* create SV map for pointer relocation */
9752 PL_ptr_table = ptr_table_new();
9753
9754 /* initialize these special pointers as early as possible */
9755 SvANY(&PL_sv_undef) = NULL;
9756 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
9757 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
9758 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
9759
1d7c1841 9760 SvANY(&PL_sv_no) = new_XPVNV();
1d7c1841
GS
9761 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
9762 SvFLAGS(&PL_sv_no) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
9763 SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
9764 SvCUR(&PL_sv_no) = 0;
9765 SvLEN(&PL_sv_no) = 1;
9766 SvNVX(&PL_sv_no) = 0;
9767 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
9768
1d7c1841 9769 SvANY(&PL_sv_yes) = new_XPVNV();
1d7c1841
GS
9770 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
9771 SvFLAGS(&PL_sv_yes) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
9772 SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
9773 SvCUR(&PL_sv_yes) = 1;
9774 SvLEN(&PL_sv_yes) = 2;
9775 SvNVX(&PL_sv_yes) = 1;
9776 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
9777
9778 /* create shared string table */
9779 PL_strtab = newHV();
9780 HvSHAREKEYS_off(PL_strtab);
9781 hv_ksplit(PL_strtab, 512);
9782 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
9783
9784 PL_compiling = proto_perl->Icompiling;
9785 PL_compiling.cop_stashpv = SAVEPV(PL_compiling.cop_stashpv);
9786 PL_compiling.cop_file = SAVEPV(PL_compiling.cop_file);
9787 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
9788 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 9789 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 9790 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 9791 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
9792 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
9793
9794 /* pseudo environmental stuff */
9795 PL_origargc = proto_perl->Iorigargc;
9796 i = PL_origargc;
9797 New(0, PL_origargv, i+1, char*);
9798 PL_origargv[i] = '\0';
9799 while (i-- > 0) {
9800 PL_origargv[i] = SAVEPV(proto_perl->Iorigargv[i]);
9801 }
d2d73c3e 9802
d2d73c3e
AB
9803 param->stashes = newAV(); /* Setup array of objects to call clone on */
9804
a1ea730d 9805#ifdef PERLIO_LAYERS
3a1ee7e8
NIS
9806 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
9807 PerlIO_clone(aTHX_ proto_perl, param);
a1ea730d 9808#endif
d2d73c3e
AB
9809
9810 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
9811 PL_incgv = gv_dup(proto_perl->Iincgv, param);
9812 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 9813 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
9814 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
9815 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
9816
9817 /* switches */
9818 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 9819 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
9820 PL_localpatches = proto_perl->Ilocalpatches;
9821 PL_splitstr = proto_perl->Isplitstr;
9822 PL_preprocess = proto_perl->Ipreprocess;
9823 PL_minus_n = proto_perl->Iminus_n;
9824 PL_minus_p = proto_perl->Iminus_p;
9825 PL_minus_l = proto_perl->Iminus_l;
9826 PL_minus_a = proto_perl->Iminus_a;
9827 PL_minus_F = proto_perl->Iminus_F;
9828 PL_doswitches = proto_perl->Idoswitches;
9829 PL_dowarn = proto_perl->Idowarn;
9830 PL_doextract = proto_perl->Idoextract;
9831 PL_sawampersand = proto_perl->Isawampersand;
9832 PL_unsafe = proto_perl->Iunsafe;
9833 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 9834 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
9835 PL_perldb = proto_perl->Iperldb;
9836 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
1cbb0781 9837 PL_exit_flags = proto_perl->Iexit_flags;
1d7c1841
GS
9838
9839 /* magical thingies */
9840 /* XXX time(&PL_basetime) when asked for? */
9841 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 9842 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
9843
9844 PL_maxsysfd = proto_perl->Imaxsysfd;
9845 PL_multiline = proto_perl->Imultiline;
9846 PL_statusvalue = proto_perl->Istatusvalue;
9847#ifdef VMS
9848 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
9849#endif
0a378802 9850 PL_encoding = sv_dup(proto_perl->Iencoding, param);
1d7c1841 9851
d2f185dc
AMS
9852 /* Clone the regex array */
9853 PL_regex_padav = newAV();
9854 {
9855 I32 len = av_len((AV*)proto_perl->Iregex_padav);
9856 SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
0f95fc41
AB
9857 av_push(PL_regex_padav,
9858 sv_dup_inc(regexen[0],param));
9859 for(i = 1; i <= len; i++) {
9860 if(SvREPADTMP(regexen[i])) {
9861 av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
8cf8f3d1 9862 } else {
0f95fc41
AB
9863 av_push(PL_regex_padav,
9864 SvREFCNT_inc(
8cf8f3d1 9865 newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
cbfa9890 9866 SvIVX(regexen[i])), param)))
0f95fc41
AB
9867 ));
9868 }
d2f185dc
AMS
9869 }
9870 }
9871 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 9872
1d7c1841 9873 /* shortcuts to various I/O objects */
d2d73c3e
AB
9874 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
9875 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
9876 PL_defgv = gv_dup(proto_perl->Idefgv, param);
9877 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
9878 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
9879 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
9880
9881 /* shortcuts to regexp stuff */
d2d73c3e 9882 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
9883
9884 /* shortcuts to misc objects */
d2d73c3e 9885 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
9886
9887 /* shortcuts to debugging objects */
d2d73c3e
AB
9888 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
9889 PL_DBline = gv_dup(proto_perl->IDBline, param);
9890 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
9891 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
9892 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
9893 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
9894 PL_lineary = av_dup(proto_perl->Ilineary, param);
9895 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
9896
9897 /* symbol tables */
d2d73c3e
AB
9898 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
9899 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
9900 PL_nullstash = hv_dup(proto_perl->Inullstash, param);
9901 PL_debstash = hv_dup(proto_perl->Idebstash, param);
9902 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
9903 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
9904
9905 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
ee1c5a4e 9906 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
d2d73c3e
AB
9907 PL_endav = av_dup_inc(proto_perl->Iendav, param);
9908 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
9909 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
9910
9911 PL_sub_generation = proto_perl->Isub_generation;
9912
9913 /* funky return mechanisms */
9914 PL_forkprocess = proto_perl->Iforkprocess;
9915
9916 /* subprocess state */
d2d73c3e 9917 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
9918
9919 /* internal state */
9920 PL_tainting = proto_perl->Itainting;
9921 PL_maxo = proto_perl->Imaxo;
9922 if (proto_perl->Iop_mask)
9923 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
9924 else
9925 PL_op_mask = Nullch;
9926
9927 /* current interpreter roots */
d2d73c3e 9928 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
9929 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
9930 PL_main_start = proto_perl->Imain_start;
e977893f 9931 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
9932 PL_eval_start = proto_perl->Ieval_start;
9933
9934 /* runtime control stuff */
9935 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
9936 PL_copline = proto_perl->Icopline;
9937
9938 PL_filemode = proto_perl->Ifilemode;
9939 PL_lastfd = proto_perl->Ilastfd;
9940 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
9941 PL_Argv = NULL;
9942 PL_Cmd = Nullch;
9943 PL_gensym = proto_perl->Igensym;
9944 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 9945 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
9946 PL_laststatval = proto_perl->Ilaststatval;
9947 PL_laststype = proto_perl->Ilaststype;
9948 PL_mess_sv = Nullsv;
9949
d2d73c3e 9950 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
9951 PL_ofmt = SAVEPV(proto_perl->Iofmt);
9952
9953 /* interpreter atexit processing */
9954 PL_exitlistlen = proto_perl->Iexitlistlen;
9955 if (PL_exitlistlen) {
9956 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
9957 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
9958 }
9959 else
9960 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 9961 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
19e8ce8e
AB
9962 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
9963 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1d7c1841
GS
9964
9965 PL_profiledata = NULL;
a8fc9800 9966 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
1d7c1841 9967 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 9968 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 9969
d2d73c3e
AB
9970 PL_compcv = cv_dup(proto_perl->Icompcv, param);
9971 PL_comppad = av_dup(proto_perl->Icomppad, param);
9972 PL_comppad_name = av_dup(proto_perl->Icomppad_name, param);
1d7c1841
GS
9973 PL_comppad_name_fill = proto_perl->Icomppad_name_fill;
9974 PL_comppad_name_floor = proto_perl->Icomppad_name_floor;
9975 PL_curpad = (SV**)ptr_table_fetch(PL_ptr_table,
9976 proto_perl->Tcurpad);
9977
9978#ifdef HAVE_INTERP_INTERN
9979 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
9980#endif
9981
9982 /* more statics moved here */
9983 PL_generation = proto_perl->Igeneration;
d2d73c3e 9984 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
9985
9986 PL_in_clean_objs = proto_perl->Iin_clean_objs;
9987 PL_in_clean_all = proto_perl->Iin_clean_all;
9988
9989 PL_uid = proto_perl->Iuid;
9990 PL_euid = proto_perl->Ieuid;
9991 PL_gid = proto_perl->Igid;
9992 PL_egid = proto_perl->Iegid;
9993 PL_nomemok = proto_perl->Inomemok;
9994 PL_an = proto_perl->Ian;
9995 PL_cop_seqmax = proto_perl->Icop_seqmax;
9996 PL_op_seqmax = proto_perl->Iop_seqmax;
9997 PL_evalseq = proto_perl->Ievalseq;
9998 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
9999 PL_origalen = proto_perl->Iorigalen;
10000 PL_pidstatus = newHV(); /* XXX flag for cloning? */
10001 PL_osname = SAVEPV(proto_perl->Iosname);
0bb09c15 10002 PL_sh_path = proto_perl->Ish_path; /* XXX never deallocated */
1d7c1841
GS
10003 PL_sighandlerp = proto_perl->Isighandlerp;
10004
10005
10006 PL_runops = proto_perl->Irunops;
10007
10008 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
10009
10010#ifdef CSH
10011 PL_cshlen = proto_perl->Icshlen;
74f1b2b8 10012 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
1d7c1841
GS
10013#endif
10014
10015 PL_lex_state = proto_perl->Ilex_state;
10016 PL_lex_defer = proto_perl->Ilex_defer;
10017 PL_lex_expect = proto_perl->Ilex_expect;
10018 PL_lex_formbrack = proto_perl->Ilex_formbrack;
10019 PL_lex_dojoin = proto_perl->Ilex_dojoin;
10020 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
10021 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
10022 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
10023 PL_lex_op = proto_perl->Ilex_op;
10024 PL_lex_inpat = proto_perl->Ilex_inpat;
10025 PL_lex_inwhat = proto_perl->Ilex_inwhat;
10026 PL_lex_brackets = proto_perl->Ilex_brackets;
10027 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
10028 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
10029 PL_lex_casemods = proto_perl->Ilex_casemods;
10030 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
10031 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
10032
10033 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
10034 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
10035 PL_nexttoke = proto_perl->Inexttoke;
10036
d2d73c3e 10037 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
1d7c1841
GS
10038 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
10039 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10040 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
10041 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10042 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
10043 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10044 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
10045 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
10046 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10047 PL_pending_ident = proto_perl->Ipending_ident;
10048 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
10049
10050 PL_expect = proto_perl->Iexpect;
10051
10052 PL_multi_start = proto_perl->Imulti_start;
10053 PL_multi_end = proto_perl->Imulti_end;
10054 PL_multi_open = proto_perl->Imulti_open;
10055 PL_multi_close = proto_perl->Imulti_close;
10056
10057 PL_error_count = proto_perl->Ierror_count;
10058 PL_subline = proto_perl->Isubline;
d2d73c3e 10059 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841
GS
10060
10061 PL_min_intro_pending = proto_perl->Imin_intro_pending;
10062 PL_max_intro_pending = proto_perl->Imax_intro_pending;
10063 PL_padix = proto_perl->Ipadix;
10064 PL_padix_floor = proto_perl->Ipadix_floor;
10065 PL_pad_reset_pending = proto_perl->Ipad_reset_pending;
10066
10067 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
10068 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10069 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
10070 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10071 PL_last_lop_op = proto_perl->Ilast_lop_op;
10072 PL_in_my = proto_perl->Iin_my;
d2d73c3e 10073 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
10074#ifdef FCRYPT
10075 PL_cryptseen = proto_perl->Icryptseen;
10076#endif
10077
10078 PL_hints = proto_perl->Ihints;
10079
10080 PL_amagic_generation = proto_perl->Iamagic_generation;
10081
10082#ifdef USE_LOCALE_COLLATE
10083 PL_collation_ix = proto_perl->Icollation_ix;
10084 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
10085 PL_collation_standard = proto_perl->Icollation_standard;
10086 PL_collxfrm_base = proto_perl->Icollxfrm_base;
10087 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
10088#endif /* USE_LOCALE_COLLATE */
10089
10090#ifdef USE_LOCALE_NUMERIC
10091 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
10092 PL_numeric_standard = proto_perl->Inumeric_standard;
10093 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 10094 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
10095#endif /* !USE_LOCALE_NUMERIC */
10096
10097 /* utf8 character classes */
d2d73c3e
AB
10098 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
10099 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
10100 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
10101 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
10102 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
10103 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
10104 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
10105 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
10106 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
10107 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
10108 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
10109 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
10110 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
10111 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
10112 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
10113 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
10114 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
b4e400f9 10115 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
1d7c1841
GS
10116
10117 /* swatch cache */
10118 PL_last_swash_hv = Nullhv; /* reinits on demand */
10119 PL_last_swash_klen = 0;
10120 PL_last_swash_key[0]= '\0';
10121 PL_last_swash_tmps = (U8*)NULL;
10122 PL_last_swash_slen = 0;
10123
10124 /* perly.c globals */
10125 PL_yydebug = proto_perl->Iyydebug;
10126 PL_yynerrs = proto_perl->Iyynerrs;
10127 PL_yyerrflag = proto_perl->Iyyerrflag;
10128 PL_yychar = proto_perl->Iyychar;
10129 PL_yyval = proto_perl->Iyyval;
10130 PL_yylval = proto_perl->Iyylval;
10131
10132 PL_glob_index = proto_perl->Iglob_index;
10133 PL_srand_called = proto_perl->Isrand_called;
10134 PL_uudmap['M'] = 0; /* reinits on demand */
10135 PL_bitcount = Nullch; /* reinits on demand */
10136
66fe0623
NIS
10137 if (proto_perl->Ipsig_pend) {
10138 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 10139 }
66fe0623
NIS
10140 else {
10141 PL_psig_pend = (int*)NULL;
10142 }
10143
1d7c1841 10144 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
10145 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
10146 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 10147 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
10148 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
10149 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
10150 }
10151 }
10152 else {
10153 PL_psig_ptr = (SV**)NULL;
10154 PL_psig_name = (SV**)NULL;
10155 }
10156
10157 /* thrdvar.h stuff */
10158
a0739874 10159 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
10160 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
10161 PL_tmps_ix = proto_perl->Ttmps_ix;
10162 PL_tmps_max = proto_perl->Ttmps_max;
10163 PL_tmps_floor = proto_perl->Ttmps_floor;
10164 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
10165 i = 0;
10166 while (i <= PL_tmps_ix) {
d2d73c3e 10167 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
10168 ++i;
10169 }
10170
10171 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
10172 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
10173 Newz(54, PL_markstack, i, I32);
10174 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
10175 - proto_perl->Tmarkstack);
10176 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
10177 - proto_perl->Tmarkstack);
10178 Copy(proto_perl->Tmarkstack, PL_markstack,
10179 PL_markstack_ptr - PL_markstack + 1, I32);
10180
10181 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
10182 * NOTE: unlike the others! */
10183 PL_scopestack_ix = proto_perl->Tscopestack_ix;
10184 PL_scopestack_max = proto_perl->Tscopestack_max;
10185 Newz(54, PL_scopestack, PL_scopestack_max, I32);
10186 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
10187
10188 /* next push_return() sets PL_retstack[PL_retstack_ix]
10189 * NOTE: unlike the others! */
10190 PL_retstack_ix = proto_perl->Tretstack_ix;
10191 PL_retstack_max = proto_perl->Tretstack_max;
10192 Newz(54, PL_retstack, PL_retstack_max, OP*);
10193 Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, I32);
10194
10195 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 10196 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
10197
10198 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
10199 PL_curstack = av_dup(proto_perl->Tcurstack, param);
10200 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
10201
10202 /* next PUSHs() etc. set *(PL_stack_sp+1) */
10203 PL_stack_base = AvARRAY(PL_curstack);
10204 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
10205 - proto_perl->Tstack_base);
10206 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
10207
10208 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
10209 * NOTE: unlike the others! */
10210 PL_savestack_ix = proto_perl->Tsavestack_ix;
10211 PL_savestack_max = proto_perl->Tsavestack_max;
10212 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 10213 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
10214 }
10215 else {
10216 init_stacks();
985e7056 10217 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
10218 }
10219
10220 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
10221 PL_top_env = &PL_start_env;
10222
10223 PL_op = proto_perl->Top;
10224
10225 PL_Sv = Nullsv;
10226 PL_Xpv = (XPV*)NULL;
10227 PL_na = proto_perl->Tna;
10228
10229 PL_statbuf = proto_perl->Tstatbuf;
10230 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
10231 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
10232 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
10233#ifdef HAS_TIMES
10234 PL_timesbuf = proto_perl->Ttimesbuf;
10235#endif
10236
10237 PL_tainted = proto_perl->Ttainted;
10238 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
10239 PL_rs = sv_dup_inc(proto_perl->Trs, param);
10240 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
10241 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
10242 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 10243 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
10244 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
10245 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
10246 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
10247
10248 PL_restartop = proto_perl->Trestartop;
10249 PL_in_eval = proto_perl->Tin_eval;
10250 PL_delaymagic = proto_perl->Tdelaymagic;
10251 PL_dirty = proto_perl->Tdirty;
10252 PL_localizing = proto_perl->Tlocalizing;
10253
14dd3ad8 10254#ifdef PERL_FLEXIBLE_EXCEPTIONS
1d7c1841 10255 PL_protect = proto_perl->Tprotect;
14dd3ad8 10256#endif
d2d73c3e 10257 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
1d7c1841
GS
10258 PL_av_fetch_sv = Nullsv;
10259 PL_hv_fetch_sv = Nullsv;
10260 Zero(&PL_hv_fetch_ent_mh, 1, HE); /* XXX */
10261 PL_modcount = proto_perl->Tmodcount;
10262 PL_lastgotoprobe = Nullop;
10263 PL_dumpindent = proto_perl->Tdumpindent;
10264
10265 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
10266 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
10267 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
10268 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
10269 PL_sortcxix = proto_perl->Tsortcxix;
10270 PL_efloatbuf = Nullch; /* reinits on demand */
10271 PL_efloatsize = 0; /* reinits on demand */
10272
10273 /* regex stuff */
10274
10275 PL_screamfirst = NULL;
10276 PL_screamnext = NULL;
10277 PL_maxscream = -1; /* reinits on demand */
10278 PL_lastscream = Nullsv;
10279
10280 PL_watchaddr = NULL;
10281 PL_watchok = Nullch;
10282
10283 PL_regdummy = proto_perl->Tregdummy;
10284 PL_regcomp_parse = Nullch;
10285 PL_regxend = Nullch;
10286 PL_regcode = (regnode*)NULL;
10287 PL_regnaughty = 0;
10288 PL_regsawback = 0;
10289 PL_regprecomp = Nullch;
10290 PL_regnpar = 0;
10291 PL_regsize = 0;
10292 PL_regflags = 0;
10293 PL_regseen = 0;
10294 PL_seen_zerolen = 0;
10295 PL_seen_evals = 0;
10296 PL_regcomp_rx = (regexp*)NULL;
10297 PL_extralen = 0;
10298 PL_colorset = 0; /* reinits PL_colors[] */
10299 /*PL_colors[6] = {0,0,0,0,0,0};*/
10300 PL_reg_whilem_seen = 0;
10301 PL_reginput = Nullch;
10302 PL_regbol = Nullch;
10303 PL_regeol = Nullch;
10304 PL_regstartp = (I32*)NULL;
10305 PL_regendp = (I32*)NULL;
10306 PL_reglastparen = (U32*)NULL;
10307 PL_regtill = Nullch;
1d7c1841
GS
10308 PL_reg_start_tmp = (char**)NULL;
10309 PL_reg_start_tmpl = 0;
10310 PL_regdata = (struct reg_data*)NULL;
10311 PL_bostr = Nullch;
10312 PL_reg_flags = 0;
10313 PL_reg_eval_set = 0;
10314 PL_regnarrate = 0;
10315 PL_regprogram = (regnode*)NULL;
10316 PL_regindent = 0;
10317 PL_regcc = (CURCUR*)NULL;
10318 PL_reg_call_cc = (struct re_cc_state*)NULL;
10319 PL_reg_re = (regexp*)NULL;
10320 PL_reg_ganch = Nullch;
10321 PL_reg_sv = Nullsv;
53c4c00c 10322 PL_reg_match_utf8 = FALSE;
1d7c1841
GS
10323 PL_reg_magic = (MAGIC*)NULL;
10324 PL_reg_oldpos = 0;
10325 PL_reg_oldcurpm = (PMOP*)NULL;
10326 PL_reg_curpm = (PMOP*)NULL;
10327 PL_reg_oldsaved = Nullch;
10328 PL_reg_oldsavedlen = 0;
10329 PL_reg_maxiter = 0;
10330 PL_reg_leftiter = 0;
10331 PL_reg_poscache = Nullch;
10332 PL_reg_poscache_size= 0;
10333
10334 /* RE engine - function pointers */
10335 PL_regcompp = proto_perl->Tregcompp;
10336 PL_regexecp = proto_perl->Tregexecp;
10337 PL_regint_start = proto_perl->Tregint_start;
10338 PL_regint_string = proto_perl->Tregint_string;
10339 PL_regfree = proto_perl->Tregfree;
10340
10341 PL_reginterp_cnt = 0;
10342 PL_reg_starttry = 0;
10343
a2efc822
SC
10344 /* Pluggable optimizer */
10345 PL_peepp = proto_perl->Tpeepp;
10346
a0739874
DM
10347 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
10348 ptr_table_free(PL_ptr_table);
10349 PL_ptr_table = NULL;
10350 }
8cf8f3d1 10351
f284b03f
AMS
10352 /* Call the ->CLONE method, if it exists, for each of the stashes
10353 identified by sv_dup() above.
10354 */
d2d73c3e
AB
10355 while(av_len(param->stashes) != -1) {
10356 HV* stash = (HV*) av_shift(param->stashes);
f284b03f
AMS
10357 GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
10358 if (cloner && GvCV(cloner)) {
10359 dSP;
10360 ENTER;
10361 SAVETMPS;
10362 PUSHMARK(SP);
dc507217 10363 XPUSHs(sv_2mortal(newSVpv(HvNAME(stash), 0)));
f284b03f
AMS
10364 PUTBACK;
10365 call_sv((SV*)GvCV(cloner), G_DISCARD);
10366 FREETMPS;
10367 LEAVE;
10368 }
4a09accc 10369 }
a0739874 10370
dc507217
DM
10371 SvREFCNT_dec(param->stashes);
10372 Safefree(param);
10373
1d7c1841 10374 return my_perl;
1d7c1841
GS
10375}
10376
1d7c1841 10377#endif /* USE_ITHREADS */
a0ae6670 10378
9f4817db
JH
10379/*
10380=for apidoc sv_recode_to_utf8
10381
5d170f3a
JH
10382The encoding is assumed to be an Encode object, on entry the PV
10383of the sv is assumed to be octets in that encoding, and the sv
10384will be converted into Unicode (and UTF-8).
9f4817db 10385
5d170f3a
JH
10386If the sv already is UTF-8 (or if it is not POK), or if the encoding
10387is not a reference, nothing is done to the sv. If the encoding is not
1768d7eb
JH
10388an C<Encode::XS> Encoding object, bad things will happen.
10389(See F<lib/encoding.pm> and L<Encode>).
9f4817db 10390
5d170f3a 10391The PV of the sv is returned.
9f4817db 10392
5d170f3a
JH
10393=cut */
10394
10395char *
10396Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
10397{
121910a4 10398 if (SvPOK(sv) && !DO_UTF8(sv) && SvROK(encoding)) {
5d170f3a
JH
10399 SV *uni;
10400 STRLEN len;
10401 char *s;
10402 dSP;
10403 ENTER;
10404 SAVETMPS;
10405 PUSHMARK(sp);
10406 EXTEND(SP, 3);
10407 XPUSHs(encoding);
10408 XPUSHs(sv);
10409 XPUSHs(&PL_sv_yes);
10410 PUTBACK;
10411 call_method("decode", G_SCALAR);
10412 SPAGAIN;
10413 uni = POPs;
10414 PUTBACK;
3e169325 10415 s = SvPV(uni, len);
5d170f3a
JH
10416 if (s != SvPVX(sv)) {
10417 SvGROW(sv, len);
10418 Move(s, SvPVX(sv), len, char);
10419 SvCUR_set(sv, len);
10420 }
10421 FREETMPS;
10422 LEAVE;
10423 SvUTF8_on(sv);
9f4817db 10424 }
5d170f3a 10425 return SvPVX(sv);
9f4817db
JH
10426}
10427