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