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