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