This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
-I and MakeMaker again
[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 3615
7fb37951
AMS
3616#ifdef GV_UNIQUE_CHECK
3617 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
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
7fb37951
AMS
3662#ifdef GV_UNIQUE_CHECK
3663 if (GvUNIQUE((GV*)dstr)) {
5bd07a3d
DM
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);
25716404 4104 unsharepvn(pvx, SvUTF8(sv) ? -(I32)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)) {
25716404
GS
4949 unsharepvn(SvPVX(sv),
4950 SvUTF8(sv) ? -(I32)SvCUR(sv) : SvCUR(sv),
4951 SvUVX(sv));
1c846c1f
NIS
4952 SvFAKE_off(sv);
4953 }
79072805 4954 break;
a0d0e21e 4955/*
79072805 4956 case SVt_NV:
79072805 4957 case SVt_IV:
79072805
LW
4958 case SVt_NULL:
4959 break;
a0d0e21e 4960*/
79072805
LW
4961 }
4962
4963 switch (SvTYPE(sv)) {
4964 case SVt_NULL:
4965 break;
79072805
LW
4966 case SVt_IV:
4967 del_XIV(SvANY(sv));
4968 break;
4969 case SVt_NV:
4970 del_XNV(SvANY(sv));
4971 break;
ed6116ce
LW
4972 case SVt_RV:
4973 del_XRV(SvANY(sv));
4974 break;
79072805
LW
4975 case SVt_PV:
4976 del_XPV(SvANY(sv));
4977 break;
4978 case SVt_PVIV:
4979 del_XPVIV(SvANY(sv));
4980 break;
4981 case SVt_PVNV:
4982 del_XPVNV(SvANY(sv));
4983 break;
4984 case SVt_PVMG:
4985 del_XPVMG(SvANY(sv));
4986 break;
4987 case SVt_PVLV:
4988 del_XPVLV(SvANY(sv));
4989 break;
4990 case SVt_PVAV:
4991 del_XPVAV(SvANY(sv));
4992 break;
4993 case SVt_PVHV:
4994 del_XPVHV(SvANY(sv));
4995 break;
4996 case SVt_PVCV:
4997 del_XPVCV(SvANY(sv));
4998 break;
4999 case SVt_PVGV:
5000 del_XPVGV(SvANY(sv));
ec12f114
JPC
5001 /* code duplication for increased performance. */
5002 SvFLAGS(sv) &= SVf_BREAK;
5003 SvFLAGS(sv) |= SVTYPEMASK;
5004 /* decrease refcount of the stash that owns this GV, if any */
5005 if (stash)
5006 SvREFCNT_dec(stash);
5007 return; /* not break, SvFLAGS reset already happened */
79072805
LW
5008 case SVt_PVBM:
5009 del_XPVBM(SvANY(sv));
5010 break;
5011 case SVt_PVFM:
5012 del_XPVFM(SvANY(sv));
5013 break;
8990e307
LW
5014 case SVt_PVIO:
5015 del_XPVIO(SvANY(sv));
5016 break;
79072805 5017 }
a0d0e21e 5018 SvFLAGS(sv) &= SVf_BREAK;
8990e307 5019 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
5020}
5021
645c22ef
DM
5022/*
5023=for apidoc sv_newref
5024
5025Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5026instead.
5027
5028=cut
5029*/
5030
79072805 5031SV *
864dbfa3 5032Perl_sv_newref(pTHX_ SV *sv)
79072805 5033{
463ee0b2 5034 if (sv)
dce16143 5035 ATOMIC_INC(SvREFCNT(sv));
79072805
LW
5036 return sv;
5037}
5038
c461cf8f
JH
5039/*
5040=for apidoc sv_free
5041
645c22ef
DM
5042Decrement an SV's reference count, and if it drops to zero, call
5043C<sv_clear> to invoke destructors and free up any memory used by
5044the body; finally, deallocate the SV's head itself.
5045Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5046
5047=cut
5048*/
5049
79072805 5050void
864dbfa3 5051Perl_sv_free(pTHX_ SV *sv)
79072805 5052{
dce16143
MB
5053 int refcount_is_zero;
5054
79072805
LW
5055 if (!sv)
5056 return;
a0d0e21e
LW
5057 if (SvREFCNT(sv) == 0) {
5058 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5059 /* this SV's refcnt has been artificially decremented to
5060 * trigger cleanup */
a0d0e21e 5061 return;
3280af22 5062 if (PL_in_clean_all) /* All is fair */
1edc1566 5063 return;
d689ffdd
JP
5064 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5065 /* make sure SvREFCNT(sv)==0 happens very seldom */
5066 SvREFCNT(sv) = (~(U32)0)/2;
5067 return;
5068 }
0453d815
PM
5069 if (ckWARN_d(WARN_INTERNAL))
5070 Perl_warner(aTHX_ WARN_INTERNAL, "Attempt to free unreferenced scalar");
79072805
LW
5071 return;
5072 }
dce16143
MB
5073 ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
5074 if (!refcount_is_zero)
8990e307 5075 return;
463ee0b2
LW
5076#ifdef DEBUGGING
5077 if (SvTEMP(sv)) {
0453d815 5078 if (ckWARN_d(WARN_DEBUGGING))
f248d071 5079 Perl_warner(aTHX_ WARN_DEBUGGING,
1d7c1841
GS
5080 "Attempt to free temp prematurely: SV 0x%"UVxf,
5081 PTR2UV(sv));
79072805 5082 return;
79072805 5083 }
463ee0b2 5084#endif
d689ffdd
JP
5085 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5086 /* make sure SvREFCNT(sv)==0 happens very seldom */
5087 SvREFCNT(sv) = (~(U32)0)/2;
5088 return;
5089 }
79072805 5090 sv_clear(sv);
477f5d66
CS
5091 if (! SvREFCNT(sv))
5092 del_SV(sv);
79072805
LW
5093}
5094
954c1994
GS
5095/*
5096=for apidoc sv_len
5097
645c22ef
DM
5098Returns the length of the string in the SV. Handles magic and type
5099coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5100
5101=cut
5102*/
5103
79072805 5104STRLEN
864dbfa3 5105Perl_sv_len(pTHX_ register SV *sv)
79072805 5106{
463ee0b2 5107 STRLEN len;
79072805
LW
5108
5109 if (!sv)
5110 return 0;
5111
8990e307 5112 if (SvGMAGICAL(sv))
565764a8 5113 len = mg_length(sv);
8990e307 5114 else
497b47a8 5115 (void)SvPV(sv, len);
463ee0b2 5116 return len;
79072805
LW
5117}
5118
c461cf8f
JH
5119/*
5120=for apidoc sv_len_utf8
5121
5122Returns the number of characters in the string in an SV, counting wide
645c22ef 5123UTF8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5124
5125=cut
5126*/
5127
a0ed51b3 5128STRLEN
864dbfa3 5129Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 5130{
a0ed51b3
LW
5131 if (!sv)
5132 return 0;
5133
a0ed51b3 5134 if (SvGMAGICAL(sv))
b76347f2 5135 return mg_length(sv);
a0ed51b3 5136 else
b76347f2
JH
5137 {
5138 STRLEN len;
5139 U8 *s = (U8*)SvPV(sv, len);
5140
d6efbbad 5141 return Perl_utf8_length(aTHX_ s, s + len);
a0ed51b3 5142 }
a0ed51b3
LW
5143}
5144
645c22ef
DM
5145/*
5146=for apidoc sv_pos_u2b
5147
5148Converts the value pointed to by offsetp from a count of UTF8 chars from
5149the start of the string, to a count of the equivalent number of bytes; if
5150lenp is non-zero, it does the same to lenp, but this time starting from
5151the offset, rather than from the start of the string. Handles magic and
5152type coercion.
5153
5154=cut
5155*/
5156
a0ed51b3 5157void
864dbfa3 5158Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 5159{
dfe13c55
GS
5160 U8 *start;
5161 U8 *s;
5162 U8 *send;
a0ed51b3
LW
5163 I32 uoffset = *offsetp;
5164 STRLEN len;
5165
5166 if (!sv)
5167 return;
5168
dfe13c55 5169 start = s = (U8*)SvPV(sv, len);
a0ed51b3
LW
5170 send = s + len;
5171 while (s < send && uoffset--)
5172 s += UTF8SKIP(s);
bb40f870
GA
5173 if (s >= send)
5174 s = send;
a0ed51b3
LW
5175 *offsetp = s - start;
5176 if (lenp) {
5177 I32 ulen = *lenp;
5178 start = s;
5179 while (s < send && ulen--)
5180 s += UTF8SKIP(s);
bb40f870
GA
5181 if (s >= send)
5182 s = send;
a0ed51b3
LW
5183 *lenp = s - start;
5184 }
5185 return;
5186}
5187
645c22ef
DM
5188/*
5189=for apidoc sv_pos_b2u
5190
5191Converts the value pointed to by offsetp from a count of bytes from the
5192start of the string, to a count of the equivalent number of UTF8 chars.
5193Handles magic and type coercion.
5194
5195=cut
5196*/
5197
a0ed51b3 5198void
864dbfa3 5199Perl_sv_pos_b2u(pTHX_ register SV *sv, I32* offsetp)
a0ed51b3 5200{
dfe13c55
GS
5201 U8 *s;
5202 U8 *send;
a0ed51b3
LW
5203 STRLEN len;
5204
5205 if (!sv)
5206 return;
5207
dfe13c55 5208 s = (U8*)SvPV(sv, len);
a0ed51b3 5209 if (len < *offsetp)
a0dbb045 5210 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
a0ed51b3
LW
5211 send = s + *offsetp;
5212 len = 0;
5213 while (s < send) {
a0dbb045 5214 STRLEN n;
2b9d42f0
NIS
5215 /* Call utf8n_to_uvchr() to validate the sequence */
5216 utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
5217 if (n > 0) {
a0dbb045
JH
5218 s += n;
5219 len++;
5220 }
5221 else
5222 break;
a0ed51b3
LW
5223 }
5224 *offsetp = len;
5225 return;
5226}
5227
954c1994
GS
5228/*
5229=for apidoc sv_eq
5230
5231Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
5232identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5233coerce its args to strings if necessary.
954c1994
GS
5234
5235=cut
5236*/
5237
79072805 5238I32
e01b9e88 5239Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805
LW
5240{
5241 char *pv1;
463ee0b2 5242 STRLEN cur1;
79072805 5243 char *pv2;
463ee0b2 5244 STRLEN cur2;
e01b9e88 5245 I32 eq = 0;
db42d148 5246 char *tpv = Nullch;
79072805 5247
e01b9e88 5248 if (!sv1) {
79072805
LW
5249 pv1 = "";
5250 cur1 = 0;
5251 }
463ee0b2 5252 else
e01b9e88 5253 pv1 = SvPV(sv1, cur1);
79072805 5254
e01b9e88
SC
5255 if (!sv2){
5256 pv2 = "";
5257 cur2 = 0;
92d29cee 5258 }
e01b9e88
SC
5259 else
5260 pv2 = SvPV(sv2, cur2);
79072805 5261
e01b9e88 5262 /* do not utf8ize the comparands as a side-effect */
0064a8a9 5263 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
f9a63242 5264 bool is_utf8 = TRUE;
db42d148 5265 /* UTF-8ness differs */
1aa99e6b
IH
5266 if (PL_hints & HINT_UTF8_DISTINCT)
5267 return FALSE;
5268
e01b9e88 5269 if (SvUTF8(sv1)) {
db42d148 5270 /* sv1 is the UTF-8 one , If is equal it must be downgrade-able */
f34ff0a8 5271 char *pv = (char*)bytes_from_utf8((U8*)pv1, &cur1, &is_utf8);
db42d148
NIS
5272 if (pv != pv1)
5273 pv1 = tpv = pv;
e01b9e88
SC
5274 }
5275 else {
db42d148 5276 /* sv2 is the UTF-8 one , If is equal it must be downgrade-able */
f34ff0a8 5277 char *pv = (char *)bytes_from_utf8((U8*)pv2, &cur2, &is_utf8);
db42d148
NIS
5278 if (pv != pv2)
5279 pv2 = tpv = pv;
5280 }
5281 if (is_utf8) {
5282 /* Downgrade not possible - cannot be eq */
5283 return FALSE;
e01b9e88
SC
5284 }
5285 }
79072805 5286
e01b9e88
SC
5287 if (cur1 == cur2)
5288 eq = memEQ(pv1, pv2, cur1);
5289
db42d148
NIS
5290 if (tpv != Nullch)
5291 Safefree(tpv);
e01b9e88
SC
5292
5293 return eq;
79072805
LW
5294}
5295
954c1994
GS
5296/*
5297=for apidoc sv_cmp
5298
5299Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
5300string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
5301C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5302coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
5303
5304=cut
5305*/
5306
79072805 5307I32
e01b9e88 5308Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 5309{
560a288e
GS
5310 STRLEN cur1, cur2;
5311 char *pv1, *pv2;
1c846c1f 5312 I32 cmp;
e01b9e88
SC
5313 bool pv1tmp = FALSE;
5314 bool pv2tmp = FALSE;
560a288e 5315
e01b9e88
SC
5316 if (!sv1) {
5317 pv1 = "";
560a288e
GS
5318 cur1 = 0;
5319 }
e01b9e88
SC
5320 else
5321 pv1 = SvPV(sv1, cur1);
560a288e 5322
e01b9e88
SC
5323 if (!sv2){
5324 pv2 = "";
560a288e
GS
5325 cur2 = 0;
5326 }
e01b9e88
SC
5327 else
5328 pv2 = SvPV(sv2, cur2);
79072805 5329
e01b9e88 5330 /* do not utf8ize the comparands as a side-effect */
0064a8a9 5331 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
1aa99e6b
IH
5332 if (PL_hints & HINT_UTF8_DISTINCT)
5333 return SvUTF8(sv1) ? 1 : -1;
5334
e01b9e88
SC
5335 if (SvUTF8(sv1)) {
5336 pv2 = (char*)bytes_to_utf8((U8*)pv2, &cur2);
5337 pv2tmp = TRUE;
5338 }
5339 else {
5340 pv1 = (char*)bytes_to_utf8((U8*)pv1, &cur1);
5341 pv1tmp = TRUE;
5342 }
5343 }
79072805 5344
e01b9e88
SC
5345 if (!cur1) {
5346 cmp = cur2 ? -1 : 0;
5347 } else if (!cur2) {
5348 cmp = 1;
5349 } else {
5350 I32 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
5351
5352 if (retval) {
5353 cmp = retval < 0 ? -1 : 1;
5354 } else if (cur1 == cur2) {
5355 cmp = 0;
5356 } else {
5357 cmp = cur1 < cur2 ? -1 : 1;
5358 }
5359 }
16660edb 5360
e01b9e88
SC
5361 if (pv1tmp)
5362 Safefree(pv1);
5363 if (pv2tmp)
5364 Safefree(pv2);
16660edb 5365
e01b9e88 5366 return cmp;
bbce6d69 5367}
16660edb 5368
c461cf8f
JH
5369/*
5370=for apidoc sv_cmp_locale
5371
645c22ef
DM
5372Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
5373'use bytes' aware, handles get magic, and will coerce its args to strings
5374if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
5375
5376=cut
5377*/
5378
bbce6d69 5379I32
864dbfa3 5380Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 5381{
36477c24 5382#ifdef USE_LOCALE_COLLATE
16660edb 5383
bbce6d69 5384 char *pv1, *pv2;
5385 STRLEN len1, len2;
5386 I32 retval;
16660edb 5387
3280af22 5388 if (PL_collation_standard)
bbce6d69 5389 goto raw_compare;
16660edb 5390
bbce6d69 5391 len1 = 0;
8ac85365 5392 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 5393 len2 = 0;
8ac85365 5394 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 5395
bbce6d69 5396 if (!pv1 || !len1) {
5397 if (pv2 && len2)
5398 return -1;
5399 else
5400 goto raw_compare;
5401 }
5402 else {
5403 if (!pv2 || !len2)
5404 return 1;
5405 }
16660edb 5406
bbce6d69 5407 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 5408
bbce6d69 5409 if (retval)
16660edb 5410 return retval < 0 ? -1 : 1;
5411
bbce6d69 5412 /*
5413 * When the result of collation is equality, that doesn't mean
5414 * that there are no differences -- some locales exclude some
5415 * characters from consideration. So to avoid false equalities,
5416 * we use the raw string as a tiebreaker.
5417 */
16660edb 5418
bbce6d69 5419 raw_compare:
5420 /* FALL THROUGH */
16660edb 5421
36477c24 5422#endif /* USE_LOCALE_COLLATE */
16660edb 5423
bbce6d69 5424 return sv_cmp(sv1, sv2);
5425}
79072805 5426
645c22ef 5427
36477c24 5428#ifdef USE_LOCALE_COLLATE
645c22ef 5429
7a4c00b4 5430/*
645c22ef
DM
5431=for apidoc sv_collxfrm
5432
5433Add Collate Transform magic to an SV if it doesn't already have it.
5434
5435Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
5436scalar data of the variable, but transformed to such a format that a normal
5437memory comparison can be used to compare the data according to the locale
5438settings.
5439
5440=cut
5441*/
5442
bbce6d69 5443char *
864dbfa3 5444Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 5445{
7a4c00b4 5446 MAGIC *mg;
16660edb 5447
14befaf4 5448 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 5449 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 5450 char *s, *xf;
5451 STRLEN len, xlen;
5452
7a4c00b4 5453 if (mg)
5454 Safefree(mg->mg_ptr);
bbce6d69 5455 s = SvPV(sv, len);
5456 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 5457 if (SvREADONLY(sv)) {
5458 SAVEFREEPV(xf);
5459 *nxp = xlen;
3280af22 5460 return xf + sizeof(PL_collation_ix);
ff0cee69 5461 }
7a4c00b4 5462 if (! mg) {
14befaf4
DM
5463 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
5464 mg = mg_find(sv, PERL_MAGIC_collxfrm);
7a4c00b4 5465 assert(mg);
bbce6d69 5466 }
7a4c00b4 5467 mg->mg_ptr = xf;
565764a8 5468 mg->mg_len = xlen;
7a4c00b4 5469 }
5470 else {
ff0cee69 5471 if (mg) {
5472 mg->mg_ptr = NULL;
565764a8 5473 mg->mg_len = -1;
ff0cee69 5474 }
bbce6d69 5475 }
5476 }
7a4c00b4 5477 if (mg && mg->mg_ptr) {
565764a8 5478 *nxp = mg->mg_len;
3280af22 5479 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 5480 }
5481 else {
5482 *nxp = 0;
5483 return NULL;
16660edb 5484 }
79072805
LW
5485}
5486
36477c24 5487#endif /* USE_LOCALE_COLLATE */
bbce6d69 5488
c461cf8f
JH
5489/*
5490=for apidoc sv_gets
5491
5492Get a line from the filehandle and store it into the SV, optionally
5493appending to the currently-stored string.
5494
5495=cut
5496*/
5497
79072805 5498char *
864dbfa3 5499Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 5500{
c07a80fd 5501 char *rsptr;
5502 STRLEN rslen;
5503 register STDCHAR rslast;
5504 register STDCHAR *bp;
5505 register I32 cnt;
9c5ffd7c 5506 I32 i = 0;
c07a80fd 5507
2213622d 5508 SV_CHECK_THINKFIRST(sv);
6fc92669 5509 (void)SvUPGRADE(sv, SVt_PV);
99491443 5510
ff68c719 5511 SvSCREAM_off(sv);
c07a80fd 5512
3280af22 5513 if (RsSNARF(PL_rs)) {
c07a80fd 5514 rsptr = NULL;
5515 rslen = 0;
5516 }
3280af22 5517 else if (RsRECORD(PL_rs)) {
5b2b9c68
HM
5518 I32 recsize, bytesread;
5519 char *buffer;
5520
5521 /* Grab the size of the record we're getting */
3280af22 5522 recsize = SvIV(SvRV(PL_rs));
5b2b9c68 5523 (void)SvPOK_only(sv); /* Validate pointer */
e670df4e 5524 buffer = SvGROW(sv, recsize + 1);
5b2b9c68
HM
5525 /* Go yank in */
5526#ifdef VMS
5527 /* VMS wants read instead of fread, because fread doesn't respect */
5528 /* RMS record boundaries. This is not necessarily a good thing to be */
5529 /* doing, but we've got no other real choice */
5530 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
5531#else
5532 bytesread = PerlIO_read(fp, buffer, recsize);
5533#endif
5534 SvCUR_set(sv, bytesread);
e670df4e 5535 buffer[bytesread] = '\0';
7d59b7e4
NIS
5536 if (PerlIO_isutf8(fp))
5537 SvUTF8_on(sv);
5538 else
5539 SvUTF8_off(sv);
5b2b9c68
HM
5540 return(SvCUR(sv) ? SvPVX(sv) : Nullch);
5541 }
3280af22 5542 else if (RsPARA(PL_rs)) {
c07a80fd 5543 rsptr = "\n\n";
5544 rslen = 2;
5545 }
7d59b7e4
NIS
5546 else {
5547 /* Get $/ i.e. PL_rs into same encoding as stream wants */
5548 if (PerlIO_isutf8(fp)) {
5549 rsptr = SvPVutf8(PL_rs, rslen);
5550 }
5551 else {
5552 if (SvUTF8(PL_rs)) {
5553 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
5554 Perl_croak(aTHX_ "Wide character in $/");
5555 }
5556 }
5557 rsptr = SvPV(PL_rs, rslen);
5558 }
5559 }
5560
c07a80fd 5561 rslast = rslen ? rsptr[rslen - 1] : '\0';
5562
3280af22 5563 if (RsPARA(PL_rs)) { /* have to do this both before and after */
79072805 5564 do { /* to make sure file boundaries work right */
760ac839 5565 if (PerlIO_eof(fp))
a0d0e21e 5566 return 0;
760ac839 5567 i = PerlIO_getc(fp);
79072805 5568 if (i != '\n') {
a0d0e21e
LW
5569 if (i == -1)
5570 return 0;
760ac839 5571 PerlIO_ungetc(fp,i);
79072805
LW
5572 break;
5573 }
5574 } while (i != EOF);
5575 }
c07a80fd 5576
760ac839
LW
5577 /* See if we know enough about I/O mechanism to cheat it ! */
5578
5579 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 5580 of abstracting out stdio interface. One call should be cheap
760ac839
LW
5581 enough here - and may even be a macro allowing compile
5582 time optimization.
5583 */
5584
5585 if (PerlIO_fast_gets(fp)) {
5586
5587 /*
5588 * We're going to steal some values from the stdio struct
5589 * and put EVERYTHING in the innermost loop into registers.
5590 */
5591 register STDCHAR *ptr;
5592 STRLEN bpx;
5593 I32 shortbuffered;
5594
16660edb 5595#if defined(VMS) && defined(PERLIO_IS_STDIO)
5596 /* An ungetc()d char is handled separately from the regular
5597 * buffer, so we getc() it back out and stuff it in the buffer.
5598 */
5599 i = PerlIO_getc(fp);
5600 if (i == EOF) return 0;
5601 *(--((*fp)->_ptr)) = (unsigned char) i;
5602 (*fp)->_cnt++;
5603#endif
c07a80fd 5604
c2960299 5605 /* Here is some breathtakingly efficient cheating */
c07a80fd 5606
a20bf0c3 5607 cnt = PerlIO_get_cnt(fp); /* get count into register */
a0d0e21e 5608 (void)SvPOK_only(sv); /* validate pointer */
79072805
LW
5609 if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
5610 if (cnt > 80 && SvLEN(sv) > append) {
5611 shortbuffered = cnt - SvLEN(sv) + append + 1;
5612 cnt -= shortbuffered;
5613 }
5614 else {
5615 shortbuffered = 0;
bbce6d69 5616 /* remember that cnt can be negative */
5617 SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
79072805
LW
5618 }
5619 }
5620 else
5621 shortbuffered = 0;
c07a80fd 5622 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
a20bf0c3 5623 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 5624 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5625 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 5626 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5627 "Screamer: entering: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5628 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5629 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
5630 for (;;) {
5631 screamer:
93a17b20 5632 if (cnt > 0) {
c07a80fd 5633 if (rslen) {
760ac839
LW
5634 while (cnt > 0) { /* this | eat */
5635 cnt--;
c07a80fd 5636 if ((*bp++ = *ptr++) == rslast) /* really | dust */
5637 goto thats_all_folks; /* screams | sed :-) */
5638 }
5639 }
5640 else {
1c846c1f
NIS
5641 Copy(ptr, bp, cnt, char); /* this | eat */
5642 bp += cnt; /* screams | dust */
c07a80fd 5643 ptr += cnt; /* louder | sed :-) */
a5f75d66 5644 cnt = 0;
93a17b20 5645 }
79072805
LW
5646 }
5647
748a9306 5648 if (shortbuffered) { /* oh well, must extend */
79072805
LW
5649 cnt = shortbuffered;
5650 shortbuffered = 0;
c07a80fd 5651 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
5652 SvCUR_set(sv, bpx);
5653 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 5654 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
5655 continue;
5656 }
5657
16660edb 5658 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
5659 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
5660 PTR2UV(ptr),(long)cnt));
a20bf0c3 5661 PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
16660edb 5662 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5663 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5664 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5665 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
1c846c1f 5666 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 5667 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
5668 another abstraction. */
760ac839 5669 i = PerlIO_getc(fp); /* get more characters */
16660edb 5670 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5671 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5672 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5673 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
a20bf0c3
JH
5674 cnt = PerlIO_get_cnt(fp);
5675 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 5676 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5677 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 5678
748a9306
LW
5679 if (i == EOF) /* all done for ever? */
5680 goto thats_really_all_folks;
5681
c07a80fd 5682 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
5683 SvCUR_set(sv, bpx);
5684 SvGROW(sv, bpx + cnt + 2);
c07a80fd 5685 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
5686
760ac839 5687 *bp++ = i; /* store character from PerlIO_getc */
79072805 5688
c07a80fd 5689 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 5690 goto thats_all_folks;
79072805
LW
5691 }
5692
5693thats_all_folks:
c07a80fd 5694 if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
36477c24 5695 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 5696 goto screamer; /* go back to the fray */
79072805
LW
5697thats_really_all_folks:
5698 if (shortbuffered)
5699 cnt += shortbuffered;
16660edb 5700 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5701 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
a20bf0c3 5702 PerlIO_set_ptrcnt(fp, ptr, cnt); /* put these back or we're in trouble */
16660edb 5703 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5704 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5705 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5706 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 5707 *bp = '\0';
760ac839 5708 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 5709 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 5710 "Screamer: done, len=%ld, string=|%.*s|\n",
5711 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
5712 }
5713 else
79072805 5714 {
4d2c4e07 5715#ifndef EPOC
760ac839 5716 /*The big, slow, and stupid way */
c07a80fd 5717 STDCHAR buf[8192];
4d2c4e07
OF
5718#else
5719 /* Need to work around EPOC SDK features */
5720 /* On WINS: MS VC5 generates calls to _chkstk, */
5721 /* if a `large' stack frame is allocated */
5722 /* gcc on MARM does not generate calls like these */
5723 STDCHAR buf[1024];
5724#endif
79072805 5725
760ac839 5726screamer2:
c07a80fd 5727 if (rslen) {
760ac839
LW
5728 register STDCHAR *bpe = buf + sizeof(buf);
5729 bp = buf;
5730 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = i) != rslast && bp < bpe)
5731 ; /* keep reading */
5732 cnt = bp - buf;
c07a80fd 5733 }
5734 else {
760ac839 5735 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 5736 /* Accomodate broken VAXC compiler, which applies U8 cast to
5737 * both args of ?: operator, causing EOF to change into 255
5738 */
5739 if (cnt) { i = (U8)buf[cnt - 1]; } else { i = EOF; }
c07a80fd 5740 }
79072805
LW
5741
5742 if (append)
760ac839 5743 sv_catpvn(sv, (char *) buf, cnt);
79072805 5744 else
760ac839 5745 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 5746
5747 if (i != EOF && /* joy */
5748 (!rslen ||
5749 SvCUR(sv) < rslen ||
36477c24 5750 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
5751 {
5752 append = -1;
63e4d877
CS
5753 /*
5754 * If we're reading from a TTY and we get a short read,
5755 * indicating that the user hit his EOF character, we need
5756 * to notice it now, because if we try to read from the TTY
5757 * again, the EOF condition will disappear.
5758 *
5759 * The comparison of cnt to sizeof(buf) is an optimization
5760 * that prevents unnecessary calls to feof().
5761 *
5762 * - jik 9/25/96
5763 */
5764 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
5765 goto screamer2;
79072805
LW
5766 }
5767 }
5768
1c846c1f 5769 if (RsPARA(PL_rs)) { /* have to do this both before and after */
c07a80fd 5770 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 5771 i = PerlIO_getc(fp);
79072805 5772 if (i != '\n') {
760ac839 5773 PerlIO_ungetc(fp,i);
79072805
LW
5774 break;
5775 }
5776 }
5777 }
c07a80fd 5778
7d59b7e4
NIS
5779 if (PerlIO_isutf8(fp))
5780 SvUTF8_on(sv);
5781 else
5782 SvUTF8_off(sv);
5783
c07a80fd 5784 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
5785}
5786
954c1994
GS
5787/*
5788=for apidoc sv_inc
5789
645c22ef
DM
5790Auto-increment of the value in the SV, doing string to numeric conversion
5791if necessary. Handles 'get' magic.
954c1994
GS
5792
5793=cut
5794*/
5795
79072805 5796void
864dbfa3 5797Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
5798{
5799 register char *d;
463ee0b2 5800 int flags;
79072805
LW
5801
5802 if (!sv)
5803 return;
b23a5f78
GB
5804 if (SvGMAGICAL(sv))
5805 mg_get(sv);
ed6116ce 5806 if (SvTHINKFIRST(sv)) {
0f15f207 5807 if (SvREADONLY(sv)) {
3280af22 5808 if (PL_curcop != &PL_compiling)
cea2e8a9 5809 Perl_croak(aTHX_ PL_no_modify);
0f15f207 5810 }
a0d0e21e 5811 if (SvROK(sv)) {
b5be31e9 5812 IV i;
9e7bc3e8
JD
5813 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
5814 return;
56431972 5815 i = PTR2IV(SvRV(sv));
b5be31e9
SM
5816 sv_unref(sv);
5817 sv_setiv(sv, i);
a0d0e21e 5818 }
ed6116ce 5819 }
8990e307 5820 flags = SvFLAGS(sv);
28e5dec8
JH
5821 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
5822 /* It's (privately or publicly) a float, but not tested as an
5823 integer, so test it to see. */
d460ef45 5824 (void) SvIV(sv);
28e5dec8
JH
5825 flags = SvFLAGS(sv);
5826 }
5827 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
5828 /* It's publicly an integer, or privately an integer-not-float */
5829 oops_its_int:
25da4f38
IZ
5830 if (SvIsUV(sv)) {
5831 if (SvUVX(sv) == UV_MAX)
65202027 5832 sv_setnv(sv, (NV)UV_MAX + 1.0);
25da4f38
IZ
5833 else
5834 (void)SvIOK_only_UV(sv);
5835 ++SvUVX(sv);
5836 } else {
5837 if (SvIVX(sv) == IV_MAX)
28e5dec8 5838 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
5839 else {
5840 (void)SvIOK_only(sv);
5841 ++SvIVX(sv);
1c846c1f 5842 }
55497cff 5843 }
79072805
LW
5844 return;
5845 }
28e5dec8
JH
5846 if (flags & SVp_NOK) {
5847 (void)SvNOK_only(sv);
5848 SvNVX(sv) += 1.0;
5849 return;
5850 }
5851
8990e307 5852 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
28e5dec8
JH
5853 if ((flags & SVTYPEMASK) < SVt_PVIV)
5854 sv_upgrade(sv, SVt_IV);
5855 (void)SvIOK_only(sv);
5856 SvIVX(sv) = 1;
79072805
LW
5857 return;
5858 }
463ee0b2 5859 d = SvPVX(sv);
79072805
LW
5860 while (isALPHA(*d)) d++;
5861 while (isDIGIT(*d)) d++;
5862 if (*d) {
28e5dec8
JH
5863#ifdef PERL_PRESERVE_IVUV
5864 /* Got to punt this an an integer if needs be, but we don't issue
5865 warnings. Probably ought to make the sv_iv_please() that does
5866 the conversion if possible, and silently. */
c2988b20 5867 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
5868 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
5869 /* Need to try really hard to see if it's an integer.
5870 9.22337203685478e+18 is an integer.
5871 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
5872 so $a="9.22337203685478e+18"; $a+0; $a++
5873 needs to be the same as $a="9.22337203685478e+18"; $a++
5874 or we go insane. */
d460ef45 5875
28e5dec8
JH
5876 (void) sv_2iv(sv);
5877 if (SvIOK(sv))
5878 goto oops_its_int;
5879
5880 /* sv_2iv *should* have made this an NV */
5881 if (flags & SVp_NOK) {
5882 (void)SvNOK_only(sv);
5883 SvNVX(sv) += 1.0;
5884 return;
5885 }
5886 /* I don't think we can get here. Maybe I should assert this
5887 And if we do get here I suspect that sv_setnv will croak. NWC
5888 Fall through. */
5889#if defined(USE_LONG_DOUBLE)
5890 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",
5891 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
5892#else
5893 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%g\n",
5894 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
5895#endif
5896 }
5897#endif /* PERL_PRESERVE_IVUV */
5898 sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
79072805
LW
5899 return;
5900 }
5901 d--;
463ee0b2 5902 while (d >= SvPVX(sv)) {
79072805
LW
5903 if (isDIGIT(*d)) {
5904 if (++*d <= '9')
5905 return;
5906 *(d--) = '0';
5907 }
5908 else {
9d116dd7
JH
5909#ifdef EBCDIC
5910 /* MKS: The original code here died if letters weren't consecutive.
5911 * at least it didn't have to worry about non-C locales. The
5912 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 5913 * arranged in order (although not consecutively) and that only
9d116dd7
JH
5914 * [A-Za-z] are accepted by isALPHA in the C locale.
5915 */
5916 if (*d != 'z' && *d != 'Z') {
5917 do { ++*d; } while (!isALPHA(*d));
5918 return;
5919 }
5920 *(d--) -= 'z' - 'a';
5921#else
79072805
LW
5922 ++*d;
5923 if (isALPHA(*d))
5924 return;
5925 *(d--) -= 'z' - 'a' + 1;
9d116dd7 5926#endif
79072805
LW
5927 }
5928 }
5929 /* oh,oh, the number grew */
5930 SvGROW(sv, SvCUR(sv) + 2);
5931 SvCUR(sv)++;
463ee0b2 5932 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
5933 *d = d[-1];
5934 if (isDIGIT(d[1]))
5935 *d = '1';
5936 else
5937 *d = d[1];
5938}
5939
954c1994
GS
5940/*
5941=for apidoc sv_dec
5942
645c22ef
DM
5943Auto-decrement of the value in the SV, doing string to numeric conversion
5944if necessary. Handles 'get' magic.
954c1994
GS
5945
5946=cut
5947*/
5948
79072805 5949void
864dbfa3 5950Perl_sv_dec(pTHX_ register SV *sv)
79072805 5951{
463ee0b2
LW
5952 int flags;
5953
79072805
LW
5954 if (!sv)
5955 return;
b23a5f78
GB
5956 if (SvGMAGICAL(sv))
5957 mg_get(sv);
ed6116ce 5958 if (SvTHINKFIRST(sv)) {
0f15f207 5959 if (SvREADONLY(sv)) {
3280af22 5960 if (PL_curcop != &PL_compiling)
cea2e8a9 5961 Perl_croak(aTHX_ PL_no_modify);
0f15f207 5962 }
a0d0e21e 5963 if (SvROK(sv)) {
b5be31e9 5964 IV i;
9e7bc3e8
JD
5965 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
5966 return;
56431972 5967 i = PTR2IV(SvRV(sv));
b5be31e9
SM
5968 sv_unref(sv);
5969 sv_setiv(sv, i);
a0d0e21e 5970 }
ed6116ce 5971 }
28e5dec8
JH
5972 /* Unlike sv_inc we don't have to worry about string-never-numbers
5973 and keeping them magic. But we mustn't warn on punting */
8990e307 5974 flags = SvFLAGS(sv);
28e5dec8
JH
5975 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
5976 /* It's publicly an integer, or privately an integer-not-float */
5977 oops_its_int:
25da4f38
IZ
5978 if (SvIsUV(sv)) {
5979 if (SvUVX(sv) == 0) {
5980 (void)SvIOK_only(sv);
5981 SvIVX(sv) = -1;
5982 }
5983 else {
5984 (void)SvIOK_only_UV(sv);
5985 --SvUVX(sv);
1c846c1f 5986 }
25da4f38
IZ
5987 } else {
5988 if (SvIVX(sv) == IV_MIN)
65202027 5989 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
5990 else {
5991 (void)SvIOK_only(sv);
5992 --SvIVX(sv);
1c846c1f 5993 }
55497cff 5994 }
5995 return;
5996 }
28e5dec8
JH
5997 if (flags & SVp_NOK) {
5998 SvNVX(sv) -= 1.0;
5999 (void)SvNOK_only(sv);
6000 return;
6001 }
8990e307 6002 if (!(flags & SVp_POK)) {
4633a7c4
LW
6003 if ((flags & SVTYPEMASK) < SVt_PVNV)
6004 sv_upgrade(sv, SVt_NV);
463ee0b2 6005 SvNVX(sv) = -1.0;
a0d0e21e 6006 (void)SvNOK_only(sv);
79072805
LW
6007 return;
6008 }
28e5dec8
JH
6009#ifdef PERL_PRESERVE_IVUV
6010 {
c2988b20 6011 int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
28e5dec8
JH
6012 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6013 /* Need to try really hard to see if it's an integer.
6014 9.22337203685478e+18 is an integer.
6015 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6016 so $a="9.22337203685478e+18"; $a+0; $a--
6017 needs to be the same as $a="9.22337203685478e+18"; $a--
6018 or we go insane. */
d460ef45 6019
28e5dec8
JH
6020 (void) sv_2iv(sv);
6021 if (SvIOK(sv))
6022 goto oops_its_int;
6023
6024 /* sv_2iv *should* have made this an NV */
6025 if (flags & SVp_NOK) {
6026 (void)SvNOK_only(sv);
6027 SvNVX(sv) -= 1.0;
6028 return;
6029 }
6030 /* I don't think we can get here. Maybe I should assert this
6031 And if we do get here I suspect that sv_setnv will croak. NWC
6032 Fall through. */
6033#if defined(USE_LONG_DOUBLE)
6034 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",
6035 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6036#else
6037 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%g\n",
6038 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6039#endif
6040 }
6041 }
6042#endif /* PERL_PRESERVE_IVUV */
097ee67d 6043 sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
6044}
6045
954c1994
GS
6046/*
6047=for apidoc sv_mortalcopy
6048
645c22ef
DM
6049Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
6050The new SV is marked as mortal. It will be destroyed when the current
6051context ends. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
6052
6053=cut
6054*/
6055
79072805
LW
6056/* Make a string that will exist for the duration of the expression
6057 * evaluation. Actually, it may have to last longer than that, but
6058 * hopefully we won't free it until it has been assigned to a
6059 * permanent location. */
6060
6061SV *
864dbfa3 6062Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 6063{
463ee0b2 6064 register SV *sv;
79072805 6065
4561caa4 6066 new_SV(sv);
79072805 6067 sv_setsv(sv,oldstr);
677b06e3
GS
6068 EXTEND_MORTAL(1);
6069 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
6070 SvTEMP_on(sv);
6071 return sv;
6072}
6073
954c1994
GS
6074/*
6075=for apidoc sv_newmortal
6076
645c22ef
DM
6077Creates a new null SV which is mortal. The reference count of the SV is
6078set to 1. It will be destroyed when the current context ends. See
6079also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
6080
6081=cut
6082*/
6083
8990e307 6084SV *
864dbfa3 6085Perl_sv_newmortal(pTHX)
8990e307
LW
6086{
6087 register SV *sv;
6088
4561caa4 6089 new_SV(sv);
8990e307 6090 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
6091 EXTEND_MORTAL(1);
6092 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
6093 return sv;
6094}
6095
954c1994
GS
6096/*
6097=for apidoc sv_2mortal
6098
645c22ef
DM
6099Marks an existing SV as mortal. The SV will be destroyed when the current
6100context ends. See also C<sv_newmortal> and C<sv_mortalcopy>.
954c1994
GS
6101
6102=cut
6103*/
6104
79072805 6105SV *
864dbfa3 6106Perl_sv_2mortal(pTHX_ register SV *sv)
79072805
LW
6107{
6108 if (!sv)
6109 return sv;
d689ffdd 6110 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 6111 return sv;
677b06e3
GS
6112 EXTEND_MORTAL(1);
6113 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 6114 SvTEMP_on(sv);
79072805
LW
6115 return sv;
6116}
6117
954c1994
GS
6118/*
6119=for apidoc newSVpv
6120
6121Creates a new SV and copies a string into it. The reference count for the
6122SV is set to 1. If C<len> is zero, Perl will compute the length using
6123strlen(). For efficiency, consider using C<newSVpvn> instead.
6124
6125=cut
6126*/
6127
79072805 6128SV *
864dbfa3 6129Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 6130{
463ee0b2 6131 register SV *sv;
79072805 6132
4561caa4 6133 new_SV(sv);
79072805
LW
6134 if (!len)
6135 len = strlen(s);
6136 sv_setpvn(sv,s,len);
6137 return sv;
6138}
6139
954c1994
GS
6140/*
6141=for apidoc newSVpvn
6142
6143Creates a new SV and copies a string into it. The reference count for the
1c846c1f 6144SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994
GS
6145string. You are responsible for ensuring that the source string is at least
6146C<len> bytes long.
6147
6148=cut
6149*/
6150
9da1e3b5 6151SV *
864dbfa3 6152Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
6153{
6154 register SV *sv;
6155
6156 new_SV(sv);
9da1e3b5
MUN
6157 sv_setpvn(sv,s,len);
6158 return sv;
6159}
6160
1c846c1f
NIS
6161/*
6162=for apidoc newSVpvn_share
6163
645c22ef
DM
6164Creates a new SV with its SvPVX pointing to a shared string in the string
6165table. If the string does not already exist in the table, it is created
6166first. Turns on READONLY and FAKE. The string's hash is stored in the UV
6167slot of the SV; if the C<hash> parameter is non-zero, that value is used;
6168otherwise the hash is computed. The idea here is that as the string table
6169is used for shared hash keys these strings will have SvPVX == HeKEY and
6170hash lookup will avoid string compare.
1c846c1f
NIS
6171
6172=cut
6173*/
6174
6175SV *
c3654f1a 6176Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
6177{
6178 register SV *sv;
c3654f1a
IH
6179 bool is_utf8 = FALSE;
6180 if (len < 0) {
6181 len = -len;
6182 is_utf8 = TRUE;
6183 }
75a54232
JH
6184 if (is_utf8 && !(PL_hints & HINT_UTF8_DISTINCT)) {
6185 STRLEN tmplen = len;
6186 /* See the note in hv.c:hv_fetch() --jhi */
6187 src = (char*)bytes_from_utf8((U8*)src, &tmplen, &is_utf8);
6188 len = tmplen;
6189 }
1c846c1f
NIS
6190 if (!hash)
6191 PERL_HASH(hash, src, len);
6192 new_SV(sv);
6193 sv_upgrade(sv, SVt_PVIV);
c3654f1a 6194 SvPVX(sv) = sharepvn(src, is_utf8?-len:len, hash);
1c846c1f
NIS
6195 SvCUR(sv) = len;
6196 SvUVX(sv) = hash;
6197 SvLEN(sv) = 0;
6198 SvREADONLY_on(sv);
6199 SvFAKE_on(sv);
6200 SvPOK_on(sv);
c3654f1a
IH
6201 if (is_utf8)
6202 SvUTF8_on(sv);
1c846c1f
NIS
6203 return sv;
6204}
6205
645c22ef 6206
cea2e8a9 6207#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
6208
6209/* pTHX_ magic can't cope with varargs, so this is a no-context
6210 * version of the main function, (which may itself be aliased to us).
6211 * Don't access this version directly.
6212 */
6213
46fc3d4c 6214SV *
cea2e8a9 6215Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 6216{
cea2e8a9 6217 dTHX;
46fc3d4c 6218 register SV *sv;
6219 va_list args;
46fc3d4c 6220 va_start(args, pat);
c5be433b 6221 sv = vnewSVpvf(pat, &args);
46fc3d4c 6222 va_end(args);
6223 return sv;
6224}
cea2e8a9 6225#endif
46fc3d4c 6226
954c1994
GS
6227/*
6228=for apidoc newSVpvf
6229
645c22ef 6230Creates a new SV and initializes it with the string formatted like
954c1994
GS
6231C<sprintf>.
6232
6233=cut
6234*/
6235
cea2e8a9
GS
6236SV *
6237Perl_newSVpvf(pTHX_ const char* pat, ...)
6238{
6239 register SV *sv;
6240 va_list args;
cea2e8a9 6241 va_start(args, pat);
c5be433b 6242 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
6243 va_end(args);
6244 return sv;
6245}
46fc3d4c 6246
645c22ef
DM
6247/* backend for newSVpvf() and newSVpvf_nocontext() */
6248
79072805 6249SV *
c5be433b
GS
6250Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
6251{
6252 register SV *sv;
6253 new_SV(sv);
6254 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
6255 return sv;
6256}
6257
954c1994
GS
6258/*
6259=for apidoc newSVnv
6260
6261Creates a new SV and copies a floating point value into it.
6262The reference count for the SV is set to 1.
6263
6264=cut
6265*/
6266
c5be433b 6267SV *
65202027 6268Perl_newSVnv(pTHX_ NV n)
79072805 6269{
463ee0b2 6270 register SV *sv;
79072805 6271
4561caa4 6272 new_SV(sv);
79072805
LW
6273 sv_setnv(sv,n);
6274 return sv;
6275}
6276
954c1994
GS
6277/*
6278=for apidoc newSViv
6279
6280Creates a new SV and copies an integer into it. The reference count for the
6281SV is set to 1.
6282
6283=cut
6284*/
6285
79072805 6286SV *
864dbfa3 6287Perl_newSViv(pTHX_ IV i)
79072805 6288{
463ee0b2 6289 register SV *sv;
79072805 6290
4561caa4 6291 new_SV(sv);
79072805
LW
6292 sv_setiv(sv,i);
6293 return sv;
6294}
6295
954c1994 6296/*
1a3327fb
JH
6297=for apidoc newSVuv
6298
6299Creates a new SV and copies an unsigned integer into it.
6300The reference count for the SV is set to 1.
6301
6302=cut
6303*/
6304
6305SV *
6306Perl_newSVuv(pTHX_ UV u)
6307{
6308 register SV *sv;
6309
6310 new_SV(sv);
6311 sv_setuv(sv,u);
6312 return sv;
6313}
6314
6315/*
954c1994
GS
6316=for apidoc newRV_noinc
6317
6318Creates an RV wrapper for an SV. The reference count for the original
6319SV is B<not> incremented.
6320
6321=cut
6322*/
6323
2304df62 6324SV *
864dbfa3 6325Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
6326{
6327 register SV *sv;
6328
4561caa4 6329 new_SV(sv);
2304df62 6330 sv_upgrade(sv, SVt_RV);
76e3520e 6331 SvTEMP_off(tmpRef);
d689ffdd 6332 SvRV(sv) = tmpRef;
2304df62 6333 SvROK_on(sv);
2304df62
AD
6334 return sv;
6335}
6336
ff276b08 6337/* newRV_inc is the official function name to use now.
645c22ef
DM
6338 * newRV_inc is in fact #defined to newRV in sv.h
6339 */
6340
5f05dabc 6341SV *
864dbfa3 6342Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 6343{
5f6447b6 6344 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 6345}
5f05dabc 6346
954c1994
GS
6347/*
6348=for apidoc newSVsv
6349
6350Creates a new SV which is an exact duplicate of the original SV.
645c22ef 6351(Uses C<sv_setsv>).
954c1994
GS
6352
6353=cut
6354*/
6355
79072805 6356SV *
864dbfa3 6357Perl_newSVsv(pTHX_ register SV *old)
79072805 6358{
463ee0b2 6359 register SV *sv;
79072805
LW
6360
6361 if (!old)
6362 return Nullsv;
8990e307 6363 if (SvTYPE(old) == SVTYPEMASK) {
0453d815
PM
6364 if (ckWARN_d(WARN_INTERNAL))
6365 Perl_warner(aTHX_ WARN_INTERNAL, "semi-panic: attempt to dup freed string");
79072805
LW
6366 return Nullsv;
6367 }
4561caa4 6368 new_SV(sv);
ff68c719 6369 if (SvTEMP(old)) {
6370 SvTEMP_off(old);
463ee0b2 6371 sv_setsv(sv,old);
ff68c719 6372 SvTEMP_on(old);
79072805
LW
6373 }
6374 else
463ee0b2
LW
6375 sv_setsv(sv,old);
6376 return sv;
79072805
LW
6377}
6378
645c22ef
DM
6379/*
6380=for apidoc sv_reset
6381
6382Underlying implementation for the C<reset> Perl function.
6383Note that the perl-level function is vaguely deprecated.
6384
6385=cut
6386*/
6387
79072805 6388void
864dbfa3 6389Perl_sv_reset(pTHX_ register char *s, HV *stash)
79072805
LW
6390{
6391 register HE *entry;
6392 register GV *gv;
6393 register SV *sv;
6394 register I32 i;
6395 register PMOP *pm;
6396 register I32 max;
4802d5d7 6397 char todo[PERL_UCHAR_MAX+1];
79072805 6398
49d8d3a1
MB
6399 if (!stash)
6400 return;
6401
79072805
LW
6402 if (!*s) { /* reset ?? searches */
6403 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
48c036b1 6404 pm->op_pmdynflags &= ~PMdf_USED;
79072805
LW
6405 }
6406 return;
6407 }
6408
6409 /* reset variables */
6410
6411 if (!HvARRAY(stash))
6412 return;
463ee0b2
LW
6413
6414 Zero(todo, 256, char);
79072805 6415 while (*s) {
4802d5d7 6416 i = (unsigned char)*s;
79072805
LW
6417 if (s[1] == '-') {
6418 s += 2;
6419 }
4802d5d7 6420 max = (unsigned char)*s++;
79072805 6421 for ( ; i <= max; i++) {
463ee0b2
LW
6422 todo[i] = 1;
6423 }
a0d0e21e 6424 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 6425 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
6426 entry;
6427 entry = HeNEXT(entry))
6428 {
1edc1566 6429 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 6430 continue;
1edc1566 6431 gv = (GV*)HeVAL(entry);
79072805 6432 sv = GvSV(gv);
9e35f4b3
GS
6433 if (SvTHINKFIRST(sv)) {
6434 if (!SvREADONLY(sv) && SvROK(sv))
6435 sv_unref(sv);
6436 continue;
6437 }
a0d0e21e 6438 (void)SvOK_off(sv);
79072805
LW
6439 if (SvTYPE(sv) >= SVt_PV) {
6440 SvCUR_set(sv, 0);
463ee0b2
LW
6441 if (SvPVX(sv) != Nullch)
6442 *SvPVX(sv) = '\0';
44a8e56a 6443 SvTAINT(sv);
79072805
LW
6444 }
6445 if (GvAV(gv)) {
6446 av_clear(GvAV(gv));
6447 }
44a8e56a 6448 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
463ee0b2 6449 hv_clear(GvHV(gv));
fa6a1c44 6450#ifdef USE_ENVIRON_ARRAY
3280af22 6451 if (gv == PL_envgv)
79072805 6452 environ[0] = Nullch;
a0d0e21e 6453#endif
79072805
LW
6454 }
6455 }
6456 }
6457 }
6458}
6459
645c22ef
DM
6460/*
6461=for apidoc sv_2io
6462
6463Using various gambits, try to get an IO from an SV: the IO slot if its a
6464GV; or the recursive result if we're an RV; or the IO slot of the symbol
6465named after the PV if we're a string.
6466
6467=cut
6468*/
6469
46fc3d4c 6470IO*
864dbfa3 6471Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 6472{
6473 IO* io;
6474 GV* gv;
2d8e6c8d 6475 STRLEN n_a;
46fc3d4c 6476
6477 switch (SvTYPE(sv)) {
6478 case SVt_PVIO:
6479 io = (IO*)sv;
6480 break;
6481 case SVt_PVGV:
6482 gv = (GV*)sv;
6483 io = GvIO(gv);
6484 if (!io)
cea2e8a9 6485 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 6486 break;
6487 default:
6488 if (!SvOK(sv))
cea2e8a9 6489 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 6490 if (SvROK(sv))
6491 return sv_2io(SvRV(sv));
2d8e6c8d 6492 gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
46fc3d4c 6493 if (gv)
6494 io = GvIO(gv);
6495 else
6496 io = 0;
6497 if (!io)
cea2e8a9 6498 Perl_croak(aTHX_ "Bad filehandle: %s", SvPV(sv,n_a));
46fc3d4c 6499 break;
6500 }
6501 return io;
6502}
6503
645c22ef
DM
6504/*
6505=for apidoc sv_2cv
6506
6507Using various gambits, try to get a CV from an SV; in addition, try if
6508possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
6509
6510=cut
6511*/
6512
79072805 6513CV *
864dbfa3 6514Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805
LW
6515{
6516 GV *gv;
6517 CV *cv;
2d8e6c8d 6518 STRLEN n_a;
79072805
LW
6519
6520 if (!sv)
93a17b20 6521 return *gvp = Nullgv, Nullcv;
79072805 6522 switch (SvTYPE(sv)) {
79072805
LW
6523 case SVt_PVCV:
6524 *st = CvSTASH(sv);
6525 *gvp = Nullgv;
6526 return (CV*)sv;
6527 case SVt_PVHV:
6528 case SVt_PVAV:
6529 *gvp = Nullgv;
6530 return Nullcv;
8990e307
LW
6531 case SVt_PVGV:
6532 gv = (GV*)sv;
a0d0e21e 6533 *gvp = gv;
8990e307
LW
6534 *st = GvESTASH(gv);
6535 goto fix_gv;
6536
79072805 6537 default:
a0d0e21e
LW
6538 if (SvGMAGICAL(sv))
6539 mg_get(sv);
6540 if (SvROK(sv)) {
f5284f61
IZ
6541 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
6542 tryAMAGICunDEREF(to_cv);
6543
62f274bf
GS
6544 sv = SvRV(sv);
6545 if (SvTYPE(sv) == SVt_PVCV) {
6546 cv = (CV*)sv;
6547 *gvp = Nullgv;
6548 *st = CvSTASH(cv);
6549 return cv;
6550 }
6551 else if(isGV(sv))
6552 gv = (GV*)sv;
6553 else
cea2e8a9 6554 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 6555 }
62f274bf 6556 else if (isGV(sv))
79072805
LW
6557 gv = (GV*)sv;
6558 else
2d8e6c8d 6559 gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
79072805
LW
6560 *gvp = gv;
6561 if (!gv)
6562 return Nullcv;
6563 *st = GvESTASH(gv);
8990e307 6564 fix_gv:
8ebc5c01 6565 if (lref && !GvCVu(gv)) {
4633a7c4 6566 SV *tmpsv;
748a9306 6567 ENTER;
4633a7c4 6568 tmpsv = NEWSV(704,0);
16660edb 6569 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
6570 /* XXX this is probably not what they think they're getting.
6571 * It has the same effect as "sub name;", i.e. just a forward
6572 * declaration! */
774d564b 6573 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
6574 newSVOP(OP_CONST, 0, tmpsv),
6575 Nullop,
8990e307 6576 Nullop);
748a9306 6577 LEAVE;
8ebc5c01 6578 if (!GvCVu(gv))
cea2e8a9 6579 Perl_croak(aTHX_ "Unable to create sub named \"%s\"", SvPV(sv,n_a));
8990e307 6580 }
8ebc5c01 6581 return GvCVu(gv);
79072805
LW
6582 }
6583}
6584
c461cf8f
JH
6585/*
6586=for apidoc sv_true
6587
6588Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
6589Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
6590instead use an in-line version.
c461cf8f
JH
6591
6592=cut
6593*/
6594
79072805 6595I32
864dbfa3 6596Perl_sv_true(pTHX_ register SV *sv)
79072805 6597{
8990e307
LW
6598 if (!sv)
6599 return 0;
79072805 6600 if (SvPOK(sv)) {
4e35701f
NIS
6601 register XPV* tXpv;
6602 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 6603 (tXpv->xpv_cur > 1 ||
4e35701f 6604 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
79072805
LW
6605 return 1;
6606 else
6607 return 0;
6608 }
6609 else {
6610 if (SvIOK(sv))
463ee0b2 6611 return SvIVX(sv) != 0;
79072805
LW
6612 else {
6613 if (SvNOK(sv))
463ee0b2 6614 return SvNVX(sv) != 0.0;
79072805 6615 else
463ee0b2 6616 return sv_2bool(sv);
79072805
LW
6617 }
6618 }
6619}
79072805 6620
645c22ef
DM
6621/*
6622=for apidoc sv_iv
6623
6624A private implementation of the C<SvIVx> macro for compilers which can't
6625cope with complex macro expressions. Always use the macro instead.
6626
6627=cut
6628*/
6629
ff68c719 6630IV
864dbfa3 6631Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 6632{
25da4f38
IZ
6633 if (SvIOK(sv)) {
6634 if (SvIsUV(sv))
6635 return (IV)SvUVX(sv);
ff68c719 6636 return SvIVX(sv);
25da4f38 6637 }
ff68c719 6638 return sv_2iv(sv);
85e6fe83 6639}
85e6fe83 6640
645c22ef
DM
6641/*
6642=for apidoc sv_uv
6643
6644A private implementation of the C<SvUVx> macro for compilers which can't
6645cope with complex macro expressions. Always use the macro instead.
6646
6647=cut
6648*/
6649
ff68c719 6650UV
864dbfa3 6651Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 6652{
25da4f38
IZ
6653 if (SvIOK(sv)) {
6654 if (SvIsUV(sv))
6655 return SvUVX(sv);
6656 return (UV)SvIVX(sv);
6657 }
ff68c719 6658 return sv_2uv(sv);
6659}
85e6fe83 6660
645c22ef
DM
6661/*
6662=for apidoc sv_nv
6663
6664A private implementation of the C<SvNVx> macro for compilers which can't
6665cope with complex macro expressions. Always use the macro instead.
6666
6667=cut
6668*/
6669
65202027 6670NV
864dbfa3 6671Perl_sv_nv(pTHX_ register SV *sv)
79072805 6672{
ff68c719 6673 if (SvNOK(sv))
6674 return SvNVX(sv);
6675 return sv_2nv(sv);
79072805 6676}
79072805 6677
645c22ef
DM
6678/*
6679=for apidoc sv_pv
6680
6681A private implementation of the C<SvPV_nolen> macro for compilers which can't
6682cope with complex macro expressions. Always use the macro instead.
6683
6684=cut
6685*/
6686
79072805 6687char *
864dbfa3 6688Perl_sv_pv(pTHX_ SV *sv)
1fa8b10d
JD
6689{
6690 STRLEN n_a;
6691
6692 if (SvPOK(sv))
6693 return SvPVX(sv);
6694
6695 return sv_2pv(sv, &n_a);
6696}
6697
645c22ef
DM
6698/*
6699=for apidoc sv_pvn
6700
6701A private implementation of the C<SvPV> macro for compilers which can't
6702cope with complex macro expressions. Always use the macro instead.
6703
6704=cut
6705*/
6706
1fa8b10d 6707char *
864dbfa3 6708Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 6709{
85e6fe83
LW
6710 if (SvPOK(sv)) {
6711 *lp = SvCUR(sv);
a0d0e21e 6712 return SvPVX(sv);
85e6fe83 6713 }
463ee0b2 6714 return sv_2pv(sv, lp);
79072805 6715}
79072805 6716
c461cf8f
JH
6717/*
6718=for apidoc sv_pvn_force
6719
6720Get a sensible string out of the SV somehow.
645c22ef
DM
6721A private implementation of the C<SvPV_force> macro for compilers which
6722can't cope with complex macro expressions. Always use the macro instead.
c461cf8f
JH
6723
6724=cut
6725*/
6726
a0d0e21e 6727char *
864dbfa3 6728Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
a0d0e21e 6729{
36f65ada 6730 return sv_pvn_force_flags(sv, lp, SV_GMAGIC);
8d6d96c1
HS
6731}
6732
6733/*
6734=for apidoc sv_pvn_force_flags
6735
6736Get a sensible string out of the SV somehow.
6737If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
6738appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
6739implemented in terms of this function.
645c22ef
DM
6740You normally want to use the various wrapper macros instead: see
6741C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
6742
6743=cut
6744*/
6745
6746char *
6747Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
6748{
a0d0e21e
LW
6749 char *s;
6750
6fc92669
GS
6751 if (SvTHINKFIRST(sv) && !SvROK(sv))
6752 sv_force_normal(sv);
1c846c1f 6753
a0d0e21e
LW
6754 if (SvPOK(sv)) {
6755 *lp = SvCUR(sv);
6756 }
6757 else {
748a9306 6758 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 6759 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
6fc92669 6760 PL_op_name[PL_op->op_type]);
a0d0e21e 6761 }
4633a7c4 6762 else
8d6d96c1 6763 s = sv_2pv_flags(sv, lp, flags);
a0d0e21e
LW
6764 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
6765 STRLEN len = *lp;
1c846c1f 6766
a0d0e21e
LW
6767 if (SvROK(sv))
6768 sv_unref(sv);
6769 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
6770 SvGROW(sv, len + 1);
6771 Move(s,SvPVX(sv),len,char);
6772 SvCUR_set(sv, len);
6773 *SvEND(sv) = '\0';
6774 }
6775 if (!SvPOK(sv)) {
6776 SvPOK_on(sv); /* validate pointer */
6777 SvTAINT(sv);
1d7c1841
GS
6778 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
6779 PTR2UV(sv),SvPVX(sv)));
a0d0e21e
LW
6780 }
6781 }
6782 return SvPVX(sv);
6783}
6784
645c22ef
DM
6785/*
6786=for apidoc sv_pvbyte
6787
6788A private implementation of the C<SvPVbyte_nolen> macro for compilers
6789which can't cope with complex macro expressions. Always use the macro
6790instead.
6791
6792=cut
6793*/
6794
a0d0e21e 6795char *
7340a771
GS
6796Perl_sv_pvbyte(pTHX_ SV *sv)
6797{
ffebcc3e 6798 sv_utf8_downgrade(sv,0);
7340a771
GS
6799 return sv_pv(sv);
6800}
6801
645c22ef
DM
6802/*
6803=for apidoc sv_pvbyten
6804
6805A private implementation of the C<SvPVbyte> macro for compilers
6806which can't cope with complex macro expressions. Always use the macro
6807instead.
6808
6809=cut
6810*/
6811
7340a771
GS
6812char *
6813Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
6814{
ffebcc3e 6815 sv_utf8_downgrade(sv,0);
7340a771
GS
6816 return sv_pvn(sv,lp);
6817}
6818
645c22ef
DM
6819/*
6820=for apidoc sv_pvbyten_force
6821
6822A private implementation of the C<SvPVbytex_force> macro for compilers
6823which can't cope with complex macro expressions. Always use the macro
6824instead.
6825
6826=cut
6827*/
6828
7340a771
GS
6829char *
6830Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
6831{
ffebcc3e 6832 sv_utf8_downgrade(sv,0);
7340a771
GS
6833 return sv_pvn_force(sv,lp);
6834}
6835
645c22ef
DM
6836/*
6837=for apidoc sv_pvutf8
6838
6839A private implementation of the C<SvPVutf8_nolen> macro for compilers
6840which can't cope with complex macro expressions. Always use the macro
6841instead.
6842
6843=cut
6844*/
6845
7340a771
GS
6846char *
6847Perl_sv_pvutf8(pTHX_ SV *sv)
6848{
560a288e 6849 sv_utf8_upgrade(sv);
7340a771
GS
6850 return sv_pv(sv);
6851}
6852
645c22ef
DM
6853/*
6854=for apidoc sv_pvutf8n
6855
6856A private implementation of the C<SvPVutf8> macro for compilers
6857which can't cope with complex macro expressions. Always use the macro
6858instead.
6859
6860=cut
6861*/
6862
7340a771
GS
6863char *
6864Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
6865{
560a288e 6866 sv_utf8_upgrade(sv);
7340a771
GS
6867 return sv_pvn(sv,lp);
6868}
6869
c461cf8f
JH
6870/*
6871=for apidoc sv_pvutf8n_force
6872
645c22ef
DM
6873A private implementation of the C<SvPVutf8_force> macro for compilers
6874which can't cope with complex macro expressions. Always use the macro
6875instead.
c461cf8f
JH
6876
6877=cut
6878*/
6879
7340a771
GS
6880char *
6881Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
6882{
560a288e 6883 sv_utf8_upgrade(sv);
7340a771
GS
6884 return sv_pvn_force(sv,lp);
6885}
6886
c461cf8f
JH
6887/*
6888=for apidoc sv_reftype
6889
6890Returns a string describing what the SV is a reference to.
6891
6892=cut
6893*/
6894
7340a771 6895char *
864dbfa3 6896Perl_sv_reftype(pTHX_ SV *sv, int ob)
a0d0e21e
LW
6897{
6898 if (ob && SvOBJECT(sv))
6899 return HvNAME(SvSTASH(sv));
6900 else {
6901 switch (SvTYPE(sv)) {
6902 case SVt_NULL:
6903 case SVt_IV:
6904 case SVt_NV:
6905 case SVt_RV:
6906 case SVt_PV:
6907 case SVt_PVIV:
6908 case SVt_PVNV:
6909 case SVt_PVMG:
6910 case SVt_PVBM:
6911 if (SvROK(sv))
6912 return "REF";
6913 else
6914 return "SCALAR";
6915 case SVt_PVLV: return "LVALUE";
6916 case SVt_PVAV: return "ARRAY";
6917 case SVt_PVHV: return "HASH";
6918 case SVt_PVCV: return "CODE";
6919 case SVt_PVGV: return "GLOB";
1d2dff63 6920 case SVt_PVFM: return "FORMAT";
27f9d8f3 6921 case SVt_PVIO: return "IO";
a0d0e21e
LW
6922 default: return "UNKNOWN";
6923 }
6924 }
6925}
6926
954c1994
GS
6927/*
6928=for apidoc sv_isobject
6929
6930Returns a boolean indicating whether the SV is an RV pointing to a blessed
6931object. If the SV is not an RV, or if the object is not blessed, then this
6932will return false.
6933
6934=cut
6935*/
6936
463ee0b2 6937int
864dbfa3 6938Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 6939{
68dc0745 6940 if (!sv)
6941 return 0;
6942 if (SvGMAGICAL(sv))
6943 mg_get(sv);
85e6fe83
LW
6944 if (!SvROK(sv))
6945 return 0;
6946 sv = (SV*)SvRV(sv);
6947 if (!SvOBJECT(sv))
6948 return 0;
6949 return 1;
6950}
6951
954c1994
GS
6952/*
6953=for apidoc sv_isa
6954
6955Returns a boolean indicating whether the SV is blessed into the specified
6956class. This does not check for subtypes; use C<sv_derived_from> to verify
6957an inheritance relationship.
6958
6959=cut
6960*/
6961
85e6fe83 6962int
864dbfa3 6963Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 6964{
68dc0745 6965 if (!sv)
6966 return 0;
6967 if (SvGMAGICAL(sv))
6968 mg_get(sv);
ed6116ce 6969 if (!SvROK(sv))
463ee0b2 6970 return 0;
ed6116ce
LW
6971 sv = (SV*)SvRV(sv);
6972 if (!SvOBJECT(sv))
463ee0b2
LW
6973 return 0;
6974
6975 return strEQ(HvNAME(SvSTASH(sv)), name);
6976}
6977
954c1994
GS
6978/*
6979=for apidoc newSVrv
6980
6981Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
6982it will be upgraded to one. If C<classname> is non-null then the new SV will
6983be blessed in the specified package. The new SV is returned and its
6984reference count is 1.
6985
6986=cut
6987*/
6988
463ee0b2 6989SV*
864dbfa3 6990Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 6991{
463ee0b2
LW
6992 SV *sv;
6993
4561caa4 6994 new_SV(sv);
51cf62d8 6995
2213622d 6996 SV_CHECK_THINKFIRST(rv);
51cf62d8 6997 SvAMAGIC_off(rv);
51cf62d8 6998
0199fce9
JD
6999 if (SvTYPE(rv) >= SVt_PVMG) {
7000 U32 refcnt = SvREFCNT(rv);
7001 SvREFCNT(rv) = 0;
7002 sv_clear(rv);
7003 SvFLAGS(rv) = 0;
7004 SvREFCNT(rv) = refcnt;
7005 }
7006
51cf62d8 7007 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
7008 sv_upgrade(rv, SVt_RV);
7009 else if (SvTYPE(rv) > SVt_RV) {
7010 (void)SvOOK_off(rv);
7011 if (SvPVX(rv) && SvLEN(rv))
7012 Safefree(SvPVX(rv));
7013 SvCUR_set(rv, 0);
7014 SvLEN_set(rv, 0);
7015 }
51cf62d8
OT
7016
7017 (void)SvOK_off(rv);
053fc874 7018 SvRV(rv) = sv;
ed6116ce 7019 SvROK_on(rv);
463ee0b2 7020
a0d0e21e
LW
7021 if (classname) {
7022 HV* stash = gv_stashpv(classname, TRUE);
7023 (void)sv_bless(rv, stash);
7024 }
7025 return sv;
7026}
7027
954c1994
GS
7028/*
7029=for apidoc sv_setref_pv
7030
7031Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
7032argument will be upgraded to an RV. That RV will be modified to point to
7033the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7034into the SV. The C<classname> argument indicates the package for the
7035blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7036will be returned and will have a reference count of 1.
7037
7038Do not use with other Perl types such as HV, AV, SV, CV, because those
7039objects will become corrupted by the pointer copy process.
7040
7041Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7042
7043=cut
7044*/
7045
a0d0e21e 7046SV*
864dbfa3 7047Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 7048{
189b2af5 7049 if (!pv) {
3280af22 7050 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
7051 SvSETMAGIC(rv);
7052 }
a0d0e21e 7053 else
56431972 7054 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
7055 return rv;
7056}
7057
954c1994
GS
7058/*
7059=for apidoc sv_setref_iv
7060
7061Copies an integer into a new SV, optionally blessing the SV. The C<rv>
7062argument will be upgraded to an RV. That RV will be modified to point to
7063the new SV. The C<classname> argument indicates the package for the
7064blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7065will be returned and will have a reference count of 1.
7066
7067=cut
7068*/
7069
a0d0e21e 7070SV*
864dbfa3 7071Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
7072{
7073 sv_setiv(newSVrv(rv,classname), iv);
7074 return rv;
7075}
7076
954c1994 7077/*
e1c57cef
JH
7078=for apidoc sv_setref_uv
7079
7080Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
7081argument will be upgraded to an RV. That RV will be modified to point to
7082the new SV. The C<classname> argument indicates the package for the
7083blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7084will be returned and will have a reference count of 1.
7085
7086=cut
7087*/
7088
7089SV*
7090Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
7091{
7092 sv_setuv(newSVrv(rv,classname), uv);
7093 return rv;
7094}
7095
7096/*
954c1994
GS
7097=for apidoc sv_setref_nv
7098
7099Copies a double into a new SV, optionally blessing the SV. The C<rv>
7100argument will be upgraded to an RV. That RV will be modified to point to
7101the new SV. The C<classname> argument indicates the package for the
7102blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
7103will be returned and will have a reference count of 1.
7104
7105=cut
7106*/
7107
a0d0e21e 7108SV*
65202027 7109Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
7110{
7111 sv_setnv(newSVrv(rv,classname), nv);
7112 return rv;
7113}
463ee0b2 7114
954c1994
GS
7115/*
7116=for apidoc sv_setref_pvn
7117
7118Copies a string into a new SV, optionally blessing the SV. The length of the
7119string must be specified with C<n>. The C<rv> argument will be upgraded to
7120an RV. That RV will be modified to point to the new SV. The C<classname>
7121argument indicates the package for the blessing. Set C<classname> to
7122C<Nullch> to avoid the blessing. The new SV will be returned and will have
7123a reference count of 1.
7124
7125Note that C<sv_setref_pv> copies the pointer while this copies the string.
7126
7127=cut
7128*/
7129
a0d0e21e 7130SV*
864dbfa3 7131Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
7132{
7133 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
7134 return rv;
7135}
7136
954c1994
GS
7137/*
7138=for apidoc sv_bless
7139
7140Blesses an SV into a specified package. The SV must be an RV. The package
7141must be designated by its stash (see C<gv_stashpv()>). The reference count
7142of the SV is unaffected.
7143
7144=cut
7145*/
7146
a0d0e21e 7147SV*
864dbfa3 7148Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 7149{
76e3520e 7150 SV *tmpRef;
a0d0e21e 7151 if (!SvROK(sv))
cea2e8a9 7152 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
7153 tmpRef = SvRV(sv);
7154 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
7155 if (SvREADONLY(tmpRef))
cea2e8a9 7156 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
7157 if (SvOBJECT(tmpRef)) {
7158 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7159 --PL_sv_objcount;
76e3520e 7160 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 7161 }
a0d0e21e 7162 }
76e3520e
GS
7163 SvOBJECT_on(tmpRef);
7164 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7165 ++PL_sv_objcount;
76e3520e
GS
7166 (void)SvUPGRADE(tmpRef, SVt_PVMG);
7167 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
a0d0e21e 7168
2e3febc6
CS
7169 if (Gv_AMG(stash))
7170 SvAMAGIC_on(sv);
7171 else
7172 SvAMAGIC_off(sv);
a0d0e21e
LW
7173
7174 return sv;
7175}
7176
645c22ef
DM
7177/* Downgrades a PVGV to a PVMG.
7178 *
7179 * XXX This function doesn't actually appear to be used anywhere
7180 * DAPM 15-Jun-01
7181 */
7182
76e3520e 7183STATIC void
cea2e8a9 7184S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 7185{
850fabdf
GS
7186 void *xpvmg;
7187
a0d0e21e
LW
7188 assert(SvTYPE(sv) == SVt_PVGV);
7189 SvFAKE_off(sv);
7190 if (GvGP(sv))
1edc1566 7191 gp_free((GV*)sv);
e826b3c7
GS
7192 if (GvSTASH(sv)) {
7193 SvREFCNT_dec(GvSTASH(sv));
7194 GvSTASH(sv) = Nullhv;
7195 }
14befaf4 7196 sv_unmagic(sv, PERL_MAGIC_glob);
a0d0e21e 7197 Safefree(GvNAME(sv));
a5f75d66 7198 GvMULTI_off(sv);
850fabdf
GS
7199
7200 /* need to keep SvANY(sv) in the right arena */
7201 xpvmg = new_XPVMG();
7202 StructCopy(SvANY(sv), xpvmg, XPVMG);
7203 del_XPVGV(SvANY(sv));
7204 SvANY(sv) = xpvmg;
7205
a0d0e21e
LW
7206 SvFLAGS(sv) &= ~SVTYPEMASK;
7207 SvFLAGS(sv) |= SVt_PVMG;
7208}
7209
954c1994 7210/*
840a7b70 7211=for apidoc sv_unref_flags
954c1994
GS
7212
7213Unsets the RV status of the SV, and decrements the reference count of
7214whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
7215as a reversal of C<newSVrv>. The C<cflags> argument can contain
7216C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
7217(otherwise the decrementing is conditional on the reference count being
7218different from one or the reference being a readonly SV).
7889fe52 7219See C<SvROK_off>.
954c1994
GS
7220
7221=cut
7222*/
7223
ed6116ce 7224void
840a7b70 7225Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 7226{
a0d0e21e 7227 SV* rv = SvRV(sv);
810b8aa5
GS
7228
7229 if (SvWEAKREF(sv)) {
7230 sv_del_backref(sv);
7231 SvWEAKREF_off(sv);
7232 SvRV(sv) = 0;
7233 return;
7234 }
ed6116ce
LW
7235 SvRV(sv) = 0;
7236 SvROK_off(sv);
840a7b70 7237 if (SvREFCNT(rv) != 1 || SvREADONLY(rv) || flags) /* SV_IMMEDIATE_UNREF */
4633a7c4 7238 SvREFCNT_dec(rv);
840a7b70 7239 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 7240 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 7241}
8990e307 7242
840a7b70
IZ
7243/*
7244=for apidoc sv_unref
7245
7246Unsets the RV status of the SV, and decrements the reference count of
7247whatever was being referenced by the RV. This can almost be thought of
7248as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 7249being zero. See C<SvROK_off>.
840a7b70
IZ
7250
7251=cut
7252*/
7253
7254void
7255Perl_sv_unref(pTHX_ SV *sv)
7256{
7257 sv_unref_flags(sv, 0);
7258}
7259
645c22ef
DM
7260/*
7261=for apidoc sv_taint
7262
7263Taint an SV. Use C<SvTAINTED_on> instead.
7264=cut
7265*/
7266
bbce6d69 7267void
864dbfa3 7268Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 7269{
14befaf4 7270 sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
bbce6d69 7271}
7272
645c22ef
DM
7273/*
7274=for apidoc sv_untaint
7275
7276Untaint an SV. Use C<SvTAINTED_off> instead.
7277=cut
7278*/
7279
bbce6d69 7280void
864dbfa3 7281Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 7282{
13f57bf8 7283 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 7284 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 7285 if (mg)
565764a8 7286 mg->mg_len &= ~1;
36477c24 7287 }
bbce6d69 7288}
7289
645c22ef
DM
7290/*
7291=for apidoc sv_tainted
7292
7293Test an SV for taintedness. Use C<SvTAINTED> instead.
7294=cut
7295*/
7296
bbce6d69 7297bool
864dbfa3 7298Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 7299{
13f57bf8 7300 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
14befaf4 7301 MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
155aba94 7302 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 7303 return TRUE;
7304 }
7305 return FALSE;
bbce6d69 7306}
7307
954c1994
GS
7308/*
7309=for apidoc sv_setpviv
7310
7311Copies an integer into the given SV, also updating its string value.
7312Does not handle 'set' magic. See C<sv_setpviv_mg>.
7313
7314=cut
7315*/
7316
84902520 7317void
864dbfa3 7318Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
84902520 7319{
25da4f38
IZ
7320 char buf[TYPE_CHARS(UV)];
7321 char *ebuf;
7322 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
84902520 7323
25da4f38 7324 sv_setpvn(sv, ptr, ebuf - ptr);
84902520
TB
7325}
7326
954c1994
GS
7327/*
7328=for apidoc sv_setpviv_mg
7329
7330Like C<sv_setpviv>, but also handles 'set' magic.
7331
7332=cut
7333*/
7334
ef50df4b 7335void
864dbfa3 7336Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
ef50df4b 7337{
25da4f38
IZ
7338 char buf[TYPE_CHARS(UV)];
7339 char *ebuf;
7340 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
7341
7342 sv_setpvn(sv, ptr, ebuf - ptr);
ef50df4b
GS
7343 SvSETMAGIC(sv);
7344}
7345
cea2e8a9 7346#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7347
7348/* pTHX_ magic can't cope with varargs, so this is a no-context
7349 * version of the main function, (which may itself be aliased to us).
7350 * Don't access this version directly.
7351 */
7352
cea2e8a9
GS
7353void
7354Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
7355{
7356 dTHX;
7357 va_list args;
7358 va_start(args, pat);
c5be433b 7359 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
7360 va_end(args);
7361}
7362
645c22ef
DM
7363/* pTHX_ magic can't cope with varargs, so this is a no-context
7364 * version of the main function, (which may itself be aliased to us).
7365 * Don't access this version directly.
7366 */
cea2e8a9
GS
7367
7368void
7369Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
7370{
7371 dTHX;
7372 va_list args;
7373 va_start(args, pat);
c5be433b 7374 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 7375 va_end(args);
cea2e8a9
GS
7376}
7377#endif
7378
954c1994
GS
7379/*
7380=for apidoc sv_setpvf
7381
7382Processes its arguments like C<sprintf> and sets an SV to the formatted
7383output. Does not handle 'set' magic. See C<sv_setpvf_mg>.
7384
7385=cut
7386*/
7387
46fc3d4c 7388void
864dbfa3 7389Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 7390{
7391 va_list args;
46fc3d4c 7392 va_start(args, pat);
c5be433b 7393 sv_vsetpvf(sv, pat, &args);
46fc3d4c 7394 va_end(args);
7395}
7396
645c22ef
DM
7397/* backend for C<sv_setpvf> and C<sv_setpvf_nocontext> */
7398
c5be433b
GS
7399void
7400Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7401{
7402 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7403}
ef50df4b 7404
954c1994
GS
7405/*
7406=for apidoc sv_setpvf_mg
7407
7408Like C<sv_setpvf>, but also handles 'set' magic.
7409
7410=cut
7411*/
7412
ef50df4b 7413void
864dbfa3 7414Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
7415{
7416 va_list args;
ef50df4b 7417 va_start(args, pat);
c5be433b 7418 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 7419 va_end(args);
c5be433b
GS
7420}
7421
645c22ef
DM
7422/* backend for C<sv_setpvf_mg> C<setpvf_mg_nocontext> */
7423
c5be433b
GS
7424void
7425Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7426{
7427 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
7428 SvSETMAGIC(sv);
7429}
7430
cea2e8a9 7431#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7432
7433/* pTHX_ magic can't cope with varargs, so this is a no-context
7434 * version of the main function, (which may itself be aliased to us).
7435 * Don't access this version directly.
7436 */
7437
cea2e8a9
GS
7438void
7439Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
7440{
7441 dTHX;
7442 va_list args;
7443 va_start(args, pat);
c5be433b 7444 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
7445 va_end(args);
7446}
7447
645c22ef
DM
7448/* pTHX_ magic can't cope with varargs, so this is a no-context
7449 * version of the main function, (which may itself be aliased to us).
7450 * Don't access this version directly.
7451 */
7452
cea2e8a9
GS
7453void
7454Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
7455{
7456 dTHX;
7457 va_list args;
7458 va_start(args, pat);
c5be433b 7459 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 7460 va_end(args);
cea2e8a9
GS
7461}
7462#endif
7463
954c1994
GS
7464/*
7465=for apidoc sv_catpvf
7466
d5ce4a7c
GA
7467Processes its arguments like C<sprintf> and appends the formatted
7468output to an SV. If the appended data contains "wide" characters
7469(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
7470and characters >255 formatted with %c), the original SV might get
7471upgraded to UTF-8. Handles 'get' magic, but not 'set' magic.
7472C<SvSETMAGIC()> must typically be called after calling this function
7473to handle 'set' magic.
954c1994 7474
d5ce4a7c 7475=cut */
954c1994 7476
46fc3d4c 7477void
864dbfa3 7478Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 7479{
7480 va_list args;
46fc3d4c 7481 va_start(args, pat);
c5be433b 7482 sv_vcatpvf(sv, pat, &args);
46fc3d4c 7483 va_end(args);
7484}
7485
645c22ef
DM
7486/* backend for C<sv_catpvf> and C<catpvf_mg_nocontext> */
7487
ef50df4b 7488void
c5be433b
GS
7489Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7490{
7491 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7492}
7493
954c1994
GS
7494/*
7495=for apidoc sv_catpvf_mg
7496
7497Like C<sv_catpvf>, but also handles 'set' magic.
7498
7499=cut
7500*/
7501
c5be433b 7502void
864dbfa3 7503Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
7504{
7505 va_list args;
ef50df4b 7506 va_start(args, pat);
c5be433b 7507 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 7508 va_end(args);
c5be433b
GS
7509}
7510
645c22ef
DM
7511/* backend for C<catpvf_mg> and C<catpvf_mg_nocontext> */
7512
c5be433b
GS
7513void
7514Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7515{
7516 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
7517 SvSETMAGIC(sv);
7518}
7519
954c1994
GS
7520/*
7521=for apidoc sv_vsetpvfn
7522
7523Works like C<vcatpvfn> but copies the text into the SV instead of
7524appending it.
7525
645c22ef
DM
7526Usually used via one of its frontends C<sv_setpvf> and C<sv_setpvf_mg>.
7527
954c1994
GS
7528=cut
7529*/
7530
46fc3d4c 7531void
7d5ea4e7 7532Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 7533{
7534 sv_setpvn(sv, "", 0);
7d5ea4e7 7535 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 7536}
7537
645c22ef
DM
7538/* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
7539
2d00ba3b 7540STATIC I32
9dd79c3f 7541S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
7542{
7543 I32 var = 0;
7544 switch (**pattern) {
7545 case '1': case '2': case '3':
7546 case '4': case '5': case '6':
7547 case '7': case '8': case '9':
7548 while (isDIGIT(**pattern))
7549 var = var * 10 + (*(*pattern)++ - '0');
7550 }
7551 return var;
7552}
9dd79c3f 7553#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 7554
954c1994
GS
7555/*
7556=for apidoc sv_vcatpvfn
7557
7558Processes its arguments like C<vsprintf> and appends the formatted output
7559to an SV. Uses an array of SVs if the C style variable argument list is
7560missing (NULL). When running with taint checks enabled, indicates via
7561C<maybe_tainted> if results are untrustworthy (often due to the use of
7562locales).
7563
645c22ef
DM
7564Usually used via one of its frontends C<sv_catpvf> and C<sv_catpvf_mg>.
7565
954c1994
GS
7566=cut
7567*/
7568
46fc3d4c 7569void
7d5ea4e7 7570Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 7571{
7572 char *p;
7573 char *q;
7574 char *patend;
fc36a67e 7575 STRLEN origlen;
46fc3d4c 7576 I32 svix = 0;
c635e13b 7577 static char nullstr[] = "(null)";
9c5ffd7c 7578 SV *argsv = Nullsv;
46fc3d4c 7579
7580 /* no matter what, this is a string now */
fc36a67e 7581 (void)SvPV_force(sv, origlen);
46fc3d4c 7582
fc36a67e 7583 /* special-case "", "%s", and "%_" */
46fc3d4c 7584 if (patlen == 0)
7585 return;
fc36a67e 7586 if (patlen == 2 && pat[0] == '%') {
7587 switch (pat[1]) {
7588 case 's':
c635e13b 7589 if (args) {
7590 char *s = va_arg(*args, char*);
7591 sv_catpv(sv, s ? s : nullstr);
7592 }
7e2040f0 7593 else if (svix < svmax) {
fc36a67e 7594 sv_catsv(sv, *svargs);
7e2040f0
GS
7595 if (DO_UTF8(*svargs))
7596 SvUTF8_on(sv);
7597 }
fc36a67e 7598 return;
7599 case '_':
7600 if (args) {
7e2040f0
GS
7601 argsv = va_arg(*args, SV*);
7602 sv_catsv(sv, argsv);
7603 if (DO_UTF8(argsv))
7604 SvUTF8_on(sv);
fc36a67e 7605 return;
7606 }
7607 /* See comment on '_' below */
7608 break;
7609 }
46fc3d4c 7610 }
7611
7612 patend = (char*)pat + patlen;
7613 for (p = (char*)pat; p < patend; p = q) {
7614 bool alt = FALSE;
7615 bool left = FALSE;
b22c7a20 7616 bool vectorize = FALSE;
211dfcf1 7617 bool vectorarg = FALSE;
b2e23cf9 7618 bool vec_utf = FALSE;
46fc3d4c 7619 char fill = ' ';
7620 char plus = 0;
7621 char intsize = 0;
7622 STRLEN width = 0;
fc36a67e 7623 STRLEN zeros = 0;
46fc3d4c 7624 bool has_precis = FALSE;
7625 STRLEN precis = 0;
7e2040f0 7626 bool is_utf = FALSE;
eb3fce90 7627
46fc3d4c 7628 char esignbuf[4];
ad391ad9 7629 U8 utf8buf[UTF8_MAXLEN+1];
46fc3d4c 7630 STRLEN esignlen = 0;
7631
7632 char *eptr = Nullch;
fc36a67e 7633 STRLEN elen = 0;
089c015b
JH
7634 /* Times 4: a decimal digit takes more than 3 binary digits.
7635 * NV_DIG: mantissa takes than many decimal digits.
7636 * Plus 32: Playing safe. */
7637 char ebuf[IV_DIG * 4 + NV_DIG + 32];
2d4389e4
JH
7638 /* large enough for "%#.#f" --chip */
7639 /* what about long double NVs? --jhi */
b22c7a20
GS
7640
7641 SV *vecsv;
a05b299f 7642 U8 *vecstr = Null(U8*);
b22c7a20 7643 STRLEN veclen = 0;
46fc3d4c 7644 char c;
7645 int i;
9c5ffd7c 7646 unsigned base = 0;
46fc3d4c 7647 IV iv;
7648 UV uv;
65202027 7649 NV nv;
46fc3d4c 7650 STRLEN have;
7651 STRLEN need;
7652 STRLEN gap;
b22c7a20
GS
7653 char *dotstr = ".";
7654 STRLEN dotstrlen = 1;
211dfcf1 7655 I32 efix = 0; /* explicit format parameter index */
eb3fce90 7656 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
7657 I32 epix = 0; /* explicit precision index */
7658 I32 evix = 0; /* explicit vector index */
eb3fce90 7659 bool asterisk = FALSE;
46fc3d4c 7660
211dfcf1 7661 /* echo everything up to the next format specification */
46fc3d4c 7662 for (q = p; q < patend && *q != '%'; ++q) ;
7663 if (q > p) {
7664 sv_catpvn(sv, p, q - p);
7665 p = q;
7666 }
7667 if (q++ >= patend)
7668 break;
7669
211dfcf1
HS
7670/*
7671 We allow format specification elements in this order:
7672 \d+\$ explicit format parameter index
7673 [-+ 0#]+ flags
7674 \*?(\d+\$)?v vector with optional (optionally specified) arg
7675 \d+|\*(\d+\$)? width using optional (optionally specified) arg
7676 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
7677 [hlqLV] size
7678 [%bcdefginopsux_DFOUX] format (mandatory)
7679*/
7680 if (EXPECT_NUMBER(q, width)) {
7681 if (*q == '$') {
7682 ++q;
7683 efix = width;
7684 } else {
7685 goto gotwidth;
7686 }
7687 }
7688
fc36a67e 7689 /* FLAGS */
7690
46fc3d4c 7691 while (*q) {
7692 switch (*q) {
7693 case ' ':
7694 case '+':
7695 plus = *q++;
7696 continue;
7697
7698 case '-':
7699 left = TRUE;
7700 q++;
7701 continue;
7702
7703 case '0':
7704 fill = *q++;
7705 continue;
7706
7707 case '#':
7708 alt = TRUE;
7709 q++;
7710 continue;
7711
fc36a67e 7712 default:
7713 break;
7714 }
7715 break;
7716 }
46fc3d4c 7717
211dfcf1 7718 tryasterisk:
eb3fce90 7719 if (*q == '*') {
211dfcf1
HS
7720 q++;
7721 if (EXPECT_NUMBER(q, ewix))
7722 if (*q++ != '$')
7723 goto unknown;
eb3fce90 7724 asterisk = TRUE;
211dfcf1
HS
7725 }
7726 if (*q == 'v') {
eb3fce90 7727 q++;
211dfcf1
HS
7728 if (vectorize)
7729 goto unknown;
9cbac4c7 7730 if ((vectorarg = asterisk)) {
211dfcf1
HS
7731 evix = ewix;
7732 ewix = 0;
7733 asterisk = FALSE;
7734 }
7735 vectorize = TRUE;
7736 goto tryasterisk;
eb3fce90
JH
7737 }
7738
211dfcf1
HS
7739 if (!asterisk)
7740 EXPECT_NUMBER(q, width);
7741
7742 if (vectorize) {
7743 if (vectorarg) {
7744 if (args)
7745 vecsv = va_arg(*args, SV*);
7746 else
7747 vecsv = (evix ? evix <= svmax : svix < svmax) ?
7748 svargs[ewix ? ewix-1 : svix++] : &PL_sv_undef;
4459522c 7749 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1
HS
7750 if (DO_UTF8(vecsv))
7751 is_utf = TRUE;
7752 }
7753 if (args) {
7754 vecsv = va_arg(*args, SV*);
7755 vecstr = (U8*)SvPVx(vecsv,veclen);
b2e23cf9 7756 vec_utf = DO_UTF8(vecsv);
eb3fce90 7757 }
211dfcf1
HS
7758 else if (efix ? efix <= svmax : svix < svmax) {
7759 vecsv = svargs[efix ? efix-1 : svix++];
7760 vecstr = (U8*)SvPVx(vecsv,veclen);
b2e23cf9 7761 vec_utf = DO_UTF8(vecsv);
211dfcf1
HS
7762 }
7763 else {
7764 vecstr = (U8*)"";
7765 veclen = 0;
7766 }
eb3fce90 7767 }
fc36a67e 7768
eb3fce90 7769 if (asterisk) {
fc36a67e 7770 if (args)
7771 i = va_arg(*args, int);
7772 else
eb3fce90
JH
7773 i = (ewix ? ewix <= svmax : svix < svmax) ?
7774 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 7775 left |= (i < 0);
7776 width = (i < 0) ? -i : i;
fc36a67e 7777 }
211dfcf1 7778 gotwidth:
fc36a67e 7779
7780 /* PRECISION */
46fc3d4c 7781
fc36a67e 7782 if (*q == '.') {
7783 q++;
7784 if (*q == '*') {
211dfcf1 7785 q++;
497b47a8 7786 if (EXPECT_NUMBER(q, epix) && *q++ != '$') /* epix currently unused */
211dfcf1 7787 goto unknown;
46fc3d4c 7788 if (args)
7789 i = va_arg(*args, int);
7790 else
eb3fce90
JH
7791 i = (ewix ? ewix <= svmax : svix < svmax)
7792 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 7793 precis = (i < 0) ? 0 : i;
fc36a67e 7794 }
7795 else {
7796 precis = 0;
7797 while (isDIGIT(*q))
7798 precis = precis * 10 + (*q++ - '0');
7799 }
7800 has_precis = TRUE;
7801 }
46fc3d4c 7802
fc36a67e 7803 /* SIZE */
46fc3d4c 7804
fc36a67e 7805 switch (*q) {
e5c81feb 7806#if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
6f9bb7fd 7807 case 'L': /* Ld */
e5c81feb
JH
7808 /* FALL THROUGH */
7809#endif
7810#ifdef HAS_QUAD
6f9bb7fd
GS
7811 case 'q': /* qd */
7812 intsize = 'q';
7813 q++;
7814 break;
7815#endif
fc36a67e 7816 case 'l':
e5c81feb
JH
7817#if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
7818 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 7819 intsize = 'q';
7820 q += 2;
46fc3d4c 7821 break;
cf2093f6 7822 }
fc36a67e 7823#endif
6f9bb7fd 7824 /* FALL THROUGH */
fc36a67e 7825 case 'h':
cf2093f6 7826 /* FALL THROUGH */
fc36a67e 7827 case 'V':
7828 intsize = *q++;
46fc3d4c 7829 break;
7830 }
7831
fc36a67e 7832 /* CONVERSION */
7833
211dfcf1
HS
7834 if (*q == '%') {
7835 eptr = q++;
7836 elen = 1;
7837 goto string;
7838 }
7839
7840 if (!args)
7841 argsv = (efix ? efix <= svmax : svix < svmax) ?
7842 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
7843
46fc3d4c 7844 switch (c = *q++) {
7845
7846 /* STRINGS */
7847
46fc3d4c 7848 case 'c':
211dfcf1 7849 uv = args ? va_arg(*args, int) : SvIVx(argsv);
1bd104fb
JH
7850 if ((uv > 255 ||
7851 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 7852 && !IN_BYTES) {
dfe13c55 7853 eptr = (char*)utf8buf;
9041c2e3 7854 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
7e2040f0
GS
7855 is_utf = TRUE;
7856 }
7857 else {
7858 c = (char)uv;
7859 eptr = &c;
7860 elen = 1;
a0ed51b3 7861 }
46fc3d4c 7862 goto string;
7863
46fc3d4c 7864 case 's':
7865 if (args) {
fc36a67e 7866 eptr = va_arg(*args, char*);
c635e13b 7867 if (eptr)
1d7c1841
GS
7868#ifdef MACOS_TRADITIONAL
7869 /* On MacOS, %#s format is used for Pascal strings */
7870 if (alt)
7871 elen = *eptr++;
7872 else
7873#endif
c635e13b 7874 elen = strlen(eptr);
7875 else {
7876 eptr = nullstr;
7877 elen = sizeof nullstr - 1;
7878 }
46fc3d4c 7879 }
211dfcf1 7880 else {
7e2040f0
GS
7881 eptr = SvPVx(argsv, elen);
7882 if (DO_UTF8(argsv)) {
a0ed51b3
LW
7883 if (has_precis && precis < elen) {
7884 I32 p = precis;
7e2040f0 7885 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
7886 precis = p;
7887 }
7888 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 7889 width += elen - sv_len_utf8(argsv);
a0ed51b3 7890 }
7e2040f0 7891 is_utf = TRUE;
a0ed51b3
LW
7892 }
7893 }
46fc3d4c 7894 goto string;
7895
fc36a67e 7896 case '_':
7897 /*
7898 * The "%_" hack might have to be changed someday,
7899 * if ISO or ANSI decide to use '_' for something.
7900 * So we keep it hidden from users' code.
7901 */
7902 if (!args)
7903 goto unknown;
211dfcf1 7904 argsv = va_arg(*args, SV*);
7e2040f0
GS
7905 eptr = SvPVx(argsv, elen);
7906 if (DO_UTF8(argsv))
7907 is_utf = TRUE;
fc36a67e 7908
46fc3d4c 7909 string:
b22c7a20 7910 vectorize = FALSE;
46fc3d4c 7911 if (has_precis && elen > precis)
7912 elen = precis;
7913 break;
7914
7915 /* INTEGERS */
7916
fc36a67e 7917 case 'p':
c2e66d9e
GS
7918 if (alt)
7919 goto unknown;
211dfcf1 7920 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 7921 base = 16;
7922 goto integer;
7923
46fc3d4c 7924 case 'D':
29fe7a80 7925#ifdef IV_IS_QUAD
22f3ae8c 7926 intsize = 'q';
29fe7a80 7927#else
46fc3d4c 7928 intsize = 'l';
29fe7a80 7929#endif
46fc3d4c 7930 /* FALL THROUGH */
7931 case 'd':
7932 case 'i':
b22c7a20 7933 if (vectorize) {
ba210ebe 7934 STRLEN ulen;
211dfcf1
HS
7935 if (!veclen)
7936 continue;
b2e23cf9 7937 if (vec_utf)
9041c2e3 7938 iv = (IV)utf8n_to_uvchr(vecstr, veclen, &ulen, 0);
b22c7a20 7939 else {
a05b299f 7940 iv = *vecstr;
b22c7a20
GS
7941 ulen = 1;
7942 }
7943 vecstr += ulen;
7944 veclen -= ulen;
7945 }
7946 else if (args) {
46fc3d4c 7947 switch (intsize) {
7948 case 'h': iv = (short)va_arg(*args, int); break;
7949 default: iv = va_arg(*args, int); break;
7950 case 'l': iv = va_arg(*args, long); break;
fc36a67e 7951 case 'V': iv = va_arg(*args, IV); break;
cf2093f6
JH
7952#ifdef HAS_QUAD
7953 case 'q': iv = va_arg(*args, Quad_t); break;
7954#endif
46fc3d4c 7955 }
7956 }
7957 else {
211dfcf1 7958 iv = SvIVx(argsv);
46fc3d4c 7959 switch (intsize) {
7960 case 'h': iv = (short)iv; break;
be28567c 7961 default: break;
46fc3d4c 7962 case 'l': iv = (long)iv; break;
fc36a67e 7963 case 'V': break;
cf2093f6
JH
7964#ifdef HAS_QUAD
7965 case 'q': iv = (Quad_t)iv; break;
7966#endif
46fc3d4c 7967 }
7968 }
7969 if (iv >= 0) {
7970 uv = iv;
7971 if (plus)
7972 esignbuf[esignlen++] = plus;
7973 }
7974 else {
7975 uv = -iv;
7976 esignbuf[esignlen++] = '-';
7977 }
7978 base = 10;
7979 goto integer;
7980
fc36a67e 7981 case 'U':
29fe7a80 7982#ifdef IV_IS_QUAD
22f3ae8c 7983 intsize = 'q';
29fe7a80 7984#else
fc36a67e 7985 intsize = 'l';
29fe7a80 7986#endif
fc36a67e 7987 /* FALL THROUGH */
7988 case 'u':
7989 base = 10;
7990 goto uns_integer;
7991
4f19785b
WSI
7992 case 'b':
7993 base = 2;
7994 goto uns_integer;
7995
46fc3d4c 7996 case 'O':
29fe7a80 7997#ifdef IV_IS_QUAD
22f3ae8c 7998 intsize = 'q';
29fe7a80 7999#else
46fc3d4c 8000 intsize = 'l';
29fe7a80 8001#endif
46fc3d4c 8002 /* FALL THROUGH */
8003 case 'o':
8004 base = 8;
8005 goto uns_integer;
8006
8007 case 'X':
46fc3d4c 8008 case 'x':
8009 base = 16;
46fc3d4c 8010
8011 uns_integer:
b22c7a20 8012 if (vectorize) {
ba210ebe 8013 STRLEN ulen;
b22c7a20 8014 vector:
211dfcf1
HS
8015 if (!veclen)
8016 continue;
b2e23cf9 8017 if (vec_utf)
9041c2e3 8018 uv = utf8n_to_uvchr(vecstr, veclen, &ulen, 0);
b22c7a20 8019 else {
a05b299f 8020 uv = *vecstr;
b22c7a20
GS
8021 ulen = 1;
8022 }
8023 vecstr += ulen;
8024 veclen -= ulen;
8025 }
8026 else if (args) {
46fc3d4c 8027 switch (intsize) {
8028 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
8029 default: uv = va_arg(*args, unsigned); break;
8030 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 8031 case 'V': uv = va_arg(*args, UV); break;
cf2093f6
JH
8032#ifdef HAS_QUAD
8033 case 'q': uv = va_arg(*args, Quad_t); break;
8034#endif
46fc3d4c 8035 }
8036 }
8037 else {
211dfcf1 8038 uv = SvUVx(argsv);
46fc3d4c 8039 switch (intsize) {
8040 case 'h': uv = (unsigned short)uv; break;
be28567c 8041 default: break;
46fc3d4c 8042 case 'l': uv = (unsigned long)uv; break;
fc36a67e 8043 case 'V': break;
cf2093f6
JH
8044#ifdef HAS_QUAD
8045 case 'q': uv = (Quad_t)uv; break;
8046#endif
46fc3d4c 8047 }
8048 }
8049
8050 integer:
46fc3d4c 8051 eptr = ebuf + sizeof ebuf;
fc36a67e 8052 switch (base) {
8053 unsigned dig;
8054 case 16:
c10ed8b9
HS
8055 if (!uv)
8056 alt = FALSE;
1d7c1841
GS
8057 p = (char*)((c == 'X')
8058 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 8059 do {
8060 dig = uv & 15;
8061 *--eptr = p[dig];
8062 } while (uv >>= 4);
8063 if (alt) {
46fc3d4c 8064 esignbuf[esignlen++] = '0';
fc36a67e 8065 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 8066 }
fc36a67e 8067 break;
8068 case 8:
8069 do {
8070 dig = uv & 7;
8071 *--eptr = '0' + dig;
8072 } while (uv >>= 3);
8073 if (alt && *eptr != '0')
8074 *--eptr = '0';
8075 break;
4f19785b
WSI
8076 case 2:
8077 do {
8078 dig = uv & 1;
8079 *--eptr = '0' + dig;
8080 } while (uv >>= 1);
eda88b6d
JH
8081 if (alt) {
8082 esignbuf[esignlen++] = '0';
7481bb52 8083 esignbuf[esignlen++] = 'b';
eda88b6d 8084 }
4f19785b 8085 break;
fc36a67e 8086 default: /* it had better be ten or less */
6bc102ca 8087#if defined(PERL_Y2KWARN)
e476b1b5 8088 if (ckWARN(WARN_Y2K)) {
6bc102ca
GS
8089 STRLEN n;
8090 char *s = SvPV(sv,n);
8091 if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
8092 && (n == 2 || !isDIGIT(s[n-3])))
8093 {
e476b1b5 8094 Perl_warner(aTHX_ WARN_Y2K,
6bc102ca
GS
8095 "Possible Y2K bug: %%%c %s",
8096 c, "format string following '19'");
8097 }
8098 }
8099#endif
fc36a67e 8100 do {
8101 dig = uv % base;
8102 *--eptr = '0' + dig;
8103 } while (uv /= base);
8104 break;
46fc3d4c 8105 }
8106 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
8107 if (has_precis) {
8108 if (precis > elen)
8109 zeros = precis - elen;
8110 else if (precis == 0 && elen == 1 && *eptr == '0')
8111 elen = 0;
8112 }
46fc3d4c 8113 break;
8114
8115 /* FLOATING POINT */
8116
fc36a67e 8117 case 'F':
8118 c = 'f'; /* maybe %F isn't supported here */
8119 /* FALL THROUGH */
46fc3d4c 8120 case 'e': case 'E':
fc36a67e 8121 case 'f':
46fc3d4c 8122 case 'g': case 'G':
8123
8124 /* This is evil, but floating point is even more evil */
8125
b22c7a20 8126 vectorize = FALSE;
211dfcf1 8127 nv = args ? va_arg(*args, NV) : SvNVx(argsv);
fc36a67e 8128
8129 need = 0;
8130 if (c != 'e' && c != 'E') {
8131 i = PERL_INT_MIN;
73b309ea 8132 (void)Perl_frexp(nv, &i);
fc36a67e 8133 if (i == PERL_INT_MIN)
cea2e8a9 8134 Perl_die(aTHX_ "panic: frexp");
c635e13b 8135 if (i > 0)
fc36a67e 8136 need = BIT_DIGITS(i);
8137 }
8138 need += has_precis ? precis : 6; /* known default */
8139 if (need < width)
8140 need = width;
8141
46fc3d4c 8142 need += 20; /* fudge factor */
80252599
GS
8143 if (PL_efloatsize < need) {
8144 Safefree(PL_efloatbuf);
8145 PL_efloatsize = need + 20; /* more fudge */
8146 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 8147 PL_efloatbuf[0] = '\0';
46fc3d4c 8148 }
8149
8150 eptr = ebuf + sizeof ebuf;
8151 *--eptr = '\0';
8152 *--eptr = c;
e5c81feb 8153#if defined(USE_LONG_DOUBLE) && defined(PERL_PRIfldbl)
cf2093f6 8154 {
e5c81feb
JH
8155 /* Copy the one or more characters in a long double
8156 * format before the 'base' ([efgEFG]) character to
8157 * the format string. */
8158 static char const prifldbl[] = PERL_PRIfldbl;
8159 char const *p = prifldbl + sizeof(prifldbl) - 3;
8160 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 8161 }
65202027 8162#endif
46fc3d4c 8163 if (has_precis) {
8164 base = precis;
8165 do { *--eptr = '0' + (base % 10); } while (base /= 10);
8166 *--eptr = '.';
8167 }
8168 if (width) {
8169 base = width;
8170 do { *--eptr = '0' + (base % 10); } while (base /= 10);
8171 }
8172 if (fill == '0')
8173 *--eptr = fill;
84902520
TB
8174 if (left)
8175 *--eptr = '-';
46fc3d4c 8176 if (plus)
8177 *--eptr = plus;
8178 if (alt)
8179 *--eptr = '#';
8180 *--eptr = '%';
8181
ff9121f8
JH
8182 /* No taint. Otherwise we are in the strange situation
8183 * where printf() taints but print($float) doesn't.
bda0f7a5 8184 * --jhi */
dd8482fc 8185 (void)sprintf(PL_efloatbuf, eptr, nv);
8af02333 8186
80252599
GS
8187 eptr = PL_efloatbuf;
8188 elen = strlen(PL_efloatbuf);
46fc3d4c 8189 break;
8190
fc36a67e 8191 /* SPECIAL */
8192
8193 case 'n':
b22c7a20 8194 vectorize = FALSE;
fc36a67e 8195 i = SvCUR(sv) - origlen;
8196 if (args) {
c635e13b 8197 switch (intsize) {
8198 case 'h': *(va_arg(*args, short*)) = i; break;
8199 default: *(va_arg(*args, int*)) = i; break;
8200 case 'l': *(va_arg(*args, long*)) = i; break;
8201 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
8202#ifdef HAS_QUAD
8203 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
8204#endif
c635e13b 8205 }
fc36a67e 8206 }
9dd79c3f 8207 else
211dfcf1 8208 sv_setuv_mg(argsv, (UV)i);
fc36a67e 8209 continue; /* not "break" */
8210
8211 /* UNKNOWN */
8212
46fc3d4c 8213 default:
fc36a67e 8214 unknown:
b22c7a20 8215 vectorize = FALSE;
599cee73 8216 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 8217 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 8218 SV *msg = sv_newmortal();
cea2e8a9 8219 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %s: ",
533c011a 8220 (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
0f4b6630 8221 if (c) {
0f4b6630 8222 if (isPRINT(c))
1c846c1f 8223 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
8224 "\"%%%c\"", c & 0xFF);
8225 else
8226 Perl_sv_catpvf(aTHX_ msg,
57def98f 8227 "\"%%\\%03"UVof"\"",
0f4b6630 8228 (UV)c & 0xFF);
0f4b6630 8229 } else
c635e13b 8230 sv_catpv(msg, "end of string");
894356b3 8231 Perl_warner(aTHX_ WARN_PRINTF, "%"SVf, msg); /* yes, this is reentrant */
c635e13b 8232 }
fb73857a 8233
8234 /* output mangled stuff ... */
8235 if (c == '\0')
8236 --q;
46fc3d4c 8237 eptr = p;
8238 elen = q - p;
fb73857a 8239
8240 /* ... right here, because formatting flags should not apply */
8241 SvGROW(sv, SvCUR(sv) + elen + 1);
8242 p = SvEND(sv);
4459522c 8243 Copy(eptr, p, elen, char);
fb73857a 8244 p += elen;
8245 *p = '\0';
8246 SvCUR(sv) = p - SvPVX(sv);
8247 continue; /* not "break" */
46fc3d4c 8248 }
8249
fc36a67e 8250 have = esignlen + zeros + elen;
46fc3d4c 8251 need = (have > width ? have : width);
8252 gap = need - have;
8253
b22c7a20 8254 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 8255 p = SvEND(sv);
8256 if (esignlen && fill == '0') {
8257 for (i = 0; i < esignlen; i++)
8258 *p++ = esignbuf[i];
8259 }
8260 if (gap && !left) {
8261 memset(p, fill, gap);
8262 p += gap;
8263 }
8264 if (esignlen && fill != '0') {
8265 for (i = 0; i < esignlen; i++)
8266 *p++ = esignbuf[i];
8267 }
fc36a67e 8268 if (zeros) {
8269 for (i = zeros; i; i--)
8270 *p++ = '0';
8271 }
46fc3d4c 8272 if (elen) {
4459522c 8273 Copy(eptr, p, elen, char);
46fc3d4c 8274 p += elen;
8275 }
8276 if (gap && left) {
8277 memset(p, ' ', gap);
8278 p += gap;
8279 }
b22c7a20
GS
8280 if (vectorize) {
8281 if (veclen) {
4459522c 8282 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
8283 p += dotstrlen;
8284 }
8285 else
8286 vectorize = FALSE; /* done iterating over vecstr */
8287 }
7e2040f0
GS
8288 if (is_utf)
8289 SvUTF8_on(sv);
46fc3d4c 8290 *p = '\0';
8291 SvCUR(sv) = p - SvPVX(sv);
b22c7a20
GS
8292 if (vectorize) {
8293 esignlen = 0;
8294 goto vector;
8295 }
46fc3d4c 8296 }
8297}
51371543 8298
645c22ef
DM
8299/* =========================================================================
8300
8301=head1 Cloning an interpreter
8302
8303All the macros and functions in this section are for the private use of
8304the main function, perl_clone().
8305
8306The foo_dup() functions make an exact copy of an existing foo thinngy.
8307During the course of a cloning, a hash table is used to map old addresses
8308to new addresses. The table is created and manipulated with the
8309ptr_table_* functions.
8310
8311=cut
8312
8313============================================================================*/
8314
8315
1d7c1841
GS
8316#if defined(USE_ITHREADS)
8317
8318#if defined(USE_THREADS)
8319# include "error: USE_THREADS and USE_ITHREADS are incompatible"
8320#endif
8321
1d7c1841
GS
8322#ifndef GpREFCNT_inc
8323# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
8324#endif
8325
8326
d2d73c3e
AB
8327#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
8328#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
8329#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8330#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
8331#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8332#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
8333#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8334#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
8335#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
8336#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
8337#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
1d7c1841
GS
8338#define SAVEPV(p) (p ? savepv(p) : Nullch)
8339#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
d2d73c3e
AB
8340
8341
1d7c1841 8342
645c22ef
DM
8343/* duplicate a regexp */
8344
1d7c1841
GS
8345REGEXP *
8346Perl_re_dup(pTHX_ REGEXP *r)
8347{
8348 /* XXX fix when pmop->op_pmregexp becomes shared */
8349 return ReREFCNT_inc(r);
8350}
8351
d2d73c3e 8352/* duplicate a file handle */
645c22ef 8353
1d7c1841
GS
8354PerlIO *
8355Perl_fp_dup(pTHX_ PerlIO *fp, char type)
8356{
8357 PerlIO *ret;
8358 if (!fp)
8359 return (PerlIO*)NULL;
8360
8361 /* look for it in the table first */
8362 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
8363 if (ret)
8364 return ret;
8365
8366 /* create anew and remember what it is */
5f1a76d0 8367 ret = PerlIO_fdupopen(aTHX_ fp);
1d7c1841
GS
8368 ptr_table_store(PL_ptr_table, fp, ret);
8369 return ret;
8370}
8371
645c22ef
DM
8372/* duplicate a directory handle */
8373
1d7c1841
GS
8374DIR *
8375Perl_dirp_dup(pTHX_ DIR *dp)
8376{
8377 if (!dp)
8378 return (DIR*)NULL;
8379 /* XXX TODO */
8380 return dp;
8381}
8382
ff276b08 8383/* duplicate a typeglob */
645c22ef 8384
1d7c1841 8385GP *
d2d73c3e 8386Perl_gp_dup(pTHX_ GP *gp, clone_params* param)
1d7c1841
GS
8387{
8388 GP *ret;
8389 if (!gp)
8390 return (GP*)NULL;
8391 /* look for it in the table first */
8392 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
8393 if (ret)
8394 return ret;
8395
8396 /* create anew and remember what it is */
8397 Newz(0, ret, 1, GP);
8398 ptr_table_store(PL_ptr_table, gp, ret);
8399
8400 /* clone */
8401 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
8402 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
8403 ret->gp_io = io_dup_inc(gp->gp_io, param);
8404 ret->gp_form = cv_dup_inc(gp->gp_form, param);
8405 ret->gp_av = av_dup_inc(gp->gp_av, param);
8406 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
8407 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
8408 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841
GS
8409 ret->gp_cvgen = gp->gp_cvgen;
8410 ret->gp_flags = gp->gp_flags;
8411 ret->gp_line = gp->gp_line;
8412 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
8413 return ret;
8414}
8415
645c22ef
DM
8416/* duplicate a chain of magic */
8417
1d7c1841 8418MAGIC *
d2d73c3e 8419Perl_mg_dup(pTHX_ MAGIC *mg, clone_params* param)
1d7c1841 8420{
cb359b41
JH
8421 MAGIC *mgprev = (MAGIC*)NULL;
8422 MAGIC *mgret;
1d7c1841
GS
8423 if (!mg)
8424 return (MAGIC*)NULL;
8425 /* look for it in the table first */
8426 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
8427 if (mgret)
8428 return mgret;
8429
8430 for (; mg; mg = mg->mg_moremagic) {
8431 MAGIC *nmg;
8432 Newz(0, nmg, 1, MAGIC);
cb359b41 8433 if (mgprev)
1d7c1841 8434 mgprev->mg_moremagic = nmg;
cb359b41
JH
8435 else
8436 mgret = nmg;
1d7c1841
GS
8437 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
8438 nmg->mg_private = mg->mg_private;
8439 nmg->mg_type = mg->mg_type;
8440 nmg->mg_flags = mg->mg_flags;
14befaf4 8441 if (mg->mg_type == PERL_MAGIC_qr) {
1d7c1841
GS
8442 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj);
8443 }
05bd4103
JH
8444 else if(mg->mg_type == PERL_MAGIC_backref) {
8445 AV *av = (AV*) mg->mg_obj;
8446 SV **svp;
8447 I32 i;
8448 nmg->mg_obj = (SV*)newAV();
8449 svp = AvARRAY(av);
8450 i = AvFILLp(av);
8451 while (i >= 0) {
8452 av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
8453 i--;
8454 }
8455 }
1d7c1841
GS
8456 else {
8457 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
8458 ? sv_dup_inc(mg->mg_obj, param)
8459 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
8460 }
8461 nmg->mg_len = mg->mg_len;
8462 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 8463 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
1d7c1841
GS
8464 if (mg->mg_len >= 0) {
8465 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
8466 if (mg->mg_type == PERL_MAGIC_overload_table &&
8467 AMT_AMAGIC((AMT*)mg->mg_ptr))
8468 {
1d7c1841
GS
8469 AMT *amtp = (AMT*)mg->mg_ptr;
8470 AMT *namtp = (AMT*)nmg->mg_ptr;
8471 I32 i;
8472 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 8473 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
8474 }
8475 }
8476 }
8477 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 8478 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841
GS
8479 }
8480 mgprev = nmg;
8481 }
8482 return mgret;
8483}
8484
645c22ef
DM
8485/* create a new pointer-mapping table */
8486
1d7c1841
GS
8487PTR_TBL_t *
8488Perl_ptr_table_new(pTHX)
8489{
8490 PTR_TBL_t *tbl;
8491 Newz(0, tbl, 1, PTR_TBL_t);
8492 tbl->tbl_max = 511;
8493 tbl->tbl_items = 0;
8494 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
8495 return tbl;
8496}
8497
645c22ef
DM
8498/* map an existing pointer using a table */
8499
1d7c1841
GS
8500void *
8501Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
8502{
8503 PTR_TBL_ENT_t *tblent;
d2a79402 8504 UV hash = PTR2UV(sv);
1d7c1841
GS
8505 assert(tbl);
8506 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
8507 for (; tblent; tblent = tblent->next) {
8508 if (tblent->oldval == sv)
8509 return tblent->newval;
8510 }
8511 return (void*)NULL;
8512}
8513
645c22ef
DM
8514/* add a new entry to a pointer-mapping table */
8515
1d7c1841
GS
8516void
8517Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
8518{
8519 PTR_TBL_ENT_t *tblent, **otblent;
8520 /* XXX this may be pessimal on platforms where pointers aren't good
8521 * hash values e.g. if they grow faster in the most significant
8522 * bits */
d2a79402 8523 UV hash = PTR2UV(oldv);
1d7c1841
GS
8524 bool i = 1;
8525
8526 assert(tbl);
8527 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
8528 for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
8529 if (tblent->oldval == oldv) {
8530 tblent->newval = newv;
8531 tbl->tbl_items++;
8532 return;
8533 }
8534 }
8535 Newz(0, tblent, 1, PTR_TBL_ENT_t);
8536 tblent->oldval = oldv;
8537 tblent->newval = newv;
8538 tblent->next = *otblent;
8539 *otblent = tblent;
8540 tbl->tbl_items++;
8541 if (i && tbl->tbl_items > tbl->tbl_max)
8542 ptr_table_split(tbl);
8543}
8544
645c22ef
DM
8545/* double the hash bucket size of an existing ptr table */
8546
1d7c1841
GS
8547void
8548Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
8549{
8550 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
8551 UV oldsize = tbl->tbl_max + 1;
8552 UV newsize = oldsize * 2;
8553 UV i;
8554
8555 Renew(ary, newsize, PTR_TBL_ENT_t*);
8556 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
8557 tbl->tbl_max = --newsize;
8558 tbl->tbl_ary = ary;
8559 for (i=0; i < oldsize; i++, ary++) {
8560 PTR_TBL_ENT_t **curentp, **entp, *ent;
8561 if (!*ary)
8562 continue;
8563 curentp = ary + oldsize;
8564 for (entp = ary, ent = *ary; ent; ent = *entp) {
d2a79402 8565 if ((newsize & PTR2UV(ent->oldval)) != i) {
1d7c1841
GS
8566 *entp = ent->next;
8567 ent->next = *curentp;
8568 *curentp = ent;
8569 continue;
8570 }
8571 else
8572 entp = &ent->next;
8573 }
8574 }
8575}
8576
645c22ef
DM
8577/* remove all the entries from a ptr table */
8578
a0739874
DM
8579void
8580Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
8581{
8582 register PTR_TBL_ENT_t **array;
8583 register PTR_TBL_ENT_t *entry;
8584 register PTR_TBL_ENT_t *oentry = Null(PTR_TBL_ENT_t*);
8585 UV riter = 0;
8586 UV max;
8587
8588 if (!tbl || !tbl->tbl_items) {
8589 return;
8590 }
8591
8592 array = tbl->tbl_ary;
8593 entry = array[0];
8594 max = tbl->tbl_max;
8595
8596 for (;;) {
8597 if (entry) {
8598 oentry = entry;
8599 entry = entry->next;
8600 Safefree(oentry);
8601 }
8602 if (!entry) {
8603 if (++riter > max) {
8604 break;
8605 }
8606 entry = array[riter];
8607 }
8608 }
8609
8610 tbl->tbl_items = 0;
8611}
8612
645c22ef
DM
8613/* clear and free a ptr table */
8614
a0739874
DM
8615void
8616Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
8617{
8618 if (!tbl) {
8619 return;
8620 }
8621 ptr_table_clear(tbl);
8622 Safefree(tbl->tbl_ary);
8623 Safefree(tbl);
8624}
8625
1d7c1841
GS
8626#ifdef DEBUGGING
8627char *PL_watch_pvx;
8628#endif
8629
645c22ef
DM
8630/* attempt to make everything in the typeglob readonly */
8631
5bd07a3d
DM
8632STATIC SV *
8633S_gv_share(pTHX_ SV *sstr)
8634{
8635 GV *gv = (GV*)sstr;
8636 SV *sv = &PL_sv_no; /* just need SvREADONLY-ness */
8637
8638 if (GvIO(gv) || GvFORM(gv)) {
7fb37951 8639 GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
5bd07a3d
DM
8640 }
8641 else if (!GvCV(gv)) {
8642 GvCV(gv) = (CV*)sv;
8643 }
8644 else {
8645 /* CvPADLISTs cannot be shared */
8646 if (!CvXSUB(GvCV(gv))) {
7fb37951 8647 GvUNIQUE_off(gv);
5bd07a3d
DM
8648 }
8649 }
8650
7fb37951 8651 if (!GvUNIQUE(gv)) {
5bd07a3d
DM
8652#if 0
8653 PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
8654 HvNAME(GvSTASH(gv)), GvNAME(gv));
8655#endif
8656 return Nullsv;
8657 }
8658
4411f3b6 8659 /*
5bd07a3d
DM
8660 * write attempts will die with
8661 * "Modification of a read-only value attempted"
8662 */
8663 if (!GvSV(gv)) {
8664 GvSV(gv) = sv;
8665 }
8666 else {
8667 SvREADONLY_on(GvSV(gv));
8668 }
8669
8670 if (!GvAV(gv)) {
8671 GvAV(gv) = (AV*)sv;
8672 }
8673 else {
8674 SvREADONLY_on(GvAV(gv));
8675 }
8676
8677 if (!GvHV(gv)) {
8678 GvHV(gv) = (HV*)sv;
8679 }
8680 else {
8681 SvREADONLY_on(GvAV(gv));
8682 }
8683
8684 return sstr; /* he_dup() will SvREFCNT_inc() */
8685}
8686
645c22ef
DM
8687/* duplicate an SV of any type (including AV, HV etc) */
8688
1d7c1841 8689SV *
d2d73c3e 8690Perl_sv_dup(pTHX_ SV *sstr, clone_params* param)
1d7c1841 8691{
1d7c1841
GS
8692 SV *dstr;
8693
8694 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
8695 return Nullsv;
8696 /* look for it in the table first */
8697 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
8698 if (dstr)
8699 return dstr;
8700
8701 /* create anew and remember what it is */
8702 new_SV(dstr);
8703 ptr_table_store(PL_ptr_table, sstr, dstr);
8704
8705 /* clone */
8706 SvFLAGS(dstr) = SvFLAGS(sstr);
8707 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
8708 SvREFCNT(dstr) = 0; /* must be before any other dups! */
8709
8710#ifdef DEBUGGING
8711 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
8712 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
8713 PL_watch_pvx, SvPVX(sstr));
8714#endif
8715
8716 switch (SvTYPE(sstr)) {
8717 case SVt_NULL:
8718 SvANY(dstr) = NULL;
8719 break;
8720 case SVt_IV:
8721 SvANY(dstr) = new_XIV();
8722 SvIVX(dstr) = SvIVX(sstr);
8723 break;
8724 case SVt_NV:
8725 SvANY(dstr) = new_XNV();
8726 SvNVX(dstr) = SvNVX(sstr);
8727 break;
8728 case SVt_RV:
8729 SvANY(dstr) = new_XRV();
5f68ba95 8730 SvRV(dstr) = SvRV(sstr) && SvWEAKREF(sstr)
d2d73c3e
AB
8731 ? sv_dup(SvRV(sstr), param)
8732 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8733 break;
8734 case SVt_PV:
8735 SvANY(dstr) = new_XPV();
8736 SvCUR(dstr) = SvCUR(sstr);
8737 SvLEN(dstr) = SvLEN(sstr);
8738 if (SvROK(sstr))
5f68ba95 8739 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
8740 ? sv_dup(SvRV(sstr), param)
8741 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8742 else if (SvPVX(sstr) && SvLEN(sstr))
8743 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8744 else
8745 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
8746 break;
8747 case SVt_PVIV:
8748 SvANY(dstr) = new_XPVIV();
8749 SvCUR(dstr) = SvCUR(sstr);
8750 SvLEN(dstr) = SvLEN(sstr);
8751 SvIVX(dstr) = SvIVX(sstr);
8752 if (SvROK(sstr))
5f68ba95 8753 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
8754 ? sv_dup(SvRV(sstr), param)
8755 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8756 else if (SvPVX(sstr) && SvLEN(sstr))
8757 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8758 else
8759 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
8760 break;
8761 case SVt_PVNV:
8762 SvANY(dstr) = new_XPVNV();
8763 SvCUR(dstr) = SvCUR(sstr);
8764 SvLEN(dstr) = SvLEN(sstr);
8765 SvIVX(dstr) = SvIVX(sstr);
8766 SvNVX(dstr) = SvNVX(sstr);
8767 if (SvROK(sstr))
5f68ba95 8768 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
8769 ? sv_dup(SvRV(sstr), param)
8770 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8771 else if (SvPVX(sstr) && SvLEN(sstr))
8772 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8773 else
8774 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
8775 break;
8776 case SVt_PVMG:
8777 SvANY(dstr) = new_XPVMG();
8778 SvCUR(dstr) = SvCUR(sstr);
8779 SvLEN(dstr) = SvLEN(sstr);
8780 SvIVX(dstr) = SvIVX(sstr);
8781 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
8782 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
8783 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841 8784 if (SvROK(sstr))
5f68ba95 8785 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
8786 ? sv_dup(SvRV(sstr), param)
8787 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8788 else if (SvPVX(sstr) && SvLEN(sstr))
8789 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8790 else
8791 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
8792 break;
8793 case SVt_PVBM:
8794 SvANY(dstr) = new_XPVBM();
8795 SvCUR(dstr) = SvCUR(sstr);
8796 SvLEN(dstr) = SvLEN(sstr);
8797 SvIVX(dstr) = SvIVX(sstr);
8798 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
8799 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
8800 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841 8801 if (SvROK(sstr))
5f68ba95 8802 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
8803 ? sv_dup(SvRV(sstr), param)
8804 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8805 else if (SvPVX(sstr) && SvLEN(sstr))
8806 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8807 else
8808 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
8809 BmRARE(dstr) = BmRARE(sstr);
8810 BmUSEFUL(dstr) = BmUSEFUL(sstr);
8811 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
8812 break;
8813 case SVt_PVLV:
8814 SvANY(dstr) = new_XPVLV();
8815 SvCUR(dstr) = SvCUR(sstr);
8816 SvLEN(dstr) = SvLEN(sstr);
8817 SvIVX(dstr) = SvIVX(sstr);
8818 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
8819 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
8820 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841 8821 if (SvROK(sstr))
5f68ba95 8822 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
8823 ? sv_dup(SvRV(sstr), param)
8824 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8825 else if (SvPVX(sstr) && SvLEN(sstr))
8826 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8827 else
8828 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
8829 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
8830 LvTARGLEN(dstr) = LvTARGLEN(sstr);
d2d73c3e 8831 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr), param);
1d7c1841
GS
8832 LvTYPE(dstr) = LvTYPE(sstr);
8833 break;
8834 case SVt_PVGV:
7fb37951 8835 if (GvUNIQUE((GV*)sstr)) {
5bd07a3d
DM
8836 SV *share;
8837 if ((share = gv_share(sstr))) {
8838 del_SV(dstr);
8839 dstr = share;
8840#if 0
8841 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
8842 HvNAME(GvSTASH(share)), GvNAME(share));
8843#endif
8844 break;
8845 }
8846 }
1d7c1841
GS
8847 SvANY(dstr) = new_XPVGV();
8848 SvCUR(dstr) = SvCUR(sstr);
8849 SvLEN(dstr) = SvLEN(sstr);
8850 SvIVX(dstr) = SvIVX(sstr);
8851 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
8852 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
8853 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841 8854 if (SvROK(sstr))
5f68ba95 8855 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
8856 ? sv_dup(SvRV(sstr), param)
8857 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8858 else if (SvPVX(sstr) && SvLEN(sstr))
8859 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8860 else
8861 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
8862 GvNAMELEN(dstr) = GvNAMELEN(sstr);
8863 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
d2d73c3e 8864 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr), param);
1d7c1841 8865 GvFLAGS(dstr) = GvFLAGS(sstr);
d2d73c3e 8866 GvGP(dstr) = gp_dup(GvGP(sstr), param);
1d7c1841
GS
8867 (void)GpREFCNT_inc(GvGP(dstr));
8868 break;
8869 case SVt_PVIO:
8870 SvANY(dstr) = new_XPVIO();
8871 SvCUR(dstr) = SvCUR(sstr);
8872 SvLEN(dstr) = SvLEN(sstr);
8873 SvIVX(dstr) = SvIVX(sstr);
8874 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
8875 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
8876 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841 8877 if (SvROK(sstr))
5f68ba95 8878 SvRV(dstr) = SvWEAKREF(sstr)
d2d73c3e
AB
8879 ? sv_dup(SvRV(sstr), param)
8880 : sv_dup_inc(SvRV(sstr), param);
1d7c1841
GS
8881 else if (SvPVX(sstr) && SvLEN(sstr))
8882 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8883 else
8884 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
8885 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr));
8886 if (IoOFP(sstr) == IoIFP(sstr))
8887 IoOFP(dstr) = IoIFP(dstr);
8888 else
8889 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr));
8890 /* PL_rsfp_filters entries have fake IoDIRP() */
8891 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
8892 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
8893 else
8894 IoDIRP(dstr) = IoDIRP(sstr);
8895 IoLINES(dstr) = IoLINES(sstr);
8896 IoPAGE(dstr) = IoPAGE(sstr);
8897 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
8898 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
8899 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
d2d73c3e 8900 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr), param);
1d7c1841 8901 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
d2d73c3e 8902 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr), param);
1d7c1841 8903 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
d2d73c3e 8904 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr), param);
1d7c1841
GS
8905 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
8906 IoTYPE(dstr) = IoTYPE(sstr);
8907 IoFLAGS(dstr) = IoFLAGS(sstr);
8908 break;
8909 case SVt_PVAV:
8910 SvANY(dstr) = new_XPVAV();
8911 SvCUR(dstr) = SvCUR(sstr);
8912 SvLEN(dstr) = SvLEN(sstr);
8913 SvIVX(dstr) = SvIVX(sstr);
8914 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
8915 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
8916 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
8917 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
1d7c1841
GS
8918 AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
8919 if (AvARRAY((AV*)sstr)) {
8920 SV **dst_ary, **src_ary;
8921 SSize_t items = AvFILLp((AV*)sstr) + 1;
8922
8923 src_ary = AvARRAY((AV*)sstr);
8924 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
8925 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
8926 SvPVX(dstr) = (char*)dst_ary;
8927 AvALLOC((AV*)dstr) = dst_ary;
8928 if (AvREAL((AV*)sstr)) {
8929 while (items-- > 0)
d2d73c3e 8930 *dst_ary++ = sv_dup_inc(*src_ary++, param);
1d7c1841
GS
8931 }
8932 else {
8933 while (items-- > 0)
d2d73c3e 8934 *dst_ary++ = sv_dup(*src_ary++, param);
1d7c1841
GS
8935 }
8936 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
8937 while (items-- > 0) {
8938 *dst_ary++ = &PL_sv_undef;
8939 }
8940 }
8941 else {
8942 SvPVX(dstr) = Nullch;
8943 AvALLOC((AV*)dstr) = (SV**)NULL;
8944 }
8945 break;
8946 case SVt_PVHV:
8947 SvANY(dstr) = new_XPVHV();
8948 SvCUR(dstr) = SvCUR(sstr);
8949 SvLEN(dstr) = SvLEN(sstr);
8950 SvIVX(dstr) = SvIVX(sstr);
8951 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
8952 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
8953 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841
GS
8954 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
8955 if (HvARRAY((HV*)sstr)) {
1d7c1841
GS
8956 STRLEN i = 0;
8957 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
8958 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
8959 Newz(0, dxhv->xhv_array,
8960 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
8961 while (i <= sxhv->xhv_max) {
8962 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
d2d73c3e 8963 !!HvSHAREKEYS(sstr), param);
1d7c1841
GS
8964 ++i;
8965 }
d2d73c3e 8966 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter, !!HvSHAREKEYS(sstr), param);
1d7c1841
GS
8967 }
8968 else {
8969 SvPVX(dstr) = Nullch;
8970 HvEITER((HV*)dstr) = (HE*)NULL;
8971 }
8972 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
8973 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
c43294b8 8974 /* Record stashes for possible cloning in Perl_clone(). */
6676db26 8975 if(HvNAME((HV*)dstr))
d2d73c3e 8976 av_push(param->stashes, dstr);
1d7c1841
GS
8977 break;
8978 case SVt_PVFM:
8979 SvANY(dstr) = new_XPVFM();
8980 FmLINES(dstr) = FmLINES(sstr);
8981 goto dup_pvcv;
8982 /* NOTREACHED */
8983 case SVt_PVCV:
8984 SvANY(dstr) = new_XPVCV();
d2d73c3e 8985 dup_pvcv:
1d7c1841
GS
8986 SvCUR(dstr) = SvCUR(sstr);
8987 SvLEN(dstr) = SvLEN(sstr);
8988 SvIVX(dstr) = SvIVX(sstr);
8989 SvNVX(dstr) = SvNVX(sstr);
d2d73c3e
AB
8990 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr), param);
8991 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr), param);
1d7c1841
GS
8992 if (SvPVX(sstr) && SvLEN(sstr))
8993 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8994 else
8995 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
d2d73c3e 8996 CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
1d7c1841
GS
8997 CvSTART(dstr) = CvSTART(sstr);
8998 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
8999 CvXSUB(dstr) = CvXSUB(sstr);
9000 CvXSUBANY(dstr) = CvXSUBANY(sstr);
d2d73c3e
AB
9001 CvGV(dstr) = gv_dup(CvGV(sstr), param);
9002 if (param->flags & CLONEf_COPY_STACKS) {
9003 CvDEPTH(dstr) = CvDEPTH(sstr);
9004 } else {
9005 CvDEPTH(dstr) = 0;
9006 }
1d7c1841
GS
9007 if (CvPADLIST(sstr) && !AvREAL(CvPADLIST(sstr))) {
9008 /* XXX padlists are real, but pretend to be not */
9009 AvREAL_on(CvPADLIST(sstr));
d2d73c3e 9010 CvPADLIST(dstr) = av_dup_inc(CvPADLIST(sstr), param);
1d7c1841
GS
9011 AvREAL_off(CvPADLIST(sstr));
9012 AvREAL_off(CvPADLIST(dstr));
9013 }
9014 else
d2d73c3e 9015 CvPADLIST(dstr) = av_dup_inc(CvPADLIST(sstr), param);
282f25c9 9016 if (!CvANON(sstr) || CvCLONED(sstr))
d2d73c3e 9017 CvOUTSIDE(dstr) = cv_dup_inc(CvOUTSIDE(sstr), param);
282f25c9 9018 else
d2d73c3e 9019 CvOUTSIDE(dstr) = cv_dup(CvOUTSIDE(sstr), param);
1d7c1841 9020 CvFLAGS(dstr) = CvFLAGS(sstr);
54356c7d 9021 CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
1d7c1841
GS
9022 break;
9023 default:
9024 Perl_croak(aTHX_ "Bizarre SvTYPE [%d]", SvTYPE(sstr));
9025 break;
9026 }
9027
9028 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
9029 ++PL_sv_objcount;
9030
9031 return dstr;
d2d73c3e 9032 }
1d7c1841 9033
645c22ef
DM
9034/* duplicate a context */
9035
1d7c1841 9036PERL_CONTEXT *
d2d73c3e 9037Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, clone_params* param)
1d7c1841
GS
9038{
9039 PERL_CONTEXT *ncxs;
9040
9041 if (!cxs)
9042 return (PERL_CONTEXT*)NULL;
9043
9044 /* look for it in the table first */
9045 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
9046 if (ncxs)
9047 return ncxs;
9048
9049 /* create anew and remember what it is */
9050 Newz(56, ncxs, max + 1, PERL_CONTEXT);
9051 ptr_table_store(PL_ptr_table, cxs, ncxs);
9052
9053 while (ix >= 0) {
9054 PERL_CONTEXT *cx = &cxs[ix];
9055 PERL_CONTEXT *ncx = &ncxs[ix];
9056 ncx->cx_type = cx->cx_type;
9057 if (CxTYPE(cx) == CXt_SUBST) {
9058 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
9059 }
9060 else {
9061 ncx->blk_oldsp = cx->blk_oldsp;
9062 ncx->blk_oldcop = cx->blk_oldcop;
9063 ncx->blk_oldretsp = cx->blk_oldretsp;
9064 ncx->blk_oldmarksp = cx->blk_oldmarksp;
9065 ncx->blk_oldscopesp = cx->blk_oldscopesp;
9066 ncx->blk_oldpm = cx->blk_oldpm;
9067 ncx->blk_gimme = cx->blk_gimme;
9068 switch (CxTYPE(cx)) {
9069 case CXt_SUB:
9070 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
9071 ? cv_dup_inc(cx->blk_sub.cv, param)
9072 : cv_dup(cx->blk_sub.cv,param));
1d7c1841 9073 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 9074 ? av_dup_inc(cx->blk_sub.argarray, param)
1d7c1841 9075 : Nullav);
d2d73c3e 9076 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841
GS
9077 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
9078 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
9079 ncx->blk_sub.lval = cx->blk_sub.lval;
9080 break;
9081 case CXt_EVAL:
9082 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
9083 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
d2d73c3e 9084 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);;
1d7c1841 9085 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 9086 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
1d7c1841
GS
9087 break;
9088 case CXt_LOOP:
9089 ncx->blk_loop.label = cx->blk_loop.label;
9090 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
9091 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
9092 ncx->blk_loop.next_op = cx->blk_loop.next_op;
9093 ncx->blk_loop.last_op = cx->blk_loop.last_op;
9094 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
9095 ? cx->blk_loop.iterdata
d2d73c3e 9096 : gv_dup((GV*)cx->blk_loop.iterdata, param));
a4b82a6f
GS
9097 ncx->blk_loop.oldcurpad
9098 = (SV**)ptr_table_fetch(PL_ptr_table,
9099 cx->blk_loop.oldcurpad);
d2d73c3e
AB
9100 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
9101 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
9102 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
9103 ncx->blk_loop.iterix = cx->blk_loop.iterix;
9104 ncx->blk_loop.itermax = cx->blk_loop.itermax;
9105 break;
9106 case CXt_FORMAT:
d2d73c3e
AB
9107 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
9108 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
9109 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
1d7c1841
GS
9110 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
9111 break;
9112 case CXt_BLOCK:
9113 case CXt_NULL:
9114 break;
9115 }
9116 }
9117 --ix;
9118 }
9119 return ncxs;
9120}
9121
645c22ef
DM
9122/* duplicate a stack info structure */
9123
1d7c1841 9124PERL_SI *
d2d73c3e 9125Perl_si_dup(pTHX_ PERL_SI *si, clone_params* param)
1d7c1841
GS
9126{
9127 PERL_SI *nsi;
9128
9129 if (!si)
9130 return (PERL_SI*)NULL;
9131
9132 /* look for it in the table first */
9133 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
9134 if (nsi)
9135 return nsi;
9136
9137 /* create anew and remember what it is */
9138 Newz(56, nsi, 1, PERL_SI);
9139 ptr_table_store(PL_ptr_table, si, nsi);
9140
d2d73c3e 9141 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
9142 nsi->si_cxix = si->si_cxix;
9143 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 9144 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 9145 nsi->si_type = si->si_type;
d2d73c3e
AB
9146 nsi->si_prev = si_dup(si->si_prev, param);
9147 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
9148 nsi->si_markoff = si->si_markoff;
9149
9150 return nsi;
9151}
9152
9153#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
9154#define TOPINT(ss,ix) ((ss)[ix].any_i32)
9155#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
9156#define TOPLONG(ss,ix) ((ss)[ix].any_long)
9157#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
9158#define TOPIV(ss,ix) ((ss)[ix].any_iv)
9159#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
9160#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
9161#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
9162#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
9163#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
9164#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
9165
9166/* XXXXX todo */
9167#define pv_dup_inc(p) SAVEPV(p)
9168#define pv_dup(p) SAVEPV(p)
9169#define svp_dup_inc(p,pp) any_dup(p,pp)
9170
645c22ef
DM
9171/* map any object to the new equivent - either something in the
9172 * ptr table, or something in the interpreter structure
9173 */
9174
1d7c1841
GS
9175void *
9176Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
9177{
9178 void *ret;
9179
9180 if (!v)
9181 return (void*)NULL;
9182
9183 /* look for it in the table first */
9184 ret = ptr_table_fetch(PL_ptr_table, v);
9185 if (ret)
9186 return ret;
9187
9188 /* see if it is part of the interpreter structure */
9189 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
9190 ret = (void*)(((char*)aTHXo) + (((char*)v) - (char*)proto_perl));
9191 else
9192 ret = v;
9193
9194 return ret;
9195}
9196
645c22ef
DM
9197/* duplicate the save stack */
9198
1d7c1841 9199ANY *
d2d73c3e 9200Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, clone_params* param)
1d7c1841
GS
9201{
9202 ANY *ss = proto_perl->Tsavestack;
9203 I32 ix = proto_perl->Tsavestack_ix;
9204 I32 max = proto_perl->Tsavestack_max;
9205 ANY *nss;
9206 SV *sv;
9207 GV *gv;
9208 AV *av;
9209 HV *hv;
9210 void* ptr;
9211 int intval;
9212 long longval;
9213 GP *gp;
9214 IV iv;
9215 I32 i;
9216 char *c;
9217 void (*dptr) (void*);
9218 void (*dxptr) (pTHXo_ void*);
e977893f 9219 OP *o;
1d7c1841
GS
9220
9221 Newz(54, nss, max, ANY);
9222
9223 while (ix > 0) {
9224 i = POPINT(ss,ix);
9225 TOPINT(nss,ix) = i;
9226 switch (i) {
9227 case SAVEt_ITEM: /* normal string */
9228 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9229 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9230 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9231 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9232 break;
9233 case SAVEt_SV: /* scalar reference */
9234 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9235 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9236 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9237 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 9238 break;
f4dd75d9
GS
9239 case SAVEt_GENERIC_PVREF: /* generic char* */
9240 c = (char*)POPPTR(ss,ix);
9241 TOPPTR(nss,ix) = pv_dup(c);
9242 ptr = POPPTR(ss,ix);
9243 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9244 break;
1d7c1841
GS
9245 case SAVEt_GENERIC_SVREF: /* generic sv */
9246 case SAVEt_SVREF: /* scalar reference */
9247 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9248 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9249 ptr = POPPTR(ss,ix);
9250 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
9251 break;
9252 case SAVEt_AV: /* array reference */
9253 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9254 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 9255 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9256 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9257 break;
9258 case SAVEt_HV: /* hash reference */
9259 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9260 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841 9261 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9262 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9263 break;
9264 case SAVEt_INT: /* int reference */
9265 ptr = POPPTR(ss,ix);
9266 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9267 intval = (int)POPINT(ss,ix);
9268 TOPINT(nss,ix) = intval;
9269 break;
9270 case SAVEt_LONG: /* long reference */
9271 ptr = POPPTR(ss,ix);
9272 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9273 longval = (long)POPLONG(ss,ix);
9274 TOPLONG(nss,ix) = longval;
9275 break;
9276 case SAVEt_I32: /* I32 reference */
9277 case SAVEt_I16: /* I16 reference */
9278 case SAVEt_I8: /* I8 reference */
9279 ptr = POPPTR(ss,ix);
9280 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9281 i = POPINT(ss,ix);
9282 TOPINT(nss,ix) = i;
9283 break;
9284 case SAVEt_IV: /* IV reference */
9285 ptr = POPPTR(ss,ix);
9286 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9287 iv = POPIV(ss,ix);
9288 TOPIV(nss,ix) = iv;
9289 break;
9290 case SAVEt_SPTR: /* SV* reference */
9291 ptr = POPPTR(ss,ix);
9292 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9293 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9294 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
9295 break;
9296 case SAVEt_VPTR: /* random* reference */
9297 ptr = POPPTR(ss,ix);
9298 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9299 ptr = POPPTR(ss,ix);
9300 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9301 break;
9302 case SAVEt_PPTR: /* char* reference */
9303 ptr = POPPTR(ss,ix);
9304 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9305 c = (char*)POPPTR(ss,ix);
9306 TOPPTR(nss,ix) = pv_dup(c);
9307 break;
9308 case SAVEt_HPTR: /* HV* reference */
9309 ptr = POPPTR(ss,ix);
9310 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9311 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9312 TOPPTR(nss,ix) = hv_dup(hv, param);
1d7c1841
GS
9313 break;
9314 case SAVEt_APTR: /* AV* reference */
9315 ptr = POPPTR(ss,ix);
9316 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9317 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9318 TOPPTR(nss,ix) = av_dup(av, param);
1d7c1841
GS
9319 break;
9320 case SAVEt_NSTAB:
9321 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9322 TOPPTR(nss,ix) = gv_dup(gv, param);
1d7c1841
GS
9323 break;
9324 case SAVEt_GP: /* scalar reference */
9325 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 9326 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
9327 (void)GpREFCNT_inc(gp);
9328 gv = (GV*)POPPTR(ss,ix);
d2d73c3e 9329 TOPPTR(nss,ix) = gv_dup_inc(c, param);
1d7c1841
GS
9330 c = (char*)POPPTR(ss,ix);
9331 TOPPTR(nss,ix) = pv_dup(c);
9332 iv = POPIV(ss,ix);
9333 TOPIV(nss,ix) = iv;
9334 iv = POPIV(ss,ix);
9335 TOPIV(nss,ix) = iv;
9336 break;
9337 case SAVEt_FREESV:
26d9b02f 9338 case SAVEt_MORTALIZESV:
1d7c1841 9339 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9340 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9341 break;
9342 case SAVEt_FREEOP:
9343 ptr = POPPTR(ss,ix);
9344 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
9345 /* these are assumed to be refcounted properly */
9346 switch (((OP*)ptr)->op_type) {
9347 case OP_LEAVESUB:
9348 case OP_LEAVESUBLV:
9349 case OP_LEAVEEVAL:
9350 case OP_LEAVE:
9351 case OP_SCOPE:
9352 case OP_LEAVEWRITE:
e977893f
GS
9353 TOPPTR(nss,ix) = ptr;
9354 o = (OP*)ptr;
9355 OpREFCNT_inc(o);
1d7c1841
GS
9356 break;
9357 default:
9358 TOPPTR(nss,ix) = Nullop;
9359 break;
9360 }
9361 }
9362 else
9363 TOPPTR(nss,ix) = Nullop;
9364 break;
9365 case SAVEt_FREEPV:
9366 c = (char*)POPPTR(ss,ix);
9367 TOPPTR(nss,ix) = pv_dup_inc(c);
9368 break;
9369 case SAVEt_CLEARSV:
9370 longval = POPLONG(ss,ix);
9371 TOPLONG(nss,ix) = longval;
9372 break;
9373 case SAVEt_DELETE:
9374 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9375 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
9376 c = (char*)POPPTR(ss,ix);
9377 TOPPTR(nss,ix) = pv_dup_inc(c);
9378 i = POPINT(ss,ix);
9379 TOPINT(nss,ix) = i;
9380 break;
9381 case SAVEt_DESTRUCTOR:
9382 ptr = POPPTR(ss,ix);
9383 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
9384 dptr = POPDPTR(ss,ix);
ef75a179 9385 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
9386 break;
9387 case SAVEt_DESTRUCTOR_X:
9388 ptr = POPPTR(ss,ix);
9389 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
9390 dxptr = POPDXPTR(ss,ix);
ef75a179 9391 TOPDXPTR(nss,ix) = (void (*)(pTHXo_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
9392 break;
9393 case SAVEt_REGCONTEXT:
9394 case SAVEt_ALLOC:
9395 i = POPINT(ss,ix);
9396 TOPINT(nss,ix) = i;
9397 ix -= i;
9398 break;
9399 case SAVEt_STACK_POS: /* Position on Perl stack */
9400 i = POPINT(ss,ix);
9401 TOPINT(nss,ix) = i;
9402 break;
9403 case SAVEt_AELEM: /* array element */
9404 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9405 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
9406 i = POPINT(ss,ix);
9407 TOPINT(nss,ix) = i;
9408 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9409 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841
GS
9410 break;
9411 case SAVEt_HELEM: /* hash element */
9412 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9413 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9414 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9415 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 9416 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 9417 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
9418 break;
9419 case SAVEt_OP:
9420 ptr = POPPTR(ss,ix);
9421 TOPPTR(nss,ix) = ptr;
9422 break;
9423 case SAVEt_HINTS:
9424 i = POPINT(ss,ix);
9425 TOPINT(nss,ix) = i;
9426 break;
c4410b1b
GS
9427 case SAVEt_COMPPAD:
9428 av = (AV*)POPPTR(ss,ix);
d2d73c3e 9429 TOPPTR(nss,ix) = av_dup(av, param);
c4410b1b 9430 break;
c3564e5c
GS
9431 case SAVEt_PADSV:
9432 longval = (long)POPLONG(ss,ix);
9433 TOPLONG(nss,ix) = longval;
9434 ptr = POPPTR(ss,ix);
9435 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9436 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 9437 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 9438 break;
1d7c1841
GS
9439 default:
9440 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
9441 }
9442 }
9443
9444 return nss;
9445}
9446
9447#ifdef PERL_OBJECT
9448#include "XSUB.h"
9449#endif
9450
645c22ef
DM
9451/*
9452=for apidoc perl_clone
9453
9454Create and return a new interpreter by cloning the current one.
9455
9456=cut
9457*/
9458
9459/* XXX the above needs expanding by someone who actually understands it ! */
9460
1d7c1841
GS
9461PerlInterpreter *
9462perl_clone(PerlInterpreter *proto_perl, UV flags)
9463{
9464#ifdef PERL_OBJECT
9465 CPerlObj *pPerl = (CPerlObj*)proto_perl;
9466#endif
9467
9468#ifdef PERL_IMPLICIT_SYS
c43294b8
AB
9469
9470 /* perlhost.h so we need to call into it
9471 to clone the host, CPerlHost should have a c interface, sky */
9472
9473 if (flags & CLONEf_CLONE_HOST) {
9474 return perl_clone_host(proto_perl,flags);
9475 }
9476 return perl_clone_using(proto_perl, flags,
1d7c1841
GS
9477 proto_perl->IMem,
9478 proto_perl->IMemShared,
9479 proto_perl->IMemParse,
9480 proto_perl->IEnv,
9481 proto_perl->IStdIO,
9482 proto_perl->ILIO,
9483 proto_perl->IDir,
9484 proto_perl->ISock,
9485 proto_perl->IProc);
9486}
9487
9488PerlInterpreter *
9489perl_clone_using(PerlInterpreter *proto_perl, UV flags,
9490 struct IPerlMem* ipM, struct IPerlMem* ipMS,
9491 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
9492 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
9493 struct IPerlDir* ipD, struct IPerlSock* ipS,
9494 struct IPerlProc* ipP)
9495{
9496 /* XXX many of the string copies here can be optimized if they're
9497 * constants; they need to be allocated as common memory and just
9498 * their pointers copied. */
9499
9500 IV i;
d2d73c3e 9501 clone_params* param = (clone_params*) malloc(sizeof(clone_params));
d2d73c3e
AB
9502
9503
9504
1d7c1841
GS
9505# ifdef PERL_OBJECT
9506 CPerlObj *pPerl = new(ipM) CPerlObj(ipM, ipMS, ipMP, ipE, ipStd, ipLIO,
9507 ipD, ipS, ipP);
ba869deb 9508 PERL_SET_THX(pPerl);
1d7c1841
GS
9509# else /* !PERL_OBJECT */
9510 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
ba869deb 9511 PERL_SET_THX(my_perl);
1d7c1841
GS
9512
9513# ifdef DEBUGGING
9514 memset(my_perl, 0xab, sizeof(PerlInterpreter));
9515 PL_markstack = 0;
9516 PL_scopestack = 0;
9517 PL_savestack = 0;
9518 PL_retstack = 0;
66fe0623 9519 PL_sig_pending = 0;
1d7c1841
GS
9520# else /* !DEBUGGING */
9521 Zero(my_perl, 1, PerlInterpreter);
9522# endif /* DEBUGGING */
9523
9524 /* host pointers */
9525 PL_Mem = ipM;
9526 PL_MemShared = ipMS;
9527 PL_MemParse = ipMP;
9528 PL_Env = ipE;
9529 PL_StdIO = ipStd;
9530 PL_LIO = ipLIO;
9531 PL_Dir = ipD;
9532 PL_Sock = ipS;
9533 PL_Proc = ipP;
9534# endif /* PERL_OBJECT */
9535#else /* !PERL_IMPLICIT_SYS */
9536 IV i;
d2d73c3e 9537 clone_params* param = (clone_params*) malloc(sizeof(clone_params));
1d7c1841 9538 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 9539 PERL_SET_THX(my_perl);
1d7c1841 9540
d2d73c3e
AB
9541
9542
1d7c1841
GS
9543# ifdef DEBUGGING
9544 memset(my_perl, 0xab, sizeof(PerlInterpreter));
9545 PL_markstack = 0;
9546 PL_scopestack = 0;
9547 PL_savestack = 0;
9548 PL_retstack = 0;
66fe0623 9549 PL_sig_pending = 0;
1d7c1841
GS
9550# else /* !DEBUGGING */
9551 Zero(my_perl, 1, PerlInterpreter);
9552# endif /* DEBUGGING */
9553#endif /* PERL_IMPLICIT_SYS */
83236556 9554 param->flags = flags;
1d7c1841
GS
9555
9556 /* arena roots */
9557 PL_xiv_arenaroot = NULL;
9558 PL_xiv_root = NULL;
612f20c3 9559 PL_xnv_arenaroot = NULL;
1d7c1841 9560 PL_xnv_root = NULL;
612f20c3 9561 PL_xrv_arenaroot = NULL;
1d7c1841 9562 PL_xrv_root = NULL;
612f20c3 9563 PL_xpv_arenaroot = NULL;
1d7c1841 9564 PL_xpv_root = NULL;
612f20c3 9565 PL_xpviv_arenaroot = NULL;
1d7c1841 9566 PL_xpviv_root = NULL;
612f20c3 9567 PL_xpvnv_arenaroot = NULL;
1d7c1841 9568 PL_xpvnv_root = NULL;
612f20c3 9569 PL_xpvcv_arenaroot = NULL;
1d7c1841 9570 PL_xpvcv_root = NULL;
612f20c3 9571 PL_xpvav_arenaroot = NULL;
1d7c1841 9572 PL_xpvav_root = NULL;
612f20c3 9573 PL_xpvhv_arenaroot = NULL;
1d7c1841 9574 PL_xpvhv_root = NULL;
612f20c3 9575 PL_xpvmg_arenaroot = NULL;
1d7c1841 9576 PL_xpvmg_root = NULL;
612f20c3 9577 PL_xpvlv_arenaroot = NULL;
1d7c1841 9578 PL_xpvlv_root = NULL;
612f20c3 9579 PL_xpvbm_arenaroot = NULL;
1d7c1841 9580 PL_xpvbm_root = NULL;
612f20c3 9581 PL_he_arenaroot = NULL;
1d7c1841
GS
9582 PL_he_root = NULL;
9583 PL_nice_chunk = NULL;
9584 PL_nice_chunk_size = 0;
9585 PL_sv_count = 0;
9586 PL_sv_objcount = 0;
9587 PL_sv_root = Nullsv;
9588 PL_sv_arenaroot = Nullsv;
9589
9590 PL_debug = proto_perl->Idebug;
9591
9592 /* create SV map for pointer relocation */
9593 PL_ptr_table = ptr_table_new();
9594
9595 /* initialize these special pointers as early as possible */
9596 SvANY(&PL_sv_undef) = NULL;
9597 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
9598 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
9599 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
9600
9601#ifdef PERL_OBJECT
9602 SvUPGRADE(&PL_sv_no, SVt_PVNV);
9603#else
9604 SvANY(&PL_sv_no) = new_XPVNV();
9605#endif
9606 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
9607 SvFLAGS(&PL_sv_no) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
9608 SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
9609 SvCUR(&PL_sv_no) = 0;
9610 SvLEN(&PL_sv_no) = 1;
9611 SvNVX(&PL_sv_no) = 0;
9612 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
9613
9614#ifdef PERL_OBJECT
9615 SvUPGRADE(&PL_sv_yes, SVt_PVNV);
9616#else
9617 SvANY(&PL_sv_yes) = new_XPVNV();
9618#endif
9619 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
9620 SvFLAGS(&PL_sv_yes) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
9621 SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
9622 SvCUR(&PL_sv_yes) = 1;
9623 SvLEN(&PL_sv_yes) = 2;
9624 SvNVX(&PL_sv_yes) = 1;
9625 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
9626
9627 /* create shared string table */
9628 PL_strtab = newHV();
9629 HvSHAREKEYS_off(PL_strtab);
9630 hv_ksplit(PL_strtab, 512);
9631 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
9632
9633 PL_compiling = proto_perl->Icompiling;
9634 PL_compiling.cop_stashpv = SAVEPV(PL_compiling.cop_stashpv);
9635 PL_compiling.cop_file = SAVEPV(PL_compiling.cop_file);
9636 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
9637 if (!specialWARN(PL_compiling.cop_warnings))
d2d73c3e 9638 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
ac27b0f5 9639 if (!specialCopIO(PL_compiling.cop_io))
d2d73c3e 9640 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
1d7c1841
GS
9641 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
9642
9643 /* pseudo environmental stuff */
9644 PL_origargc = proto_perl->Iorigargc;
9645 i = PL_origargc;
9646 New(0, PL_origargv, i+1, char*);
9647 PL_origargv[i] = '\0';
9648 while (i-- > 0) {
9649 PL_origargv[i] = SAVEPV(proto_perl->Iorigargv[i]);
9650 }
d2d73c3e
AB
9651
9652
9653 param->stashes = newAV(); /* Setup array of objects to call clone on */
9654
9655
9656 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
9657 PL_incgv = gv_dup(proto_perl->Iincgv, param);
9658 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
1d7c1841 9659 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
d2d73c3e
AB
9660 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
9661 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
1d7c1841
GS
9662
9663 /* switches */
9664 PL_minus_c = proto_perl->Iminus_c;
d2d73c3e 9665 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1d7c1841
GS
9666 PL_localpatches = proto_perl->Ilocalpatches;
9667 PL_splitstr = proto_perl->Isplitstr;
9668 PL_preprocess = proto_perl->Ipreprocess;
9669 PL_minus_n = proto_perl->Iminus_n;
9670 PL_minus_p = proto_perl->Iminus_p;
9671 PL_minus_l = proto_perl->Iminus_l;
9672 PL_minus_a = proto_perl->Iminus_a;
9673 PL_minus_F = proto_perl->Iminus_F;
9674 PL_doswitches = proto_perl->Idoswitches;
9675 PL_dowarn = proto_perl->Idowarn;
9676 PL_doextract = proto_perl->Idoextract;
9677 PL_sawampersand = proto_perl->Isawampersand;
9678 PL_unsafe = proto_perl->Iunsafe;
9679 PL_inplace = SAVEPV(proto_perl->Iinplace);
d2d73c3e 9680 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
1d7c1841
GS
9681 PL_perldb = proto_perl->Iperldb;
9682 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
9683
9684 /* magical thingies */
9685 /* XXX time(&PL_basetime) when asked for? */
9686 PL_basetime = proto_perl->Ibasetime;
d2d73c3e 9687 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
1d7c1841
GS
9688
9689 PL_maxsysfd = proto_perl->Imaxsysfd;
9690 PL_multiline = proto_perl->Imultiline;
9691 PL_statusvalue = proto_perl->Istatusvalue;
9692#ifdef VMS
9693 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
9694#endif
9695
9696 /* shortcuts to various I/O objects */
d2d73c3e
AB
9697 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
9698 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
9699 PL_defgv = gv_dup(proto_perl->Idefgv, param);
9700 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
9701 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
9702 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841
GS
9703
9704 /* shortcuts to regexp stuff */
d2d73c3e 9705 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
1d7c1841
GS
9706
9707 /* shortcuts to misc objects */
d2d73c3e 9708 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
1d7c1841
GS
9709
9710 /* shortcuts to debugging objects */
d2d73c3e
AB
9711 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
9712 PL_DBline = gv_dup(proto_perl->IDBline, param);
9713 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
9714 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
9715 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
9716 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
9717 PL_lineary = av_dup(proto_perl->Ilineary, param);
9718 PL_dbargs = av_dup(proto_perl->Idbargs, param);
1d7c1841
GS
9719
9720 /* symbol tables */
d2d73c3e
AB
9721 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
9722 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
9723 PL_nullstash = hv_dup(proto_perl->Inullstash, param);
9724 PL_debstash = hv_dup(proto_perl->Idebstash, param);
9725 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
9726 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
9727
9728 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
9729 PL_endav = av_dup_inc(proto_perl->Iendav, param);
9730 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
9731 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
1d7c1841
GS
9732
9733 PL_sub_generation = proto_perl->Isub_generation;
9734
9735 /* funky return mechanisms */
9736 PL_forkprocess = proto_perl->Iforkprocess;
9737
9738 /* subprocess state */
d2d73c3e 9739 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
1d7c1841
GS
9740
9741 /* internal state */
9742 PL_tainting = proto_perl->Itainting;
9743 PL_maxo = proto_perl->Imaxo;
9744 if (proto_perl->Iop_mask)
9745 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
9746 else
9747 PL_op_mask = Nullch;
9748
9749 /* current interpreter roots */
d2d73c3e 9750 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
1d7c1841
GS
9751 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
9752 PL_main_start = proto_perl->Imain_start;
e977893f 9753 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
9754 PL_eval_start = proto_perl->Ieval_start;
9755
9756 /* runtime control stuff */
9757 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
9758 PL_copline = proto_perl->Icopline;
9759
9760 PL_filemode = proto_perl->Ifilemode;
9761 PL_lastfd = proto_perl->Ilastfd;
9762 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
9763 PL_Argv = NULL;
9764 PL_Cmd = Nullch;
9765 PL_gensym = proto_perl->Igensym;
9766 PL_preambled = proto_perl->Ipreambled;
d2d73c3e 9767 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
1d7c1841
GS
9768 PL_laststatval = proto_perl->Ilaststatval;
9769 PL_laststype = proto_perl->Ilaststype;
9770 PL_mess_sv = Nullsv;
9771
d2d73c3e 9772 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
1d7c1841
GS
9773 PL_ofmt = SAVEPV(proto_perl->Iofmt);
9774
9775 /* interpreter atexit processing */
9776 PL_exitlistlen = proto_perl->Iexitlistlen;
9777 if (PL_exitlistlen) {
9778 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
9779 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
9780 }
9781 else
9782 PL_exitlist = (PerlExitListEntry*)NULL;
d2d73c3e 9783 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
1d7c1841
GS
9784
9785 PL_profiledata = NULL;
9786 PL_rsfp = fp_dup(proto_perl->Irsfp, '<');
9787 /* PL_rsfp_filters entries have fake IoDIRP() */
d2d73c3e 9788 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
1d7c1841 9789
d2d73c3e
AB
9790 PL_compcv = cv_dup(proto_perl->Icompcv, param);
9791 PL_comppad = av_dup(proto_perl->Icomppad, param);
9792 PL_comppad_name = av_dup(proto_perl->Icomppad_name, param);
1d7c1841
GS
9793 PL_comppad_name_fill = proto_perl->Icomppad_name_fill;
9794 PL_comppad_name_floor = proto_perl->Icomppad_name_floor;
9795 PL_curpad = (SV**)ptr_table_fetch(PL_ptr_table,
9796 proto_perl->Tcurpad);
9797
9798#ifdef HAVE_INTERP_INTERN
9799 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
9800#endif
9801
9802 /* more statics moved here */
9803 PL_generation = proto_perl->Igeneration;
d2d73c3e 9804 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
1d7c1841
GS
9805
9806 PL_in_clean_objs = proto_perl->Iin_clean_objs;
9807 PL_in_clean_all = proto_perl->Iin_clean_all;
9808
9809 PL_uid = proto_perl->Iuid;
9810 PL_euid = proto_perl->Ieuid;
9811 PL_gid = proto_perl->Igid;
9812 PL_egid = proto_perl->Iegid;
9813 PL_nomemok = proto_perl->Inomemok;
9814 PL_an = proto_perl->Ian;
9815 PL_cop_seqmax = proto_perl->Icop_seqmax;
9816 PL_op_seqmax = proto_perl->Iop_seqmax;
9817 PL_evalseq = proto_perl->Ievalseq;
9818 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
9819 PL_origalen = proto_perl->Iorigalen;
9820 PL_pidstatus = newHV(); /* XXX flag for cloning? */
9821 PL_osname = SAVEPV(proto_perl->Iosname);
9822 PL_sh_path = SAVEPV(proto_perl->Ish_path);
9823 PL_sighandlerp = proto_perl->Isighandlerp;
9824
9825
9826 PL_runops = proto_perl->Irunops;
9827
9828 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
9829
9830#ifdef CSH
9831 PL_cshlen = proto_perl->Icshlen;
9832 PL_cshname = SAVEPVN(proto_perl->Icshname, PL_cshlen);
9833#endif
9834
9835 PL_lex_state = proto_perl->Ilex_state;
9836 PL_lex_defer = proto_perl->Ilex_defer;
9837 PL_lex_expect = proto_perl->Ilex_expect;
9838 PL_lex_formbrack = proto_perl->Ilex_formbrack;
9839 PL_lex_dojoin = proto_perl->Ilex_dojoin;
9840 PL_lex_starts = proto_perl->Ilex_starts;
d2d73c3e
AB
9841 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff, param);
9842 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl, param);
1d7c1841
GS
9843 PL_lex_op = proto_perl->Ilex_op;
9844 PL_lex_inpat = proto_perl->Ilex_inpat;
9845 PL_lex_inwhat = proto_perl->Ilex_inwhat;
9846 PL_lex_brackets = proto_perl->Ilex_brackets;
9847 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
9848 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
9849 PL_lex_casemods = proto_perl->Ilex_casemods;
9850 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
9851 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
9852
9853 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
9854 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
9855 PL_nexttoke = proto_perl->Inexttoke;
9856
d2d73c3e 9857 PL_linestr = sv_dup_inc(proto_perl->Ilinestr, param);
1d7c1841
GS
9858 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
9859 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
9860 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
9861 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
9862 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
9863 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
9864 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
9865 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
9866 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
9867 PL_pending_ident = proto_perl->Ipending_ident;
9868 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
9869
9870 PL_expect = proto_perl->Iexpect;
9871
9872 PL_multi_start = proto_perl->Imulti_start;
9873 PL_multi_end = proto_perl->Imulti_end;
9874 PL_multi_open = proto_perl->Imulti_open;
9875 PL_multi_close = proto_perl->Imulti_close;
9876
9877 PL_error_count = proto_perl->Ierror_count;
9878 PL_subline = proto_perl->Isubline;
d2d73c3e 9879 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
1d7c1841
GS
9880
9881 PL_min_intro_pending = proto_perl->Imin_intro_pending;
9882 PL_max_intro_pending = proto_perl->Imax_intro_pending;
9883 PL_padix = proto_perl->Ipadix;
9884 PL_padix_floor = proto_perl->Ipadix_floor;
9885 PL_pad_reset_pending = proto_perl->Ipad_reset_pending;
9886
9887 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
9888 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
9889 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
9890 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
9891 PL_last_lop_op = proto_perl->Ilast_lop_op;
9892 PL_in_my = proto_perl->Iin_my;
d2d73c3e 9893 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
1d7c1841
GS
9894#ifdef FCRYPT
9895 PL_cryptseen = proto_perl->Icryptseen;
9896#endif
9897
9898 PL_hints = proto_perl->Ihints;
9899
9900 PL_amagic_generation = proto_perl->Iamagic_generation;
9901
9902#ifdef USE_LOCALE_COLLATE
9903 PL_collation_ix = proto_perl->Icollation_ix;
9904 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
9905 PL_collation_standard = proto_perl->Icollation_standard;
9906 PL_collxfrm_base = proto_perl->Icollxfrm_base;
9907 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
9908#endif /* USE_LOCALE_COLLATE */
9909
9910#ifdef USE_LOCALE_NUMERIC
9911 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
9912 PL_numeric_standard = proto_perl->Inumeric_standard;
9913 PL_numeric_local = proto_perl->Inumeric_local;
d2d73c3e 9914 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
1d7c1841
GS
9915#endif /* !USE_LOCALE_NUMERIC */
9916
9917 /* utf8 character classes */
d2d73c3e
AB
9918 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
9919 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
9920 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
9921 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
9922 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
9923 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
9924 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
9925 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
9926 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
9927 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
9928 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
9929 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
9930 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
9931 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
9932 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
9933 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
9934 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
1d7c1841
GS
9935
9936 /* swatch cache */
9937 PL_last_swash_hv = Nullhv; /* reinits on demand */
9938 PL_last_swash_klen = 0;
9939 PL_last_swash_key[0]= '\0';
9940 PL_last_swash_tmps = (U8*)NULL;
9941 PL_last_swash_slen = 0;
9942
9943 /* perly.c globals */
9944 PL_yydebug = proto_perl->Iyydebug;
9945 PL_yynerrs = proto_perl->Iyynerrs;
9946 PL_yyerrflag = proto_perl->Iyyerrflag;
9947 PL_yychar = proto_perl->Iyychar;
9948 PL_yyval = proto_perl->Iyyval;
9949 PL_yylval = proto_perl->Iyylval;
9950
9951 PL_glob_index = proto_perl->Iglob_index;
9952 PL_srand_called = proto_perl->Isrand_called;
9953 PL_uudmap['M'] = 0; /* reinits on demand */
9954 PL_bitcount = Nullch; /* reinits on demand */
9955
66fe0623
NIS
9956 if (proto_perl->Ipsig_pend) {
9957 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 9958 }
66fe0623
NIS
9959 else {
9960 PL_psig_pend = (int*)NULL;
9961 }
9962
1d7c1841 9963 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
9964 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
9965 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696 9966 for (i = 1; i < SIG_SIZE; i++) {
d2d73c3e
AB
9967 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
9968 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
1d7c1841
GS
9969 }
9970 }
9971 else {
9972 PL_psig_ptr = (SV**)NULL;
9973 PL_psig_name = (SV**)NULL;
9974 }
9975
9976 /* thrdvar.h stuff */
9977
a0739874 9978 if (flags & CLONEf_COPY_STACKS) {
1d7c1841
GS
9979 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
9980 PL_tmps_ix = proto_perl->Ttmps_ix;
9981 PL_tmps_max = proto_perl->Ttmps_max;
9982 PL_tmps_floor = proto_perl->Ttmps_floor;
9983 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
9984 i = 0;
9985 while (i <= PL_tmps_ix) {
d2d73c3e 9986 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
1d7c1841
GS
9987 ++i;
9988 }
9989
9990 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
9991 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
9992 Newz(54, PL_markstack, i, I32);
9993 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
9994 - proto_perl->Tmarkstack);
9995 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
9996 - proto_perl->Tmarkstack);
9997 Copy(proto_perl->Tmarkstack, PL_markstack,
9998 PL_markstack_ptr - PL_markstack + 1, I32);
9999
10000 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
10001 * NOTE: unlike the others! */
10002 PL_scopestack_ix = proto_perl->Tscopestack_ix;
10003 PL_scopestack_max = proto_perl->Tscopestack_max;
10004 Newz(54, PL_scopestack, PL_scopestack_max, I32);
10005 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
10006
10007 /* next push_return() sets PL_retstack[PL_retstack_ix]
10008 * NOTE: unlike the others! */
10009 PL_retstack_ix = proto_perl->Tretstack_ix;
10010 PL_retstack_max = proto_perl->Tretstack_max;
10011 Newz(54, PL_retstack, PL_retstack_max, OP*);
10012 Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, I32);
10013
10014 /* NOTE: si_dup() looks at PL_markstack */
d2d73c3e 10015 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
1d7c1841
GS
10016
10017 /* PL_curstack = PL_curstackinfo->si_stack; */
d2d73c3e
AB
10018 PL_curstack = av_dup(proto_perl->Tcurstack, param);
10019 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841
GS
10020
10021 /* next PUSHs() etc. set *(PL_stack_sp+1) */
10022 PL_stack_base = AvARRAY(PL_curstack);
10023 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
10024 - proto_perl->Tstack_base);
10025 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
10026
10027 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
10028 * NOTE: unlike the others! */
10029 PL_savestack_ix = proto_perl->Tsavestack_ix;
10030 PL_savestack_max = proto_perl->Tsavestack_max;
10031 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
d2d73c3e 10032 PL_savestack = ss_dup(proto_perl, param);
1d7c1841
GS
10033 }
10034 else {
10035 init_stacks();
985e7056 10036 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
10037 }
10038
10039 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
10040 PL_top_env = &PL_start_env;
10041
10042 PL_op = proto_perl->Top;
10043
10044 PL_Sv = Nullsv;
10045 PL_Xpv = (XPV*)NULL;
10046 PL_na = proto_perl->Tna;
10047
10048 PL_statbuf = proto_perl->Tstatbuf;
10049 PL_statcache = proto_perl->Tstatcache;
d2d73c3e
AB
10050 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
10051 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
1d7c1841
GS
10052#ifdef HAS_TIMES
10053 PL_timesbuf = proto_perl->Ttimesbuf;
10054#endif
10055
10056 PL_tainted = proto_perl->Ttainted;
10057 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
d2d73c3e
AB
10058 PL_nrs = sv_dup_inc(proto_perl->Tnrs, param);
10059 PL_rs = sv_dup_inc(proto_perl->Trs, param);
10060 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
10061 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
10062 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
1d7c1841 10063 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
d2d73c3e
AB
10064 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
10065 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
10066 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841
GS
10067
10068 PL_restartop = proto_perl->Trestartop;
10069 PL_in_eval = proto_perl->Tin_eval;
10070 PL_delaymagic = proto_perl->Tdelaymagic;
10071 PL_dirty = proto_perl->Tdirty;
10072 PL_localizing = proto_perl->Tlocalizing;
10073
14dd3ad8 10074#ifdef PERL_FLEXIBLE_EXCEPTIONS
1d7c1841 10075 PL_protect = proto_perl->Tprotect;
14dd3ad8 10076#endif
d2d73c3e 10077 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
1d7c1841
GS
10078 PL_av_fetch_sv = Nullsv;
10079 PL_hv_fetch_sv = Nullsv;
10080 Zero(&PL_hv_fetch_ent_mh, 1, HE); /* XXX */
10081 PL_modcount = proto_perl->Tmodcount;
10082 PL_lastgotoprobe = Nullop;
10083 PL_dumpindent = proto_perl->Tdumpindent;
10084
10085 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
d2d73c3e
AB
10086 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
10087 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
10088 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
1d7c1841
GS
10089 PL_sortcxix = proto_perl->Tsortcxix;
10090 PL_efloatbuf = Nullch; /* reinits on demand */
10091 PL_efloatsize = 0; /* reinits on demand */
10092
10093 /* regex stuff */
10094
10095 PL_screamfirst = NULL;
10096 PL_screamnext = NULL;
10097 PL_maxscream = -1; /* reinits on demand */
10098 PL_lastscream = Nullsv;
10099
10100 PL_watchaddr = NULL;
10101 PL_watchok = Nullch;
10102
10103 PL_regdummy = proto_perl->Tregdummy;
10104 PL_regcomp_parse = Nullch;
10105 PL_regxend = Nullch;
10106 PL_regcode = (regnode*)NULL;
10107 PL_regnaughty = 0;
10108 PL_regsawback = 0;
10109 PL_regprecomp = Nullch;
10110 PL_regnpar = 0;
10111 PL_regsize = 0;
10112 PL_regflags = 0;
10113 PL_regseen = 0;
10114 PL_seen_zerolen = 0;
10115 PL_seen_evals = 0;
10116 PL_regcomp_rx = (regexp*)NULL;
10117 PL_extralen = 0;
10118 PL_colorset = 0; /* reinits PL_colors[] */
10119 /*PL_colors[6] = {0,0,0,0,0,0};*/
10120 PL_reg_whilem_seen = 0;
10121 PL_reginput = Nullch;
10122 PL_regbol = Nullch;
10123 PL_regeol = Nullch;
10124 PL_regstartp = (I32*)NULL;
10125 PL_regendp = (I32*)NULL;
10126 PL_reglastparen = (U32*)NULL;
10127 PL_regtill = Nullch;
1d7c1841
GS
10128 PL_reg_start_tmp = (char**)NULL;
10129 PL_reg_start_tmpl = 0;
10130 PL_regdata = (struct reg_data*)NULL;
10131 PL_bostr = Nullch;
10132 PL_reg_flags = 0;
10133 PL_reg_eval_set = 0;
10134 PL_regnarrate = 0;
10135 PL_regprogram = (regnode*)NULL;
10136 PL_regindent = 0;
10137 PL_regcc = (CURCUR*)NULL;
10138 PL_reg_call_cc = (struct re_cc_state*)NULL;
10139 PL_reg_re = (regexp*)NULL;
10140 PL_reg_ganch = Nullch;
10141 PL_reg_sv = Nullsv;
10142 PL_reg_magic = (MAGIC*)NULL;
10143 PL_reg_oldpos = 0;
10144 PL_reg_oldcurpm = (PMOP*)NULL;
10145 PL_reg_curpm = (PMOP*)NULL;
10146 PL_reg_oldsaved = Nullch;
10147 PL_reg_oldsavedlen = 0;
10148 PL_reg_maxiter = 0;
10149 PL_reg_leftiter = 0;
10150 PL_reg_poscache = Nullch;
10151 PL_reg_poscache_size= 0;
10152
10153 /* RE engine - function pointers */
10154 PL_regcompp = proto_perl->Tregcompp;
10155 PL_regexecp = proto_perl->Tregexecp;
10156 PL_regint_start = proto_perl->Tregint_start;
10157 PL_regint_string = proto_perl->Tregint_string;
10158 PL_regfree = proto_perl->Tregfree;
10159
10160 PL_reginterp_cnt = 0;
10161 PL_reg_starttry = 0;
10162
a0739874
DM
10163 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
10164 ptr_table_free(PL_ptr_table);
10165 PL_ptr_table = NULL;
10166 }
4a09accc 10167
f284b03f
AMS
10168 /* Call the ->CLONE method, if it exists, for each of the stashes
10169 identified by sv_dup() above.
10170 */
d2d73c3e
AB
10171 while(av_len(param->stashes) != -1) {
10172 HV* stash = (HV*) av_shift(param->stashes);
f284b03f
AMS
10173 GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
10174 if (cloner && GvCV(cloner)) {
10175 dSP;
10176 ENTER;
10177 SAVETMPS;
10178 PUSHMARK(SP);
10179 XPUSHs(newSVpv(HvNAME(stash), 0));
10180 PUTBACK;
10181 call_sv((SV*)GvCV(cloner), G_DISCARD);
10182 FREETMPS;
10183 LEAVE;
10184 }
4a09accc 10185 }
a0739874 10186
1d7c1841
GS
10187#ifdef PERL_OBJECT
10188 return (PerlInterpreter*)pPerl;
10189#else
10190 return my_perl;
10191#endif
10192}
10193
10194#else /* !USE_ITHREADS */
51371543
GS
10195
10196#ifdef PERL_OBJECT
51371543
GS
10197#include "XSUB.h"
10198#endif
10199
1d7c1841 10200#endif /* USE_ITHREADS */