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