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