This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
DB_File 1.67
[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) \
cea2e8a9 85 Perl_die(aTHX_ "SV registry bug"); \
053fc874
GS
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
cea2e8a9 94S_reg_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
cea2e8a9 121S_reg_remove(pTHX_ SV *sv)
4561caa4
CS
122{
123 REG_REMOVE(sv);
3280af22 124 --PL_sv_count;
4561caa4
CS
125}
126
ba106d47 127STATIC void
cea2e8a9 128S_visit(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
cea2e8a9 194S_del_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) {
cea2e8a9 208 Perl_warn(aTHX_ "Attempt to free non-arena SV: 0x%lx", (unsigned long)p);
a0d0e21e
LW
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*
cea2e8a9 250S_more_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
cea2e8a9 268S_visit(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)
cea2e8a9 278 (FCALL)(aTHX_ sv);
8990e307
LW
279 }
280 }
281}
282
4561caa4
CS
283#endif /* PURIFY */
284
76e3520e 285STATIC void
cea2e8a9 286S_do_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{
cea2e8a9 298 visit(FUNC_NAME_TO_PTR(S_do_report_used));
4561caa4
CS
299}
300
76e3520e 301STATIC void
cea2e8a9 302S_do_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
cea2e8a9 318S_do_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;
cea2e8a9 338 visit(FUNC_NAME_TO_PTR(S_do_clean_objs));
4561caa4 339#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 340 /* some barnacles may yet remain, clinging to typeglobs */
cea2e8a9 341 visit(FUNC_NAME_TO_PTR(S_do_clean_named_objs));
4561caa4 342#endif
3280af22 343 PL_in_clean_objs = FALSE;
4561caa4
CS
344}
345
76e3520e 346STATIC void
cea2e8a9 347S_do_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;
cea2e8a9 358 visit(FUNC_NAME_TO_PTR(S_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*
cea2e8a9 389S_new_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
cea2e8a9 405S_del_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
cea2e8a9 415S_more_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*
cea2e8a9 436S_new_xnv(pTHX)
463ee0b2 437{
65202027 438 NV* xnv;
cbe51380
GS
439 LOCK_SV_MUTEX;
440 if (!PL_xnv_root)
441 more_xnv();
442 xnv = PL_xnv_root;
65202027 443 PL_xnv_root = *(NV**)xnv;
cbe51380
GS
444 UNLOCK_SV_MUTEX;
445 return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
463ee0b2
LW
446}
447
76e3520e 448STATIC void
cea2e8a9 449S_del_xnv(pTHX_ XPVNV *p)
463ee0b2 450{
65202027 451 NV* xnv = (NV*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
cbe51380 452 LOCK_SV_MUTEX;
65202027 453 *(NV**)xnv = PL_xnv_root;
3280af22 454 PL_xnv_root = xnv;
cbe51380 455 UNLOCK_SV_MUTEX;
463ee0b2
LW
456}
457
cbe51380 458STATIC void
cea2e8a9 459S_more_xnv(pTHX)
463ee0b2 460{
65202027
DS
461 register NV* xnv;
462 register NV* xnvend;
463 New(711, xnv, 1008/sizeof(NV), NV);
464 xnvend = &xnv[1008 / sizeof(NV) - 1];
465 xnv += (sizeof(XPVIV) - 1) / sizeof(NV) + 1; /* fudge by sizeof XPVIV */
3280af22 466 PL_xnv_root = xnv;
463ee0b2 467 while (xnv < xnvend) {
65202027 468 *(NV**)xnv = (NV*)(xnv + 1);
463ee0b2
LW
469 xnv++;
470 }
65202027 471 *(NV**)xnv = 0;
463ee0b2
LW
472}
473
76e3520e 474STATIC XRV*
cea2e8a9 475S_new_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
cea2e8a9 488S_del_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
cea2e8a9 497S_more_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*
cea2e8a9 512S_new_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
cea2e8a9 525S_del_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
cea2e8a9 534S_more_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*
4f63d024 585S_my_safemalloc(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;
65202027 634 NV nv;
79072805
LW
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 658 iv = SvIVX(sv);
65202027 659 nv = (NV)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;
65202027 686 nv = (NV)(unsigned long)pv;
ed6116ce
LW
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:
cea2e8a9 736 Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
79072805
LW
737 }
738
739 switch (mt) {
740 case SVt_NULL:
cea2e8a9 741 Perl_croak(aTHX_ "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;
cea2e8a9 988 Perl_croak(aTHX_ "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
65202027 1020Perl_sv_setnv(pTHX_ register SV *sv, NV 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;
cea2e8a9 1042 Perl_croak(aTHX_ "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
65202027 1052Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
ef50df4b
GS
1053{
1054 sv_setnv(sv,num);
1055 SvSETMAGIC(sv);
1056}
1057
76e3520e 1058STATIC void
cea2e8a9 1059S_not_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)
cea2e8a9 1107 Perl_warner(aTHX_ WARN_NUMERIC, "Argument \"%s\" isn't numeric in %s", tmpbuf,
22c35a8c 1108 PL_op_name[PL_op->op_type]);
a0d0e21e 1109 else
cea2e8a9 1110 Perl_warner(aTHX_ 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)
cea2e8a9 1140 Perl_warner(aTHX_ 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))
cea2e8a9 1161 Perl_warner(aTHX_ 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);
65202027 1184 if (SvNVX(sv) < (NV)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. */
65202027 1211 NV d;
25da4f38 1212
097ee67d 1213 d = Atof(SvPVX(sv));
25da4f38
IZ
1214
1215 if (SvTYPE(sv) < SVt_PVNV)
1216 sv_upgrade(sv, SVt_PVNV);
1217 SvNVX(sv) = d;
1218 (void)SvNOK_on(sv);
1219 (void)SvIOK_on(sv);
1220 DEBUG_c(PerlIO_printf(Perl_debug_log,
65202027
DS
1221#if defined(USE_LONG_DOUBLE)
1222 "0x%lx 2nv(%Lg)\n",
1223#else
1224 "0x%lx 2nv(%g)\n",
1225#endif
1226 (unsigned long)sv,
25da4f38 1227 SvNVX(sv)));
65202027 1228 if (SvNVX(sv) < (NV)IV_MAX + 0.5)
25da4f38
IZ
1229 SvIVX(sv) = I_V(SvNVX(sv));
1230 else {
1231 SvUVX(sv) = U_V(SvNVX(sv));
1232 SvIsUV_on(sv);
1233 goto ret_iv_max;
1234 }
1235 }
1236 else if (numtype) {
1237 /* The NV may be reconstructed from IV - safe to cache IV,
1238 which may be calculated by atol(). */
1239 if (SvTYPE(sv) == SVt_PV)
1240 sv_upgrade(sv, SVt_PVIV);
1241 (void)SvIOK_on(sv);
1242 SvIVX(sv) = atol(SvPVX(sv)); /* XXXX 64-bit? */
1243 }
1244 else { /* Not a number. Cache 0. */
1245 dTHR;
1246
1247 if (SvTYPE(sv) < SVt_PVIV)
1248 sv_upgrade(sv, SVt_PVIV);
1249 SvIVX(sv) = 0;
1250 (void)SvIOK_on(sv);
1251 if (ckWARN(WARN_NUMERIC))
1252 not_a_number(sv);
1253 }
93a17b20 1254 }
79072805 1255 else {
11343788 1256 dTHR;
599cee73 1257 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
cea2e8a9 1258 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit);
25da4f38
IZ
1259 if (SvTYPE(sv) < SVt_IV)
1260 /* Typically the caller expects that sv_any is not NULL now. */
1261 sv_upgrade(sv, SVt_IV);
a0d0e21e 1262 return 0;
79072805 1263 }
760ac839 1264 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2iv(%ld)\n",
a0d0e21e 1265 (unsigned long)sv,(long)SvIVX(sv)));
25da4f38 1266 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
1267}
1268
ff68c719 1269UV
864dbfa3 1270Perl_sv_2uv(pTHX_ register SV *sv)
ff68c719 1271{
1272 if (!sv)
1273 return 0;
1274 if (SvGMAGICAL(sv)) {
1275 mg_get(sv);
1276 if (SvIOKp(sv))
1277 return SvUVX(sv);
1278 if (SvNOKp(sv))
1279 return U_V(SvNVX(sv));
36477c24 1280 if (SvPOKp(sv) && SvLEN(sv))
1281 return asUV(sv);
3fe9a6f1 1282 if (!SvROK(sv)) {
d008e5eb 1283 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1284 dTHR;
d008e5eb 1285 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
cea2e8a9 1286 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1287 }
36477c24 1288 return 0;
3fe9a6f1 1289 }
ff68c719 1290 }
1291 if (SvTHINKFIRST(sv)) {
1292 if (SvROK(sv)) {
ff68c719 1293 SV* tmpstr;
1294 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
9e7bc3e8 1295 return SvUV(tmpstr);
ff68c719 1296 return (UV)SvRV(sv);
1297 }
1298 if (SvREADONLY(sv)) {
1299 if (SvNOKp(sv)) {
1300 return U_V(SvNVX(sv));
1301 }
36477c24 1302 if (SvPOKp(sv) && SvLEN(sv))
1303 return asUV(sv);
d008e5eb
GS
1304 {
1305 dTHR;
1306 if (ckWARN(WARN_UNINITIALIZED))
cea2e8a9 1307 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit);
d008e5eb 1308 }
ff68c719 1309 return 0;
1310 }
1311 }
25da4f38
IZ
1312 if (SvIOKp(sv)) {
1313 if (SvIsUV(sv)) {
1314 return SvUVX(sv);
1315 }
1316 else {
1317 return (UV)SvIVX(sv);
1318 }
ff68c719 1319 }
1320 if (SvNOKp(sv)) {
25da4f38
IZ
1321 /* We can cache the IV/UV value even if it not good enough
1322 * to reconstruct NV, since the conversion to PV will prefer
1323 * NV over IV/UV. XXXX 64-bit?
1324 */
1325 if (SvTYPE(sv) == SVt_NV)
1326 sv_upgrade(sv, SVt_PVNV);
ff68c719 1327 (void)SvIOK_on(sv);
25da4f38
IZ
1328 if (SvNVX(sv) >= -0.5) {
1329 SvIsUV_on(sv);
1330 SvUVX(sv) = U_V(SvNVX(sv));
1331 }
1332 else {
1333 SvIVX(sv) = I_V(SvNVX(sv));
1334 ret_zero:
1335 DEBUG_c(PerlIO_printf(Perl_debug_log,
1336 "0x%lx 2uv(%ld => %lu) (as signed)\n",
1337 (unsigned long)sv,(long)SvIVX(sv),
1338 (long)(UV)SvIVX(sv)));
1339 return (UV)SvIVX(sv);
1340 }
ff68c719 1341 }
1342 else if (SvPOKp(sv) && SvLEN(sv)) {
25da4f38
IZ
1343 I32 numtype = looks_like_number(sv);
1344
1345 /* We want to avoid a possible problem when we cache a UV which
1346 may be later translated to an NV, and the resulting NV is not
1347 the translation of the initial data.
1348
1349 This means that if we cache such a UV, we need to cache the
1350 NV as well. Moreover, we trade speed for space, and do not
1351 cache the NV if not needed.
1352 */
1353 if (numtype & IS_NUMBER_NOT_IV) {
1354 /* May be not an integer. Need to cache NV if we cache IV
1355 * - otherwise future conversion to NV will be wrong. */
65202027 1356 NV d;
25da4f38 1357
097ee67d 1358 d = Atof(SvPVX(sv)); /* XXXX 64-bit? */
25da4f38
IZ
1359
1360 if (SvTYPE(sv) < SVt_PVNV)
1361 sv_upgrade(sv, SVt_PVNV);
1362 SvNVX(sv) = d;
1363 (void)SvNOK_on(sv);
1364 (void)SvIOK_on(sv);
1365 DEBUG_c(PerlIO_printf(Perl_debug_log,
65202027
DS
1366#if defined(USE_LONG_DOUBLE)
1367 "0x%lx 2nv(%Lg)\n",
1368#else
1369 "0x%lx 2nv(%g)\n",
1370#endif
1371 (unsigned long)sv,
25da4f38
IZ
1372 SvNVX(sv)));
1373 if (SvNVX(sv) < -0.5) {
1374 SvIVX(sv) = I_V(SvNVX(sv));
1375 goto ret_zero;
1376 } else {
1377 SvUVX(sv) = U_V(SvNVX(sv));
1378 SvIsUV_on(sv);
1379 }
1380 }
1381 else if (numtype & IS_NUMBER_NEG) {
1382 /* The NV may be reconstructed from IV - safe to cache IV,
1383 which may be calculated by atol(). */
1384 if (SvTYPE(sv) == SVt_PV)
1385 sv_upgrade(sv, SVt_PVIV);
1386 (void)SvIOK_on(sv);
1387 SvIVX(sv) = (IV)atol(SvPVX(sv)); /* XXXX 64-bit? */
1388 }
1389 else if (numtype) { /* Non-negative */
1390 /* The NV may be reconstructed from UV - safe to cache UV,
1391 which may be calculated by strtoul()/atol. */
1392 if (SvTYPE(sv) == SVt_PV)
1393 sv_upgrade(sv, SVt_PVIV);
1394 (void)SvIOK_on(sv);
1395 (void)SvIsUV_on(sv);
1396#ifdef HAS_STRTOUL
1397 SvUVX(sv) = strtoul(SvPVX(sv), Null(char**), 10); /* XXXX 64-bit? */
1398#else /* no atou(), but we know the number fits into IV... */
1399 /* The only problem may be if it is negative... */
1400 SvUVX(sv) = (UV)atol(SvPVX(sv)); /* XXXX 64-bit? */
1401#endif
1402 }
1403 else { /* Not a number. Cache 0. */
1404 dTHR;
1405
1406 if (SvTYPE(sv) < SVt_PVIV)
1407 sv_upgrade(sv, SVt_PVIV);
1408 SvUVX(sv) = 0; /* We assume that 0s have the
1409 same bitmap in IV and UV. */
1410 (void)SvIOK_on(sv);
1411 (void)SvIsUV_on(sv);
1412 if (ckWARN(WARN_NUMERIC))
1413 not_a_number(sv);
1414 }
ff68c719 1415 }
1416 else {
d008e5eb 1417 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1418 dTHR;
d008e5eb 1419 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
cea2e8a9 1420 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1421 }
25da4f38
IZ
1422 if (SvTYPE(sv) < SVt_IV)
1423 /* Typically the caller expects that sv_any is not NULL now. */
1424 sv_upgrade(sv, SVt_IV);
ff68c719 1425 return 0;
1426 }
25da4f38 1427
ff68c719 1428 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2uv(%lu)\n",
1429 (unsigned long)sv,SvUVX(sv)));
25da4f38 1430 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 1431}
1432
65202027 1433NV
864dbfa3 1434Perl_sv_2nv(pTHX_ register SV *sv)
79072805
LW
1435{
1436 if (!sv)
1437 return 0.0;
8990e307 1438 if (SvGMAGICAL(sv)) {
463ee0b2
LW
1439 mg_get(sv);
1440 if (SvNOKp(sv))
1441 return SvNVX(sv);
a0d0e21e 1442 if (SvPOKp(sv) && SvLEN(sv)) {
d008e5eb 1443 dTHR;
599cee73 1444 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 1445 not_a_number(sv);
097ee67d 1446 return Atof(SvPVX(sv));
a0d0e21e 1447 }
25da4f38
IZ
1448 if (SvIOKp(sv)) {
1449 if (SvIsUV(sv))
65202027 1450 return (NV)SvUVX(sv);
25da4f38 1451 else
65202027 1452 return (NV)SvIVX(sv);
25da4f38 1453 }
16d20bd9 1454 if (!SvROK(sv)) {
d008e5eb 1455 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1456 dTHR;
d008e5eb 1457 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
cea2e8a9 1458 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1459 }
16d20bd9
AD
1460 return 0;
1461 }
463ee0b2 1462 }
ed6116ce 1463 if (SvTHINKFIRST(sv)) {
a0d0e21e 1464 if (SvROK(sv)) {
a0d0e21e
LW
1465 SV* tmpstr;
1466 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
9e7bc3e8 1467 return SvNV(tmpstr);
65202027 1468 return (NV)(unsigned long)SvRV(sv);
a0d0e21e 1469 }
ed6116ce 1470 if (SvREADONLY(sv)) {
d008e5eb 1471 dTHR;
748a9306 1472 if (SvPOKp(sv) && SvLEN(sv)) {
599cee73 1473 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 1474 not_a_number(sv);
097ee67d 1475 return Atof(SvPVX(sv));
a0d0e21e 1476 }
25da4f38
IZ
1477 if (SvIOKp(sv)) {
1478 if (SvIsUV(sv))
65202027 1479 return (NV)SvUVX(sv);
25da4f38 1480 else
65202027 1481 return (NV)SvIVX(sv);
25da4f38 1482 }
599cee73 1483 if (ckWARN(WARN_UNINITIALIZED))
cea2e8a9 1484 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit);
ed6116ce
LW
1485 return 0.0;
1486 }
79072805
LW
1487 }
1488 if (SvTYPE(sv) < SVt_NV) {
463ee0b2
LW
1489 if (SvTYPE(sv) == SVt_IV)
1490 sv_upgrade(sv, SVt_PVNV);
1491 else
1492 sv_upgrade(sv, SVt_NV);
097ee67d
JH
1493 DEBUG_c({
1494 RESTORE_NUMERIC_STANDARD();
1495 PerlIO_printf(Perl_debug_log,
65202027
DS
1496#if defined(USE_LONG_DOUBLE)
1497 "0x%lx num(%Lg)\n",
1498#else
1499 "0x%lx num(%g)\n",
1500#endif
1501 (unsigned long)sv,SvNVX(sv)));
097ee67d
JH
1502 RESTORE_NUMERIC_LOCAL();
1503 });
79072805
LW
1504 }
1505 else if (SvTYPE(sv) < SVt_PVNV)
1506 sv_upgrade(sv, SVt_PVNV);
748a9306
LW
1507 if (SvIOKp(sv) &&
1508 (!SvPOKp(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
93a17b20 1509 {
65202027 1510 SvNVX(sv) = SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv);
93a17b20 1511 }
748a9306 1512 else if (SvPOKp(sv) && SvLEN(sv)) {
d008e5eb 1513 dTHR;
599cee73 1514 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 1515 not_a_number(sv);
097ee67d 1516 SvNVX(sv) = Atof(SvPVX(sv));
93a17b20 1517 }
79072805 1518 else {
11343788 1519 dTHR;
599cee73 1520 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
cea2e8a9 1521 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit);
25da4f38
IZ
1522 if (SvTYPE(sv) < SVt_NV)
1523 /* Typically the caller expects that sv_any is not NULL now. */
1524 sv_upgrade(sv, SVt_NV);
a0d0e21e 1525 return 0.0;
79072805
LW
1526 }
1527 SvNOK_on(sv);
097ee67d
JH
1528 DEBUG_c({
1529 RESTORE_NUMERIC_STANDARD();
1530 PerlIO_printf(Perl_debug_log,
65202027
DS
1531#if defined(USE_LONG_DOUBLE)
1532 "0x%lx 2nv(%Lg)\n",
1533#else
1534 "0x%lx 1nv(%g)\n",
1535#endif
1536 (unsigned long)sv,SvNVX(sv)));
097ee67d
JH
1537 RESTORE_NUMERIC_LOCAL();
1538 });
463ee0b2 1539 return SvNVX(sv);
79072805
LW
1540}
1541
76e3520e 1542STATIC IV
cea2e8a9 1543S_asIV(pTHX_ SV *sv)
36477c24 1544{
1545 I32 numtype = looks_like_number(sv);
65202027 1546 NV d;
36477c24 1547
25da4f38
IZ
1548 if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
1549 return atol(SvPVX(sv)); /* XXXX 64-bit? */
d008e5eb
GS
1550 if (!numtype) {
1551 dTHR;
1552 if (ckWARN(WARN_NUMERIC))
1553 not_a_number(sv);
1554 }
097ee67d 1555 d = Atof(SvPVX(sv));
25da4f38 1556 return I_V(d);
36477c24 1557}
1558
76e3520e 1559STATIC UV
cea2e8a9 1560S_asUV(pTHX_ SV *sv)
36477c24 1561{
1562 I32 numtype = looks_like_number(sv);
1563
84902520 1564#ifdef HAS_STRTOUL
25da4f38 1565 if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
84902520
TB
1566 return strtoul(SvPVX(sv), Null(char**), 10);
1567#endif
d008e5eb
GS
1568 if (!numtype) {
1569 dTHR;
1570 if (ckWARN(WARN_NUMERIC))
1571 not_a_number(sv);
1572 }
097ee67d 1573 return U_V(Atof(SvPVX(sv)));
36477c24 1574}
1575
25da4f38
IZ
1576/*
1577 * Returns a combination of (advisory only - can get false negatives)
1578 * IS_NUMBER_TO_INT_BY_ATOL, IS_NUMBER_TO_INT_BY_ATOF, IS_NUMBER_NOT_IV,
1579 * IS_NUMBER_NEG
1580 * 0 if does not look like number.
1581 *
1582 * In fact possible values are 0 and
1583 * IS_NUMBER_TO_INT_BY_ATOL 123
1584 * IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV 123.1
1585 * IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV 123e0
1586 * with a possible addition of IS_NUMBER_NEG.
1587 */
1588
36477c24 1589I32
864dbfa3 1590Perl_looks_like_number(pTHX_ SV *sv)
36477c24 1591{
25da4f38
IZ
1592 /* XXXX 64-bit? It may be not IS_NUMBER_TO_INT_BY_ATOL, but
1593 * using atof() may lose precision. */
36477c24 1594 register char *s;
1595 register char *send;
1596 register char *sbegin;
25da4f38
IZ
1597 register char *nbegin;
1598 I32 numtype = 0;
36477c24 1599 STRLEN len;
1600
1601 if (SvPOK(sv)) {
1602 sbegin = SvPVX(sv);
1603 len = SvCUR(sv);
1604 }
1605 else if (SvPOKp(sv))
1606 sbegin = SvPV(sv, len);
1607 else
1608 return 1;
1609 send = sbegin + len;
1610
1611 s = sbegin;
1612 while (isSPACE(*s))
1613 s++;
25da4f38
IZ
1614 if (*s == '-') {
1615 s++;
1616 numtype = IS_NUMBER_NEG;
1617 }
1618 else if (*s == '+')
36477c24 1619 s++;
ff0cee69 1620
25da4f38
IZ
1621 nbegin = s;
1622 /*
097ee67d
JH
1623 * we return IS_NUMBER_TO_INT_BY_ATOL if the number can be converted
1624 * to _integer_ with atol() and IS_NUMBER_TO_INT_BY_ATOF if you need
1625 * (int)atof().
25da4f38
IZ
1626 */
1627
097ee67d 1628 /* next must be digit or the radix separator */
ff0cee69 1629 if (isDIGIT(*s)) {
1630 do {
1631 s++;
1632 } while (isDIGIT(*s));
25da4f38
IZ
1633
1634 if (s - nbegin >= TYPE_DIGITS(IV)) /* Cannot cache ato[ul]() */
1635 numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
1636 else
1637 numtype |= IS_NUMBER_TO_INT_BY_ATOL;
1638
097ee67d
JH
1639 if (*s == '.'
1640#ifdef USE_LOCALE_NUMERIC
1641 || IS_NUMERIC_RADIX(*s)
1642#endif
1643 ) {
ff0cee69 1644 s++;
25da4f38 1645 numtype |= IS_NUMBER_NOT_IV;
097ee67d 1646 while (isDIGIT(*s)) /* optional digits after the radix */
ff0cee69 1647 s++;
1648 }
36477c24 1649 }
097ee67d
JH
1650 else if (*s == '.'
1651#ifdef USE_LOCALE_NUMERIC
1652 || IS_NUMERIC_RADIX(*s)
1653#endif
1654 ) {
ff0cee69 1655 s++;
25da4f38 1656 numtype |= IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV;
097ee67d 1657 /* no digits before the radix means we need digits after it */
ff0cee69 1658 if (isDIGIT(*s)) {
1659 do {
1660 s++;
1661 } while (isDIGIT(*s));
1662 }
1663 else
1664 return 0;
1665 }
1666 else
1667 return 0;
1668
ff0cee69 1669 /* we can have an optional exponent part */
36477c24 1670 if (*s == 'e' || *s == 'E') {
25da4f38
IZ
1671 numtype &= ~IS_NUMBER_NEG;
1672 numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
36477c24 1673 s++;
1674 if (*s == '+' || *s == '-')
1675 s++;
ff0cee69 1676 if (isDIGIT(*s)) {
1677 do {
1678 s++;
1679 } while (isDIGIT(*s));
1680 }
1681 else
1682 return 0;
36477c24 1683 }
1684 while (isSPACE(*s))
1685 s++;
1686 if (s >= send)
1687 return numtype;
1688 if (len == 10 && memEQ(sbegin, "0 but true", 10))
25da4f38 1689 return IS_NUMBER_TO_INT_BY_ATOL;
36477c24 1690 return 0;
1691}
1692
79072805 1693char *
864dbfa3 1694Perl_sv_2pv_nolen(pTHX_ register SV *sv)
1fa8b10d
JD
1695{
1696 STRLEN n_a;
1697 return sv_2pv(sv, &n_a);
1698}
1699
25da4f38 1700/* We assume that buf is at least TYPE_CHARS(UV) long. */
864dbfa3 1701static char *
25da4f38
IZ
1702uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
1703{
1704 STRLEN len;
1705 char *ptr = buf + TYPE_CHARS(UV);
1706 char *ebuf = ptr;
1707 int sign;
1708 char *p;
1709
1710 if (is_uv)
1711 sign = 0;
1712 else if (iv >= 0) {
1713 uv = iv;
1714 sign = 0;
1715 } else {
1716 uv = -iv;
1717 sign = 1;
1718 }
1719 do {
1720 *--ptr = '0' + (uv % 10);
1721 } while (uv /= 10);
1722 if (sign)
1723 *--ptr = '-';
1724 *peob = ebuf;
1725 return ptr;
1726}
1727
1fa8b10d 1728char *
864dbfa3 1729Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
79072805
LW
1730{
1731 register char *s;
1732 int olderrno;
46fc3d4c 1733 SV *tsv;
25da4f38
IZ
1734 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
1735 char *tmpbuf = tbuf;
79072805 1736
463ee0b2
LW
1737 if (!sv) {
1738 *lp = 0;
1739 return "";
1740 }
8990e307 1741 if (SvGMAGICAL(sv)) {
463ee0b2
LW
1742 mg_get(sv);
1743 if (SvPOKp(sv)) {
1744 *lp = SvCUR(sv);
1745 return SvPVX(sv);
1746 }
25da4f38
IZ
1747 if (SvIOKp(sv)) { /* XXXX 64-bit? */
1748 if (SvIsUV(sv))
1749 (void)sprintf(tmpbuf,"%lu",(unsigned long)SvUVX(sv));
1750 else
1751 (void)sprintf(tmpbuf,"%ld",(long)SvIVX(sv));
46fc3d4c 1752 tsv = Nullsv;
a0d0e21e 1753 goto tokensave;
463ee0b2
LW
1754 }
1755 if (SvNOKp(sv)) {
96827780 1756 Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
46fc3d4c 1757 tsv = Nullsv;
a0d0e21e 1758 goto tokensave;
463ee0b2 1759 }
16d20bd9 1760 if (!SvROK(sv)) {
d008e5eb 1761 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1762 dTHR;
d008e5eb 1763 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
cea2e8a9 1764 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1765 }
16d20bd9
AD
1766 *lp = 0;
1767 return "";
1768 }
463ee0b2 1769 }
ed6116ce
LW
1770 if (SvTHINKFIRST(sv)) {
1771 if (SvROK(sv)) {
a0d0e21e
LW
1772 SV* tmpstr;
1773 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
9e7bc3e8 1774 return SvPV(tmpstr,*lp);
ed6116ce
LW
1775 sv = (SV*)SvRV(sv);
1776 if (!sv)
1777 s = "NULLREF";
1778 else {
f9277f47
IZ
1779 MAGIC *mg;
1780
ed6116ce 1781 switch (SvTYPE(sv)) {
f9277f47
IZ
1782 case SVt_PVMG:
1783 if ( ((SvFLAGS(sv) &
1784 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
3149a8e4 1785 == (SVs_OBJECT|SVs_RMG))
57668c4d 1786 && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp")
f9277f47 1787 && (mg = mg_find(sv, 'r'))) {
5c0ca799 1788 dTHR;
2cd61cdb 1789 regexp *re = (regexp *)mg->mg_obj;
1bd3ad17 1790
2cd61cdb 1791 if (!mg->mg_ptr) {
8782bef2
GB
1792 char *fptr = "msix";
1793 char reflags[6];
1794 char ch;
1795 int left = 0;
1796 int right = 4;
1797 U16 reganch = (re->reganch & PMf_COMPILETIME) >> 12;
1798
1799 while(ch = *fptr++) {
1800 if(reganch & 1) {
1801 reflags[left++] = ch;
1802 }
1803 else {
1804 reflags[right--] = ch;
1805 }
1806 reganch >>= 1;
1807 }
1808 if(left != 4) {
1809 reflags[left] = '-';
1810 left = 5;
1811 }
1812
1813 mg->mg_len = re->prelen + 4 + left;
1814 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
1815 Copy("(?", mg->mg_ptr, 2, char);
1816 Copy(reflags, mg->mg_ptr+2, left, char);
1817 Copy(":", mg->mg_ptr+left+2, 1, char);
1818 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
1bd3ad17
IZ
1819 mg->mg_ptr[mg->mg_len - 1] = ')';
1820 mg->mg_ptr[mg->mg_len] = 0;
1821 }
3280af22 1822 PL_reginterp_cnt += re->program[0].next_off;
1bd3ad17
IZ
1823 *lp = mg->mg_len;
1824 return mg->mg_ptr;
f9277f47
IZ
1825 }
1826 /* Fall through */
ed6116ce
LW
1827 case SVt_NULL:
1828 case SVt_IV:
1829 case SVt_NV:
1830 case SVt_RV:
1831 case SVt_PV:
1832 case SVt_PVIV:
1833 case SVt_PVNV:
f9277f47 1834 case SVt_PVBM: s = "SCALAR"; break;
ed6116ce
LW
1835 case SVt_PVLV: s = "LVALUE"; break;
1836 case SVt_PVAV: s = "ARRAY"; break;
1837 case SVt_PVHV: s = "HASH"; break;
1838 case SVt_PVCV: s = "CODE"; break;
1839 case SVt_PVGV: s = "GLOB"; break;
1d2dff63 1840 case SVt_PVFM: s = "FORMAT"; break;
36477c24 1841 case SVt_PVIO: s = "IO"; break;
ed6116ce
LW
1842 default: s = "UNKNOWN"; break;
1843 }
46fc3d4c 1844 tsv = NEWSV(0,0);
ed6116ce 1845 if (SvOBJECT(sv))
cea2e8a9 1846 Perl_sv_setpvf(aTHX_ tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
ed6116ce 1847 else
46fc3d4c 1848 sv_setpv(tsv, s);
25da4f38 1849 /* XXXX 64-bit? */
cea2e8a9 1850 Perl_sv_catpvf(aTHX_ tsv, "(0x%lx)", (unsigned long)sv);
a0d0e21e 1851 goto tokensaveref;
463ee0b2 1852 }
ed6116ce
LW
1853 *lp = strlen(s);
1854 return s;
79072805 1855 }
ed6116ce 1856 if (SvREADONLY(sv)) {
25da4f38
IZ
1857 if (SvNOKp(sv)) { /* See note in sv_2uv() */
1858 /* XXXX 64-bit? IV may have better precision... */
96827780 1859 Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
46fc3d4c 1860 tsv = Nullsv;
a0d0e21e 1861 goto tokensave;
ed6116ce 1862 }
8bb9dbe4 1863 if (SvIOKp(sv)) {
25da4f38
IZ
1864 char *ebuf;
1865
1866 if (SvIsUV(sv))
1867 tmpbuf = uiv_2buf(tbuf, 0, SvUVX(sv), 1, &ebuf);
1868 else
1869 tmpbuf = uiv_2buf(tbuf, SvIVX(sv), 0, 0, &ebuf);
1870 *ebuf = 0;
46fc3d4c 1871 tsv = Nullsv;
8bb9dbe4
LW
1872 goto tokensave;
1873 }
d008e5eb
GS
1874 {
1875 dTHR;
1876 if (ckWARN(WARN_UNINITIALIZED))
cea2e8a9 1877 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit);
d008e5eb 1878 }
ed6116ce
LW
1879 *lp = 0;
1880 return "";
79072805 1881 }
79072805 1882 }
25da4f38
IZ
1883 if (SvNOKp(sv)) { /* See note in sv_2uv() */
1884 /* XXXX 64-bit? IV may have better precision... */
79072805
LW
1885 if (SvTYPE(sv) < SVt_PVNV)
1886 sv_upgrade(sv, SVt_PVNV);
1887 SvGROW(sv, 28);
463ee0b2 1888 s = SvPVX(sv);
79072805 1889 olderrno = errno; /* some Xenix systems wipe out errno here */
79072805 1890#ifdef apollo
463ee0b2 1891 if (SvNVX(sv) == 0.0)
79072805
LW
1892 (void)strcpy(s,"0");
1893 else
1894#endif /*apollo*/
bbce6d69 1895 {
a0d0e21e 1896 Gconvert(SvNVX(sv), DBL_DIG, 0, s);
bbce6d69 1897 }
79072805 1898 errno = olderrno;
a0d0e21e
LW
1899#ifdef FIXNEGATIVEZERO
1900 if (*s == '-' && s[1] == '0' && !s[2])
1901 strcpy(s,"0");
1902#endif
79072805
LW
1903 while (*s) s++;
1904#ifdef hcx
1905 if (s[-1] == '.')
46fc3d4c 1906 *--s = '\0';
79072805
LW
1907#endif
1908 }
748a9306 1909 else if (SvIOKp(sv)) {
25da4f38
IZ
1910 U32 isIOK = SvIOK(sv);
1911 char buf[TYPE_CHARS(UV)];
1912 char *ebuf, *ptr;
1913
79072805
LW
1914 if (SvTYPE(sv) < SVt_PVIV)
1915 sv_upgrade(sv, SVt_PVIV);
25da4f38
IZ
1916 if (SvIsUV(sv)) {
1917 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
1918 sv_setpvn(sv, ptr, ebuf - ptr);
1919 SvIsUV_on(sv);
1920 }
1921 else {
1922 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
1923 sv_setpvn(sv, ptr, ebuf - ptr);
1924 }
46fc3d4c 1925 s = SvEND(sv);
25da4f38 1926 if (isIOK)
64f14228
GA
1927 SvIOK_on(sv);
1928 else
1929 SvIOKp_on(sv);
79072805
LW
1930 }
1931 else {
11343788 1932 dTHR;
599cee73 1933 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
cea2e8a9 1934 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit);
a0d0e21e 1935 *lp = 0;
25da4f38
IZ
1936 if (SvTYPE(sv) < SVt_PV)
1937 /* Typically the caller expects that sv_any is not NULL now. */
1938 sv_upgrade(sv, SVt_PV);
a0d0e21e 1939 return "";
79072805 1940 }
463ee0b2
LW
1941 *lp = s - SvPVX(sv);
1942 SvCUR_set(sv, *lp);
79072805 1943 SvPOK_on(sv);
760ac839 1944 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",(unsigned long)sv,SvPVX(sv)));
463ee0b2 1945 return SvPVX(sv);
a0d0e21e
LW
1946
1947 tokensave:
1948 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
1949 /* Sneaky stuff here */
1950
1951 tokensaveref:
46fc3d4c 1952 if (!tsv)
96827780 1953 tsv = newSVpv(tmpbuf, 0);
46fc3d4c 1954 sv_2mortal(tsv);
1955 *lp = SvCUR(tsv);
1956 return SvPVX(tsv);
a0d0e21e
LW
1957 }
1958 else {
1959 STRLEN len;
46fc3d4c 1960 char *t;
1961
1962 if (tsv) {
1963 sv_2mortal(tsv);
1964 t = SvPVX(tsv);
1965 len = SvCUR(tsv);
1966 }
1967 else {
96827780
MB
1968 t = tmpbuf;
1969 len = strlen(tmpbuf);
46fc3d4c 1970 }
a0d0e21e 1971#ifdef FIXNEGATIVEZERO
46fc3d4c 1972 if (len == 2 && t[0] == '-' && t[1] == '0') {
1973 t = "0";
1974 len = 1;
1975 }
a0d0e21e
LW
1976#endif
1977 (void)SvUPGRADE(sv, SVt_PV);
46fc3d4c 1978 *lp = len;
a0d0e21e
LW
1979 s = SvGROW(sv, len + 1);
1980 SvCUR_set(sv, len);
46fc3d4c 1981 (void)strcpy(s, t);
6bf554b4 1982 SvPOKp_on(sv);
a0d0e21e
LW
1983 return s;
1984 }
463ee0b2
LW
1985}
1986
1987/* This function is only called on magical items */
1988bool
864dbfa3 1989Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 1990{
8990e307 1991 if (SvGMAGICAL(sv))
463ee0b2
LW
1992 mg_get(sv);
1993
a0d0e21e
LW
1994 if (!SvOK(sv))
1995 return 0;
1996 if (SvROK(sv)) {
11343788 1997 dTHR;
a0d0e21e
LW
1998 SV* tmpsv;
1999 if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
9e7bc3e8 2000 return SvTRUE(tmpsv);
a0d0e21e
LW
2001 return SvRV(sv) != 0;
2002 }
463ee0b2 2003 if (SvPOKp(sv)) {
11343788
MB
2004 register XPV* Xpvtmp;
2005 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
2006 (*Xpvtmp->xpv_pv > '0' ||
2007 Xpvtmp->xpv_cur > 1 ||
2008 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
463ee0b2
LW
2009 return 1;
2010 else
2011 return 0;
2012 }
2013 else {
2014 if (SvIOKp(sv))
2015 return SvIVX(sv) != 0;
2016 else {
2017 if (SvNOKp(sv))
2018 return SvNVX(sv) != 0.0;
2019 else
2020 return FALSE;
2021 }
2022 }
79072805
LW
2023}
2024
2025/* Note: sv_setsv() should not be called with a source string that needs
463ee0b2 2026 * to be reused, since it may destroy the source string if it is marked
79072805
LW
2027 * as temporary.
2028 */
2029
2030void
864dbfa3 2031Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
79072805 2032{
11343788 2033 dTHR;
8990e307
LW
2034 register U32 sflags;
2035 register int dtype;
2036 register int stype;
463ee0b2 2037
79072805
LW
2038 if (sstr == dstr)
2039 return;
2213622d 2040 SV_CHECK_THINKFIRST(dstr);
79072805 2041 if (!sstr)
3280af22 2042 sstr = &PL_sv_undef;
8990e307
LW
2043 stype = SvTYPE(sstr);
2044 dtype = SvTYPE(dstr);
79072805 2045
a0d0e21e 2046 SvAMAGIC_off(dstr);
9e7bc3e8 2047
463ee0b2 2048 /* There's a lot of redundancy below but we're going for speed here */
79072805 2049
8990e307 2050 switch (stype) {
79072805 2051 case SVt_NULL:
aece5585 2052 undef_sstr:
20408e3c
GS
2053 if (dtype != SVt_PVGV) {
2054 (void)SvOK_off(dstr);
2055 return;
2056 }
2057 break;
463ee0b2 2058 case SVt_IV:
aece5585
GA
2059 if (SvIOK(sstr)) {
2060 switch (dtype) {
2061 case SVt_NULL:
8990e307 2062 sv_upgrade(dstr, SVt_IV);
aece5585
GA
2063 break;
2064 case SVt_NV:
8990e307 2065 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
2066 break;
2067 case SVt_RV:
2068 case SVt_PV:
a0d0e21e 2069 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
2070 break;
2071 }
2072 (void)SvIOK_only(dstr);
2073 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2074 if (SvIsUV(sstr))
2075 SvIsUV_on(dstr);
aece5585
GA
2076 SvTAINT(dstr);
2077 return;
8990e307 2078 }
aece5585
GA
2079 goto undef_sstr;
2080
463ee0b2 2081 case SVt_NV:
aece5585
GA
2082 if (SvNOK(sstr)) {
2083 switch (dtype) {
2084 case SVt_NULL:
2085 case SVt_IV:
8990e307 2086 sv_upgrade(dstr, SVt_NV);
aece5585
GA
2087 break;
2088 case SVt_RV:
2089 case SVt_PV:
2090 case SVt_PVIV:
a0d0e21e 2091 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
2092 break;
2093 }
2094 SvNVX(dstr) = SvNVX(sstr);
2095 (void)SvNOK_only(dstr);
2096 SvTAINT(dstr);
2097 return;
8990e307 2098 }
aece5585
GA
2099 goto undef_sstr;
2100
ed6116ce 2101 case SVt_RV:
8990e307 2102 if (dtype < SVt_RV)
ed6116ce 2103 sv_upgrade(dstr, SVt_RV);
c07a80fd 2104 else if (dtype == SVt_PVGV &&
2105 SvTYPE(SvRV(sstr)) == SVt_PVGV) {
2106 sstr = SvRV(sstr);
a5f75d66 2107 if (sstr == dstr) {
3280af22 2108 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66
AD
2109 GvIMPORTED_on(dstr);
2110 GvMULTI_on(dstr);
2111 return;
2112 }
c07a80fd 2113 goto glob_assign;
2114 }
ed6116ce 2115 break;
463ee0b2 2116 case SVt_PV:
fc36a67e 2117 case SVt_PVFM:
8990e307 2118 if (dtype < SVt_PV)
463ee0b2 2119 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
2120 break;
2121 case SVt_PVIV:
8990e307 2122 if (dtype < SVt_PVIV)
463ee0b2 2123 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
2124 break;
2125 case SVt_PVNV:
8990e307 2126 if (dtype < SVt_PVNV)
463ee0b2 2127 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 2128 break;
4633a7c4
LW
2129 case SVt_PVAV:
2130 case SVt_PVHV:
2131 case SVt_PVCV:
4633a7c4 2132 case SVt_PVIO:
533c011a 2133 if (PL_op)
cea2e8a9 2134 Perl_croak(aTHX_ "Bizarre copy of %s in %s", sv_reftype(sstr, 0),
22c35a8c 2135 PL_op_name[PL_op->op_type]);
4633a7c4 2136 else
cea2e8a9 2137 Perl_croak(aTHX_ "Bizarre copy of %s", sv_reftype(sstr, 0));
4633a7c4
LW
2138 break;
2139
79072805 2140 case SVt_PVGV:
8990e307 2141 if (dtype <= SVt_PVGV) {
c07a80fd 2142 glob_assign:
a5f75d66 2143 if (dtype != SVt_PVGV) {
a0d0e21e
LW
2144 char *name = GvNAME(sstr);
2145 STRLEN len = GvNAMELEN(sstr);
463ee0b2 2146 sv_upgrade(dstr, SVt_PVGV);
a0d0e21e 2147 sv_magic(dstr, dstr, '*', name, len);
85aff577 2148 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
2149 GvNAME(dstr) = savepvn(name, len);
2150 GvNAMELEN(dstr) = len;
2151 SvFAKE_on(dstr); /* can coerce to non-glob */
2152 }
7bac28a0 2153 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
2154 else if (PL_curstackinfo->si_type == PERLSI_SORT
2155 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
cea2e8a9 2156 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
7bac28a0 2157 GvNAME(dstr));
a0d0e21e 2158 (void)SvOK_off(dstr);
a5f75d66 2159 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 2160 gp_free((GV*)dstr);
79072805 2161 GvGP(dstr) = gp_ref(GvGP(sstr));
8990e307 2162 SvTAINT(dstr);
3280af22 2163 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66
AD
2164 GvIMPORTED_on(dstr);
2165 GvMULTI_on(dstr);
79072805
LW
2166 return;
2167 }
2168 /* FALL THROUGH */
2169
2170 default:
973f89ab
CS
2171 if (SvGMAGICAL(sstr)) {
2172 mg_get(sstr);
2173 if (SvTYPE(sstr) != stype) {
2174 stype = SvTYPE(sstr);
2175 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
2176 goto glob_assign;
2177 }
2178 }
ded42b9f 2179 if (stype == SVt_PVLV)
6fc92669 2180 (void)SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 2181 else
6fc92669 2182 (void)SvUPGRADE(dstr, stype);
79072805
LW
2183 }
2184
8990e307
LW
2185 sflags = SvFLAGS(sstr);
2186
2187 if (sflags & SVf_ROK) {
2188 if (dtype >= SVt_PV) {
2189 if (dtype == SVt_PVGV) {
2190 SV *sref = SvREFCNT_inc(SvRV(sstr));
2191 SV *dref = 0;
a5f75d66 2192 int intro = GvINTRO(dstr);
a0d0e21e
LW
2193
2194 if (intro) {
2195 GP *gp;
2196 GvGP(dstr)->gp_refcnt--;
a5f75d66 2197 GvINTRO_off(dstr); /* one-shot flag */
a0d0e21e 2198 Newz(602,gp, 1, GP);
44a8e56a 2199 GvGP(dstr) = gp_ref(gp);
a0d0e21e 2200 GvSV(dstr) = NEWSV(72,0);
3280af22 2201 GvLINE(dstr) = PL_curcop->cop_line;
1edc1566 2202 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 2203 }
a5f75d66 2204 GvMULTI_on(dstr);
8990e307
LW
2205 switch (SvTYPE(sref)) {
2206 case SVt_PVAV:
a0d0e21e
LW
2207 if (intro)
2208 SAVESPTR(GvAV(dstr));
2209 else
2210 dref = (SV*)GvAV(dstr);
8990e307 2211 GvAV(dstr) = (AV*)sref;
3280af22 2212 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2213 GvIMPORTED_AV_on(dstr);
8990e307
LW
2214 break;
2215 case SVt_PVHV:
a0d0e21e
LW
2216 if (intro)
2217 SAVESPTR(GvHV(dstr));
2218 else
2219 dref = (SV*)GvHV(dstr);
8990e307 2220 GvHV(dstr) = (HV*)sref;
3280af22 2221 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2222 GvIMPORTED_HV_on(dstr);
8990e307
LW
2223 break;
2224 case SVt_PVCV:
8ebc5c01 2225 if (intro) {
2226 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
2227 SvREFCNT_dec(GvCV(dstr));
2228 GvCV(dstr) = Nullcv;
68dc0745 2229 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 2230 PL_sub_generation++;
8ebc5c01 2231 }
a0d0e21e 2232 SAVESPTR(GvCV(dstr));
8ebc5c01 2233 }
68dc0745 2234 else
2235 dref = (SV*)GvCV(dstr);
2236 if (GvCV(dstr) != (CV*)sref) {
748a9306 2237 CV* cv = GvCV(dstr);
4633a7c4 2238 if (cv) {
68dc0745 2239 if (!GvCVGEN((GV*)dstr) &&
2240 (CvROOT(cv) || CvXSUB(cv)))
2241 {
fe5e78ed
GS
2242 SV *const_sv = cv_const_sv(cv);
2243 bool const_changed = TRUE;
2244 if(const_sv)
2245 const_changed = sv_cmp(const_sv,
2246 op_const_sv(CvSTART((CV*)sref),
2247 Nullcv));
7bac28a0 2248 /* ahem, death to those who redefine
2249 * active sort subs */
3280af22
NIS
2250 if (PL_curstackinfo->si_type == PERLSI_SORT &&
2251 PL_sortcop == CvSTART(cv))
cea2e8a9 2252 Perl_croak(aTHX_
7bac28a0 2253 "Can't redefine active sort subroutine %s",
2254 GvENAME((GV*)dstr));
599cee73 2255 if (ckWARN(WARN_REDEFINE) || (const_changed && const_sv)) {
2f34f9d4
IZ
2256 if (!(CvGV(cv) && GvSTASH(CvGV(cv))
2257 && HvNAME(GvSTASH(CvGV(cv)))
2258 && strEQ(HvNAME(GvSTASH(CvGV(cv))),
2259 "autouse")))
cea2e8a9 2260 Perl_warner(aTHX_ WARN_REDEFINE, const_sv ?
fe5e78ed
GS
2261 "Constant subroutine %s redefined"
2262 : "Subroutine %s redefined",
2f34f9d4
IZ
2263 GvENAME((GV*)dstr));
2264 }
9607fc9c 2265 }
3fe9a6f1 2266 cv_ckproto(cv, (GV*)dstr,
2267 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 2268 }
a5f75d66 2269 GvCV(dstr) = (CV*)sref;
7a4c00b4 2270 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 2271 GvASSUMECV_on(dstr);
3280af22 2272 PL_sub_generation++;
a5f75d66 2273 }
3280af22 2274 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2275 GvIMPORTED_CV_on(dstr);
8990e307 2276 break;
91bba347
LW
2277 case SVt_PVIO:
2278 if (intro)
2279 SAVESPTR(GvIOp(dstr));
2280 else
2281 dref = (SV*)GvIOp(dstr);
2282 GvIOp(dstr) = (IO*)sref;
2283 break;
8990e307 2284 default:
a0d0e21e
LW
2285 if (intro)
2286 SAVESPTR(GvSV(dstr));
2287 else
2288 dref = (SV*)GvSV(dstr);
8990e307 2289 GvSV(dstr) = sref;
3280af22 2290 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2291 GvIMPORTED_SV_on(dstr);
8990e307
LW
2292 break;
2293 }
2294 if (dref)
2295 SvREFCNT_dec(dref);
a0d0e21e
LW
2296 if (intro)
2297 SAVEFREESV(sref);
8990e307
LW
2298 SvTAINT(dstr);
2299 return;
2300 }
a0d0e21e 2301 if (SvPVX(dstr)) {
760ac839 2302 (void)SvOOK_off(dstr); /* backoff */
50483b2c
JD
2303 if (SvLEN(dstr))
2304 Safefree(SvPVX(dstr));
a0d0e21e
LW
2305 SvLEN(dstr)=SvCUR(dstr)=0;
2306 }
8990e307 2307 }
a0d0e21e 2308 (void)SvOK_off(dstr);
8990e307 2309 SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
ed6116ce 2310 SvROK_on(dstr);
8990e307 2311 if (sflags & SVp_NOK) {
ed6116ce
LW
2312 SvNOK_on(dstr);
2313 SvNVX(dstr) = SvNVX(sstr);
2314 }
8990e307 2315 if (sflags & SVp_IOK) {
a0d0e21e 2316 (void)SvIOK_on(dstr);
ed6116ce 2317 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2318 if (SvIsUV(sstr))
2319 SvIsUV_on(dstr);
ed6116ce 2320 }
a0d0e21e
LW
2321 if (SvAMAGIC(sstr)) {
2322 SvAMAGIC_on(dstr);
2323 }
ed6116ce 2324 }
8990e307 2325 else if (sflags & SVp_POK) {
79072805
LW
2326
2327 /*
2328 * Check to see if we can just swipe the string. If so, it's a
2329 * possible small lose on short strings, but a big win on long ones.
463ee0b2
LW
2330 * It might even be a win on short strings if SvPVX(dstr)
2331 * has to be allocated and SvPVX(sstr) has to be freed.
79072805
LW
2332 */
2333
ff68c719 2334 if (SvTEMP(sstr) && /* slated for free anyway? */
01b73108 2335 SvREFCNT(sstr) == 1 && /* and no other references to it? */
a5f75d66
AD
2336 !(sflags & SVf_OOK)) /* and not involved in OOK hack? */
2337 {
adbc6bb1 2338 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
2339 if (SvOOK(dstr)) {
2340 SvFLAGS(dstr) &= ~SVf_OOK;
2341 Safefree(SvPVX(dstr) - SvIVX(dstr));
2342 }
50483b2c 2343 else if (SvLEN(dstr))
a5f75d66 2344 Safefree(SvPVX(dstr));
79072805 2345 }
a5f75d66 2346 (void)SvPOK_only(dstr);
463ee0b2 2347 SvPV_set(dstr, SvPVX(sstr));
79072805
LW
2348 SvLEN_set(dstr, SvLEN(sstr));
2349 SvCUR_set(dstr, SvCUR(sstr));
79072805 2350 SvTEMP_off(dstr);
a5f75d66 2351 (void)SvOK_off(sstr);
79072805
LW
2352 SvPV_set(sstr, Nullch);
2353 SvLEN_set(sstr, 0);
a5f75d66
AD
2354 SvCUR_set(sstr, 0);
2355 SvTEMP_off(sstr);
79072805
LW
2356 }
2357 else { /* have to copy actual string */
8990e307
LW
2358 STRLEN len = SvCUR(sstr);
2359
2360 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
2361 Move(SvPVX(sstr),SvPVX(dstr),len,char);
2362 SvCUR_set(dstr, len);
2363 *SvEND(dstr) = '\0';
a0d0e21e 2364 (void)SvPOK_only(dstr);
79072805
LW
2365 }
2366 /*SUPPRESS 560*/
8990e307 2367 if (sflags & SVp_NOK) {
79072805 2368 SvNOK_on(dstr);
463ee0b2 2369 SvNVX(dstr) = SvNVX(sstr);
79072805 2370 }
8990e307 2371 if (sflags & SVp_IOK) {
a0d0e21e 2372 (void)SvIOK_on(dstr);
463ee0b2 2373 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2374 if (SvIsUV(sstr))
2375 SvIsUV_on(dstr);
79072805
LW
2376 }
2377 }
8990e307 2378 else if (sflags & SVp_NOK) {
463ee0b2 2379 SvNVX(dstr) = SvNVX(sstr);
a0d0e21e 2380 (void)SvNOK_only(dstr);
79072805 2381 if (SvIOK(sstr)) {
a0d0e21e 2382 (void)SvIOK_on(dstr);
463ee0b2 2383 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2384 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2385 if (SvIsUV(sstr))
2386 SvIsUV_on(dstr);
79072805
LW
2387 }
2388 }
8990e307 2389 else if (sflags & SVp_IOK) {
a0d0e21e 2390 (void)SvIOK_only(dstr);
463ee0b2 2391 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2392 if (SvIsUV(sstr))
2393 SvIsUV_on(dstr);
79072805
LW
2394 }
2395 else {
20408e3c 2396 if (dtype == SVt_PVGV) {
599cee73 2397 if (ckWARN(WARN_UNSAFE))
cea2e8a9 2398 Perl_warner(aTHX_ WARN_UNSAFE, "Undefined value assigned to typeglob");
20408e3c
GS
2399 }
2400 else
2401 (void)SvOK_off(dstr);
a0d0e21e 2402 }
463ee0b2 2403 SvTAINT(dstr);
79072805
LW
2404}
2405
2406void
864dbfa3 2407Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
2408{
2409 sv_setsv(dstr,sstr);
2410 SvSETMAGIC(dstr);
2411}
2412
2413void
864dbfa3 2414Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 2415{
c6f8c383 2416 register char *dptr;
4561caa4
CS
2417 assert(len >= 0); /* STRLEN is probably unsigned, so this may
2418 elicit a warning, but it won't hurt. */
2213622d 2419 SV_CHECK_THINKFIRST(sv);
463ee0b2 2420 if (!ptr) {
a0d0e21e 2421 (void)SvOK_off(sv);
463ee0b2
LW
2422 return;
2423 }
6fc92669 2424 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 2425
79072805 2426 SvGROW(sv, len + 1);
c6f8c383
GA
2427 dptr = SvPVX(sv);
2428 Move(ptr,dptr,len,char);
2429 dptr[len] = '\0';
79072805 2430 SvCUR_set(sv, len);
a0d0e21e 2431 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2432 SvTAINT(sv);
79072805
LW
2433}
2434
2435void
864dbfa3 2436Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
2437{
2438 sv_setpvn(sv,ptr,len);
2439 SvSETMAGIC(sv);
2440}
2441
2442void
864dbfa3 2443Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
2444{
2445 register STRLEN len;
2446
2213622d 2447 SV_CHECK_THINKFIRST(sv);
463ee0b2 2448 if (!ptr) {
a0d0e21e 2449 (void)SvOK_off(sv);
463ee0b2
LW
2450 return;
2451 }
79072805 2452 len = strlen(ptr);
6fc92669 2453 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 2454
79072805 2455 SvGROW(sv, len + 1);
463ee0b2 2456 Move(ptr,SvPVX(sv),len+1,char);
79072805 2457 SvCUR_set(sv, len);
a0d0e21e 2458 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2
LW
2459 SvTAINT(sv);
2460}
2461
2462void
864dbfa3 2463Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
2464{
2465 sv_setpv(sv,ptr);
2466 SvSETMAGIC(sv);
2467}
2468
2469void
864dbfa3 2470Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 2471{
2213622d 2472 SV_CHECK_THINKFIRST(sv);
c6f8c383 2473 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 2474 if (!ptr) {
a0d0e21e 2475 (void)SvOK_off(sv);
463ee0b2
LW
2476 return;
2477 }
a0ed51b3 2478 (void)SvOOK_off(sv);
50483b2c 2479 if (SvPVX(sv) && SvLEN(sv))
463ee0b2
LW
2480 Safefree(SvPVX(sv));
2481 Renew(ptr, len+1, char);
2482 SvPVX(sv) = ptr;
2483 SvCUR_set(sv, len);
2484 SvLEN_set(sv, len+1);
2485 *SvEND(sv) = '\0';
a0d0e21e 2486 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2487 SvTAINT(sv);
79072805
LW
2488}
2489
ef50df4b 2490void
864dbfa3 2491Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 2492{
51c1089b 2493 sv_usepvn(sv,ptr,len);
ef50df4b
GS
2494 SvSETMAGIC(sv);
2495}
2496
6fc92669 2497void
864dbfa3 2498Perl_sv_force_normal(pTHX_ register SV *sv)
0f15f207 2499{
2213622d
GA
2500 if (SvREADONLY(sv)) {
2501 dTHR;
3280af22 2502 if (PL_curcop != &PL_compiling)
cea2e8a9 2503 Perl_croak(aTHX_ PL_no_modify);
0f15f207 2504 }
2213622d
GA
2505 if (SvROK(sv))
2506 sv_unref(sv);
6fc92669
GS
2507 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
2508 sv_unglob(sv);
0f15f207
MB
2509}
2510
79072805 2511void
864dbfa3 2512Perl_sv_chop(pTHX_ register SV *sv, register char *ptr) /* like set but assuming ptr is in sv */
8ac85365
NIS
2513
2514
79072805
LW
2515{
2516 register STRLEN delta;
2517
a0d0e21e 2518 if (!ptr || !SvPOKp(sv))
79072805 2519 return;
2213622d 2520 SV_CHECK_THINKFIRST(sv);
79072805
LW
2521 if (SvTYPE(sv) < SVt_PVIV)
2522 sv_upgrade(sv,SVt_PVIV);
2523
2524 if (!SvOOK(sv)) {
50483b2c
JD
2525 if (!SvLEN(sv)) { /* make copy of shared string */
2526 char *pvx = SvPVX(sv);
2527 STRLEN len = SvCUR(sv);
2528 SvGROW(sv, len + 1);
2529 Move(pvx,SvPVX(sv),len,char);
2530 *SvEND(sv) = '\0';
2531 }
463ee0b2 2532 SvIVX(sv) = 0;
79072805
LW
2533 SvFLAGS(sv) |= SVf_OOK;
2534 }
25da4f38 2535 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK|SVf_IVisUV);
463ee0b2 2536 delta = ptr - SvPVX(sv);
79072805
LW
2537 SvLEN(sv) -= delta;
2538 SvCUR(sv) -= delta;
463ee0b2
LW
2539 SvPVX(sv) += delta;
2540 SvIVX(sv) += delta;
79072805
LW
2541}
2542
2543void
864dbfa3 2544Perl_sv_catpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 2545{
463ee0b2 2546 STRLEN tlen;
748a9306 2547 char *junk;
a0d0e21e 2548
748a9306 2549 junk = SvPV_force(sv, tlen);
463ee0b2 2550 SvGROW(sv, tlen + len + 1);
4633a7c4
LW
2551 if (ptr == junk)
2552 ptr = SvPVX(sv);
463ee0b2 2553 Move(ptr,SvPVX(sv)+tlen,len,char);
79072805
LW
2554 SvCUR(sv) += len;
2555 *SvEND(sv) = '\0';
a0d0e21e 2556 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2557 SvTAINT(sv);
79072805
LW
2558}
2559
2560void
864dbfa3 2561Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
2562{
2563 sv_catpvn(sv,ptr,len);
2564 SvSETMAGIC(sv);
2565}
2566
2567void
864dbfa3 2568Perl_sv_catsv(pTHX_ SV *dstr, register SV *sstr)
79072805
LW
2569{
2570 char *s;
463ee0b2 2571 STRLEN len;
79072805
LW
2572 if (!sstr)
2573 return;
463ee0b2
LW
2574 if (s = SvPV(sstr, len))
2575 sv_catpvn(dstr,s,len);
79072805
LW
2576}
2577
2578void
864dbfa3 2579Perl_sv_catsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
2580{
2581 sv_catsv(dstr,sstr);
2582 SvSETMAGIC(dstr);
2583}
2584
2585void
864dbfa3 2586Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
2587{
2588 register STRLEN len;
463ee0b2 2589 STRLEN tlen;
748a9306 2590 char *junk;
79072805 2591
79072805
LW
2592 if (!ptr)
2593 return;
748a9306 2594 junk = SvPV_force(sv, tlen);
79072805 2595 len = strlen(ptr);
463ee0b2 2596 SvGROW(sv, tlen + len + 1);
4633a7c4
LW
2597 if (ptr == junk)
2598 ptr = SvPVX(sv);
463ee0b2 2599 Move(ptr,SvPVX(sv)+tlen,len+1,char);
79072805 2600 SvCUR(sv) += len;
a0d0e21e 2601 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2602 SvTAINT(sv);
79072805
LW
2603}
2604
ef50df4b 2605void
864dbfa3 2606Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 2607{
51c1089b 2608 sv_catpv(sv,ptr);
ef50df4b
GS
2609 SvSETMAGIC(sv);
2610}
2611
79072805 2612SV *
864dbfa3 2613Perl_newSV(pTHX_ STRLEN len)
79072805
LW
2614{
2615 register SV *sv;
2616
4561caa4 2617 new_SV(sv);
79072805
LW
2618 if (len) {
2619 sv_upgrade(sv, SVt_PV);
2620 SvGROW(sv, len + 1);
2621 }
2622 return sv;
2623}
2624
1edc1566 2625/* name is assumed to contain an SV* if (name && namelen == HEf_SVKEY) */
2626
79072805 2627void
864dbfa3 2628Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
79072805
LW
2629{
2630 MAGIC* mg;
2631
0f15f207
MB
2632 if (SvREADONLY(sv)) {
2633 dTHR;
3280af22 2634 if (PL_curcop != &PL_compiling && !strchr("gBf", how))
cea2e8a9 2635 Perl_croak(aTHX_ PL_no_modify);
0f15f207 2636 }
4633a7c4 2637 if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
748a9306
LW
2638 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
2639 if (how == 't')
565764a8 2640 mg->mg_len |= 1;
463ee0b2 2641 return;
748a9306 2642 }
463ee0b2
LW
2643 }
2644 else {
c6f8c383 2645 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 2646 }
79072805
LW
2647 Newz(702,mg, 1, MAGIC);
2648 mg->mg_moremagic = SvMAGIC(sv);
463ee0b2 2649
79072805 2650 SvMAGIC(sv) = mg;
c277df42 2651 if (!obj || obj == sv || how == '#' || how == 'r')
8990e307 2652 mg->mg_obj = obj;
85e6fe83 2653 else {
11343788 2654 dTHR;
8990e307 2655 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
2656 mg->mg_flags |= MGf_REFCOUNTED;
2657 }
79072805 2658 mg->mg_type = how;
565764a8 2659 mg->mg_len = namlen;
1edc1566 2660 if (name)
2661 if (namlen >= 0)
2662 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 2663 else if (namlen == HEf_SVKEY)
1edc1566 2664 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
2665
79072805
LW
2666 switch (how) {
2667 case 0:
22c35a8c 2668 mg->mg_virtual = &PL_vtbl_sv;
79072805 2669 break;
a0d0e21e 2670 case 'A':
22c35a8c 2671 mg->mg_virtual = &PL_vtbl_amagic;
a0d0e21e
LW
2672 break;
2673 case 'a':
22c35a8c 2674 mg->mg_virtual = &PL_vtbl_amagicelem;
a0d0e21e
LW
2675 break;
2676 case 'c':
2677 mg->mg_virtual = 0;
2678 break;
79072805 2679 case 'B':
22c35a8c 2680 mg->mg_virtual = &PL_vtbl_bm;
79072805 2681 break;
6cef1e77 2682 case 'D':
22c35a8c 2683 mg->mg_virtual = &PL_vtbl_regdata;
6cef1e77
IZ
2684 break;
2685 case 'd':
22c35a8c 2686 mg->mg_virtual = &PL_vtbl_regdatum;
6cef1e77 2687 break;
79072805 2688 case 'E':
22c35a8c 2689 mg->mg_virtual = &PL_vtbl_env;
79072805 2690 break;
55497cff 2691 case 'f':
22c35a8c 2692 mg->mg_virtual = &PL_vtbl_fm;
55497cff 2693 break;
79072805 2694 case 'e':
22c35a8c 2695 mg->mg_virtual = &PL_vtbl_envelem;
79072805 2696 break;
93a17b20 2697 case 'g':
22c35a8c 2698 mg->mg_virtual = &PL_vtbl_mglob;
93a17b20 2699 break;
463ee0b2 2700 case 'I':
22c35a8c 2701 mg->mg_virtual = &PL_vtbl_isa;
463ee0b2
LW
2702 break;
2703 case 'i':
22c35a8c 2704 mg->mg_virtual = &PL_vtbl_isaelem;
463ee0b2 2705 break;
16660edb 2706 case 'k':
22c35a8c 2707 mg->mg_virtual = &PL_vtbl_nkeys;
16660edb 2708 break;
79072805 2709 case 'L':
a0d0e21e 2710 SvRMAGICAL_on(sv);
93a17b20
LW
2711 mg->mg_virtual = 0;
2712 break;
2713 case 'l':
22c35a8c 2714 mg->mg_virtual = &PL_vtbl_dbline;
79072805 2715 break;
f93b4edd
MB
2716#ifdef USE_THREADS
2717 case 'm':
22c35a8c 2718 mg->mg_virtual = &PL_vtbl_mutex;
f93b4edd
MB
2719 break;
2720#endif /* USE_THREADS */
36477c24 2721#ifdef USE_LOCALE_COLLATE
bbce6d69 2722 case 'o':
22c35a8c 2723 mg->mg_virtual = &PL_vtbl_collxfrm;
bbce6d69 2724 break;
36477c24 2725#endif /* USE_LOCALE_COLLATE */
463ee0b2 2726 case 'P':
22c35a8c 2727 mg->mg_virtual = &PL_vtbl_pack;
463ee0b2
LW
2728 break;
2729 case 'p':
a0d0e21e 2730 case 'q':
22c35a8c 2731 mg->mg_virtual = &PL_vtbl_packelem;
463ee0b2 2732 break;
c277df42 2733 case 'r':
22c35a8c 2734 mg->mg_virtual = &PL_vtbl_regexp;
c277df42 2735 break;
79072805 2736 case 'S':
22c35a8c 2737 mg->mg_virtual = &PL_vtbl_sig;
79072805
LW
2738 break;
2739 case 's':
22c35a8c 2740 mg->mg_virtual = &PL_vtbl_sigelem;
79072805 2741 break;
463ee0b2 2742 case 't':
22c35a8c 2743 mg->mg_virtual = &PL_vtbl_taint;
565764a8 2744 mg->mg_len = 1;
463ee0b2 2745 break;
79072805 2746 case 'U':
22c35a8c 2747 mg->mg_virtual = &PL_vtbl_uvar;
79072805
LW
2748 break;
2749 case 'v':
22c35a8c 2750 mg->mg_virtual = &PL_vtbl_vec;
79072805
LW
2751 break;
2752 case 'x':
22c35a8c 2753 mg->mg_virtual = &PL_vtbl_substr;
79072805 2754 break;
5f05dabc 2755 case 'y':
22c35a8c 2756 mg->mg_virtual = &PL_vtbl_defelem;
5f05dabc 2757 break;
79072805 2758 case '*':
22c35a8c 2759 mg->mg_virtual = &PL_vtbl_glob;
79072805
LW
2760 break;
2761 case '#':
22c35a8c 2762 mg->mg_virtual = &PL_vtbl_arylen;
79072805 2763 break;
a0d0e21e 2764 case '.':
22c35a8c 2765 mg->mg_virtual = &PL_vtbl_pos;
a0d0e21e 2766 break;
810b8aa5
GS
2767 case '<':
2768 mg->mg_virtual = &PL_vtbl_backref;
2769 break;
4633a7c4
LW
2770 case '~': /* Reserved for use by extensions not perl internals. */
2771 /* Useful for attaching extension internal data to perl vars. */
2772 /* Note that multiple extensions may clash if magical scalars */
2773 /* etc holding private data from one are passed to another. */
2774 SvRMAGICAL_on(sv);
a0d0e21e 2775 break;
79072805 2776 default:
cea2e8a9 2777 Perl_croak(aTHX_ "Don't know how to handle magic of type '%c'", how);
463ee0b2 2778 }
8990e307
LW
2779 mg_magical(sv);
2780 if (SvGMAGICAL(sv))
2781 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
463ee0b2
LW
2782}
2783
2784int
864dbfa3 2785Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
2786{
2787 MAGIC* mg;
2788 MAGIC** mgp;
91bba347 2789 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
2790 return 0;
2791 mgp = &SvMAGIC(sv);
2792 for (mg = *mgp; mg; mg = *mgp) {
2793 if (mg->mg_type == type) {
2794 MGVTBL* vtbl = mg->mg_virtual;
2795 *mgp = mg->mg_moremagic;
76e3520e 2796 if (vtbl && (vtbl->svt_free != NULL))
cea2e8a9 2797 (VTBL->svt_free)(aTHX_ sv, mg);
463ee0b2 2798 if (mg->mg_ptr && mg->mg_type != 'g')
565764a8 2799 if (mg->mg_len >= 0)
1edc1566 2800 Safefree(mg->mg_ptr);
565764a8 2801 else if (mg->mg_len == HEf_SVKEY)
1edc1566 2802 SvREFCNT_dec((SV*)mg->mg_ptr);
a0d0e21e
LW
2803 if (mg->mg_flags & MGf_REFCOUNTED)
2804 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
2805 Safefree(mg);
2806 }
2807 else
2808 mgp = &mg->mg_moremagic;
79072805 2809 }
91bba347 2810 if (!SvMAGIC(sv)) {
463ee0b2 2811 SvMAGICAL_off(sv);
8990e307 2812 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
2813 }
2814
2815 return 0;
79072805
LW
2816}
2817
810b8aa5 2818SV *
864dbfa3 2819Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
2820{
2821 SV *tsv;
2822 if (!SvOK(sv)) /* let undefs pass */
2823 return sv;
2824 if (!SvROK(sv))
cea2e8a9 2825 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5
GS
2826 else if (SvWEAKREF(sv)) {
2827 dTHR;
2828 if (ckWARN(WARN_MISC))
cea2e8a9 2829 Perl_warner(aTHX_ WARN_MISC, "Reference is already weak");
810b8aa5
GS
2830 return sv;
2831 }
2832 tsv = SvRV(sv);
2833 sv_add_backref(tsv, sv);
2834 SvWEAKREF_on(sv);
2835 SvREFCNT_dec(tsv);
2836 return sv;
2837}
2838
2839STATIC void
cea2e8a9 2840S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
2841{
2842 AV *av;
2843 MAGIC *mg;
2844 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, '<')))
2845 av = (AV*)mg->mg_obj;
2846 else {
2847 av = newAV();
2848 sv_magic(tsv, (SV*)av, '<', NULL, 0);
2849 SvREFCNT_dec(av); /* for sv_magic */
2850 }
2851 av_push(av,sv);
2852}
2853
2854STATIC void
cea2e8a9 2855S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
2856{
2857 AV *av;
2858 SV **svp;
2859 I32 i;
2860 SV *tsv = SvRV(sv);
2861 MAGIC *mg;
2862 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, '<')))
cea2e8a9 2863 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
2864 av = (AV *)mg->mg_obj;
2865 svp = AvARRAY(av);
2866 i = AvFILLp(av);
2867 while (i >= 0) {
2868 if (svp[i] == sv) {
2869 svp[i] = &PL_sv_undef; /* XXX */
2870 }
2871 i--;
2872 }
2873}
2874
79072805 2875void
864dbfa3 2876Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
79072805
LW
2877{
2878 register char *big;
2879 register char *mid;
2880 register char *midend;
2881 register char *bigend;
2882 register I32 i;
6ff81951
GS
2883 STRLEN curlen;
2884
79072805 2885
8990e307 2886 if (!bigstr)
cea2e8a9 2887 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951
GS
2888 SvPV_force(bigstr, curlen);
2889 if (offset + len > curlen) {
2890 SvGROW(bigstr, offset+len+1);
2891 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
2892 SvCUR_set(bigstr, offset+len);
2893 }
79072805
LW
2894
2895 i = littlelen - len;
2896 if (i > 0) { /* string might grow */
a0d0e21e 2897 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
2898 mid = big + offset + len;
2899 midend = bigend = big + SvCUR(bigstr);
2900 bigend += i;
2901 *bigend = '\0';
2902 while (midend > mid) /* shove everything down */
2903 *--bigend = *--midend;
2904 Move(little,big+offset,littlelen,char);
2905 SvCUR(bigstr) += i;
2906 SvSETMAGIC(bigstr);
2907 return;
2908 }
2909 else if (i == 0) {
463ee0b2 2910 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
2911 SvSETMAGIC(bigstr);
2912 return;
2913 }
2914
463ee0b2 2915 big = SvPVX(bigstr);
79072805
LW
2916 mid = big + offset;
2917 midend = mid + len;
2918 bigend = big + SvCUR(bigstr);
2919
2920 if (midend > bigend)
cea2e8a9 2921 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
2922
2923 if (mid - big > bigend - midend) { /* faster to shorten from end */
2924 if (littlelen) {
2925 Move(little, mid, littlelen,char);
2926 mid += littlelen;
2927 }
2928 i = bigend - midend;
2929 if (i > 0) {
2930 Move(midend, mid, i,char);
2931 mid += i;
2932 }
2933 *mid = '\0';
2934 SvCUR_set(bigstr, mid - big);
2935 }
2936 /*SUPPRESS 560*/
2937 else if (i = mid - big) { /* faster from front */
2938 midend -= littlelen;
2939 mid = midend;
2940 sv_chop(bigstr,midend-i);
2941 big += i;
2942 while (i--)
2943 *--midend = *--big;
2944 if (littlelen)
2945 Move(little, mid, littlelen,char);
2946 }
2947 else if (littlelen) {
2948 midend -= littlelen;
2949 sv_chop(bigstr,midend);
2950 Move(little,midend,littlelen,char);
2951 }
2952 else {
2953 sv_chop(bigstr,midend);
2954 }
2955 SvSETMAGIC(bigstr);
2956}
2957
2958/* make sv point to what nstr did */
2959
2960void
864dbfa3 2961Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805
LW
2962{
2963 U32 refcnt = SvREFCNT(sv);
2213622d 2964 SV_CHECK_THINKFIRST(sv);
79072805 2965 if (SvREFCNT(nsv) != 1)
cea2e8a9 2966 Perl_warn(aTHX_ "Reference miscount in sv_replace()");
93a17b20 2967 if (SvMAGICAL(sv)) {
a0d0e21e
LW
2968 if (SvMAGICAL(nsv))
2969 mg_free(nsv);
2970 else
2971 sv_upgrade(nsv, SVt_PVMG);
93a17b20 2972 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 2973 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
2974 SvMAGICAL_off(sv);
2975 SvMAGIC(sv) = 0;
2976 }
79072805
LW
2977 SvREFCNT(sv) = 0;
2978 sv_clear(sv);
477f5d66 2979 assert(!SvREFCNT(sv));
79072805
LW
2980 StructCopy(nsv,sv,SV);
2981 SvREFCNT(sv) = refcnt;
1edc1566 2982 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
463ee0b2 2983 del_SV(nsv);
79072805
LW
2984}
2985
2986void
864dbfa3 2987Perl_sv_clear(pTHX_ register SV *sv)
79072805 2988{
ec12f114 2989 HV* stash;
79072805
LW
2990 assert(sv);
2991 assert(SvREFCNT(sv) == 0);
2992
ed6116ce 2993 if (SvOBJECT(sv)) {
e858de61 2994 dTHR;
3280af22 2995 if (PL_defstash) { /* Still have a symbol table? */
4e35701f 2996 djSP;
8ebc5c01 2997 GV* destructor;
837485b6 2998 SV tmpref;
a0d0e21e 2999
837485b6
GS
3000 Zero(&tmpref, 1, SV);
3001 sv_upgrade(&tmpref, SVt_RV);
3002 SvROK_on(&tmpref);
3003 SvREADONLY_on(&tmpref); /* DESTROY() could be naughty */
3004 SvREFCNT(&tmpref) = 1;
8ebc5c01 3005
4e8e7886
GS
3006 do {
3007 stash = SvSTASH(sv);
3008 destructor = gv_fetchmethod(SvSTASH(sv), "DESTROY");
3009 if (destructor) {
3010 ENTER;
e788e7d3 3011 PUSHSTACKi(PERLSI_DESTROY);
837485b6 3012 SvRV(&tmpref) = SvREFCNT_inc(sv);
4e8e7886
GS
3013 EXTEND(SP, 2);
3014 PUSHMARK(SP);
837485b6 3015 PUSHs(&tmpref);
4e8e7886 3016 PUTBACK;
864dbfa3
GS
3017 call_sv((SV*)GvCV(destructor),
3018 G_DISCARD|G_EVAL|G_KEEPERR);
4e8e7886 3019 SvREFCNT(sv)--;
d3acc0f7 3020 POPSTACK;
3095d977 3021 SPAGAIN;
4e8e7886
GS
3022 LEAVE;
3023 }
3024 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 3025
837485b6 3026 del_XRV(SvANY(&tmpref));
6f44e0a4
JP
3027
3028 if (SvREFCNT(sv)) {
3029 if (PL_in_clean_objs)
cea2e8a9 3030 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
6f44e0a4
JP
3031 HvNAME(stash));
3032 /* DESTROY gave object new lease on life */
3033 return;
3034 }
a0d0e21e 3035 }
4e8e7886 3036
a0d0e21e 3037 if (SvOBJECT(sv)) {
4e8e7886 3038 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
3039 SvOBJECT_off(sv); /* Curse the object. */
3040 if (SvTYPE(sv) != SVt_PVIO)
3280af22 3041 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 3042 }
463ee0b2 3043 }
c07a80fd 3044 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
a0d0e21e 3045 mg_free(sv);
ec12f114 3046 stash = NULL;
79072805 3047 switch (SvTYPE(sv)) {
8990e307 3048 case SVt_PVIO:
df0bd2f4
GS
3049 if (IoIFP(sv) &&
3050 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 3051 IoIFP(sv) != PerlIO_stdout() &&
3052 IoIFP(sv) != PerlIO_stderr())
93578b34 3053 {
5f05dabc 3054 io_close((IO*)sv);
93578b34 3055 }
1236053a
GS
3056 if (IoDIRP(sv)) {
3057 PerlDir_close(IoDIRP(sv));
3058 IoDIRP(sv) = 0;
93578b34 3059 }
8990e307
LW
3060 Safefree(IoTOP_NAME(sv));
3061 Safefree(IoFMT_NAME(sv));
3062 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 3063 /* FALL THROUGH */
79072805 3064 case SVt_PVBM:
a0d0e21e 3065 goto freescalar;
79072805 3066 case SVt_PVCV:
748a9306 3067 case SVt_PVFM:
85e6fe83 3068 cv_undef((CV*)sv);
a0d0e21e 3069 goto freescalar;
79072805 3070 case SVt_PVHV:
85e6fe83 3071 hv_undef((HV*)sv);
a0d0e21e 3072 break;
79072805 3073 case SVt_PVAV:
85e6fe83 3074 av_undef((AV*)sv);
a0d0e21e 3075 break;
02270b4e
GS
3076 case SVt_PVLV:
3077 SvREFCNT_dec(LvTARG(sv));
3078 goto freescalar;
a0d0e21e 3079 case SVt_PVGV:
1edc1566 3080 gp_free((GV*)sv);
a0d0e21e 3081 Safefree(GvNAME(sv));
ec12f114
JPC
3082 /* cannot decrease stash refcount yet, as we might recursively delete
3083 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
3084 of stash until current sv is completely gone.
3085 -- JohnPC, 27 Mar 1998 */
3086 stash = GvSTASH(sv);
a0d0e21e 3087 /* FALL THROUGH */
79072805 3088 case SVt_PVMG:
79072805
LW
3089 case SVt_PVNV:
3090 case SVt_PVIV:
a0d0e21e
LW
3091 freescalar:
3092 (void)SvOOK_off(sv);
79072805
LW
3093 /* FALL THROUGH */
3094 case SVt_PV:
a0d0e21e 3095 case SVt_RV:
810b8aa5
GS
3096 if (SvROK(sv)) {
3097 if (SvWEAKREF(sv))
3098 sv_del_backref(sv);
3099 else
3100 SvREFCNT_dec(SvRV(sv));
3101 }
1edc1566 3102 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 3103 Safefree(SvPVX(sv));
79072805 3104 break;
a0d0e21e 3105/*
79072805 3106 case SVt_NV:
79072805 3107 case SVt_IV:
79072805
LW
3108 case SVt_NULL:
3109 break;
a0d0e21e 3110*/
79072805
LW
3111 }
3112
3113 switch (SvTYPE(sv)) {
3114 case SVt_NULL:
3115 break;
79072805
LW
3116 case SVt_IV:
3117 del_XIV(SvANY(sv));
3118 break;
3119 case SVt_NV:
3120 del_XNV(SvANY(sv));
3121 break;
ed6116ce
LW
3122 case SVt_RV:
3123 del_XRV(SvANY(sv));
3124 break;
79072805
LW
3125 case SVt_PV:
3126 del_XPV(SvANY(sv));
3127 break;
3128 case SVt_PVIV:
3129 del_XPVIV(SvANY(sv));
3130 break;
3131 case SVt_PVNV:
3132 del_XPVNV(SvANY(sv));
3133 break;
3134 case SVt_PVMG:
3135 del_XPVMG(SvANY(sv));
3136 break;
3137 case SVt_PVLV:
3138 del_XPVLV(SvANY(sv));
3139 break;
3140 case SVt_PVAV:
3141 del_XPVAV(SvANY(sv));
3142 break;
3143 case SVt_PVHV:
3144 del_XPVHV(SvANY(sv));
3145 break;
3146 case SVt_PVCV:
3147 del_XPVCV(SvANY(sv));
3148 break;
3149 case SVt_PVGV:
3150 del_XPVGV(SvANY(sv));
ec12f114
JPC
3151 /* code duplication for increased performance. */
3152 SvFLAGS(sv) &= SVf_BREAK;
3153 SvFLAGS(sv) |= SVTYPEMASK;
3154 /* decrease refcount of the stash that owns this GV, if any */
3155 if (stash)
3156 SvREFCNT_dec(stash);
3157 return; /* not break, SvFLAGS reset already happened */
79072805
LW
3158 case SVt_PVBM:
3159 del_XPVBM(SvANY(sv));
3160 break;
3161 case SVt_PVFM:
3162 del_XPVFM(SvANY(sv));
3163 break;
8990e307
LW
3164 case SVt_PVIO:
3165 del_XPVIO(SvANY(sv));
3166 break;
79072805 3167 }
a0d0e21e 3168 SvFLAGS(sv) &= SVf_BREAK;
8990e307 3169 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
3170}
3171
3172SV *
864dbfa3 3173Perl_sv_newref(pTHX_ SV *sv)
79072805 3174{
463ee0b2 3175 if (sv)
dce16143 3176 ATOMIC_INC(SvREFCNT(sv));
79072805
LW
3177 return sv;
3178}
3179
3180void
864dbfa3 3181Perl_sv_free(pTHX_ SV *sv)
79072805 3182{
dce16143
MB
3183 int refcount_is_zero;
3184
79072805
LW
3185 if (!sv)
3186 return;
a0d0e21e
LW
3187 if (SvREFCNT(sv) == 0) {
3188 if (SvFLAGS(sv) & SVf_BREAK)
3189 return;
3280af22 3190 if (PL_in_clean_all) /* All is fair */
1edc1566 3191 return;
d689ffdd
JP
3192 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3193 /* make sure SvREFCNT(sv)==0 happens very seldom */
3194 SvREFCNT(sv) = (~(U32)0)/2;
3195 return;
3196 }
cea2e8a9 3197 Perl_warn(aTHX_ "Attempt to free unreferenced scalar");
79072805
LW
3198 return;
3199 }
dce16143
MB
3200 ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
3201 if (!refcount_is_zero)
8990e307 3202 return;
463ee0b2
LW
3203#ifdef DEBUGGING
3204 if (SvTEMP(sv)) {
cea2e8a9 3205 Perl_warn(aTHX_ "Attempt to free temp prematurely: SV 0x%lx", (unsigned long)sv);
79072805 3206 return;
79072805 3207 }
463ee0b2 3208#endif
d689ffdd
JP
3209 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3210 /* make sure SvREFCNT(sv)==0 happens very seldom */
3211 SvREFCNT(sv) = (~(U32)0)/2;
3212 return;
3213 }
79072805 3214 sv_clear(sv);
477f5d66
CS
3215 if (! SvREFCNT(sv))
3216 del_SV(sv);
79072805
LW
3217}
3218
3219STRLEN
864dbfa3 3220Perl_sv_len(pTHX_ register SV *sv)
79072805 3221{
748a9306 3222 char *junk;
463ee0b2 3223 STRLEN len;
79072805
LW
3224
3225 if (!sv)
3226 return 0;
3227
8990e307 3228 if (SvGMAGICAL(sv))
565764a8 3229 len = mg_length(sv);
8990e307 3230 else
748a9306 3231 junk = SvPV(sv, len);
463ee0b2 3232 return len;
79072805
LW
3233}
3234
a0ed51b3 3235STRLEN
864dbfa3 3236Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 3237{
dfe13c55
GS
3238 U8 *s;
3239 U8 *send;
a0ed51b3
LW
3240 STRLEN len;
3241
3242 if (!sv)
3243 return 0;
3244
3245#ifdef NOTYET
3246 if (SvGMAGICAL(sv))
3247 len = mg_length(sv);
3248 else
3249#endif
dfe13c55 3250 s = (U8*)SvPV(sv, len);
a0ed51b3
LW
3251 send = s + len;
3252 len = 0;
3253 while (s < send) {
3254 s += UTF8SKIP(s);
3255 len++;
3256 }
3257 return len;
3258}
3259
3260void
864dbfa3 3261Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 3262{
dfe13c55
GS
3263 U8 *start;
3264 U8 *s;
3265 U8 *send;
a0ed51b3
LW
3266 I32 uoffset = *offsetp;
3267 STRLEN len;
3268
3269 if (!sv)
3270 return;
3271
dfe13c55 3272 start = s = (U8*)SvPV(sv, len);
a0ed51b3
LW
3273 send = s + len;
3274 while (s < send && uoffset--)
3275 s += UTF8SKIP(s);
bb40f870
GA
3276 if (s >= send)
3277 s = send;
a0ed51b3
LW
3278 *offsetp = s - start;
3279 if (lenp) {
3280 I32 ulen = *lenp;
3281 start = s;
3282 while (s < send && ulen--)
3283 s += UTF8SKIP(s);
bb40f870
GA
3284 if (s >= send)
3285 s = send;
a0ed51b3
LW
3286 *lenp = s - start;
3287 }
3288 return;
3289}
3290
3291void
864dbfa3 3292Perl_sv_pos_b2u(pTHX_ register SV *sv, I32* offsetp)
a0ed51b3 3293{
dfe13c55
GS
3294 U8 *s;
3295 U8 *send;
a0ed51b3
LW
3296 STRLEN len;
3297
3298 if (!sv)
3299 return;
3300
dfe13c55 3301 s = (U8*)SvPV(sv, len);
a0ed51b3 3302 if (len < *offsetp)
cea2e8a9 3303 Perl_croak(aTHX_ "panic: bad byte offset");
a0ed51b3
LW
3304 send = s + *offsetp;
3305 len = 0;
3306 while (s < send) {
3307 s += UTF8SKIP(s);
3308 ++len;
3309 }
3310 if (s != send) {
cea2e8a9 3311 Perl_warn(aTHX_ "Malformed UTF-8 character");
a0ed51b3
LW
3312 --len;
3313 }
3314 *offsetp = len;
3315 return;
3316}
3317
79072805 3318I32
864dbfa3 3319Perl_sv_eq(pTHX_ register SV *str1, register SV *str2)
79072805
LW
3320{
3321 char *pv1;
463ee0b2 3322 STRLEN cur1;
79072805 3323 char *pv2;
463ee0b2 3324 STRLEN cur2;
79072805
LW
3325
3326 if (!str1) {
3327 pv1 = "";
3328 cur1 = 0;
3329 }
463ee0b2
LW
3330 else
3331 pv1 = SvPV(str1, cur1);
79072805
LW
3332
3333 if (!str2)
3334 return !cur1;
463ee0b2
LW
3335 else
3336 pv2 = SvPV(str2, cur2);
79072805
LW
3337
3338 if (cur1 != cur2)
3339 return 0;
3340
36477c24 3341 return memEQ(pv1, pv2, cur1);
79072805
LW
3342}
3343
3344I32
864dbfa3 3345Perl_sv_cmp(pTHX_ register SV *str1, register SV *str2)
79072805 3346{
bbce6d69 3347 STRLEN cur1 = 0;
8ac85365 3348 char *pv1 = str1 ? SvPV(str1, cur1) : (char *) NULL;
bbce6d69 3349 STRLEN cur2 = 0;
8ac85365 3350 char *pv2 = str2 ? SvPV(str2, cur2) : (char *) NULL;
79072805 3351 I32 retval;
79072805 3352
bbce6d69 3353 if (!cur1)
3354 return cur2 ? -1 : 0;
16660edb 3355
bbce6d69 3356 if (!cur2)
3357 return 1;
79072805 3358
bbce6d69 3359 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
16660edb 3360
bbce6d69 3361 if (retval)
3362 return retval < 0 ? -1 : 1;
16660edb 3363
bbce6d69 3364 if (cur1 == cur2)
3365 return 0;
3366 else
3367 return cur1 < cur2 ? -1 : 1;
3368}
16660edb 3369
bbce6d69 3370I32
864dbfa3 3371Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 3372{
36477c24 3373#ifdef USE_LOCALE_COLLATE
16660edb 3374
bbce6d69 3375 char *pv1, *pv2;
3376 STRLEN len1, len2;
3377 I32 retval;
16660edb 3378
3280af22 3379 if (PL_collation_standard)
bbce6d69 3380 goto raw_compare;
16660edb 3381
bbce6d69 3382 len1 = 0;
8ac85365 3383 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 3384 len2 = 0;
8ac85365 3385 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 3386
bbce6d69 3387 if (!pv1 || !len1) {
3388 if (pv2 && len2)
3389 return -1;
3390 else
3391 goto raw_compare;
3392 }
3393 else {
3394 if (!pv2 || !len2)
3395 return 1;
3396 }
16660edb 3397
bbce6d69 3398 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 3399
bbce6d69 3400 if (retval)
16660edb 3401 return retval < 0 ? -1 : 1;
3402
bbce6d69 3403 /*
3404 * When the result of collation is equality, that doesn't mean
3405 * that there are no differences -- some locales exclude some
3406 * characters from consideration. So to avoid false equalities,
3407 * we use the raw string as a tiebreaker.
3408 */
16660edb 3409
bbce6d69 3410 raw_compare:
3411 /* FALL THROUGH */
16660edb 3412
36477c24 3413#endif /* USE_LOCALE_COLLATE */
16660edb 3414
bbce6d69 3415 return sv_cmp(sv1, sv2);
3416}
79072805 3417
36477c24 3418#ifdef USE_LOCALE_COLLATE
7a4c00b4 3419/*
3420 * Any scalar variable may carry an 'o' magic that contains the
3421 * scalar data of the variable transformed to such a format that
3422 * a normal memory comparison can be used to compare the data
3423 * according to the locale settings.
3424 */
bbce6d69 3425char *
864dbfa3 3426Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 3427{
7a4c00b4 3428 MAGIC *mg;
16660edb 3429
8ac85365 3430 mg = SvMAGICAL(sv) ? mg_find(sv, 'o') : (MAGIC *) NULL;
3280af22 3431 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 3432 char *s, *xf;
3433 STRLEN len, xlen;
3434
7a4c00b4 3435 if (mg)
3436 Safefree(mg->mg_ptr);
bbce6d69 3437 s = SvPV(sv, len);
3438 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 3439 if (SvREADONLY(sv)) {
3440 SAVEFREEPV(xf);
3441 *nxp = xlen;
3280af22 3442 return xf + sizeof(PL_collation_ix);
ff0cee69 3443 }
7a4c00b4 3444 if (! mg) {
3445 sv_magic(sv, 0, 'o', 0, 0);
3446 mg = mg_find(sv, 'o');
3447 assert(mg);
bbce6d69 3448 }
7a4c00b4 3449 mg->mg_ptr = xf;
565764a8 3450 mg->mg_len = xlen;
7a4c00b4 3451 }
3452 else {
ff0cee69 3453 if (mg) {
3454 mg->mg_ptr = NULL;
565764a8 3455 mg->mg_len = -1;
ff0cee69 3456 }
bbce6d69 3457 }
3458 }
7a4c00b4 3459 if (mg && mg->mg_ptr) {
565764a8 3460 *nxp = mg->mg_len;
3280af22 3461 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 3462 }
3463 else {
3464 *nxp = 0;
3465 return NULL;
16660edb 3466 }
79072805
LW
3467}
3468
36477c24 3469#endif /* USE_LOCALE_COLLATE */
bbce6d69 3470
79072805 3471char *
864dbfa3 3472Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 3473{
aeea060c 3474 dTHR;
c07a80fd 3475 char *rsptr;
3476 STRLEN rslen;
3477 register STDCHAR rslast;
3478 register STDCHAR *bp;
3479 register I32 cnt;
3480 I32 i;
3481
2213622d 3482 SV_CHECK_THINKFIRST(sv);
6fc92669 3483 (void)SvUPGRADE(sv, SVt_PV);
99491443 3484
ff68c719 3485 SvSCREAM_off(sv);
c07a80fd 3486
3280af22 3487 if (RsSNARF(PL_rs)) {
c07a80fd 3488 rsptr = NULL;
3489 rslen = 0;
3490 }
3280af22 3491 else if (RsRECORD(PL_rs)) {
5b2b9c68
HM
3492 I32 recsize, bytesread;
3493 char *buffer;
3494
3495 /* Grab the size of the record we're getting */
3280af22 3496 recsize = SvIV(SvRV(PL_rs));
5b2b9c68 3497 (void)SvPOK_only(sv); /* Validate pointer */
e670df4e 3498 buffer = SvGROW(sv, recsize + 1);
5b2b9c68
HM
3499 /* Go yank in */
3500#ifdef VMS
3501 /* VMS wants read instead of fread, because fread doesn't respect */
3502 /* RMS record boundaries. This is not necessarily a good thing to be */
3503 /* doing, but we've got no other real choice */
3504 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
3505#else
3506 bytesread = PerlIO_read(fp, buffer, recsize);
3507#endif
3508 SvCUR_set(sv, bytesread);
e670df4e 3509 buffer[bytesread] = '\0';
5b2b9c68
HM
3510 return(SvCUR(sv) ? SvPVX(sv) : Nullch);
3511 }
3280af22 3512 else if (RsPARA(PL_rs)) {
c07a80fd 3513 rsptr = "\n\n";
3514 rslen = 2;
3515 }
3516 else
3280af22 3517 rsptr = SvPV(PL_rs, rslen);
c07a80fd 3518 rslast = rslen ? rsptr[rslen - 1] : '\0';
3519
3280af22 3520 if (RsPARA(PL_rs)) { /* have to do this both before and after */
79072805 3521 do { /* to make sure file boundaries work right */
760ac839 3522 if (PerlIO_eof(fp))
a0d0e21e 3523 return 0;
760ac839 3524 i = PerlIO_getc(fp);
79072805 3525 if (i != '\n') {
a0d0e21e
LW
3526 if (i == -1)
3527 return 0;
760ac839 3528 PerlIO_ungetc(fp,i);
79072805
LW
3529 break;
3530 }
3531 } while (i != EOF);
3532 }
c07a80fd 3533
760ac839
LW
3534 /* See if we know enough about I/O mechanism to cheat it ! */
3535
3536 /* This used to be #ifdef test - it is made run-time test for ease
3537 of abstracting out stdio interface. One call should be cheap
3538 enough here - and may even be a macro allowing compile
3539 time optimization.
3540 */
3541
3542 if (PerlIO_fast_gets(fp)) {
3543
3544 /*
3545 * We're going to steal some values from the stdio struct
3546 * and put EVERYTHING in the innermost loop into registers.
3547 */
3548 register STDCHAR *ptr;
3549 STRLEN bpx;
3550 I32 shortbuffered;
3551
16660edb 3552#if defined(VMS) && defined(PERLIO_IS_STDIO)
3553 /* An ungetc()d char is handled separately from the regular
3554 * buffer, so we getc() it back out and stuff it in the buffer.
3555 */
3556 i = PerlIO_getc(fp);
3557 if (i == EOF) return 0;
3558 *(--((*fp)->_ptr)) = (unsigned char) i;
3559 (*fp)->_cnt++;
3560#endif
c07a80fd 3561
c2960299 3562 /* Here is some breathtakingly efficient cheating */
c07a80fd 3563
760ac839 3564 cnt = PerlIO_get_cnt(fp); /* get count into register */
a0d0e21e 3565 (void)SvPOK_only(sv); /* validate pointer */
79072805
LW
3566 if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
3567 if (cnt > 80 && SvLEN(sv) > append) {
3568 shortbuffered = cnt - SvLEN(sv) + append + 1;
3569 cnt -= shortbuffered;
3570 }
3571 else {
3572 shortbuffered = 0;
bbce6d69 3573 /* remember that cnt can be negative */
3574 SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
79072805
LW
3575 }
3576 }
3577 else
3578 shortbuffered = 0;
c07a80fd 3579 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
760ac839 3580 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 3581 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3582 "Screamer: entering, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
16660edb 3583 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3584 "Screamer: entering: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3585 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3586 (long)(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
3587 for (;;) {
3588 screamer:
93a17b20 3589 if (cnt > 0) {
c07a80fd 3590 if (rslen) {
760ac839
LW
3591 while (cnt > 0) { /* this | eat */
3592 cnt--;
c07a80fd 3593 if ((*bp++ = *ptr++) == rslast) /* really | dust */
3594 goto thats_all_folks; /* screams | sed :-) */
3595 }
3596 }
3597 else {
36477c24 3598 Copy(ptr, bp, cnt, char); /* this | eat */
c07a80fd 3599 bp += cnt; /* screams | dust */
3600 ptr += cnt; /* louder | sed :-) */
a5f75d66 3601 cnt = 0;
93a17b20 3602 }
79072805
LW
3603 }
3604
748a9306 3605 if (shortbuffered) { /* oh well, must extend */
79072805
LW
3606 cnt = shortbuffered;
3607 shortbuffered = 0;
c07a80fd 3608 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
3609 SvCUR_set(sv, bpx);
3610 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 3611 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
3612 continue;
3613 }
3614
16660edb 3615 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3616 "Screamer: going to getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
d1bf51dd 3617 PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
16660edb 3618 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3619 "Screamer: pre: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3620 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3621 (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
16660edb 3622 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b