This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
notes about running Purify
[perl5.git] / sv.c
CommitLineData
a0d0e21e 1/* sv.c
79072805 2 *
3818b22b 3 * Copyright (c) 1991-2000, 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; \
66 if (PL_debug & 32768) \
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{
3280af22 76 if (PL_debug & 32768) {
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;
4633a7c4
LW
110 Zero(sva, size, char);
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;
c07a80fd 140 }
1edc1566 141 else {
142 char *chunk; /* must use New here to match call to */
143 New(704,chunk,1008,char); /* Safefree() in sv_free_arenas() */
144 sv_add_arena(chunk, 1008, 0);
145 }
4561caa4
CS
146 uproot_SV(sv);
147 return sv;
463ee0b2
LW
148}
149
76e3520e 150STATIC void
cea2e8a9 151S_visit(pTHX_ SVFUNC_t f)
8990e307 152{
4633a7c4 153 SV* sva;
8990e307
LW
154 SV* sv;
155 register SV* svend;
156
3280af22 157 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
4633a7c4 158 svend = &sva[SvREFCNT(sva)];
4561caa4
CS
159 for (sv = sva + 1; sv < svend; ++sv) {
160 if (SvTYPE(sv) != SVTYPEMASK)
51371543 161 (FCALL)(aTHXo_ sv);
8990e307
LW
162 }
163 }
164}
165
166void
864dbfa3 167Perl_sv_report_used(pTHX)
4561caa4 168{
0b94c7bb 169 visit(do_report_used);
4561caa4
CS
170}
171
4561caa4 172void
864dbfa3 173Perl_sv_clean_objs(pTHX)
4561caa4 174{
3280af22 175 PL_in_clean_objs = TRUE;
0b94c7bb 176 visit(do_clean_objs);
4561caa4 177#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 178 /* some barnacles may yet remain, clinging to typeglobs */
0b94c7bb 179 visit(do_clean_named_objs);
4561caa4 180#endif
3280af22 181 PL_in_clean_objs = FALSE;
4561caa4
CS
182}
183
8990e307 184void
864dbfa3 185Perl_sv_clean_all(pTHX)
8990e307 186{
3280af22 187 PL_in_clean_all = TRUE;
0b94c7bb 188 visit(do_clean_all);
3280af22 189 PL_in_clean_all = FALSE;
8990e307 190}
463ee0b2 191
4633a7c4 192void
864dbfa3 193Perl_sv_free_arenas(pTHX)
4633a7c4
LW
194{
195 SV* sva;
196 SV* svanext;
197
198 /* Free arenas here, but be careful about fake ones. (We assume
199 contiguity of the fake ones with the corresponding real ones.) */
200
3280af22 201 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
202 svanext = (SV*) SvANY(sva);
203 while (svanext && SvFAKE(svanext))
204 svanext = (SV*) SvANY(svanext);
205
206 if (!SvFAKE(sva))
1edc1566 207 Safefree((void *)sva);
4633a7c4 208 }
5f05dabc 209
3280af22
NIS
210 if (PL_nice_chunk)
211 Safefree(PL_nice_chunk);
212 PL_nice_chunk = Nullch;
213 PL_nice_chunk_size = 0;
214 PL_sv_arenaroot = 0;
215 PL_sv_root = 0;
4633a7c4
LW
216}
217
1d7c1841
GS
218void
219Perl_report_uninit(pTHX)
220{
221 if (PL_op)
222 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit,
223 " in ", PL_op_desc[PL_op->op_type]);
224 else
225 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit, "", "");
226}
227
76e3520e 228STATIC XPVIV*
cea2e8a9 229S_new_xiv(pTHX)
463ee0b2 230{
ea7c11a3 231 IV* xiv;
cbe51380
GS
232 LOCK_SV_MUTEX;
233 if (!PL_xiv_root)
234 more_xiv();
235 xiv = PL_xiv_root;
236 /*
237 * See comment in more_xiv() -- RAM.
238 */
239 PL_xiv_root = *(IV**)xiv;
240 UNLOCK_SV_MUTEX;
241 return (XPVIV*)((char*)xiv - STRUCT_OFFSET(XPVIV, xiv_iv));
463ee0b2
LW
242}
243
76e3520e 244STATIC void
cea2e8a9 245S_del_xiv(pTHX_ XPVIV *p)
463ee0b2 246{
23e6a22f 247 IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
cbe51380 248 LOCK_SV_MUTEX;
3280af22
NIS
249 *(IV**)xiv = PL_xiv_root;
250 PL_xiv_root = xiv;
cbe51380 251 UNLOCK_SV_MUTEX;
463ee0b2
LW
252}
253
cbe51380 254STATIC void
cea2e8a9 255S_more_xiv(pTHX)
463ee0b2 256{
ea7c11a3
SM
257 register IV* xiv;
258 register IV* xivend;
8c52afec
IZ
259 XPV* ptr;
260 New(705, ptr, 1008/sizeof(XPV), XPV);
3280af22
NIS
261 ptr->xpv_pv = (char*)PL_xiv_arenaroot; /* linked list of xiv arenas */
262 PL_xiv_arenaroot = ptr; /* to keep Purify happy */
a0d0e21e 263
ea7c11a3
SM
264 xiv = (IV*) ptr;
265 xivend = &xiv[1008 / sizeof(IV) - 1];
266 xiv += (sizeof(XPV) - 1) / sizeof(IV) + 1; /* fudge by size of XPV */
3280af22 267 PL_xiv_root = xiv;
463ee0b2 268 while (xiv < xivend) {
ea7c11a3 269 *(IV**)xiv = (IV *)(xiv + 1);
463ee0b2
LW
270 xiv++;
271 }
ea7c11a3 272 *(IV**)xiv = 0;
463ee0b2
LW
273}
274
76e3520e 275STATIC XPVNV*
cea2e8a9 276S_new_xnv(pTHX)
463ee0b2 277{
65202027 278 NV* xnv;
cbe51380
GS
279 LOCK_SV_MUTEX;
280 if (!PL_xnv_root)
281 more_xnv();
282 xnv = PL_xnv_root;
65202027 283 PL_xnv_root = *(NV**)xnv;
cbe51380
GS
284 UNLOCK_SV_MUTEX;
285 return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
463ee0b2
LW
286}
287
76e3520e 288STATIC void
cea2e8a9 289S_del_xnv(pTHX_ XPVNV *p)
463ee0b2 290{
65202027 291 NV* xnv = (NV*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
cbe51380 292 LOCK_SV_MUTEX;
65202027 293 *(NV**)xnv = PL_xnv_root;
3280af22 294 PL_xnv_root = xnv;
cbe51380 295 UNLOCK_SV_MUTEX;
463ee0b2
LW
296}
297
cbe51380 298STATIC void
cea2e8a9 299S_more_xnv(pTHX)
463ee0b2 300{
65202027
DS
301 register NV* xnv;
302 register NV* xnvend;
303 New(711, xnv, 1008/sizeof(NV), NV);
304 xnvend = &xnv[1008 / sizeof(NV) - 1];
305 xnv += (sizeof(XPVIV) - 1) / sizeof(NV) + 1; /* fudge by sizeof XPVIV */
3280af22 306 PL_xnv_root = xnv;
463ee0b2 307 while (xnv < xnvend) {
65202027 308 *(NV**)xnv = (NV*)(xnv + 1);
463ee0b2
LW
309 xnv++;
310 }
65202027 311 *(NV**)xnv = 0;
463ee0b2
LW
312}
313
76e3520e 314STATIC XRV*
cea2e8a9 315S_new_xrv(pTHX)
ed6116ce
LW
316{
317 XRV* xrv;
cbe51380
GS
318 LOCK_SV_MUTEX;
319 if (!PL_xrv_root)
320 more_xrv();
321 xrv = PL_xrv_root;
322 PL_xrv_root = (XRV*)xrv->xrv_rv;
323 UNLOCK_SV_MUTEX;
324 return xrv;
ed6116ce
LW
325}
326
76e3520e 327STATIC void
cea2e8a9 328S_del_xrv(pTHX_ XRV *p)
ed6116ce 329{
cbe51380 330 LOCK_SV_MUTEX;
3280af22
NIS
331 p->xrv_rv = (SV*)PL_xrv_root;
332 PL_xrv_root = p;
cbe51380 333 UNLOCK_SV_MUTEX;
ed6116ce
LW
334}
335
cbe51380 336STATIC void
cea2e8a9 337S_more_xrv(pTHX)
ed6116ce 338{
ed6116ce
LW
339 register XRV* xrv;
340 register XRV* xrvend;
3280af22
NIS
341 New(712, PL_xrv_root, 1008/sizeof(XRV), XRV);
342 xrv = PL_xrv_root;
ed6116ce
LW
343 xrvend = &xrv[1008 / sizeof(XRV) - 1];
344 while (xrv < xrvend) {
345 xrv->xrv_rv = (SV*)(xrv + 1);
346 xrv++;
347 }
348 xrv->xrv_rv = 0;
ed6116ce
LW
349}
350
76e3520e 351STATIC XPV*
cea2e8a9 352S_new_xpv(pTHX)
463ee0b2
LW
353{
354 XPV* xpv;
cbe51380
GS
355 LOCK_SV_MUTEX;
356 if (!PL_xpv_root)
357 more_xpv();
358 xpv = PL_xpv_root;
359 PL_xpv_root = (XPV*)xpv->xpv_pv;
360 UNLOCK_SV_MUTEX;
361 return xpv;
463ee0b2
LW
362}
363
76e3520e 364STATIC void
cea2e8a9 365S_del_xpv(pTHX_ XPV *p)
463ee0b2 366{
cbe51380 367 LOCK_SV_MUTEX;
3280af22
NIS
368 p->xpv_pv = (char*)PL_xpv_root;
369 PL_xpv_root = p;
cbe51380 370 UNLOCK_SV_MUTEX;
463ee0b2
LW
371}
372
cbe51380 373STATIC void
cea2e8a9 374S_more_xpv(pTHX)
463ee0b2 375{
463ee0b2
LW
376 register XPV* xpv;
377 register XPV* xpvend;
3280af22
NIS
378 New(713, PL_xpv_root, 1008/sizeof(XPV), XPV);
379 xpv = PL_xpv_root;
463ee0b2
LW
380 xpvend = &xpv[1008 / sizeof(XPV) - 1];
381 while (xpv < xpvend) {
382 xpv->xpv_pv = (char*)(xpv + 1);
383 xpv++;
384 }
385 xpv->xpv_pv = 0;
463ee0b2
LW
386}
387
932e9ff9
VB
388STATIC XPVIV*
389S_new_xpviv(pTHX)
390{
391 XPVIV* xpviv;
392 LOCK_SV_MUTEX;
393 if (!PL_xpviv_root)
394 more_xpviv();
395 xpviv = PL_xpviv_root;
396 PL_xpviv_root = (XPVIV*)xpviv->xpv_pv;
397 UNLOCK_SV_MUTEX;
398 return xpviv;
399}
400
401STATIC void
402S_del_xpviv(pTHX_ XPVIV *p)
403{
404 LOCK_SV_MUTEX;
405 p->xpv_pv = (char*)PL_xpviv_root;
406 PL_xpviv_root = p;
407 UNLOCK_SV_MUTEX;
408}
409
410
411STATIC void
412S_more_xpviv(pTHX)
413{
414 register XPVIV* xpviv;
415 register XPVIV* xpvivend;
416 New(714, PL_xpviv_root, 1008/sizeof(XPVIV), XPVIV);
417 xpviv = PL_xpviv_root;
418 xpvivend = &xpviv[1008 / sizeof(XPVIV) - 1];
419 while (xpviv < xpvivend) {
420 xpviv->xpv_pv = (char*)(xpviv + 1);
421 xpviv++;
422 }
423 xpviv->xpv_pv = 0;
424}
425
426
427STATIC XPVNV*
428S_new_xpvnv(pTHX)
429{
430 XPVNV* xpvnv;
431 LOCK_SV_MUTEX;
432 if (!PL_xpvnv_root)
433 more_xpvnv();
434 xpvnv = PL_xpvnv_root;
435 PL_xpvnv_root = (XPVNV*)xpvnv->xpv_pv;
436 UNLOCK_SV_MUTEX;
437 return xpvnv;
438}
439
440STATIC void
441S_del_xpvnv(pTHX_ XPVNV *p)
442{
443 LOCK_SV_MUTEX;
444 p->xpv_pv = (char*)PL_xpvnv_root;
445 PL_xpvnv_root = p;
446 UNLOCK_SV_MUTEX;
447}
448
449
450STATIC void
451S_more_xpvnv(pTHX)
452{
453 register XPVNV* xpvnv;
454 register XPVNV* xpvnvend;
455 New(715, PL_xpvnv_root, 1008/sizeof(XPVNV), XPVNV);
456 xpvnv = PL_xpvnv_root;
457 xpvnvend = &xpvnv[1008 / sizeof(XPVNV) - 1];
458 while (xpvnv < xpvnvend) {
459 xpvnv->xpv_pv = (char*)(xpvnv + 1);
460 xpvnv++;
461 }
462 xpvnv->xpv_pv = 0;
463}
464
465
466
467STATIC XPVCV*
468S_new_xpvcv(pTHX)
469{
470 XPVCV* xpvcv;
471 LOCK_SV_MUTEX;
472 if (!PL_xpvcv_root)
473 more_xpvcv();
474 xpvcv = PL_xpvcv_root;
475 PL_xpvcv_root = (XPVCV*)xpvcv->xpv_pv;
476 UNLOCK_SV_MUTEX;
477 return xpvcv;
478}
479
480STATIC void
481S_del_xpvcv(pTHX_ XPVCV *p)
482{
483 LOCK_SV_MUTEX;
484 p->xpv_pv = (char*)PL_xpvcv_root;
485 PL_xpvcv_root = p;
486 UNLOCK_SV_MUTEX;
487}
488
489
490STATIC void
491S_more_xpvcv(pTHX)
492{
493 register XPVCV* xpvcv;
494 register XPVCV* xpvcvend;
495 New(716, PL_xpvcv_root, 1008/sizeof(XPVCV), XPVCV);
496 xpvcv = PL_xpvcv_root;
497 xpvcvend = &xpvcv[1008 / sizeof(XPVCV) - 1];
498 while (xpvcv < xpvcvend) {
499 xpvcv->xpv_pv = (char*)(xpvcv + 1);
500 xpvcv++;
501 }
502 xpvcv->xpv_pv = 0;
503}
504
505
506
507STATIC XPVAV*
508S_new_xpvav(pTHX)
509{
510 XPVAV* xpvav;
511 LOCK_SV_MUTEX;
512 if (!PL_xpvav_root)
513 more_xpvav();
514 xpvav = PL_xpvav_root;
515 PL_xpvav_root = (XPVAV*)xpvav->xav_array;
516 UNLOCK_SV_MUTEX;
517 return xpvav;
518}
519
520STATIC void
521S_del_xpvav(pTHX_ XPVAV *p)
522{
523 LOCK_SV_MUTEX;
524 p->xav_array = (char*)PL_xpvav_root;
525 PL_xpvav_root = p;
526 UNLOCK_SV_MUTEX;
527}
528
529
530STATIC void
531S_more_xpvav(pTHX)
532{
533 register XPVAV* xpvav;
534 register XPVAV* xpvavend;
535 New(717, PL_xpvav_root, 1008/sizeof(XPVAV), XPVAV);
536 xpvav = PL_xpvav_root;
537 xpvavend = &xpvav[1008 / sizeof(XPVAV) - 1];
538 while (xpvav < xpvavend) {
539 xpvav->xav_array = (char*)(xpvav + 1);
540 xpvav++;
541 }
542 xpvav->xav_array = 0;
543}
544
545
546
547STATIC XPVHV*
548S_new_xpvhv(pTHX)
549{
550 XPVHV* xpvhv;
551 LOCK_SV_MUTEX;
552 if (!PL_xpvhv_root)
553 more_xpvhv();
554 xpvhv = PL_xpvhv_root;
555 PL_xpvhv_root = (XPVHV*)xpvhv->xhv_array;
556 UNLOCK_SV_MUTEX;
557 return xpvhv;
558}
559
560STATIC void
561S_del_xpvhv(pTHX_ XPVHV *p)
562{
563 LOCK_SV_MUTEX;
564 p->xhv_array = (char*)PL_xpvhv_root;
565 PL_xpvhv_root = p;
566 UNLOCK_SV_MUTEX;
567}
568
569
570STATIC void
571S_more_xpvhv(pTHX)
572{
573 register XPVHV* xpvhv;
574 register XPVHV* xpvhvend;
575 New(718, PL_xpvhv_root, 1008/sizeof(XPVHV), XPVHV);
576 xpvhv = PL_xpvhv_root;
577 xpvhvend = &xpvhv[1008 / sizeof(XPVHV) - 1];
578 while (xpvhv < xpvhvend) {
579 xpvhv->xhv_array = (char*)(xpvhv + 1);
580 xpvhv++;
581 }
582 xpvhv->xhv_array = 0;
583}
584
585
586STATIC XPVMG*
587S_new_xpvmg(pTHX)
588{
589 XPVMG* xpvmg;
590 LOCK_SV_MUTEX;
591 if (!PL_xpvmg_root)
592 more_xpvmg();
593 xpvmg = PL_xpvmg_root;
594 PL_xpvmg_root = (XPVMG*)xpvmg->xpv_pv;
595 UNLOCK_SV_MUTEX;
596 return xpvmg;
597}
598
599STATIC void
600S_del_xpvmg(pTHX_ XPVMG *p)
601{
602 LOCK_SV_MUTEX;
603 p->xpv_pv = (char*)PL_xpvmg_root;
604 PL_xpvmg_root = p;
605 UNLOCK_SV_MUTEX;
606}
607
608
609STATIC void
610S_more_xpvmg(pTHX)
611{
612 register XPVMG* xpvmg;
613 register XPVMG* xpvmgend;
614 New(719, PL_xpvmg_root, 1008/sizeof(XPVMG), XPVMG);
615 xpvmg = PL_xpvmg_root;
616 xpvmgend = &xpvmg[1008 / sizeof(XPVMG) - 1];
617 while (xpvmg < xpvmgend) {
618 xpvmg->xpv_pv = (char*)(xpvmg + 1);
619 xpvmg++;
620 }
621 xpvmg->xpv_pv = 0;
622}
623
624
625
626STATIC XPVLV*
627S_new_xpvlv(pTHX)
628{
629 XPVLV* xpvlv;
630 LOCK_SV_MUTEX;
631 if (!PL_xpvlv_root)
632 more_xpvlv();
633 xpvlv = PL_xpvlv_root;
634 PL_xpvlv_root = (XPVLV*)xpvlv->xpv_pv;
635 UNLOCK_SV_MUTEX;
636 return xpvlv;
637}
638
639STATIC void
640S_del_xpvlv(pTHX_ XPVLV *p)
641{
642 LOCK_SV_MUTEX;
643 p->xpv_pv = (char*)PL_xpvlv_root;
644 PL_xpvlv_root = p;
645 UNLOCK_SV_MUTEX;
646}
647
648
649STATIC void
650S_more_xpvlv(pTHX)
651{
652 register XPVLV* xpvlv;
653 register XPVLV* xpvlvend;
654 New(720, PL_xpvlv_root, 1008/sizeof(XPVLV), XPVLV);
655 xpvlv = PL_xpvlv_root;
656 xpvlvend = &xpvlv[1008 / sizeof(XPVLV) - 1];
657 while (xpvlv < xpvlvend) {
658 xpvlv->xpv_pv = (char*)(xpvlv + 1);
659 xpvlv++;
660 }
661 xpvlv->xpv_pv = 0;
662}
663
664
665STATIC XPVBM*
666S_new_xpvbm(pTHX)
667{
668 XPVBM* xpvbm;
669 LOCK_SV_MUTEX;
670 if (!PL_xpvbm_root)
671 more_xpvbm();
672 xpvbm = PL_xpvbm_root;
673 PL_xpvbm_root = (XPVBM*)xpvbm->xpv_pv;
674 UNLOCK_SV_MUTEX;
675 return xpvbm;
676}
677
678STATIC void
679S_del_xpvbm(pTHX_ XPVBM *p)
680{
681 LOCK_SV_MUTEX;
682 p->xpv_pv = (char*)PL_xpvbm_root;
683 PL_xpvbm_root = p;
684 UNLOCK_SV_MUTEX;
685}
686
687
688STATIC void
689S_more_xpvbm(pTHX)
690{
691 register XPVBM* xpvbm;
692 register XPVBM* xpvbmend;
693 New(721, PL_xpvbm_root, 1008/sizeof(XPVBM), XPVBM);
694 xpvbm = PL_xpvbm_root;
695 xpvbmend = &xpvbm[1008 / sizeof(XPVBM) - 1];
696 while (xpvbm < xpvbmend) {
697 xpvbm->xpv_pv = (char*)(xpvbm + 1);
698 xpvbm++;
699 }
700 xpvbm->xpv_pv = 0;
701}
702
85e6fe83 703#define new_XIV() (void*)new_xiv()
8ac85365 704#define del_XIV(p) del_xiv((XPVIV*) p)
463ee0b2 705
85e6fe83 706#define new_XNV() (void*)new_xnv()
8ac85365 707#define del_XNV(p) del_xnv((XPVNV*) p)
463ee0b2 708
85e6fe83 709#define new_XRV() (void*)new_xrv()
8ac85365 710#define del_XRV(p) del_xrv((XRV*) p)
ed6116ce 711
85e6fe83 712#define new_XPV() (void*)new_xpv()
8ac85365 713#define del_XPV(p) del_xpv((XPV *)p)
463ee0b2 714
9d8a25dc 715STATIC void*
4f63d024 716S_my_safemalloc(MEM_SIZE size)
8c52afec
IZ
717{
718 char *p;
719 New(717, p, size, char);
720 return (void*)p;
721}
722# define my_safefree(s) Safefree(s)
8c52afec 723
932e9ff9
VB
724#define new_XPVIV() (void*)new_xpviv()
725#define del_XPVIV(p) del_xpviv((XPVIV *)p)
9b94d1dd 726
932e9ff9
VB
727#define new_XPVNV() (void*)new_xpvnv()
728#define del_XPVNV(p) del_xpvnv((XPVNV *)p)
932e9ff9 729
932e9ff9
VB
730#define new_XPVCV() (void*)new_xpvcv()
731#define del_XPVCV(p) del_xpvcv((XPVCV *)p)
932e9ff9 732
932e9ff9
VB
733#define new_XPVAV() (void*)new_xpvav()
734#define del_XPVAV(p) del_xpvav((XPVAV *)p)
932e9ff9 735
932e9ff9
VB
736#define new_XPVHV() (void*)new_xpvhv()
737#define del_XPVHV(p) del_xpvhv((XPVHV *)p)
8c52afec 738
932e9ff9
VB
739#define new_XPVMG() (void*)new_xpvmg()
740#define del_XPVMG(p) del_xpvmg((XPVMG *)p)
9b94d1dd 741
932e9ff9
VB
742#define new_XPVLV() (void*)new_xpvlv()
743#define del_XPVLV(p) del_xpvlv((XPVLV *)p)
9b94d1dd 744
8c52afec
IZ
745#define new_XPVGV() (void*)my_safemalloc(sizeof(XPVGV))
746#define del_XPVGV(p) my_safefree((char*)p)
747
932e9ff9
VB
748#define new_XPVBM() (void*)new_xpvbm()
749#define del_XPVBM(p) del_xpvbm((XPVBM *)p)
9b94d1dd 750
8c52afec
IZ
751#define new_XPVFM() (void*)my_safemalloc(sizeof(XPVFM))
752#define del_XPVFM(p) my_safefree((char*)p)
753
754#define new_XPVIO() (void*)my_safemalloc(sizeof(XPVIO))
755#define del_XPVIO(p) my_safefree((char*)p)
8990e307 756
954c1994
GS
757/*
758=for apidoc sv_upgrade
759
760Upgrade an SV to a more complex form. Use C<SvUPGRADE>. See
761C<svtype>.
762
763=cut
764*/
765
79072805 766bool
864dbfa3 767Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
79072805
LW
768{
769 char* pv;
770 U32 cur;
771 U32 len;
a0d0e21e 772 IV iv;
65202027 773 NV nv;
79072805
LW
774 MAGIC* magic;
775 HV* stash;
776
777 if (SvTYPE(sv) == mt)
778 return TRUE;
779
a5f75d66
AD
780 if (mt < SVt_PVIV)
781 (void)SvOOK_off(sv);
782
79072805
LW
783 switch (SvTYPE(sv)) {
784 case SVt_NULL:
785 pv = 0;
786 cur = 0;
787 len = 0;
788 iv = 0;
789 nv = 0.0;
790 magic = 0;
791 stash = 0;
792 break;
79072805
LW
793 case SVt_IV:
794 pv = 0;
795 cur = 0;
796 len = 0;
463ee0b2 797 iv = SvIVX(sv);
65202027 798 nv = (NV)SvIVX(sv);
79072805
LW
799 del_XIV(SvANY(sv));
800 magic = 0;
801 stash = 0;
ed6116ce 802 if (mt == SVt_NV)
463ee0b2 803 mt = SVt_PVNV;
ed6116ce
LW
804 else if (mt < SVt_PVIV)
805 mt = SVt_PVIV;
79072805
LW
806 break;
807 case SVt_NV:
808 pv = 0;
809 cur = 0;
810 len = 0;
463ee0b2 811 nv = SvNVX(sv);
1bd302c3 812 iv = I_V(nv);
79072805
LW
813 magic = 0;
814 stash = 0;
815 del_XNV(SvANY(sv));
816 SvANY(sv) = 0;
ed6116ce 817 if (mt < SVt_PVNV)
79072805
LW
818 mt = SVt_PVNV;
819 break;
ed6116ce
LW
820 case SVt_RV:
821 pv = (char*)SvRV(sv);
822 cur = 0;
823 len = 0;
56431972
RB
824 iv = PTR2IV(pv);
825 nv = PTR2NV(pv);
ed6116ce
LW
826 del_XRV(SvANY(sv));
827 magic = 0;
828 stash = 0;
829 break;
79072805 830 case SVt_PV:
463ee0b2 831 pv = SvPVX(sv);
79072805
LW
832 cur = SvCUR(sv);
833 len = SvLEN(sv);
834 iv = 0;
835 nv = 0.0;
836 magic = 0;
837 stash = 0;
838 del_XPV(SvANY(sv));
748a9306
LW
839 if (mt <= SVt_IV)
840 mt = SVt_PVIV;
841 else if (mt == SVt_NV)
842 mt = SVt_PVNV;
79072805
LW
843 break;
844 case SVt_PVIV:
463ee0b2 845 pv = SvPVX(sv);
79072805
LW
846 cur = SvCUR(sv);
847 len = SvLEN(sv);
463ee0b2 848 iv = SvIVX(sv);
79072805
LW
849 nv = 0.0;
850 magic = 0;
851 stash = 0;
852 del_XPVIV(SvANY(sv));
853 break;
854 case SVt_PVNV:
463ee0b2 855 pv = SvPVX(sv);
79072805
LW
856 cur = SvCUR(sv);
857 len = SvLEN(sv);
463ee0b2
LW
858 iv = SvIVX(sv);
859 nv = SvNVX(sv);
79072805
LW
860 magic = 0;
861 stash = 0;
862 del_XPVNV(SvANY(sv));
863 break;
864 case SVt_PVMG:
463ee0b2 865 pv = SvPVX(sv);
79072805
LW
866 cur = SvCUR(sv);
867 len = SvLEN(sv);
463ee0b2
LW
868 iv = SvIVX(sv);
869 nv = SvNVX(sv);
79072805
LW
870 magic = SvMAGIC(sv);
871 stash = SvSTASH(sv);
872 del_XPVMG(SvANY(sv));
873 break;
874 default:
cea2e8a9 875 Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
79072805
LW
876 }
877
878 switch (mt) {
879 case SVt_NULL:
cea2e8a9 880 Perl_croak(aTHX_ "Can't upgrade to undef");
79072805
LW
881 case SVt_IV:
882 SvANY(sv) = new_XIV();
463ee0b2 883 SvIVX(sv) = iv;
79072805
LW
884 break;
885 case SVt_NV:
886 SvANY(sv) = new_XNV();
463ee0b2 887 SvNVX(sv) = nv;
79072805 888 break;
ed6116ce
LW
889 case SVt_RV:
890 SvANY(sv) = new_XRV();
891 SvRV(sv) = (SV*)pv;
ed6116ce 892 break;
79072805
LW
893 case SVt_PV:
894 SvANY(sv) = new_XPV();
463ee0b2 895 SvPVX(sv) = pv;
79072805
LW
896 SvCUR(sv) = cur;
897 SvLEN(sv) = len;
898 break;
899 case SVt_PVIV:
900 SvANY(sv) = new_XPVIV();
463ee0b2 901 SvPVX(sv) = pv;
79072805
LW
902 SvCUR(sv) = cur;
903 SvLEN(sv) = len;
463ee0b2 904 SvIVX(sv) = iv;
79072805 905 if (SvNIOK(sv))
a0d0e21e 906 (void)SvIOK_on(sv);
79072805
LW
907 SvNOK_off(sv);
908 break;
909 case SVt_PVNV:
910 SvANY(sv) = new_XPVNV();
463ee0b2 911 SvPVX(sv) = pv;
79072805
LW
912 SvCUR(sv) = cur;
913 SvLEN(sv) = len;
463ee0b2
LW
914 SvIVX(sv) = iv;
915 SvNVX(sv) = nv;
79072805
LW
916 break;
917 case SVt_PVMG:
918 SvANY(sv) = new_XPVMG();
463ee0b2 919 SvPVX(sv) = pv;
79072805
LW
920 SvCUR(sv) = cur;
921 SvLEN(sv) = len;
463ee0b2
LW
922 SvIVX(sv) = iv;
923 SvNVX(sv) = nv;
79072805
LW
924 SvMAGIC(sv) = magic;
925 SvSTASH(sv) = stash;
926 break;
927 case SVt_PVLV:
928 SvANY(sv) = new_XPVLV();
463ee0b2 929 SvPVX(sv) = pv;
79072805
LW
930 SvCUR(sv) = cur;
931 SvLEN(sv) = len;
463ee0b2
LW
932 SvIVX(sv) = iv;
933 SvNVX(sv) = nv;
79072805
LW
934 SvMAGIC(sv) = magic;
935 SvSTASH(sv) = stash;
936 LvTARGOFF(sv) = 0;
937 LvTARGLEN(sv) = 0;
938 LvTARG(sv) = 0;
939 LvTYPE(sv) = 0;
940 break;
941 case SVt_PVAV:
942 SvANY(sv) = new_XPVAV();
463ee0b2
LW
943 if (pv)
944 Safefree(pv);
2304df62 945 SvPVX(sv) = 0;
d1bf51dd 946 AvMAX(sv) = -1;
93965878 947 AvFILLp(sv) = -1;
463ee0b2
LW
948 SvIVX(sv) = 0;
949 SvNVX(sv) = 0.0;
950 SvMAGIC(sv) = magic;
951 SvSTASH(sv) = stash;
952 AvALLOC(sv) = 0;
79072805
LW
953 AvARYLEN(sv) = 0;
954 AvFLAGS(sv) = 0;
955 break;
956 case SVt_PVHV:
957 SvANY(sv) = new_XPVHV();
463ee0b2
LW
958 if (pv)
959 Safefree(pv);
960 SvPVX(sv) = 0;
961 HvFILL(sv) = 0;
962 HvMAX(sv) = 0;
963 HvKEYS(sv) = 0;
964 SvNVX(sv) = 0.0;
79072805
LW
965 SvMAGIC(sv) = magic;
966 SvSTASH(sv) = stash;
79072805
LW
967 HvRITER(sv) = 0;
968 HvEITER(sv) = 0;
969 HvPMROOT(sv) = 0;
970 HvNAME(sv) = 0;
79072805
LW
971 break;
972 case SVt_PVCV:
973 SvANY(sv) = new_XPVCV();
748a9306 974 Zero(SvANY(sv), 1, XPVCV);
463ee0b2 975 SvPVX(sv) = pv;
79072805
LW
976 SvCUR(sv) = cur;
977 SvLEN(sv) = len;
463ee0b2
LW
978 SvIVX(sv) = iv;
979 SvNVX(sv) = nv;
79072805
LW
980 SvMAGIC(sv) = magic;
981 SvSTASH(sv) = stash;
79072805
LW
982 break;
983 case SVt_PVGV:
984 SvANY(sv) = new_XPVGV();
463ee0b2 985 SvPVX(sv) = pv;
79072805
LW
986 SvCUR(sv) = cur;
987 SvLEN(sv) = len;
463ee0b2
LW
988 SvIVX(sv) = iv;
989 SvNVX(sv) = nv;
79072805
LW
990 SvMAGIC(sv) = magic;
991 SvSTASH(sv) = stash;
93a17b20 992 GvGP(sv) = 0;
79072805
LW
993 GvNAME(sv) = 0;
994 GvNAMELEN(sv) = 0;
995 GvSTASH(sv) = 0;
a5f75d66 996 GvFLAGS(sv) = 0;
79072805
LW
997 break;
998 case SVt_PVBM:
999 SvANY(sv) = new_XPVBM();
463ee0b2 1000 SvPVX(sv) = pv;
79072805
LW
1001 SvCUR(sv) = cur;
1002 SvLEN(sv) = len;
463ee0b2
LW
1003 SvIVX(sv) = iv;
1004 SvNVX(sv) = nv;
79072805
LW
1005 SvMAGIC(sv) = magic;
1006 SvSTASH(sv) = stash;
1007 BmRARE(sv) = 0;
1008 BmUSEFUL(sv) = 0;
1009 BmPREVIOUS(sv) = 0;
1010 break;
1011 case SVt_PVFM:
1012 SvANY(sv) = new_XPVFM();
748a9306 1013 Zero(SvANY(sv), 1, XPVFM);
463ee0b2 1014 SvPVX(sv) = pv;
79072805
LW
1015 SvCUR(sv) = cur;
1016 SvLEN(sv) = len;
463ee0b2
LW
1017 SvIVX(sv) = iv;
1018 SvNVX(sv) = nv;
79072805
LW
1019 SvMAGIC(sv) = magic;
1020 SvSTASH(sv) = stash;
79072805 1021 break;
8990e307
LW
1022 case SVt_PVIO:
1023 SvANY(sv) = new_XPVIO();
748a9306 1024 Zero(SvANY(sv), 1, XPVIO);
8990e307
LW
1025 SvPVX(sv) = pv;
1026 SvCUR(sv) = cur;
1027 SvLEN(sv) = len;
1028 SvIVX(sv) = iv;
1029 SvNVX(sv) = nv;
1030 SvMAGIC(sv) = magic;
1031 SvSTASH(sv) = stash;
85e6fe83 1032 IoPAGE_LEN(sv) = 60;
8990e307
LW
1033 break;
1034 }
1035 SvFLAGS(sv) &= ~SVTYPEMASK;
1036 SvFLAGS(sv) |= mt;
79072805
LW
1037 return TRUE;
1038}
1039
79072805 1040int
864dbfa3 1041Perl_sv_backoff(pTHX_ register SV *sv)
79072805
LW
1042{
1043 assert(SvOOK(sv));
463ee0b2
LW
1044 if (SvIVX(sv)) {
1045 char *s = SvPVX(sv);
1046 SvLEN(sv) += SvIVX(sv);
1047 SvPVX(sv) -= SvIVX(sv);
79072805 1048 SvIV_set(sv, 0);
463ee0b2 1049 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
79072805
LW
1050 }
1051 SvFLAGS(sv) &= ~SVf_OOK;
a0d0e21e 1052 return 0;
79072805
LW
1053}
1054
954c1994
GS
1055/*
1056=for apidoc sv_grow
1057
1058Expands the character buffer in the SV. This will use C<sv_unref> and will
1059upgrade the SV to C<SVt_PV>. Returns a pointer to the character buffer.
1060Use C<SvGROW>.
1061
1062=cut
1063*/
1064
79072805 1065char *
864dbfa3 1066Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
79072805
LW
1067{
1068 register char *s;
1069
55497cff 1070#ifdef HAS_64K_LIMIT
79072805 1071 if (newlen >= 0x10000) {
1d7c1841
GS
1072 PerlIO_printf(Perl_debug_log,
1073 "Allocation too large: %"UVxf"\n", (UV)newlen);
79072805
LW
1074 my_exit(1);
1075 }
55497cff 1076#endif /* HAS_64K_LIMIT */
a0d0e21e
LW
1077 if (SvROK(sv))
1078 sv_unref(sv);
79072805
LW
1079 if (SvTYPE(sv) < SVt_PV) {
1080 sv_upgrade(sv, SVt_PV);
463ee0b2 1081 s = SvPVX(sv);
79072805
LW
1082 }
1083 else if (SvOOK(sv)) { /* pv is offset? */
1084 sv_backoff(sv);
463ee0b2 1085 s = SvPVX(sv);
79072805
LW
1086 if (newlen > SvLEN(sv))
1087 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
c6f8c383
GA
1088#ifdef HAS_64K_LIMIT
1089 if (newlen >= 0x10000)
1090 newlen = 0xFFFF;
1091#endif
79072805
LW
1092 }
1093 else
463ee0b2 1094 s = SvPVX(sv);
79072805 1095 if (newlen > SvLEN(sv)) { /* need more room? */
8d6dde3e 1096 if (SvLEN(sv) && s) {
f5a32c7f 1097#if defined(MYMALLOC) && !defined(LEAKTEST)
8d6dde3e
IZ
1098 STRLEN l = malloced_size((void*)SvPVX(sv));
1099 if (newlen <= l) {
1100 SvLEN_set(sv, l);
1101 return s;
1102 } else
c70c8a0a 1103#endif
79072805 1104 Renew(s,newlen,char);
8d6dde3e 1105 }
79072805
LW
1106 else
1107 New(703,s,newlen,char);
1108 SvPV_set(sv, s);
1109 SvLEN_set(sv, newlen);
1110 }
1111 return s;
1112}
1113
954c1994
GS
1114/*
1115=for apidoc sv_setiv
1116
1117Copies an integer into the given SV. Does not handle 'set' magic. See
1118C<sv_setiv_mg>.
1119
1120=cut
1121*/
1122
79072805 1123void
864dbfa3 1124Perl_sv_setiv(pTHX_ register SV *sv, IV i)
79072805 1125{
2213622d 1126 SV_CHECK_THINKFIRST(sv);
463ee0b2
LW
1127 switch (SvTYPE(sv)) {
1128 case SVt_NULL:
79072805 1129 sv_upgrade(sv, SVt_IV);
463ee0b2
LW
1130 break;
1131 case SVt_NV:
1132 sv_upgrade(sv, SVt_PVNV);
1133 break;
ed6116ce 1134 case SVt_RV:
463ee0b2 1135 case SVt_PV:
79072805 1136 sv_upgrade(sv, SVt_PVIV);
463ee0b2 1137 break;
a0d0e21e
LW
1138
1139 case SVt_PVGV:
a0d0e21e
LW
1140 case SVt_PVAV:
1141 case SVt_PVHV:
1142 case SVt_PVCV:
1143 case SVt_PVFM:
1144 case SVt_PVIO:
11343788
MB
1145 {
1146 dTHR;
cea2e8a9 1147 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
22c35a8c 1148 PL_op_desc[PL_op->op_type]);
11343788 1149 }
463ee0b2 1150 }
a0d0e21e 1151 (void)SvIOK_only(sv); /* validate number */
a5f75d66 1152 SvIVX(sv) = i;
463ee0b2 1153 SvTAINT(sv);
79072805
LW
1154}
1155
954c1994
GS
1156/*
1157=for apidoc sv_setiv_mg
1158
1159Like C<sv_setiv>, but also handles 'set' magic.
1160
1161=cut
1162*/
1163
79072805 1164void
864dbfa3 1165Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
ef50df4b
GS
1166{
1167 sv_setiv(sv,i);
1168 SvSETMAGIC(sv);
1169}
1170
954c1994
GS
1171/*
1172=for apidoc sv_setuv
1173
1174Copies an unsigned integer into the given SV. Does not handle 'set' magic.
1175See C<sv_setuv_mg>.
1176
1177=cut
1178*/
1179
ef50df4b 1180void
864dbfa3 1181Perl_sv_setuv(pTHX_ register SV *sv, UV u)
55497cff 1182{
25da4f38
IZ
1183 sv_setiv(sv, 0);
1184 SvIsUV_on(sv);
1185 SvUVX(sv) = u;
55497cff 1186}
1187
954c1994
GS
1188/*
1189=for apidoc sv_setuv_mg
1190
1191Like C<sv_setuv>, but also handles 'set' magic.
1192
1193=cut
1194*/
1195
55497cff 1196void
864dbfa3 1197Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
ef50df4b
GS
1198{
1199 sv_setuv(sv,u);
1200 SvSETMAGIC(sv);
1201}
1202
954c1994
GS
1203/*
1204=for apidoc sv_setnv
1205
1206Copies a double into the given SV. Does not handle 'set' magic. See
1207C<sv_setnv_mg>.
1208
1209=cut
1210*/
1211
ef50df4b 1212void
65202027 1213Perl_sv_setnv(pTHX_ register SV *sv, NV num)
79072805 1214{
2213622d 1215 SV_CHECK_THINKFIRST(sv);
a0d0e21e
LW
1216 switch (SvTYPE(sv)) {
1217 case SVt_NULL:
1218 case SVt_IV:
79072805 1219 sv_upgrade(sv, SVt_NV);
a0d0e21e 1220 break;
a0d0e21e
LW
1221 case SVt_RV:
1222 case SVt_PV:
1223 case SVt_PVIV:
79072805 1224 sv_upgrade(sv, SVt_PVNV);
a0d0e21e 1225 break;
827b7e14 1226
a0d0e21e 1227 case SVt_PVGV:
a0d0e21e
LW
1228 case SVt_PVAV:
1229 case SVt_PVHV:
1230 case SVt_PVCV:
1231 case SVt_PVFM:
1232 case SVt_PVIO:
11343788
MB
1233 {
1234 dTHR;
cea2e8a9 1235 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
22c35a8c 1236 PL_op_name[PL_op->op_type]);
11343788 1237 }
79072805 1238 }
463ee0b2 1239 SvNVX(sv) = num;
a0d0e21e 1240 (void)SvNOK_only(sv); /* validate number */
463ee0b2 1241 SvTAINT(sv);
79072805
LW
1242}
1243
954c1994
GS
1244/*
1245=for apidoc sv_setnv_mg
1246
1247Like C<sv_setnv>, but also handles 'set' magic.
1248
1249=cut
1250*/
1251
ef50df4b 1252void
65202027 1253Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
ef50df4b
GS
1254{
1255 sv_setnv(sv,num);
1256 SvSETMAGIC(sv);
1257}
1258
76e3520e 1259STATIC void
cea2e8a9 1260S_not_a_number(pTHX_ SV *sv)
a0d0e21e 1261{
11343788 1262 dTHR;
a0d0e21e
LW
1263 char tmpbuf[64];
1264 char *d = tmpbuf;
1265 char *s;
dc28f22b
GA
1266 char *limit = tmpbuf + sizeof(tmpbuf) - 8;
1267 /* each *s can expand to 4 chars + "...\0",
1268 i.e. need room for 8 chars */
a0d0e21e 1269
dc28f22b 1270 for (s = SvPVX(sv); *s && d < limit; s++) {
bbce6d69 1271 int ch = *s & 0xFF;
1272 if (ch & 128 && !isPRINT_LC(ch)) {
a0d0e21e
LW
1273 *d++ = 'M';
1274 *d++ = '-';
1275 ch &= 127;
1276 }
bbce6d69 1277 if (ch == '\n') {
1278 *d++ = '\\';
1279 *d++ = 'n';
1280 }
1281 else if (ch == '\r') {
1282 *d++ = '\\';
1283 *d++ = 'r';
1284 }
1285 else if (ch == '\f') {
1286 *d++ = '\\';
1287 *d++ = 'f';
1288 }
1289 else if (ch == '\\') {
1290 *d++ = '\\';
1291 *d++ = '\\';
1292 }
1293 else if (isPRINT_LC(ch))
a0d0e21e
LW
1294 *d++ = ch;
1295 else {
1296 *d++ = '^';
bbce6d69 1297 *d++ = toCTRL(ch);
a0d0e21e
LW
1298 }
1299 }
1300 if (*s) {
1301 *d++ = '.';
1302 *d++ = '.';
1303 *d++ = '.';
1304 }
1305 *d = '\0';
1306
533c011a 1307 if (PL_op)
42d38218
MS
1308 Perl_warner(aTHX_ WARN_NUMERIC,
1309 "Argument \"%s\" isn't numeric in %s", tmpbuf,
1310 PL_op_desc[PL_op->op_type]);
a0d0e21e 1311 else
42d38218
MS
1312 Perl_warner(aTHX_ WARN_NUMERIC,
1313 "Argument \"%s\" isn't numeric", tmpbuf);
a0d0e21e
LW
1314}
1315
cf2093f6 1316/* the number can be converted to integer with atol() or atoll() */
25da4f38
IZ
1317#define IS_NUMBER_TO_INT_BY_ATOL 0x01
1318#define IS_NUMBER_TO_INT_BY_ATOF 0x02 /* atol() may be != atof() */
1319#define IS_NUMBER_NOT_IV 0x04 /* (IV)atof() may be != atof() */
1320#define IS_NUMBER_NEG 0x08 /* not good to cache UV */
1321
1322/* Actually, ISO C leaves conversion of UV to IV undefined, but
1323 until proven guilty, assume that things are not that bad... */
1324
a0d0e21e 1325IV
864dbfa3 1326Perl_sv_2iv(pTHX_ register SV *sv)
79072805
LW
1327{
1328 if (!sv)
1329 return 0;
8990e307 1330 if (SvGMAGICAL(sv)) {
463ee0b2
LW
1331 mg_get(sv);
1332 if (SvIOKp(sv))
1333 return SvIVX(sv);
748a9306 1334 if (SvNOKp(sv)) {
25da4f38 1335 return I_V(SvNVX(sv));
748a9306 1336 }
36477c24 1337 if (SvPOKp(sv) && SvLEN(sv))
1338 return asIV(sv);
3fe9a6f1 1339 if (!SvROK(sv)) {
d008e5eb 1340 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1341 dTHR;
d008e5eb 1342 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1d7c1841 1343 report_uninit();
c6ee37c5 1344 }
36477c24 1345 return 0;
3fe9a6f1 1346 }
463ee0b2 1347 }
ed6116ce 1348 if (SvTHINKFIRST(sv)) {
a0d0e21e 1349 if (SvROK(sv)) {
a0d0e21e
LW
1350 SV* tmpstr;
1351 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
9e7bc3e8 1352 return SvIV(tmpstr);
56431972 1353 return PTR2IV(SvRV(sv));
a0d0e21e 1354 }
0336b60e
IZ
1355 if (SvREADONLY(sv) && !SvOK(sv)) {
1356 dTHR;
1357 if (ckWARN(WARN_UNINITIALIZED))
1d7c1841 1358 report_uninit();
ed6116ce
LW
1359 return 0;
1360 }
79072805 1361 }
25da4f38
IZ
1362 if (SvIOKp(sv)) {
1363 if (SvIsUV(sv)) {
1364 return (IV)(SvUVX(sv));
1365 }
1366 else {
1367 return SvIVX(sv);
1368 }
463ee0b2 1369 }
748a9306 1370 if (SvNOKp(sv)) {
25da4f38
IZ
1371 /* We can cache the IV/UV value even if it not good enough
1372 * to reconstruct NV, since the conversion to PV will prefer
cf2093f6 1373 * NV over IV/UV.
25da4f38
IZ
1374 */
1375
1376 if (SvTYPE(sv) == SVt_NV)
1377 sv_upgrade(sv, SVt_PVNV);
1378
a5f75d66 1379 (void)SvIOK_on(sv);
65202027 1380 if (SvNVX(sv) < (NV)IV_MAX + 0.5)
748a9306 1381 SvIVX(sv) = I_V(SvNVX(sv));
25da4f38 1382 else {
ff68c719 1383 SvUVX(sv) = U_V(SvNVX(sv));
25da4f38
IZ
1384 SvIsUV_on(sv);
1385 ret_iv_max:
cf2093f6 1386 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 1387 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 1388 PTR2UV(sv),
57def98f
JH
1389 SvUVX(sv),
1390 SvUVX(sv)));
25da4f38
IZ
1391 return (IV)SvUVX(sv);
1392 }
748a9306
LW
1393 }
1394 else if (SvPOKp(sv) && SvLEN(sv)) {
25da4f38
IZ
1395 I32 numtype = looks_like_number(sv);
1396
1397 /* We want to avoid a possible problem when we cache an IV which
1398 may be later translated to an NV, and the resulting NV is not
1399 the translation of the initial data.
1400
1401 This means that if we cache such an IV, we need to cache the
1402 NV as well. Moreover, we trade speed for space, and do not
1403 cache the NV if not needed.
1404 */
1405 if (numtype & IS_NUMBER_NOT_IV) {
1406 /* May be not an integer. Need to cache NV if we cache IV
1407 * - otherwise future conversion to NV will be wrong. */
65202027 1408 NV d;
25da4f38 1409
097ee67d 1410 d = Atof(SvPVX(sv));
25da4f38
IZ
1411
1412 if (SvTYPE(sv) < SVt_PVNV)
1413 sv_upgrade(sv, SVt_PVNV);
1414 SvNVX(sv) = d;
1415 (void)SvNOK_on(sv);
1416 (void)SvIOK_on(sv);
65202027 1417#if defined(USE_LONG_DOUBLE)
1d7c1841
GS
1418 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
1419 PTR2UV(sv), SvNVX(sv)));
65202027 1420#else
1d7c1841
GS
1421 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%g)\n",
1422 PTR2UV(sv), SvNVX(sv)));
65202027 1423#endif
65202027 1424 if (SvNVX(sv) < (NV)IV_MAX + 0.5)
25da4f38
IZ
1425 SvIVX(sv) = I_V(SvNVX(sv));
1426 else {
1427 SvUVX(sv) = U_V(SvNVX(sv));
1428 SvIsUV_on(sv);
1429 goto ret_iv_max;
1430 }
1431 }
1432 else if (numtype) {
1433 /* The NV may be reconstructed from IV - safe to cache IV,
1434 which may be calculated by atol(). */
1435 if (SvTYPE(sv) == SVt_PV)
1436 sv_upgrade(sv, SVt_PVIV);
1437 (void)SvIOK_on(sv);
cf2093f6 1438 SvIVX(sv) = Atol(SvPVX(sv));
25da4f38
IZ
1439 }
1440 else { /* Not a number. Cache 0. */
1441 dTHR;
1442
1443 if (SvTYPE(sv) < SVt_PVIV)
1444 sv_upgrade(sv, SVt_PVIV);
1445 SvIVX(sv) = 0;
1446 (void)SvIOK_on(sv);
1447 if (ckWARN(WARN_NUMERIC))
1448 not_a_number(sv);
1449 }
93a17b20 1450 }
79072805 1451 else {
11343788 1452 dTHR;
599cee73 1453 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1d7c1841 1454 report_uninit();
25da4f38
IZ
1455 if (SvTYPE(sv) < SVt_IV)
1456 /* Typically the caller expects that sv_any is not NULL now. */
1457 sv_upgrade(sv, SVt_IV);
a0d0e21e 1458 return 0;
79072805 1459 }
1d7c1841
GS
1460 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
1461 PTR2UV(sv),SvIVX(sv)));
25da4f38 1462 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
1463}
1464
ff68c719 1465UV
864dbfa3 1466Perl_sv_2uv(pTHX_ register SV *sv)
ff68c719 1467{
1468 if (!sv)
1469 return 0;
1470 if (SvGMAGICAL(sv)) {
1471 mg_get(sv);
1472 if (SvIOKp(sv))
1473 return SvUVX(sv);
1474 if (SvNOKp(sv))
1475 return U_V(SvNVX(sv));
36477c24 1476 if (SvPOKp(sv) && SvLEN(sv))
1477 return asUV(sv);
3fe9a6f1 1478 if (!SvROK(sv)) {
d008e5eb 1479 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1480 dTHR;
d008e5eb 1481 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1d7c1841 1482 report_uninit();
c6ee37c5 1483 }
36477c24 1484 return 0;
3fe9a6f1 1485 }
ff68c719 1486 }
1487 if (SvTHINKFIRST(sv)) {
1488 if (SvROK(sv)) {
ff68c719 1489 SV* tmpstr;
1490 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
9e7bc3e8 1491 return SvUV(tmpstr);
56431972 1492 return PTR2UV(SvRV(sv));
ff68c719 1493 }
0336b60e
IZ
1494 if (SvREADONLY(sv) && !SvOK(sv)) {
1495 dTHR;
1496 if (ckWARN(WARN_UNINITIALIZED))
1d7c1841 1497 report_uninit();
ff68c719 1498 return 0;
1499 }
1500 }
25da4f38
IZ
1501 if (SvIOKp(sv)) {
1502 if (SvIsUV(sv)) {
1503 return SvUVX(sv);
1504 }
1505 else {
1506 return (UV)SvIVX(sv);
1507 }
ff68c719 1508 }
1509 if (SvNOKp(sv)) {
25da4f38
IZ
1510 /* We can cache the IV/UV value even if it not good enough
1511 * to reconstruct NV, since the conversion to PV will prefer
cf2093f6 1512 * NV over IV/UV.
25da4f38
IZ
1513 */
1514 if (SvTYPE(sv) == SVt_NV)
1515 sv_upgrade(sv, SVt_PVNV);
ff68c719 1516 (void)SvIOK_on(sv);
25da4f38
IZ
1517 if (SvNVX(sv) >= -0.5) {
1518 SvIsUV_on(sv);
1519 SvUVX(sv) = U_V(SvNVX(sv));
1520 }
1521 else {
1522 SvIVX(sv) = I_V(SvNVX(sv));
1523 ret_zero:
cf2093f6 1524 DEBUG_c(PerlIO_printf(Perl_debug_log,
07270b1a 1525 "0x%"UVxf" 2uv(%"IVdf" => %"IVdf") (as signed)\n",
57def98f
JH
1526 PTR2UV(sv),
1527 SvIVX(sv),
1528 (IV)(UV)SvIVX(sv)));
25da4f38
IZ
1529 return (UV)SvIVX(sv);
1530 }
ff68c719 1531 }
1532 else if (SvPOKp(sv) && SvLEN(sv)) {
25da4f38
IZ
1533 I32 numtype = looks_like_number(sv);
1534
1535 /* We want to avoid a possible problem when we cache a UV which
1536 may be later translated to an NV, and the resulting NV is not
1537 the translation of the initial data.
1538
1539 This means that if we cache such a UV, we need to cache the
1540 NV as well. Moreover, we trade speed for space, and do not
1541 cache the NV if not needed.
1542 */
1543 if (numtype & IS_NUMBER_NOT_IV) {
1544 /* May be not an integer. Need to cache NV if we cache IV
1545 * - otherwise future conversion to NV will be wrong. */
65202027 1546 NV d;
25da4f38 1547
cf2093f6 1548 d = Atof(SvPVX(sv));
25da4f38
IZ
1549
1550 if (SvTYPE(sv) < SVt_PVNV)
1551 sv_upgrade(sv, SVt_PVNV);
1552 SvNVX(sv) = d;
1553 (void)SvNOK_on(sv);
1554 (void)SvIOK_on(sv);
65202027 1555#if defined(USE_LONG_DOUBLE)
1d7c1841
GS
1556 DEBUG_c(PerlIO_printf(Perl_debug_log,
1557 "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
1558 PTR2UV(sv), SvNVX(sv)));
65202027 1559#else
1d7c1841
GS
1560 DEBUG_c(PerlIO_printf(Perl_debug_log,
1561 "0x%"UVxf" 2nv(%g)\n",
1562 PTR2UV(sv), SvNVX(sv)));
65202027 1563#endif
25da4f38
IZ
1564 if (SvNVX(sv) < -0.5) {
1565 SvIVX(sv) = I_V(SvNVX(sv));
1566 goto ret_zero;
1567 } else {
1568 SvUVX(sv) = U_V(SvNVX(sv));
1569 SvIsUV_on(sv);
1570 }
1571 }
1572 else if (numtype & IS_NUMBER_NEG) {
1573 /* The NV may be reconstructed from IV - safe to cache IV,
1574 which may be calculated by atol(). */
1575 if (SvTYPE(sv) == SVt_PV)
1576 sv_upgrade(sv, SVt_PVIV);
1577 (void)SvIOK_on(sv);
cf2093f6 1578 SvIVX(sv) = (IV)Atol(SvPVX(sv));
25da4f38
IZ
1579 }
1580 else if (numtype) { /* Non-negative */
1581 /* The NV may be reconstructed from UV - safe to cache UV,
1582 which may be calculated by strtoul()/atol. */
1583 if (SvTYPE(sv) == SVt_PV)
1584 sv_upgrade(sv, SVt_PVIV);
1585 (void)SvIOK_on(sv);
1586 (void)SvIsUV_on(sv);
1587#ifdef HAS_STRTOUL
cf2093f6 1588 SvUVX(sv) = Strtoul(SvPVX(sv), Null(char**), 10);
25da4f38
IZ
1589#else /* no atou(), but we know the number fits into IV... */
1590 /* The only problem may be if it is negative... */
cf2093f6 1591 SvUVX(sv) = (UV)Atol(SvPVX(sv));
25da4f38
IZ
1592#endif
1593 }
1594 else { /* Not a number. Cache 0. */
1595 dTHR;
1596
1597 if (SvTYPE(sv) < SVt_PVIV)
1598 sv_upgrade(sv, SVt_PVIV);
1599 SvUVX(sv) = 0; /* We assume that 0s have the
1600 same bitmap in IV and UV. */
1601 (void)SvIOK_on(sv);
1602 (void)SvIsUV_on(sv);
1603 if (ckWARN(WARN_NUMERIC))
1604 not_a_number(sv);
1605 }
ff68c719 1606 }
1607 else {
d008e5eb 1608 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1609 dTHR;
d008e5eb 1610 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1d7c1841 1611 report_uninit();
c6ee37c5 1612 }
25da4f38
IZ
1613 if (SvTYPE(sv) < SVt_IV)
1614 /* Typically the caller expects that sv_any is not NULL now. */
1615 sv_upgrade(sv, SVt_IV);
ff68c719 1616 return 0;
1617 }
25da4f38 1618
1d7c1841
GS
1619 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
1620 PTR2UV(sv),SvUVX(sv)));
25da4f38 1621 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 1622}
1623
65202027 1624NV
864dbfa3 1625Perl_sv_2nv(pTHX_ register SV *sv)
79072805
LW
1626{
1627 if (!sv)
1628 return 0.0;
8990e307 1629 if (SvGMAGICAL(sv)) {
463ee0b2
LW
1630 mg_get(sv);
1631 if (SvNOKp(sv))
1632 return SvNVX(sv);
a0d0e21e 1633 if (SvPOKp(sv) && SvLEN(sv)) {
d008e5eb 1634 dTHR;
599cee73 1635 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 1636 not_a_number(sv);
097ee67d 1637 return Atof(SvPVX(sv));
a0d0e21e 1638 }
25da4f38
IZ
1639 if (SvIOKp(sv)) {
1640 if (SvIsUV(sv))
65202027 1641 return (NV)SvUVX(sv);
25da4f38 1642 else
65202027 1643 return (NV)SvIVX(sv);
25da4f38 1644 }
16d20bd9 1645 if (!SvROK(sv)) {
d008e5eb 1646 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1647 dTHR;
d008e5eb 1648 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1d7c1841 1649 report_uninit();
c6ee37c5 1650 }
16d20bd9
AD
1651 return 0;
1652 }
463ee0b2 1653 }
ed6116ce 1654 if (SvTHINKFIRST(sv)) {
a0d0e21e 1655 if (SvROK(sv)) {
a0d0e21e
LW
1656 SV* tmpstr;
1657 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
9e7bc3e8 1658 return SvNV(tmpstr);
56431972 1659 return PTR2NV(SvRV(sv));
a0d0e21e 1660 }
0336b60e 1661 if (SvREADONLY(sv) && !SvOK(sv)) {
d008e5eb 1662 dTHR;
599cee73 1663 if (ckWARN(WARN_UNINITIALIZED))
1d7c1841 1664 report_uninit();
ed6116ce
LW
1665 return 0.0;
1666 }
79072805
LW
1667 }
1668 if (SvTYPE(sv) < SVt_NV) {
463ee0b2
LW
1669 if (SvTYPE(sv) == SVt_IV)
1670 sv_upgrade(sv, SVt_PVNV);
1671 else
1672 sv_upgrade(sv, SVt_NV);
572bbb43 1673#if defined(USE_LONG_DOUBLE)
097ee67d
JH
1674 DEBUG_c({
1675 RESTORE_NUMERIC_STANDARD();
1d7c1841
GS
1676 PerlIO_printf(Perl_debug_log,
1677 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
1678 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
1679 RESTORE_NUMERIC_LOCAL();
1680 });
65202027 1681#else
572bbb43
GS
1682 DEBUG_c({
1683 RESTORE_NUMERIC_STANDARD();
1d7c1841
GS
1684 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%g)\n",
1685 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
1686 RESTORE_NUMERIC_LOCAL();
1687 });
572bbb43 1688#endif
79072805
LW
1689 }
1690 else if (SvTYPE(sv) < SVt_PVNV)
1691 sv_upgrade(sv, SVt_PVNV);
748a9306
LW
1692 if (SvIOKp(sv) &&
1693 (!SvPOKp(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
93a17b20 1694 {
65202027 1695 SvNVX(sv) = SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv);
93a17b20 1696 }
748a9306 1697 else if (SvPOKp(sv) && SvLEN(sv)) {
d008e5eb 1698 dTHR;
599cee73 1699 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 1700 not_a_number(sv);
097ee67d 1701 SvNVX(sv) = Atof(SvPVX(sv));
93a17b20 1702 }
79072805 1703 else {
11343788 1704 dTHR;
599cee73 1705 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1d7c1841 1706 report_uninit();
25da4f38
IZ
1707 if (SvTYPE(sv) < SVt_NV)
1708 /* Typically the caller expects that sv_any is not NULL now. */
1709 sv_upgrade(sv, SVt_NV);
a0d0e21e 1710 return 0.0;
79072805
LW
1711 }
1712 SvNOK_on(sv);
572bbb43 1713#if defined(USE_LONG_DOUBLE)
097ee67d
JH
1714 DEBUG_c({
1715 RESTORE_NUMERIC_STANDARD();
1d7c1841
GS
1716 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
1717 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
1718 RESTORE_NUMERIC_LOCAL();
1719 });
65202027 1720#else
572bbb43
GS
1721 DEBUG_c({
1722 RESTORE_NUMERIC_STANDARD();
1d7c1841
GS
1723 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%g)\n",
1724 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
1725 RESTORE_NUMERIC_LOCAL();
1726 });
572bbb43 1727#endif
463ee0b2 1728 return SvNVX(sv);
79072805
LW
1729}
1730
76e3520e 1731STATIC IV
cea2e8a9 1732S_asIV(pTHX_ SV *sv)
36477c24 1733{
1734 I32 numtype = looks_like_number(sv);
65202027 1735 NV d;
36477c24 1736
25da4f38 1737 if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
cf2093f6 1738 return Atol(SvPVX(sv));
d008e5eb
GS
1739 if (!numtype) {
1740 dTHR;
1741 if (ckWARN(WARN_NUMERIC))
1742 not_a_number(sv);
1743 }
097ee67d 1744 d = Atof(SvPVX(sv));
25da4f38 1745 return I_V(d);
36477c24 1746}
1747
76e3520e 1748STATIC UV
cea2e8a9 1749S_asUV(pTHX_ SV *sv)
36477c24 1750{
1751 I32 numtype = looks_like_number(sv);
1752
84902520 1753#ifdef HAS_STRTOUL
25da4f38 1754 if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
cf2093f6 1755 return Strtoul(SvPVX(sv), Null(char**), 10);
84902520 1756#endif
d008e5eb
GS
1757 if (!numtype) {
1758 dTHR;
1759 if (ckWARN(WARN_NUMERIC))
1760 not_a_number(sv);
1761 }
097ee67d 1762 return U_V(Atof(SvPVX(sv)));
36477c24 1763}
1764
25da4f38
IZ
1765/*
1766 * Returns a combination of (advisory only - can get false negatives)
1767 * IS_NUMBER_TO_INT_BY_ATOL, IS_NUMBER_TO_INT_BY_ATOF, IS_NUMBER_NOT_IV,
1768 * IS_NUMBER_NEG
1769 * 0 if does not look like number.
1770 *
1771 * In fact possible values are 0 and
1772 * IS_NUMBER_TO_INT_BY_ATOL 123
1773 * IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV 123.1
1774 * IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV 123e0
1775 * with a possible addition of IS_NUMBER_NEG.
1776 */
1777
954c1994
GS
1778/*
1779=for apidoc looks_like_number
1780
1781Test if an the content of an SV looks like a number (or is a
1782number).
1783
1784=cut
1785*/
1786
36477c24 1787I32
864dbfa3 1788Perl_looks_like_number(pTHX_ SV *sv)
36477c24 1789{
1790 register char *s;
1791 register char *send;
1792 register char *sbegin;
25da4f38
IZ
1793 register char *nbegin;
1794 I32 numtype = 0;
36477c24 1795 STRLEN len;
1796
1797 if (SvPOK(sv)) {
1798 sbegin = SvPVX(sv);
1799 len = SvCUR(sv);
1800 }
1801 else if (SvPOKp(sv))
1802 sbegin = SvPV(sv, len);
1803 else
1804 return 1;
1805 send = sbegin + len;
1806
1807 s = sbegin;
1808 while (isSPACE(*s))
1809 s++;
25da4f38
IZ
1810 if (*s == '-') {
1811 s++;
1812 numtype = IS_NUMBER_NEG;
1813 }
1814 else if (*s == '+')
36477c24 1815 s++;
ff0cee69 1816
25da4f38
IZ
1817 nbegin = s;
1818 /*
097ee67d
JH
1819 * we return IS_NUMBER_TO_INT_BY_ATOL if the number can be converted
1820 * to _integer_ with atol() and IS_NUMBER_TO_INT_BY_ATOF if you need
1821 * (int)atof().
25da4f38
IZ
1822 */
1823
097ee67d 1824 /* next must be digit or the radix separator */
ff0cee69 1825 if (isDIGIT(*s)) {
1826 do {
1827 s++;
1828 } while (isDIGIT(*s));
25da4f38
IZ
1829
1830 if (s - nbegin >= TYPE_DIGITS(IV)) /* Cannot cache ato[ul]() */
1831 numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
1832 else
1833 numtype |= IS_NUMBER_TO_INT_BY_ATOL;
1834
097ee67d
JH
1835 if (*s == '.'
1836#ifdef USE_LOCALE_NUMERIC
1837 || IS_NUMERIC_RADIX(*s)
1838#endif
1839 ) {
ff0cee69 1840 s++;
25da4f38 1841 numtype |= IS_NUMBER_NOT_IV;
097ee67d 1842 while (isDIGIT(*s)) /* optional digits after the radix */
ff0cee69 1843 s++;
1844 }
36477c24 1845 }
097ee67d
JH
1846 else if (*s == '.'
1847#ifdef USE_LOCALE_NUMERIC
1848 || IS_NUMERIC_RADIX(*s)
1849#endif
1850 ) {
ff0cee69 1851 s++;
25da4f38 1852 numtype |= IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV;
097ee67d 1853 /* no digits before the radix means we need digits after it */
ff0cee69 1854 if (isDIGIT(*s)) {
1855 do {
1856 s++;
1857 } while (isDIGIT(*s));
1858 }
1859 else
1860 return 0;
1861 }
1862 else
1863 return 0;
1864
ff0cee69 1865 /* we can have an optional exponent part */
36477c24 1866 if (*s == 'e' || *s == 'E') {
25da4f38
IZ
1867 numtype &= ~IS_NUMBER_NEG;
1868 numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
36477c24 1869 s++;
1870 if (*s == '+' || *s == '-')
1871 s++;
ff0cee69 1872 if (isDIGIT(*s)) {
1873 do {
1874 s++;
1875 } while (isDIGIT(*s));
1876 }
1877 else
1878 return 0;
36477c24 1879 }
1880 while (isSPACE(*s))
1881 s++;
1882 if (s >= send)
1883 return numtype;
1884 if (len == 10 && memEQ(sbegin, "0 but true", 10))
25da4f38 1885 return IS_NUMBER_TO_INT_BY_ATOL;
36477c24 1886 return 0;
1887}
1888
79072805 1889char *
864dbfa3 1890Perl_sv_2pv_nolen(pTHX_ register SV *sv)
1fa8b10d
JD
1891{
1892 STRLEN n_a;
1893 return sv_2pv(sv, &n_a);
1894}
1895
25da4f38 1896/* We assume that buf is at least TYPE_CHARS(UV) long. */
864dbfa3 1897static char *
25da4f38
IZ
1898uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
1899{
1900 STRLEN len;
1901 char *ptr = buf + TYPE_CHARS(UV);
1902 char *ebuf = ptr;
1903 int sign;
1904 char *p;
1905
1906 if (is_uv)
1907 sign = 0;
1908 else if (iv >= 0) {
1909 uv = iv;
1910 sign = 0;
1911 } else {
1912 uv = -iv;
1913 sign = 1;
1914 }
1915 do {
1916 *--ptr = '0' + (uv % 10);
1917 } while (uv /= 10);
1918 if (sign)
1919 *--ptr = '-';
1920 *peob = ebuf;
1921 return ptr;
1922}
1923
1fa8b10d 1924char *
864dbfa3 1925Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
79072805
LW
1926{
1927 register char *s;
1928 int olderrno;
46fc3d4c 1929 SV *tsv;
25da4f38
IZ
1930 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
1931 char *tmpbuf = tbuf;
79072805 1932
463ee0b2
LW
1933 if (!sv) {
1934 *lp = 0;
1935 return "";
1936 }
8990e307 1937 if (SvGMAGICAL(sv)) {
463ee0b2
LW
1938 mg_get(sv);
1939 if (SvPOKp(sv)) {
1940 *lp = SvCUR(sv);
1941 return SvPVX(sv);
1942 }
cf2093f6 1943 if (SvIOKp(sv)) {
cf2093f6 1944 if (SvIsUV(sv))
57def98f 1945 (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
cf2093f6 1946 else
57def98f 1947 (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
46fc3d4c 1948 tsv = Nullsv;
a0d0e21e 1949 goto tokensave;
463ee0b2
LW
1950 }
1951 if (SvNOKp(sv)) {
2d4389e4 1952 Gconvert(SvNVX(sv), NV_DIG, 0, tmpbuf);
46fc3d4c 1953 tsv = Nullsv;
a0d0e21e 1954 goto tokensave;
463ee0b2 1955 }
16d20bd9 1956 if (!SvROK(sv)) {
d008e5eb 1957 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1958 dTHR;
d008e5eb 1959 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1d7c1841 1960 report_uninit();
c6ee37c5 1961 }
16d20bd9
AD
1962 *lp = 0;
1963 return "";
1964 }
463ee0b2 1965 }
ed6116ce
LW
1966 if (SvTHINKFIRST(sv)) {
1967 if (SvROK(sv)) {
a0d0e21e
LW
1968 SV* tmpstr;
1969 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
9e7bc3e8 1970 return SvPV(tmpstr,*lp);
ed6116ce
LW
1971 sv = (SV*)SvRV(sv);
1972 if (!sv)
1973 s = "NULLREF";
1974 else {
f9277f47
IZ
1975 MAGIC *mg;
1976
ed6116ce 1977 switch (SvTYPE(sv)) {
f9277f47
IZ
1978 case SVt_PVMG:
1979 if ( ((SvFLAGS(sv) &
1980 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
3149a8e4 1981 == (SVs_OBJECT|SVs_RMG))
57668c4d 1982 && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp")
f9277f47 1983 && (mg = mg_find(sv, 'r'))) {
5c0ca799 1984 dTHR;
2cd61cdb 1985 regexp *re = (regexp *)mg->mg_obj;
1bd3ad17 1986
2cd61cdb 1987 if (!mg->mg_ptr) {
8782bef2
GB
1988 char *fptr = "msix";
1989 char reflags[6];
1990 char ch;
1991 int left = 0;
1992 int right = 4;
1993 U16 reganch = (re->reganch & PMf_COMPILETIME) >> 12;
1994
1995 while(ch = *fptr++) {
1996 if(reganch & 1) {
1997 reflags[left++] = ch;
1998 }
1999 else {
2000 reflags[right--] = ch;
2001 }
2002 reganch >>= 1;
2003 }
2004 if(left != 4) {
2005 reflags[left] = '-';
2006 left = 5;
2007 }
2008
2009 mg->mg_len = re->prelen + 4 + left;
2010 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
2011 Copy("(?", mg->mg_ptr, 2, char);
2012 Copy(reflags, mg->mg_ptr+2, left, char);
2013 Copy(":", mg->mg_ptr+left+2, 1, char);
2014 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
1bd3ad17
IZ
2015 mg->mg_ptr[mg->mg_len - 1] = ')';
2016 mg->mg_ptr[mg->mg_len] = 0;
2017 }
3280af22 2018 PL_reginterp_cnt += re->program[0].next_off;
1bd3ad17
IZ
2019 *lp = mg->mg_len;
2020 return mg->mg_ptr;
f9277f47
IZ
2021 }
2022 /* Fall through */
ed6116ce
LW
2023 case SVt_NULL:
2024 case SVt_IV:
2025 case SVt_NV:
2026 case SVt_RV:
2027 case SVt_PV:
2028 case SVt_PVIV:
2029 case SVt_PVNV:
f9277f47 2030 case SVt_PVBM: s = "SCALAR"; break;
ed6116ce
LW
2031 case SVt_PVLV: s = "LVALUE"; break;
2032 case SVt_PVAV: s = "ARRAY"; break;
2033 case SVt_PVHV: s = "HASH"; break;
2034 case SVt_PVCV: s = "CODE"; break;
2035 case SVt_PVGV: s = "GLOB"; break;
1d2dff63 2036 case SVt_PVFM: s = "FORMAT"; break;
36477c24 2037 case SVt_PVIO: s = "IO"; break;
ed6116ce
LW
2038 default: s = "UNKNOWN"; break;
2039 }
46fc3d4c 2040 tsv = NEWSV(0,0);
ed6116ce 2041 if (SvOBJECT(sv))
cea2e8a9 2042 Perl_sv_setpvf(aTHX_ tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
ed6116ce 2043 else
46fc3d4c 2044 sv_setpv(tsv, s);
57def98f 2045 Perl_sv_catpvf(aTHX_ tsv, "(0x%"UVxf")", PTR2UV(sv));
a0d0e21e 2046 goto tokensaveref;
463ee0b2 2047 }
ed6116ce
LW
2048 *lp = strlen(s);
2049 return s;
79072805 2050 }
0336b60e
IZ
2051 if (SvREADONLY(sv) && !SvOK(sv)) {
2052 dTHR;
2053 if (ckWARN(WARN_UNINITIALIZED))
1d7c1841 2054 report_uninit();
ed6116ce
LW
2055 *lp = 0;
2056 return "";
79072805 2057 }
79072805 2058 }
25da4f38
IZ
2059 if (SvNOKp(sv)) { /* See note in sv_2uv() */
2060 /* XXXX 64-bit? IV may have better precision... */
34d861e4
JH
2061 /* I tried changing this for to be 64-bit-aware and
2062 * the t/op/numconvert.t became very, very, angry.
2063 * --jhi Sep 1999 */
79072805
LW
2064 if (SvTYPE(sv) < SVt_PVNV)
2065 sv_upgrade(sv, SVt_PVNV);
2066 SvGROW(sv, 28);
463ee0b2 2067 s = SvPVX(sv);
79072805 2068 olderrno = errno; /* some Xenix systems wipe out errno here */
79072805 2069#ifdef apollo
463ee0b2 2070 if (SvNVX(sv) == 0.0)
79072805
LW
2071 (void)strcpy(s,"0");
2072 else
2073#endif /*apollo*/
bbce6d69 2074 {
2d4389e4 2075 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 2076 }
79072805 2077 errno = olderrno;
a0d0e21e
LW
2078#ifdef FIXNEGATIVEZERO
2079 if (*s == '-' && s[1] == '0' && !s[2])
2080 strcpy(s,"0");
2081#endif
79072805
LW
2082 while (*s) s++;
2083#ifdef hcx
2084 if (s[-1] == '.')
46fc3d4c 2085 *--s = '\0';
79072805
LW
2086#endif
2087 }
748a9306 2088 else if (SvIOKp(sv)) {
25da4f38 2089 U32 isIOK = SvIOK(sv);
0336b60e 2090 U32 isUIOK = SvIsUV(sv);
25da4f38
IZ
2091 char buf[TYPE_CHARS(UV)];
2092 char *ebuf, *ptr;
2093
79072805
LW
2094 if (SvTYPE(sv) < SVt_PVIV)
2095 sv_upgrade(sv, SVt_PVIV);
0336b60e 2096 if (isUIOK)
25da4f38 2097 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
0336b60e 2098 else
25da4f38 2099 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
0336b60e
IZ
2100 SvGROW(sv, ebuf - ptr + 1); /* inlined from sv_setpvn */
2101 Move(ptr,SvPVX(sv),ebuf - ptr,char);
2102 SvCUR_set(sv, ebuf - ptr);
46fc3d4c 2103 s = SvEND(sv);
0336b60e 2104 *s = '\0';
25da4f38 2105 if (isIOK)
64f14228
GA
2106 SvIOK_on(sv);
2107 else
2108 SvIOKp_on(sv);
0336b60e
IZ
2109 if (isUIOK)
2110 SvIsUV_on(sv);
2111 SvPOK_on(sv);
79072805
LW
2112 }
2113 else {
11343788 2114 dTHR;
0336b60e
IZ
2115 if (ckWARN(WARN_UNINITIALIZED)
2116 && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
2117 {
1d7c1841 2118 report_uninit();
0336b60e 2119 }
a0d0e21e 2120 *lp = 0;
25da4f38
IZ
2121 if (SvTYPE(sv) < SVt_PV)
2122 /* Typically the caller expects that sv_any is not NULL now. */
2123 sv_upgrade(sv, SVt_PV);
a0d0e21e 2124 return "";
79072805 2125 }
463ee0b2
LW
2126 *lp = s - SvPVX(sv);
2127 SvCUR_set(sv, *lp);
79072805 2128 SvPOK_on(sv);
1d7c1841
GS
2129 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
2130 PTR2UV(sv),SvPVX(sv)));
463ee0b2 2131 return SvPVX(sv);
a0d0e21e
LW
2132
2133 tokensave:
2134 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
2135 /* Sneaky stuff here */
2136
2137 tokensaveref:
46fc3d4c 2138 if (!tsv)
96827780 2139 tsv = newSVpv(tmpbuf, 0);
46fc3d4c 2140 sv_2mortal(tsv);
2141 *lp = SvCUR(tsv);
2142 return SvPVX(tsv);
a0d0e21e
LW
2143 }
2144 else {
2145 STRLEN len;
46fc3d4c 2146 char *t;
2147
2148 if (tsv) {
2149 sv_2mortal(tsv);
2150 t = SvPVX(tsv);
2151 len = SvCUR(tsv);
2152 }
2153 else {
96827780
MB
2154 t = tmpbuf;
2155 len = strlen(tmpbuf);
46fc3d4c 2156 }
a0d0e21e 2157#ifdef FIXNEGATIVEZERO
46fc3d4c 2158 if (len == 2 && t[0] == '-' && t[1] == '0') {
2159 t = "0";
2160 len = 1;
2161 }
a0d0e21e
LW
2162#endif
2163 (void)SvUPGRADE(sv, SVt_PV);
46fc3d4c 2164 *lp = len;
a0d0e21e
LW
2165 s = SvGROW(sv, len + 1);
2166 SvCUR_set(sv, len);
46fc3d4c 2167 (void)strcpy(s, t);
6bf554b4 2168 SvPOKp_on(sv);
a0d0e21e
LW
2169 return s;
2170 }
463ee0b2
LW
2171}
2172
7340a771
GS
2173char *
2174Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
2175{
2176 return sv_2pv_nolen(sv);
2177}
2178
2179char *
2180Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
2181{
2182 return sv_2pv(sv,lp);
2183}
2184
2185char *
2186Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
2187{
2188 return sv_2pv_nolen(sv);
2189}
2190
2191char *
2192Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
2193{
2194 return sv_2pv(sv,lp);
2195}
2196
463ee0b2
LW
2197/* This function is only called on magical items */
2198bool
864dbfa3 2199Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 2200{
8990e307 2201 if (SvGMAGICAL(sv))
463ee0b2
LW
2202 mg_get(sv);
2203
a0d0e21e
LW
2204 if (!SvOK(sv))
2205 return 0;
2206 if (SvROK(sv)) {
11343788 2207 dTHR;
a0d0e21e
LW
2208 SV* tmpsv;
2209 if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
9e7bc3e8 2210 return SvTRUE(tmpsv);
a0d0e21e
LW
2211 return SvRV(sv) != 0;
2212 }
463ee0b2 2213 if (SvPOKp(sv)) {
11343788
MB
2214 register XPV* Xpvtmp;
2215 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
2216 (*Xpvtmp->xpv_pv > '0' ||
2217 Xpvtmp->xpv_cur > 1 ||
2218 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
463ee0b2
LW
2219 return 1;
2220 else
2221 return 0;
2222 }
2223 else {
2224 if (SvIOKp(sv))
2225 return SvIVX(sv) != 0;
2226 else {
2227 if (SvNOKp(sv))
2228 return SvNVX(sv) != 0.0;
2229 else
2230 return FALSE;
2231 }
2232 }
79072805
LW
2233}
2234
2235/* Note: sv_setsv() should not be called with a source string that needs
463ee0b2 2236 * to be reused, since it may destroy the source string if it is marked
79072805
LW
2237 * as temporary.
2238 */
2239
954c1994
GS
2240/*
2241=for apidoc sv_setsv
2242
2243Copies the contents of the source SV C<ssv> into the destination SV C<dsv>.
2244The source SV may be destroyed if it is mortal. Does not handle 'set'
2245magic. See the macro forms C<SvSetSV>, C<SvSetSV_nosteal> and
2246C<sv_setsv_mg>.
2247
2248=cut
2249*/
2250
79072805 2251void
864dbfa3 2252Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
79072805 2253{
11343788 2254 dTHR;
8990e307
LW
2255 register U32 sflags;
2256 register int dtype;
2257 register int stype;
463ee0b2 2258
79072805
LW
2259 if (sstr == dstr)
2260 return;
2213622d 2261 SV_CHECK_THINKFIRST(dstr);
79072805 2262 if (!sstr)
3280af22 2263 sstr = &PL_sv_undef;
8990e307
LW
2264 stype = SvTYPE(sstr);
2265 dtype = SvTYPE(dstr);
79072805 2266
a0d0e21e 2267 SvAMAGIC_off(dstr);
9e7bc3e8 2268
463ee0b2 2269 /* There's a lot of redundancy below but we're going for speed here */
79072805 2270
8990e307 2271 switch (stype) {
79072805 2272 case SVt_NULL:
aece5585 2273 undef_sstr:
20408e3c
GS
2274 if (dtype != SVt_PVGV) {
2275 (void)SvOK_off(dstr);
2276 return;
2277 }
2278 break;
463ee0b2 2279 case SVt_IV:
aece5585
GA
2280 if (SvIOK(sstr)) {
2281 switch (dtype) {
2282 case SVt_NULL:
8990e307 2283 sv_upgrade(dstr, SVt_IV);
aece5585
GA
2284 break;
2285 case SVt_NV:
8990e307 2286 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
2287 break;
2288 case SVt_RV:
2289 case SVt_PV:
a0d0e21e 2290 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
2291 break;
2292 }
2293 (void)SvIOK_only(dstr);
2294 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2295 if (SvIsUV(sstr))
2296 SvIsUV_on(dstr);
aece5585
GA
2297 SvTAINT(dstr);
2298 return;
8990e307 2299 }
aece5585
GA
2300 goto undef_sstr;
2301
463ee0b2 2302 case SVt_NV:
aece5585
GA
2303 if (SvNOK(sstr)) {
2304 switch (dtype) {
2305 case SVt_NULL:
2306 case SVt_IV:
8990e307 2307 sv_upgrade(dstr, SVt_NV);
aece5585
GA
2308 break;
2309 case SVt_RV:
2310 case SVt_PV:
2311 case SVt_PVIV:
a0d0e21e 2312 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
2313 break;
2314 }
2315 SvNVX(dstr) = SvNVX(sstr);
2316 (void)SvNOK_only(dstr);
2317 SvTAINT(dstr);
2318 return;
8990e307 2319 }
aece5585
GA
2320 goto undef_sstr;
2321
ed6116ce 2322 case SVt_RV:
8990e307 2323 if (dtype < SVt_RV)
ed6116ce 2324 sv_upgrade(dstr, SVt_RV);
c07a80fd 2325 else if (dtype == SVt_PVGV &&
2326 SvTYPE(SvRV(sstr)) == SVt_PVGV) {
2327 sstr = SvRV(sstr);
a5f75d66 2328 if (sstr == dstr) {
1d7c1841
GS
2329 if (GvIMPORTED(dstr) != GVf_IMPORTED
2330 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2331 {
a5f75d66 2332 GvIMPORTED_on(dstr);
1d7c1841 2333 }
a5f75d66
AD
2334 GvMULTI_on(dstr);
2335 return;
2336 }
c07a80fd 2337 goto glob_assign;
2338 }
ed6116ce 2339 break;
463ee0b2 2340 case SVt_PV:
fc36a67e 2341 case SVt_PVFM:
8990e307 2342 if (dtype < SVt_PV)
463ee0b2 2343 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
2344 break;
2345 case SVt_PVIV:
8990e307 2346 if (dtype < SVt_PVIV)
463ee0b2 2347 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
2348 break;
2349 case SVt_PVNV:
8990e307 2350 if (dtype < SVt_PVNV)
463ee0b2 2351 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 2352 break;
4633a7c4
LW
2353 case SVt_PVAV:
2354 case SVt_PVHV:
2355 case SVt_PVCV:
4633a7c4 2356 case SVt_PVIO:
533c011a 2357 if (PL_op)
cea2e8a9 2358 Perl_croak(aTHX_ "Bizarre copy of %s in %s", sv_reftype(sstr, 0),
22c35a8c 2359 PL_op_name[PL_op->op_type]);
4633a7c4 2360 else
cea2e8a9 2361 Perl_croak(aTHX_ "Bizarre copy of %s", sv_reftype(sstr, 0));
4633a7c4
LW
2362 break;
2363
79072805 2364 case SVt_PVGV:
8990e307 2365 if (dtype <= SVt_PVGV) {
c07a80fd 2366 glob_assign:
a5f75d66 2367 if (dtype != SVt_PVGV) {
a0d0e21e
LW
2368 char *name = GvNAME(sstr);
2369 STRLEN len = GvNAMELEN(sstr);
463ee0b2 2370 sv_upgrade(dstr, SVt_PVGV);
a0d0e21e 2371 sv_magic(dstr, dstr, '*', name, len);
85aff577 2372 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
2373 GvNAME(dstr) = savepvn(name, len);
2374 GvNAMELEN(dstr) = len;
2375 SvFAKE_on(dstr); /* can coerce to non-glob */
2376 }
7bac28a0 2377 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
2378 else if (PL_curstackinfo->si_type == PERLSI_SORT
2379 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
cea2e8a9 2380 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
7bac28a0 2381 GvNAME(dstr));
a0d0e21e 2382 (void)SvOK_off(dstr);
a5f75d66 2383 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 2384 gp_free((GV*)dstr);
79072805 2385 GvGP(dstr) = gp_ref(GvGP(sstr));
8990e307 2386 SvTAINT(dstr);
1d7c1841
GS
2387 if (GvIMPORTED(dstr) != GVf_IMPORTED
2388 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2389 {
a5f75d66 2390 GvIMPORTED_on(dstr);
1d7c1841 2391 }
a5f75d66 2392 GvMULTI_on(dstr);
79072805
LW
2393 return;
2394 }
2395 /* FALL THROUGH */
2396
2397 default:
973f89ab
CS
2398 if (SvGMAGICAL(sstr)) {
2399 mg_get(sstr);
2400 if (SvTYPE(sstr) != stype) {
2401 stype = SvTYPE(sstr);
2402 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
2403 goto glob_assign;
2404 }
2405 }
ded42b9f 2406 if (stype == SVt_PVLV)
6fc92669 2407 (void)SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 2408 else
6fc92669 2409 (void)SvUPGRADE(dstr, stype);
79072805
LW
2410 }
2411
8990e307
LW
2412 sflags = SvFLAGS(sstr);
2413
2414 if (sflags & SVf_ROK) {
2415 if (dtype >= SVt_PV) {
2416 if (dtype == SVt_PVGV) {
2417 SV *sref = SvREFCNT_inc(SvRV(sstr));
2418 SV *dref = 0;
a5f75d66 2419 int intro = GvINTRO(dstr);
a0d0e21e
LW
2420
2421 if (intro) {
2422 GP *gp;
1d7c1841 2423 gp_free((GV*)dstr);
a5f75d66 2424 GvINTRO_off(dstr); /* one-shot flag */
a0d0e21e 2425 Newz(602,gp, 1, GP);
44a8e56a 2426 GvGP(dstr) = gp_ref(gp);
a0d0e21e 2427 GvSV(dstr) = NEWSV(72,0);
1d7c1841 2428 GvLINE(dstr) = CopLINE(PL_curcop);
1edc1566 2429 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 2430 }
a5f75d66 2431 GvMULTI_on(dstr);
8990e307
LW
2432 switch (SvTYPE(sref)) {
2433 case SVt_PVAV:
a0d0e21e
LW
2434 if (intro)
2435 SAVESPTR(GvAV(dstr));
2436 else
2437 dref = (SV*)GvAV(dstr);
8990e307 2438 GvAV(dstr) = (AV*)sref;
1d7c1841
GS
2439 if (GvIMPORTED_AV_off(dstr)
2440 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2441 {
a5f75d66 2442 GvIMPORTED_AV_on(dstr);
1d7c1841 2443 }
8990e307
LW
2444 break;
2445 case SVt_PVHV:
a0d0e21e
LW
2446 if (intro)
2447 SAVESPTR(GvHV(dstr));
2448 else
2449 dref = (SV*)GvHV(dstr);
8990e307 2450 GvHV(dstr) = (HV*)sref;
1d7c1841
GS
2451 if (GvIMPORTED_HV_off(dstr)
2452 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2453 {
a5f75d66 2454 GvIMPORTED_HV_on(dstr);
1d7c1841 2455 }
8990e307
LW
2456 break;
2457 case SVt_PVCV:
8ebc5c01 2458 if (intro) {
2459 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
2460 SvREFCNT_dec(GvCV(dstr));
2461 GvCV(dstr) = Nullcv;
68dc0745 2462 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 2463 PL_sub_generation++;
8ebc5c01 2464 }
a0d0e21e 2465 SAVESPTR(GvCV(dstr));
8ebc5c01 2466 }
68dc0745 2467 else
2468 dref = (SV*)GvCV(dstr);
2469 if (GvCV(dstr) != (CV*)sref) {
748a9306 2470 CV* cv = GvCV(dstr);
4633a7c4 2471 if (cv) {
68dc0745 2472 if (!GvCVGEN((GV*)dstr) &&
2473 (CvROOT(cv) || CvXSUB(cv)))
2474 {
fe5e78ed
GS
2475 SV *const_sv = cv_const_sv(cv);
2476 bool const_changed = TRUE;
2477 if(const_sv)
2478 const_changed = sv_cmp(const_sv,
2479 op_const_sv(CvSTART((CV*)sref),
2480 Nullcv));
7bac28a0 2481 /* ahem, death to those who redefine
2482 * active sort subs */
3280af22
NIS
2483 if (PL_curstackinfo->si_type == PERLSI_SORT &&
2484 PL_sortcop == CvSTART(cv))
cea2e8a9 2485 Perl_croak(aTHX_
7bac28a0 2486 "Can't redefine active sort subroutine %s",
2487 GvENAME((GV*)dstr));
599cee73 2488 if (ckWARN(WARN_REDEFINE) || (const_changed && const_sv)) {
2f34f9d4
IZ
2489 if (!(CvGV(cv) && GvSTASH(CvGV(cv))
2490 && HvNAME(GvSTASH(CvGV(cv)))
2491 && strEQ(HvNAME(GvSTASH(CvGV(cv))),
2492 "autouse")))
cea2e8a9 2493 Perl_warner(aTHX_ WARN_REDEFINE, const_sv ?
fe5e78ed
GS
2494 "Constant subroutine %s redefined"
2495 : "Subroutine %s redefined",
2f34f9d4
IZ
2496 GvENAME((GV*)dstr));
2497 }
9607fc9c 2498 }
3fe9a6f1 2499 cv_ckproto(cv, (GV*)dstr,
2500 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 2501 }
a5f75d66 2502 GvCV(dstr) = (CV*)sref;
7a4c00b4 2503 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 2504 GvASSUMECV_on(dstr);
3280af22 2505 PL_sub_generation++;
a5f75d66 2506 }
1d7c1841
GS
2507 if (GvIMPORTED_CV_off(dstr)
2508 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2509 {
a5f75d66 2510 GvIMPORTED_CV_on(dstr);
1d7c1841 2511 }
8990e307 2512 break;
91bba347
LW
2513 case SVt_PVIO:
2514 if (intro)
2515 SAVESPTR(GvIOp(dstr));
2516 else
2517 dref = (SV*)GvIOp(dstr);
2518 GvIOp(dstr) = (IO*)sref;
2519 break;
8990e307 2520 default:
a0d0e21e
LW
2521 if (intro)
2522 SAVESPTR(GvSV(dstr));
2523 else
2524 dref = (SV*)GvSV(dstr);
8990e307 2525 GvSV(dstr) = sref;
1d7c1841
GS
2526 if (GvIMPORTED_SV_off(dstr)
2527 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2528 {
a5f75d66 2529 GvIMPORTED_SV_on(dstr);
1d7c1841 2530 }
8990e307
LW
2531 break;
2532 }
2533 if (dref)
2534 SvREFCNT_dec(dref);
a0d0e21e
LW
2535 if (intro)
2536 SAVEFREESV(sref);
8990e307
LW
2537 SvTAINT(dstr);
2538 return;
2539 }
a0d0e21e 2540 if (SvPVX(dstr)) {
760ac839 2541 (void)SvOOK_off(dstr); /* backoff */
50483b2c
JD
2542 if (SvLEN(dstr))
2543 Safefree(SvPVX(dstr));
a0d0e21e
LW
2544 SvLEN(dstr)=SvCUR(dstr)=0;
2545 }
8990e307 2546 }
a0d0e21e 2547 (void)SvOK_off(dstr);
8990e307 2548 SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
ed6116ce 2549 SvROK_on(dstr);
8990e307 2550 if (sflags & SVp_NOK) {
ed6116ce
LW
2551 SvNOK_on(dstr);
2552 SvNVX(dstr) = SvNVX(sstr);
2553 }
8990e307 2554 if (sflags & SVp_IOK) {
a0d0e21e 2555 (void)SvIOK_on(dstr);
ed6116ce 2556 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2557 if (SvIsUV(sstr))
2558 SvIsUV_on(dstr);
ed6116ce 2559 }
a0d0e21e
LW
2560 if (SvAMAGIC(sstr)) {
2561 SvAMAGIC_on(dstr);
2562 }
ed6116ce 2563 }
8990e307 2564 else if (sflags & SVp_POK) {
79072805
LW
2565
2566 /*
2567 * Check to see if we can just swipe the string. If so, it's a
2568 * possible small lose on short strings, but a big win on long ones.
463ee0b2
LW
2569 * It might even be a win on short strings if SvPVX(dstr)
2570 * has to be allocated and SvPVX(sstr) has to be freed.
79072805
LW
2571 */
2572
ff68c719 2573 if (SvTEMP(sstr) && /* slated for free anyway? */
01b73108 2574 SvREFCNT(sstr) == 1 && /* and no other references to it? */
a5f75d66
AD
2575 !(sflags & SVf_OOK)) /* and not involved in OOK hack? */
2576 {
adbc6bb1 2577 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
2578 if (SvOOK(dstr)) {
2579 SvFLAGS(dstr) &= ~SVf_OOK;
2580 Safefree(SvPVX(dstr) - SvIVX(dstr));
2581 }
50483b2c 2582 else if (SvLEN(dstr))
a5f75d66 2583 Safefree(SvPVX(dstr));
79072805 2584 }
a5f75d66 2585 (void)SvPOK_only(dstr);
463ee0b2 2586 SvPV_set(dstr, SvPVX(sstr));
79072805
LW
2587 SvLEN_set(dstr, SvLEN(sstr));
2588 SvCUR_set(dstr, SvCUR(sstr));
79072805 2589 SvTEMP_off(dstr);
a5f75d66 2590 (void)SvOK_off(sstr);
79072805
LW
2591 SvPV_set(sstr, Nullch);
2592 SvLEN_set(sstr, 0);
a5f75d66
AD
2593 SvCUR_set(sstr, 0);
2594 SvTEMP_off(sstr);
79072805
LW
2595 }
2596 else { /* have to copy actual string */
8990e307
LW
2597 STRLEN len = SvCUR(sstr);
2598
2599 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
2600 Move(SvPVX(sstr),SvPVX(dstr),len,char);
2601 SvCUR_set(dstr, len);
2602 *SvEND(dstr) = '\0';
a0d0e21e 2603 (void)SvPOK_only(dstr);
79072805 2604 }
7e2040f0 2605 if (DO_UTF8(sstr))
a7cb1f99 2606 SvUTF8_on(dstr);
79072805 2607 /*SUPPRESS 560*/
8990e307 2608 if (sflags & SVp_NOK) {
79072805 2609 SvNOK_on(dstr);
463ee0b2 2610 SvNVX(dstr) = SvNVX(sstr);
79072805 2611 }
8990e307 2612 if (sflags & SVp_IOK) {
a0d0e21e 2613 (void)SvIOK_on(dstr);
463ee0b2 2614 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2615 if (SvIsUV(sstr))
2616 SvIsUV_on(dstr);
79072805
LW
2617 }
2618 }
8990e307 2619 else if (sflags & SVp_NOK) {
463ee0b2 2620 SvNVX(dstr) = SvNVX(sstr);
a0d0e21e 2621 (void)SvNOK_only(dstr);
79072805 2622 if (SvIOK(sstr)) {
a0d0e21e 2623 (void)SvIOK_on(dstr);
463ee0b2 2624 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2625 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2626 if (SvIsUV(sstr))
2627 SvIsUV_on(dstr);
79072805
LW
2628 }
2629 }
8990e307 2630 else if (sflags & SVp_IOK) {
a0d0e21e 2631 (void)SvIOK_only(dstr);
463ee0b2 2632 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2633 if (SvIsUV(sstr))
2634 SvIsUV_on(dstr);
79072805
LW
2635 }
2636 else {
20408e3c 2637 if (dtype == SVt_PVGV) {
599cee73 2638 if (ckWARN(WARN_UNSAFE))
cea2e8a9 2639 Perl_warner(aTHX_ WARN_UNSAFE, "Undefined value assigned to typeglob");
20408e3c
GS
2640 }
2641 else
2642 (void)SvOK_off(dstr);
a0d0e21e 2643 }
463ee0b2 2644 SvTAINT(dstr);
79072805
LW
2645}
2646
954c1994
GS
2647/*
2648=for apidoc sv_setsv_mg
2649
2650Like C<sv_setsv>, but also handles 'set' magic.
2651
2652=cut
2653*/
2654
79072805 2655void
864dbfa3 2656Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
2657{
2658 sv_setsv(dstr,sstr);
2659 SvSETMAGIC(dstr);
2660}
2661
954c1994
GS
2662/*
2663=for apidoc sv_setpvn
2664
2665Copies a string into an SV. The C<len> parameter indicates the number of
2666bytes to be copied. Does not handle 'set' magic. See C<sv_setpvn_mg>.
2667
2668=cut
2669*/
2670
ef50df4b 2671void
864dbfa3 2672Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 2673{
c6f8c383 2674 register char *dptr;
4561caa4
CS
2675 assert(len >= 0); /* STRLEN is probably unsigned, so this may
2676 elicit a warning, but it won't hurt. */
2213622d 2677 SV_CHECK_THINKFIRST(sv);
463ee0b2 2678 if (!ptr) {
a0d0e21e 2679 (void)SvOK_off(sv);
463ee0b2
LW
2680 return;
2681 }
6fc92669 2682 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 2683
79072805 2684 SvGROW(sv, len + 1);
c6f8c383
GA
2685 dptr = SvPVX(sv);
2686 Move(ptr,dptr,len,char);
2687 dptr[len] = '\0';
79072805 2688 SvCUR_set(sv, len);
a0d0e21e 2689 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2690 SvTAINT(sv);
79072805
LW
2691}
2692
954c1994
GS
2693/*
2694=for apidoc sv_setpvn_mg
2695
2696Like C<sv_setpvn>, but also handles 'set' magic.
2697
2698=cut
2699*/
2700
79072805 2701void
864dbfa3 2702Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
2703{
2704 sv_setpvn(sv,ptr,len);
2705 SvSETMAGIC(sv);
2706}
2707
954c1994
GS
2708/*
2709=for apidoc sv_setpv
2710
2711Copies a string into an SV. The string must be null-terminated. Does not
2712handle 'set' magic. See C<sv_setpv_mg>.
2713
2714=cut
2715*/
2716
ef50df4b 2717void
864dbfa3 2718Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
2719{
2720 register STRLEN len;
2721
2213622d 2722 SV_CHECK_THINKFIRST(sv);
463ee0b2 2723 if (!ptr) {
a0d0e21e 2724 (void)SvOK_off(sv);
463ee0b2
LW
2725 return;
2726 }
79072805 2727 len = strlen(ptr);
6fc92669 2728 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 2729
79072805 2730 SvGROW(sv, len + 1);
463ee0b2 2731 Move(ptr,SvPVX(sv),len+1,char);
79072805 2732 SvCUR_set(sv, len);
a0d0e21e 2733 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2
LW
2734 SvTAINT(sv);
2735}
2736
954c1994
GS
2737/*
2738=for apidoc sv_setpv_mg
2739
2740Like C<sv_setpv>, but also handles 'set' magic.
2741
2742=cut
2743*/
2744
463ee0b2 2745void
864dbfa3 2746Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
2747{
2748 sv_setpv(sv,ptr);
2749 SvSETMAGIC(sv);
2750}
2751
954c1994
GS
2752/*
2753=for apidoc sv_usepvn
2754
2755Tells an SV to use C<ptr> to find its string value. Normally the string is
2756stored inside the SV but sv_usepvn allows the SV to use an outside string.
2757The C<ptr> should point to memory that was allocated by C<malloc>. The
2758string length, C<len>, must be supplied. This function will realloc the
2759memory pointed to by C<ptr>, so that pointer should not be freed or used by
2760the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
2761See C<sv_usepvn_mg>.
2762
2763=cut
2764*/
2765
ef50df4b 2766void
864dbfa3 2767Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 2768{
2213622d 2769 SV_CHECK_THINKFIRST(sv);
c6f8c383 2770 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 2771 if (!ptr) {
a0d0e21e 2772 (void)SvOK_off(sv);
463ee0b2
LW
2773 return;
2774 }
a0ed51b3 2775 (void)SvOOK_off(sv);
50483b2c 2776 if (SvPVX(sv) && SvLEN(sv))
463ee0b2
LW
2777 Safefree(SvPVX(sv));
2778 Renew(ptr, len+1, char);
2779 SvPVX(sv) = ptr;
2780 SvCUR_set(sv, len);
2781 SvLEN_set(sv, len+1);
2782 *SvEND(sv) = '\0';
a0d0e21e 2783 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2784 SvTAINT(sv);
79072805
LW
2785}
2786
954c1994
GS
2787/*
2788=for apidoc sv_usepvn_mg
2789
2790Like C<sv_usepvn>, but also handles 'set' magic.
2791
2792=cut
2793*/
2794
ef50df4b 2795void
864dbfa3 2796Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 2797{
51c1089b 2798 sv_usepvn(sv,ptr,len);
ef50df4b
GS
2799 SvSETMAGIC(sv);
2800}
2801
6fc92669 2802void
864dbfa3 2803Perl_sv_force_normal(pTHX_ register SV *sv)
0f15f207 2804{
2213622d
GA
2805 if (SvREADONLY(sv)) {
2806 dTHR;
3280af22 2807 if (PL_curcop != &PL_compiling)
cea2e8a9 2808 Perl_croak(aTHX_ PL_no_modify);
0f15f207 2809 }
2213622d
GA
2810 if (SvROK(sv))
2811 sv_unref(sv);
6fc92669
GS
2812 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
2813 sv_unglob(sv);
0f15f207
MB
2814}
2815
954c1994
GS
2816/*
2817=for apidoc sv_chop
2818
2819Efficient removal of characters from the beginning of the string buffer.
2820SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
2821the string buffer. The C<ptr> becomes the first character of the adjusted
2822string.
2823
2824=cut
2825*/
2826
79072805 2827void
864dbfa3 2828Perl_sv_chop(pTHX_ register SV *sv, register char *ptr) /* like set but assuming ptr is in sv */
8ac85365
NIS
2829
2830
79072805
LW
2831{
2832 register STRLEN delta;
2833
a0d0e21e 2834 if (!ptr || !SvPOKp(sv))
79072805 2835 return;
2213622d 2836 SV_CHECK_THINKFIRST(sv);
79072805
LW
2837 if (SvTYPE(sv) < SVt_PVIV)
2838 sv_upgrade(sv,SVt_PVIV);
2839
2840 if (!SvOOK(sv)) {
50483b2c
JD
2841 if (!SvLEN(sv)) { /* make copy of shared string */
2842 char *pvx = SvPVX(sv);
2843 STRLEN len = SvCUR(sv);
2844 SvGROW(sv, len + 1);
2845 Move(pvx,SvPVX(sv),len,char);
2846 *SvEND(sv) = '\0';
2847 }
463ee0b2 2848 SvIVX(sv) = 0;
79072805
LW
2849 SvFLAGS(sv) |= SVf_OOK;
2850 }
25da4f38 2851 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK|SVf_IVisUV);
463ee0b2 2852 delta = ptr - SvPVX(sv);
79072805
LW
2853 SvLEN(sv) -= delta;
2854 SvCUR(sv) -= delta;
463ee0b2
LW
2855 SvPVX(sv) += delta;
2856 SvIVX(sv) += delta;
79072805
LW
2857}
2858
954c1994
GS
2859/*
2860=for apidoc sv_catpvn
2861
2862Concatenates the string onto the end of the string which is in the SV. The
2863C<len> indicates number of bytes to copy. Handles 'get' magic, but not
2864'set' magic. See C<sv_catpvn_mg>.
2865
2866=cut
2867*/
2868
79072805 2869void
864dbfa3 2870Perl_sv_catpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 2871{
463ee0b2 2872 STRLEN tlen;
748a9306 2873 char *junk;
a0d0e21e 2874
748a9306 2875 junk = SvPV_force(sv, tlen);
463ee0b2 2876 SvGROW(sv, tlen + len + 1);
4633a7c4
LW
2877 if (ptr == junk)
2878 ptr = SvPVX(sv);
463ee0b2 2879 Move(ptr,SvPVX(sv)+tlen,len,char);
79072805
LW
2880 SvCUR(sv) += len;
2881 *SvEND(sv) = '\0';
d41ff1b8 2882 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 2883 SvTAINT(sv);
79072805
LW
2884}
2885
954c1994
GS
2886/*
2887=for apidoc sv_catpvn_mg
2888
2889Like C<sv_catpvn>, but also handles 'set' magic.
2890
2891=cut
2892*/
2893
79072805 2894void
864dbfa3 2895Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
2896{
2897 sv_catpvn(sv,ptr,len);
2898 SvSETMAGIC(sv);
2899}
2900
954c1994
GS
2901/*
2902=for apidoc sv_catsv
2903
2904Concatenates the string from SV C<ssv> onto the end of the string in SV
2905C<dsv>. Handles 'get' magic, but not 'set' magic. See C<sv_catsv_mg>.
2906
2907=cut
2908*/
2909
ef50df4b 2910void
864dbfa3 2911Perl_sv_catsv(pTHX_ SV *dstr, register SV *sstr)
79072805
LW
2912{
2913 char *s;
463ee0b2 2914 STRLEN len;
79072805
LW
2915 if (!sstr)
2916 return;
463ee0b2
LW
2917 if (s = SvPV(sstr, len))
2918 sv_catpvn(dstr,s,len);
d41ff1b8
GS
2919 if (SvUTF8(sstr))
2920 SvUTF8_on(dstr);
79072805
LW
2921}
2922
954c1994
GS
2923/*
2924=for apidoc sv_catsv_mg
2925
2926Like C<sv_catsv>, but also handles 'set' magic.
2927
2928=cut
2929*/
2930
79072805 2931void
864dbfa3 2932Perl_sv_catsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
2933{
2934 sv_catsv(dstr,sstr);
2935 SvSETMAGIC(dstr);
2936}
2937
954c1994
GS
2938/*
2939=for apidoc sv_catpv
2940
2941Concatenates the string onto the end of the string which is in the SV.
2942Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
2943
2944=cut
2945*/
2946
ef50df4b 2947void
864dbfa3 2948Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
2949{
2950 register STRLEN len;
463ee0b2 2951 STRLEN tlen;
748a9306 2952 char *junk;
79072805 2953
79072805
LW
2954 if (!ptr)
2955 return;
748a9306 2956 junk = SvPV_force(sv, tlen);
79072805 2957 len = strlen(ptr);
463ee0b2 2958 SvGROW(sv, tlen + len + 1);
4633a7c4
LW
2959 if (ptr == junk)
2960 ptr = SvPVX(sv);
463ee0b2 2961 Move(ptr,SvPVX(sv)+tlen,len+1,char);
79072805 2962 SvCUR(sv) += len;
d41ff1b8 2963 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 2964 SvTAINT(sv);
79072805
LW
2965}
2966
954c1994
GS
2967/*
2968=for apidoc sv_catpv_mg
2969
2970Like C<sv_catpv>, but also handles 'set' magic.
2971
2972=cut
2973*/
2974
ef50df4b 2975void
864dbfa3 2976Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 2977{
51c1089b 2978 sv_catpv(sv,ptr);
ef50df4b
GS
2979 SvSETMAGIC(sv);
2980}
2981
79072805 2982SV *
864dbfa3 2983Perl_newSV(pTHX_ STRLEN len)
79072805
LW
2984{
2985 register SV *sv;
2986
4561caa4 2987 new_SV(sv);
79072805
LW
2988 if (len) {
2989 sv_upgrade(sv, SVt_PV);
2990 SvGROW(sv, len + 1);
2991 }
2992 return sv;
2993}
2994
1edc1566 2995/* name is assumed to contain an SV* if (name && namelen == HEf_SVKEY) */
2996
954c1994
GS
2997/*
2998=for apidoc sv_magic
2999
3000Adds magic to an SV.
3001
3002=cut
3003*/
3004
79072805 3005void
864dbfa3 3006Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
79072805
LW
3007{
3008 MAGIC* mg;
3009
0f15f207
MB
3010 if (SvREADONLY(sv)) {
3011 dTHR;
3280af22 3012 if (PL_curcop != &PL_compiling && !strchr("gBf", how))
cea2e8a9 3013 Perl_croak(aTHX_ PL_no_modify);
0f15f207 3014 }
4633a7c4 3015 if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
748a9306
LW
3016 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
3017 if (how == 't')
565764a8 3018 mg->mg_len |= 1;
463ee0b2 3019 return;
748a9306 3020 }
463ee0b2
LW
3021 }
3022 else {
c6f8c383 3023 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 3024 }
79072805
LW
3025 Newz(702,mg, 1, MAGIC);
3026 mg->mg_moremagic = SvMAGIC(sv);
463ee0b2 3027
79072805 3028 SvMAGIC(sv) = mg;
c277df42 3029 if (!obj || obj == sv || how == '#' || how == 'r')
8990e307 3030 mg->mg_obj = obj;
85e6fe83 3031 else {
11343788 3032 dTHR;
8990e307 3033 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
3034 mg->mg_flags |= MGf_REFCOUNTED;
3035 }
79072805 3036 mg->mg_type = how;
565764a8 3037 mg->mg_len = namlen;
1edc1566 3038 if (name)
3039 if (namlen >= 0)
3040 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 3041 else if (namlen == HEf_SVKEY)
1edc1566 3042 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
3043
79072805
LW
3044 switch (how) {
3045 case 0:
22c35a8c 3046 mg->mg_virtual = &PL_vtbl_sv;
79072805 3047 break;
a0d0e21e 3048 case 'A':
22c35a8c 3049 mg->mg_virtual = &PL_vtbl_amagic;
a0d0e21e
LW
3050 break;
3051 case 'a':
22c35a8c 3052 mg->mg_virtual = &PL_vtbl_amagicelem;
a0d0e21e
LW
3053 break;
3054 case 'c':
3055 mg->mg_virtual = 0;
3056 break;
79072805 3057 case 'B':
22c35a8c 3058 mg->mg_virtual = &PL_vtbl_bm;
79072805 3059 break;
6cef1e77 3060 case 'D':
22c35a8c 3061 mg->mg_virtual = &PL_vtbl_regdata;
6cef1e77
IZ
3062 break;
3063 case 'd':
22c35a8c 3064 mg->mg_virtual = &PL_vtbl_regdatum;
6cef1e77 3065 break;
79072805 3066 case 'E':
22c35a8c 3067 mg->mg_virtual = &PL_vtbl_env;
79072805 3068 break;
55497cff 3069 case 'f':
22c35a8c 3070 mg->mg_virtual = &PL_vtbl_fm;
55497cff 3071 break;
79072805 3072 case 'e':
22c35a8c 3073 mg->mg_virtual = &PL_vtbl_envelem;
79072805 3074 break;
93a17b20 3075 case 'g':
22c35a8c 3076 mg->mg_virtual = &PL_vtbl_mglob;
93a17b20 3077 break;
463ee0b2 3078 case 'I':
22c35a8c 3079 mg->mg_virtual = &PL_vtbl_isa;
463ee0b2
LW
3080 break;
3081 case 'i':
22c35a8c 3082 mg->mg_virtual = &PL_vtbl_isaelem;
463ee0b2 3083 break;
16660edb 3084 case 'k':
22c35a8c 3085 mg->mg_virtual = &PL_vtbl_nkeys;
16660edb 3086 break;
79072805 3087 case 'L':
a0d0e21e 3088 SvRMAGICAL_on(sv);
93a17b20
LW
3089 mg->mg_virtual = 0;
3090 break;
3091 case 'l':
22c35a8c 3092 mg->mg_virtual = &PL_vtbl_dbline;
79072805 3093 break;
f93b4edd
MB
3094#ifdef USE_THREADS
3095 case 'm':
22c35a8c 3096 mg->mg_virtual = &PL_vtbl_mutex;
f93b4edd
MB
3097 break;
3098#endif /* USE_THREADS */
36477c24 3099#ifdef USE_LOCALE_COLLATE
bbce6d69 3100 case 'o':
22c35a8c 3101 mg->mg_virtual = &PL_vtbl_collxfrm;
bbce6d69 3102 break;
36477c24 3103#endif /* USE_LOCALE_COLLATE */
463ee0b2 3104 case 'P':
22c35a8c 3105 mg->mg_virtual = &PL_vtbl_pack;
463ee0b2
LW
3106 break;
3107 case 'p':
a0d0e21e 3108 case 'q':
22c35a8c 3109 mg->mg_virtual = &PL_vtbl_packelem;
463ee0b2 3110 break;
c277df42 3111 case 'r':
22c35a8c 3112 mg->mg_virtual = &PL_vtbl_regexp;
c277df42 3113 break;
79072805 3114 case 'S':
22c35a8c 3115 mg->mg_virtual = &PL_vtbl_sig;
79072805
LW
3116 break;
3117 case 's':
22c35a8c 3118 mg->mg_virtual = &PL_vtbl_sigelem;
79072805 3119 break;
463ee0b2 3120 case 't':
22c35a8c 3121 mg->mg_virtual = &PL_vtbl_taint;
565764a8 3122 mg->mg_len = 1;
463ee0b2 3123 break;
79072805 3124 case 'U':
22c35a8c 3125 mg->mg_virtual = &PL_vtbl_uvar;
79072805
LW
3126 break;
3127 case 'v':
22c35a8c 3128 mg->mg_virtual = &PL_vtbl_vec;
79072805
LW
3129 break;
3130 case 'x':
22c35a8c 3131 mg->mg_virtual = &PL_vtbl_substr;
79072805 3132 break;
5f05dabc 3133 case 'y':
22c35a8c 3134 mg->mg_virtual = &PL_vtbl_defelem;
5f05dabc 3135 break;
79072805 3136 case '*':
22c35a8c 3137 mg->mg_virtual = &PL_vtbl_glob;
79072805
LW
3138 break;
3139 case '#':
22c35a8c 3140 mg->mg_virtual = &PL_vtbl_arylen;
79072805 3141 break;
a0d0e21e 3142 case '.':
22c35a8c 3143 mg->mg_virtual = &PL_vtbl_pos;
a0d0e21e 3144 break;
810b8aa5
GS
3145 case '<':
3146 mg->mg_virtual = &PL_vtbl_backref;
3147 break;
4633a7c4
LW
3148 case '~': /* Reserved for use by extensions not perl internals. */
3149 /* Useful for attaching extension internal data to perl vars. */
3150 /* Note that multiple extensions may clash if magical scalars */
3151 /* etc holding private data from one are passed to another. */
3152 SvRMAGICAL_on(sv);
a0d0e21e 3153 break;
79072805 3154 default:
cea2e8a9 3155 Perl_croak(aTHX_ "Don't know how to handle magic of type '%c'", how);
463ee0b2 3156 }
8990e307
LW
3157 mg_magical(sv);
3158 if (SvGMAGICAL(sv))
3159 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
463ee0b2
LW
3160}
3161
3162int
864dbfa3 3163Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
3164{
3165 MAGIC* mg;
3166 MAGIC** mgp;
91bba347 3167 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
3168 return 0;
3169 mgp = &SvMAGIC(sv);
3170 for (mg = *mgp; mg; mg = *mgp) {
3171 if (mg->mg_type == type) {
3172 MGVTBL* vtbl = mg->mg_virtual;
3173 *mgp = mg->mg_moremagic;
1d7c1841 3174 if (vtbl && vtbl->svt_free)
fc0dc3b3 3175 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
463ee0b2 3176 if (mg->mg_ptr && mg->mg_type != 'g')
565764a8 3177 if (mg->mg_len >= 0)
1edc1566 3178 Safefree(mg->mg_ptr);
565764a8 3179 else if (mg->mg_len == HEf_SVKEY)
1edc1566 3180 SvREFCNT_dec((SV*)mg->mg_ptr);
a0d0e21e
LW
3181 if (mg->mg_flags & MGf_REFCOUNTED)
3182 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
3183 Safefree(mg);
3184 }
3185 else
3186 mgp = &mg->mg_moremagic;
79072805 3187 }
91bba347 3188 if (!SvMAGIC(sv)) {
463ee0b2 3189 SvMAGICAL_off(sv);
8990e307 3190 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
3191 }
3192
3193 return 0;
79072805
LW
3194}
3195
810b8aa5 3196SV *
864dbfa3 3197Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
3198{
3199 SV *tsv;
3200 if (!SvOK(sv)) /* let undefs pass */
3201 return sv;
3202 if (!SvROK(sv))
cea2e8a9 3203 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5
GS
3204 else if (SvWEAKREF(sv)) {
3205 dTHR;
3206 if (ckWARN(WARN_MISC))
cea2e8a9 3207 Perl_warner(aTHX_ WARN_MISC, "Reference is already weak");
810b8aa5
GS
3208 return sv;
3209 }
3210 tsv = SvRV(sv);
3211 sv_add_backref(tsv, sv);
3212 SvWEAKREF_on(sv);
3213 SvREFCNT_dec(tsv);
3214 return sv;
3215}
3216
3217STATIC void
cea2e8a9 3218S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
3219{
3220 AV *av;
3221 MAGIC *mg;
3222 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, '<')))
3223 av = (AV*)mg->mg_obj;
3224 else {
3225 av = newAV();
3226 sv_magic(tsv, (SV*)av, '<', NULL, 0);
3227 SvREFCNT_dec(av); /* for sv_magic */
3228 }
3229 av_push(av,sv);
3230}
3231
3232STATIC void
cea2e8a9 3233S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
3234{
3235 AV *av;
3236 SV **svp;
3237 I32 i;
3238 SV *tsv = SvRV(sv);
3239 MAGIC *mg;
3240 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, '<')))
cea2e8a9 3241 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
3242 av = (AV *)mg->mg_obj;
3243 svp = AvARRAY(av);
3244 i = AvFILLp(av);
3245 while (i >= 0) {
3246 if (svp[i] == sv) {
3247 svp[i] = &PL_sv_undef; /* XXX */
3248 }
3249 i--;
3250 }
3251}
3252
954c1994
GS
3253/*
3254=for apidoc sv_insert
3255
3256Inserts a string at the specified offset/length within the SV. Similar to
3257the Perl substr() function.
3258
3259=cut
3260*/
3261
79072805 3262void
864dbfa3 3263Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
79072805
LW
3264{
3265 register char *big;
3266 register char *mid;
3267 register char *midend;
3268 register char *bigend;
3269 register I32 i;
6ff81951
GS
3270 STRLEN curlen;
3271
79072805 3272
8990e307 3273 if (!bigstr)
cea2e8a9 3274 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951
GS
3275 SvPV_force(bigstr, curlen);
3276 if (offset + len > curlen) {
3277 SvGROW(bigstr, offset+len+1);
3278 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
3279 SvCUR_set(bigstr, offset+len);
3280 }
79072805 3281
69b47968 3282 SvTAINT(bigstr);
79072805
LW
3283 i = littlelen - len;
3284 if (i > 0) { /* string might grow */
a0d0e21e 3285 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
3286 mid = big + offset + len;
3287 midend = bigend = big + SvCUR(bigstr);
3288 bigend += i;
3289 *bigend = '\0';
3290 while (midend > mid) /* shove everything down */
3291 *--bigend = *--midend;
3292 Move(little,big+offset,littlelen,char);
3293 SvCUR(bigstr) += i;
3294 SvSETMAGIC(bigstr);
3295 return;
3296 }
3297 else if (i == 0) {
463ee0b2 3298 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
3299 SvSETMAGIC(bigstr);
3300 return;
3301 }
3302
463ee0b2 3303 big = SvPVX(bigstr);
79072805
LW
3304 mid = big + offset;
3305 midend = mid + len;
3306 bigend = big + SvCUR(bigstr);
3307
3308 if (midend > bigend)
cea2e8a9 3309 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
3310
3311 if (mid - big > bigend - midend) { /* faster to shorten from end */
3312 if (littlelen) {
3313 Move(little, mid, littlelen,char);
3314 mid += littlelen;
3315 }
3316 i = bigend - midend;
3317 if (i > 0) {
3318 Move(midend, mid, i,char);
3319 mid += i;
3320 }
3321 *mid = '\0';
3322 SvCUR_set(bigstr, mid - big);
3323 }
3324 /*SUPPRESS 560*/
3325 else if (i = mid - big) { /* faster from front */
3326 midend -= littlelen;
3327 mid = midend;
3328 sv_chop(bigstr,midend-i);
3329 big += i;
3330 while (i--)
3331 *--midend = *--big;
3332 if (littlelen)
3333 Move(little, mid, littlelen,char);
3334 }
3335 else if (littlelen) {
3336 midend -= littlelen;
3337 sv_chop(bigstr,midend);
3338 Move(little,midend,littlelen,char);
3339 }
3340 else {
3341 sv_chop(bigstr,midend);
3342 }
3343 SvSETMAGIC(bigstr);
3344}
3345
3346/* make sv point to what nstr did */
3347
3348void
864dbfa3 3349Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805 3350{
0453d815 3351 dTHR;
79072805 3352 U32 refcnt = SvREFCNT(sv);
2213622d 3353 SV_CHECK_THINKFIRST(sv);
0453d815
PM
3354 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
3355 Perl_warner(aTHX_ WARN_INTERNAL, "Reference miscount in sv_replace()");
93a17b20 3356 if (SvMAGICAL(sv)) {
a0d0e21e
LW
3357 if (SvMAGICAL(nsv))
3358 mg_free(nsv);
3359 else
3360 sv_upgrade(nsv, SVt_PVMG);
93a17b20 3361 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 3362 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
3363 SvMAGICAL_off(sv);
3364 SvMAGIC(sv) = 0;
3365 }
79072805
LW
3366 SvREFCNT(sv) = 0;
3367 sv_clear(sv);
477f5d66 3368 assert(!SvREFCNT(sv));
79072805
LW
3369 StructCopy(nsv,sv,SV);
3370 SvREFCNT(sv) = refcnt;
1edc1566 3371 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
463ee0b2 3372 del_SV(nsv);
79072805
LW
3373}
3374
3375void
864dbfa3 3376Perl_sv_clear(pTHX_ register SV *sv)
79072805 3377{
ec12f114 3378 HV* stash;
79072805
LW
3379 assert(sv);
3380 assert(SvREFCNT(sv) == 0);
3381
ed6116ce 3382 if (SvOBJECT(sv)) {
e858de61 3383 dTHR;
3280af22 3384 if (PL_defstash) { /* Still have a symbol table? */
4e35701f 3385 djSP;
8ebc5c01 3386 GV* destructor;
837485b6 3387 SV tmpref;
a0d0e21e 3388
837485b6
GS
3389 Zero(&tmpref, 1, SV);
3390 sv_upgrade(&tmpref, SVt_RV);
3391 SvROK_on(&tmpref);
3392 SvREADONLY_on(&tmpref); /* DESTROY() could be naughty */
3393 SvREFCNT(&tmpref) = 1;
8ebc5c01 3394
4e8e7886
GS
3395 do {
3396 stash = SvSTASH(sv);
3397 destructor = gv_fetchmethod(SvSTASH(sv), "DESTROY");
3398 if (destructor) {
3399 ENTER;
e788e7d3 3400 PUSHSTACKi(PERLSI_DESTROY);
837485b6 3401 SvRV(&tmpref) = SvREFCNT_inc(sv);
4e8e7886
GS
3402 EXTEND(SP, 2);
3403 PUSHMARK(SP);
837485b6 3404 PUSHs(&tmpref);
4e8e7886 3405 PUTBACK;
864dbfa3
GS
3406 call_sv((SV*)GvCV(destructor),
3407 G_DISCARD|G_EVAL|G_KEEPERR);
4e8e7886 3408 SvREFCNT(sv)--;
d3acc0f7 3409 POPSTACK;
3095d977 3410 SPAGAIN;
4e8e7886
GS
3411 LEAVE;
3412 }
3413 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 3414
837485b6 3415 del_XRV(SvANY(&tmpref));
6f44e0a4
JP
3416
3417 if (SvREFCNT(sv)) {
3418 if (PL_in_clean_objs)
cea2e8a9 3419 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
6f44e0a4
JP
3420 HvNAME(stash));
3421 /* DESTROY gave object new lease on life */
3422 return;
3423 }
a0d0e21e 3424 }
4e8e7886 3425
a0d0e21e 3426 if (SvOBJECT(sv)) {
4e8e7886 3427 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
3428 SvOBJECT_off(sv); /* Curse the object. */
3429 if (SvTYPE(sv) != SVt_PVIO)
3280af22 3430 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 3431 }
463ee0b2 3432 }
c07a80fd 3433 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
a0d0e21e 3434 mg_free(sv);
ec12f114 3435 stash = NULL;
79072805 3436 switch (SvTYPE(sv)) {
8990e307 3437 case SVt_PVIO:
df0bd2f4
GS
3438 if (IoIFP(sv) &&
3439 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 3440 IoIFP(sv) != PerlIO_stdout() &&
3441 IoIFP(sv) != PerlIO_stderr())
93578b34 3442 {
f2b5be74 3443 io_close((IO*)sv, FALSE);
93578b34 3444 }
1d7c1841 3445 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 3446 PerlDir_close(IoDIRP(sv));
1d7c1841 3447 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
3448 Safefree(IoTOP_NAME(sv));
3449 Safefree(IoFMT_NAME(sv));
3450 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 3451 /* FALL THROUGH */
79072805 3452 case SVt_PVBM:
a0d0e21e 3453 goto freescalar;
79072805 3454 case SVt_PVCV:
748a9306 3455 case SVt_PVFM:
85e6fe83 3456 cv_undef((CV*)sv);
a0d0e21e 3457 goto freescalar;
79072805 3458 case SVt_PVHV:
85e6fe83 3459 hv_undef((HV*)sv);
a0d0e21e 3460 break;
79072805 3461 case SVt_PVAV:
85e6fe83 3462 av_undef((AV*)sv);
a0d0e21e 3463 break;
02270b4e
GS
3464 case SVt_PVLV:
3465 SvREFCNT_dec(LvTARG(sv));
3466 goto freescalar;
a0d0e21e 3467 case SVt_PVGV:
1edc1566 3468 gp_free((GV*)sv);
a0d0e21e 3469 Safefree(GvNAME(sv));
ec12f114
JPC
3470 /* cannot decrease stash refcount yet, as we might recursively delete
3471 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
3472 of stash until current sv is completely gone.
3473 -- JohnPC, 27 Mar 1998 */
3474 stash = GvSTASH(sv);
a0d0e21e 3475 /* FALL THROUGH */
79072805 3476 case SVt_PVMG:
79072805
LW
3477 case SVt_PVNV:
3478 case SVt_PVIV:
a0d0e21e
LW
3479 freescalar:
3480 (void)SvOOK_off(sv);
79072805
LW
3481 /* FALL THROUGH */
3482 case SVt_PV:
a0d0e21e 3483 case SVt_RV:
810b8aa5
GS
3484 if (SvROK(sv)) {
3485 if (SvWEAKREF(sv))
3486 sv_del_backref(sv);
3487 else
3488 SvREFCNT_dec(SvRV(sv));
3489 }
1edc1566 3490 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 3491 Safefree(SvPVX(sv));
79072805 3492 break;
a0d0e21e 3493/*
79072805 3494 case SVt_NV:
79072805 3495 case SVt_IV:
79072805
LW
3496 case SVt_NULL:
3497 break;
a0d0e21e 3498*/
79072805
LW
3499 }
3500
3501 switch (SvTYPE(sv)) {
3502 case SVt_NULL:
3503 break;
79072805
LW
3504 case SVt_IV:
3505 del_XIV(SvANY(sv));
3506 break;
3507 case SVt_NV:
3508 del_XNV(SvANY(sv));
3509 break;
ed6116ce
LW
3510 case SVt_RV:
3511 del_XRV(SvANY(sv));
3512 break;
79072805
LW
3513 case SVt_PV:
3514 del_XPV(SvANY(sv));
3515 break;
3516 case SVt_PVIV:
3517 del_XPVIV(SvANY(sv));
3518 break;
3519 case SVt_PVNV:
3520 del_XPVNV(SvANY(sv));
3521 break;
3522 case SVt_PVMG:
3523 del_XPVMG(SvANY(sv));
3524 break;
3525 case SVt_PVLV:
3526 del_XPVLV(SvANY(sv));
3527 break;
3528 case SVt_PVAV:
3529 del_XPVAV(SvANY(sv));
3530 break;
3531 case SVt_PVHV:
3532 del_XPVHV(SvANY(sv));
3533 break;
3534 case SVt_PVCV:
3535 del_XPVCV(SvANY(sv));
3536 break;
3537 case SVt_PVGV:
3538 del_XPVGV(SvANY(sv));
ec12f114
JPC
3539 /* code duplication for increased performance. */
3540 SvFLAGS(sv) &= SVf_BREAK;
3541 SvFLAGS(sv) |= SVTYPEMASK;
3542 /* decrease refcount of the stash that owns this GV, if any */
3543 if (stash)
3544 SvREFCNT_dec(stash);
3545 return; /* not break, SvFLAGS reset already happened */
79072805
LW
3546 case SVt_PVBM:
3547 del_XPVBM(SvANY(sv));
3548 break;
3549 case SVt_PVFM:
3550 del_XPVFM(SvANY(sv));
3551 break;
8990e307
LW
3552 case SVt_PVIO:
3553 del_XPVIO(SvANY(sv));
3554 break;
79072805 3555 }
a0d0e21e 3556 SvFLAGS(sv) &= SVf_BREAK;
8990e307 3557 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
3558}
3559
3560SV *
864dbfa3 3561Perl_sv_newref(pTHX_ SV *sv)
79072805 3562{
463ee0b2 3563 if (sv)
dce16143 3564 ATOMIC_INC(SvREFCNT(sv));
79072805
LW
3565 return sv;
3566}
3567
3568void
864dbfa3 3569Perl_sv_free(pTHX_ SV *sv)
79072805 3570{
0453d815 3571 dTHR;
dce16143
MB
3572 int refcount_is_zero;
3573
79072805
LW
3574 if (!sv)
3575 return;
a0d0e21e
LW
3576 if (SvREFCNT(sv) == 0) {
3577 if (SvFLAGS(sv) & SVf_BREAK)
3578 return;
3280af22 3579 if (PL_in_clean_all) /* All is fair */
1edc1566 3580 return;
d689ffdd
JP
3581 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3582 /* make sure SvREFCNT(sv)==0 happens very seldom */
3583 SvREFCNT(sv) = (~(U32)0)/2;
3584 return;
3585 }
0453d815
PM
3586 if (ckWARN_d(WARN_INTERNAL))
3587 Perl_warner(aTHX_ WARN_INTERNAL, "Attempt to free unreferenced scalar");
79072805
LW
3588 return;
3589 }
dce16143
MB
3590 ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
3591 if (!refcount_is_zero)
8990e307 3592 return;
463ee0b2
LW
3593#ifdef DEBUGGING
3594 if (SvTEMP(sv)) {
0453d815 3595 if (ckWARN_d(WARN_DEBUGGING))
f248d071 3596 Perl_warner(aTHX_ WARN_DEBUGGING,
1d7c1841
GS
3597 "Attempt to free temp prematurely: SV 0x%"UVxf,
3598 PTR2UV(sv));
79072805 3599 return;
79072805 3600 }
463ee0b2 3601#endif
d689ffdd
JP
3602 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3603 /* make sure SvREFCNT(sv)==0 happens very seldom */
3604 SvREFCNT(sv) = (~(U32)0)/2;
3605 return;
3606 }
79072805 3607 sv_clear(sv);
477f5d66
CS
3608 if (! SvREFCNT(sv))
3609 del_SV(sv);
79072805
LW
3610}
3611
954c1994
GS
3612/*
3613=for apidoc sv_len
3614
3615Returns the length of the string in the SV. See also C<SvCUR>.
3616
3617=cut
3618*/
3619
79072805 3620STRLEN
864dbfa3 3621Perl_sv_len(pTHX_ register SV *sv)
79072805 3622{
748a9306 3623 char *junk;
463ee0b2 3624 STRLEN len;
79072805
LW
3625
3626 if (!sv)
3627 return 0;
3628
8990e307 3629 if (SvGMAGICAL(sv))
565764a8 3630 len = mg_length(sv);
8990e307 3631 else
748a9306 3632 junk = SvPV(sv, len);
463ee0b2 3633 return len;
79072805
LW
3634}
3635
a0ed51b3 3636STRLEN
864dbfa3 3637Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 3638{
dfe13c55
GS
3639 U8 *s;
3640 U8 *send;
a0ed51b3
LW
3641 STRLEN len;
3642
3643 if (!sv)
3644 return 0;
3645
3646#ifdef NOTYET
3647 if (SvGMAGICAL(sv))
3648 len = mg_length(sv);
3649 else
3650#endif
dfe13c55 3651 s = (U8*)SvPV(sv, len);
a0ed51b3
LW
3652 send = s + len;
3653 len = 0;
3654 while (s < send) {
3655 s += UTF8SKIP(s);
3656 len++;
3657 }
3658 return len;
3659}
3660
3661void
864dbfa3 3662Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 3663{
dfe13c55
GS
3664 U8 *start;
3665 U8 *s;
3666 U8 *send;
a0ed51b3
LW
3667 I32 uoffset = *offsetp;
3668 STRLEN len;
3669
3670 if (!sv)
3671 return;
3672
dfe13c55 3673 start = s = (U8*)SvPV(sv, len);
a0ed51b3
LW
3674 send = s + len;
3675 while (s < send && uoffset--)
3676 s += UTF8SKIP(s);
bb40f870
GA
3677 if (s >= send)
3678 s = send;
a0ed51b3
LW
3679 *offsetp = s - start;
3680 if (lenp) {
3681 I32 ulen = *lenp;
3682 start = s;
3683 while (s < send && ulen--)
3684 s += UTF8SKIP(s);
bb40f870
GA
3685 if (s >= send)
3686 s = send;
a0ed51b3
LW
3687 *lenp = s - start;
3688 }
3689 return;
3690}
3691
3692void
864dbfa3 3693Perl_sv_pos_b2u(pTHX_ register SV *sv, I32* offsetp)
a0ed51b3 3694{
dfe13c55
GS
3695 U8 *s;
3696 U8 *send;
a0ed51b3
LW
3697 STRLEN len;
3698
3699 if (!sv)
3700 return;
3701
dfe13c55 3702 s = (U8*)SvPV(sv, len);
a0ed51b3 3703 if (len < *offsetp)
cea2e8a9 3704 Perl_croak(aTHX_ "panic: bad byte offset");
a0ed51b3
LW
3705 send = s + *offsetp;
3706 len = 0;
3707 while (s < send) {
3708 s += UTF8SKIP(s);
3709 ++len;
3710 }
3711 if (s != send) {
0453d815
PM
3712 dTHR;
3713 if (ckWARN_d(WARN_UTF8))
3714 Perl_warner(aTHX_ WARN_UTF8, "Malformed UTF-8 character");
a0ed51b3
LW
3715 --len;
3716 }
3717 *offsetp = len;
3718 return;
3719}
3720
954c1994
GS
3721/*
3722=for apidoc sv_eq
3723
3724Returns a boolean indicating whether the strings in the two SVs are
3725identical.
3726
3727=cut
3728*/
3729
79072805 3730I32
864dbfa3 3731Perl_sv_eq(pTHX_ register SV *str1, register SV *str2)
79072805
LW
3732{
3733 char *pv1;
463ee0b2 3734 STRLEN cur1;
79072805 3735 char *pv2;
463ee0b2 3736 STRLEN cur2;
79072805
LW
3737
3738 if (!str1) {
3739 pv1 = "";
3740 cur1 = 0;
3741 }
463ee0b2
LW
3742 else
3743 pv1 = SvPV(str1, cur1);