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