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