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