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