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