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