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