This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
EBCDIC patch for Storable, from Peter Prymmer.
[perl5.git] / sv.c
CommitLineData
a0d0e21e 1/* sv.c
79072805 2 *
bc89e66f 3 * Copyright (c) 1991-2001, Larry Wall
79072805
LW
4 *
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
7 *
a0d0e21e
LW
8 */
9
10/*
11 * "I wonder what the Entish is for 'yes' and 'no'," he thought.
79072805
LW
12 */
13
14#include "EXTERN.h"
864dbfa3 15#define PERL_IN_SV_C
79072805 16#include "perl.h"
79072805 17
51371543 18#define FCALL *f
6fc92669 19#define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) sv_force_normal(sv)
2c5424a7 20
51371543
GS
21static void do_report_used(pTHXo_ SV *sv);
22static void do_clean_objs(pTHXo_ SV *sv);
23#ifndef DISABLE_DESTRUCTOR_KLUDGE
24static void do_clean_named_objs(pTHXo_ SV *sv);
25#endif
26static void do_clean_all(pTHXo_ SV *sv);
27
4561caa4
CS
28/*
29 * "A time to plant, and a time to uproot what was planted..."
30 */
31
053fc874
GS
32#define plant_SV(p) \
33 STMT_START { \
34 SvANY(p) = (void *)PL_sv_root; \
35 SvFLAGS(p) = SVTYPEMASK; \
36 PL_sv_root = (p); \
37 --PL_sv_count; \
38 } STMT_END
a0d0e21e 39
fba3b22e 40/* sv_mutex must be held while calling uproot_SV() */
053fc874
GS
41#define uproot_SV(p) \
42 STMT_START { \
43 (p) = PL_sv_root; \
44 PL_sv_root = (SV*)SvANY(p); \
45 ++PL_sv_count; \
46 } STMT_END
47
48#define new_SV(p) \
49 STMT_START { \
50 LOCK_SV_MUTEX; \
51 if (PL_sv_root) \
52 uproot_SV(p); \
53 else \
54 (p) = more_sv(); \
55 UNLOCK_SV_MUTEX; \
56 SvANY(p) = 0; \
57 SvREFCNT(p) = 1; \
58 SvFLAGS(p) = 0; \
59 } STMT_END
463ee0b2 60
a0d0e21e 61#ifdef DEBUGGING
4561caa4 62
053fc874
GS
63#define del_SV(p) \
64 STMT_START { \
65 LOCK_SV_MUTEX; \
66 if (PL_debug & 32768) \
67 del_sv(p); \
68 else \
69 plant_SV(p); \
70 UNLOCK_SV_MUTEX; \
71 } STMT_END
a0d0e21e 72
76e3520e 73STATIC void
cea2e8a9 74S_del_sv(pTHX_ SV *p)
463ee0b2 75{
3280af22 76 if (PL_debug & 32768) {
4633a7c4 77 SV* sva;
a0d0e21e
LW
78 SV* sv;
79 SV* svend;
80 int ok = 0;
3280af22 81 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
4633a7c4
LW
82 sv = sva + 1;
83 svend = &sva[SvREFCNT(sva)];
a0d0e21e
LW
84 if (p >= sv && p < svend)
85 ok = 1;
86 }
87 if (!ok) {
0453d815
PM
88 if (ckWARN_d(WARN_INTERNAL))
89 Perl_warner(aTHX_ WARN_INTERNAL,
1d7c1841
GS
90 "Attempt to free non-arena SV: 0x%"UVxf,
91 PTR2UV(p));
a0d0e21e
LW
92 return;
93 }
94 }
4561caa4 95 plant_SV(p);
463ee0b2 96}
a0d0e21e 97
4561caa4
CS
98#else /* ! DEBUGGING */
99
100#define del_SV(p) plant_SV(p)
101
102#endif /* DEBUGGING */
463ee0b2 103
4633a7c4 104void
864dbfa3 105Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
463ee0b2 106{
4633a7c4 107 SV* sva = (SV*)ptr;
463ee0b2
LW
108 register SV* sv;
109 register SV* svend;
14dd3ad8 110 Zero(ptr, size, char);
4633a7c4
LW
111
112 /* The first SV in an arena isn't an SV. */
3280af22 113 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
114 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
115 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
116
3280af22
NIS
117 PL_sv_arenaroot = sva;
118 PL_sv_root = sva + 1;
4633a7c4
LW
119
120 svend = &sva[SvREFCNT(sva) - 1];
121 sv = sva + 1;
463ee0b2 122 while (sv < svend) {
a0d0e21e 123 SvANY(sv) = (void *)(SV*)(sv + 1);
8990e307 124 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
125 sv++;
126 }
127 SvANY(sv) = 0;
4633a7c4
LW
128 SvFLAGS(sv) = SVTYPEMASK;
129}
130
fba3b22e 131/* sv_mutex must be held while calling more_sv() */
76e3520e 132STATIC SV*
cea2e8a9 133S_more_sv(pTHX)
4633a7c4 134{
4561caa4
CS
135 register SV* sv;
136
3280af22
NIS
137 if (PL_nice_chunk) {
138 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
139 PL_nice_chunk = Nullch;
c07a80fd 140 }
1edc1566 141 else {
142 char *chunk; /* must use New here to match call to */
143 New(704,chunk,1008,char); /* Safefree() in sv_free_arenas() */
144 sv_add_arena(chunk, 1008, 0);
145 }
4561caa4
CS
146 uproot_SV(sv);
147 return sv;
463ee0b2
LW
148}
149
76e3520e 150STATIC void
cea2e8a9 151S_visit(pTHX_ SVFUNC_t f)
8990e307 152{
4633a7c4 153 SV* sva;
8990e307
LW
154 SV* sv;
155 register SV* svend;
156
3280af22 157 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
4633a7c4 158 svend = &sva[SvREFCNT(sva)];
4561caa4
CS
159 for (sv = sva + 1; sv < svend; ++sv) {
160 if (SvTYPE(sv) != SVTYPEMASK)
51371543 161 (FCALL)(aTHXo_ sv);
8990e307
LW
162 }
163 }
164}
165
166void
864dbfa3 167Perl_sv_report_used(pTHX)
4561caa4 168{
0b94c7bb 169 visit(do_report_used);
4561caa4
CS
170}
171
4561caa4 172void
864dbfa3 173Perl_sv_clean_objs(pTHX)
4561caa4 174{
3280af22 175 PL_in_clean_objs = TRUE;
0b94c7bb 176 visit(do_clean_objs);
4561caa4 177#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 178 /* some barnacles may yet remain, clinging to typeglobs */
0b94c7bb 179 visit(do_clean_named_objs);
4561caa4 180#endif
3280af22 181 PL_in_clean_objs = FALSE;
4561caa4
CS
182}
183
8990e307 184void
864dbfa3 185Perl_sv_clean_all(pTHX)
8990e307 186{
3280af22 187 PL_in_clean_all = TRUE;
0b94c7bb 188 visit(do_clean_all);
3280af22 189 PL_in_clean_all = FALSE;
8990e307 190}
463ee0b2 191
4633a7c4 192void
864dbfa3 193Perl_sv_free_arenas(pTHX)
4633a7c4
LW
194{
195 SV* sva;
196 SV* svanext;
612f20c3 197 XPV *arena, *arenanext;
4633a7c4
LW
198
199 /* Free arenas here, but be careful about fake ones. (We assume
200 contiguity of the fake ones with the corresponding real ones.) */
201
3280af22 202 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
203 svanext = (SV*) SvANY(sva);
204 while (svanext && SvFAKE(svanext))
205 svanext = (SV*) SvANY(svanext);
206
207 if (!SvFAKE(sva))
1edc1566 208 Safefree((void *)sva);
4633a7c4 209 }
5f05dabc 210
612f20c3
GS
211 for (arena = PL_xiv_arenaroot; arena; arena = arenanext) {
212 arenanext = (XPV*)arena->xpv_pv;
213 Safefree(arena);
214 }
215 PL_xiv_arenaroot = 0;
216
217 for (arena = PL_xnv_arenaroot; arena; arena = arenanext) {
218 arenanext = (XPV*)arena->xpv_pv;
219 Safefree(arena);
220 }
221 PL_xnv_arenaroot = 0;
222
223 for (arena = PL_xrv_arenaroot; arena; arena = arenanext) {
224 arenanext = (XPV*)arena->xpv_pv;
225 Safefree(arena);
226 }
227 PL_xrv_arenaroot = 0;
228
229 for (arena = PL_xpv_arenaroot; arena; arena = arenanext) {
230 arenanext = (XPV*)arena->xpv_pv;
231 Safefree(arena);
232 }
233 PL_xpv_arenaroot = 0;
234
235 for (arena = (XPV*)PL_xpviv_arenaroot; arena; arena = arenanext) {
236 arenanext = (XPV*)arena->xpv_pv;
237 Safefree(arena);
238 }
239 PL_xpviv_arenaroot = 0;
240
241 for (arena = (XPV*)PL_xpvnv_arenaroot; arena; arena = arenanext) {
242 arenanext = (XPV*)arena->xpv_pv;
243 Safefree(arena);
244 }
245 PL_xpvnv_arenaroot = 0;
246
247 for (arena = (XPV*)PL_xpvcv_arenaroot; arena; arena = arenanext) {
248 arenanext = (XPV*)arena->xpv_pv;
249 Safefree(arena);
250 }
251 PL_xpvcv_arenaroot = 0;
252
253 for (arena = (XPV*)PL_xpvav_arenaroot; arena; arena = arenanext) {
254 arenanext = (XPV*)arena->xpv_pv;
255 Safefree(arena);
256 }
257 PL_xpvav_arenaroot = 0;
258
259 for (arena = (XPV*)PL_xpvhv_arenaroot; arena; arena = arenanext) {
260 arenanext = (XPV*)arena->xpv_pv;
261 Safefree(arena);
262 }
263 PL_xpvhv_arenaroot = 0;
264
265 for (arena = (XPV*)PL_xpvmg_arenaroot; arena; arena = arenanext) {
266 arenanext = (XPV*)arena->xpv_pv;
267 Safefree(arena);
268 }
269 PL_xpvmg_arenaroot = 0;
270
271 for (arena = (XPV*)PL_xpvlv_arenaroot; arena; arena = arenanext) {
272 arenanext = (XPV*)arena->xpv_pv;
273 Safefree(arena);
274 }
275 PL_xpvlv_arenaroot = 0;
276
277 for (arena = (XPV*)PL_xpvbm_arenaroot; arena; arena = arenanext) {
278 arenanext = (XPV*)arena->xpv_pv;
279 Safefree(arena);
280 }
281 PL_xpvbm_arenaroot = 0;
282
283 for (arena = (XPV*)PL_he_arenaroot; arena; arena = arenanext) {
284 arenanext = (XPV*)arena->xpv_pv;
285 Safefree(arena);
286 }
287 PL_he_arenaroot = 0;
288
3280af22
NIS
289 if (PL_nice_chunk)
290 Safefree(PL_nice_chunk);
291 PL_nice_chunk = Nullch;
292 PL_nice_chunk_size = 0;
293 PL_sv_arenaroot = 0;
294 PL_sv_root = 0;
4633a7c4
LW
295}
296
1d7c1841
GS
297void
298Perl_report_uninit(pTHX)
299{
300 if (PL_op)
301 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit,
302 " in ", PL_op_desc[PL_op->op_type]);
303 else
304 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit, "", "");
305}
306
76e3520e 307STATIC XPVIV*
cea2e8a9 308S_new_xiv(pTHX)
463ee0b2 309{
ea7c11a3 310 IV* xiv;
cbe51380
GS
311 LOCK_SV_MUTEX;
312 if (!PL_xiv_root)
313 more_xiv();
314 xiv = PL_xiv_root;
315 /*
316 * See comment in more_xiv() -- RAM.
317 */
318 PL_xiv_root = *(IV**)xiv;
319 UNLOCK_SV_MUTEX;
320 return (XPVIV*)((char*)xiv - STRUCT_OFFSET(XPVIV, xiv_iv));
463ee0b2
LW
321}
322
76e3520e 323STATIC void
cea2e8a9 324S_del_xiv(pTHX_ XPVIV *p)
463ee0b2 325{
23e6a22f 326 IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
cbe51380 327 LOCK_SV_MUTEX;
3280af22
NIS
328 *(IV**)xiv = PL_xiv_root;
329 PL_xiv_root = xiv;
cbe51380 330 UNLOCK_SV_MUTEX;
463ee0b2
LW
331}
332
cbe51380 333STATIC void
cea2e8a9 334S_more_xiv(pTHX)
463ee0b2 335{
ea7c11a3
SM
336 register IV* xiv;
337 register IV* xivend;
8c52afec
IZ
338 XPV* ptr;
339 New(705, ptr, 1008/sizeof(XPV), XPV);
3280af22
NIS
340 ptr->xpv_pv = (char*)PL_xiv_arenaroot; /* linked list of xiv arenas */
341 PL_xiv_arenaroot = ptr; /* to keep Purify happy */
a0d0e21e 342
ea7c11a3
SM
343 xiv = (IV*) ptr;
344 xivend = &xiv[1008 / sizeof(IV) - 1];
345 xiv += (sizeof(XPV) - 1) / sizeof(IV) + 1; /* fudge by size of XPV */
3280af22 346 PL_xiv_root = xiv;
463ee0b2 347 while (xiv < xivend) {
ea7c11a3 348 *(IV**)xiv = (IV *)(xiv + 1);
463ee0b2
LW
349 xiv++;
350 }
ea7c11a3 351 *(IV**)xiv = 0;
463ee0b2
LW
352}
353
76e3520e 354STATIC XPVNV*
cea2e8a9 355S_new_xnv(pTHX)
463ee0b2 356{
65202027 357 NV* xnv;
cbe51380
GS
358 LOCK_SV_MUTEX;
359 if (!PL_xnv_root)
360 more_xnv();
361 xnv = PL_xnv_root;
65202027 362 PL_xnv_root = *(NV**)xnv;
cbe51380
GS
363 UNLOCK_SV_MUTEX;
364 return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
463ee0b2
LW
365}
366
76e3520e 367STATIC void
cea2e8a9 368S_del_xnv(pTHX_ XPVNV *p)
463ee0b2 369{
65202027 370 NV* xnv = (NV*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
cbe51380 371 LOCK_SV_MUTEX;
65202027 372 *(NV**)xnv = PL_xnv_root;
3280af22 373 PL_xnv_root = xnv;
cbe51380 374 UNLOCK_SV_MUTEX;
463ee0b2
LW
375}
376
cbe51380 377STATIC void
cea2e8a9 378S_more_xnv(pTHX)
463ee0b2 379{
65202027
DS
380 register NV* xnv;
381 register NV* xnvend;
612f20c3
GS
382 XPV *ptr;
383 New(711, ptr, 1008/sizeof(XPV), XPV);
384 ptr->xpv_pv = (char*)PL_xnv_arenaroot;
385 PL_xnv_arenaroot = ptr;
386
387 xnv = (NV*) ptr;
65202027
DS
388 xnvend = &xnv[1008 / sizeof(NV) - 1];
389 xnv += (sizeof(XPVIV) - 1) / sizeof(NV) + 1; /* fudge by sizeof XPVIV */
3280af22 390 PL_xnv_root = xnv;
463ee0b2 391 while (xnv < xnvend) {
65202027 392 *(NV**)xnv = (NV*)(xnv + 1);
463ee0b2
LW
393 xnv++;
394 }
65202027 395 *(NV**)xnv = 0;
463ee0b2
LW
396}
397
76e3520e 398STATIC XRV*
cea2e8a9 399S_new_xrv(pTHX)
ed6116ce
LW
400{
401 XRV* xrv;
cbe51380
GS
402 LOCK_SV_MUTEX;
403 if (!PL_xrv_root)
404 more_xrv();
405 xrv = PL_xrv_root;
406 PL_xrv_root = (XRV*)xrv->xrv_rv;
407 UNLOCK_SV_MUTEX;
408 return xrv;
ed6116ce
LW
409}
410
76e3520e 411STATIC void
cea2e8a9 412S_del_xrv(pTHX_ XRV *p)
ed6116ce 413{
cbe51380 414 LOCK_SV_MUTEX;
3280af22
NIS
415 p->xrv_rv = (SV*)PL_xrv_root;
416 PL_xrv_root = p;
cbe51380 417 UNLOCK_SV_MUTEX;
ed6116ce
LW
418}
419
cbe51380 420STATIC void
cea2e8a9 421S_more_xrv(pTHX)
ed6116ce 422{
ed6116ce
LW
423 register XRV* xrv;
424 register XRV* xrvend;
612f20c3
GS
425 XPV *ptr;
426 New(712, ptr, 1008/sizeof(XPV), XPV);
427 ptr->xpv_pv = (char*)PL_xrv_arenaroot;
428 PL_xrv_arenaroot = ptr;
429
430 xrv = (XRV*) ptr;
ed6116ce 431 xrvend = &xrv[1008 / sizeof(XRV) - 1];
612f20c3
GS
432 xrv += (sizeof(XPV) - 1) / sizeof(XRV) + 1;
433 PL_xrv_root = xrv;
ed6116ce
LW
434 while (xrv < xrvend) {
435 xrv->xrv_rv = (SV*)(xrv + 1);
436 xrv++;
437 }
438 xrv->xrv_rv = 0;
ed6116ce
LW
439}
440
76e3520e 441STATIC XPV*
cea2e8a9 442S_new_xpv(pTHX)
463ee0b2
LW
443{
444 XPV* xpv;
cbe51380
GS
445 LOCK_SV_MUTEX;
446 if (!PL_xpv_root)
447 more_xpv();
448 xpv = PL_xpv_root;
449 PL_xpv_root = (XPV*)xpv->xpv_pv;
450 UNLOCK_SV_MUTEX;
451 return xpv;
463ee0b2
LW
452}
453
76e3520e 454STATIC void
cea2e8a9 455S_del_xpv(pTHX_ XPV *p)
463ee0b2 456{
cbe51380 457 LOCK_SV_MUTEX;
3280af22
NIS
458 p->xpv_pv = (char*)PL_xpv_root;
459 PL_xpv_root = p;
cbe51380 460 UNLOCK_SV_MUTEX;
463ee0b2
LW
461}
462
cbe51380 463STATIC void
cea2e8a9 464S_more_xpv(pTHX)
463ee0b2 465{
463ee0b2
LW
466 register XPV* xpv;
467 register XPV* xpvend;
612f20c3
GS
468 New(713, xpv, 1008/sizeof(XPV), XPV);
469 xpv->xpv_pv = (char*)PL_xpv_arenaroot;
470 PL_xpv_arenaroot = xpv;
471
463ee0b2 472 xpvend = &xpv[1008 / sizeof(XPV) - 1];
612f20c3 473 PL_xpv_root = ++xpv;
463ee0b2
LW
474 while (xpv < xpvend) {
475 xpv->xpv_pv = (char*)(xpv + 1);
476 xpv++;
477 }
478 xpv->xpv_pv = 0;
463ee0b2
LW
479}
480
932e9ff9
VB
481STATIC XPVIV*
482S_new_xpviv(pTHX)
483{
484 XPVIV* xpviv;
485 LOCK_SV_MUTEX;
486 if (!PL_xpviv_root)
487 more_xpviv();
488 xpviv = PL_xpviv_root;
489 PL_xpviv_root = (XPVIV*)xpviv->xpv_pv;
490 UNLOCK_SV_MUTEX;
491 return xpviv;
492}
493
494STATIC void
495S_del_xpviv(pTHX_ XPVIV *p)
496{
497 LOCK_SV_MUTEX;
498 p->xpv_pv = (char*)PL_xpviv_root;
499 PL_xpviv_root = p;
500 UNLOCK_SV_MUTEX;
501}
502
932e9ff9
VB
503STATIC void
504S_more_xpviv(pTHX)
505{
506 register XPVIV* xpviv;
507 register XPVIV* xpvivend;
612f20c3
GS
508 New(714, xpviv, 1008/sizeof(XPVIV), XPVIV);
509 xpviv->xpv_pv = (char*)PL_xpviv_arenaroot;
510 PL_xpviv_arenaroot = xpviv;
511
932e9ff9 512 xpvivend = &xpviv[1008 / sizeof(XPVIV) - 1];
612f20c3 513 PL_xpviv_root = ++xpviv;
932e9ff9
VB
514 while (xpviv < xpvivend) {
515 xpviv->xpv_pv = (char*)(xpviv + 1);
516 xpviv++;
517 }
518 xpviv->xpv_pv = 0;
519}
520
932e9ff9
VB
521STATIC XPVNV*
522S_new_xpvnv(pTHX)
523{
524 XPVNV* xpvnv;
525 LOCK_SV_MUTEX;
526 if (!PL_xpvnv_root)
527 more_xpvnv();
528 xpvnv = PL_xpvnv_root;
529 PL_xpvnv_root = (XPVNV*)xpvnv->xpv_pv;
530 UNLOCK_SV_MUTEX;
531 return xpvnv;
532}
533
534STATIC void
535S_del_xpvnv(pTHX_ XPVNV *p)
536{
537 LOCK_SV_MUTEX;
538 p->xpv_pv = (char*)PL_xpvnv_root;
539 PL_xpvnv_root = p;
540 UNLOCK_SV_MUTEX;
541}
542
932e9ff9
VB
543STATIC void
544S_more_xpvnv(pTHX)
545{
546 register XPVNV* xpvnv;
547 register XPVNV* xpvnvend;
612f20c3
GS
548 New(715, xpvnv, 1008/sizeof(XPVNV), XPVNV);
549 xpvnv->xpv_pv = (char*)PL_xpvnv_arenaroot;
550 PL_xpvnv_arenaroot = xpvnv;
551
932e9ff9 552 xpvnvend = &xpvnv[1008 / sizeof(XPVNV) - 1];
612f20c3 553 PL_xpvnv_root = ++xpvnv;
932e9ff9
VB
554 while (xpvnv < xpvnvend) {
555 xpvnv->xpv_pv = (char*)(xpvnv + 1);
556 xpvnv++;
557 }
558 xpvnv->xpv_pv = 0;
559}
560
932e9ff9
VB
561STATIC XPVCV*
562S_new_xpvcv(pTHX)
563{
564 XPVCV* xpvcv;
565 LOCK_SV_MUTEX;
566 if (!PL_xpvcv_root)
567 more_xpvcv();
568 xpvcv = PL_xpvcv_root;
569 PL_xpvcv_root = (XPVCV*)xpvcv->xpv_pv;
570 UNLOCK_SV_MUTEX;
571 return xpvcv;
572}
573
574STATIC void
575S_del_xpvcv(pTHX_ XPVCV *p)
576{
577 LOCK_SV_MUTEX;
578 p->xpv_pv = (char*)PL_xpvcv_root;
579 PL_xpvcv_root = p;
580 UNLOCK_SV_MUTEX;
581}
582
932e9ff9
VB
583STATIC void
584S_more_xpvcv(pTHX)
585{
586 register XPVCV* xpvcv;
587 register XPVCV* xpvcvend;
612f20c3
GS
588 New(716, xpvcv, 1008/sizeof(XPVCV), XPVCV);
589 xpvcv->xpv_pv = (char*)PL_xpvcv_arenaroot;
590 PL_xpvcv_arenaroot = xpvcv;
591
932e9ff9 592 xpvcvend = &xpvcv[1008 / sizeof(XPVCV) - 1];
612f20c3 593 PL_xpvcv_root = ++xpvcv;
932e9ff9
VB
594 while (xpvcv < xpvcvend) {
595 xpvcv->xpv_pv = (char*)(xpvcv + 1);
596 xpvcv++;
597 }
598 xpvcv->xpv_pv = 0;
599}
600
932e9ff9
VB
601STATIC XPVAV*
602S_new_xpvav(pTHX)
603{
604 XPVAV* xpvav;
605 LOCK_SV_MUTEX;
606 if (!PL_xpvav_root)
607 more_xpvav();
608 xpvav = PL_xpvav_root;
609 PL_xpvav_root = (XPVAV*)xpvav->xav_array;
610 UNLOCK_SV_MUTEX;
611 return xpvav;
612}
613
614STATIC void
615S_del_xpvav(pTHX_ XPVAV *p)
616{
617 LOCK_SV_MUTEX;
618 p->xav_array = (char*)PL_xpvav_root;
619 PL_xpvav_root = p;
620 UNLOCK_SV_MUTEX;
621}
622
932e9ff9
VB
623STATIC void
624S_more_xpvav(pTHX)
625{
626 register XPVAV* xpvav;
627 register XPVAV* xpvavend;
612f20c3
GS
628 New(717, xpvav, 1008/sizeof(XPVAV), XPVAV);
629 xpvav->xav_array = (char*)PL_xpvav_arenaroot;
630 PL_xpvav_arenaroot = xpvav;
631
932e9ff9 632 xpvavend = &xpvav[1008 / sizeof(XPVAV) - 1];
612f20c3 633 PL_xpvav_root = ++xpvav;
932e9ff9
VB
634 while (xpvav < xpvavend) {
635 xpvav->xav_array = (char*)(xpvav + 1);
636 xpvav++;
637 }
638 xpvav->xav_array = 0;
639}
640
932e9ff9
VB
641STATIC XPVHV*
642S_new_xpvhv(pTHX)
643{
644 XPVHV* xpvhv;
645 LOCK_SV_MUTEX;
646 if (!PL_xpvhv_root)
647 more_xpvhv();
648 xpvhv = PL_xpvhv_root;
649 PL_xpvhv_root = (XPVHV*)xpvhv->xhv_array;
650 UNLOCK_SV_MUTEX;
651 return xpvhv;
652}
653
654STATIC void
655S_del_xpvhv(pTHX_ XPVHV *p)
656{
657 LOCK_SV_MUTEX;
658 p->xhv_array = (char*)PL_xpvhv_root;
659 PL_xpvhv_root = p;
660 UNLOCK_SV_MUTEX;
661}
662
932e9ff9
VB
663STATIC void
664S_more_xpvhv(pTHX)
665{
666 register XPVHV* xpvhv;
667 register XPVHV* xpvhvend;
612f20c3
GS
668 New(718, xpvhv, 1008/sizeof(XPVHV), XPVHV);
669 xpvhv->xhv_array = (char*)PL_xpvhv_arenaroot;
670 PL_xpvhv_arenaroot = xpvhv;
671
932e9ff9 672 xpvhvend = &xpvhv[1008 / sizeof(XPVHV) - 1];
612f20c3 673 PL_xpvhv_root = ++xpvhv;
932e9ff9
VB
674 while (xpvhv < xpvhvend) {
675 xpvhv->xhv_array = (char*)(xpvhv + 1);
676 xpvhv++;
677 }
678 xpvhv->xhv_array = 0;
679}
680
932e9ff9
VB
681STATIC XPVMG*
682S_new_xpvmg(pTHX)
683{
684 XPVMG* xpvmg;
685 LOCK_SV_MUTEX;
686 if (!PL_xpvmg_root)
687 more_xpvmg();
688 xpvmg = PL_xpvmg_root;
689 PL_xpvmg_root = (XPVMG*)xpvmg->xpv_pv;
690 UNLOCK_SV_MUTEX;
691 return xpvmg;
692}
693
694STATIC void
695S_del_xpvmg(pTHX_ XPVMG *p)
696{
697 LOCK_SV_MUTEX;
698 p->xpv_pv = (char*)PL_xpvmg_root;
699 PL_xpvmg_root = p;
700 UNLOCK_SV_MUTEX;
701}
702
932e9ff9
VB
703STATIC void
704S_more_xpvmg(pTHX)
705{
706 register XPVMG* xpvmg;
707 register XPVMG* xpvmgend;
612f20c3
GS
708 New(719, xpvmg, 1008/sizeof(XPVMG), XPVMG);
709 xpvmg->xpv_pv = (char*)PL_xpvmg_arenaroot;
710 PL_xpvmg_arenaroot = xpvmg;
711
932e9ff9 712 xpvmgend = &xpvmg[1008 / sizeof(XPVMG) - 1];
612f20c3 713 PL_xpvmg_root = ++xpvmg;
932e9ff9
VB
714 while (xpvmg < xpvmgend) {
715 xpvmg->xpv_pv = (char*)(xpvmg + 1);
716 xpvmg++;
717 }
718 xpvmg->xpv_pv = 0;
719}
720
932e9ff9
VB
721STATIC XPVLV*
722S_new_xpvlv(pTHX)
723{
724 XPVLV* xpvlv;
725 LOCK_SV_MUTEX;
726 if (!PL_xpvlv_root)
727 more_xpvlv();
728 xpvlv = PL_xpvlv_root;
729 PL_xpvlv_root = (XPVLV*)xpvlv->xpv_pv;
730 UNLOCK_SV_MUTEX;
731 return xpvlv;
732}
733
734STATIC void
735S_del_xpvlv(pTHX_ XPVLV *p)
736{
737 LOCK_SV_MUTEX;
738 p->xpv_pv = (char*)PL_xpvlv_root;
739 PL_xpvlv_root = p;
740 UNLOCK_SV_MUTEX;
741}
742
932e9ff9
VB
743STATIC void
744S_more_xpvlv(pTHX)
745{
746 register XPVLV* xpvlv;
747 register XPVLV* xpvlvend;
612f20c3
GS
748 New(720, xpvlv, 1008/sizeof(XPVLV), XPVLV);
749 xpvlv->xpv_pv = (char*)PL_xpvlv_arenaroot;
750 PL_xpvlv_arenaroot = xpvlv;
751
932e9ff9 752 xpvlvend = &xpvlv[1008 / sizeof(XPVLV) - 1];
612f20c3 753 PL_xpvlv_root = ++xpvlv;
932e9ff9
VB
754 while (xpvlv < xpvlvend) {
755 xpvlv->xpv_pv = (char*)(xpvlv + 1);
756 xpvlv++;
757 }
758 xpvlv->xpv_pv = 0;
759}
760
932e9ff9
VB
761STATIC XPVBM*
762S_new_xpvbm(pTHX)
763{
764 XPVBM* xpvbm;
765 LOCK_SV_MUTEX;
766 if (!PL_xpvbm_root)
767 more_xpvbm();
768 xpvbm = PL_xpvbm_root;
769 PL_xpvbm_root = (XPVBM*)xpvbm->xpv_pv;
770 UNLOCK_SV_MUTEX;
771 return xpvbm;
772}
773
774STATIC void
775S_del_xpvbm(pTHX_ XPVBM *p)
776{
777 LOCK_SV_MUTEX;
778 p->xpv_pv = (char*)PL_xpvbm_root;
779 PL_xpvbm_root = p;
780 UNLOCK_SV_MUTEX;
781}
782
932e9ff9
VB
783STATIC void
784S_more_xpvbm(pTHX)
785{
786 register XPVBM* xpvbm;
787 register XPVBM* xpvbmend;
612f20c3
GS
788 New(721, xpvbm, 1008/sizeof(XPVBM), XPVBM);
789 xpvbm->xpv_pv = (char*)PL_xpvbm_arenaroot;
790 PL_xpvbm_arenaroot = xpvbm;
791
932e9ff9 792 xpvbmend = &xpvbm[1008 / sizeof(XPVBM) - 1];
612f20c3 793 PL_xpvbm_root = ++xpvbm;
932e9ff9
VB
794 while (xpvbm < xpvbmend) {
795 xpvbm->xpv_pv = (char*)(xpvbm + 1);
796 xpvbm++;
797 }
798 xpvbm->xpv_pv = 0;
799}
800
d33b2eba
GS
801#ifdef LEAKTEST
802# define my_safemalloc(s) (void*)safexmalloc(717,s)
803# define my_safefree(p) safexfree((char*)p)
804#else
805# define my_safemalloc(s) (void*)safemalloc(s)
806# define my_safefree(p) safefree((char*)p)
807#endif
463ee0b2 808
d33b2eba 809#ifdef PURIFY
463ee0b2 810
d33b2eba
GS
811#define new_XIV() my_safemalloc(sizeof(XPVIV))
812#define del_XIV(p) my_safefree(p)
ed6116ce 813
d33b2eba
GS
814#define new_XNV() my_safemalloc(sizeof(XPVNV))
815#define del_XNV(p) my_safefree(p)
463ee0b2 816
d33b2eba
GS
817#define new_XRV() my_safemalloc(sizeof(XRV))
818#define del_XRV(p) my_safefree(p)
8c52afec 819
d33b2eba
GS
820#define new_XPV() my_safemalloc(sizeof(XPV))
821#define del_XPV(p) my_safefree(p)
9b94d1dd 822
d33b2eba
GS
823#define new_XPVIV() my_safemalloc(sizeof(XPVIV))
824#define del_XPVIV(p) my_safefree(p)
932e9ff9 825
d33b2eba
GS
826#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
827#define del_XPVNV(p) my_safefree(p)
932e9ff9 828
d33b2eba
GS
829#define new_XPVCV() my_safemalloc(sizeof(XPVCV))
830#define del_XPVCV(p) my_safefree(p)
932e9ff9 831
d33b2eba
GS
832#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
833#define del_XPVAV(p) my_safefree(p)
834
835#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
836#define del_XPVHV(p) my_safefree(p)
1c846c1f 837
d33b2eba
GS
838#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
839#define del_XPVMG(p) my_safefree(p)
840
841#define new_XPVLV() my_safemalloc(sizeof(XPVLV))
842#define del_XPVLV(p) my_safefree(p)
843
844#define new_XPVBM() my_safemalloc(sizeof(XPVBM))
845#define del_XPVBM(p) my_safefree(p)
846
847#else /* !PURIFY */
848
849#define new_XIV() (void*)new_xiv()
850#define del_XIV(p) del_xiv((XPVIV*) p)
851
852#define new_XNV() (void*)new_xnv()
853#define del_XNV(p) del_xnv((XPVNV*) p)
9b94d1dd 854
d33b2eba
GS
855#define new_XRV() (void*)new_xrv()
856#define del_XRV(p) del_xrv((XRV*) p)
9b94d1dd 857
d33b2eba
GS
858#define new_XPV() (void*)new_xpv()
859#define del_XPV(p) del_xpv((XPV *)p)
860
861#define new_XPVIV() (void*)new_xpviv()
862#define del_XPVIV(p) del_xpviv((XPVIV *)p)
863
864#define new_XPVNV() (void*)new_xpvnv()
865#define del_XPVNV(p) del_xpvnv((XPVNV *)p)
866
867#define new_XPVCV() (void*)new_xpvcv()
868#define del_XPVCV(p) del_xpvcv((XPVCV *)p)
869
870#define new_XPVAV() (void*)new_xpvav()
871#define del_XPVAV(p) del_xpvav((XPVAV *)p)
872
873#define new_XPVHV() (void*)new_xpvhv()
874#define del_XPVHV(p) del_xpvhv((XPVHV *)p)
1c846c1f 875
d33b2eba
GS
876#define new_XPVMG() (void*)new_xpvmg()
877#define del_XPVMG(p) del_xpvmg((XPVMG *)p)
878
879#define new_XPVLV() (void*)new_xpvlv()
880#define del_XPVLV(p) del_xpvlv((XPVLV *)p)
881
882#define new_XPVBM() (void*)new_xpvbm()
883#define del_XPVBM(p) del_xpvbm((XPVBM *)p)
884
885#endif /* PURIFY */
9b94d1dd 886
d33b2eba
GS
887#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
888#define del_XPVGV(p) my_safefree(p)
1c846c1f 889
d33b2eba
GS
890#define new_XPVFM() my_safemalloc(sizeof(XPVFM))
891#define del_XPVFM(p) my_safefree(p)
1c846c1f 892
d33b2eba
GS
893#define new_XPVIO() my_safemalloc(sizeof(XPVIO))
894#define del_XPVIO(p) my_safefree(p)
8990e307 895
954c1994
GS
896/*
897=for apidoc sv_upgrade
898
899Upgrade an SV to a more complex form. Use C<SvUPGRADE>. See
900C<svtype>.
901
902=cut
903*/
904
79072805 905bool
864dbfa3 906Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
79072805
LW
907{
908 char* pv;
909 U32 cur;
910 U32 len;
a0d0e21e 911 IV iv;
65202027 912 NV nv;
79072805
LW
913 MAGIC* magic;
914 HV* stash;
915
f130fd45
NIS
916 if (mt != SVt_PV && SvREADONLY(sv) && SvFAKE(sv)) {
917 sv_force_normal(sv);
918 }
919
79072805
LW
920 if (SvTYPE(sv) == mt)
921 return TRUE;
922
a5f75d66
AD
923 if (mt < SVt_PVIV)
924 (void)SvOOK_off(sv);
925
79072805
LW
926 switch (SvTYPE(sv)) {
927 case SVt_NULL:
928 pv = 0;
929 cur = 0;
930 len = 0;
931 iv = 0;
932 nv = 0.0;
933 magic = 0;
934 stash = 0;
935 break;
79072805
LW
936 case SVt_IV:
937 pv = 0;
938 cur = 0;
939 len = 0;
463ee0b2 940 iv = SvIVX(sv);
65202027 941 nv = (NV)SvIVX(sv);
79072805
LW
942 del_XIV(SvANY(sv));
943 magic = 0;
944 stash = 0;
ed6116ce 945 if (mt == SVt_NV)
463ee0b2 946 mt = SVt_PVNV;
ed6116ce
LW
947 else if (mt < SVt_PVIV)
948 mt = SVt_PVIV;
79072805
LW
949 break;
950 case SVt_NV:
951 pv = 0;
952 cur = 0;
953 len = 0;
463ee0b2 954 nv = SvNVX(sv);
1bd302c3 955 iv = I_V(nv);
79072805
LW
956 magic = 0;
957 stash = 0;
958 del_XNV(SvANY(sv));
959 SvANY(sv) = 0;
ed6116ce 960 if (mt < SVt_PVNV)
79072805
LW
961 mt = SVt_PVNV;
962 break;
ed6116ce
LW
963 case SVt_RV:
964 pv = (char*)SvRV(sv);
965 cur = 0;
966 len = 0;
56431972
RB
967 iv = PTR2IV(pv);
968 nv = PTR2NV(pv);
ed6116ce
LW
969 del_XRV(SvANY(sv));
970 magic = 0;
971 stash = 0;
972 break;
79072805 973 case SVt_PV:
463ee0b2 974 pv = SvPVX(sv);
79072805
LW
975 cur = SvCUR(sv);
976 len = SvLEN(sv);
977 iv = 0;
978 nv = 0.0;
979 magic = 0;
980 stash = 0;
981 del_XPV(SvANY(sv));
748a9306
LW
982 if (mt <= SVt_IV)
983 mt = SVt_PVIV;
984 else if (mt == SVt_NV)
985 mt = SVt_PVNV;
79072805
LW
986 break;
987 case SVt_PVIV:
463ee0b2 988 pv = SvPVX(sv);
79072805
LW
989 cur = SvCUR(sv);
990 len = SvLEN(sv);
463ee0b2 991 iv = SvIVX(sv);
79072805
LW
992 nv = 0.0;
993 magic = 0;
994 stash = 0;
995 del_XPVIV(SvANY(sv));
996 break;
997 case SVt_PVNV:
463ee0b2 998 pv = SvPVX(sv);
79072805
LW
999 cur = SvCUR(sv);
1000 len = SvLEN(sv);
463ee0b2
LW
1001 iv = SvIVX(sv);
1002 nv = SvNVX(sv);
79072805
LW
1003 magic = 0;
1004 stash = 0;
1005 del_XPVNV(SvANY(sv));
1006 break;
1007 case SVt_PVMG:
463ee0b2 1008 pv = SvPVX(sv);
79072805
LW
1009 cur = SvCUR(sv);
1010 len = SvLEN(sv);
463ee0b2
LW
1011 iv = SvIVX(sv);
1012 nv = SvNVX(sv);
79072805
LW
1013 magic = SvMAGIC(sv);
1014 stash = SvSTASH(sv);
1015 del_XPVMG(SvANY(sv));
1016 break;
1017 default:
cea2e8a9 1018 Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
79072805
LW
1019 }
1020
1021 switch (mt) {
1022 case SVt_NULL:
cea2e8a9 1023 Perl_croak(aTHX_ "Can't upgrade to undef");
79072805
LW
1024 case SVt_IV:
1025 SvANY(sv) = new_XIV();
463ee0b2 1026 SvIVX(sv) = iv;
79072805
LW
1027 break;
1028 case SVt_NV:
1029 SvANY(sv) = new_XNV();
463ee0b2 1030 SvNVX(sv) = nv;
79072805 1031 break;
ed6116ce
LW
1032 case SVt_RV:
1033 SvANY(sv) = new_XRV();
1034 SvRV(sv) = (SV*)pv;
ed6116ce 1035 break;
79072805
LW
1036 case SVt_PV:
1037 SvANY(sv) = new_XPV();
463ee0b2 1038 SvPVX(sv) = pv;
79072805
LW
1039 SvCUR(sv) = cur;
1040 SvLEN(sv) = len;
1041 break;
1042 case SVt_PVIV:
1043 SvANY(sv) = new_XPVIV();
463ee0b2 1044 SvPVX(sv) = pv;
79072805
LW
1045 SvCUR(sv) = cur;
1046 SvLEN(sv) = len;
463ee0b2 1047 SvIVX(sv) = iv;
79072805 1048 if (SvNIOK(sv))
a0d0e21e 1049 (void)SvIOK_on(sv);
79072805
LW
1050 SvNOK_off(sv);
1051 break;
1052 case SVt_PVNV:
1053 SvANY(sv) = new_XPVNV();
463ee0b2 1054 SvPVX(sv) = pv;
79072805
LW
1055 SvCUR(sv) = cur;
1056 SvLEN(sv) = len;
463ee0b2
LW
1057 SvIVX(sv) = iv;
1058 SvNVX(sv) = nv;
79072805
LW
1059 break;
1060 case SVt_PVMG:
1061 SvANY(sv) = new_XPVMG();
463ee0b2 1062 SvPVX(sv) = pv;
79072805
LW
1063 SvCUR(sv) = cur;
1064 SvLEN(sv) = len;
463ee0b2
LW
1065 SvIVX(sv) = iv;
1066 SvNVX(sv) = nv;
79072805
LW
1067 SvMAGIC(sv) = magic;
1068 SvSTASH(sv) = stash;
1069 break;
1070 case SVt_PVLV:
1071 SvANY(sv) = new_XPVLV();
463ee0b2 1072 SvPVX(sv) = pv;
79072805
LW
1073 SvCUR(sv) = cur;
1074 SvLEN(sv) = len;
463ee0b2
LW
1075 SvIVX(sv) = iv;
1076 SvNVX(sv) = nv;
79072805
LW
1077 SvMAGIC(sv) = magic;
1078 SvSTASH(sv) = stash;
1079 LvTARGOFF(sv) = 0;
1080 LvTARGLEN(sv) = 0;
1081 LvTARG(sv) = 0;
1082 LvTYPE(sv) = 0;
1083 break;
1084 case SVt_PVAV:
1085 SvANY(sv) = new_XPVAV();
463ee0b2
LW
1086 if (pv)
1087 Safefree(pv);
2304df62 1088 SvPVX(sv) = 0;
d1bf51dd 1089 AvMAX(sv) = -1;
93965878 1090 AvFILLp(sv) = -1;
463ee0b2
LW
1091 SvIVX(sv) = 0;
1092 SvNVX(sv) = 0.0;
1093 SvMAGIC(sv) = magic;
1094 SvSTASH(sv) = stash;
1095 AvALLOC(sv) = 0;
79072805
LW
1096 AvARYLEN(sv) = 0;
1097 AvFLAGS(sv) = 0;
1098 break;
1099 case SVt_PVHV:
1100 SvANY(sv) = new_XPVHV();
463ee0b2
LW
1101 if (pv)
1102 Safefree(pv);
1103 SvPVX(sv) = 0;
1104 HvFILL(sv) = 0;
1105 HvMAX(sv) = 0;
1106 HvKEYS(sv) = 0;
1107 SvNVX(sv) = 0.0;
79072805
LW
1108 SvMAGIC(sv) = magic;
1109 SvSTASH(sv) = stash;
79072805
LW
1110 HvRITER(sv) = 0;
1111 HvEITER(sv) = 0;
1112 HvPMROOT(sv) = 0;
1113 HvNAME(sv) = 0;
79072805
LW
1114 break;
1115 case SVt_PVCV:
1116 SvANY(sv) = new_XPVCV();
748a9306 1117 Zero(SvANY(sv), 1, XPVCV);
463ee0b2 1118 SvPVX(sv) = pv;
79072805
LW
1119 SvCUR(sv) = cur;
1120 SvLEN(sv) = len;
463ee0b2
LW
1121 SvIVX(sv) = iv;
1122 SvNVX(sv) = nv;
79072805
LW
1123 SvMAGIC(sv) = magic;
1124 SvSTASH(sv) = stash;
79072805
LW
1125 break;
1126 case SVt_PVGV:
1127 SvANY(sv) = new_XPVGV();
463ee0b2 1128 SvPVX(sv) = pv;
79072805
LW
1129 SvCUR(sv) = cur;
1130 SvLEN(sv) = len;
463ee0b2
LW
1131 SvIVX(sv) = iv;
1132 SvNVX(sv) = nv;
79072805
LW
1133 SvMAGIC(sv) = magic;
1134 SvSTASH(sv) = stash;
93a17b20 1135 GvGP(sv) = 0;
79072805
LW
1136 GvNAME(sv) = 0;
1137 GvNAMELEN(sv) = 0;
1138 GvSTASH(sv) = 0;
a5f75d66 1139 GvFLAGS(sv) = 0;
79072805
LW
1140 break;
1141 case SVt_PVBM:
1142 SvANY(sv) = new_XPVBM();
463ee0b2 1143 SvPVX(sv) = pv;
79072805
LW
1144 SvCUR(sv) = cur;
1145 SvLEN(sv) = len;
463ee0b2
LW
1146 SvIVX(sv) = iv;
1147 SvNVX(sv) = nv;
79072805
LW
1148 SvMAGIC(sv) = magic;
1149 SvSTASH(sv) = stash;
1150 BmRARE(sv) = 0;
1151 BmUSEFUL(sv) = 0;
1152 BmPREVIOUS(sv) = 0;
1153 break;
1154 case SVt_PVFM:
1155 SvANY(sv) = new_XPVFM();
748a9306 1156 Zero(SvANY(sv), 1, XPVFM);
463ee0b2 1157 SvPVX(sv) = pv;
79072805
LW
1158 SvCUR(sv) = cur;
1159 SvLEN(sv) = len;
463ee0b2
LW
1160 SvIVX(sv) = iv;
1161 SvNVX(sv) = nv;
79072805
LW
1162 SvMAGIC(sv) = magic;
1163 SvSTASH(sv) = stash;
79072805 1164 break;
8990e307
LW
1165 case SVt_PVIO:
1166 SvANY(sv) = new_XPVIO();
748a9306 1167 Zero(SvANY(sv), 1, XPVIO);
8990e307
LW
1168 SvPVX(sv) = pv;
1169 SvCUR(sv) = cur;
1170 SvLEN(sv) = len;
1171 SvIVX(sv) = iv;
1172 SvNVX(sv) = nv;
1173 SvMAGIC(sv) = magic;
1174 SvSTASH(sv) = stash;
85e6fe83 1175 IoPAGE_LEN(sv) = 60;
8990e307
LW
1176 break;
1177 }
1178 SvFLAGS(sv) &= ~SVTYPEMASK;
1179 SvFLAGS(sv) |= mt;
79072805
LW
1180 return TRUE;
1181}
1182
79072805 1183int
864dbfa3 1184Perl_sv_backoff(pTHX_ register SV *sv)
79072805
LW
1185{
1186 assert(SvOOK(sv));
463ee0b2
LW
1187 if (SvIVX(sv)) {
1188 char *s = SvPVX(sv);
1189 SvLEN(sv) += SvIVX(sv);
1190 SvPVX(sv) -= SvIVX(sv);
79072805 1191 SvIV_set(sv, 0);
463ee0b2 1192 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
79072805
LW
1193 }
1194 SvFLAGS(sv) &= ~SVf_OOK;
a0d0e21e 1195 return 0;
79072805
LW
1196}
1197
954c1994
GS
1198/*
1199=for apidoc sv_grow
1200
1201Expands the character buffer in the SV. This will use C<sv_unref> and will
1202upgrade the SV to C<SVt_PV>. Returns a pointer to the character buffer.
1203Use C<SvGROW>.
1204
1205=cut
1206*/
1207
79072805 1208char *
864dbfa3 1209Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
79072805
LW
1210{
1211 register char *s;
1212
55497cff 1213#ifdef HAS_64K_LIMIT
79072805 1214 if (newlen >= 0x10000) {
1d7c1841
GS
1215 PerlIO_printf(Perl_debug_log,
1216 "Allocation too large: %"UVxf"\n", (UV)newlen);
79072805
LW
1217 my_exit(1);
1218 }
55497cff 1219#endif /* HAS_64K_LIMIT */
a0d0e21e
LW
1220 if (SvROK(sv))
1221 sv_unref(sv);
79072805
LW
1222 if (SvTYPE(sv) < SVt_PV) {
1223 sv_upgrade(sv, SVt_PV);
463ee0b2 1224 s = SvPVX(sv);
79072805
LW
1225 }
1226 else if (SvOOK(sv)) { /* pv is offset? */
1227 sv_backoff(sv);
463ee0b2 1228 s = SvPVX(sv);
79072805
LW
1229 if (newlen > SvLEN(sv))
1230 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
c6f8c383
GA
1231#ifdef HAS_64K_LIMIT
1232 if (newlen >= 0x10000)
1233 newlen = 0xFFFF;
1234#endif
79072805
LW
1235 }
1236 else
463ee0b2 1237 s = SvPVX(sv);
79072805 1238 if (newlen > SvLEN(sv)) { /* need more room? */
8d6dde3e 1239 if (SvLEN(sv) && s) {
f5a32c7f 1240#if defined(MYMALLOC) && !defined(LEAKTEST)
8d6dde3e
IZ
1241 STRLEN l = malloced_size((void*)SvPVX(sv));
1242 if (newlen <= l) {
1243 SvLEN_set(sv, l);
1244 return s;
1245 } else
c70c8a0a 1246#endif
79072805 1247 Renew(s,newlen,char);
8d6dde3e 1248 }
79072805
LW
1249 else
1250 New(703,s,newlen,char);
1251 SvPV_set(sv, s);
1252 SvLEN_set(sv, newlen);
1253 }
1254 return s;
1255}
1256
954c1994
GS
1257/*
1258=for apidoc sv_setiv
1259
1260Copies an integer into the given SV. Does not handle 'set' magic. See
1261C<sv_setiv_mg>.
1262
1263=cut
1264*/
1265
79072805 1266void
864dbfa3 1267Perl_sv_setiv(pTHX_ register SV *sv, IV i)
79072805 1268{
2213622d 1269 SV_CHECK_THINKFIRST(sv);
463ee0b2
LW
1270 switch (SvTYPE(sv)) {
1271 case SVt_NULL:
79072805 1272 sv_upgrade(sv, SVt_IV);
463ee0b2
LW
1273 break;
1274 case SVt_NV:
1275 sv_upgrade(sv, SVt_PVNV);
1276 break;
ed6116ce 1277 case SVt_RV:
463ee0b2 1278 case SVt_PV:
79072805 1279 sv_upgrade(sv, SVt_PVIV);
463ee0b2 1280 break;
a0d0e21e
LW
1281
1282 case SVt_PVGV:
a0d0e21e
LW
1283 case SVt_PVAV:
1284 case SVt_PVHV:
1285 case SVt_PVCV:
1286 case SVt_PVFM:
1287 case SVt_PVIO:
411caa50
JH
1288 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1289 PL_op_desc[PL_op->op_type]);
463ee0b2 1290 }
a0d0e21e 1291 (void)SvIOK_only(sv); /* validate number */
a5f75d66 1292 SvIVX(sv) = i;
463ee0b2 1293 SvTAINT(sv);
79072805
LW
1294}
1295
954c1994
GS
1296/*
1297=for apidoc sv_setiv_mg
1298
1299Like C<sv_setiv>, but also handles 'set' magic.
1300
1301=cut
1302*/
1303
79072805 1304void
864dbfa3 1305Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
ef50df4b
GS
1306{
1307 sv_setiv(sv,i);
1308 SvSETMAGIC(sv);
1309}
1310
954c1994
GS
1311/*
1312=for apidoc sv_setuv
1313
1314Copies an unsigned integer into the given SV. Does not handle 'set' magic.
1315See C<sv_setuv_mg>.
1316
1317=cut
1318*/
1319
ef50df4b 1320void
864dbfa3 1321Perl_sv_setuv(pTHX_ register SV *sv, UV u)
55497cff 1322{
55ada374
NC
1323 /* With these two if statements:
1324 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 1325
55ada374
NC
1326 without
1327 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 1328
55ada374
NC
1329 If you wish to remove them, please benchmark to see what the effect is
1330 */
28e5dec8
JH
1331 if (u <= (UV)IV_MAX) {
1332 sv_setiv(sv, (IV)u);
1333 return;
1334 }
25da4f38
IZ
1335 sv_setiv(sv, 0);
1336 SvIsUV_on(sv);
1337 SvUVX(sv) = u;
55497cff 1338}
1339
954c1994
GS
1340/*
1341=for apidoc sv_setuv_mg
1342
1343Like C<sv_setuv>, but also handles 'set' magic.
1344
1345=cut
1346*/
1347
55497cff 1348void
864dbfa3 1349Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
ef50df4b 1350{
55ada374
NC
1351 /* With these two if statements:
1352 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d460ef45 1353
55ada374
NC
1354 without
1355 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
d460ef45 1356
55ada374
NC
1357 If you wish to remove them, please benchmark to see what the effect is
1358 */
28e5dec8
JH
1359 if (u <= (UV)IV_MAX) {
1360 sv_setiv(sv, (IV)u);
1361 } else {
1362 sv_setiv(sv, 0);
1363 SvIsUV_on(sv);
1364 sv_setuv(sv,u);
1365 }
ef50df4b
GS
1366 SvSETMAGIC(sv);
1367}
1368
954c1994
GS
1369/*
1370=for apidoc sv_setnv
1371
1372Copies a double into the given SV. Does not handle 'set' magic. See
1373C<sv_setnv_mg>.
1374
1375=cut
1376*/
1377
ef50df4b 1378void
65202027 1379Perl_sv_setnv(pTHX_ register SV *sv, NV num)
79072805 1380{
2213622d 1381 SV_CHECK_THINKFIRST(sv);
a0d0e21e
LW
1382 switch (SvTYPE(sv)) {
1383 case SVt_NULL:
1384 case SVt_IV:
79072805 1385 sv_upgrade(sv, SVt_NV);
a0d0e21e 1386 break;
a0d0e21e
LW
1387 case SVt_RV:
1388 case SVt_PV:
1389 case SVt_PVIV:
79072805 1390 sv_upgrade(sv, SVt_PVNV);
a0d0e21e 1391 break;
827b7e14 1392
a0d0e21e 1393 case SVt_PVGV:
a0d0e21e
LW
1394 case SVt_PVAV:
1395 case SVt_PVHV:
1396 case SVt_PVCV:
1397 case SVt_PVFM:
1398 case SVt_PVIO:
411caa50
JH
1399 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1400 PL_op_name[PL_op->op_type]);
79072805 1401 }
463ee0b2 1402 SvNVX(sv) = num;
a0d0e21e 1403 (void)SvNOK_only(sv); /* validate number */
463ee0b2 1404 SvTAINT(sv);
79072805
LW
1405}
1406
954c1994
GS
1407/*
1408=for apidoc sv_setnv_mg
1409
1410Like C<sv_setnv>, but also handles 'set' magic.
1411
1412=cut
1413*/
1414
ef50df4b 1415void
65202027 1416Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
ef50df4b
GS
1417{
1418 sv_setnv(sv,num);
1419 SvSETMAGIC(sv);
1420}
1421
76e3520e 1422STATIC void
cea2e8a9 1423S_not_a_number(pTHX_ SV *sv)
a0d0e21e
LW
1424{
1425 char tmpbuf[64];
1426 char *d = tmpbuf;
1427 char *s;
dc28f22b
GA
1428 char *limit = tmpbuf + sizeof(tmpbuf) - 8;
1429 /* each *s can expand to 4 chars + "...\0",
1430 i.e. need room for 8 chars */
a0d0e21e 1431
dc28f22b 1432 for (s = SvPVX(sv); *s && d < limit; s++) {
bbce6d69 1433 int ch = *s & 0xFF;
1434 if (ch & 128 && !isPRINT_LC(ch)) {
a0d0e21e
LW
1435 *d++ = 'M';
1436 *d++ = '-';
1437 ch &= 127;
1438 }
bbce6d69 1439 if (ch == '\n') {
1440 *d++ = '\\';
1441 *d++ = 'n';
1442 }
1443 else if (ch == '\r') {
1444 *d++ = '\\';
1445 *d++ = 'r';
1446 }
1447 else if (ch == '\f') {
1448 *d++ = '\\';
1449 *d++ = 'f';
1450 }
1451 else if (ch == '\\') {
1452 *d++ = '\\';
1453 *d++ = '\\';
1454 }
1455 else if (isPRINT_LC(ch))
a0d0e21e
LW
1456 *d++ = ch;
1457 else {
1458 *d++ = '^';
bbce6d69 1459 *d++ = toCTRL(ch);
a0d0e21e
LW
1460 }
1461 }
1462 if (*s) {
1463 *d++ = '.';
1464 *d++ = '.';
1465 *d++ = '.';
1466 }
1467 *d = '\0';
1468
533c011a 1469 if (PL_op)
42d38218
MS
1470 Perl_warner(aTHX_ WARN_NUMERIC,
1471 "Argument \"%s\" isn't numeric in %s", tmpbuf,
1472 PL_op_desc[PL_op->op_type]);
a0d0e21e 1473 else
42d38218
MS
1474 Perl_warner(aTHX_ WARN_NUMERIC,
1475 "Argument \"%s\" isn't numeric", tmpbuf);
a0d0e21e
LW
1476}
1477
28e5dec8
JH
1478/* the number can be converted to integer with atol() or atoll() although */
1479#define IS_NUMBER_TO_INT_BY_ATOL 0x01 /* integer (may have decimals) */
1480#define IS_NUMBER_TO_INT_BY_STRTOL 0x02 /* it may exceed IV_MAX */
1481#define IS_NUMBER_TO_INT_BY_ATOF 0x04 /* seen something like 123e4 */
1482#define IS_NUMBER_LONGER_THAN_IV_MAX 0x08 /* more digits than IV_MAX */
1483#define IS_NUMBER_AS_LONG_AS_IV_MAX 0x10 /* may(be not) larger than IV_MAX */
1484#define IS_NUMBER_NOT_INT 0x20 /* seen a decimal point or e */
1485#define IS_NUMBER_NEG 0x40 /* seen a leading - */
1486#define IS_NUMBER_INFINITY 0x80 /* /^\s*-?Infinity\s*$/i */
25da4f38
IZ
1487
1488/* Actually, ISO C leaves conversion of UV to IV undefined, but
1489 until proven guilty, assume that things are not that bad... */
1490
28e5dec8
JH
1491/* As 64 bit platforms often have an NV that doesn't preserve all bits of
1492 an IV (an assumption perl has been based on to date) it becomes necessary
1493 to remove the assumption that the NV always carries enough precision to
1494 recreate the IV whenever needed, and that the NV is the canonical form.
1495 Instead, IV/UV and NV need to be given equal rights. So as to not lose
1496 precision as an side effect of conversion (which would lead to insanity
1497 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1498 1) to distinguish between IV/UV/NV slots that have cached a valid
1499 conversion where precision was lost and IV/UV/NV slots that have a
1500 valid conversion which has lost no precision
1501 2) to ensure that if a numeric conversion to one form is request that
1502 would lose precision, the precise conversion (or differently
1503 imprecise conversion) is also performed and cached, to prevent
1504 requests for different numeric formats on the same SV causing
1505 lossy conversion chains. (lossless conversion chains are perfectly
1506 acceptable (still))
1507
1508
1509 flags are used:
1510 SvIOKp is true if the IV slot contains a valid value
1511 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
1512 SvNOKp is true if the NV slot contains a valid value
1513 SvNOK is true only if the NV value is accurate
1514
1515 so
1516 while converting from PV to NV check to see if converting that NV to an
1517 IV(or UV) would lose accuracy over a direct conversion from PV to
1518 IV(or UV). If it would, cache both conversions, return NV, but mark
1519 SV as IOK NOKp (ie not NOK).
1520
1521 while converting from PV to IV check to see if converting that IV to an
1522 NV would lose accuracy over a direct conversion from PV to NV. If it
1523 would, cache both conversions, flag similarly.
1524
1525 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1526 correctly because if IV & NV were set NV *always* overruled.
1527 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flags meaning
1528 changes - now IV and NV together means that the two are interchangeable
1529 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 1530
28e5dec8
JH
1531 The benefit of this is operations such as pp_add know that if SvIOK is
1532 true for both left and right operands, then integer addition can be
1533 used instead of floating point. (for cases where the result won't
1534 overflow) Before, floating point was always used, which could lead to
1535 loss of precision compared with integer addition.
1536
1537 * making IV and NV equal status should make maths accurate on 64 bit
1538 platforms
1539 * may speed up maths somewhat if pp_add and friends start to use
1540 integers when possible instead of fp. (hopefully the overhead in
1541 looking for SvIOK and checking for overflow will not outweigh the
1542 fp to integer speedup)
1543 * will slow down integer operations (callers of SvIV) on "inaccurate"
1544 values, as the change from SvIOK to SvIOKp will cause a call into
1545 sv_2iv each time rather than a macro access direct to the IV slot
1546 * should speed up number->string conversion on integers as IV is
1547 favoured when IV and NV equally accurate
1548
1549 ####################################################################
1550 You had better be using SvIOK_notUV if you want an IV for arithmetic
1551 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV
1552 SvUOK is true iff UV.
1553 ####################################################################
1554
1555 Your mileage will vary depending your CPUs relative fp to integer
1556 performance ratio.
1557*/
1558
1559#ifndef NV_PRESERVES_UV
1560#define IS_NUMBER_UNDERFLOW_IV 1
1561#define IS_NUMBER_UNDERFLOW_UV 2
1562#define IS_NUMBER_IV_AND_UV 2
1563#define IS_NUMBER_OVERFLOW_IV 4
1564#define IS_NUMBER_OVERFLOW_UV 5
1565/* Hopefully your optimiser will consider inlining these two functions. */
1566STATIC int
1567S_sv_2inuv_non_preserve (pTHX_ register SV *sv, I32 numtype) {
1568 NV nv = SvNVX(sv); /* Code simpler and had compiler problems if */
1569 UV nv_as_uv = U_V(nv); /* these are not in simple variables. */
159fae86 1570 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_2inuv_non '%s', IV=0x%"UVxf" NV=%g inttype=%"UVXf"\n", SvPVX(sv), SvIVX(sv), nv, (UV)numtype));
28e5dec8
JH
1571 if (nv_as_uv <= (UV)IV_MAX) {
1572 (void)SvIOKp_on(sv);
1573 (void)SvNOKp_on(sv);
1574 /* Within suitable range to fit in an IV, atol won't overflow */
1575 /* XXX quite sure? Is that your final answer? not really, I'm
1576 trusting that nv_as_uv to round down if NV is (IV_MAX + 1) */
1577 SvIVX(sv) = (IV)Atol(SvPVX(sv));
1578 if (numtype & IS_NUMBER_NOT_INT) {
1579 /* I believe that even if the original PV had decimals, they
1580 are lost beyond the limit of the FP precision.
1581 However, neither is canonical, so both only get p flags.
1582 NWC, 2000/11/25 */
1583 /* Both already have p flags, so do nothing */
1584 } else if (SvIVX(sv) == I_V(nv)) {
1585 SvNOK_on(sv);
1586 SvIOK_on(sv);
1587 } else {
1588 SvIOK_on(sv);
1589 /* It had no "." so it must be integer. assert (get in here from
1590 sv_2iv and sv_2uv only for ndef HAS_STRTOL and
1591 IS_NUMBER_AS_LONG_AS_IV_MAX) or my logic is faulty and all
1592 conversion routines need audit. */
1593 }
1594 return nv < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1595 }
1596 /* between IV_MAX and NV(UV_MAX). Could be slightly> UV_MAX */
1597 (void)SvIOKp_on(sv);
1598 (void)SvNOKp_on(sv);
1599#ifdef HAS_STRTOUL
1600 {
1601 int save_errno = errno;
1602 errno = 0;
1603 SvUVX(sv) = Strtoul(SvPVX(sv), Null(char**), 10);
1604 if (errno == 0) {
1605 if (numtype & IS_NUMBER_NOT_INT) {
1606 /* UV and NV both imprecise. */
1607 SvIsUV_on(sv);
1608 } else if (SvUVX(sv) == nv_as_uv && SvUVX(sv) != UV_MAX) {
1609 SvNOK_on(sv);
1610 SvIOK_on(sv);
1611 SvIsUV_on(sv);
1612 } else {
1613 SvIOK_on(sv);
1614 SvIsUV_on(sv);
1615 }
1616 errno = save_errno;
1617 return IS_NUMBER_OVERFLOW_IV;
1618 }
1619 errno = save_errno;
1620 SvNOK_on(sv);
1621 /* Must have just overflowed UV, but not enough that an NV could spot
1622 this.. */
1623 return IS_NUMBER_OVERFLOW_UV;
1624 }
1625#else
1626 /* We've just lost integer precision, nothing we could do. */
1627 SvUVX(sv) = nv_as_uv;
159fae86 1628 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_2niuv_non UV? '%s', UV=0x%"UVxf" NV=%g U_V(NV)=0x%"UVxf" inttype=%"UVXf"\n", SvPVX(sv), SvIVX(sv), nv, nv_as_uv, (UV)numtype));
28e5dec8
JH
1629 /* UV and NV slots equally valid only if we have casting symmetry. */
1630 if (numtype & IS_NUMBER_NOT_INT) {
1631 SvIsUV_on(sv);
1632 } else if (SvUVX(sv) == nv_as_uv && SvUVX(sv) != UV_MAX) {
1633 /* UV_MAX can cast up to NV (UV_MAX+1), that NV casts down to UV_MAX
1634 UV_MAX ought to be 0xFF...FFF which won't preserve (We only
1635 get to this point if NVs don't preserve UVs) */
1636 SvNOK_on(sv);
1637 SvIOK_on(sv);
1638 SvIsUV_on(sv);
1639 } else {
1640 /* As above, I believe UV at least as good as NV */
1641 SvIsUV_on(sv);
1642 }
1643#endif /* HAS_STRTOUL */
1644 return IS_NUMBER_OVERFLOW_IV;
1645}
1646
1647/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
1648STATIC int
1649S_sv_2iuv_non_preserve (pTHX_ register SV *sv, I32 numtype)
1650{
159fae86 1651 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_2iuv_non '%s', IV=0x%"UVxf" NV=%g inttype=%"UVXf"\n", SvPVX(sv), SvIVX(sv), SvNVX(sv), (UV)numtype));
28e5dec8
JH
1652 if (SvNVX(sv) < (NV)IV_MIN) {
1653 (void)SvIOKp_on(sv);
1654 (void)SvNOK_on(sv);
1655 SvIVX(sv) = IV_MIN;
1656 return IS_NUMBER_UNDERFLOW_IV;
1657 }
1658 if (SvNVX(sv) > (NV)UV_MAX) {
1659 (void)SvIOKp_on(sv);
1660 (void)SvNOK_on(sv);
1661 SvIsUV_on(sv);
1662 SvUVX(sv) = UV_MAX;
1663 return IS_NUMBER_OVERFLOW_UV;
1664 }
1665 if (!(numtype & (IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_TO_INT_BY_STRTOL))) {
1666 (void)SvIOKp_on(sv);
1667 (void)SvNOK_on(sv);
1668 /* Can't use strtol etc to convert this string */
1669 if (SvNVX(sv) <= (UV)IV_MAX) {
1670 SvIVX(sv) = I_V(SvNVX(sv));
1671 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1672 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
1673 } else {
1674 /* Integer is imprecise. NOK, IOKp */
1675 }
1676 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1677 }
1678 SvIsUV_on(sv);
1679 SvUVX(sv) = U_V(SvNVX(sv));
1680 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
09bb3e27
NC
1681 if (SvUVX(sv) == UV_MAX) {
1682 /* As we know that NVs don't preserve UVs, UV_MAX cannot
1683 possibly be preserved by NV. Hence, it must be overflow.
1684 NOK, IOKp */
1685 return IS_NUMBER_OVERFLOW_UV;
1686 }
28e5dec8
JH
1687 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
1688 } else {
1689 /* Integer is imprecise. NOK, IOKp */
1690 }
1691 return IS_NUMBER_OVERFLOW_IV;
1692 }
e57fe1aa 1693 return S_sv_2inuv_non_preserve(aTHX_ sv, numtype);
28e5dec8
JH
1694}
1695#endif /* NV_PRESERVES_UV*/
1696
a0d0e21e 1697IV
864dbfa3 1698Perl_sv_2iv(pTHX_ register SV *sv)
79072805
LW
1699{
1700 if (!sv)
1701 return 0;
8990e307 1702 if (SvGMAGICAL(sv)) {
463ee0b2
LW
1703 mg_get(sv);
1704 if (SvIOKp(sv))
1705 return SvIVX(sv);
748a9306 1706 if (SvNOKp(sv)) {
25da4f38 1707 return I_V(SvNVX(sv));
748a9306 1708 }
36477c24 1709 if (SvPOKp(sv) && SvLEN(sv))
1710 return asIV(sv);
3fe9a6f1 1711 if (!SvROK(sv)) {
d008e5eb 1712 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 1713 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1d7c1841 1714 report_uninit();
c6ee37c5 1715 }
36477c24 1716 return 0;
3fe9a6f1 1717 }
463ee0b2 1718 }
ed6116ce 1719 if (SvTHINKFIRST(sv)) {
a0d0e21e 1720 if (SvROK(sv)) {
a0d0e21e 1721 SV* tmpstr;
1554e226
DC
1722 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
1723 (SvRV(tmpstr) != SvRV(sv)))
9e7bc3e8 1724 return SvIV(tmpstr);
56431972 1725 return PTR2IV(SvRV(sv));
a0d0e21e 1726 }
47deb5e7
NIS
1727 if (SvREADONLY(sv) && SvFAKE(sv)) {
1728 sv_force_normal(sv);
1729 }
0336b60e 1730 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 1731 if (ckWARN(WARN_UNINITIALIZED))
1d7c1841 1732 report_uninit();
ed6116ce
LW
1733 return 0;
1734 }
79072805 1735 }
25da4f38
IZ
1736 if (SvIOKp(sv)) {
1737 if (SvIsUV(sv)) {
1738 return (IV)(SvUVX(sv));
1739 }
1740 else {
1741 return SvIVX(sv);
1742 }
463ee0b2 1743 }
748a9306 1744 if (SvNOKp(sv)) {
28e5dec8
JH
1745 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
1746 * without also getting a cached IV/UV from it at the same time
1747 * (ie PV->NV conversion should detect loss of accuracy and cache
1748 * IV or UV at same time to avoid this. NWC */
25da4f38
IZ
1749
1750 if (SvTYPE(sv) == SVt_NV)
1751 sv_upgrade(sv, SVt_PVNV);
1752
28e5dec8
JH
1753 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
1754 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
1755 certainly cast into the IV range at IV_MAX, whereas the correct
1756 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
1757 cases go to UV */
1758 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
748a9306 1759 SvIVX(sv) = I_V(SvNVX(sv));
28e5dec8
JH
1760 if (SvNVX(sv) == (NV) SvIVX(sv)
1761#ifndef NV_PRESERVES_UV
1762 && (((UV)1 << NV_PRESERVES_UV_BITS) >
1763 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
1764 /* Don't flag it as "accurately an integer" if the number
1765 came from a (by definition imprecise) NV operation, and
1766 we're outside the range of NV integer precision */
1767#endif
1768 ) {
1769 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
1770 DEBUG_c(PerlIO_printf(Perl_debug_log,
1771 "0x%"UVxf" iv(%g => %"IVdf") (precise)\n",
1772 PTR2UV(sv),
1773 SvNVX(sv),
1774 SvIVX(sv)));
1775
1776 } else {
1777 /* IV not precise. No need to convert from PV, as NV
1778 conversion would already have cached IV if it detected
1779 that PV->IV would be better than PV->NV->IV
1780 flags already correct - don't set public IOK. */
1781 DEBUG_c(PerlIO_printf(Perl_debug_log,
1782 "0x%"UVxf" iv(%g => %"IVdf") (imprecise)\n",
1783 PTR2UV(sv),
1784 SvNVX(sv),
1785 SvIVX(sv)));
1786 }
1787 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
1788 but the cast (NV)IV_MIN rounds to a the value less (more
1789 negative) than IV_MIN which happens to be equal to SvNVX ??
1790 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
1791 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
1792 (NV)UVX == NVX are both true, but the values differ. :-(
1793 Hopefully for 2s complement IV_MIN is something like
1794 0x8000000000000000 which will be exact. NWC */
d460ef45 1795 }
25da4f38 1796 else {
ff68c719 1797 SvUVX(sv) = U_V(SvNVX(sv));
28e5dec8
JH
1798 if (
1799 (SvNVX(sv) == (NV) SvUVX(sv))
1800#ifndef NV_PRESERVES_UV
1801 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
1802 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
1803 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
1804 /* Don't flag it as "accurately an integer" if the number
1805 came from a (by definition imprecise) NV operation, and
1806 we're outside the range of NV integer precision */
1807#endif
1808 )
1809 SvIOK_on(sv);
25da4f38
IZ
1810 SvIsUV_on(sv);
1811 ret_iv_max:
1c846c1f 1812 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 1813 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 1814 PTR2UV(sv),
57def98f
JH
1815 SvUVX(sv),
1816 SvUVX(sv)));
25da4f38
IZ
1817 return (IV)SvUVX(sv);
1818 }
748a9306
LW
1819 }
1820 else if (SvPOKp(sv) && SvLEN(sv)) {
25da4f38
IZ
1821 I32 numtype = looks_like_number(sv);
1822
1823 /* We want to avoid a possible problem when we cache an IV which
1824 may be later translated to an NV, and the resulting NV is not
1825 the translation of the initial data.
1c846c1f 1826
25da4f38
IZ
1827 This means that if we cache such an IV, we need to cache the
1828 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 1829 cache the NV if we are sure it's not needed.
25da4f38 1830 */
16b7a9a4 1831
28e5dec8
JH
1832 if ((numtype & ~IS_NUMBER_NEG) == IS_NUMBER_TO_INT_BY_ATOL) {
1833 /* The NV may be reconstructed from IV - safe to cache IV,
1834 which may be calculated by atol(). */
1835 if (SvTYPE(sv) < SVt_PVIV)
1836 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 1837 (void)SvIOK_on(sv);
28e5dec8
JH
1838 SvIVX(sv) = Atol(SvPVX(sv));
1839 } else {
1840#ifdef HAS_STRTOL
1841 IV i;
1842 int save_errno = errno;
1843 /* Is it an integer that we could convert with strtol?
1844 So try it, and if it doesn't set errno then it's pukka.
1845 This should be faster than going atof and then thinking. */
1846 if (((numtype & (IS_NUMBER_TO_INT_BY_STRTOL | IS_NUMBER_NOT_INT))
1847 == IS_NUMBER_TO_INT_BY_STRTOL)
1848 /* && is a sequence point. Without it not sure if I'm trying
1849 to do too much between sequence points and hence going
1850 undefined */
1851 && ((errno = 0), 1) /* , 1 so always true */
1852 && ((i = Strtol(SvPVX(sv), Null(char**), 10)), 1)
1853 && (errno == 0)) {
1854 if (SvTYPE(sv) < SVt_PVIV)
1855 sv_upgrade(sv, SVt_PVIV);
1856 (void)SvIOK_on(sv);
1857 SvIVX(sv) = i;
1858 errno = save_errno;
1859 } else
1860#endif
1861 {
1862 NV d;
1863#ifdef HAS_STRTOL
1864 /* Hopefully trace flow will optimise this away where possible
1865 */
1866 errno = save_errno;
1867#endif
1868 /* It wasn't an integer, or it overflowed, or we don't have
1869 strtol. Do things the slow way - check if it's a UV etc. */
1870 d = Atof(SvPVX(sv));
1871
1872 if (SvTYPE(sv) < SVt_PVNV)
1873 sv_upgrade(sv, SVt_PVNV);
1874 SvNVX(sv) = d;
1875
1876 if (! numtype && ckWARN(WARN_NUMERIC))
1877 not_a_number(sv);
1878
65202027 1879#if defined(USE_LONG_DOUBLE)
28e5dec8
JH
1880 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
1881 PTR2UV(sv), SvNVX(sv)));
65202027 1882#else
28e5dec8
JH
1883 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%g)\n",
1884 PTR2UV(sv), SvNVX(sv)));
65202027 1885#endif
28e5dec8
JH
1886
1887
1888#ifdef NV_PRESERVES_UV
1889 (void)SvIOKp_on(sv);
1890 (void)SvNOK_on(sv);
1891 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
1892 SvIVX(sv) = I_V(SvNVX(sv));
1893 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1894 SvIOK_on(sv);
1895 } else {
1896 /* Integer is imprecise. NOK, IOKp */
1897 }
1898 /* UV will not work better than IV */
1899 } else {
1900 if (SvNVX(sv) > (NV)UV_MAX) {
1901 SvIsUV_on(sv);
1902 /* Integer is inaccurate. NOK, IOKp, is UV */
1903 SvUVX(sv) = UV_MAX;
1904 SvIsUV_on(sv);
1905 } else {
1906 SvUVX(sv) = U_V(SvNVX(sv));
1907 /* 0xFFFFFFFFFFFFFFFF not an issue in here */
1908 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
1909 SvIOK_on(sv);
1910 SvIsUV_on(sv);
1911 } else {
1912 /* Integer is imprecise. NOK, IOKp, is UV */
1913 SvIsUV_on(sv);
1914 }
1915 }
1916 goto ret_iv_max;
1917 }
1918#else /* NV_PRESERVES_UV */
1919 if (((UV)1 << NV_PRESERVES_UV_BITS) >
1920 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
1921 /* Small enough to preserve all bits. */
1922 (void)SvIOKp_on(sv);
1923 SvNOK_on(sv);
1924 SvIVX(sv) = I_V(SvNVX(sv));
1925 if ((NV)(SvIVX(sv)) == SvNVX(sv))
1926 SvIOK_on(sv);
1927 /* Assumption: first non-preserved integer is < IV_MAX,
1928 this NV is in the preserved range, therefore: */
1929 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
1930 < (UV)IV_MAX)) {
1931 Perl_croak(aTHX_ "sv_2iv assumed (U_V(fabs(SvNVX(sv))) < (UV)IV_MAX) but SvNVX(sv)=%g U_V is 0x%"UVxf", IV_MAX is 0x%"UVxf"\n", SvNVX(sv), U_V(SvNVX(sv)), (UV)IV_MAX);
1932 }
1933 } else if (sv_2iuv_non_preserve (sv, numtype)
1934 >= IS_NUMBER_OVERFLOW_IV)
1935 goto ret_iv_max;
1936#endif /* NV_PRESERVES_UV */
25da4f38
IZ
1937 }
1938 }
28e5dec8 1939 } else {
599cee73 1940 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1d7c1841 1941 report_uninit();
25da4f38
IZ
1942 if (SvTYPE(sv) < SVt_IV)
1943 /* Typically the caller expects that sv_any is not NULL now. */
1944 sv_upgrade(sv, SVt_IV);
a0d0e21e 1945 return 0;
79072805 1946 }
1d7c1841
GS
1947 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
1948 PTR2UV(sv),SvIVX(sv)));
25da4f38 1949 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
1950}
1951
ff68c719 1952UV
864dbfa3 1953Perl_sv_2uv(pTHX_ register SV *sv)
ff68c719 1954{
1955 if (!sv)
1956 return 0;
1957 if (SvGMAGICAL(sv)) {
1958 mg_get(sv);
1959 if (SvIOKp(sv))
1960 return SvUVX(sv);
1961 if (SvNOKp(sv))
1962 return U_V(SvNVX(sv));
36477c24 1963 if (SvPOKp(sv) && SvLEN(sv))
1964 return asUV(sv);
3fe9a6f1 1965 if (!SvROK(sv)) {
d008e5eb 1966 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 1967 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1d7c1841 1968 report_uninit();
c6ee37c5 1969 }
36477c24 1970 return 0;
3fe9a6f1 1971 }
ff68c719 1972 }
1973 if (SvTHINKFIRST(sv)) {
1974 if (SvROK(sv)) {
ff68c719 1975 SV* tmpstr;
1554e226
DC
1976 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
1977 (SvRV(tmpstr) != SvRV(sv)))
9e7bc3e8 1978 return SvUV(tmpstr);
56431972 1979 return PTR2UV(SvRV(sv));
ff68c719 1980 }
8a818333
NIS
1981 if (SvREADONLY(sv) && SvFAKE(sv)) {
1982 sv_force_normal(sv);
1983 }
0336b60e 1984 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 1985 if (ckWARN(WARN_UNINITIALIZED))
1d7c1841 1986 report_uninit();
ff68c719 1987 return 0;
1988 }
1989 }
25da4f38
IZ
1990 if (SvIOKp(sv)) {
1991 if (SvIsUV(sv)) {
1992 return SvUVX(sv);
1993 }
1994 else {
1995 return (UV)SvIVX(sv);
1996 }
ff68c719 1997 }
1998 if (SvNOKp(sv)) {
28e5dec8
JH
1999 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2000 * without also getting a cached IV/UV from it at the same time
2001 * (ie PV->NV conversion should detect loss of accuracy and cache
2002 * IV or UV at same time to avoid this. */
2003 /* IV-over-UV optimisation - choose to cache IV if possible */
2004
25da4f38
IZ
2005 if (SvTYPE(sv) == SVt_NV)
2006 sv_upgrade(sv, SVt_PVNV);
28e5dec8
JH
2007
2008 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2009 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
f7bbb42a 2010 SvIVX(sv) = I_V(SvNVX(sv));
28e5dec8
JH
2011 if (SvNVX(sv) == (NV) SvIVX(sv)
2012#ifndef NV_PRESERVES_UV
2013 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2014 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2015 /* Don't flag it as "accurately an integer" if the number
2016 came from a (by definition imprecise) NV operation, and
2017 we're outside the range of NV integer precision */
2018#endif
2019 ) {
2020 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2021 DEBUG_c(PerlIO_printf(Perl_debug_log,
2022 "0x%"UVxf" uv(%g => %"IVdf") (precise)\n",
2023 PTR2UV(sv),
2024 SvNVX(sv),
2025 SvIVX(sv)));
2026
2027 } else {
2028 /* IV not precise. No need to convert from PV, as NV
2029 conversion would already have cached IV if it detected
2030 that PV->IV would be better than PV->NV->IV
2031 flags already correct - don't set public IOK. */
2032 DEBUG_c(PerlIO_printf(Perl_debug_log,
2033 "0x%"UVxf" uv(%g => %"IVdf") (imprecise)\n",
2034 PTR2UV(sv),
2035 SvNVX(sv),
2036 SvIVX(sv)));
2037 }
2038 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2039 but the cast (NV)IV_MIN rounds to a the value less (more
2040 negative) than IV_MIN which happens to be equal to SvNVX ??
2041 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2042 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2043 (NV)UVX == NVX are both true, but the values differ. :-(
2044 Hopefully for 2s complement IV_MIN is something like
2045 0x8000000000000000 which will be exact. NWC */
d460ef45 2046 }
28e5dec8
JH
2047 else {
2048 SvUVX(sv) = U_V(SvNVX(sv));
2049 if (
2050 (SvNVX(sv) == (NV) SvUVX(sv))
2051#ifndef NV_PRESERVES_UV
2052 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2053 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2054 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2055 /* Don't flag it as "accurately an integer" if the number
2056 came from a (by definition imprecise) NV operation, and
2057 we're outside the range of NV integer precision */
2058#endif
2059 )
2060 SvIOK_on(sv);
2061 SvIsUV_on(sv);
1c846c1f 2062 DEBUG_c(PerlIO_printf(Perl_debug_log,
28e5dec8 2063 "0x%"UVxf" 2uv(%"UVuf" => %"IVdf") (as unsigned)\n",
57def98f 2064 PTR2UV(sv),
28e5dec8
JH
2065 SvUVX(sv),
2066 SvUVX(sv)));
25da4f38 2067 }
ff68c719 2068 }
2069 else if (SvPOKp(sv) && SvLEN(sv)) {
25da4f38
IZ
2070 I32 numtype = looks_like_number(sv);
2071
2072 /* We want to avoid a possible problem when we cache a UV which
2073 may be later translated to an NV, and the resulting NV is not
2074 the translation of the initial data.
1c846c1f 2075
25da4f38
IZ
2076 This means that if we cache such a UV, we need to cache the
2077 NV as well. Moreover, we trade speed for space, and do not
2078 cache the NV if not needed.
2079 */
16b7a9a4 2080
28e5dec8 2081 if ((numtype & ~IS_NUMBER_NEG) == IS_NUMBER_TO_INT_BY_ATOL) {
f7bbb42a 2082 /* The NV may be reconstructed from IV - safe to cache IV,
28e5dec8
JH
2083 which may be calculated by atol(). */
2084 if (SvTYPE(sv) < SVt_PVIV)
f7bbb42a
JH
2085 sv_upgrade(sv, SVt_PVIV);
2086 (void)SvIOK_on(sv);
28e5dec8
JH
2087 SvIVX(sv) = Atol(SvPVX(sv));
2088 } else {
f7bbb42a 2089#ifdef HAS_STRTOUL
28e5dec8 2090 UV u;
f9172815 2091 char *num_begin = SvPVX(sv);
28e5dec8 2092 int save_errno = errno;
d460ef45 2093
f9172815
JH
2094 /* seems that strtoul taking numbers that start with - is
2095 implementation dependant, and can't be relied upon. */
2096 if (numtype & IS_NUMBER_NEG) {
2097 /* Not totally defensive. assumine that looks_like_num
2098 didn't lie about a - sign */
2099 while (isSPACE(*num_begin))
2100 num_begin++;
2101 if (*num_begin == '-')
2102 num_begin++;
2103 }
d460ef45 2104
28e5dec8
JH
2105 /* Is it an integer that we could convert with strtoul?
2106 So try it, and if it doesn't set errno then it's pukka.
2107 This should be faster than going atof and then thinking. */
2108 if (((numtype & (IS_NUMBER_TO_INT_BY_STRTOL | IS_NUMBER_NOT_INT))
2109 == IS_NUMBER_TO_INT_BY_STRTOL)
2110 && ((errno = 0), 1) /* always true */
f9172815 2111 && ((u = Strtoul(num_begin, Null(char**), 10)), 1) /* ditto */
28e5dec8 2112 && (errno == 0)
d460ef45 2113 /* If known to be negative, check it didn't undeflow IV
f9172815
JH
2114 XXX possibly we should put more negative values as NVs
2115 direct rather than go via atof below */
2116 && ((numtype & IS_NUMBER_NEG) ? (u <= (UV)IV_MIN) : 1)) {
28e5dec8
JH
2117 errno = save_errno;
2118
2119 if (SvTYPE(sv) < SVt_PVIV)
2120 sv_upgrade(sv, SVt_PVIV);
2121 (void)SvIOK_on(sv);
2122
2123 /* If it's negative must use IV.
2124 IV-over-UV optimisation */
f9172815
JH
2125 if (numtype & IS_NUMBER_NEG) {
2126 SvIVX(sv) = -(IV)u;
2127 } else if (u <= (UV) IV_MAX) {
28e5dec8
JH
2128 SvIVX(sv) = (IV)u;
2129 } else {
2130 /* it didn't overflow, and it was positive. */
2131 SvUVX(sv) = u;
2132 SvIsUV_on(sv);
2133 }
2134 } else
f7bbb42a 2135#endif
28e5dec8
JH
2136 {
2137 NV d;
2138#ifdef HAS_STRTOUL
2139 /* Hopefully trace flow will optimise this away where possible
2140 */
2141 errno = save_errno;
2142#endif
2143 /* It wasn't an integer, or it overflowed, or we don't have
2144 strtol. Do things the slow way - check if it's a IV etc. */
2145 d = Atof(SvPVX(sv));
2146
2147 if (SvTYPE(sv) < SVt_PVNV)
2148 sv_upgrade(sv, SVt_PVNV);
2149 SvNVX(sv) = d;
2150
2151 if (! numtype && ckWARN(WARN_NUMERIC))
2152 not_a_number(sv);
2153
2154#if defined(USE_LONG_DOUBLE)
2155 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%" PERL_PRIgldbl ")\n",
2156 PTR2UV(sv), SvNVX(sv)));
2157#else
2158 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%g)\n",
2159 PTR2UV(sv), SvNVX(sv)));
2160#endif
2161
2162#ifdef NV_PRESERVES_UV
2163 (void)SvIOKp_on(sv);
2164 (void)SvNOK_on(sv);
2165 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2166 SvIVX(sv) = I_V(SvNVX(sv));
2167 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2168 SvIOK_on(sv);
2169 } else {
2170 /* Integer is imprecise. NOK, IOKp */
2171 }
2172 /* UV will not work better than IV */
2173 } else {
2174 if (SvNVX(sv) > (NV)UV_MAX) {
2175 SvIsUV_on(sv);
2176 /* Integer is inaccurate. NOK, IOKp, is UV */
2177 SvUVX(sv) = UV_MAX;
2178 SvIsUV_on(sv);
2179 } else {
2180 SvUVX(sv) = U_V(SvNVX(sv));
2181 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2182 NV preservse UV so can do correct comparison. */
2183 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2184 SvIOK_on(sv);
2185 SvIsUV_on(sv);
2186 } else {
2187 /* Integer is imprecise. NOK, IOKp, is UV */
2188 SvIsUV_on(sv);
2189 }
2190 }
2191 }
2192#else /* NV_PRESERVES_UV */
2193 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2194 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2195 /* Small enough to preserve all bits. */
2196 (void)SvIOKp_on(sv);
2197 SvNOK_on(sv);
2198 SvIVX(sv) = I_V(SvNVX(sv));
2199 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2200 SvIOK_on(sv);
2201 /* Assumption: first non-preserved integer is < IV_MAX,
2202 this NV is in the preserved range, therefore: */
2203 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2204 < (UV)IV_MAX)) {
2205 Perl_croak(aTHX_ "sv_2uv assumed (U_V(fabs(SvNVX(sv))) < (UV)IV_MAX) but SvNVX(sv)=%g U_V is 0x%"UVxf", IV_MAX is 0x%"UVxf"\n", SvNVX(sv), U_V(SvNVX(sv)), (UV)IV_MAX);
2206 }
2207 } else
2208 sv_2iuv_non_preserve (sv, numtype);
2209#endif /* NV_PRESERVES_UV */
2210 }
f7bbb42a 2211 }
ff68c719 2212 }
2213 else {
d008e5eb 2214 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2215 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1d7c1841 2216 report_uninit();
c6ee37c5 2217 }
25da4f38
IZ
2218 if (SvTYPE(sv) < SVt_IV)
2219 /* Typically the caller expects that sv_any is not NULL now. */
2220 sv_upgrade(sv, SVt_IV);
ff68c719 2221 return 0;
2222 }
25da4f38 2223
1d7c1841
GS
2224 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2225 PTR2UV(sv),SvUVX(sv)));
25da4f38 2226 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 2227}
2228
65202027 2229NV
864dbfa3 2230Perl_sv_2nv(pTHX_ register SV *sv)
79072805
LW
2231{
2232 if (!sv)
2233 return 0.0;
8990e307 2234 if (SvGMAGICAL(sv)) {
463ee0b2
LW
2235 mg_get(sv);
2236 if (SvNOKp(sv))
2237 return SvNVX(sv);
a0d0e21e 2238 if (SvPOKp(sv) && SvLEN(sv)) {
599cee73 2239 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 2240 not_a_number(sv);
097ee67d 2241 return Atof(SvPVX(sv));
a0d0e21e 2242 }
25da4f38 2243 if (SvIOKp(sv)) {
1c846c1f 2244 if (SvIsUV(sv))
65202027 2245 return (NV)SvUVX(sv);
25da4f38 2246 else
65202027 2247 return (NV)SvIVX(sv);
25da4f38 2248 }
16d20bd9 2249 if (!SvROK(sv)) {
d008e5eb 2250 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2251 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1d7c1841 2252 report_uninit();
c6ee37c5 2253 }
16d20bd9
AD
2254 return 0;
2255 }
463ee0b2 2256 }
ed6116ce 2257 if (SvTHINKFIRST(sv)) {
a0d0e21e 2258 if (SvROK(sv)) {
a0d0e21e 2259 SV* tmpstr;
1554e226
DC
2260 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
2261 (SvRV(tmpstr) != SvRV(sv)))
9e7bc3e8 2262 return SvNV(tmpstr);
56431972 2263 return PTR2NV(SvRV(sv));
a0d0e21e 2264 }
8a818333
NIS
2265 if (SvREADONLY(sv) && SvFAKE(sv)) {
2266 sv_force_normal(sv);
2267 }
0336b60e 2268 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 2269 if (ckWARN(WARN_UNINITIALIZED))
1d7c1841 2270 report_uninit();
ed6116ce
LW
2271 return 0.0;
2272 }
79072805
LW
2273 }
2274 if (SvTYPE(sv) < SVt_NV) {
463ee0b2
LW
2275 if (SvTYPE(sv) == SVt_IV)
2276 sv_upgrade(sv, SVt_PVNV);
2277 else
2278 sv_upgrade(sv, SVt_NV);
572bbb43 2279#if defined(USE_LONG_DOUBLE)
097ee67d 2280 DEBUG_c({
f93f4e46 2281 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2282 PerlIO_printf(Perl_debug_log,
2283 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2284 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2285 RESTORE_NUMERIC_LOCAL();
2286 });
65202027 2287#else
572bbb43 2288 DEBUG_c({
f93f4e46 2289 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2290 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%g)\n",
2291 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2292 RESTORE_NUMERIC_LOCAL();
2293 });
572bbb43 2294#endif
79072805
LW
2295 }
2296 else if (SvTYPE(sv) < SVt_PVNV)
2297 sv_upgrade(sv, SVt_PVNV);
748a9306
LW
2298 if (SvIOKp(sv) &&
2299 (!SvPOKp(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
93a17b20 2300 {
65202027 2301 SvNVX(sv) = SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv);
28e5dec8
JH
2302#ifdef NV_PRESERVES_UV
2303 SvNOK_on(sv);
2304#else
2305 /* Only set the public NV OK flag if this NV preserves the IV */
2306 /* Check it's not 0xFFFFFFFFFFFFFFFF */
2307 if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2308 : (SvIVX(sv) == I_V(SvNVX(sv))))
2309 SvNOK_on(sv);
2310 else
2311 SvNOKp_on(sv);
2312#endif
93a17b20 2313 }
748a9306 2314 else if (SvPOKp(sv) && SvLEN(sv)) {
599cee73 2315 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 2316 not_a_number(sv);
097ee67d 2317 SvNVX(sv) = Atof(SvPVX(sv));
28e5dec8
JH
2318#ifdef NV_PRESERVES_UV
2319 SvNOK_on(sv);
2320#else
2321 /* Only set the public NV OK flag if this NV preserves the value in
2322 the PV at least as well as an IV/UV would.
2323 Not sure how to do this 100% reliably. */
2324 /* if that shift count is out of range then Configure's test is
2325 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2326 UV_BITS */
2327 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2328 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv)))
2329 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
2330 else if (SvNVX(sv) < (NV)IV_MIN || SvNVX(sv) > (NV)UV_MAX) {
2331 /* Definitely too large/small to fit in an integer, so no loss
2332 of precision going to integer in the future via NV */
2333 SvNOK_on(sv);
2334 } else {
2335 /* Is it something we can run through strtol etc (ie no
2336 trailing exponent part)? */
2337 int numtype = looks_like_number(sv);
2338 /* XXX probably should cache this if called above */
2339
2340 if (!(numtype &
2341 (IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_TO_INT_BY_STRTOL))) {
2342 /* Can't use strtol etc to convert this string, so don't try */
2343 SvNOK_on(sv);
2344 } else
2345 sv_2inuv_non_preserve (sv, numtype);
2346 }
2347#endif /* NV_PRESERVES_UV */
93a17b20 2348 }
79072805 2349 else {
599cee73 2350 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1d7c1841 2351 report_uninit();
25da4f38
IZ
2352 if (SvTYPE(sv) < SVt_NV)
2353 /* Typically the caller expects that sv_any is not NULL now. */
28e5dec8
JH
2354 /* XXX Ilya implies that this is a bug in callers that assume this
2355 and ideally should be fixed. */
25da4f38 2356 sv_upgrade(sv, SVt_NV);
a0d0e21e 2357 return 0.0;
79072805 2358 }
572bbb43 2359#if defined(USE_LONG_DOUBLE)
097ee67d 2360 DEBUG_c({
f93f4e46 2361 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2362 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2363 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2364 RESTORE_NUMERIC_LOCAL();
2365 });
65202027 2366#else
572bbb43 2367 DEBUG_c({
f93f4e46 2368 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2369 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%g)\n",
2370 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2371 RESTORE_NUMERIC_LOCAL();
2372 });
572bbb43 2373#endif
463ee0b2 2374 return SvNVX(sv);
79072805
LW
2375}
2376
76e3520e 2377STATIC IV
cea2e8a9 2378S_asIV(pTHX_ SV *sv)
36477c24 2379{
2380 I32 numtype = looks_like_number(sv);
65202027 2381 NV d;
36477c24 2382
25da4f38 2383 if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
cf2093f6 2384 return Atol(SvPVX(sv));
d008e5eb 2385 if (!numtype) {
d008e5eb
GS
2386 if (ckWARN(WARN_NUMERIC))
2387 not_a_number(sv);
2388 }
097ee67d 2389 d = Atof(SvPVX(sv));
25da4f38 2390 return I_V(d);
36477c24 2391}
2392
76e3520e 2393STATIC UV
cea2e8a9 2394S_asUV(pTHX_ SV *sv)
36477c24 2395{
2396 I32 numtype = looks_like_number(sv);
2397
84902520 2398#ifdef HAS_STRTOUL
25da4f38 2399 if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
cf2093f6 2400 return Strtoul(SvPVX(sv), Null(char**), 10);
84902520 2401#endif
d008e5eb 2402 if (!numtype) {
d008e5eb
GS
2403 if (ckWARN(WARN_NUMERIC))
2404 not_a_number(sv);
2405 }
097ee67d 2406 return U_V(Atof(SvPVX(sv)));
36477c24 2407}
2408
25da4f38
IZ
2409/*
2410 * Returns a combination of (advisory only - can get false negatives)
28e5dec8
JH
2411 * IS_NUMBER_TO_INT_BY_ATOL, IS_NUMBER_TO_INT_BY_ATOF
2412 * IS_NUMBER_LONGER_THAN_IV_MAX, IS_NUMBER_AS_LONG_AS_IV_MAX
2413 * IS_NUMBER_NOT_INT, IS_NUMBER_NEG, IS_NUMBER_INFINITY
25da4f38
IZ
2414 * 0 if does not look like number.
2415 *
28e5dec8
JH
2416 * (atol and strtol stop when they hit a decimal point. strtol will return
2417 * LONG_MAX and LONG_MIN when given out of range values. ANSI says they should
2418 * do this, and vendors have had 11 years to get it right.
2419 * However, will try to make it still work with only atol
d460ef45 2420 *
28e5dec8
JH
2421 * IS_NUMBER_TO_INT_BY_ATOL 123456789 or 123456789.3 definitely < IV_MAX
2422 * IS_NUMBER_TO_INT_BY_STRTOL 123456789 or 123456789.3 if digits = IV_MAX
2423 * IS_NUMBER_TO_INT_BY_ATOF 123456789e0 or >> IV_MAX
2424 * IS_NUMBER_LONGER_THAN_IV_MAX lots of digits, don't bother with atol
2425 * IS_NUMBER_AS_LONG_AS_IV_MAX atol might hit LONG_MAX, might not.
2426 * IS_NUMBER_NOT_INT saw "." or "e"
2427 * IS_NUMBER_NEG
300aed98 2428 * IS_NUMBER_INFINITY
25da4f38
IZ
2429 */
2430
954c1994
GS
2431/*
2432=for apidoc looks_like_number
2433
2434Test if an the content of an SV looks like a number (or is a
28e5dec8
JH
2435number). C<Inf> and C<Infinity> are treated as numbers (so will not
2436issue a non-numeric warning), even if your atof() doesn't grok them.
954c1994
GS
2437
2438=cut
2439*/
2440
36477c24 2441I32
864dbfa3 2442Perl_looks_like_number(pTHX_ SV *sv)
36477c24 2443{
2444 register char *s;
2445 register char *send;
2446 register char *sbegin;
25da4f38
IZ
2447 register char *nbegin;
2448 I32 numtype = 0;
300aed98 2449 I32 sawinf = 0;
36477c24 2450 STRLEN len;
2451
2452 if (SvPOK(sv)) {
1c846c1f 2453 sbegin = SvPVX(sv);
36477c24 2454 len = SvCUR(sv);
2455 }
2456 else if (SvPOKp(sv))
2457 sbegin = SvPV(sv, len);
2458 else
2459 return 1;
2460 send = sbegin + len;
2461
2462 s = sbegin;
2463 while (isSPACE(*s))
2464 s++;
25da4f38
IZ
2465 if (*s == '-') {
2466 s++;
2467 numtype = IS_NUMBER_NEG;
2468 }
2469 else if (*s == '+')
36477c24 2470 s++;
ff0cee69 2471
25da4f38
IZ
2472 nbegin = s;
2473 /*
d460ef45 2474 * we return IS_NUMBER_TO_INT_BY_ATOL if the number can converted to
28e5dec8
JH
2475 * integer with atol() without overflow, IS_NUMBER_TO_INT_BY_STRTOL if
2476 * possibly slightly larger than max int, IS_NUMBER_TO_INT_BY_ATOF if you
2477 * will need (int)atof().
25da4f38
IZ
2478 */
2479
300aed98 2480 /* next must be digit or the radix separator or beginning of infinity */
ff0cee69 2481 if (isDIGIT(*s)) {
2482 do {
2483 s++;
2484 } while (isDIGIT(*s));
25da4f38 2485
28e5dec8
JH
2486 /* Aaargh. long long really is irritating.
2487 In the gospel according to ANSI 1989, it is an axiom that "long"
2488 is the longest integer type, and that if you don't know how long
2489 something is you can cast it to long, and nothing will be lost
2490 (except possibly speed of execution if long is slower than the
2491 type is was).
2492 Now, one can't be sure if the old rules apply, or long long
2493 (or some other newfangled thing) is actually longer than the
2494 (formerly) longest thing.
2495 */
2496 /* This lot will work for 64 bit *as long as* either
2497 either long is 64 bit
2498 or we can find both strtol/strtoq and strtoul/strtouq
2499 If not, we really should refuse to let the user use 64 bit IVs
2500 By "64 bit" I really mean IVs that don't get preserved by NVs
2501 It also should work for 128 bit IVs. Can any lend me a machine to
2502 test this?
2503 */
2504 if (s - nbegin > TYPE_DIGITS(UV)) /* Cannot cache ato[ul]() */
2505 numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_LONGER_THAN_IV_MAX;
2506 else if (s - nbegin < BIT_DIGITS(((sizeof (IV)>sizeof (long))
2507 ? sizeof(long) : sizeof (IV))*8-1))
f7bbb42a 2508 numtype |= IS_NUMBER_TO_INT_BY_ATOL;
28e5dec8
JH
2509 else
2510 /* Can't be sure either way. (For 64 bit UV, 63 bit IV is 1 decimal
2511 digit less (IV_MAX= 9223372036854775807,
2512 UV_MAX= 18446744073709551615) so be cautious */
2513 numtype |= IS_NUMBER_TO_INT_BY_STRTOL | IS_NUMBER_AS_LONG_AS_IV_MAX;
25da4f38 2514
097ee67d 2515 if (*s == '.'
1c846c1f 2516#ifdef USE_LOCALE_NUMERIC
097ee67d
JH
2517 || IS_NUMERIC_RADIX(*s)
2518#endif
2519 ) {
ff0cee69 2520 s++;
28e5dec8 2521 numtype |= IS_NUMBER_NOT_INT;
097ee67d 2522 while (isDIGIT(*s)) /* optional digits after the radix */
ff0cee69 2523 s++;
2524 }
36477c24 2525 }
097ee67d 2526 else if (*s == '.'
1c846c1f 2527#ifdef USE_LOCALE_NUMERIC
097ee67d
JH
2528 || IS_NUMERIC_RADIX(*s)
2529#endif
2530 ) {
ff0cee69 2531 s++;
28e5dec8 2532 numtype |= IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_INT;
097ee67d 2533 /* no digits before the radix means we need digits after it */
ff0cee69 2534 if (isDIGIT(*s)) {
2535 do {
2536 s++;
2537 } while (isDIGIT(*s));
2538 }
2539 else
2540 return 0;
2541 }
300aed98
JH
2542 else if (*s == 'I' || *s == 'i') {
2543 s++; if (*s != 'N' && *s != 'n') return 0;
2544 s++; if (*s != 'F' && *s != 'f') return 0;
2545 s++; if (*s == 'I' || *s == 'i') {
2546 s++; if (*s != 'N' && *s != 'n') return 0;
2547 s++; if (*s != 'I' && *s != 'i') return 0;
2548 s++; if (*s != 'T' && *s != 't') return 0;
2549 s++; if (*s != 'Y' && *s != 'y') return 0;
99938567 2550 s++;
300aed98
JH
2551 }
2552 sawinf = 1;
2553 }
ff0cee69 2554 else
2555 return 0;
2556
300aed98 2557 if (sawinf)
28e5dec8
JH
2558 numtype = (numtype & IS_NUMBER_NEG) /* Keep track of sign */
2559 | IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
300aed98
JH
2560 else {
2561 /* we can have an optional exponent part */
2562 if (*s == 'e' || *s == 'E') {
28e5dec8
JH
2563 numtype &= IS_NUMBER_NEG;
2564 numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_INT;
36477c24 2565 s++;
300aed98
JH
2566 if (*s == '+' || *s == '-')
2567 s++;
2568 if (isDIGIT(*s)) {
2569 do {
2570 s++;
2571 } while (isDIGIT(*s));
2572 }
2573 else
2574 return 0;
2575 }
36477c24 2576 }
2577 while (isSPACE(*s))
2578 s++;
80f3f388 2579 if (s >= send)
36477c24 2580 return numtype;
2581 if (len == 10 && memEQ(sbegin, "0 but true", 10))
25da4f38 2582 return IS_NUMBER_TO_INT_BY_ATOL;
36477c24 2583 return 0;
2584}
2585
79072805 2586char *
864dbfa3 2587Perl_sv_2pv_nolen(pTHX_ register SV *sv)
1fa8b10d
JD
2588{
2589 STRLEN n_a;
2590 return sv_2pv(sv, &n_a);
2591}
2592
25da4f38 2593/* We assume that buf is at least TYPE_CHARS(UV) long. */
864dbfa3 2594static char *
25da4f38
IZ
2595uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
2596{
25da4f38
IZ
2597 char *ptr = buf + TYPE_CHARS(UV);
2598 char *ebuf = ptr;
2599 int sign;
25da4f38
IZ
2600
2601 if (is_uv)
2602 sign = 0;
2603 else if (iv >= 0) {
2604 uv = iv;
2605 sign = 0;
2606 } else {
2607 uv = -iv;
2608 sign = 1;
2609 }
2610 do {
2611 *--ptr = '0' + (uv % 10);
2612 } while (uv /= 10);
2613 if (sign)
2614 *--ptr = '-';
2615 *peob = ebuf;
2616 return ptr;
2617}
2618
1fa8b10d 2619char *
864dbfa3 2620Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
79072805
LW
2621{
2622 register char *s;
2623 int olderrno;
46fc3d4c 2624 SV *tsv;
25da4f38
IZ
2625 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
2626 char *tmpbuf = tbuf;
79072805 2627
463ee0b2
LW
2628 if (!sv) {
2629 *lp = 0;
2630 return "";
2631 }
8990e307 2632 if (SvGMAGICAL(sv)) {
463ee0b2
LW
2633 mg_get(sv);
2634 if (SvPOKp(sv)) {
2635 *lp = SvCUR(sv);
2636 return SvPVX(sv);
2637 }
cf2093f6 2638 if (SvIOKp(sv)) {
1c846c1f 2639 if (SvIsUV(sv))
57def98f 2640 (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
cf2093f6 2641 else
57def98f 2642 (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
46fc3d4c 2643 tsv = Nullsv;
a0d0e21e 2644 goto tokensave;
463ee0b2
LW
2645 }
2646 if (SvNOKp(sv)) {
2d4389e4 2647 Gconvert(SvNVX(sv), NV_DIG, 0, tmpbuf);
46fc3d4c 2648 tsv = Nullsv;
a0d0e21e 2649 goto tokensave;
463ee0b2 2650 }
16d20bd9 2651 if (!SvROK(sv)) {
d008e5eb 2652 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
d008e5eb 2653 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1d7c1841 2654 report_uninit();
c6ee37c5 2655 }
16d20bd9
AD
2656 *lp = 0;
2657 return "";
2658 }
463ee0b2 2659 }
ed6116ce
LW
2660 if (SvTHINKFIRST(sv)) {
2661 if (SvROK(sv)) {
a0d0e21e 2662 SV* tmpstr;
1554e226
DC
2663 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)) &&
2664 (SvRV(tmpstr) != SvRV(sv)))
9e7bc3e8 2665 return SvPV(tmpstr,*lp);
ed6116ce
LW
2666 sv = (SV*)SvRV(sv);
2667 if (!sv)
2668 s = "NULLREF";
2669 else {
f9277f47
IZ
2670 MAGIC *mg;
2671
ed6116ce 2672 switch (SvTYPE(sv)) {
f9277f47
IZ
2673 case SVt_PVMG:
2674 if ( ((SvFLAGS(sv) &
1c846c1f 2675 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
3149a8e4 2676 == (SVs_OBJECT|SVs_RMG))
57668c4d 2677 && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp")
f9277f47 2678 && (mg = mg_find(sv, 'r'))) {
2cd61cdb 2679 regexp *re = (regexp *)mg->mg_obj;
1bd3ad17 2680
2cd61cdb 2681 if (!mg->mg_ptr) {
8782bef2
GB
2682 char *fptr = "msix";
2683 char reflags[6];
2684 char ch;
2685 int left = 0;
2686 int right = 4;
2687 U16 reganch = (re->reganch & PMf_COMPILETIME) >> 12;
2688
155aba94 2689 while((ch = *fptr++)) {
8782bef2
GB
2690 if(reganch & 1) {
2691 reflags[left++] = ch;
2692 }
2693 else {
2694 reflags[right--] = ch;
2695 }
2696 reganch >>= 1;
2697 }
2698 if(left != 4) {
2699 reflags[left] = '-';
2700 left = 5;
2701 }
2702
2703 mg->mg_len = re->prelen + 4 + left;
2704 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
2705 Copy("(?", mg->mg_ptr, 2, char);
2706 Copy(reflags, mg->mg_ptr+2, left, char);
2707 Copy(":", mg->mg_ptr+left+2, 1, char);
2708 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
1bd3ad17
IZ
2709 mg->mg_ptr[mg->mg_len - 1] = ')';
2710 mg->mg_ptr[mg->mg_len] = 0;
2711 }
3280af22 2712 PL_reginterp_cnt += re->program[0].next_off;
1bd3ad17
IZ
2713 *lp = mg->mg_len;
2714 return mg->mg_ptr;
f9277f47
IZ
2715 }
2716 /* Fall through */
ed6116ce
LW
2717 case SVt_NULL:
2718 case SVt_IV:
2719 case SVt_NV:
2720 case SVt_RV:
2721 case SVt_PV:
2722 case SVt_PVIV:
2723 case SVt_PVNV:
81689caa
HS
2724 case SVt_PVBM: if (SvROK(sv))
2725 s = "REF";
2726 else
2727 s = "SCALAR"; break;
ed6116ce
LW
2728 case SVt_PVLV: s = "LVALUE"; break;
2729 case SVt_PVAV: s = "ARRAY"; break;
2730 case SVt_PVHV: s = "HASH"; break;
2731 case SVt_PVCV: s = "CODE"; break;
2732 case SVt_PVGV: s = "GLOB"; break;
1d2dff63 2733 case SVt_PVFM: s = "FORMAT"; break;
36477c24 2734 case SVt_PVIO: s = "IO"; break;
ed6116ce
LW
2735 default: s = "UNKNOWN"; break;
2736 }
46fc3d4c 2737 tsv = NEWSV(0,0);
ed6116ce 2738 if (SvOBJECT(sv))
cea2e8a9 2739 Perl_sv_setpvf(aTHX_ tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
ed6116ce 2740 else
46fc3d4c 2741 sv_setpv(tsv, s);
57def98f 2742 Perl_sv_catpvf(aTHX_ tsv, "(0x%"UVxf")", PTR2UV(sv));
a0d0e21e 2743 goto tokensaveref;
463ee0b2 2744 }
ed6116ce
LW
2745 *lp = strlen(s);
2746 return s;
79072805 2747 }
0336b60e 2748 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2749 if (ckWARN(WARN_UNINITIALIZED))
1d7c1841 2750 report_uninit();
ed6116ce
LW
2751 *lp = 0;
2752 return "";
79072805 2753 }
79072805 2754 }
28e5dec8
JH
2755 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
2756 /* I'm assuming that if both IV and NV are equally valid then
2757 converting the IV is going to be more efficient */
2758 U32 isIOK = SvIOK(sv);
2759 U32 isUIOK = SvIsUV(sv);
2760 char buf[TYPE_CHARS(UV)];
2761 char *ebuf, *ptr;
2762
2763 if (SvTYPE(sv) < SVt_PVIV)
2764 sv_upgrade(sv, SVt_PVIV);
2765 if (isUIOK)
2766 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
2767 else
2768 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
2769 SvGROW(sv, ebuf - ptr + 1); /* inlined from sv_setpvn */
2770 Move(ptr,SvPVX(sv),ebuf - ptr,char);
2771 SvCUR_set(sv, ebuf - ptr);
2772 s = SvEND(sv);
2773 *s = '\0';
2774 if (isIOK)
2775 SvIOK_on(sv);
2776 else
2777 SvIOKp_on(sv);
2778 if (isUIOK)
2779 SvIsUV_on(sv);
2780 }
2781 else if (SvNOKp(sv)) {
79072805
LW
2782 if (SvTYPE(sv) < SVt_PVNV)
2783 sv_upgrade(sv, SVt_PVNV);
1c846c1f 2784 /* The +20 is pure guesswork. Configure test needed. --jhi */
59155cc0 2785 SvGROW(sv, NV_DIG + 20);
463ee0b2 2786 s = SvPVX(sv);
79072805 2787 olderrno = errno; /* some Xenix systems wipe out errno here */
79072805 2788#ifdef apollo
463ee0b2 2789 if (SvNVX(sv) == 0.0)
79072805
LW
2790 (void)strcpy(s,"0");
2791 else
2792#endif /*apollo*/
bbce6d69 2793 {
2d4389e4 2794 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 2795 }
79072805 2796 errno = olderrno;
a0d0e21e
LW
2797#ifdef FIXNEGATIVEZERO
2798 if (*s == '-' && s[1] == '0' && !s[2])
2799 strcpy(s,"0");
2800#endif
79072805
LW
2801 while (*s) s++;
2802#ifdef hcx
2803 if (s[-1] == '.')
46fc3d4c 2804 *--s = '\0';
79072805
LW
2805#endif
2806 }
79072805 2807 else {
0336b60e
IZ
2808 if (ckWARN(WARN_UNINITIALIZED)
2809 && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1d7c1841 2810 report_uninit();
a0d0e21e 2811 *lp = 0;
25da4f38
IZ
2812 if (SvTYPE(sv) < SVt_PV)
2813 /* Typically the caller expects that sv_any is not NULL now. */
2814 sv_upgrade(sv, SVt_PV);
a0d0e21e 2815 return "";
79072805 2816 }
463ee0b2
LW
2817 *lp = s - SvPVX(sv);
2818 SvCUR_set(sv, *lp);
79072805 2819 SvPOK_on(sv);
1d7c1841
GS
2820 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
2821 PTR2UV(sv),SvPVX(sv)));
463ee0b2 2822 return SvPVX(sv);
a0d0e21e
LW
2823
2824 tokensave:
2825 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
2826 /* Sneaky stuff here */
2827
2828 tokensaveref:
46fc3d4c 2829 if (!tsv)
96827780 2830 tsv = newSVpv(tmpbuf, 0);
46fc3d4c 2831 sv_2mortal(tsv);
2832 *lp = SvCUR(tsv);
2833 return SvPVX(tsv);
a0d0e21e
LW
2834 }
2835 else {
2836 STRLEN len;
46fc3d4c 2837 char *t;
2838
2839 if (tsv) {
2840 sv_2mortal(tsv);
2841 t = SvPVX(tsv);
2842 len = SvCUR(tsv);
2843 }
2844 else {
96827780
MB
2845 t = tmpbuf;
2846 len = strlen(tmpbuf);
46fc3d4c 2847 }
a0d0e21e 2848#ifdef FIXNEGATIVEZERO
46fc3d4c 2849 if (len == 2 && t[0] == '-' && t[1] == '0') {
2850 t = "0";
2851 len = 1;
2852 }
a0d0e21e
LW
2853#endif
2854 (void)SvUPGRADE(sv, SVt_PV);
46fc3d4c 2855 *lp = len;
a0d0e21e
LW
2856 s = SvGROW(sv, len + 1);
2857 SvCUR_set(sv, len);
46fc3d4c 2858 (void)strcpy(s, t);
6bf554b4 2859 SvPOKp_on(sv);
a0d0e21e
LW
2860 return s;
2861 }
463ee0b2
LW
2862}
2863
7340a771
GS
2864char *
2865Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
2866{
560a288e
GS
2867 STRLEN n_a;
2868 return sv_2pvbyte(sv, &n_a);
7340a771
GS
2869}
2870
2871char *
2872Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
2873{
2874 return sv_2pv(sv,lp);
2875}
2876
2877char *
2878Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
2879{
560a288e
GS
2880 STRLEN n_a;
2881 return sv_2pvutf8(sv, &n_a);
7340a771
GS
2882}
2883
2884char *
2885Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
2886{
560a288e 2887 sv_utf8_upgrade(sv);
7d59b7e4 2888 return SvPV(sv,*lp);
7340a771 2889}
1c846c1f 2890
463ee0b2
LW
2891/* This function is only called on magical items */
2892bool
864dbfa3 2893Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 2894{
8990e307 2895 if (SvGMAGICAL(sv))
463ee0b2
LW
2896 mg_get(sv);
2897
a0d0e21e
LW
2898 if (!SvOK(sv))
2899 return 0;
2900 if (SvROK(sv)) {
a0d0e21e 2901 SV* tmpsv;
1554e226
DC
2902 if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
2903 (SvRV(tmpsv) != SvRV(sv)))
9e7bc3e8 2904 return SvTRUE(tmpsv);
a0d0e21e
LW
2905 return SvRV(sv) != 0;
2906 }
463ee0b2 2907 if (SvPOKp(sv)) {
11343788
MB
2908 register XPV* Xpvtmp;
2909 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
2910 (*Xpvtmp->xpv_pv > '0' ||
2911 Xpvtmp->xpv_cur > 1 ||
2912 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
463ee0b2
LW
2913 return 1;
2914 else
2915 return 0;
2916 }
2917 else {
2918 if (SvIOKp(sv))
2919 return SvIVX(sv) != 0;
2920 else {
2921 if (SvNOKp(sv))
2922 return SvNVX(sv) != 0.0;
2923 else
2924 return FALSE;
2925 }
2926 }
79072805
LW
2927}
2928
c461cf8f
JH
2929/*
2930=for apidoc sv_utf8_upgrade
2931
2932Convert the PV of an SV to its UTF8-encoded form.
2933
2934=cut
2935*/
2936
560a288e
GS
2937void
2938Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
2939{
511c2ff0
NIS
2940 char *s, *t, *e;
2941 int hibit = 0;
560a288e 2942
0c981600 2943 if (!sv || !SvPOK(sv) || SvUTF8(sv))
560a288e
GS
2944 return;
2945
40826f67
JH
2946 /* This function could be much more efficient if we had a FLAG in SVs
2947 * to signal if there are any hibit chars in the PV.
511c2ff0 2948 * Given that there isn't make loop fast as possible
560a288e 2949 */
511c2ff0
NIS
2950 s = SvPVX(sv);
2951 e = SvEND(sv);
2952 t = s;
2953 while (t < e) {
fd400ab9 2954 if ((hibit = UTF8_IS_CONTINUED(*t++)))
8a818333 2955 break;
8a818333 2956 }
560a288e 2957
40826f67 2958 if (hibit) {
8a818333 2959 STRLEN len;
652088fc 2960
8a818333 2961 if (SvREADONLY(sv) && SvFAKE(sv)) {
8a818333
NIS
2962 sv_force_normal(sv);
2963 s = SvPVX(sv);
2964 }
2965 len = SvCUR(sv) + 1; /* Plus the \0 */
00df9076 2966 SvPVX(sv) = (char*)bytes_to_utf8((U8*)s, &len);
841d7a39 2967 SvCUR(sv) = len - 1;
511c2ff0
NIS
2968 if (SvLEN(sv) != 0)
2969 Safefree(s); /* No longer using what was there before. */
841d7a39 2970 SvLEN(sv) = len; /* No longer know the real size. */
560a288e
GS
2971 SvUTF8_on(sv);
2972 }
2973}
2974
c461cf8f
JH
2975/*
2976=for apidoc sv_utf8_downgrade
2977
2978Attempt to convert the PV of an SV from UTF8-encoded to byte encoding.
2979This may not be possible if the PV contains non-byte encoding characters;
2980if this is the case, either returns false or, if C<fail_ok> is not
2981true, croaks.
2982
2983=cut
2984*/
2985
560a288e
GS
2986bool
2987Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
2988{
2989 if (SvPOK(sv) && SvUTF8(sv)) {
fa301091 2990 if (SvCUR(sv)) {
652088fc
JH
2991 char *s;
2992 STRLEN len;
fa301091 2993
652088fc
JH
2994 if (SvREADONLY(sv) && SvFAKE(sv))
2995 sv_force_normal(sv);
2996 s = SvPV(sv, len);
2997 if (!utf8_to_bytes((U8*)s, &len)) {
fa301091
JH
2998 if (fail_ok)
2999 return FALSE;
3000 else {
3001 if (PL_op)
3002 Perl_croak(aTHX_ "Wide character in %s",
3003 PL_op_desc[PL_op->op_type]);
3004 else
3005 Perl_croak(aTHX_ "Wide character");
3006 }
4b3603a4 3007 }
fa301091 3008 SvCUR(sv) = len;
67e989fb 3009 }
9f9ab905 3010 SvUTF8_off(sv);
560a288e 3011 }
fa301091 3012
560a288e
GS
3013 return TRUE;
3014}
3015
c461cf8f
JH
3016/*
3017=for apidoc sv_utf8_encode
3018
3019Convert the PV of an SV to UTF8-encoded, but then turn off the C<SvUTF8>
1c846c1f 3020flag so that it looks like bytes again. Nothing calls this.
c461cf8f
JH
3021
3022=cut
3023*/
3024
560a288e
GS
3025void
3026Perl_sv_utf8_encode(pTHX_ register SV *sv)
3027{
3028 sv_utf8_upgrade(sv);
3029 SvUTF8_off(sv);
3030}
3031
3032bool
3033Perl_sv_utf8_decode(pTHX_ register SV *sv)
3034{
3035 if (SvPOK(sv)) {
3036 char *c;
511c2ff0 3037 char *e;
560a288e
GS
3038 bool has_utf = FALSE;
3039 if (!sv_utf8_downgrade(sv, TRUE))
3040 return FALSE;
3041
3042 /* it is actually just a matter of turning the utf8 flag on, but
3043 * we want to make sure everything inside is valid utf8 first.
3044 */
3045 c = SvPVX(sv);
00df9076 3046 if (!is_utf8_string((U8*)c, SvCUR(sv)+1))
67e989fb 3047 return FALSE;
511c2ff0
NIS
3048 e = SvEND(sv);
3049 while (c < e) {
fd400ab9 3050 if (UTF8_IS_CONTINUED(*c++)) {
67e989fb
JH
3051 SvUTF8_on(sv);
3052 break;
3053 }
560a288e 3054 }
560a288e
GS
3055 }
3056 return TRUE;
3057}
3058
3059
79072805 3060/* Note: sv_setsv() should not be called with a source string that needs
463ee0b2 3061 * to be reused, since it may destroy the source string if it is marked
79072805
LW
3062 * as temporary.
3063 */
3064
954c1994
GS
3065/*
3066=for apidoc sv_setsv
3067
3068Copies the contents of the source SV C<ssv> into the destination SV C<dsv>.
3069The source SV may be destroyed if it is mortal. Does not handle 'set'
3070magic. See the macro forms C<SvSetSV>, C<SvSetSV_nosteal> and
3071C<sv_setsv_mg>.
3072
3073=cut
3074*/
3075
79072805 3076void
864dbfa3 3077Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
79072805 3078{
8990e307
LW
3079 register U32 sflags;
3080 register int dtype;
3081 register int stype;
463ee0b2 3082
79072805
LW
3083 if (sstr == dstr)
3084 return;
2213622d 3085 SV_CHECK_THINKFIRST(dstr);
79072805 3086 if (!sstr)
3280af22 3087 sstr = &PL_sv_undef;
8990e307
LW
3088 stype = SvTYPE(sstr);
3089 dtype = SvTYPE(dstr);
79072805 3090
a0d0e21e 3091 SvAMAGIC_off(dstr);
9e7bc3e8 3092
463ee0b2 3093 /* There's a lot of redundancy below but we're going for speed here */
79072805 3094
8990e307 3095 switch (stype) {
79072805 3096 case SVt_NULL:
aece5585 3097 undef_sstr:
20408e3c
GS
3098 if (dtype != SVt_PVGV) {
3099 (void)SvOK_off(dstr);
3100 return;
3101 }
3102 break;
463ee0b2 3103 case SVt_IV:
aece5585
GA
3104 if (SvIOK(sstr)) {
3105 switch (dtype) {
3106 case SVt_NULL:
8990e307 3107 sv_upgrade(dstr, SVt_IV);
aece5585
GA
3108 break;
3109 case SVt_NV:
8990e307 3110 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
3111 break;
3112 case SVt_RV:
3113 case SVt_PV:
a0d0e21e 3114 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
3115 break;
3116 }
3117 (void)SvIOK_only(dstr);
3118 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
3119 if (SvIsUV(sstr))
3120 SvIsUV_on(dstr);
27c9684d
AP
3121 if (SvTAINTED(sstr))
3122 SvTAINT(dstr);
aece5585 3123 return;
8990e307 3124 }
aece5585
GA
3125 goto undef_sstr;
3126
463ee0b2 3127 case SVt_NV:
aece5585
GA
3128 if (SvNOK(sstr)) {
3129 switch (dtype) {
3130 case SVt_NULL:
3131 case SVt_IV:
8990e307 3132 sv_upgrade(dstr, SVt_NV);
aece5585
GA
3133 break;
3134 case SVt_RV:
3135 case SVt_PV:
3136 case SVt_PVIV:
a0d0e21e 3137 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
3138 break;
3139 }
3140 SvNVX(dstr) = SvNVX(sstr);
3141 (void)SvNOK_only(dstr);
27c9684d
AP
3142 if (SvTAINTED(sstr))
3143 SvTAINT(dstr);
aece5585 3144 return;
8990e307 3145 }
aece5585
GA
3146 goto undef_sstr;
3147
ed6116ce 3148 case SVt_RV:
8990e307 3149 if (dtype < SVt_RV)
ed6116ce 3150 sv_upgrade(dstr, SVt_RV);
c07a80fd 3151 else if (dtype == SVt_PVGV &&
3152 SvTYPE(SvRV(sstr)) == SVt_PVGV) {
3153 sstr = SvRV(sstr);
a5f75d66 3154 if (sstr == dstr) {
1d7c1841
GS
3155 if (GvIMPORTED(dstr) != GVf_IMPORTED
3156 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3157 {
a5f75d66 3158 GvIMPORTED_on(dstr);
1d7c1841 3159 }
a5f75d66
AD
3160 GvMULTI_on(dstr);
3161 return;
3162 }
c07a80fd 3163 goto glob_assign;
3164 }
ed6116ce 3165 break;
463ee0b2 3166 case SVt_PV:
fc36a67e 3167 case SVt_PVFM:
8990e307 3168 if (dtype < SVt_PV)
463ee0b2 3169 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
3170 break;
3171 case SVt_PVIV:
8990e307 3172 if (dtype < SVt_PVIV)
463ee0b2 3173 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
3174 break;
3175 case SVt_PVNV:
8990e307 3176 if (dtype < SVt_PVNV)
463ee0b2 3177 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 3178 break;
4633a7c4
LW
3179 case SVt_PVAV:
3180 case SVt_PVHV:
3181 case SVt_PVCV:
4633a7c4 3182 case SVt_PVIO:
533c011a 3183 if (PL_op)
cea2e8a9 3184 Perl_croak(aTHX_ "Bizarre copy of %s in %s", sv_reftype(sstr, 0),
22c35a8c 3185 PL_op_name[PL_op->op_type]);
4633a7c4 3186 else
cea2e8a9 3187 Perl_croak(aTHX_ "Bizarre copy of %s", sv_reftype(sstr, 0));
4633a7c4
LW
3188 break;
3189
79072805 3190 case SVt_PVGV:
8990e307 3191 if (dtype <= SVt_PVGV) {
c07a80fd 3192 glob_assign:
a5f75d66 3193 if (dtype != SVt_PVGV) {
a0d0e21e
LW
3194 char *name = GvNAME(sstr);
3195 STRLEN len = GvNAMELEN(sstr);
463ee0b2 3196 sv_upgrade(dstr, SVt_PVGV);
6662521e 3197 sv_magic(dstr, dstr, '*', Nullch, 0);
85aff577 3198 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
3199 GvNAME(dstr) = savepvn(name, len);
3200 GvNAMELEN(dstr) = len;
3201 SvFAKE_on(dstr); /* can coerce to non-glob */
3202 }
7bac28a0 3203 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
3204 else if (PL_curstackinfo->si_type == PERLSI_SORT
3205 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
cea2e8a9 3206 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
7bac28a0 3207 GvNAME(dstr));
a0d0e21e 3208 (void)SvOK_off(dstr);
a5f75d66 3209 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 3210 gp_free((GV*)dstr);
79072805 3211 GvGP(dstr) = gp_ref(GvGP(sstr));
27c9684d
AP
3212 if (SvTAINTED(sstr))
3213 SvTAINT(dstr);
1d7c1841
GS
3214 if (GvIMPORTED(dstr) != GVf_IMPORTED
3215 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3216 {
a5f75d66 3217 GvIMPORTED_on(dstr);
1d7c1841 3218 }
a5f75d66 3219 GvMULTI_on(dstr);
79072805
LW
3220 return;
3221 }
3222 /* FALL THROUGH */
3223
3224 default:
973f89ab
CS
3225 if (SvGMAGICAL(sstr)) {
3226 mg_get(sstr);
3227 if (SvTYPE(sstr) != stype) {
3228 stype = SvTYPE(sstr);
3229 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
3230 goto glob_assign;
3231 }
3232 }
ded42b9f 3233 if (stype == SVt_PVLV)
6fc92669 3234 (void)SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 3235 else
6fc92669 3236 (void)SvUPGRADE(dstr, stype);
79072805
LW
3237 }
3238
8990e307
LW
3239 sflags = SvFLAGS(sstr);
3240
3241 if (sflags & SVf_ROK) {
3242 if (dtype >= SVt_PV) {
3243 if (dtype == SVt_PVGV) {
3244 SV *sref = SvREFCNT_inc(SvRV(sstr));
3245 SV *dref = 0;
a5f75d66 3246 int intro = GvINTRO(dstr);
a0d0e21e
LW
3247
3248 if (intro) {
3249 GP *gp;
1d7c1841 3250 gp_free((GV*)dstr);
a5f75d66 3251 GvINTRO_off(dstr); /* one-shot flag */
a0d0e21e 3252 Newz(602,gp, 1, GP);
44a8e56a 3253 GvGP(dstr) = gp_ref(gp);
a0d0e21e 3254 GvSV(dstr) = NEWSV(72,0);
1d7c1841 3255 GvLINE(dstr) = CopLINE(PL_curcop);
1edc1566 3256 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 3257 }
a5f75d66 3258 GvMULTI_on(dstr);
8990e307
LW
3259 switch (SvTYPE(sref)) {
3260 case SVt_PVAV:
a0d0e21e
LW
3261 if (intro)
3262 SAVESPTR(GvAV(dstr));
3263 else
3264 dref = (SV*)GvAV(dstr);
8990e307 3265 GvAV(dstr) = (AV*)sref;
39bac7f7 3266 if (!GvIMPORTED_AV(dstr)
1d7c1841
GS
3267 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3268 {
a5f75d66 3269 GvIMPORTED_AV_on(dstr);
1d7c1841 3270 }
8990e307
LW
3271 break;
3272 case SVt_PVHV:
a0d0e21e
LW
3273 if (intro)
3274 SAVESPTR(GvHV(dstr));
3275 else
3276 dref = (SV*)GvHV(dstr);
8990e307 3277 GvHV(dstr) = (HV*)sref;
39bac7f7 3278 if (!GvIMPORTED_HV(dstr)
1d7c1841
GS
3279 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3280 {
a5f75d66 3281 GvIMPORTED_HV_on(dstr);
1d7c1841 3282 }
8990e307
LW
3283 break;
3284 case SVt_PVCV:
8ebc5c01 3285 if (intro) {
3286 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
3287 SvREFCNT_dec(GvCV(dstr));
3288 GvCV(dstr) = Nullcv;
68dc0745 3289 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 3290 PL_sub_generation++;
8ebc5c01 3291 }
a0d0e21e 3292 SAVESPTR(GvCV(dstr));
8ebc5c01 3293 }
68dc0745 3294 else
3295 dref = (SV*)GvCV(dstr);
3296 if (GvCV(dstr) != (CV*)sref) {
748a9306 3297 CV* cv = GvCV(dstr);
4633a7c4 3298 if (cv) {
68dc0745 3299 if (!GvCVGEN((GV*)dstr) &&
3300 (CvROOT(cv) || CvXSUB(cv)))
3301 {
beab0874 3302 SV *const_sv;
7bac28a0 3303 /* ahem, death to those who redefine
3304 * active sort subs */
3280af22
NIS
3305 if (PL_curstackinfo->si_type == PERLSI_SORT &&
3306 PL_sortcop == CvSTART(cv))
1c846c1f 3307 Perl_croak(aTHX_
7bac28a0 3308 "Can't redefine active sort subroutine %s",
3309 GvENAME((GV*)dstr));
beab0874
JT
3310 /* Redefining a sub - warning is mandatory if
3311 it was a const and its value changed. */
3312 if (ckWARN(WARN_REDEFINE)
3313 || (CvCONST(cv)
3314 && (!CvCONST((CV*)sref)
3315 || sv_cmp(cv_const_sv(cv),
3316 cv_const_sv((CV*)sref)))))
3317 {
3318 Perl_warner(aTHX_ WARN_REDEFINE,
3319 CvCONST(cv)
3320 ? "Constant subroutine %s redefined"
47deb5e7 3321 : "Subroutine %s redefined",
beab0874
JT
3322 GvENAME((GV*)dstr));
3323 }
9607fc9c 3324 }
3fe9a6f1 3325 cv_ckproto(cv, (GV*)dstr,
3326 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 3327 }
a5f75d66 3328 GvCV(dstr) = (CV*)sref;
7a4c00b4 3329 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 3330 GvASSUMECV_on(dstr);
3280af22 3331 PL_sub_generation++;
a5f75d66 3332 }
39bac7f7 3333 if (!GvIMPORTED_CV(dstr)
1d7c1841
GS
3334 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3335 {
a5f75d66 3336 GvIMPORTED_CV_on(dstr);
1d7c1841 3337 }
8990e307 3338 break;
91bba347
LW
3339 case SVt_PVIO:
3340 if (intro)
3341 SAVESPTR(GvIOp(dstr));
3342 else
3343 dref = (SV*)GvIOp(dstr);
3344 GvIOp(dstr) = (IO*)sref;
3345 break;
f4d13ee9
JH
3346 case SVt_PVFM:
3347 if (intro)
3348 SAVESPTR(GvFORM(dstr));
3349 else
3350 dref = (SV*)GvFORM(dstr);
3351 GvFORM(dstr) = (CV*)sref;
3352 break;
8990e307 3353 default:
a0d0e21e
LW
3354 if (intro)
3355 SAVESPTR(GvSV(dstr));
3356 else
3357 dref = (SV*)GvSV(dstr);
8990e307 3358 GvSV(dstr) = sref;
39bac7f7 3359 if (!GvIMPORTED_SV(dstr)
1d7c1841
GS
3360 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3361 {
a5f75d66 3362 GvIMPORTED_SV_on(dstr);
1d7c1841 3363 }
8990e307
LW
3364 break;
3365 }
3366 if (dref)
3367 SvREFCNT_dec(dref);
a0d0e21e
LW
3368 if (intro)
3369 SAVEFREESV(sref);
27c9684d
AP
3370 if (SvTAINTED(sstr))
3371 SvTAINT(dstr);
8990e307
LW
3372 return;
3373 }
a0d0e21e 3374 if (SvPVX(dstr)) {
760ac839 3375 (void)SvOOK_off(dstr); /* backoff */
50483b2c
JD
3376 if (SvLEN(dstr))
3377 Safefree(SvPVX(dstr));
a0d0e21e
LW
3378 SvLEN(dstr)=SvCUR(dstr)=0;
3379 }
8990e307 3380 }
a0d0e21e 3381 (void)SvOK_off(dstr);
8990e307 3382 SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
ed6116ce 3383 SvROK_on(dstr);
8990e307 3384 if (sflags & SVp_NOK) {
3332b3c1
JH
3385 SvNOKp_on(dstr);
3386 /* Only set the public OK flag if the source has public OK. */
3387 if (sflags & SVf_NOK)
3388 SvFLAGS(dstr) |= SVf_NOK;
ed6116ce
LW
3389 SvNVX(dstr) = SvNVX(sstr);
3390 }
8990e307 3391 if (sflags & SVp_IOK) {
3332b3c1
JH
3392 (void)SvIOKp_on(dstr);
3393 if (sflags & SVf_IOK)
3394 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 3395 if (sflags & SVf_IVisUV)
25da4f38 3396 SvIsUV_on(dstr);
3332b3c1 3397 SvIVX(dstr) = SvIVX(sstr);
ed6116ce 3398 }
a0d0e21e
LW
3399 if (SvAMAGIC(sstr)) {
3400 SvAMAGIC_on(dstr);
3401 }
ed6116ce 3402 }
8990e307 3403 else if (sflags & SVp_POK) {
79072805
LW
3404
3405 /*
3406 * Check to see if we can just swipe the string. If so, it's a
3407 * possible small lose on short strings, but a big win on long ones.
463ee0b2
LW
3408 * It might even be a win on short strings if SvPVX(dstr)
3409 * has to be allocated and SvPVX(sstr) has to be freed.
79072805
LW
3410 */
3411
ff68c719 3412 if (SvTEMP(sstr) && /* slated for free anyway? */
01b73108 3413 SvREFCNT(sstr) == 1 && /* and no other references to it? */
1c846c1f 3414 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
4c8f17b9
BH
3415 SvLEN(sstr) && /* and really is a string */
3416 !(PL_op && PL_op->op_type == OP_AASSIGN)) /* and won't be needed again, potentially */
a5f75d66 3417 {
adbc6bb1 3418 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
3419 if (SvOOK(dstr)) {
3420 SvFLAGS(dstr) &= ~SVf_OOK;
3421 Safefree(SvPVX(dstr) - SvIVX(dstr));
3422 }
50483b2c 3423 else if (SvLEN(dstr))
a5f75d66 3424 Safefree(SvPVX(dstr));
79072805 3425 }
a5f75d66 3426 (void)SvPOK_only(dstr);
463ee0b2 3427 SvPV_set(dstr, SvPVX(sstr));
79072805
LW
3428 SvLEN_set(dstr, SvLEN(sstr));
3429 SvCUR_set(dstr, SvCUR(sstr));
f4e86e0f 3430
79072805 3431 SvTEMP_off(dstr);
2b1c7e3e 3432 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
79072805
LW
3433 SvPV_set(sstr, Nullch);
3434 SvLEN_set(sstr, 0);
a5f75d66
AD
3435 SvCUR_set(sstr, 0);
3436 SvTEMP_off(sstr);
79072805
LW
3437 }
3438 else { /* have to copy actual string */
8990e307
LW
3439 STRLEN len = SvCUR(sstr);
3440
3441 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3442 Move(SvPVX(sstr),SvPVX(dstr),len,char);
3443 SvCUR_set(dstr, len);
3444 *SvEND(dstr) = '\0';
a0d0e21e 3445 (void)SvPOK_only(dstr);
79072805 3446 }
9aa983d2 3447 if (sflags & SVf_UTF8)
a7cb1f99 3448 SvUTF8_on(dstr);
79072805 3449 /*SUPPRESS 560*/
8990e307 3450 if (sflags & SVp_NOK) {
3332b3c1
JH
3451 SvNOKp_on(dstr);
3452 if (sflags & SVf_NOK)
3453 SvFLAGS(dstr) |= SVf_NOK;
463ee0b2 3454 SvNVX(dstr) = SvNVX(sstr);
79072805 3455 }
8990e307 3456 if (sflags & SVp_IOK) {
3332b3c1
JH
3457 (void)SvIOKp_on(dstr);
3458 if (sflags & SVf_IOK)
3459 SvFLAGS(dstr) |= SVf_IOK;
2b1c7e3e 3460 if (sflags & SVf_IVisUV)
25da4f38 3461 SvIsUV_on(dstr);
463ee0b2 3462 SvIVX(dstr) = SvIVX(sstr);
79072805
LW
3463 }
3464 }
8990e307 3465 else if (sflags & SVp_IOK) {
3332b3c1
JH
3466 if (sflags & SVf_IOK)
3467 (void)SvIOK_only(dstr);
3468 else {
3469 SvOK_off(dstr);
3470 SvIOKp_on(dstr);
3471 }
3472 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2b1c7e3e 3473 if (sflags & SVf_IVisUV)
25da4f38 3474 SvIsUV_on(dstr);
3332b3c1
JH
3475 SvIVX(dstr) = SvIVX(sstr);
3476 if (sflags & SVp_NOK) {
3477 if (sflags & SVf_NOK)
3478 (void)SvNOK_on(dstr);
3479 else
3480 (void)SvNOKp_on(dstr);
3481 SvNVX(dstr) = SvNVX(sstr);
3482 }
3483 }
3484 else if (sflags & SVp_NOK) {
3485 if (sflags & SVf_NOK)
3486 (void)SvNOK_only(dstr);
3487 else {
3488 SvOK_off(dstr);
3489 SvNOKp_on(dstr);
3490 }
3491 SvNVX(dstr) = SvNVX(sstr);
79072805
LW
3492 }
3493 else {
20408e3c 3494 if (dtype == SVt_PVGV) {
e476b1b5
GS
3495 if (ckWARN(WARN_MISC))
3496 Perl_warner(aTHX_ WARN_MISC, "Undefined value assigned to typeglob");
20408e3c
GS
3497 }
3498 else
3499 (void)SvOK_off(dstr);
a0d0e21e 3500 }
27c9684d
AP
3501 if (SvTAINTED(sstr))
3502 SvTAINT(dstr);
79072805
LW
3503}
3504
954c1994
GS
3505/*
3506=for apidoc sv_setsv_mg
3507
3508Like C<sv_setsv>, but also handles 'set' magic.
3509
3510=cut
3511*/
3512
79072805 3513void
864dbfa3 3514Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
3515{
3516 sv_setsv(dstr,sstr);
3517 SvSETMAGIC(dstr);
3518}
3519
954c1994
GS
3520/*
3521=for apidoc sv_setpvn
3522
3523Copies a string into an SV. The C<len> parameter indicates the number of
3524bytes to be copied. Does not handle 'set' magic. See C<sv_setpvn_mg>.
3525
3526=cut
3527*/
3528
ef50df4b 3529void
864dbfa3 3530Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 3531{
c6f8c383 3532 register char *dptr;
22c522df 3533
2213622d 3534 SV_CHECK_THINKFIRST(sv);
463ee0b2 3535 if (!ptr) {
a0d0e21e 3536 (void)SvOK_off(sv);
463ee0b2
LW
3537 return;
3538 }
22c522df
JH
3539 else {
3540 /* len is STRLEN which is unsigned, need to copy to signed */
3541 IV iv = len;
3542 assert(iv >= 0);
3543 }
6fc92669 3544 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 3545
79072805 3546 SvGROW(sv, len + 1);
c6f8c383
GA
3547 dptr = SvPVX(sv);
3548 Move(ptr,dptr,len,char);
3549 dptr[len] = '\0';
79072805 3550 SvCUR_set(sv, len);
1aa99e6b 3551 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3552 SvTAINT(sv);
79072805
LW
3553}
3554
954c1994
GS
3555/*
3556=for apidoc sv_setpvn_mg
3557
3558Like C<sv_setpvn>, but also handles 'set' magic.
3559
3560=cut
3561*/
3562
79072805 3563void
864dbfa3 3564Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
3565{
3566 sv_setpvn(sv,ptr,len);
3567 SvSETMAGIC(sv);
3568}
3569
954c1994
GS
3570/*
3571=for apidoc sv_setpv
3572
3573Copies a string into an SV. The string must be null-terminated. Does not
3574handle 'set' magic. See C<sv_setpv_mg>.
3575
3576=cut
3577*/
3578
ef50df4b 3579void
864dbfa3 3580Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
3581{
3582 register STRLEN len;
3583
2213622d 3584 SV_CHECK_THINKFIRST(sv);
463ee0b2 3585 if (!ptr) {
a0d0e21e 3586 (void)SvOK_off(sv);
463ee0b2
LW
3587 return;
3588 }
79072805 3589 len = strlen(ptr);
6fc92669 3590 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 3591
79072805 3592 SvGROW(sv, len + 1);
463ee0b2 3593 Move(ptr,SvPVX(sv),len+1,char);
79072805 3594 SvCUR_set(sv, len);
1aa99e6b 3595 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
3596 SvTAINT(sv);
3597}
3598
954c1994
GS
3599/*
3600=for apidoc sv_setpv_mg
3601
3602Like C<sv_setpv>, but also handles 'set' magic.
3603
3604=cut
3605*/
3606
463ee0b2 3607void
864dbfa3 3608Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
3609{
3610 sv_setpv(sv,ptr);
3611 SvSETMAGIC(sv);
3612}
3613
954c1994
GS
3614/*
3615=for apidoc sv_usepvn
3616
3617Tells an SV to use C<ptr> to find its string value. Normally the string is
1c846c1f 3618stored inside the SV but sv_usepvn allows the SV to use an outside string.
954c1994
GS
3619The C<ptr> should point to memory that was allocated by C<malloc>. The
3620string length, C<len>, must be supplied. This function will realloc the
3621memory pointed to by C<ptr>, so that pointer should not be freed or used by
3622the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
3623See C<sv_usepvn_mg>.
3624
3625=cut
3626*/
3627
ef50df4b 3628void
864dbfa3 3629Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 3630{
2213622d 3631 SV_CHECK_THINKFIRST(sv);
c6f8c383 3632 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 3633 if (!ptr) {
a0d0e21e 3634 (void)SvOK_off(sv);
463ee0b2
LW
3635 return;
3636 }
a0ed51b3 3637 (void)SvOOK_off(sv);
50483b2c 3638 if (SvPVX(sv) && SvLEN(sv))
463ee0b2
LW
3639 Safefree(SvPVX(sv));
3640 Renew(ptr, len+1, char);
3641 SvPVX(sv) = ptr;
3642 SvCUR_set(sv, len);
3643 SvLEN_set(sv, len+1);
3644 *SvEND(sv) = '\0';
1aa99e6b 3645 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3646 SvTAINT(sv);
79072805
LW
3647}
3648
954c1994
GS
3649/*
3650=for apidoc sv_usepvn_mg
3651
3652Like C<sv_usepvn>, but also handles 'set' magic.
3653
3654=cut
3655*/
3656
ef50df4b 3657void
864dbfa3 3658Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 3659{
51c1089b 3660 sv_usepvn(sv,ptr,len);
ef50df4b
GS
3661 SvSETMAGIC(sv);
3662}
3663
6fc92669 3664void
840a7b70 3665Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 3666{
2213622d 3667 if (SvREADONLY(sv)) {
1c846c1f
NIS
3668 if (SvFAKE(sv)) {
3669 char *pvx = SvPVX(sv);
3670 STRLEN len = SvCUR(sv);
3671 U32 hash = SvUVX(sv);
3672 SvGROW(sv, len + 1);
3673 Move(pvx,SvPVX(sv),len,char);
3674 *SvEND(sv) = '\0';
3675 SvFAKE_off(sv);
3676 SvREADONLY_off(sv);
c3654f1a 3677 unsharepvn(pvx,SvUTF8(sv)?-len:len,hash);
1c846c1f
NIS
3678 }
3679 else if (PL_curcop != &PL_compiling)
cea2e8a9 3680 Perl_croak(aTHX_ PL_no_modify);
0f15f207 3681 }
2213622d 3682 if (SvROK(sv))
840a7b70 3683 sv_unref_flags(sv, flags);
6fc92669
GS
3684 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
3685 sv_unglob(sv);
0f15f207 3686}
1c846c1f 3687
840a7b70
IZ
3688void
3689Perl_sv_force_normal(pTHX_ register SV *sv)
3690{
3691 sv_force_normal_flags(sv, 0);
3692}
3693
954c1994
GS
3694/*
3695=for apidoc sv_chop
3696
1c846c1f 3697Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
3698SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
3699the string buffer. The C<ptr> becomes the first character of the adjusted
3700string.
3701
3702=cut
3703*/
3704
79072805 3705void
864dbfa3 3706Perl_sv_chop(pTHX_ register SV *sv, register char *ptr) /* like set but assuming ptr is in sv */
1c846c1f
NIS
3707
3708
79072805
LW
3709{
3710 register STRLEN delta;
3711
a0d0e21e 3712 if (!ptr || !SvPOKp(sv))
79072805 3713 return;
2213622d 3714 SV_CHECK_THINKFIRST(sv);
79072805
LW
3715 if (SvTYPE(sv) < SVt_PVIV)
3716 sv_upgrade(sv,SVt_PVIV);
3717
3718 if (!SvOOK(sv)) {
50483b2c
JD
3719 if (!SvLEN(sv)) { /* make copy of shared string */
3720 char *pvx = SvPVX(sv);
3721 STRLEN len = SvCUR(sv);
3722 SvGROW(sv, len + 1);
3723 Move(pvx,SvPVX(sv),len,char);
3724 *SvEND(sv) = '\0';
3725 }
463ee0b2 3726 SvIVX(sv) = 0;
79072805
LW
3727 SvFLAGS(sv) |= SVf_OOK;
3728 }
25da4f38 3729 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK|SVf_IVisUV);
463ee0b2 3730 delta = ptr - SvPVX(sv);
79072805
LW
3731 SvLEN(sv) -= delta;
3732 SvCUR(sv) -= delta;
463ee0b2
LW
3733 SvPVX(sv) += delta;
3734 SvIVX(sv) += delta;
79072805
LW
3735}
3736
954c1994
GS
3737/*
3738=for apidoc sv_catpvn
3739
3740Concatenates the string onto the end of the string which is in the SV. The
3741C<len> indicates number of bytes to copy. Handles 'get' magic, but not
3742'set' magic. See C<sv_catpvn_mg>.
3743
3744=cut
3745*/
3746
79072805 3747void
864dbfa3 3748Perl_sv_catpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 3749{
463ee0b2 3750 STRLEN tlen;
748a9306 3751 char *junk;
a0d0e21e 3752
748a9306 3753 junk = SvPV_force(sv, tlen);
463ee0b2 3754 SvGROW(sv, tlen + len + 1);
4633a7c4
LW
3755 if (ptr == junk)
3756 ptr = SvPVX(sv);
463ee0b2 3757 Move(ptr,SvPVX(sv)+tlen,len,char);
79072805
LW
3758 SvCUR(sv) += len;
3759 *SvEND(sv) = '\0';
d41ff1b8 3760 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3761 SvTAINT(sv);
79072805
LW
3762}
3763
954c1994
GS
3764/*
3765=for apidoc sv_catpvn_mg
3766
3767Like C<sv_catpvn>, but also handles 'set' magic.
3768
3769=cut
3770*/
3771
79072805 3772void
864dbfa3 3773Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
3774{
3775 sv_catpvn(sv,ptr,len);
3776 SvSETMAGIC(sv);
3777}
3778
954c1994
GS
3779/*
3780=for apidoc sv_catsv
3781
13e8c8e3
JH
3782Concatenates the string from SV C<ssv> onto the end of the string in
3783SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
3784not 'set' magic. See C<sv_catsv_mg>.
954c1994 3785
13e8c8e3 3786=cut */
954c1994 3787
ef50df4b 3788void
46199a12 3789Perl_sv_catsv(pTHX_ SV *dsv, register SV *ssv)
79072805 3790{
13e8c8e3
JH
3791 char *spv;
3792 STRLEN slen;
46199a12 3793 if (!ssv)
79072805 3794 return;
46199a12
JH
3795 if ((spv = SvPV(ssv, slen))) {
3796 bool dutf8 = DO_UTF8(dsv);
3797 bool sutf8 = DO_UTF8(ssv);
13e8c8e3
JH
3798
3799 if (dutf8 == sutf8)
46199a12 3800 sv_catpvn(dsv,spv,slen);
13e8c8e3
JH
3801 else {
3802 if (dutf8) {
46199a12
JH
3803 /* Not modifying source SV, so taking a temporary copy. */
3804 SV* csv = sv_2mortal(newSVsv(ssv));
13e8c8e3
JH
3805 char *cpv;
3806 STRLEN clen;
3807
46199a12
JH
3808 sv_utf8_upgrade(csv);
3809 cpv = SvPV(csv,clen);
3810 sv_catpvn(dsv,cpv,clen);
13e8c8e3
JH
3811 }
3812 else {
46199a12
JH
3813 sv_utf8_upgrade(dsv);
3814 sv_catpvn(dsv,spv,slen);
3815 SvUTF8_on(dsv); /* If dsv has no wide characters. */
13e8c8e3 3816 }
e84ff256 3817 }
560a288e 3818 }
79072805
LW
3819}
3820
954c1994
GS
3821/*
3822=for apidoc sv_catsv_mg
3823
3824Like C<sv_catsv>, but also handles 'set' magic.
3825
3826=cut
3827*/
3828
79072805 3829void
46199a12 3830Perl_sv_catsv_mg(pTHX_ SV *dsv, register SV *ssv)
ef50df4b 3831{
46199a12
JH
3832 sv_catsv(dsv,ssv);
3833 SvSETMAGIC(dsv);
ef50df4b
GS
3834}
3835
954c1994
GS
3836/*
3837=for apidoc sv_catpv
3838
3839Concatenates the string onto the end of the string which is in the SV.
3840Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
3841
3842=cut
3843*/
3844
ef50df4b 3845void
0c981600 3846Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
3847{
3848 register STRLEN len;
463ee0b2 3849 STRLEN tlen;
748a9306 3850 char *junk;
79072805 3851
0c981600 3852 if (!ptr)
79072805 3853 return;
748a9306 3854 junk = SvPV_force(sv, tlen);
0c981600 3855 len = strlen(ptr);
463ee0b2 3856 SvGROW(sv, tlen + len + 1);
0c981600
JH
3857 if (ptr == junk)
3858 ptr = SvPVX(sv);
3859 Move(ptr,SvPVX(sv)+tlen,len+1,char);
79072805 3860 SvCUR(sv) += len;
d41ff1b8 3861 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3862 SvTAINT(sv);
79072805
LW
3863}
3864
954c1994
GS
3865/*
3866=for apidoc sv_catpv_mg
3867
3868Like C<sv_catpv>, but also handles 'set' magic.
3869
3870=cut
3871*/
3872
ef50df4b 3873void
0c981600 3874Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 3875{
0c981600 3876 sv_catpv(sv,ptr);
ef50df4b
GS
3877 SvSETMAGIC(sv);
3878}
3879
79072805 3880SV *
864dbfa3 3881Perl_newSV(pTHX_ STRLEN len)
79072805
LW
3882{
3883 register SV *sv;
1c846c1f 3884
4561caa4 3885 new_SV(sv);
79072805
LW
3886 if (len) {
3887 sv_upgrade(sv, SVt_PV);
3888 SvGROW(sv, len + 1);
3889 }
3890 return sv;
3891}
3892
1edc1566 3893/* name is assumed to contain an SV* if (name && namelen == HEf_SVKEY) */
3894
954c1994
GS
3895/*
3896=for apidoc sv_magic
3897
3898Adds magic to an SV.
3899
3900=cut
3901*/
3902
79072805 3903void
864dbfa3 3904Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
79072805
LW
3905{
3906 MAGIC* mg;
1c846c1f 3907
0f15f207 3908 if (SvREADONLY(sv)) {
3280af22 3909 if (PL_curcop != &PL_compiling && !strchr("gBf", how))
cea2e8a9 3910 Perl_croak(aTHX_ PL_no_modify);
0f15f207 3911 }
4633a7c4 3912 if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
748a9306
LW
3913 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
3914 if (how == 't')
565764a8 3915 mg->mg_len |= 1;
463ee0b2 3916 return;
748a9306 3917 }
463ee0b2
LW
3918 }
3919 else {
c6f8c383 3920 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 3921 }
79072805
LW
3922 Newz(702,mg, 1, MAGIC);
3923 mg->mg_moremagic = SvMAGIC(sv);
463ee0b2 3924
79072805 3925 SvMAGIC(sv) = mg;
c277df42 3926 if (!obj || obj == sv || how == '#' || how == 'r')
8990e307 3927 mg->mg_obj = obj;
85e6fe83 3928 else {
8990e307 3929 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
3930 mg->mg_flags |= MGf_REFCOUNTED;
3931 }
79072805 3932 mg->mg_type = how;
565764a8 3933 mg->mg_len = namlen;
1edc1566 3934 if (name)
3935 if (namlen >= 0)
3936 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 3937 else if (namlen == HEf_SVKEY)
1edc1566 3938 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
1c846c1f 3939
79072805
LW
3940 switch (how) {
3941 case 0:
22c35a8c 3942 mg->mg_virtual = &PL_vtbl_sv;
79072805 3943 break;
a0d0e21e 3944 case 'A':
22c35a8c 3945 mg->mg_virtual = &PL_vtbl_amagic;
a0d0e21e
LW
3946 break;
3947 case 'a':
22c35a8c 3948 mg->mg_virtual = &PL_vtbl_amagicelem;
a0d0e21e
LW
3949 break;
3950 case 'c':
d460ef45 3951 mg->mg_virtual = &PL_vtbl_ovrld;
a0d0e21e 3952 break;
79072805 3953 case 'B':
22c35a8c 3954 mg->mg_virtual = &PL_vtbl_bm;
79072805 3955 break;
6cef1e77 3956 case 'D':
22c35a8c 3957 mg->mg_virtual = &PL_vtbl_regdata;
6cef1e77
IZ
3958 break;
3959 case 'd':
22c35a8c 3960 mg->mg_virtual = &PL_vtbl_regdatum;
6cef1e77 3961 break;
79072805 3962 case 'E':
22c35a8c 3963 mg->mg_virtual = &PL_vtbl_env;
79072805 3964 break;
55497cff 3965 case 'f':
22c35a8c 3966 mg->mg_virtual = &PL_vtbl_fm;
55497cff 3967 break;
79072805 3968 case 'e':
22c35a8c 3969 mg->mg_virtual = &PL_vtbl_envelem;
79072805 3970 break;
93a17b20 3971 case 'g':
22c35a8c 3972 mg->mg_virtual = &PL_vtbl_mglob;
93a17b20 3973 break;
463ee0b2 3974 case 'I':
22c35a8c 3975 mg->mg_virtual = &PL_vtbl_isa;
463ee0b2
LW
3976 break;
3977 case 'i':
22c35a8c 3978 mg->mg_virtual = &PL_vtbl_isaelem;
463ee0b2 3979 break;
16660edb 3980 case 'k':
22c35a8c 3981 mg->mg_virtual = &PL_vtbl_nkeys;
16660edb 3982 break;
79072805 3983 case 'L':
a0d0e21e 3984 SvRMAGICAL_on(sv);
93a17b20
LW
3985 mg->mg_virtual = 0;
3986 break;
3987 case 'l':
22c35a8c 3988 mg->mg_virtual = &PL_vtbl_dbline;
79072805 3989 break;
f93b4edd
MB
3990#ifdef USE_THREADS
3991 case 'm':
22c35a8c 3992 mg->mg_virtual = &PL_vtbl_mutex;
f93b4edd
MB
3993 break;
3994#endif /* USE_THREADS */
36477c24 3995#ifdef USE_LOCALE_COLLATE
bbce6d69 3996 case 'o':
22c35a8c 3997 mg->mg_virtual = &PL_vtbl_collxfrm;
bbce6d69 3998 break;
36477c24 3999#endif /* USE_LOCALE_COLLATE */
463ee0b2 4000 case 'P':
22c35a8c 4001 mg->mg_virtual = &PL_vtbl_pack;
463ee0b2
LW
4002 break;
4003 case 'p':
a0d0e21e 4004 case 'q':
22c35a8c 4005 mg->mg_virtual = &PL_vtbl_packelem;
463ee0b2 4006 break;
c277df42 4007 case 'r':
22c35a8c 4008 mg->mg_virtual = &PL_vtbl_regexp;
c277df42 4009 break;
79072805 4010 case 'S':
22c35a8c 4011 mg->mg_virtual = &PL_vtbl_sig;
79072805
LW
4012 break;
4013 case 's':
22c35a8c 4014 mg->mg_virtual = &PL_vtbl_sigelem;
79072805 4015 break;
463ee0b2 4016 case 't':
22c35a8c 4017 mg->mg_virtual = &PL_vtbl_taint;
565764a8 4018 mg->mg_len = 1;
463ee0b2 4019 break;
79072805 4020 case 'U':
22c35a8c 4021 mg->mg_virtual = &PL_vtbl_uvar;
79072805
LW
4022 break;
4023 case 'v':
22c35a8c 4024 mg->mg_virtual = &PL_vtbl_vec;
79072805
LW
4025 break;
4026 case 'x':
22c35a8c 4027 mg->mg_virtual = &PL_vtbl_substr;
79072805 4028 break;
5f05dabc 4029 case 'y':
22c35a8c 4030 mg->mg_virtual = &PL_vtbl_defelem;
5f05dabc 4031 break;
79072805 4032 case '*':
22c35a8c 4033 mg->mg_virtual = &PL_vtbl_glob;
79072805
LW
4034 break;
4035 case '#':
22c35a8c 4036 mg->mg_virtual = &PL_vtbl_arylen;
79072805 4037 break;
a0d0e21e 4038 case '.':
22c35a8c 4039 mg->mg_virtual = &PL_vtbl_pos;
a0d0e21e 4040 break;
810b8aa5
GS
4041 case '<':
4042 mg->mg_virtual = &PL_vtbl_backref;
4043 break;
4633a7c4
LW
4044 case '~': /* Reserved for use by extensions not perl internals. */
4045 /* Useful for attaching extension internal data to perl vars. */
4046 /* Note that multiple extensions may clash if magical scalars */
4047 /* etc holding private data from one are passed to another. */
4048 SvRMAGICAL_on(sv);
a0d0e21e 4049 break;
79072805 4050 default:
cea2e8a9 4051 Perl_croak(aTHX_ "Don't know how to handle magic of type '%c'", how);
463ee0b2 4052 }
8990e307
LW
4053 mg_magical(sv);
4054 if (SvGMAGICAL(sv))
4055 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
463ee0b2
LW
4056}
4057
c461cf8f
JH
4058/*
4059=for apidoc sv_unmagic
4060
4061Removes magic from an SV.
4062
4063=cut
4064*/
4065
463ee0b2 4066int
864dbfa3 4067Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
4068{
4069 MAGIC* mg;
4070 MAGIC** mgp;
91bba347 4071 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
4072 return 0;
4073 mgp = &SvMAGIC(sv);
4074 for (mg = *mgp; mg; mg = *mgp) {
4075 if (mg->mg_type == type) {
4076 MGVTBL* vtbl = mg->mg_virtual;
4077 *mgp = mg->mg_moremagic;
1d7c1841 4078 if (vtbl && vtbl->svt_free)
fc0dc3b3 4079 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
463ee0b2 4080 if (mg->mg_ptr && mg->mg_type != 'g')
565764a8 4081 if (mg->mg_len >= 0)
1edc1566 4082 Safefree(mg->mg_ptr);
565764a8 4083 else if (mg->mg_len == HEf_SVKEY)
1edc1566 4084 SvREFCNT_dec((SV*)mg->mg_ptr);
a0d0e21e
LW
4085 if (mg->mg_flags & MGf_REFCOUNTED)
4086 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
4087 Safefree(mg);
4088 }
4089 else
4090 mgp = &mg->mg_moremagic;
79072805 4091 }
91bba347 4092 if (!SvMAGIC(sv)) {
463ee0b2 4093 SvMAGICAL_off(sv);
8990e307 4094 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
4095 }
4096
4097 return 0;
79072805
LW
4098}
4099
c461cf8f
JH
4100/*
4101=for apidoc sv_rvweaken
4102
4103Weaken a reference.
4104
4105=cut
4106*/
4107
810b8aa5 4108SV *
864dbfa3 4109Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
4110{
4111 SV *tsv;
4112 if (!SvOK(sv)) /* let undefs pass */
4113 return sv;
4114 if (!SvROK(sv))
cea2e8a9 4115 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 4116 else if (SvWEAKREF(sv)) {
810b8aa5 4117 if (ckWARN(WARN_MISC))
cea2e8a9 4118 Perl_warner(aTHX_ WARN_MISC, "Reference is already weak");
810b8aa5
GS
4119 return sv;
4120 }
4121 tsv = SvRV(sv);
4122 sv_add_backref(tsv, sv);
4123 SvWEAKREF_on(sv);
1c846c1f 4124 SvREFCNT_dec(tsv);
810b8aa5
GS
4125 return sv;
4126}
4127
4128STATIC void
cea2e8a9 4129S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
4130{
4131 AV *av;
4132 MAGIC *mg;
4133 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, '<')))
4134 av = (AV*)mg->mg_obj;
4135 else {
4136 av = newAV();
4137 sv_magic(tsv, (SV*)av, '<', NULL, 0);
4138 SvREFCNT_dec(av); /* for sv_magic */
4139 }
4140 av_push(av,sv);
4141}
4142
1c846c1f 4143STATIC void
cea2e8a9 4144S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
4145{
4146 AV *av;
4147 SV **svp;
4148 I32 i;
4149 SV *tsv = SvRV(sv);
4150 MAGIC *mg;
4151 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, '<')))
cea2e8a9 4152 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
4153 av = (AV *)mg->mg_obj;
4154 svp = AvARRAY(av);
4155 i = AvFILLp(av);
4156 while (i >= 0) {
4157 if (svp[i] == sv) {
4158 svp[i] = &PL_sv_undef; /* XXX */
4159 }
4160 i--;
4161 }
4162}
4163
954c1994
GS
4164/*
4165=for apidoc sv_insert
4166
4167Inserts a string at the specified offset/length within the SV. Similar to
4168the Perl substr() function.
4169
4170=cut
4171*/
4172
79072805 4173void
864dbfa3 4174Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
79072805
LW
4175{
4176 register char *big;
4177 register char *mid;
4178 register char *midend;
4179 register char *bigend;
4180 register I32 i;
6ff81951 4181 STRLEN curlen;
1c846c1f 4182
79072805 4183
8990e307 4184 if (!bigstr)
cea2e8a9 4185 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 4186 SvPV_force(bigstr, curlen);
60fa28ff 4187 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
4188 if (offset + len > curlen) {
4189 SvGROW(bigstr, offset+len+1);
4190 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
4191 SvCUR_set(bigstr, offset+len);
4192 }
79072805 4193
69b47968 4194 SvTAINT(bigstr);
79072805
LW
4195 i = littlelen - len;
4196 if (i > 0) { /* string might grow */
a0d0e21e 4197 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
4198 mid = big + offset + len;
4199 midend = bigend = big + SvCUR(bigstr);
4200 bigend += i;
4201 *bigend = '\0';
4202 while (midend > mid) /* shove everything down */
4203 *--bigend = *--midend;
4204 Move(little,big+offset,littlelen,char);
4205 SvCUR(bigstr) += i;
4206 SvSETMAGIC(bigstr);
4207 return;
4208 }
4209 else if (i == 0) {
463ee0b2 4210 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
4211 SvSETMAGIC(bigstr);
4212 return;
4213 }
4214
463ee0b2 4215 big = SvPVX(bigstr);
79072805
LW
4216 mid = big + offset;
4217 midend = mid + len;
4218 bigend = big + SvCUR(bigstr);
4219
4220 if (midend > bigend)
cea2e8a9 4221 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
4222
4223 if (mid - big > bigend - midend) { /* faster to shorten from end */
4224 if (littlelen) {
4225 Move(little, mid, littlelen,char);
4226 mid += littlelen;
4227 }
4228 i = bigend - midend;
4229 if (i > 0) {
4230 Move(midend, mid, i,char);
4231 mid += i;
4232 }
4233 *mid = '\0';
4234 SvCUR_set(bigstr, mid - big);
4235 }
4236 /*SUPPRESS 560*/
155aba94 4237 else if ((i = mid - big)) { /* faster from front */
79072805
LW
4238 midend -= littlelen;
4239 mid = midend;
4240 sv_chop(bigstr,midend-i);
4241 big += i;
4242 while (i--)
4243 *--midend = *--big;
4244 if (littlelen)
4245 Move(little, mid, littlelen,char);
4246 }
4247 else if (littlelen) {
4248 midend -= littlelen;
4249 sv_chop(bigstr,midend);
4250 Move(little,midend,littlelen,char);
4251 }
4252 else {
4253 sv_chop(bigstr,midend);
4254 }
4255 SvSETMAGIC(bigstr);
4256}
4257
c461cf8f
JH
4258/*
4259=for apidoc sv_replace
4260
4261Make the first argument a copy of the second, then delete the original.
4262
4263=cut
4264*/
79072805
LW
4265
4266void
864dbfa3 4267Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805
LW
4268{
4269 U32 refcnt = SvREFCNT(sv);
2213622d 4270 SV_CHECK_THINKFIRST(sv);
0453d815
PM
4271 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
4272 Perl_warner(aTHX_ WARN_INTERNAL, "Reference miscount in sv_replace()");
93a17b20 4273 if (SvMAGICAL(sv)) {
a0d0e21e
LW
4274 if (SvMAGICAL(nsv))
4275 mg_free(nsv);
4276 else
4277 sv_upgrade(nsv, SVt_PVMG);
93a17b20 4278 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 4279 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
4280 SvMAGICAL_off(sv);
4281 SvMAGIC(sv) = 0;
4282 }
79072805
LW
4283 SvREFCNT(sv) = 0;
4284 sv_clear(sv);
477f5d66 4285 assert(!SvREFCNT(sv));
79072805
LW
4286 StructCopy(nsv,sv,SV);
4287 SvREFCNT(sv) = refcnt;
1edc1566 4288 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
463ee0b2 4289 del_SV(nsv);
79072805
LW
4290}
4291
c461cf8f
JH
4292/*
4293=for apidoc sv_clear
4294
4295Clear an SV, making it empty. Does not free the memory used by the SV
4296itself.
4297
4298=cut
4299*/
4300
79072805 4301void
864dbfa3 4302Perl_sv_clear(pTHX_ register SV *sv)
79072805 4303{
ec12f114 4304 HV* stash;
79072805
LW
4305 assert(sv);
4306 assert(SvREFCNT(sv) == 0);
4307
ed6116ce 4308 if (SvOBJECT(sv)) {
3280af22 4309 if (PL_defstash) { /* Still have a symbol table? */
4e35701f 4310 djSP;
32251b26 4311 CV* destructor;
837485b6 4312 SV tmpref;
a0d0e21e 4313
837485b6
GS
4314 Zero(&tmpref, 1, SV);
4315 sv_upgrade(&tmpref, SVt_RV);
4316 SvROK_on(&tmpref);
4317 SvREADONLY_on(&tmpref); /* DESTROY() could be naughty */
4318 SvREFCNT(&tmpref) = 1;
8ebc5c01 4319
d460ef45 4320 do {
4e8e7886 4321 stash = SvSTASH(sv);
32251b26 4322 destructor = StashHANDLER(stash,DESTROY);
4e8e7886
GS
4323 if (destructor) {
4324 ENTER;
e788e7d3 4325 PUSHSTACKi(PERLSI_DESTROY);
837485b6 4326 SvRV(&tmpref) = SvREFCNT_inc(sv);
4e8e7886
GS
4327 EXTEND(SP, 2);
4328 PUSHMARK(SP);
837485b6 4329 PUSHs(&tmpref);
4e8e7886 4330 PUTBACK;
32251b26 4331 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR);
4e8e7886 4332 SvREFCNT(sv)--;
d3acc0f7 4333 POPSTACK;
3095d977 4334 SPAGAIN;
4e8e7886
GS
4335 LEAVE;
4336 }
4337 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 4338
837485b6 4339 del_XRV(SvANY(&tmpref));
6f44e0a4
JP
4340
4341 if (SvREFCNT(sv)) {
4342 if (PL_in_clean_objs)
cea2e8a9 4343 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
6f44e0a4
JP
4344 HvNAME(stash));
4345 /* DESTROY gave object new lease on life */
4346 return;
4347 }
a0d0e21e 4348 }
4e8e7886 4349
a0d0e21e 4350 if (SvOBJECT(sv)) {
4e8e7886 4351 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
4352 SvOBJECT_off(sv); /* Curse the object. */
4353 if (SvTYPE(sv) != SVt_PVIO)
3280af22 4354 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 4355 }
463ee0b2 4356 }
c07a80fd 4357 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
a0d0e21e 4358 mg_free(sv);
ec12f114 4359 stash = NULL;
79072805 4360 switch (SvTYPE(sv)) {
8990e307 4361 case SVt_PVIO:
df0bd2f4
GS
4362 if (IoIFP(sv) &&
4363 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 4364 IoIFP(sv) != PerlIO_stdout() &&
4365 IoIFP(sv) != PerlIO_stderr())
93578b34 4366 {
f2b5be74 4367 io_close((IO*)sv, FALSE);
93578b34 4368 }
1d7c1841 4369 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 4370 PerlDir_close(IoDIRP(sv));
1d7c1841 4371 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
4372 Safefree(IoTOP_NAME(sv));
4373 Safefree(IoFMT_NAME(sv));
4374 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 4375 /* FALL THROUGH */
79072805 4376 case SVt_PVBM:
a0d0e21e 4377 goto freescalar;
79072805 4378 case SVt_PVCV:
748a9306 4379 case SVt_PVFM:
85e6fe83 4380 cv_undef((CV*)sv);
a0d0e21e 4381 goto freescalar;
79072805 4382 case SVt_PVHV:
85e6fe83 4383 hv_undef((HV*)sv);
a0d0e21e 4384 break;
79072805 4385 case SVt_PVAV:
85e6fe83 4386 av_undef((AV*)sv);
a0d0e21e 4387 break;
02270b4e
GS
4388 case SVt_PVLV:
4389 SvREFCNT_dec(LvTARG(sv));
4390 goto freescalar;
a0d0e21e 4391 case SVt_PVGV:
1edc1566 4392 gp_free((GV*)sv);
a0d0e21e 4393 Safefree(GvNAME(sv));
ec12f114
JPC
4394 /* cannot decrease stash refcount yet, as we might recursively delete
4395 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
4396 of stash until current sv is completely gone.
4397 -- JohnPC, 27 Mar 1998 */
4398 stash = GvSTASH(sv);
a0d0e21e 4399 /* FALL THROUGH */
79072805 4400 case SVt_PVMG:
79072805
LW
4401 case SVt_PVNV:
4402 case SVt_PVIV:
a0d0e21e
LW
4403 freescalar:
4404 (void)SvOOK_off(sv);
79072805
LW
4405 /* FALL THROUGH */
4406 case SVt_PV:
a0d0e21e 4407 case SVt_RV:
810b8aa5
GS
4408 if (SvROK(sv)) {
4409 if (SvWEAKREF(sv))
4410 sv_del_backref(sv);
4411 else
4412 SvREFCNT_dec(SvRV(sv));
4413 }
1edc1566 4414 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 4415 Safefree(SvPVX(sv));
1c846c1f 4416 else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
c3654f1a 4417 unsharepvn(SvPVX(sv),SvUTF8(sv)?-SvCUR(sv):SvCUR(sv),SvUVX(sv));
1c846c1f
NIS
4418 SvFAKE_off(sv);
4419 }
79072805 4420 break;
a0d0e21e 4421/*
79072805 4422 case SVt_NV:
79072805 4423 case SVt_IV:
79072805
LW
4424 case SVt_NULL:
4425 break;
a0d0e21e 4426*/
79072805
LW
4427 }
4428
4429 switch (SvTYPE(sv)) {
4430 case SVt_NULL:
4431 break;
79072805
LW
4432 case SVt_IV:
4433 del_XIV(SvANY(sv));
4434 break;
4435 case SVt_NV:
4436 del_XNV(SvANY(sv));
4437 break;
ed6116ce
LW
4438 case SVt_RV:
4439 del_XRV(SvANY(sv));
4440 break;
79072805
LW
4441 case SVt_PV:
4442 del_XPV(SvANY(sv));
4443 break;
4444 case SVt_PVIV:
4445 del_XPVIV(SvANY(sv));
4446 break;
4447 case SVt_PVNV:
4448 del_XPVNV(SvANY(sv));
4449 break;
4450 case SVt_PVMG:
4451 del_XPVMG(SvANY(sv));
4452 break;
4453 case SVt_PVLV:
4454 del_XPVLV(SvANY(sv));
4455 break;
4456 case SVt_PVAV:
4457 del_XPVAV(SvANY(sv));
4458 break;
4459 case SVt_PVHV:
4460 del_XPVHV(SvANY(sv));
4461 break;
4462 case SVt_PVCV:
4463 del_XPVCV(SvANY(sv));
4464 break;
4465 case SVt_PVGV:
4466 del_XPVGV(SvANY(sv));
ec12f114
JPC
4467 /* code duplication for increased performance. */
4468 SvFLAGS(sv) &= SVf_BREAK;
4469 SvFLAGS(sv) |= SVTYPEMASK;
4470 /* decrease refcount of the stash that owns this GV, if any */
4471 if (stash)
4472 SvREFCNT_dec(stash);
4473 return; /* not break, SvFLAGS reset already happened */
79072805
LW
4474 case SVt_PVBM:
4475 del_XPVBM(SvANY(sv));
4476 break;
4477 case SVt_PVFM:
4478 del_XPVFM(SvANY(sv));
4479 break;
8990e307
LW
4480 case SVt_PVIO:
4481 del_XPVIO(SvANY(sv));
4482 break;
79072805 4483 }
a0d0e21e 4484 SvFLAGS(sv) &= SVf_BREAK;
8990e307 4485 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
4486}
4487
4488SV *
864dbfa3 4489Perl_sv_newref(pTHX_ SV *sv)
79072805 4490{
463ee0b2 4491 if (sv)
dce16143 4492 ATOMIC_INC(SvREFCNT(sv));
79072805
LW
4493 return sv;
4494}
4495
c461cf8f
JH
4496/*
4497=for apidoc sv_free
4498
4499Free the memory used by an SV.
4500
4501=cut
4502*/
4503
79072805 4504void
864dbfa3 4505Perl_sv_free(pTHX_ SV *sv)
79072805 4506{
dce16143
MB
4507 int refcount_is_zero;
4508
79072805
LW
4509 if (!sv)
4510 return;
a0d0e21e
LW
4511 if (SvREFCNT(sv) == 0) {
4512 if (SvFLAGS(sv) & SVf_BREAK)
4513 return;
3280af22 4514 if (PL_in_clean_all) /* All is fair */
1edc1566 4515 return;
d689ffdd
JP
4516 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
4517 /* make sure SvREFCNT(sv)==0 happens very seldom */
4518 SvREFCNT(sv) = (~(U32)0)/2;
4519 return;
4520 }
0453d815
PM
4521 if (ckWARN_d(WARN_INTERNAL))
4522 Perl_warner(aTHX_ WARN_INTERNAL, "Attempt to free unreferenced scalar");
79072805
LW
4523 return;
4524 }
dce16143
MB
4525 ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
4526 if (!refcount_is_zero)
8990e307 4527 return;
463ee0b2
LW
4528#ifdef DEBUGGING
4529 if (SvTEMP(sv)) {
0453d815 4530 if (ckWARN_d(WARN_DEBUGGING))
f248d071 4531 Perl_warner(aTHX_ WARN_DEBUGGING,
1d7c1841
GS
4532 "Attempt to free temp prematurely: SV 0x%"UVxf,
4533 PTR2UV(sv));
79072805 4534 return;
79072805 4535 }
463ee0b2 4536#endif
d689ffdd
JP
4537 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
4538 /* make sure SvREFCNT(sv)==0 happens very seldom */
4539 SvREFCNT(sv) = (~(U32)0)/2;
4540 return;
4541 }
79072805 4542 sv_clear(sv);
477f5d66
CS
4543 if (! SvREFCNT(sv))
4544 del_SV(sv);
79072805
LW
4545}
4546
954c1994
GS
4547/*
4548=for apidoc sv_len
4549
4550Returns the length of the string in the SV. See also C<SvCUR>.
4551
4552=cut
4553*/
4554
79072805 4555STRLEN
864dbfa3 4556Perl_sv_len(pTHX_ register SV *sv)
79072805 4557{
748a9306 4558 char *junk;
463ee0b2 4559 STRLEN len;
79072805
LW
4560
4561 if (!sv)
4562 return 0;
4563
8990e307 4564 if (SvGMAGICAL(sv))
565764a8 4565 len = mg_length(sv);
8990e307 4566 else
748a9306 4567 junk = SvPV(sv, len);
463ee0b2 4568 return len;
79072805
LW
4569}
4570
c461cf8f
JH
4571/*
4572=for apidoc sv_len_utf8
4573
4574Returns the number of characters in the string in an SV, counting wide
4575UTF8 bytes as a single character.
4576
4577=cut
4578*/
4579
a0ed51b3 4580STRLEN
864dbfa3 4581Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 4582{
a0ed51b3
LW
4583 if (!sv)
4584 return 0;
4585
a0ed51b3 4586 if (SvGMAGICAL(sv))
b76347f2 4587 return mg_length(sv);
a0ed51b3 4588 else
b76347f2
JH
4589 {
4590 STRLEN len;
4591 U8 *s = (U8*)SvPV(sv, len);
4592
d6efbbad 4593 return Perl_utf8_length(aTHX_ s, s + len);
a0ed51b3 4594 }
a0ed51b3
LW
4595}
4596
4597void
864dbfa3 4598Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 4599{
dfe13c55
GS
4600 U8 *start;
4601 U8 *s;
4602 U8 *send;
a0ed51b3
LW
4603 I32 uoffset = *offsetp;
4604 STRLEN len;
4605
4606 if (!sv)
4607 return;
4608
dfe13c55 4609 start = s = (U8*)SvPV(sv, len);
a0ed51b3
LW
4610 send = s + len;
4611 while (s < send && uoffset--)
4612 s += UTF8SKIP(s);
bb40f870
GA
4613 if (s >= send)
4614 s = send;
a0ed51b3
LW
4615 *offsetp = s - start;
4616 if (lenp) {
4617 I32 ulen = *lenp;
4618 start = s;
4619 while (s < send && ulen--)
4620 s += UTF8SKIP(s);
bb40f870
GA
4621 if (s >= send)
4622 s = send;
a0ed51b3
LW
4623 *lenp = s - start;
4624 }
4625 return;
4626}
4627
4628void
864dbfa3 4629Perl_sv_pos_b2u(pTHX_ register SV *sv, I32* offsetp)
a0ed51b3 4630{
dfe13c55
GS
4631 U8 *s;
4632 U8 *send;
a0ed51b3
LW
4633 STRLEN len;
4634
4635 if (!sv)
4636 return;
4637
dfe13c55 4638 s = (U8*)SvPV(sv, len);
a0ed51b3 4639 if (len < *offsetp)
a0dbb045 4640 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
a0ed51b3
LW
4641 send = s + *offsetp;
4642 len = 0;
4643 while (s < send) {
a0dbb045
JH
4644 STRLEN n;
4645
4646 if (utf8_to_uv(s, UTF8SKIP(s), &n, 0)) {
4647 s += n;
4648 len++;
4649 }
4650 else
4651 break;
a0ed51b3
LW
4652 }
4653 *offsetp = len;
4654 return;
4655}
4656
954c1994
GS
4657/*
4658=for apidoc sv_eq
4659
4660Returns a boolean indicating whether the strings in the two SVs are
4661identical.
4662
4663=cut
4664*/
4665
79072805 4666I32
e01b9e88 4667Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805
LW
4668{
4669 char *pv1;
463ee0b2 4670 STRLEN cur1;
79072805 4671 char *pv2;
463ee0b2 4672 STRLEN cur2;
e01b9e88
SC
4673 I32 eq = 0;
4674 bool pv1tmp = FALSE;
4675 bool pv2tmp = FALSE;
79072805 4676
e01b9e88 4677 if (!sv1) {
79072805
LW
4678 pv1 = "";
4679 cur1 = 0;
4680 }
463ee0b2 4681 else
e01b9e88 4682 pv1 = SvPV(sv1, cur1);
79072805 4683
e01b9e88
SC
4684 if (!sv2){
4685 pv2 = "";
4686 cur2 = 0;
92d29cee 4687 }
e01b9e88
SC
4688 else
4689 pv2 = SvPV(sv2, cur2);
79072805 4690
e01b9e88 4691 /* do not utf8ize the comparands as a side-effect */
7bbb0251 4692 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTE) {
f9a63242
JH
4693 bool is_utf8 = TRUE;
4694
1aa99e6b
IH
4695 if (PL_hints & HINT_UTF8_DISTINCT)
4696 return FALSE;
4697
e01b9e88 4698 if (SvUTF8(sv1)) {
f9a63242
JH
4699 char *pv = bytes_from_utf8((U8*)pv1, &cur1, &is_utf8);
4700 if (is_utf8)
4701 return 0;
4702 pv1tmp = (pv != pv1);
4703 pv1 = pv;
e01b9e88
SC
4704 }
4705 else {
f9a63242
JH
4706 char *pv = bytes_from_utf8((U8*)pv2, &cur2, &is_utf8);
4707 if (is_utf8)
4708 return 0;
4709 pv2tmp = (pv != pv2);
4710 pv2 = pv;
e01b9e88
SC
4711 }
4712 }
79072805 4713
e01b9e88
SC
4714 if (cur1 == cur2)
4715 eq = memEQ(pv1, pv2, cur1);
4716
4717 if (pv1tmp)
4718 Safefree(pv1);
4719 if (pv2tmp)
4720 Safefree(pv2);
4721
4722 return eq;
79072805
LW
4723}
4724
954c1994
GS
4725/*
4726=for apidoc sv_cmp
4727
4728Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
4729string in C<sv1> is less than, equal to, or greater than the string in
4730C<sv2>.
4731
4732=cut
4733*/
4734
79072805 4735I32
e01b9e88 4736Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 4737{
560a288e
GS
4738 STRLEN cur1, cur2;
4739 char *pv1, *pv2;
1c846c1f 4740 I32 cmp;
e01b9e88
SC
4741 bool pv1tmp = FALSE;
4742 bool pv2tmp = FALSE;
560a288e 4743
e01b9e88
SC
4744 if (!sv1) {
4745 pv1 = "";
560a288e
GS
4746 cur1 = 0;
4747 }
e01b9e88
SC
4748 else
4749 pv1 = SvPV(sv1, cur1);
560a288e 4750
e01b9e88
SC
4751 if (!sv2){
4752 pv2 = "";
560a288e
GS
4753 cur2 = 0;
4754 }
e01b9e88
SC
4755 else
4756 pv2 = SvPV(sv2, cur2);
79072805 4757
e01b9e88
SC
4758 /* do not utf8ize the comparands as a side-effect */
4759 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTE) {
1aa99e6b
IH
4760 if (PL_hints & HINT_UTF8_DISTINCT)
4761 return SvUTF8(sv1) ? 1 : -1;
4762
e01b9e88
SC
4763 if (SvUTF8(sv1)) {
4764 pv2 = (char*)bytes_to_utf8((U8*)pv2, &cur2);
4765 pv2tmp = TRUE;
4766 }
4767 else {
4768 pv1 = (char*)bytes_to_utf8((U8*)pv1, &cur1);
4769 pv1tmp = TRUE;
4770 }
4771 }
79072805 4772
e01b9e88
SC
4773 if (!cur1) {
4774 cmp = cur2 ? -1 : 0;
4775 } else if (!cur2) {
4776 cmp = 1;
4777 } else {
4778 I32 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
4779
4780 if (retval) {
4781 cmp = retval < 0 ? -1 : 1;
4782 } else if (cur1 == cur2) {
4783 cmp = 0;
4784 } else {
4785 cmp = cur1 < cur2 ? -1 : 1;
4786 }
4787 }
16660edb 4788
e01b9e88
SC
4789 if (pv1tmp)
4790 Safefree(pv1);
4791 if (pv2tmp)
4792 Safefree(pv2);
16660edb 4793
e01b9e88 4794 return cmp;
bbce6d69 4795}
16660edb 4796
c461cf8f
JH
4797/*
4798=for apidoc sv_cmp_locale
4799
4800Compares the strings in two SVs in a locale-aware manner. See
4801L</sv_cmp_locale>
4802
4803=cut
4804*/
4805
bbce6d69 4806I32
864dbfa3 4807Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 4808{
36477c24 4809#ifdef USE_LOCALE_COLLATE
16660edb 4810
bbce6d69 4811 char *pv1, *pv2;
4812 STRLEN len1, len2;
4813 I32 retval;
16660edb 4814
3280af22 4815 if (PL_collation_standard)
bbce6d69 4816 goto raw_compare;
16660edb 4817
bbce6d69 4818 len1 = 0;
8ac85365 4819 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 4820 len2 = 0;
8ac85365 4821 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 4822
bbce6d69 4823 if (!pv1 || !len1) {
4824 if (pv2 && len2)
4825 return -1;
4826 else
4827 goto raw_compare;
4828 }
4829 else {
4830 if (!pv2 || !len2)
4831 return 1;
4832 }
16660edb 4833
bbce6d69 4834 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 4835
bbce6d69 4836 if (retval)
16660edb 4837 return retval < 0 ? -1 : 1;
4838
bbce6d69 4839 /*
4840 * When the result of collation is equality, that doesn't mean
4841 * that there are no differences -- some locales exclude some
4842 * characters from consideration. So to avoid false equalities,
4843 * we use the raw string as a tiebreaker.
4844 */
16660edb 4845
bbce6d69 4846 raw_compare:
4847 /* FALL THROUGH */
16660edb 4848
36477c24 4849#endif /* USE_LOCALE_COLLATE */
16660edb 4850
bbce6d69 4851 return sv_cmp(sv1, sv2);
4852}
79072805 4853
36477c24 4854#ifdef USE_LOCALE_COLLATE
7a4c00b4 4855/*
4856 * Any scalar variable may carry an 'o' magic that contains the
4857 * scalar data of the variable transformed to such a format that
4858 * a normal memory comparison can be used to compare the data
4859 * according to the locale settings.
4860 */
bbce6d69 4861char *
864dbfa3 4862Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 4863{
7a4c00b4 4864 MAGIC *mg;
16660edb 4865
8ac85365 4866 mg = SvMAGICAL(sv) ? mg_find(sv, 'o') : (MAGIC *) NULL;
3280af22 4867 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 4868 char *s, *xf;
4869 STRLEN len, xlen;
4870
7a4c00b4 4871 if (mg)
4872 Safefree(mg->mg_ptr);
bbce6d69 4873 s = SvPV(sv, len);
4874 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 4875 if (SvREADONLY(sv)) {
4876 SAVEFREEPV(xf);
4877 *nxp = xlen;
3280af22 4878 return xf + sizeof(PL_collation_ix);
ff0cee69 4879 }
7a4c00b4 4880 if (! mg) {
4881 sv_magic(sv, 0, 'o', 0, 0);
4882 mg = mg_find(sv, 'o');
4883 assert(mg);
bbce6d69 4884 }
7a4c00b4 4885 mg->mg_ptr = xf;
565764a8 4886 mg->mg_len = xlen;
7a4c00b4 4887 }
4888 else {
ff0cee69 4889 if (mg) {
4890 mg->mg_ptr = NULL;
565764a8 4891 mg->mg_len = -1;
ff0cee69 4892 }
bbce6d69 4893 }
4894 }
7a4c00b4 4895 if (mg && mg->mg_ptr) {
565764a8 4896 *nxp = mg->mg_len;
3280af22 4897 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 4898 }
4899 else {
4900 *nxp = 0;
4901 return NULL;
16660edb 4902 }
79072805
LW
4903}
4904
36477c24 4905#endif /* USE_LOCALE_COLLATE */
bbce6d69 4906
c461cf8f
JH
4907/*
4908=for apidoc sv_gets
4909
4910Get a line from the filehandle and store it into the SV, optionally
4911appending to the currently-stored string.
4912
4913=cut
4914*/
4915
79072805 4916char *
864dbfa3 4917Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 4918{
c07a80fd 4919 char *rsptr;
4920 STRLEN rslen;
4921 register STDCHAR rslast;
4922 register STDCHAR *bp;
4923 register I32 cnt;
4924 I32 i;
4925
2213622d 4926 SV_CHECK_THINKFIRST(sv);
6fc92669 4927 (void)SvUPGRADE(sv, SVt_PV);
99491443 4928
ff68c719 4929 SvSCREAM_off(sv);
c07a80fd 4930
3280af22 4931 if (RsSNARF(PL_rs)) {
c07a80fd 4932 rsptr = NULL;
4933 rslen = 0;
4934 }
3280af22 4935 else if (RsRECORD(PL_rs)) {
5b2b9c68
HM
4936 I32 recsize, bytesread;
4937 char *buffer;
4938
4939 /* Grab the size of the record we're getting */
3280af22 4940 recsize = SvIV(SvRV(PL_rs));
5b2b9c68 4941 (void)SvPOK_only(sv); /* Validate pointer */
e670df4e 4942 buffer = SvGROW(sv, recsize + 1);
5b2b9c68
HM
4943 /* Go yank in */
4944#ifdef VMS
4945 /* VMS wants read instead of fread, because fread doesn't respect */
4946 /* RMS record boundaries. This is not necessarily a good thing to be */
4947 /* doing, but we've got no other real choice */
4948 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
4949#else
4950 bytesread = PerlIO_read(fp, buffer, recsize);
4951#endif
4952 SvCUR_set(sv, bytesread);
e670df4e 4953 buffer[bytesread] = '\0';
7d59b7e4
NIS
4954 if (PerlIO_isutf8(fp))
4955 SvUTF8_on(sv);
4956 else
4957 SvUTF8_off(sv);
5b2b9c68
HM
4958 return(SvCUR(sv) ? SvPVX(sv) : Nullch);
4959 }
3280af22 4960 else if (RsPARA(PL_rs)) {
c07a80fd 4961 rsptr = "\n\n";
4962 rslen = 2;
4963 }
7d59b7e4
NIS
4964 else {
4965 /* Get $/ i.e. PL_rs into same encoding as stream wants */
4966 if (PerlIO_isutf8(fp)) {
4967 rsptr = SvPVutf8(PL_rs, rslen);
4968 }
4969 else {
4970 if (SvUTF8(PL_rs)) {
4971 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
4972 Perl_croak(aTHX_ "Wide character in $/");
4973 }
4974 }
4975 rsptr = SvPV(PL_rs, rslen);
4976 }
4977 }
4978
c07a80fd 4979 rslast = rslen ? rsptr[rslen - 1] : '\0';
4980
3280af22 4981 if (RsPARA(PL_rs)) { /* have to do this both before and after */
79072805 4982 do { /* to make sure file boundaries work right */
760ac839 4983 if (PerlIO_eof(fp))
a0d0e21e 4984 return 0;
760ac839 4985 i = PerlIO_getc(fp);
79072805 4986 if (i != '\n') {
a0d0e21e
LW
4987 if (i == -1)
4988 return 0;
760ac839 4989 PerlIO_ungetc(fp,i);
79072805
LW
4990 break;
4991 }
4992 } while (i != EOF);
4993 }
c07a80fd 4994
760ac839
LW
4995 /* See if we know enough about I/O mechanism to cheat it ! */
4996
4997 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 4998 of abstracting out stdio interface. One call should be cheap
760ac839
LW
4999 enough here - and may even be a macro allowing compile
5000 time optimization.
5001 */
5002
5003 if (PerlIO_fast_gets(fp)) {
5004
5005 /*
5006 * We're going to steal some values from the stdio struct
5007 * and put EVERYTHING in the innermost loop into registers.
5008 */
5009 register STDCHAR *ptr;
5010 STRLEN bpx;
5011 I32 shortbuffered;
5012
16660edb 5013#if defined(VMS) && defined(PERLIO_IS_STDIO)
5014 /* An ungetc()d char is handled separately from the regular
5015 * buffer, so we getc() it back out and stuff it in the buffer.
5016 */
5017 i = PerlIO_getc(fp);
5018 if (i == EOF) return 0;
5019 *(--((*fp)->_ptr)) = (unsigned char) i;
5020 (*fp)->_cnt++;
5021#endif
c07a80fd 5022
c2960299 5023 /* Here is some breathtakingly efficient cheating */
c07a80fd 5024
a20bf0c3 5025 cnt = PerlIO_get_cnt(fp); /* get count into register */
a0d0e21e 5026 (void)SvPOK_only(sv); /* validate pointer */
79072805
LW
5027 if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
5028 if (cnt > 80 && SvLEN(sv) > append) {
5029 shortbuffered = cnt - SvLEN(sv) + append + 1;
5030 cnt -= shortbuffered;
5031 }
5032 else {
5033 shortbuffered = 0;
bbce6d69 5034 /* remember that cnt can be negative */
5035 SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
79072805
LW
5036 }
5037 }
5038 else
5039 shortbuffered = 0;
c07a80fd 5040 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
a20bf0c3 5041 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 5042 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5043 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 5044 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5045 "Screamer: entering: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5046 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5047 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
5048 for (;;) {
5049 screamer:
93a17b20 5050 if (cnt > 0) {
c07a80fd 5051 if (rslen) {
760ac839
LW
5052 while (cnt > 0) { /* this | eat */
5053 cnt--;
c07a80fd 5054 if ((*bp++ = *ptr++) == rslast) /* really | dust */
5055 goto thats_all_folks; /* screams | sed :-) */
5056 }
5057 }
5058 else {
1c846c1f
NIS
5059 Copy(ptr, bp, cnt, char); /* this | eat */
5060 bp += cnt; /* screams | dust */
c07a80fd 5061 ptr += cnt; /* louder | sed :-) */
a5f75d66 5062 cnt = 0;
93a17b20 5063 }
79072805
LW
5064 }
5065
748a9306 5066 if (shortbuffered) { /* oh well, must extend */
79072805
LW
5067 cnt = shortbuffered;
5068 shortbuffered = 0;
c07a80fd 5069 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
5070 SvCUR_set(sv, bpx);
5071 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 5072 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
5073 continue;
5074 }
5075
16660edb 5076 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
5077 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
5078 PTR2UV(ptr),(long)cnt));
a20bf0c3 5079 PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
16660edb 5080 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5081 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5082 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5083 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
1c846c1f 5084 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 5085 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
5086 another abstraction. */
760ac839 5087 i = PerlIO_getc(fp); /* get more characters */
16660edb 5088 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5089 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5090 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5091 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
a20bf0c3
JH
5092 cnt = PerlIO_get_cnt(fp);
5093 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 5094 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5095 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 5096
748a9306
LW
5097 if (i == EOF) /* all done for ever? */
5098 goto thats_really_all_folks;
5099
c07a80fd 5100 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
5101 SvCUR_set(sv, bpx);
5102 SvGROW(sv, bpx + cnt + 2);
c07a80fd 5103 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
5104
760ac839 5105 *bp++ = i; /* store character from PerlIO_getc */
79072805 5106
c07a80fd 5107 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 5108 goto thats_all_folks;
79072805
LW
5109 }
5110
5111thats_all_folks:
c07a80fd 5112 if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
36477c24 5113 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 5114 goto screamer; /* go back to the fray */
79072805
LW
5115thats_really_all_folks:
5116 if (shortbuffered)
5117 cnt += shortbuffered;
16660edb 5118 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5119 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
a20bf0c3 5120 PerlIO_set_ptrcnt(fp, ptr, cnt); /* put these back or we're in trouble */
16660edb 5121 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5122 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5123 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5124 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 5125 *bp = '\0';
760ac839 5126 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 5127 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 5128 "Screamer: done, len=%ld, string=|%.*s|\n",
5129 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
5130 }
5131 else
79072805 5132 {
4d2c4e07 5133#ifndef EPOC
760ac839 5134 /*The big, slow, and stupid way */
c07a80fd 5135 STDCHAR buf[8192];
4d2c4e07
OF
5136#else
5137 /* Need to work around EPOC SDK features */
5138 /* On WINS: MS VC5 generates calls to _chkstk, */
5139 /* if a `large' stack frame is allocated */
5140 /* gcc on MARM does not generate calls like these */
5141 STDCHAR buf[1024];
5142#endif
79072805 5143
760ac839 5144screamer2:
c07a80fd 5145 if (rslen) {
760ac839
LW
5146 register STDCHAR *bpe = buf + sizeof(buf);
5147 bp = buf;
5148 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = i) != rslast && bp < bpe)
5149 ; /* keep reading */
5150 cnt = bp - buf;
c07a80fd 5151 }
5152 else {
760ac839 5153 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 5154 /* Accomodate broken VAXC compiler, which applies U8 cast to
5155 * both args of ?: operator, causing EOF to change into 255
5156 */
5157 if (cnt) { i = (U8)buf[cnt - 1]; } else { i = EOF; }
c07a80fd 5158 }
79072805
LW
5159
5160 if (append)
760ac839 5161 sv_catpvn(sv, (char *) buf, cnt);
79072805 5162 else
760ac839 5163 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 5164
5165 if (i != EOF && /* joy */
5166 (!rslen ||
5167 SvCUR(sv) < rslen ||
36477c24 5168 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
5169 {
5170 append = -1;
63e4d877
CS
5171 /*
5172 * If we're reading from a TTY and we get a short read,
5173 * indicating that the user hit his EOF character, we need
5174 * to notice it now, because if we try to read from the TTY
5175 * again, the EOF condition will disappear.
5176 *
5177 * The comparison of cnt to sizeof(buf) is an optimization
5178 * that prevents unnecessary calls to feof().
5179 *
5180 * - jik 9/25/96
5181 */
5182 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
5183 goto screamer2;
79072805
LW
5184 }
5185 }
5186
1c846c1f 5187 if (RsPARA(PL_rs)) { /* have to do this both before and after */
c07a80fd 5188 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 5189 i = PerlIO_getc(fp);
79072805 5190 if (i != '\n') {
760ac839 5191 PerlIO_ungetc(fp,i);
79072805
LW
5192 break;
5193 }
5194 }
5195 }
c07a80fd 5196
7d59b7e4
NIS
5197 if (PerlIO_isutf8(fp))
5198 SvUTF8_on(sv);
5199 else
5200 SvUTF8_off(sv);
5201
c07a80fd 5202 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
5203}
5204
760ac839 5205
954c1994
GS
5206/*
5207=for apidoc sv_inc
5208
5209Auto-increment of the value in the SV.
5210
5211=cut
5212*/
5213
79072805 5214void
864dbfa3 5215Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
5216{
5217 register char *d;
463ee0b2 5218 int flags;
79072805
LW
5219
5220 if (!sv)
5221 return;
b23a5f78
GB
5222 if (SvGMAGICAL(sv))
5223 mg_get(sv);
ed6116ce 5224 if (SvTHINKFIRST(sv)) {
0f15f207 5225 if (SvREADONLY(sv)) {
3280af22 5226 if (PL_curcop != &PL_compiling)
cea2e8a9 5227 Perl_croak(aTHX_ PL_no_modify);
0f15f207 5228 }
a0d0e21e 5229 if (SvROK(sv)) {
b5be31e9 5230 IV i;
9e7bc3e8
JD
5231 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
5232 return;
56431972 5233 i = PTR2IV(SvRV(sv));
b5be31e9
SM
5234 sv_unref(sv);
5235 sv_setiv(sv, i);
a0d0e21e 5236 }
ed6116ce 5237 }
8990e307 5238 flags = SvFLAGS(sv);
28e5dec8
JH
5239 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
5240 /* It's (privately or publicly) a float, but not tested as an
5241 integer, so test it to see. */
d460ef45 5242 (void) SvIV(sv);
28e5dec8
JH
5243 flags = SvFLAGS(sv);
5244 }
5245 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
5246 /* It's publicly an integer, or privately an integer-not-float */
5247 oops_its_int:
25da4f38
IZ
5248 if (SvIsUV(sv)) {
5249 if (SvUVX(sv) == UV_MAX)
65202027 5250 sv_setnv(sv, (NV)UV_MAX + 1.0);
25da4f38
IZ
5251 else
5252 (void)SvIOK_only_UV(sv);
5253 ++SvUVX(sv);
5254 } else {
5255 if (SvIVX(sv) == IV_MAX)
28e5dec8 5256 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
5257 else {
5258 (void)SvIOK_only(sv);
5259 ++SvIVX(sv);
1c846c1f 5260 }
55497cff 5261 }
79072805
LW
5262 return;
5263 }
28e5dec8
JH
5264 if (flags & SVp_NOK) {
5265 (void)SvNOK_only(sv);
5266 SvNVX(sv) += 1.0;
5267 return;
5268 }
5269
8990e307 5270 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
28e5dec8
JH
5271 if ((flags & SVTYPEMASK) < SVt_PVIV)
5272 sv_upgrade(sv, SVt_IV);
5273 (void)SvIOK_only(sv);
5274 SvIVX(sv) = 1;
79072805
LW
5275 return;
5276 }
463ee0b2 5277 d = SvPVX(sv);
79072805
LW
5278 while (isALPHA(*d)) d++;
5279 while (isDIGIT(*d)) d++;
5280 if (*d) {
28e5dec8
JH
5281#ifdef PERL_PRESERVE_IVUV
5282 /* Got to punt this an an integer if needs be, but we don't issue
5283 warnings. Probably ought to make the sv_iv_please() that does
5284 the conversion if possible, and silently. */
5285 I32 numtype = looks_like_number(sv);
5286 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
5287 /* Need to try really hard to see if it's an integer.
5288 9.22337203685478e+18 is an integer.
5289 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
5290 so $a="9.22337203685478e+18"; $a+0; $a++
5291 needs to be the same as $a="9.22337203685478e+18"; $a++
5292 or we go insane. */
d460ef45 5293
28e5dec8
JH
5294 (void) sv_2iv(sv);
5295 if (SvIOK(sv))
5296 goto oops_its_int;
5297
5298 /* sv_2iv *should* have made this an NV */
5299 if (flags & SVp_NOK) {
5300 (void)SvNOK_only(sv);
5301 SvNVX(sv) += 1.0;
5302 return;
5303 }
5304 /* I don't think we can get here. Maybe I should assert this
5305 And if we do get here I suspect that sv_setnv will croak. NWC
5306 Fall through. */
5307#if defined(USE_LONG_DOUBLE)
5308 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"PERL_PRIgldbl"\n",
5309 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
5310#else
5311 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%g\n",
5312 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
5313#endif
5314 }
5315#endif /* PERL_PRESERVE_IVUV */
5316 sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
79072805
LW
5317 return;
5318 }
5319 d--;
463ee0b2 5320 while (d >= SvPVX(sv)) {
79072805
LW
5321 if (isDIGIT(*d)) {
5322 if (++*d <= '9')
5323 return;
5324 *(d--) = '0';
5325 }
5326 else {
9d116dd7
JH
5327#ifdef EBCDIC
5328 /* MKS: The original code here died if letters weren't consecutive.
5329 * at least it didn't have to worry about non-C locales. The
5330 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 5331 * arranged in order (although not consecutively) and that only
9d116dd7
JH
5332 * [A-Za-z] are accepted by isALPHA in the C locale.
5333 */
5334 if (*d != 'z' && *d != 'Z') {
5335 do { ++*d; } while (!isALPHA(*d));
5336 return;
5337 }
5338 *(d--) -= 'z' - 'a';
5339#else
79072805
LW
5340 ++*d;
5341 if (isALPHA(*d))
5342 return;
5343 *(d--) -= 'z' - 'a' + 1;
9d116dd7 5344#endif
79072805
LW
5345 }
5346 }
5347 /* oh,oh, the number grew */
5348 SvGROW(sv, SvCUR(sv) + 2);
5349 SvCUR(sv)++;
463ee0b2 5350 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
5351 *d = d[-1];
5352 if (isDIGIT(d[1]))
5353 *d = '1';
5354 else
5355 *d = d[1];
5356}
5357
954c1994
GS
5358/*
5359=for apidoc sv_dec
5360
5361Auto-decrement of the value in the SV.
5362
5363=cut
5364*/
5365
79072805 5366void
864dbfa3 5367Perl_sv_dec(pTHX_ register SV *sv)
79072805 5368{
463ee0b2
LW
5369 int flags;
5370
79072805
LW
5371 if (!sv)
5372 return;
b23a5f78
GB
5373 if (SvGMAGICAL(sv))
5374 mg_get(sv);
ed6116ce 5375 if (SvTHINKFIRST(sv)) {
0f15f207 5376 if (SvREADONLY(sv)) {
3280af22 5377 if (PL_curcop != &PL_compiling)
cea2e8a9 5378 Perl_croak(aTHX_ PL_no_modify);
0f15f207 5379 }
a0d0e21e 5380 if (SvROK(sv)) {
b5be31e9 5381 IV i;
9e7bc3e8
JD
5382 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
5383 return;
56431972 5384 i = PTR2IV(SvRV(sv));
b5be31e9
SM
5385 sv_unref(sv);
5386 sv_setiv(sv, i);
a0d0e21e 5387 }
ed6116ce 5388 }
28e5dec8
JH
5389 /* Unlike sv_inc we don't have to worry about string-never-numbers
5390 and keeping them magic. But we mustn't warn on punting */
8990e307 5391 flags = SvFLAGS(sv);
28e5dec8
JH
5392 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
5393 /* It's publicly an integer, or privately an integer-not-float */
5394 oops_its_int:
25da4f38
IZ
5395 if (SvIsUV(sv)) {
5396 if (SvUVX(sv) == 0) {
5397 (void)SvIOK_only(sv);
5398 SvIVX(sv) = -1;
5399 }
5400 else {
5401 (void)SvIOK_only_UV(sv);
5402 --SvUVX(sv);
1c846c1f 5403 }
25da4f38
IZ
5404 } else {
5405 if (SvIVX(sv) == IV_MIN)
65202027 5406 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
5407 else {
5408 (void)SvIOK_only(sv);
5409 --SvIVX(sv);
1c846c1f 5410 }
55497cff 5411 }
5412 return;
5413 }
28e5dec8
JH
5414 if (flags & SVp_NOK) {
5415 SvNVX(sv) -= 1.0;
5416 (void)SvNOK_only(sv);
5417 return;
5418 }
8990e307 5419 if (!(flags & SVp_POK)) {
4633a7c4
LW
5420 if ((flags & SVTYPEMASK) < SVt_PVNV)
5421 sv_upgrade(sv, SVt_NV);
463ee0b2 5422 SvNVX(sv) = -1.0;
a0d0e21e 5423 (void)SvNOK_only(sv);
79072805
LW
5424 return;
5425 }
28e5dec8
JH
5426#ifdef PERL_PRESERVE_IVUV
5427 {
5428 I32 numtype = looks_like_number(sv);
5429 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
5430 /* Need to try really hard to see if it's an integer.
5431 9.22337203685478e+18 is an integer.
5432 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
5433 so $a="9.22337203685478e+18"; $a+0; $a--
5434 needs to be the same as $a="9.22337203685478e+18"; $a--
5435 or we go insane. */
d460ef45 5436
28e5dec8
JH
5437 (void) sv_2iv(sv);
5438 if (SvIOK(sv))
5439 goto oops_its_int;
5440
5441 /* sv_2iv *should* have made this an NV */
5442 if (flags & SVp_NOK) {
5443 (void)SvNOK_only(sv);
5444 SvNVX(sv) -= 1.0;
5445 return;
5446 }
5447 /* I don't think we can get here. Maybe I should assert this
5448 And if we do get here I suspect that sv_setnv will croak. NWC
5449 Fall through. */
5450#if defined(USE_LONG_DOUBLE)
5451 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"PERL_PRIgldbl"\n",
5452 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
5453#else
5454 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%g\n",
5455 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
5456#endif
5457 }
5458 }
5459#endif /* PERL_PRESERVE_IVUV */
097ee67d 5460 sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
5461}
5462
954c1994
GS
5463/*
5464=for apidoc sv_mortalcopy
5465
5466Creates a new SV which is a copy of the original SV. The new SV is marked
5467as mortal.
5468
5469=cut
5470*/
5471
79072805
LW
5472/* Make a string that will exist for the duration of the expression
5473 * evaluation. Actually, it may have to last longer than that, but
5474 * hopefully we won't free it until it has been assigned to a
5475 * permanent location. */
5476
5477SV *
864dbfa3 5478Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 5479{
463ee0b2 5480 register SV *sv;
79072805 5481
4561caa4 5482 new_SV(sv);
79072805 5483 sv_setsv(sv,oldstr);
677b06e3
GS
5484 EXTEND_MORTAL(1);
5485 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
5486 SvTEMP_on(sv);
5487 return sv;
5488}
5489
954c1994
GS
5490/*
5491=for apidoc sv_newmortal
5492
5493Creates a new SV which is mortal. The reference count of the SV is set to 1.
5494
5495=cut
5496*/
5497
8990e307 5498SV *
864dbfa3 5499Perl_sv_newmortal(pTHX)
8990e307
LW
5500{
5501 register SV *sv;
5502
4561caa4 5503 new_SV(sv);
8990e307 5504 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
5505 EXTEND_MORTAL(1);
5506 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
5507 return sv;
5508}
5509
954c1994
GS
5510/*
5511=for apidoc sv_2mortal
5512
5513Marks an SV as mortal. The SV will be destroyed when the current context
5514ends.
5515
5516=cut
5517*/
5518
79072805
LW
5519/* same thing without the copying */
5520
5521SV *
864dbfa3 5522Perl_sv_2mortal(pTHX_ register SV *sv)
79072805
LW
5523{
5524 if (!sv)
5525 return sv;
d689ffdd 5526 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 5527 return sv;
677b06e3
GS
5528 EXTEND_MORTAL(1);
5529 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 5530 SvTEMP_on(sv);
79072805
LW
5531 return sv;
5532}
5533
954c1994
GS
5534/*
5535=for apidoc newSVpv
5536
5537Creates a new SV and copies a string into it. The reference count for the
5538SV is set to 1. If C<len> is zero, Perl will compute the length using
5539strlen(). For efficiency, consider using C<newSVpvn> instead.
5540
5541=cut
5542*/
5543
79072805 5544SV *
864dbfa3 5545Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 5546{
463ee0b2 5547 register SV *sv;
79072805 5548
4561caa4 5549 new_SV(sv);
79072805
LW
5550 if (!len)
5551 len = strlen(s);
5552 sv_setpvn(sv,s,len);
5553 return sv;
5554}
5555
954c1994
GS
5556/*
5557=for apidoc newSVpvn
5558
5559Creates a new SV and copies a string into it. The reference count for the
1c846c1f 5560SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994
GS
5561string. You are responsible for ensuring that the source string is at least
5562C<len> bytes long.
5563
5564=cut
5565*/
5566
9da1e3b5 5567SV *
864dbfa3 5568Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
5569{
5570 register SV *sv;
5571
5572 new_SV(sv);
9da1e3b5
MUN
5573 sv_setpvn(sv,s,len);
5574 return sv;
5575}
5576
1c846c1f
NIS
5577/*
5578=for apidoc newSVpvn_share
5579
5580Creates a new SV and populates it with a string from
5581the string table. Turns on READONLY and FAKE.
5582The idea here is that as string table is used for shared hash
5583keys these strings will have SvPVX == HeKEY and hash lookup
5584will avoid string compare.
5585
5586=cut
5587*/
5588
5589SV *
c3654f1a 5590Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
5591{
5592 register SV *sv;
c3654f1a
IH
5593 bool is_utf8 = FALSE;
5594 if (len < 0) {
5595 len = -len;
5596 is_utf8 = TRUE;
5597 }
f9a63242
JH
5598 if (is_utf8 && !(PL_hints & HINT_UTF8_DISTINCT))
5599 src = (char*)bytes_from_utf8((U8*)src, (STRLEN*)&len, &is_utf8);
1c846c1f
NIS
5600 if (!hash)
5601 PERL_HASH(hash, src, len);
5602 new_SV(sv);
5603 sv_upgrade(sv, SVt_PVIV);
c3654f1a 5604 SvPVX(sv) = sharepvn(src, is_utf8?-len:len, hash);
1c846c1f
NIS
5605 SvCUR(sv) = len;
5606 SvUVX(sv) = hash;
5607 SvLEN(sv) = 0;
5608 SvREADONLY_on(sv);
5609 SvFAKE_on(sv);
5610 SvPOK_on(sv);
c3654f1a
IH
5611 if (is_utf8)
5612 SvUTF8_on(sv);
1c846c1f
NIS
5613 return sv;
5614}
5615
cea2e8a9 5616#if defined(PERL_IMPLICIT_CONTEXT)
46fc3d4c 5617SV *
cea2e8a9 5618Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 5619{
cea2e8a9 5620 dTHX;
46fc3d4c 5621 register SV *sv;
5622 va_list args;
46fc3d4c 5623 va_start(args, pat);
c5be433b 5624 sv = vnewSVpvf(pat, &args);
46fc3d4c 5625 va_end(args);
5626 return sv;
5627}
cea2e8a9 5628#endif
46fc3d4c 5629
954c1994
GS
5630/*
5631=for apidoc newSVpvf
5632
5633Creates a new SV an initialize it with the string formatted like
5634C<sprintf>.
5635
5636=cut
5637*/
5638
cea2e8a9
GS
5639SV *
5640Perl_newSVpvf(pTHX_ const char* pat, ...)
5641{
5642 register SV *sv;
5643 va_list args;
cea2e8a9 5644 va_start(args, pat);
c5be433b 5645 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
5646 va_end(args);
5647 return sv;
5648}
46fc3d4c 5649
79072805 5650SV *
c5be433b
GS
5651Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
5652{
5653 register SV *sv;
5654 new_SV(sv);
5655 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
5656 return sv;
5657}
5658
954c1994
GS
5659/*
5660=for apidoc newSVnv
5661
5662Creates a new SV and copies a floating point value into it.
5663The reference count for the SV is set to 1.
5664
5665=cut
5666*/
5667
c5be433b 5668SV *
65202027 5669Perl_newSVnv(pTHX_ NV n)
79072805 5670{
463ee0b2 5671 register SV *sv;
79072805 5672
4561caa4 5673 new_SV(sv);
79072805
LW
5674 sv_setnv(sv,n);
5675 return sv;
5676}
5677
954c1994
GS
5678/*
5679=for apidoc newSViv
5680
5681Creates a new SV and copies an integer into it. The reference count for the
5682SV is set to 1.
5683
5684=cut
5685*/
5686
79072805 5687SV *
864dbfa3 5688Perl_newSViv(pTHX_ IV i)
79072805 5689{
463ee0b2 5690 register SV *sv;
79072805 5691
4561caa4 5692 new_SV(sv);
79072805
LW
5693 sv_setiv(sv,i);
5694 return sv;
5695}
5696
954c1994 5697/*
1a3327fb
JH
5698=for apidoc newSVuv
5699
5700Creates a new SV and copies an unsigned integer into it.
5701The reference count for the SV is set to 1.
5702
5703=cut
5704*/
5705
5706SV *
5707Perl_newSVuv(pTHX_ UV u)
5708{
5709 register SV *sv;
5710
5711 new_SV(sv);
5712 sv_setuv(sv,u);
5713 return sv;
5714}
5715
5716/*
954c1994
GS
5717=for apidoc newRV_noinc
5718
5719Creates an RV wrapper for an SV. The reference count for the original
5720SV is B<not> incremented.
5721
5722=cut
5723*/
5724
2304df62 5725SV *
864dbfa3 5726Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
5727{
5728 register SV *sv;
5729
4561caa4 5730 new_SV(sv);
2304df62 5731 sv_upgrade(sv, SVt_RV);
76e3520e 5732 SvTEMP_off(tmpRef);
d689ffdd 5733 SvRV(sv) = tmpRef;
2304df62 5734 SvROK_on(sv);
2304df62
AD
5735 return sv;
5736}
5737
954c1994 5738/* newRV_inc is #defined to newRV in sv.h */
5f05dabc 5739SV *
864dbfa3 5740Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 5741{
5f6447b6 5742 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 5743}
5f05dabc 5744
954c1994
GS
5745/*
5746=for apidoc newSVsv
5747
5748Creates a new SV which is an exact duplicate of the original SV.
5749
5750=cut
5751*/
5752
79072805
LW
5753/* make an exact duplicate of old */
5754
5755SV *
864dbfa3 5756Perl_newSVsv(pTHX_ register SV *old)
79072805 5757{
463ee0b2 5758 register SV *sv;
79072805
LW
5759
5760 if (!old)
5761 return Nullsv;
8990e307 5762 if (SvTYPE(old) == SVTYPEMASK) {
0453d815
PM
5763 if (ckWARN_d(WARN_INTERNAL))
5764 Perl_warner(aTHX_ WARN_INTERNAL, "semi-panic: attempt to dup freed string");
79072805
LW
5765 return Nullsv;
5766 }
4561caa4 5767 new_SV(sv);
ff68c719 5768 if (SvTEMP(old)) {
5769 SvTEMP_off(old);
463ee0b2 5770 sv_setsv(sv,old);
ff68c719 5771 SvTEMP_on(old);
79072805
LW
5772 }
5773 else
463ee0b2
LW
5774 sv_setsv(sv,old);
5775 return sv;
79072805
LW
5776}
5777
5778void
864dbfa3 5779Perl_sv_reset(pTHX_ register char *s, HV *stash)
79072805
LW
5780{
5781 register HE *entry;
5782 register GV *gv;
5783 register SV *sv;
5784 register I32 i;
5785 register PMOP *pm;
5786 register I32 max;
4802d5d7 5787 char todo[PERL_UCHAR_MAX+1];
79072805 5788
49d8d3a1
MB
5789 if (!stash)
5790 return;
5791
79072805
LW
5792 if (!*s) { /* reset ?? searches */
5793 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
48c036b1 5794 pm->op_pmdynflags &= ~PMdf_USED;
79072805
LW
5795 }
5796 return;
5797 }
5798
5799 /* reset variables */
5800
5801 if (!HvARRAY(stash))
5802 return;
463ee0b2
LW
5803
5804 Zero(todo, 256, char);
79072805 5805 while (*s) {
4802d5d7 5806 i = (unsigned char)*s;
79072805
LW
5807 if (s[1] == '-') {
5808 s += 2;
5809 }
4802d5d7 5810 max = (unsigned char)*s++;
79072805 5811 for ( ; i <= max; i++) {
463ee0b2
LW
5812 todo[i] = 1;
5813 }
a0d0e21e 5814 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 5815 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
5816 entry;
5817 entry = HeNEXT(entry))
5818 {
1edc1566 5819 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 5820 continue;
1edc1566 5821 gv = (GV*)HeVAL(entry);
79072805 5822 sv = GvSV(gv);
9e35f4b3
GS
5823 if (SvTHINKFIRST(sv)) {
5824 if (!SvREADONLY(sv) && SvROK(sv))
5825 sv_unref(sv);
5826 continue;
5827 }
a0d0e21e 5828 (void)SvOK_off(sv);
79072805
LW
5829 if (SvTYPE(sv) >= SVt_PV) {
5830 SvCUR_set(sv, 0);
463ee0b2
LW
5831 if (SvPVX(sv) != Nullch)
5832 *SvPVX(sv) = '\0';
44a8e56a 5833 SvTAINT(sv);
79072805
LW
5834 }
5835 if (GvAV(gv)) {
5836 av_clear(GvAV(gv));
5837 }
44a8e56a 5838 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
463ee0b2 5839 hv_clear(GvHV(gv));
fa6a1c44 5840#ifdef USE_ENVIRON_ARRAY
3280af22 5841 if (gv == PL_envgv)
79072805 5842 environ[0] = Nullch;
a0d0e21e 5843#endif
79072805
LW
5844 }
5845 }
5846 }
5847 }
5848}
5849
46fc3d4c 5850IO*
864dbfa3 5851Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 5852{
5853 IO* io;
5854 GV* gv;
2d8e6c8d 5855 STRLEN n_a;
46fc3d4c 5856
5857 switch (SvTYPE(sv)) {
5858 case SVt_PVIO:
5859 io = (IO*)sv;
5860 break;
5861 case SVt_PVGV:
5862 gv = (GV*)sv;
5863 io = GvIO(gv);
5864 if (!io)
cea2e8a9 5865 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 5866 break;
5867 default:
5868 if (!SvOK(sv))
cea2e8a9 5869 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 5870 if (SvROK(sv))
5871 return sv_2io(SvRV(sv));
2d8e6c8d 5872 gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
46fc3d4c 5873 if (gv)
5874 io = GvIO(gv);
5875 else
5876 io = 0;
5877 if (!io)
cea2e8a9 5878 Perl_croak(aTHX_ "Bad filehandle: %s", SvPV(sv,n_a));
46fc3d4c 5879 break;
5880 }
5881 return io;
5882}
5883
79072805 5884CV *
864dbfa3 5885Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805
LW
5886{
5887 GV *gv;
5888 CV *cv;
2d8e6c8d 5889 STRLEN n_a;
79072805
LW
5890
5891 if (!sv)
93a17b20 5892 return *gvp = Nullgv, Nullcv;
79072805 5893 switch (SvTYPE(sv)) {
79072805
LW
5894 case SVt_PVCV:
5895 *st = CvSTASH(sv);
5896 *gvp = Nullgv;
5897 return (CV*)sv;
5898 case SVt_PVHV:
5899 case SVt_PVAV:
5900 *gvp = Nullgv;
5901 return Nullcv;
8990e307
LW
5902 case SVt_PVGV:
5903 gv = (GV*)sv;
a0d0e21e 5904 *gvp = gv;
8990e307
LW
5905 *st = GvESTASH(gv);
5906 goto fix_gv;
5907
79072805 5908 default:
a0d0e21e
LW
5909 if (SvGMAGICAL(sv))
5910 mg_get(sv);
5911 if (SvROK(sv)) {
f5284f61
IZ
5912 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
5913 tryAMAGICunDEREF(to_cv);
5914
62f274bf
GS
5915 sv = SvRV(sv);
5916 if (SvTYPE(sv) == SVt_PVCV) {
5917 cv = (CV*)sv;
5918 *gvp = Nullgv;
5919 *st = CvSTASH(cv);
5920 return cv;
5921 }
5922 else if(isGV(sv))
5923 gv = (GV*)sv;
5924 else
cea2e8a9 5925 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 5926 }
62f274bf 5927 else if (isGV(sv))
79072805
LW
5928 gv = (GV*)sv;
5929 else
2d8e6c8d 5930 gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
79072805
LW
5931 *gvp = gv;
5932 if (!gv)
5933 return Nullcv;
5934 *st = GvESTASH(gv);
8990e307 5935 fix_gv:
8ebc5c01 5936 if (lref && !GvCVu(gv)) {
4633a7c4 5937 SV *tmpsv;
748a9306 5938 ENTER;
4633a7c4 5939 tmpsv = NEWSV(704,0);
16660edb 5940 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
5941 /* XXX this is probably not what they think they're getting.
5942 * It has the same effect as "sub name;", i.e. just a forward
5943 * declaration! */
774d564b 5944 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
5945 newSVOP(OP_CONST, 0, tmpsv),
5946 Nullop,
8990e307 5947 Nullop);
748a9306 5948 LEAVE;
8ebc5c01 5949 if (!GvCVu(gv))
cea2e8a9 5950 Perl_croak(aTHX_ "Unable to create sub named \"%s\"", SvPV(sv,n_a));
8990e307 5951 }
8ebc5c01 5952 return GvCVu(gv);
79072805
LW
5953 }
5954}
5955
c461cf8f
JH
5956/*
5957=for apidoc sv_true
5958
5959Returns true if the SV has a true value by Perl's rules.
5960
5961=cut
5962*/
5963
79072805 5964I32
864dbfa3 5965Perl_sv_true(pTHX_ register SV *sv)
79072805 5966{
8990e307
LW
5967 if (!sv)
5968 return 0;
79072805 5969 if (SvPOK(sv)) {
4e35701f
NIS
5970 register XPV* tXpv;
5971 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 5972 (tXpv->xpv_cur > 1 ||
4e35701f 5973 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
79072805
LW
5974 return 1;
5975 else
5976 return 0;
5977 }
5978 else {
5979 if (SvIOK(sv))
463ee0b2 5980 return SvIVX(sv) != 0;
79072805
LW
5981 else {
5982 if (SvNOK(sv))
463ee0b2 5983 return SvNVX(sv) != 0.0;
79072805 5984 else
463ee0b2 5985 return sv_2bool(sv);
79072805
LW
5986 }
5987 }
5988}
79072805 5989
ff68c719 5990IV
864dbfa3 5991Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 5992{
25da4f38
IZ
5993 if (SvIOK(sv)) {
5994 if (SvIsUV(sv))
5995 return (IV)SvUVX(sv);
ff68c719 5996 return SvIVX(sv);
25da4f38 5997 }
ff68c719 5998 return sv_2iv(sv);
85e6fe83 5999}
85e6fe83 6000
ff68c719 6001UV
864dbfa3 6002Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 6003{
25da4f38
IZ
6004 if (SvIOK(sv)) {
6005 if (SvIsUV(sv))
6006 return SvUVX(sv);
6007 return (UV)SvIVX(sv);
6008 }
ff68c719 6009 return sv_2uv(sv);
6010}
85e6fe83 6011
65202027 6012NV
864dbfa3 6013Perl_sv_nv(pTHX_ register SV *sv)
79072805 6014{
ff68c719 6015 if (SvNOK(sv))
6016 return SvNVX(sv);
6017 return sv_2nv(sv);
79072805 6018}
79072805 6019
79072805 6020char *
864dbfa3 6021Perl_sv_pv(pTHX_ SV *sv)
1fa8b10d
JD
6022{
6023 STRLEN n_a;
6024
6025 if (SvPOK(sv))
6026 return SvPVX(sv);
6027
6028 return sv_2pv(sv, &n_a);
6029}
6030
6031char *
864dbfa3 6032Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 6033{
85e6fe83
LW
6034 if (SvPOK(sv)) {
6035 *lp = SvCUR(sv);
a0d0e21e 6036 return SvPVX(sv);
85e6fe83 6037 }
463ee0b2 6038 return sv_2pv(sv, lp);
79072805 6039}
79072805 6040
c461cf8f
JH
6041/*
6042=for apidoc sv_pvn_force
6043
6044Get a sensible string out of the SV somehow.
6045
6046=cut
6047*/
6048
a0d0e21e 6049char *
864dbfa3 6050Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
a0d0e21e
LW
6051{
6052 char *s;
6053
6fc92669
GS
6054 if (SvTHINKFIRST(sv) && !SvROK(sv))
6055 sv_force_normal(sv);
1c846c1f 6056
a0d0e21e
LW
6057 if (SvPOK(sv)) {
6058 *lp = SvCUR(sv);
6059 }
6060 else {
748a9306 6061 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 6062 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
6fc92669 6063 PL_op_name[PL_op->op_type]);
a0d0e21e 6064 }
4633a7c4
LW
6065 else
6066 s = sv_2pv(sv, lp);
a0d0e21e
LW
6067 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
6068 STRLEN len = *lp;
1c846c1f 6069
a0d0e21e
LW
6070 if (SvROK(sv))
6071 sv_unref(sv);
6072 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
6073 SvGROW(sv, len + 1);
6074 Move(s,SvPVX(sv),len,char);
6075 SvCUR_set(sv, len);
6076 *SvEND(sv) = '\0';
6077 }
6078 if (!SvPOK(sv)) {
6079 SvPOK_on(sv); /* validate pointer */
6080 SvTAINT(sv);
1d7c1841
GS
6081 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
6082 PTR2UV(sv),SvPVX(sv)));
a0d0e21e
LW
6083 }
6084 }
6085 return SvPVX(sv);
6086}
6087
6088char *
7340a771
GS
6089Perl_sv_pvbyte(pTHX_ SV *sv)
6090{
6091 return sv_pv(sv);
6092}
6093
6094char *
6095Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
6096{
6097 return sv_pvn(sv,lp);
6098}
6099
6100char *
6101Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
6102{
6103 return sv_pvn_force(sv,lp);
6104}
6105
6106char *
6107Perl_sv_pvutf8(pTHX_ SV *sv)
6108{
560a288e 6109 sv_utf8_upgrade(sv);
7340a771
GS
6110 return sv_pv(sv);
6111}
6112
6113char *
6114Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
6115{
560a288e 6116 sv_utf8_upgrade(sv);
7340a771
GS
6117 return sv_pvn(sv,lp);
6118}
6119
c461cf8f
JH
6120/*
6121=for apidoc sv_pvutf8n_force
6122
6123Get a sensible UTF8-encoded string out of the SV somehow. See
6124L</sv_pvn_force>.
6125
6126=cut
6127*/
6128
7340a771
GS
6129char *
6130Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
6131{
560a288e 6132 sv_utf8_upgrade(sv);
7340a771
GS
6133 return sv_pvn_force(sv,lp);
6134}
6135
c461cf8f
JH
6136/*
6137=for apidoc sv_reftype
6138
6139Returns a string describing what the SV is a reference to.
6140
6141=cut
6142*/
6143
7340a771 6144char *
864dbfa3 6145Perl_sv_reftype(pTHX_ SV *sv, int ob)
a0d0e21e
LW
6146{
6147 if (ob && SvOBJECT(sv))
6148 return HvNAME(SvSTASH(sv));
6149 else {
6150 switch (SvTYPE(sv)) {
6151 case SVt_NULL:
6152 case SVt_IV:
6153 case SVt_NV:
6154 case SVt_RV:
6155 case SVt_PV:
6156 case SVt_PVIV:
6157 case SVt_PVNV:
6158 case SVt_PVMG:
6159 case SVt_PVBM:
6160 if (SvROK(sv))
6161 return "REF";
6162 else
6163 return "SCALAR";
6164 case SVt_PVLV: return "LVALUE";
6165 case SVt_PVAV: return "ARRAY";
6166 case SVt_PVHV: return "HASH";
6167 case SVt_PVCV: return "CODE";
6168 case SVt_PVGV: return "GLOB";
1d2dff63 6169 case SVt_PVFM: return "FORMAT";
27f9d8f3 6170 case SVt_PVIO: return "IO";
a0d0e21e
LW
6171 default: return "UNKNOWN";
6172 }
6173 }
6174}
6175
954c1994
GS
6176/*
6177=for apidoc sv_isobject
6178
6179Returns a boolean indicating whether the SV is an RV pointing to a blessed
6180object. If the SV is not an RV, or if the object is not blessed, then this
6181will return false.
6182
6183=cut
6184*/
6185
463ee0b2 6186int
864dbfa3 6187Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 6188{
68dc0745 6189 if (!sv)
6190 return 0;
6191 if (SvGMAGICAL(sv))
6192 mg_get(sv);
85e6fe83
LW
6193 if (!SvROK(sv))
6194 return 0;
6195 sv = (SV*)SvRV(sv);
6196 if (!SvOBJECT(sv))
6197 return 0;
6198 return 1;
6199}
6200
954c1994
GS
6201/*
6202=for apidoc sv_isa
6203
6204Returns a boolean indicating whether the SV is blessed into the specified
6205class. This does not check for subtypes; use C<sv_derived_from> to verify
6206an inheritance relationship.
6207
6208=cut
6209*/
6210
85e6fe83 6211int
864dbfa3 6212Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 6213{
68dc0745 6214 if (!sv)
6215 return 0;
6216 if (SvGMAGICAL(sv))
6217 mg_get(sv);
ed6116ce 6218 if (!SvROK(sv))
463ee0b2 6219 return 0;
ed6116ce
LW
6220 sv = (SV*)SvRV(sv);
6221 if (!SvOBJECT(sv))
463ee0b2
LW
6222 return 0;
6223
6224 return strEQ(HvNAME(SvSTASH(sv)), name);
6225}
6226
954c1994
GS
6227/*
6228=for apidoc newSVrv
6229
6230Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
6231it will be upgraded to one. If C<classname> is non-null then the new SV will
6232be blessed in the specified package. The new SV is returned and its
6233reference count is 1.
6234
6235=cut
6236*/
6237
463ee0b2 6238SV*
864dbfa3 6239Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 6240{
463ee0b2
LW
6241 SV *sv;
6242
4561caa4 6243 new_SV(sv);
51cf62d8 6244
2213622d 6245 SV_CHECK_THINKFIRST(rv);
51cf62d8 6246 SvAMAGIC_off(rv);
51cf62d8 6247
0199fce9
JD
6248 if (SvTYPE(rv) >= SVt_PVMG) {
6249 U32 refcnt = SvREFCNT(rv);
6250 SvREFCNT(rv) = 0;
6251 sv_clear(rv);
6252 SvFLAGS(rv) = 0;
6253 SvREFCNT(rv) = refcnt;
6254 }
6255
51cf62d8 6256 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
6257 sv_upgrade(rv, SVt_RV);
6258 else if (SvTYPE(rv) > SVt_RV) {
6259 (void)SvOOK_off(rv);
6260 if (SvPVX(rv) && SvLEN(rv))
6261 Safefree(SvPVX(rv));
6262 SvCUR_set(rv, 0);
6263 SvLEN_set(rv, 0);
6264 }
51cf62d8
OT
6265
6266 (void)SvOK_off(rv);
053fc874 6267 SvRV(rv) = sv;
ed6116ce 6268 SvROK_on(rv);
463ee0b2 6269
a0d0e21e
LW
6270 if (classname) {
6271 HV* stash = gv_stashpv(classname, TRUE);
6272 (void)sv_bless(rv, stash);
6273 }
6274 return sv;
6275}
6276
954c1994
GS
6277/*
6278=for apidoc sv_setref_pv
6279
6280Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
6281argument will be upgraded to an RV. That RV will be modified to point to
6282the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
6283into the SV. The C<classname> argument indicates the package for the
6284blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
6285will be returned and will have a reference count of 1.
6286
6287Do not use with other Perl types such as HV, AV, SV, CV, because those
6288objects will become corrupted by the pointer copy process.
6289
6290Note that C<sv_setref_pvn> copies the string while this copies the pointer.
6291
6292=cut
6293*/
6294
a0d0e21e 6295SV*
864dbfa3 6296Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 6297{
189b2af5 6298 if (!pv) {
3280af22 6299 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
6300 SvSETMAGIC(rv);
6301 }
a0d0e21e 6302 else
56431972 6303 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
6304 return rv;
6305}
6306
954c1994
GS
6307/*
6308=for apidoc sv_setref_iv
6309
6310Copies an integer into a new SV, optionally blessing the SV. The C<rv>
6311argument will be upgraded to an RV. That RV will be modified to point to
6312the new SV. The C<classname> argument indicates the package for the
6313blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
6314will be returned and will have a reference count of 1.
6315
6316=cut
6317*/
6318
a0d0e21e 6319SV*
864dbfa3 6320Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
6321{
6322 sv_setiv(newSVrv(rv,classname), iv);
6323 return rv;
6324}
6325
954c1994
GS
6326/*
6327=for apidoc sv_setref_nv
6328
6329Copies a double into a new SV, optionally blessing the SV. The C<rv>
6330argument will be upgraded to an RV. That RV will be modified to point to
6331the new SV. The C<classname> argument indicates the package for the
6332blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
6333will be returned and will have a reference count of 1.
6334
6335=cut
6336*/
6337
a0d0e21e 6338SV*
65202027 6339Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
6340{
6341 sv_setnv(newSVrv(rv,classname), nv);
6342 return rv;
6343}
463ee0b2 6344
954c1994
GS
6345/*
6346=for apidoc sv_setref_pvn
6347
6348Copies a string into a new SV, optionally blessing the SV. The length of the
6349string must be specified with C<n>. The C<rv> argument will be upgraded to
6350an RV. That RV will be modified to point to the new SV. The C<classname>
6351argument indicates the package for the blessing. Set C<classname> to
6352C<Nullch> to avoid the blessing. The new SV will be returned and will have
6353a reference count of 1.
6354
6355Note that C<sv_setref_pv> copies the pointer while this copies the string.
6356
6357=cut
6358*/
6359
a0d0e21e 6360SV*
864dbfa3 6361Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
6362{
6363 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
6364 return rv;
6365}
6366
954c1994
GS
6367/*
6368=for apidoc sv_bless
6369
6370Blesses an SV into a specified package. The SV must be an RV. The package
6371must be designated by its stash (see C<gv_stashpv()>). The reference count
6372of the SV is unaffected.
6373
6374=cut
6375*/
6376
a0d0e21e 6377SV*
864dbfa3 6378Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 6379{
76e3520e 6380 SV *tmpRef;
a0d0e21e 6381 if (!SvROK(sv))
cea2e8a9 6382 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
6383 tmpRef = SvRV(sv);
6384 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
6385 if (SvREADONLY(tmpRef))
cea2e8a9 6386 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
6387 if (SvOBJECT(tmpRef)) {
6388 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 6389 --PL_sv_objcount;
76e3520e 6390 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 6391 }
a0d0e21e 6392 }
76e3520e
GS
6393 SvOBJECT_on(tmpRef);
6394 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 6395 ++PL_sv_objcount;
76e3520e
GS
6396 (void)SvUPGRADE(tmpRef, SVt_PVMG);
6397 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
a0d0e21e 6398
2e3febc6
CS
6399 if (Gv_AMG(stash))
6400 SvAMAGIC_on(sv);
6401 else
6402 SvAMAGIC_off(sv);
a0d0e21e
LW
6403
6404 return sv;
6405}
6406
76e3520e 6407STATIC void
cea2e8a9 6408S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 6409{
850fabdf
GS
6410 void *xpvmg;
6411
a0d0e21e
LW
6412 assert(SvTYPE(sv) == SVt_PVGV);
6413 SvFAKE_off(sv);
6414 if (GvGP(sv))
1edc1566 6415 gp_free((GV*)sv);
e826b3c7
GS
6416 if (GvSTASH(sv)) {
6417 SvREFCNT_dec(GvSTASH(sv));
6418 GvSTASH(sv) = Nullhv;
6419 }
a0d0e21e
LW
6420 sv_unmagic(sv, '*');
6421 Safefree(GvNAME(sv));
a5f75d66 6422 GvMULTI_off(sv);
850fabdf
GS
6423
6424 /* need to keep SvANY(sv) in the right arena */
6425 xpvmg = new_XPVMG();
6426 StructCopy(SvANY(sv), xpvmg, XPVMG);
6427 del_XPVGV(SvANY(sv));
6428 SvANY(sv) = xpvmg;
6429
a0d0e21e
LW
6430 SvFLAGS(sv) &= ~SVTYPEMASK;
6431 SvFLAGS(sv) |= SVt_PVMG;
6432}
6433
954c1994 6434/*
840a7b70 6435=for apidoc sv_unref_flags
954c1994
GS
6436
6437Unsets the RV status of the SV, and decrements the reference count of
6438whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
6439as a reversal of C<newSVrv>. The C<cflags> argument can contain
6440C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
6441(otherwise the decrementing is conditional on the reference count being
6442different from one or the reference being a readonly SV).
7889fe52 6443See C<SvROK_off>.
954c1994
GS
6444
6445=cut
6446*/
6447
ed6116ce 6448void
840a7b70 6449Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 6450{
a0d0e21e 6451 SV* rv = SvRV(sv);
810b8aa5
GS
6452
6453 if (SvWEAKREF(sv)) {
6454 sv_del_backref(sv);
6455 SvWEAKREF_off(sv);
6456 SvRV(sv) = 0;
6457 return;
6458 }
ed6116ce
LW
6459 SvRV(sv) = 0;
6460 SvROK_off(sv);
840a7b70 6461 if (SvREFCNT(rv) != 1 || SvREADONLY(rv) || flags) /* SV_IMMEDIATE_UNREF */
4633a7c4 6462 SvREFCNT_dec(rv);
840a7b70 6463 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 6464 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 6465}
8990e307 6466
840a7b70
IZ
6467/*
6468=for apidoc sv_unref
6469
6470Unsets the RV status of the SV, and decrements the reference count of
6471whatever was being referenced by the RV. This can almost be thought of
6472as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 6473being zero. See C<SvROK_off>.
840a7b70
IZ
6474
6475=cut
6476*/
6477
6478void
6479Perl_sv_unref(pTHX_ SV *sv)
6480{
6481 sv_unref_flags(sv, 0);
6482}
6483
bbce6d69 6484void
864dbfa3 6485Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 6486{
6487 sv_magic((sv), Nullsv, 't', Nullch, 0);
6488}
6489
6490void
864dbfa3 6491Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 6492{
13f57bf8 6493 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
36477c24 6494 MAGIC *mg = mg_find(sv, 't');
6495 if (mg)
565764a8 6496 mg->mg_len &= ~1;
36477c24 6497 }
bbce6d69 6498}
6499
6500bool
864dbfa3 6501Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 6502{
13f57bf8 6503 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
36477c24 6504 MAGIC *mg = mg_find(sv, 't');
155aba94 6505 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 6506 return TRUE;
6507 }
6508 return FALSE;
bbce6d69 6509}
6510
954c1994
GS
6511/*
6512=for apidoc sv_setpviv
6513
6514Copies an integer into the given SV, also updating its string value.
6515Does not handle 'set' magic. See C<sv_setpviv_mg>.
6516
6517=cut
6518*/
6519
84902520 6520void
864dbfa3 6521Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
84902520 6522{
25da4f38
IZ
6523 char buf[TYPE_CHARS(UV)];
6524 char *ebuf;
6525 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
84902520 6526
25da4f38 6527 sv_setpvn(sv, ptr, ebuf - ptr);
84902520
TB
6528}
6529
ef50df4b 6530
954c1994
GS
6531/*
6532=for apidoc sv_setpviv_mg
6533
6534Like C<sv_setpviv>, but also handles 'set' magic.
6535
6536=cut
6537*/
6538
ef50df4b 6539void
864dbfa3 6540Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
ef50df4b 6541{
25da4f38
IZ
6542 char buf[TYPE_CHARS(UV)];
6543 char *ebuf;
6544 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
6545
6546 sv_setpvn(sv, ptr, ebuf - ptr);
ef50df4b
GS
6547 SvSETMAGIC(sv);
6548}
6549
cea2e8a9
GS
6550#if defined(PERL_IMPLICIT_CONTEXT)
6551void
6552Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
6553{
6554 dTHX;
6555 va_list args;
6556 va_start(args, pat);
c5be433b 6557 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
6558 va_end(args);
6559}
6560
6561
6562void
6563Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
6564{
6565 dTHX;
6566 va_list args;
6567 va_start(args, pat);
c5be433b 6568 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 6569 va_end(args);
cea2e8a9
GS
6570}
6571#endif
6572
954c1994
GS
6573/*
6574=for apidoc sv_setpvf
6575
6576Processes its arguments like C<sprintf> and sets an SV to the formatted
6577output. Does not handle 'set' magic. See C<sv_setpvf_mg>.
6578
6579=cut
6580*/
6581
46fc3d4c 6582void
864dbfa3 6583Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 6584{
6585 va_list args;
46fc3d4c 6586 va_start(args, pat);
c5be433b 6587 sv_vsetpvf(sv, pat, &args);
46fc3d4c 6588 va_end(args);
6589}
6590
c5be433b
GS
6591void
6592Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
6593{
6594 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
6595}
ef50df4b 6596
954c1994
GS
6597/*
6598=for apidoc sv_setpvf_mg
6599
6600Like C<sv_setpvf>, but also handles 'set' magic.
6601
6602=cut
6603*/
6604
ef50df4b 6605void
864dbfa3 6606Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
6607{
6608 va_list args;
ef50df4b 6609 va_start(args, pat);
c5be433b 6610 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 6611 va_end(args);
c5be433b
GS
6612}
6613
6614void
6615Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
6616{
6617 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
6618 SvSETMAGIC(sv);
6619}
6620
cea2e8a9
GS
6621#if defined(PERL_IMPLICIT_CONTEXT)
6622void
6623Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
6624{
6625 dTHX;
6626 va_list args;
6627 va_start(args, pat);
c5be433b 6628 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
6629 va_end(args);
6630}
6631
6632void
6633Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
6634{
6635 dTHX;
6636 va_list args;
6637 va_start(args, pat);
c5be433b 6638 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 6639 va_end(args);
cea2e8a9
GS
6640}
6641#endif
6642
954c1994
GS
6643/*
6644=for apidoc sv_catpvf
6645
6646Processes its arguments like C<sprintf> and appends the formatted output
6647to an SV. Handles 'get' magic, but not 'set' magic. C<SvSETMAGIC()> must
6648typically be called after calling this function to handle 'set' magic.
6649
6650=cut
6651*/
6652
46fc3d4c 6653void
864dbfa3 6654Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 6655{
6656 va_list args;
46fc3d4c 6657 va_start(args, pat);
c5be433b 6658 sv_vcatpvf(sv, pat, &args);
46fc3d4c 6659 va_end(args);
6660}
6661
ef50df4b 6662void
c5be433b
GS
6663Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
6664{
6665 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
6666}
6667
954c1994
GS
6668/*
6669=for apidoc sv_catpvf_mg
6670
6671Like C<sv_catpvf>, but also handles 'set' magic.
6672
6673=cut
6674*/
6675
c5be433b 6676void
864dbfa3 6677Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
6678{
6679 va_list args;
ef50df4b 6680 va_start(args, pat);
c5be433b 6681 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 6682 va_end(args);
c5be433b
GS
6683}
6684
6685void
6686Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
6687{
6688 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
6689 SvSETMAGIC(sv);
6690}
6691
954c1994
GS
6692/*
6693=for apidoc sv_vsetpvfn
6694
6695Works like C<vcatpvfn> but copies the text into the SV instead of
6696appending it.
6697
6698=cut
6699*/
6700
46fc3d4c 6701void
7d5ea4e7 6702Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 6703{
6704 sv_setpvn(sv, "", 0);
7d5ea4e7 6705 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 6706}
6707
211dfcf1 6708I32
9dd79c3f 6709S_expect_number(pTHX_ char** pattern)
211dfcf1
HS
6710{
6711 I32 var = 0;
6712 switch (**pattern) {
6713 case '1': case '2': case '3':
6714 case '4': case '5': case '6':
6715 case '7': case '8': case '9':
6716 while (isDIGIT(**pattern))
6717 var = var * 10 + (*(*pattern)++ - '0');
6718 }
6719 return var;
6720}
9dd79c3f 6721#define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
211dfcf1 6722
954c1994
GS
6723/*
6724=for apidoc sv_vcatpvfn
6725
6726Processes its arguments like C<vsprintf> and appends the formatted output
6727to an SV. Uses an array of SVs if the C style variable argument list is
6728missing (NULL). When running with taint checks enabled, indicates via
6729C<maybe_tainted> if results are untrustworthy (often due to the use of
6730locales).
6731
6732=cut
6733*/
6734
46fc3d4c 6735void
7d5ea4e7 6736Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 6737{
6738 char *p;
6739 char *q;
6740 char *patend;
fc36a67e 6741 STRLEN origlen;
46fc3d4c 6742 I32 svix = 0;
c635e13b 6743 static char nullstr[] = "(null)";
7e2040f0 6744 SV *argsv;
46fc3d4c 6745
6746 /* no matter what, this is a string now */
fc36a67e 6747 (void)SvPV_force(sv, origlen);
46fc3d4c 6748
fc36a67e 6749 /* special-case "", "%s", and "%_" */
46fc3d4c 6750 if (patlen == 0)
6751 return;
fc36a67e 6752 if (patlen == 2 && pat[0] == '%') {
6753 switch (pat[1]) {
6754 case 's':
c635e13b 6755 if (args) {
6756 char *s = va_arg(*args, char*);
6757 sv_catpv(sv, s ? s : nullstr);
6758 }
7e2040f0 6759 else if (svix < svmax) {
fc36a67e 6760 sv_catsv(sv, *svargs);
7e2040f0
GS
6761 if (DO_UTF8(*svargs))
6762 SvUTF8_on(sv);
6763 }
fc36a67e 6764 return;
6765 case '_':
6766 if (args) {
7e2040f0
GS
6767 argsv = va_arg(*args, SV*);
6768 sv_catsv(sv, argsv);
6769 if (DO_UTF8(argsv))
6770 SvUTF8_on(sv);
fc36a67e 6771 return;
6772 }
6773 /* See comment on '_' below */
6774 break;
6775 }
46fc3d4c 6776 }
6777
6778 patend = (char*)pat + patlen;
6779 for (p = (char*)pat; p < patend; p = q) {
6780 bool alt = FALSE;
6781 bool left = FALSE;
b22c7a20 6782 bool vectorize = FALSE;
211dfcf1 6783 bool vectorarg = FALSE;
b2e23cf9 6784 bool vec_utf = FALSE;
46fc3d4c 6785 char fill = ' ';
6786 char plus = 0;
6787 char intsize = 0;
6788 STRLEN width = 0;
fc36a67e 6789 STRLEN zeros = 0;
46fc3d4c 6790 bool has_precis = FALSE;
6791 STRLEN precis = 0;
7e2040f0 6792 bool is_utf = FALSE;
eb3fce90 6793
46fc3d4c 6794 char esignbuf[4];
ad391ad9 6795 U8 utf8buf[UTF8_MAXLEN+1];
46fc3d4c 6796 STRLEN esignlen = 0;
6797
6798 char *eptr = Nullch;
fc36a67e 6799 STRLEN elen = 0;
089c015b
JH
6800 /* Times 4: a decimal digit takes more than 3 binary digits.
6801 * NV_DIG: mantissa takes than many decimal digits.
6802 * Plus 32: Playing safe. */
6803 char ebuf[IV_DIG * 4 + NV_DIG + 32];
2d4389e4
JH
6804 /* large enough for "%#.#f" --chip */
6805 /* what about long double NVs? --jhi */
b22c7a20
GS
6806
6807 SV *vecsv;
a05b299f 6808 U8 *vecstr = Null(U8*);
b22c7a20 6809 STRLEN veclen = 0;
46fc3d4c 6810 char c;
6811 int i;
6812 unsigned base;
6813 IV iv;
6814 UV uv;
65202027 6815 NV nv;
46fc3d4c 6816 STRLEN have;
6817 STRLEN need;
6818 STRLEN gap;
b22c7a20
GS
6819 char *dotstr = ".";
6820 STRLEN dotstrlen = 1;
211dfcf1 6821 I32 efix = 0; /* explicit format parameter index */
eb3fce90 6822 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
6823 I32 epix = 0; /* explicit precision index */
6824 I32 evix = 0; /* explicit vector index */
eb3fce90 6825 bool asterisk = FALSE;
46fc3d4c 6826
211dfcf1 6827 /* echo everything up to the next format specification */
46fc3d4c 6828 for (q = p; q < patend && *q != '%'; ++q) ;
6829 if (q > p) {
6830 sv_catpvn(sv, p, q - p);
6831 p = q;
6832 }
6833 if (q++ >= patend)
6834 break;
6835
211dfcf1
HS
6836/*
6837 We allow format specification elements in this order:
6838 \d+\$ explicit format parameter index
6839 [-+ 0#]+ flags
6840 \*?(\d+\$)?v vector with optional (optionally specified) arg
6841 \d+|\*(\d+\$)? width using optional (optionally specified) arg
6842 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
6843 [hlqLV] size
6844 [%bcdefginopsux_DFOUX] format (mandatory)
6845*/
6846 if (EXPECT_NUMBER(q, width)) {
6847 if (*q == '$') {
6848 ++q;
6849 efix = width;
6850 } else {
6851 goto gotwidth;
6852 }
6853 }
6854
fc36a67e 6855 /* FLAGS */
6856
46fc3d4c 6857 while (*q) {
6858 switch (*q) {
6859 case ' ':
6860 case '+':
6861 plus = *q++;
6862 continue;
6863
6864 case '-':
6865 left = TRUE;
6866 q++;
6867 continue;
6868
6869 case '0':
6870 fill = *q++;
6871 continue;
6872
6873 case '#':
6874 alt = TRUE;
6875 q++;
6876 continue;
6877
fc36a67e 6878 default:
6879 break;
6880 }
6881 break;
6882 }
46fc3d4c 6883
211dfcf1 6884 tryasterisk:
eb3fce90 6885 if (*q == '*') {
211dfcf1
HS
6886 q++;
6887 if (EXPECT_NUMBER(q, ewix))
6888 if (*q++ != '$')
6889 goto unknown;
eb3fce90 6890 asterisk = TRUE;
211dfcf1
HS
6891 }
6892 if (*q == 'v') {
eb3fce90 6893 q++;
211dfcf1
HS
6894 if (vectorize)
6895 goto unknown;
6896 if (vectorarg = asterisk) {
6897 evix = ewix;
6898 ewix = 0;
6899 asterisk = FALSE;
6900 }
6901 vectorize = TRUE;
6902 goto tryasterisk;
eb3fce90
JH
6903 }
6904
211dfcf1
HS
6905 if (!asterisk)
6906 EXPECT_NUMBER(q, width);
6907
6908 if (vectorize) {
6909 if (vectorarg) {
6910 if (args)
6911 vecsv = va_arg(*args, SV*);
6912 else
6913 vecsv = (evix ? evix <= svmax : svix < svmax) ?
6914 svargs[ewix ? ewix-1 : svix++] : &PL_sv_undef;
4459522c 6915 dotstr = SvPVx(vecsv, dotstrlen);
211dfcf1
HS
6916 if (DO_UTF8(vecsv))
6917 is_utf = TRUE;
6918 }
6919 if (args) {
6920 vecsv = va_arg(*args, SV*);
6921 vecstr = (U8*)SvPVx(vecsv,veclen);
b2e23cf9 6922 vec_utf = DO_UTF8(vecsv);
eb3fce90 6923 }
211dfcf1
HS
6924 else if (efix ? efix <= svmax : svix < svmax) {
6925 vecsv = svargs[efix ? efix-1 : svix++];
6926 vecstr = (U8*)SvPVx(vecsv,veclen);
b2e23cf9 6927 vec_utf = DO_UTF8(vecsv);
211dfcf1
HS
6928 }
6929 else {
6930 vecstr = (U8*)"";
6931 veclen = 0;
6932 }
eb3fce90 6933 }
fc36a67e 6934
eb3fce90 6935 if (asterisk) {
fc36a67e 6936 if (args)
6937 i = va_arg(*args, int);
6938 else
eb3fce90
JH
6939 i = (ewix ? ewix <= svmax : svix < svmax) ?
6940 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 6941 left |= (i < 0);
6942 width = (i < 0) ? -i : i;
fc36a67e 6943 }
211dfcf1 6944 gotwidth:
fc36a67e 6945
6946 /* PRECISION */
46fc3d4c 6947
fc36a67e 6948 if (*q == '.') {
6949 q++;
6950 if (*q == '*') {
211dfcf1
HS
6951 q++;
6952 if (EXPECT_NUMBER(q, epix) && *q++ != '$')
6953 goto unknown;
46fc3d4c 6954 if (args)
6955 i = va_arg(*args, int);
6956 else
eb3fce90
JH
6957 i = (ewix ? ewix <= svmax : svix < svmax)
6958 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 6959 precis = (i < 0) ? 0 : i;
fc36a67e 6960 }
6961 else {
6962 precis = 0;
6963 while (isDIGIT(*q))
6964 precis = precis * 10 + (*q++ - '0');
6965 }
6966 has_precis = TRUE;
6967 }
46fc3d4c 6968
fc36a67e 6969 /* SIZE */
46fc3d4c 6970
fc36a67e 6971 switch (*q) {
e5c81feb 6972#if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
6f9bb7fd 6973 case 'L': /* Ld */
e5c81feb
JH
6974 /* FALL THROUGH */
6975#endif
6976#ifdef HAS_QUAD
6f9bb7fd
GS
6977 case 'q': /* qd */
6978 intsize = 'q';
6979 q++;
6980 break;
6981#endif
fc36a67e 6982 case 'l':
e5c81feb
JH
6983#if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
6984 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 6985 intsize = 'q';
6986 q += 2;
46fc3d4c 6987 break;
cf2093f6 6988 }
fc36a67e 6989#endif
6f9bb7fd 6990 /* FALL THROUGH */
fc36a67e 6991 case 'h':
cf2093f6 6992 /* FALL THROUGH */
fc36a67e 6993 case 'V':
6994 intsize = *q++;
46fc3d4c 6995 break;
6996 }
6997
fc36a67e 6998 /* CONVERSION */
6999
211dfcf1
HS
7000 if (*q == '%') {
7001 eptr = q++;
7002 elen = 1;
7003 goto string;
7004 }
7005
7006 if (!args)
7007 argsv = (efix ? efix <= svmax : svix < svmax) ?
7008 svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
7009
46fc3d4c 7010 switch (c = *q++) {
7011
7012 /* STRINGS */
7013
46fc3d4c 7014 case 'c':
211dfcf1 7015 uv = args ? va_arg(*args, int) : SvIVx(argsv);
3969a896 7016 if ((uv > 255 || (uv > 127 && SvUTF8(sv))) && !IN_BYTE) {
dfe13c55
GS
7017 eptr = (char*)utf8buf;
7018 elen = uv_to_utf8((U8*)eptr, uv) - utf8buf;
7e2040f0
GS
7019 is_utf = TRUE;
7020 }
7021 else {
7022 c = (char)uv;
7023 eptr = &c;
7024 elen = 1;
a0ed51b3 7025 }
46fc3d4c 7026 goto string;
7027
46fc3d4c 7028 case 's':
7029 if (args) {
fc36a67e 7030 eptr = va_arg(*args, char*);
c635e13b 7031 if (eptr)
1d7c1841
GS
7032#ifdef MACOS_TRADITIONAL
7033 /* On MacOS, %#s format is used for Pascal strings */
7034 if (alt)
7035 elen = *eptr++;
7036 else
7037#endif
c635e13b 7038 elen = strlen(eptr);
7039 else {
7040 eptr = nullstr;
7041 elen = sizeof nullstr - 1;
7042 }
46fc3d4c 7043 }
211dfcf1 7044 else {
7e2040f0
GS
7045 eptr = SvPVx(argsv, elen);
7046 if (DO_UTF8(argsv)) {
a0ed51b3
LW
7047 if (has_precis && precis < elen) {
7048 I32 p = precis;
7e2040f0 7049 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
7050 precis = p;
7051 }
7052 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 7053 width += elen - sv_len_utf8(argsv);
a0ed51b3 7054 }
7e2040f0 7055 is_utf = TRUE;
a0ed51b3
LW
7056 }
7057 }
46fc3d4c 7058 goto string;
7059
fc36a67e 7060 case '_':
7061 /*
7062 * The "%_" hack might have to be changed someday,
7063 * if ISO or ANSI decide to use '_' for something.
7064 * So we keep it hidden from users' code.
7065 */
7066 if (!args)
7067 goto unknown;
211dfcf1 7068 argsv = va_arg(*args, SV*);
7e2040f0
GS
7069 eptr = SvPVx(argsv, elen);
7070 if (DO_UTF8(argsv))
7071 is_utf = TRUE;
fc36a67e 7072
46fc3d4c 7073 string:
b22c7a20 7074 vectorize = FALSE;
46fc3d4c 7075 if (has_precis && elen > precis)
7076 elen = precis;
7077 break;
7078
7079 /* INTEGERS */
7080
fc36a67e 7081 case 'p':
c2e66d9e
GS
7082 if (alt)
7083 goto unknown;
211dfcf1 7084 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 7085 base = 16;
7086 goto integer;
7087
46fc3d4c 7088 case 'D':
29fe7a80 7089#ifdef IV_IS_QUAD
22f3ae8c 7090 intsize = 'q';
29fe7a80 7091#else
46fc3d4c 7092 intsize = 'l';
29fe7a80 7093#endif
46fc3d4c 7094 /* FALL THROUGH */
7095 case 'd':
7096 case 'i':
b22c7a20 7097 if (vectorize) {
ba210ebe 7098 STRLEN ulen;
211dfcf1
HS
7099 if (!veclen)
7100 continue;
b2e23cf9 7101 if (vec_utf)
dcad2880 7102 iv = (IV)utf8_to_uv(vecstr, veclen, &ulen, 0);
b22c7a20 7103 else {
a05b299f 7104 iv = *vecstr;
b22c7a20
GS
7105 ulen = 1;
7106 }
7107 vecstr += ulen;
7108 veclen -= ulen;
7109 }
7110 else if (args) {
46fc3d4c 7111 switch (intsize) {
7112 case 'h': iv = (short)va_arg(*args, int); break;
7113 default: iv = va_arg(*args, int); break;
7114 case 'l': iv = va_arg(*args, long); break;
fc36a67e 7115 case 'V': iv = va_arg(*args, IV); break;
cf2093f6
JH
7116#ifdef HAS_QUAD
7117 case 'q': iv = va_arg(*args, Quad_t); break;
7118#endif
46fc3d4c 7119 }
7120 }
7121 else {
211dfcf1 7122 iv = SvIVx(argsv);
46fc3d4c 7123 switch (intsize) {
7124 case 'h': iv = (short)iv; break;
be28567c 7125 default: break;
46fc3d4c 7126 case 'l': iv = (long)iv; break;
fc36a67e 7127 case 'V': break;
cf2093f6
JH
7128#ifdef HAS_QUAD
7129 case 'q': iv = (Quad_t)iv; break;
7130#endif
46fc3d4c 7131 }
7132 }
7133 if (iv >= 0) {
7134 uv = iv;
7135 if (plus)
7136 esignbuf[esignlen++] = plus;
7137 }
7138 else {
7139 uv = -iv;
7140 esignbuf[esignlen++] = '-';
7141 }
7142 base = 10;
7143 goto integer;
7144
fc36a67e 7145 case 'U':
29fe7a80 7146#ifdef IV_IS_QUAD
22f3ae8c 7147 intsize = 'q';
29fe7a80 7148#else
fc36a67e 7149 intsize = 'l';
29fe7a80 7150#endif
fc36a67e 7151 /* FALL THROUGH */
7152 case 'u':
7153 base = 10;
7154 goto uns_integer;
7155
4f19785b
WSI
7156 case 'b':
7157 base = 2;
7158 goto uns_integer;
7159
46fc3d4c 7160 case 'O':
29fe7a80 7161#ifdef IV_IS_QUAD
22f3ae8c 7162 intsize = 'q';
29fe7a80 7163#else
46fc3d4c 7164 intsize = 'l';
29fe7a80 7165#endif
46fc3d4c 7166 /* FALL THROUGH */
7167 case 'o':
7168 base = 8;
7169 goto uns_integer;
7170
7171 case 'X':
46fc3d4c 7172 case 'x':
7173 base = 16;
46fc3d4c 7174
7175 uns_integer:
b22c7a20 7176 if (vectorize) {
ba210ebe 7177 STRLEN ulen;
b22c7a20 7178 vector:
211dfcf1
HS
7179 if (!veclen)
7180 continue;
b2e23cf9 7181 if (vec_utf)
dcad2880 7182 uv = utf8_to_uv(vecstr, veclen, &ulen, 0);
b22c7a20 7183 else {
a05b299f 7184 uv = *vecstr;
b22c7a20
GS
7185 ulen = 1;
7186 }
7187 vecstr += ulen;
7188 veclen -= ulen;
7189 }
7190 else if (args) {
46fc3d4c 7191 switch (intsize) {
7192 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
7193 default: uv = va_arg(*args, unsigned); break;
7194 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 7195 case 'V': uv = va_arg(*args, UV); break;
cf2093f6
JH
7196#ifdef HAS_QUAD
7197 case 'q': uv = va_arg(*args, Quad_t); break;
7198#endif
46fc3d4c 7199 }
7200 }
7201 else {
211dfcf1 7202 uv = SvUVx(argsv);
46fc3d4c 7203 switch (intsize) {
7204 case 'h': uv = (unsigned short)uv; break;
be28567c 7205 default: break;
46fc3d4c 7206 case 'l': uv = (unsigned long)uv; break;
fc36a67e 7207 case 'V': break;
cf2093f6
JH
7208#ifdef HAS_QUAD
7209 case 'q': uv = (Quad_t)uv; break;
7210#endif
46fc3d4c 7211 }
7212 }
7213
7214 integer:
46fc3d4c 7215 eptr = ebuf + sizeof ebuf;
fc36a67e 7216 switch (base) {
7217 unsigned dig;
7218 case 16:
c10ed8b9
HS
7219 if (!uv)
7220 alt = FALSE;
1d7c1841
GS
7221 p = (char*)((c == 'X')
7222 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 7223 do {
7224 dig = uv & 15;
7225 *--eptr = p[dig];
7226 } while (uv >>= 4);
7227 if (alt) {
46fc3d4c 7228 esignbuf[esignlen++] = '0';
fc36a67e 7229 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 7230 }
fc36a67e 7231 break;
7232 case 8:
7233 do {
7234 dig = uv & 7;
7235 *--eptr = '0' + dig;
7236 } while (uv >>= 3);
7237 if (alt && *eptr != '0')
7238 *--eptr = '0';
7239 break;
4f19785b
WSI
7240 case 2:
7241 do {
7242 dig = uv & 1;
7243 *--eptr = '0' + dig;
7244 } while (uv >>= 1);
eda88b6d
JH
7245 if (alt) {
7246 esignbuf[esignlen++] = '0';
7481bb52 7247 esignbuf[esignlen++] = 'b';
eda88b6d 7248 }
4f19785b 7249 break;
fc36a67e 7250 default: /* it had better be ten or less */
6bc102ca 7251#if defined(PERL_Y2KWARN)
e476b1b5 7252 if (ckWARN(WARN_Y2K)) {
6bc102ca
GS
7253 STRLEN n;
7254 char *s = SvPV(sv,n);
7255 if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
7256 && (n == 2 || !isDIGIT(s[n-3])))
7257 {
e476b1b5 7258 Perl_warner(aTHX_ WARN_Y2K,
6bc102ca
GS
7259 "Possible Y2K bug: %%%c %s",
7260 c, "format string following '19'");
7261 }
7262 }
7263#endif
fc36a67e 7264 do {
7265 dig = uv % base;
7266 *--eptr = '0' + dig;
7267 } while (uv /= base);
7268 break;
46fc3d4c 7269 }
7270 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
7271 if (has_precis) {
7272 if (precis > elen)
7273 zeros = precis - elen;
7274 else if (precis == 0 && elen == 1 && *eptr == '0')
7275 elen = 0;
7276 }
46fc3d4c 7277 break;
7278
7279 /* FLOATING POINT */
7280
fc36a67e 7281 case 'F':
7282 c = 'f'; /* maybe %F isn't supported here */
7283 /* FALL THROUGH */
46fc3d4c 7284 case 'e': case 'E':
fc36a67e 7285 case 'f':
46fc3d4c 7286 case 'g': case 'G':
7287
7288 /* This is evil, but floating point is even more evil */
7289
b22c7a20 7290 vectorize = FALSE;
211dfcf1 7291 nv = args ? va_arg(*args, NV) : SvNVx(argsv);
fc36a67e 7292
7293 need = 0;
7294 if (c != 'e' && c != 'E') {
7295 i = PERL_INT_MIN;
73b309ea 7296 (void)Perl_frexp(nv, &i);
fc36a67e 7297 if (i == PERL_INT_MIN)
cea2e8a9 7298 Perl_die(aTHX_ "panic: frexp");
c635e13b 7299 if (i > 0)
fc36a67e 7300 need = BIT_DIGITS(i);
7301 }
7302 need += has_precis ? precis : 6; /* known default */
7303 if (need < width)
7304 need = width;
7305
46fc3d4c 7306 need += 20; /* fudge factor */
80252599
GS
7307 if (PL_efloatsize < need) {
7308 Safefree(PL_efloatbuf);
7309 PL_efloatsize = need + 20; /* more fudge */
7310 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 7311 PL_efloatbuf[0] = '\0';
46fc3d4c 7312 }
7313
7314 eptr = ebuf + sizeof ebuf;
7315 *--eptr = '\0';
7316 *--eptr = c;
e5c81feb 7317#if defined(USE_LONG_DOUBLE) && defined(PERL_PRIfldbl)
cf2093f6 7318 {
e5c81feb
JH
7319 /* Copy the one or more characters in a long double
7320 * format before the 'base' ([efgEFG]) character to
7321 * the format string. */
7322 static char const prifldbl[] = PERL_PRIfldbl;
7323 char const *p = prifldbl + sizeof(prifldbl) - 3;
7324 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 7325 }
65202027 7326#endif
46fc3d4c 7327 if (has_precis) {
7328 base = precis;
7329 do { *--eptr = '0' + (base % 10); } while (base /= 10);
7330 *--eptr = '.';
7331 }
7332 if (width) {
7333 base = width;
7334 do { *--eptr = '0' + (base % 10); } while (base /= 10);
7335 }
7336 if (fill == '0')
7337 *--eptr = fill;
84902520
TB
7338 if (left)
7339 *--eptr = '-';
46fc3d4c 7340 if (plus)
7341 *--eptr = plus;
7342 if (alt)
7343 *--eptr = '#';
7344 *--eptr = '%';
7345
ff9121f8
JH
7346 /* No taint. Otherwise we are in the strange situation
7347 * where printf() taints but print($float) doesn't.
bda0f7a5 7348 * --jhi */
dd8482fc 7349 (void)sprintf(PL_efloatbuf, eptr, nv);
8af02333 7350
80252599
GS
7351 eptr = PL_efloatbuf;
7352 elen = strlen(PL_efloatbuf);
46fc3d4c 7353 break;
7354
fc36a67e 7355 /* SPECIAL */
7356
7357 case 'n':
b22c7a20 7358 vectorize = FALSE;
fc36a67e 7359 i = SvCUR(sv) - origlen;
7360 if (args) {
c635e13b 7361 switch (intsize) {
7362 case 'h': *(va_arg(*args, short*)) = i; break;
7363 default: *(va_arg(*args, int*)) = i; break;
7364 case 'l': *(va_arg(*args, long*)) = i; break;
7365 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
7366#ifdef HAS_QUAD
7367 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
7368#endif
c635e13b 7369 }
fc36a67e 7370 }
9dd79c3f 7371 else
211dfcf1 7372 sv_setuv_mg(argsv, (UV)i);
fc36a67e 7373 continue; /* not "break" */
7374
7375 /* UNKNOWN */
7376
46fc3d4c 7377 default:
fc36a67e 7378 unknown:
b22c7a20 7379 vectorize = FALSE;
599cee73 7380 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 7381 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 7382 SV *msg = sv_newmortal();
cea2e8a9 7383 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %s: ",
533c011a 7384 (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
0f4b6630 7385 if (c) {
0f4b6630 7386 if (isPRINT(c))
1c846c1f 7387 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
7388 "\"%%%c\"", c & 0xFF);
7389 else
7390 Perl_sv_catpvf(aTHX_ msg,
57def98f 7391 "\"%%\\%03"UVof"\"",
0f4b6630 7392 (UV)c & 0xFF);
0f4b6630 7393 } else
c635e13b 7394 sv_catpv(msg, "end of string");
894356b3 7395 Perl_warner(aTHX_ WARN_PRINTF, "%"SVf, msg); /* yes, this is reentrant */
c635e13b 7396 }
fb73857a 7397
7398 /* output mangled stuff ... */
7399 if (c == '\0')
7400 --q;
46fc3d4c 7401 eptr = p;
7402 elen = q - p;
fb73857a 7403
7404 /* ... right here, because formatting flags should not apply */
7405 SvGROW(sv, SvCUR(sv) + elen + 1);
7406 p = SvEND(sv);
4459522c 7407 Copy(eptr, p, elen, char);
fb73857a 7408 p += elen;
7409 *p = '\0';
7410 SvCUR(sv) = p - SvPVX(sv);
7411 continue; /* not "break" */
46fc3d4c 7412 }
7413
fc36a67e 7414 have = esignlen + zeros + elen;
46fc3d4c 7415 need = (have > width ? have : width);
7416 gap = need - have;
7417
b22c7a20 7418 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 7419 p = SvEND(sv);
7420 if (esignlen && fill == '0') {
7421 for (i = 0; i < esignlen; i++)
7422 *p++ = esignbuf[i];
7423 }
7424 if (gap && !left) {
7425 memset(p, fill, gap);
7426 p += gap;
7427 }
7428 if (esignlen && fill != '0') {
7429 for (i = 0; i < esignlen; i++)
7430 *p++ = esignbuf[i];
7431 }
fc36a67e 7432 if (zeros) {
7433 for (i = zeros; i; i--)
7434 *p++ = '0';
7435 }
46fc3d4c 7436 if (elen) {
4459522c 7437 Copy(eptr, p, elen, char);
46fc3d4c 7438 p += elen;
7439 }
7440 if (gap && left) {
7441 memset(p, ' ', gap);
7442 p += gap;
7443 }
b22c7a20
GS
7444 if (vectorize) {
7445 if (veclen) {
4459522c 7446 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
7447 p += dotstrlen;
7448 }
7449 else
7450 vectorize = FALSE; /* done iterating over vecstr */
7451 }
7e2040f0
GS
7452 if (is_utf)
7453 SvUTF8_on(sv);
46fc3d4c 7454 *p = '\0';
7455 SvCUR(sv) = p - SvPVX(sv);
b22c7a20
GS
7456 if (vectorize) {
7457 esignlen = 0;
7458 goto vector;
7459 }
46fc3d4c 7460 }
7461}
51371543 7462
1d7c1841
GS
7463#if defined(USE_ITHREADS)
7464
7465#if defined(USE_THREADS)
7466# include "error: USE_THREADS and USE_ITHREADS are incompatible"
7467#endif
7468
1d7c1841
GS
7469#ifndef GpREFCNT_inc
7470# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
7471#endif
7472
7473
7474#define sv_dup_inc(s) SvREFCNT_inc(sv_dup(s))
7475#define av_dup(s) (AV*)sv_dup((SV*)s)
7476#define av_dup_inc(s) (AV*)SvREFCNT_inc(sv_dup((SV*)s))
7477#define hv_dup(s) (HV*)sv_dup((SV*)s)
7478#define hv_dup_inc(s) (HV*)SvREFCNT_inc(sv_dup((SV*)s))
7479#define cv_dup(s) (CV*)sv_dup((SV*)s)
7480#define cv_dup_inc(s) (CV*)SvREFCNT_inc(sv_dup((SV*)s))
7481#define io_dup(s) (IO*)sv_dup((SV*)s)
7482#define io_dup_inc(s) (IO*)SvREFCNT_inc(sv_dup((SV*)s))
7483#define gv_dup(s) (GV*)sv_dup((SV*)s)
7484#define gv_dup_inc(s) (GV*)SvREFCNT_inc(sv_dup((SV*)s))
7485#define SAVEPV(p) (p ? savepv(p) : Nullch)
7486#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
7487
7488REGEXP *
7489Perl_re_dup(pTHX_ REGEXP *r)
7490{
7491 /* XXX fix when pmop->op_pmregexp becomes shared */
7492 return ReREFCNT_inc(r);
7493}
7494
7495PerlIO *
7496Perl_fp_dup(pTHX_ PerlIO *fp, char type)
7497{
7498 PerlIO *ret;
7499 if (!fp)
7500 return (PerlIO*)NULL;
7501
7502 /* look for it in the table first */
7503 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
7504 if (ret)
7505 return ret;
7506
7507 /* create anew and remember what it is */
5f1a76d0 7508 ret = PerlIO_fdupopen(aTHX_ fp);
1d7c1841
GS
7509 ptr_table_store(PL_ptr_table, fp, ret);
7510 return ret;
7511}
7512
7513DIR *
7514Perl_dirp_dup(pTHX_ DIR *dp)
7515{
7516 if (!dp)
7517 return (DIR*)NULL;
7518 /* XXX TODO */
7519 return dp;
7520}
7521
7522GP *
7523Perl_gp_dup(pTHX_ GP *gp)
7524{
7525 GP *ret;
7526 if (!gp)
7527 return (GP*)NULL;
7528 /* look for it in the table first */
7529 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
7530 if (ret)
7531 return ret;
7532
7533 /* create anew and remember what it is */
7534 Newz(0, ret, 1, GP);
7535 ptr_table_store(PL_ptr_table, gp, ret);
7536
7537 /* clone */
7538 ret->gp_refcnt = 0; /* must be before any other dups! */
7539 ret->gp_sv = sv_dup_inc(gp->gp_sv);
7540 ret->gp_io = io_dup_inc(gp->gp_io);
7541 ret->gp_form = cv_dup_inc(gp->gp_form);
7542 ret->gp_av = av_dup_inc(gp->gp_av);
7543 ret->gp_hv = hv_dup_inc(gp->gp_hv);
7544 ret->gp_egv = gv_dup(gp->gp_egv); /* GvEGV is not refcounted */
7545 ret->gp_cv = cv_dup_inc(gp->gp_cv);
7546 ret->gp_cvgen = gp->gp_cvgen;
7547 ret->gp_flags = gp->gp_flags;
7548 ret->gp_line = gp->gp_line;
7549 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
7550 return ret;
7551}
7552
7553MAGIC *
7554Perl_mg_dup(pTHX_ MAGIC *mg)
7555{
7556 MAGIC *mgret = (MAGIC*)NULL;
7557 MAGIC *mgprev;
7558 if (!mg)
7559 return (MAGIC*)NULL;
7560 /* look for it in the table first */
7561 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
7562 if (mgret)
7563 return mgret;
7564
7565 for (; mg; mg = mg->mg_moremagic) {
7566 MAGIC *nmg;
7567 Newz(0, nmg, 1, MAGIC);
7568 if (!mgret)
7569 mgret = nmg;
7570 else
7571 mgprev->mg_moremagic = nmg;
7572 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
7573 nmg->mg_private = mg->mg_private;
7574 nmg->mg_type = mg->mg_type;
7575 nmg->mg_flags = mg->mg_flags;
7576 if (mg->mg_type == 'r') {
7577 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj);
7578 }
7579 else {
7580 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
7581 ? sv_dup_inc(mg->mg_obj)
7582 : sv_dup(mg->mg_obj);
7583 }
7584 nmg->mg_len = mg->mg_len;
7585 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
7586 if (mg->mg_ptr && mg->mg_type != 'g') {
7587 if (mg->mg_len >= 0) {
7588 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
7589 if (mg->mg_type == 'c' && AMT_AMAGIC((AMT*)mg->mg_ptr)) {
7590 AMT *amtp = (AMT*)mg->mg_ptr;
7591 AMT *namtp = (AMT*)nmg->mg_ptr;
7592 I32 i;
7593 for (i = 1; i < NofAMmeth; i++) {
7594 namtp->table[i] = cv_dup_inc(amtp->table[i]);
7595 }
7596 }
7597 }
7598 else if (mg->mg_len == HEf_SVKEY)
7599 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr);
7600 }
7601 mgprev = nmg;
7602 }
7603 return mgret;
7604}
7605
7606PTR_TBL_t *
7607Perl_ptr_table_new(pTHX)
7608{
7609 PTR_TBL_t *tbl;
7610 Newz(0, tbl, 1, PTR_TBL_t);
7611 tbl->tbl_max = 511;
7612 tbl->tbl_items = 0;
7613 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
7614 return tbl;
7615}
7616
7617void *
7618Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
7619{
7620 PTR_TBL_ENT_t *tblent;
d2a79402 7621 UV hash = PTR2UV(sv);
1d7c1841
GS
7622 assert(tbl);
7623 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
7624 for (; tblent; tblent = tblent->next) {
7625 if (tblent->oldval == sv)
7626 return tblent->newval;
7627 }
7628 return (void*)NULL;
7629}
7630
7631void
7632Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
7633{
7634 PTR_TBL_ENT_t *tblent, **otblent;
7635 /* XXX this may be pessimal on platforms where pointers aren't good
7636 * hash values e.g. if they grow faster in the most significant
7637 * bits */
d2a79402 7638 UV hash = PTR2UV(oldv);
1d7c1841
GS
7639 bool i = 1;
7640
7641 assert(tbl);
7642 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
7643 for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
7644 if (tblent->oldval == oldv) {
7645 tblent->newval = newv;
7646 tbl->tbl_items++;
7647 return;
7648 }
7649 }
7650 Newz(0, tblent, 1, PTR_TBL_ENT_t);
7651 tblent->oldval = oldv;
7652 tblent->newval = newv;
7653 tblent->next = *otblent;
7654 *otblent = tblent;
7655 tbl->tbl_items++;
7656 if (i && tbl->tbl_items > tbl->tbl_max)
7657 ptr_table_split(tbl);
7658}
7659
7660void
7661Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
7662{
7663 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
7664 UV oldsize = tbl->tbl_max + 1;
7665 UV newsize = oldsize * 2;
7666 UV i;
7667
7668 Renew(ary, newsize, PTR_TBL_ENT_t*);
7669 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
7670 tbl->tbl_max = --newsize;
7671 tbl->tbl_ary = ary;
7672 for (i=0; i < oldsize; i++, ary++) {
7673 PTR_TBL_ENT_t **curentp, **entp, *ent;
7674 if (!*ary)
7675 continue;
7676 curentp = ary + oldsize;
7677 for (entp = ary, ent = *ary; ent; ent = *entp) {
d2a79402 7678 if ((newsize & PTR2UV(ent->oldval)) != i) {
1d7c1841
GS
7679 *entp = ent->next;
7680 ent->next = *curentp;
7681 *curentp = ent;
7682 continue;
7683 }
7684 else
7685 entp = &ent->next;
7686 }
7687 }
7688}
7689
7690#ifdef DEBUGGING
7691char *PL_watch_pvx;
7692#endif
7693
7694SV *
7695Perl_sv_dup(pTHX_ SV *sstr)
7696{
1d7c1841
GS
7697 SV *dstr;
7698
7699 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
7700 return Nullsv;
7701 /* look for it in the table first */
7702 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
7703 if (dstr)
7704 return dstr;
7705
7706 /* create anew and remember what it is */
7707 new_SV(dstr);
7708 ptr_table_store(PL_ptr_table, sstr, dstr);
7709
7710 /* clone */
7711 SvFLAGS(dstr) = SvFLAGS(sstr);
7712 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
7713 SvREFCNT(dstr) = 0; /* must be before any other dups! */
7714
7715#ifdef DEBUGGING
7716 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
7717 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
7718 PL_watch_pvx, SvPVX(sstr));
7719#endif
7720
7721 switch (SvTYPE(sstr)) {
7722 case SVt_NULL:
7723 SvANY(dstr) = NULL;
7724 break;
7725 case SVt_IV:
7726 SvANY(dstr) = new_XIV();
7727 SvIVX(dstr) = SvIVX(sstr);
7728 break;
7729 case SVt_NV:
7730 SvANY(dstr) = new_XNV();
7731 SvNVX(dstr) = SvNVX(sstr);
7732 break;
7733 case SVt_RV:
7734 SvANY(dstr) = new_XRV();
7735 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7736 break;
7737 case SVt_PV:
7738 SvANY(dstr) = new_XPV();
7739 SvCUR(dstr) = SvCUR(sstr);
7740 SvLEN(dstr) = SvLEN(sstr);
7741 if (SvROK(sstr))
7742 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7743 else if (SvPVX(sstr) && SvLEN(sstr))
7744 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7745 else
7746 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7747 break;
7748 case SVt_PVIV:
7749 SvANY(dstr) = new_XPVIV();
7750 SvCUR(dstr) = SvCUR(sstr);
7751 SvLEN(dstr) = SvLEN(sstr);
7752 SvIVX(dstr) = SvIVX(sstr);
7753 if (SvROK(sstr))
7754 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7755 else if (SvPVX(sstr) && SvLEN(sstr))
7756 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7757 else
7758 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7759 break;
7760 case SVt_PVNV:
7761 SvANY(dstr) = new_XPVNV();
7762 SvCUR(dstr) = SvCUR(sstr);
7763 SvLEN(dstr) = SvLEN(sstr);
7764 SvIVX(dstr) = SvIVX(sstr);
7765 SvNVX(dstr) = SvNVX(sstr);
7766 if (SvROK(sstr))
7767 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7768 else if (SvPVX(sstr) && SvLEN(sstr))
7769 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7770 else
7771 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7772 break;
7773 case SVt_PVMG:
7774 SvANY(dstr) = new_XPVMG();
7775 SvCUR(dstr) = SvCUR(sstr);
7776 SvLEN(dstr) = SvLEN(sstr);
7777 SvIVX(dstr) = SvIVX(sstr);
7778 SvNVX(dstr) = SvNVX(sstr);
7779 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7780 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
7781 if (SvROK(sstr))
7782 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7783 else if (SvPVX(sstr) && SvLEN(sstr))
7784 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7785 else
7786 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7787 break;
7788 case SVt_PVBM:
7789 SvANY(dstr) = new_XPVBM();
7790 SvCUR(dstr) = SvCUR(sstr);
7791 SvLEN(dstr) = SvLEN(sstr);
7792 SvIVX(dstr) = SvIVX(sstr);
7793 SvNVX(dstr) = SvNVX(sstr);
7794 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7795 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
7796 if (SvROK(sstr))
7797 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7798 else if (SvPVX(sstr) && SvLEN(sstr))
7799 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7800 else
7801 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7802 BmRARE(dstr) = BmRARE(sstr);
7803 BmUSEFUL(dstr) = BmUSEFUL(sstr);
7804 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
7805 break;
7806 case SVt_PVLV:
7807 SvANY(dstr) = new_XPVLV();
7808 SvCUR(dstr) = SvCUR(sstr);
7809 SvLEN(dstr) = SvLEN(sstr);
7810 SvIVX(dstr) = SvIVX(sstr);
7811 SvNVX(dstr) = SvNVX(sstr);
7812 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7813 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
7814 if (SvROK(sstr))
7815 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7816 else if (SvPVX(sstr) && SvLEN(sstr))
7817 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7818 else
7819 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7820 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
7821 LvTARGLEN(dstr) = LvTARGLEN(sstr);
7822 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr));
7823 LvTYPE(dstr) = LvTYPE(sstr);
7824 break;
7825 case SVt_PVGV:
7826 SvANY(dstr) = new_XPVGV();
7827 SvCUR(dstr) = SvCUR(sstr);
7828 SvLEN(dstr) = SvLEN(sstr);
7829 SvIVX(dstr) = SvIVX(sstr);
7830 SvNVX(dstr) = SvNVX(sstr);
7831 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7832 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
7833 if (SvROK(sstr))
7834 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7835 else if (SvPVX(sstr) && SvLEN(sstr))
7836 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7837 else
7838 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7839 GvNAMELEN(dstr) = GvNAMELEN(sstr);
7840 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
7841 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr));
7842 GvFLAGS(dstr) = GvFLAGS(sstr);
7843 GvGP(dstr) = gp_dup(GvGP(sstr));
7844 (void)GpREFCNT_inc(GvGP(dstr));
7845 break;
7846 case SVt_PVIO:
7847 SvANY(dstr) = new_XPVIO();
7848 SvCUR(dstr) = SvCUR(sstr);
7849 SvLEN(dstr) = SvLEN(sstr);
7850 SvIVX(dstr) = SvIVX(sstr);
7851 SvNVX(dstr) = SvNVX(sstr);
7852 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7853 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
7854 if (SvROK(sstr))
7855 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7856 else if (SvPVX(sstr) && SvLEN(sstr))
7857 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7858 else
7859 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7860 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr));
7861 if (IoOFP(sstr) == IoIFP(sstr))
7862 IoOFP(dstr) = IoIFP(dstr);
7863 else
7864 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr));
7865 /* PL_rsfp_filters entries have fake IoDIRP() */
7866 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
7867 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
7868 else
7869 IoDIRP(dstr) = IoDIRP(sstr);
7870 IoLINES(dstr) = IoLINES(sstr);
7871 IoPAGE(dstr) = IoPAGE(sstr);
7872 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
7873 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
7874 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
7875 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr));
7876 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
7877 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr));
7878 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
7879 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr));
7880 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
7881 IoTYPE(dstr) = IoTYPE(sstr);
7882 IoFLAGS(dstr) = IoFLAGS(sstr);
7883 break;
7884 case SVt_PVAV:
7885 SvANY(dstr) = new_XPVAV();
7886 SvCUR(dstr) = SvCUR(sstr);
7887 SvLEN(dstr) = SvLEN(sstr);
7888 SvIVX(dstr) = SvIVX(sstr);
7889 SvNVX(dstr) = SvNVX(sstr);
7890 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7891 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
7892 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr));
7893 AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
7894 if (AvARRAY((AV*)sstr)) {
7895 SV **dst_ary, **src_ary;
7896 SSize_t items = AvFILLp((AV*)sstr) + 1;
7897
7898 src_ary = AvARRAY((AV*)sstr);
7899 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
7900 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
7901 SvPVX(dstr) = (char*)dst_ary;
7902 AvALLOC((AV*)dstr) = dst_ary;
7903 if (AvREAL((AV*)sstr)) {
7904 while (items-- > 0)
7905 *dst_ary++ = sv_dup_inc(*src_ary++);
7906 }
7907 else {
7908 while (items-- > 0)
7909 *dst_ary++ = sv_dup(*src_ary++);
7910 }
7911 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
7912 while (items-- > 0) {
7913 *dst_ary++ = &PL_sv_undef;
7914 }
7915 }
7916 else {
7917 SvPVX(dstr) = Nullch;
7918 AvALLOC((AV*)dstr) = (SV**)NULL;
7919 }
7920 break;
7921 case SVt_PVHV:
7922 SvANY(dstr) = new_XPVHV();
7923 SvCUR(dstr) = SvCUR(sstr);
7924 SvLEN(dstr) = SvLEN(sstr);
7925 SvIVX(dstr) = SvIVX(sstr);
7926 SvNVX(dstr) = SvNVX(sstr);
7927 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7928 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
7929 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
7930 if (HvARRAY((HV*)sstr)) {
1d7c1841
GS
7931 STRLEN i = 0;
7932 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
7933 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
7934 Newz(0, dxhv->xhv_array,
7935 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
7936 while (i <= sxhv->xhv_max) {
7937 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
7938 !!HvSHAREKEYS(sstr));
7939 ++i;
7940 }
7941 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter, !!HvSHAREKEYS(sstr));
7942 }
7943 else {
7944 SvPVX(dstr) = Nullch;
7945 HvEITER((HV*)dstr) = (HE*)NULL;
7946 }
7947 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
7948 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
7949 break;
7950 case SVt_PVFM:
7951 SvANY(dstr) = new_XPVFM();
7952 FmLINES(dstr) = FmLINES(sstr);
7953 goto dup_pvcv;
7954 /* NOTREACHED */
7955 case SVt_PVCV:
7956 SvANY(dstr) = new_XPVCV();
7957dup_pvcv:
7958 SvCUR(dstr) = SvCUR(sstr);
7959 SvLEN(dstr) = SvLEN(sstr);
7960 SvIVX(dstr) = SvIVX(sstr);
7961 SvNVX(dstr) = SvNVX(sstr);
7962 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7963 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
7964 if (SvPVX(sstr) && SvLEN(sstr))
7965 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7966 else
7967 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7968 CvSTASH(dstr) = hv_dup(CvSTASH(sstr));/* NOTE: not refcounted */
7969 CvSTART(dstr) = CvSTART(sstr);
7970 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
7971 CvXSUB(dstr) = CvXSUB(sstr);
7972 CvXSUBANY(dstr) = CvXSUBANY(sstr);
7973 CvGV(dstr) = gv_dup_inc(CvGV(sstr));
7974 CvDEPTH(dstr) = CvDEPTH(sstr);
7975 if (CvPADLIST(sstr) && !AvREAL(CvPADLIST(sstr))) {
7976 /* XXX padlists are real, but pretend to be not */
7977 AvREAL_on(CvPADLIST(sstr));
7978 CvPADLIST(dstr) = av_dup_inc(CvPADLIST(sstr));
7979 AvREAL_off(CvPADLIST(sstr));
7980 AvREAL_off(CvPADLIST(dstr));
7981 }
7982 else
7983 CvPADLIST(dstr) = av_dup_inc(CvPADLIST(sstr));
7984 CvOUTSIDE(dstr) = cv_dup_inc(CvOUTSIDE(sstr));
7985 CvFLAGS(dstr) = CvFLAGS(sstr);
7986 break;
7987 default:
7988 Perl_croak(aTHX_ "Bizarre SvTYPE [%d]", SvTYPE(sstr));
7989 break;
7990 }
7991
7992 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
7993 ++PL_sv_objcount;
7994
7995 return dstr;
7996}
7997
7998PERL_CONTEXT *
7999Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max)
8000{
8001 PERL_CONTEXT *ncxs;
8002
8003 if (!cxs)
8004 return (PERL_CONTEXT*)NULL;
8005
8006 /* look for it in the table first */
8007 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
8008 if (ncxs)
8009 return ncxs;
8010
8011 /* create anew and remember what it is */
8012 Newz(56, ncxs, max + 1, PERL_CONTEXT);
8013 ptr_table_store(PL_ptr_table, cxs, ncxs);
8014
8015 while (ix >= 0) {
8016 PERL_CONTEXT *cx = &cxs[ix];
8017 PERL_CONTEXT *ncx = &ncxs[ix];
8018 ncx->cx_type = cx->cx_type;
8019 if (CxTYPE(cx) == CXt_SUBST) {
8020 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
8021 }
8022 else {
8023 ncx->blk_oldsp = cx->blk_oldsp;
8024 ncx->blk_oldcop = cx->blk_oldcop;
8025 ncx->blk_oldretsp = cx->blk_oldretsp;
8026 ncx->blk_oldmarksp = cx->blk_oldmarksp;
8027 ncx->blk_oldscopesp = cx->blk_oldscopesp;
8028 ncx->blk_oldpm = cx->blk_oldpm;
8029 ncx->blk_gimme = cx->blk_gimme;
8030 switch (CxTYPE(cx)) {
8031 case CXt_SUB:
8032 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
8033 ? cv_dup_inc(cx->blk_sub.cv)
8034 : cv_dup(cx->blk_sub.cv));
8035 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
8036 ? av_dup_inc(cx->blk_sub.argarray)
8037 : Nullav);
8038 ncx->blk_sub.savearray = av_dup(cx->blk_sub.savearray);
8039 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
8040 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
8041 ncx->blk_sub.lval = cx->blk_sub.lval;
8042 break;
8043 case CXt_EVAL:
8044 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
8045 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
0f79a09d 8046 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv);
1d7c1841
GS
8047 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
8048 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text);
8049 break;
8050 case CXt_LOOP:
8051 ncx->blk_loop.label = cx->blk_loop.label;
8052 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
8053 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
8054 ncx->blk_loop.next_op = cx->blk_loop.next_op;
8055 ncx->blk_loop.last_op = cx->blk_loop.last_op;
8056 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
8057 ? cx->blk_loop.iterdata
8058 : gv_dup((GV*)cx->blk_loop.iterdata));
a4b82a6f
GS
8059 ncx->blk_loop.oldcurpad
8060 = (SV**)ptr_table_fetch(PL_ptr_table,
8061 cx->blk_loop.oldcurpad);
1d7c1841
GS
8062 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave);
8063 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval);
8064 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary);
8065 ncx->blk_loop.iterix = cx->blk_loop.iterix;
8066 ncx->blk_loop.itermax = cx->blk_loop.itermax;
8067 break;
8068 case CXt_FORMAT:
8069 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv);
8070 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv);
8071 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv);
8072 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
8073 break;
8074 case CXt_BLOCK:
8075 case CXt_NULL:
8076 break;
8077 }
8078 }
8079 --ix;
8080 }
8081 return ncxs;
8082}
8083
8084PERL_SI *
8085Perl_si_dup(pTHX_ PERL_SI *si)
8086{
8087 PERL_SI *nsi;
8088
8089 if (!si)
8090 return (PERL_SI*)NULL;
8091
8092 /* look for it in the table first */
8093 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
8094 if (nsi)
8095 return nsi;
8096
8097 /* create anew and remember what it is */
8098 Newz(56, nsi, 1, PERL_SI);
8099 ptr_table_store(PL_ptr_table, si, nsi);
8100
8101 nsi->si_stack = av_dup_inc(si->si_stack);
8102 nsi->si_cxix = si->si_cxix;
8103 nsi->si_cxmax = si->si_cxmax;
8104 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax);
8105 nsi->si_type = si->si_type;
8106 nsi->si_prev = si_dup(si->si_prev);
8107 nsi->si_next = si_dup(si->si_next);
8108 nsi->si_markoff = si->si_markoff;
8109
8110 return nsi;
8111}
8112
8113#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
8114#define TOPINT(ss,ix) ((ss)[ix].any_i32)
8115#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
8116#define TOPLONG(ss,ix) ((ss)[ix].any_long)
8117#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
8118#define TOPIV(ss,ix) ((ss)[ix].any_iv)
8119#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
8120#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
8121#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
8122#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
8123#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
8124#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
8125
8126/* XXXXX todo */
8127#define pv_dup_inc(p) SAVEPV(p)
8128#define pv_dup(p) SAVEPV(p)
8129#define svp_dup_inc(p,pp) any_dup(p,pp)
8130
8131void *
8132Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
8133{
8134 void *ret;
8135
8136 if (!v)
8137 return (void*)NULL;
8138
8139 /* look for it in the table first */
8140 ret = ptr_table_fetch(PL_ptr_table, v);
8141 if (ret)
8142 return ret;
8143
8144 /* see if it is part of the interpreter structure */
8145 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
8146 ret = (void*)(((char*)aTHXo) + (((char*)v) - (char*)proto_perl));
8147 else
8148 ret = v;
8149
8150 return ret;
8151}
8152
8153ANY *
8154Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl)
8155{
8156 ANY *ss = proto_perl->Tsavestack;
8157 I32 ix = proto_perl->Tsavestack_ix;
8158 I32 max = proto_perl->Tsavestack_max;
8159 ANY *nss;
8160 SV *sv;
8161 GV *gv;
8162 AV *av;
8163 HV *hv;
8164 void* ptr;
8165 int intval;
8166 long longval;
8167 GP *gp;
8168 IV iv;
8169 I32 i;
8170 char *c;
8171 void (*dptr) (void*);
8172 void (*dxptr) (pTHXo_ void*);
e977893f 8173 OP *o;
1d7c1841
GS
8174
8175 Newz(54, nss, max, ANY);
8176
8177 while (ix > 0) {
8178 i = POPINT(ss,ix);
8179 TOPINT(nss,ix) = i;
8180 switch (i) {
8181 case SAVEt_ITEM: /* normal string */
8182 sv = (SV*)POPPTR(ss,ix);
8183 TOPPTR(nss,ix) = sv_dup_inc(sv);
8184 sv = (SV*)POPPTR(ss,ix);
8185 TOPPTR(nss,ix) = sv_dup_inc(sv);
8186 break;
8187 case SAVEt_SV: /* scalar reference */
8188 sv = (SV*)POPPTR(ss,ix);
8189 TOPPTR(nss,ix) = sv_dup_inc(sv);
8190 gv = (GV*)POPPTR(ss,ix);
8191 TOPPTR(nss,ix) = gv_dup_inc(gv);
8192 break;
f4dd75d9
GS
8193 case SAVEt_GENERIC_PVREF: /* generic char* */
8194 c = (char*)POPPTR(ss,ix);
8195 TOPPTR(nss,ix) = pv_dup(c);
8196 ptr = POPPTR(ss,ix);
8197 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8198 break;
1d7c1841
GS
8199 case SAVEt_GENERIC_SVREF: /* generic sv */
8200 case SAVEt_SVREF: /* scalar reference */
8201 sv = (SV*)POPPTR(ss,ix);
8202 TOPPTR(nss,ix) = sv_dup_inc(sv);
8203 ptr = POPPTR(ss,ix);
8204 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
8205 break;
8206 case SAVEt_AV: /* array reference */
8207 av = (AV*)POPPTR(ss,ix);
8208 TOPPTR(nss,ix) = av_dup_inc(av);
8209 gv = (GV*)POPPTR(ss,ix);
8210 TOPPTR(nss,ix) = gv_dup(gv);
8211 break;
8212 case SAVEt_HV: /* hash reference */
8213 hv = (HV*)POPPTR(ss,ix);
8214 TOPPTR(nss,ix) = hv_dup_inc(hv);
8215 gv = (GV*)POPPTR(ss,ix);
8216 TOPPTR(nss,ix) = gv_dup(gv);
8217 break;
8218 case SAVEt_INT: /* int reference */
8219 ptr = POPPTR(ss,ix);
8220 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8221 intval = (int)POPINT(ss,ix);
8222 TOPINT(nss,ix) = intval;
8223 break;
8224 case SAVEt_LONG: /* long reference */
8225 ptr = POPPTR(ss,ix);
8226 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8227 longval = (long)POPLONG(ss,ix);
8228 TOPLONG(nss,ix) = longval;
8229 break;
8230 case SAVEt_I32: /* I32 reference */
8231 case SAVEt_I16: /* I16 reference */
8232 case SAVEt_I8: /* I8 reference */
8233 ptr = POPPTR(ss,ix);
8234 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8235 i = POPINT(ss,ix);
8236 TOPINT(nss,ix) = i;
8237 break;
8238 case SAVEt_IV: /* IV reference */
8239 ptr = POPPTR(ss,ix);
8240 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8241 iv = POPIV(ss,ix);
8242 TOPIV(nss,ix) = iv;
8243 break;
8244 case SAVEt_SPTR: /* SV* reference */
8245 ptr = POPPTR(ss,ix);
8246 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8247 sv = (SV*)POPPTR(ss,ix);
8248 TOPPTR(nss,ix) = sv_dup(sv);
8249 break;
8250 case SAVEt_VPTR: /* random* reference */
8251 ptr = POPPTR(ss,ix);
8252 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8253 ptr = POPPTR(ss,ix);
8254 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8255 break;
8256 case SAVEt_PPTR: /* char* reference */
8257 ptr = POPPTR(ss,ix);
8258 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8259 c = (char*)POPPTR(ss,ix);
8260 TOPPTR(nss,ix) = pv_dup(c);
8261 break;
8262 case SAVEt_HPTR: /* HV* reference */
8263 ptr = POPPTR(ss,ix);
8264 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8265 hv = (HV*)POPPTR(ss,ix);
8266 TOPPTR(nss,ix) = hv_dup(hv);
8267 break;
8268 case SAVEt_APTR: /* AV* reference */
8269 ptr = POPPTR(ss,ix);
8270 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8271 av = (AV*)POPPTR(ss,ix);
8272 TOPPTR(nss,ix) = av_dup(av);
8273 break;
8274 case SAVEt_NSTAB:
8275 gv = (GV*)POPPTR(ss,ix);
8276 TOPPTR(nss,ix) = gv_dup(gv);
8277 break;
8278 case SAVEt_GP: /* scalar reference */
8279 gp = (GP*)POPPTR(ss,ix);
8280 TOPPTR(nss,ix) = gp = gp_dup(gp);
8281 (void)GpREFCNT_inc(gp);
8282 gv = (GV*)POPPTR(ss,ix);
8283 TOPPTR(nss,ix) = gv_dup_inc(c);
8284 c = (char*)POPPTR(ss,ix);
8285 TOPPTR(nss,ix) = pv_dup(c);
8286 iv = POPIV(ss,ix);
8287 TOPIV(nss,ix) = iv;
8288 iv = POPIV(ss,ix);
8289 TOPIV(nss,ix) = iv;
8290 break;
8291 case SAVEt_FREESV:
8292 sv = (SV*)POPPTR(ss,ix);
8293 TOPPTR(nss,ix) = sv_dup_inc(sv);
8294 break;
8295 case SAVEt_FREEOP:
8296 ptr = POPPTR(ss,ix);
8297 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
8298 /* these are assumed to be refcounted properly */
8299 switch (((OP*)ptr)->op_type) {
8300 case OP_LEAVESUB:
8301 case OP_LEAVESUBLV:
8302 case OP_LEAVEEVAL:
8303 case OP_LEAVE:
8304 case OP_SCOPE:
8305 case OP_LEAVEWRITE:
e977893f
GS
8306 TOPPTR(nss,ix) = ptr;
8307 o = (OP*)ptr;
8308 OpREFCNT_inc(o);
1d7c1841
GS
8309 break;
8310 default:
8311 TOPPTR(nss,ix) = Nullop;
8312 break;
8313 }
8314 }
8315 else
8316 TOPPTR(nss,ix) = Nullop;
8317 break;
8318 case SAVEt_FREEPV:
8319 c = (char*)POPPTR(ss,ix);
8320 TOPPTR(nss,ix) = pv_dup_inc(c);
8321 break;
8322 case SAVEt_CLEARSV:
8323 longval = POPLONG(ss,ix);
8324 TOPLONG(nss,ix) = longval;
8325 break;
8326 case SAVEt_DELETE:
8327 hv = (HV*)POPPTR(ss,ix);
8328 TOPPTR(nss,ix) = hv_dup_inc(hv);
8329 c = (char*)POPPTR(ss,ix);
8330 TOPPTR(nss,ix) = pv_dup_inc(c);
8331 i = POPINT(ss,ix);
8332 TOPINT(nss,ix) = i;
8333 break;
8334 case SAVEt_DESTRUCTOR:
8335 ptr = POPPTR(ss,ix);
8336 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
8337 dptr = POPDPTR(ss,ix);
ef75a179 8338 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
8339 break;
8340 case SAVEt_DESTRUCTOR_X:
8341 ptr = POPPTR(ss,ix);
8342 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
8343 dxptr = POPDXPTR(ss,ix);
ef75a179 8344 TOPDXPTR(nss,ix) = (void (*)(pTHXo_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
8345 break;
8346 case SAVEt_REGCONTEXT:
8347 case SAVEt_ALLOC:
8348 i = POPINT(ss,ix);
8349 TOPINT(nss,ix) = i;
8350 ix -= i;
8351 break;
8352 case SAVEt_STACK_POS: /* Position on Perl stack */
8353 i = POPINT(ss,ix);
8354 TOPINT(nss,ix) = i;
8355 break;
8356 case SAVEt_AELEM: /* array element */
8357 sv = (SV*)POPPTR(ss,ix);
8358 TOPPTR(nss,ix) = sv_dup_inc(sv);
8359 i = POPINT(ss,ix);
8360 TOPINT(nss,ix) = i;
8361 av = (AV*)POPPTR(ss,ix);
8362 TOPPTR(nss,ix) = av_dup_inc(av);
8363 break;
8364 case SAVEt_HELEM: /* hash element */
8365 sv = (SV*)POPPTR(ss,ix);
8366 TOPPTR(nss,ix) = sv_dup_inc(sv);
8367 sv = (SV*)POPPTR(ss,ix);
8368 TOPPTR(nss,ix) = sv_dup_inc(sv);
8369 hv = (HV*)POPPTR(ss,ix);
8370 TOPPTR(nss,ix) = hv_dup_inc(hv);
8371 break;
8372 case SAVEt_OP:
8373 ptr = POPPTR(ss,ix);
8374 TOPPTR(nss,ix) = ptr;
8375 break;
8376 case SAVEt_HINTS:
8377 i = POPINT(ss,ix);
8378 TOPINT(nss,ix) = i;
8379 break;
c4410b1b
GS
8380 case SAVEt_COMPPAD:
8381 av = (AV*)POPPTR(ss,ix);
8382 TOPPTR(nss,ix) = av_dup(av);
8383 break;
c3564e5c
GS
8384 case SAVEt_PADSV:
8385 longval = (long)POPLONG(ss,ix);
8386 TOPLONG(nss,ix) = longval;
8387 ptr = POPPTR(ss,ix);
8388 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8389 sv = (SV*)POPPTR(ss,ix);
8390 TOPPTR(nss,ix) = sv_dup(sv);
8391 break;
1d7c1841
GS
8392 default:
8393 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
8394 }
8395 }
8396
8397 return nss;
8398}
8399
8400#ifdef PERL_OBJECT
8401#include "XSUB.h"
8402#endif
8403
8404PerlInterpreter *
8405perl_clone(PerlInterpreter *proto_perl, UV flags)
8406{
8407#ifdef PERL_OBJECT
8408 CPerlObj *pPerl = (CPerlObj*)proto_perl;
8409#endif
8410
8411#ifdef PERL_IMPLICIT_SYS
8412 return perl_clone_using(proto_perl, flags,
8413 proto_perl->IMem,
8414 proto_perl->IMemShared,
8415 proto_perl->IMemParse,
8416 proto_perl->IEnv,
8417 proto_perl->IStdIO,
8418 proto_perl->ILIO,
8419 proto_perl->IDir,
8420 proto_perl->ISock,
8421 proto_perl->IProc);
8422}
8423
8424PerlInterpreter *
8425perl_clone_using(PerlInterpreter *proto_perl, UV flags,
8426 struct IPerlMem* ipM, struct IPerlMem* ipMS,
8427 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
8428 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
8429 struct IPerlDir* ipD, struct IPerlSock* ipS,
8430 struct IPerlProc* ipP)
8431{
8432 /* XXX many of the string copies here can be optimized if they're
8433 * constants; they need to be allocated as common memory and just
8434 * their pointers copied. */
8435
8436 IV i;
1d7c1841
GS
8437# ifdef PERL_OBJECT
8438 CPerlObj *pPerl = new(ipM) CPerlObj(ipM, ipMS, ipMP, ipE, ipStd, ipLIO,
8439 ipD, ipS, ipP);
ba869deb 8440 PERL_SET_THX(pPerl);
1d7c1841
GS
8441# else /* !PERL_OBJECT */
8442 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
ba869deb 8443 PERL_SET_THX(my_perl);
1d7c1841
GS
8444
8445# ifdef DEBUGGING
8446 memset(my_perl, 0xab, sizeof(PerlInterpreter));
8447 PL_markstack = 0;
8448 PL_scopestack = 0;
8449 PL_savestack = 0;
8450 PL_retstack = 0;
66fe0623 8451 PL_sig_pending = 0;
1d7c1841
GS
8452# else /* !DEBUGGING */
8453 Zero(my_perl, 1, PerlInterpreter);
8454# endif /* DEBUGGING */
8455
8456 /* host pointers */
8457 PL_Mem = ipM;
8458 PL_MemShared = ipMS;
8459 PL_MemParse = ipMP;
8460 PL_Env = ipE;
8461 PL_StdIO = ipStd;
8462 PL_LIO = ipLIO;
8463 PL_Dir = ipD;
8464 PL_Sock = ipS;
8465 PL_Proc = ipP;
8466# endif /* PERL_OBJECT */
8467#else /* !PERL_IMPLICIT_SYS */
8468 IV i;
1d7c1841 8469 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 8470 PERL_SET_THX(my_perl);
1d7c1841
GS
8471
8472# ifdef DEBUGGING
8473 memset(my_perl, 0xab, sizeof(PerlInterpreter));
8474 PL_markstack = 0;
8475 PL_scopestack = 0;
8476 PL_savestack = 0;
8477 PL_retstack = 0;
66fe0623 8478 PL_sig_pending = 0;
1d7c1841
GS
8479# else /* !DEBUGGING */
8480 Zero(my_perl, 1, PerlInterpreter);
8481# endif /* DEBUGGING */
8482#endif /* PERL_IMPLICIT_SYS */
8483
8484 /* arena roots */
8485 PL_xiv_arenaroot = NULL;
8486 PL_xiv_root = NULL;
612f20c3 8487 PL_xnv_arenaroot = NULL;
1d7c1841 8488 PL_xnv_root = NULL;
612f20c3 8489 PL_xrv_arenaroot = NULL;
1d7c1841 8490 PL_xrv_root = NULL;
612f20c3 8491 PL_xpv_arenaroot = NULL;
1d7c1841 8492 PL_xpv_root = NULL;
612f20c3 8493 PL_xpviv_arenaroot = NULL;
1d7c1841 8494 PL_xpviv_root = NULL;
612f20c3 8495 PL_xpvnv_arenaroot = NULL;
1d7c1841 8496 PL_xpvnv_root = NULL;
612f20c3 8497 PL_xpvcv_arenaroot = NULL;
1d7c1841 8498 PL_xpvcv_root = NULL;
612f20c3 8499 PL_xpvav_arenaroot = NULL;
1d7c1841 8500 PL_xpvav_root = NULL;
612f20c3 8501 PL_xpvhv_arenaroot = NULL;
1d7c1841 8502 PL_xpvhv_root = NULL;
612f20c3 8503 PL_xpvmg_arenaroot = NULL;
1d7c1841 8504 PL_xpvmg_root = NULL;
612f20c3 8505 PL_xpvlv_arenaroot = NULL;
1d7c1841 8506 PL_xpvlv_root = NULL;
612f20c3 8507 PL_xpvbm_arenaroot = NULL;
1d7c1841 8508 PL_xpvbm_root = NULL;
612f20c3 8509 PL_he_arenaroot = NULL;
1d7c1841
GS
8510 PL_he_root = NULL;
8511 PL_nice_chunk = NULL;
8512 PL_nice_chunk_size = 0;
8513 PL_sv_count = 0;
8514 PL_sv_objcount = 0;
8515 PL_sv_root = Nullsv;
8516 PL_sv_arenaroot = Nullsv;
8517
8518 PL_debug = proto_perl->Idebug;
8519
8520 /* create SV map for pointer relocation */
8521 PL_ptr_table = ptr_table_new();
8522
8523 /* initialize these special pointers as early as possible */
8524 SvANY(&PL_sv_undef) = NULL;
8525 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
8526 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
8527 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
8528
8529#ifdef PERL_OBJECT
8530 SvUPGRADE(&PL_sv_no, SVt_PVNV);
8531#else
8532 SvANY(&PL_sv_no) = new_XPVNV();
8533#endif
8534 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
8535 SvFLAGS(&PL_sv_no) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
8536 SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
8537 SvCUR(&PL_sv_no) = 0;
8538 SvLEN(&PL_sv_no) = 1;
8539 SvNVX(&PL_sv_no) = 0;
8540 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
8541
8542#ifdef PERL_OBJECT
8543 SvUPGRADE(&PL_sv_yes, SVt_PVNV);
8544#else
8545 SvANY(&PL_sv_yes) = new_XPVNV();
8546#endif
8547 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
8548 SvFLAGS(&PL_sv_yes) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
8549 SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
8550 SvCUR(&PL_sv_yes) = 1;
8551 SvLEN(&PL_sv_yes) = 2;
8552 SvNVX(&PL_sv_yes) = 1;
8553 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
8554
8555 /* create shared string table */
8556 PL_strtab = newHV();
8557 HvSHAREKEYS_off(PL_strtab);
8558 hv_ksplit(PL_strtab, 512);
8559 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
8560
8561 PL_compiling = proto_perl->Icompiling;
8562 PL_compiling.cop_stashpv = SAVEPV(PL_compiling.cop_stashpv);
8563 PL_compiling.cop_file = SAVEPV(PL_compiling.cop_file);
8564 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
8565 if (!specialWARN(PL_compiling.cop_warnings))
8566 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings);
ac27b0f5
NIS
8567 if (!specialCopIO(PL_compiling.cop_io))
8568 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io);
1d7c1841
GS
8569 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
8570
8571 /* pseudo environmental stuff */
8572 PL_origargc = proto_perl->Iorigargc;
8573 i = PL_origargc;
8574 New(0, PL_origargv, i+1, char*);
8575 PL_origargv[i] = '\0';
8576 while (i-- > 0) {
8577 PL_origargv[i] = SAVEPV(proto_perl->Iorigargv[i]);
8578 }
8579 PL_envgv = gv_dup(proto_perl->Ienvgv);
8580 PL_incgv = gv_dup(proto_perl->Iincgv);
8581 PL_hintgv = gv_dup(proto_perl->Ihintgv);
8582 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
8583 PL_diehook = sv_dup_inc(proto_perl->Idiehook);
8584 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook);
8585
8586 /* switches */
8587 PL_minus_c = proto_perl->Iminus_c;
a7cb1f99 8588 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel);
1d7c1841
GS
8589 PL_localpatches = proto_perl->Ilocalpatches;
8590 PL_splitstr = proto_perl->Isplitstr;
8591 PL_preprocess = proto_perl->Ipreprocess;
8592 PL_minus_n = proto_perl->Iminus_n;
8593 PL_minus_p = proto_perl->Iminus_p;
8594 PL_minus_l = proto_perl->Iminus_l;
8595 PL_minus_a = proto_perl->Iminus_a;
8596 PL_minus_F = proto_perl->Iminus_F;
8597 PL_doswitches = proto_perl->Idoswitches;
8598 PL_dowarn = proto_perl->Idowarn;
8599 PL_doextract = proto_perl->Idoextract;
8600 PL_sawampersand = proto_perl->Isawampersand;
8601 PL_unsafe = proto_perl->Iunsafe;
8602 PL_inplace = SAVEPV(proto_perl->Iinplace);
8603 PL_e_script = sv_dup_inc(proto_perl->Ie_script);
8604 PL_perldb = proto_perl->Iperldb;
8605 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
8606
8607 /* magical thingies */
8608 /* XXX time(&PL_basetime) when asked for? */
8609 PL_basetime = proto_perl->Ibasetime;
8610 PL_formfeed = sv_dup(proto_perl->Iformfeed);
8611
8612 PL_maxsysfd = proto_perl->Imaxsysfd;
8613 PL_multiline = proto_perl->Imultiline;
8614 PL_statusvalue = proto_perl->Istatusvalue;
8615#ifdef VMS
8616 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
8617#endif
8618
8619 /* shortcuts to various I/O objects */
8620 PL_stdingv = gv_dup(proto_perl->Istdingv);
8621 PL_stderrgv = gv_dup(proto_perl->Istderrgv);
8622 PL_defgv = gv_dup(proto_perl->Idefgv);
8623 PL_argvgv = gv_dup(proto_perl->Iargvgv);
8624 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv);
8625 PL_argvout_stack = av_dup(proto_perl->Iargvout_stack);
8626
8627 /* shortcuts to regexp stuff */
8628 PL_replgv = gv_dup(proto_perl->Ireplgv);
8629
8630 /* shortcuts to misc objects */
8631 PL_errgv = gv_dup(proto_perl->Ierrgv);
8632
8633 /* shortcuts to debugging objects */
8634 PL_DBgv = gv_dup(proto_perl->IDBgv);
8635 PL_DBline = gv_dup(proto_perl->IDBline);
8636 PL_DBsub = gv_dup(proto_perl->IDBsub);
8637 PL_DBsingle = sv_dup(proto_perl->IDBsingle);
8638 PL_DBtrace = sv_dup(proto_perl->IDBtrace);
8639 PL_DBsignal = sv_dup(proto_perl->IDBsignal);
8640 PL_lineary = av_dup(proto_perl->Ilineary);
8641 PL_dbargs = av_dup(proto_perl->Idbargs);
8642
8643 /* symbol tables */
8644 PL_defstash = hv_dup_inc(proto_perl->Tdefstash);
8645 PL_curstash = hv_dup(proto_perl->Tcurstash);
8646 PL_debstash = hv_dup(proto_perl->Idebstash);
8647 PL_globalstash = hv_dup(proto_perl->Iglobalstash);
8648 PL_curstname = sv_dup_inc(proto_perl->Icurstname);
8649
8650 PL_beginav = av_dup_inc(proto_perl->Ibeginav);
8651 PL_endav = av_dup_inc(proto_perl->Iendav);
7d30b5c4 8652 PL_checkav = av_dup_inc(proto_perl->Icheckav);
1d7c1841
GS
8653 PL_initav = av_dup_inc(proto_perl->Iinitav);
8654
8655 PL_sub_generation = proto_perl->Isub_generation;
8656
8657 /* funky return mechanisms */
8658 PL_forkprocess = proto_perl->Iforkprocess;
8659
8660 /* subprocess state */
8661 PL_fdpid = av_dup_inc(proto_perl->Ifdpid);
8662
8663 /* internal state */
8664 PL_tainting = proto_perl->Itainting;
8665 PL_maxo = proto_perl->Imaxo;
8666 if (proto_perl->Iop_mask)
8667 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
8668 else
8669 PL_op_mask = Nullch;
8670
8671 /* current interpreter roots */
8672 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv);
8673 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
8674 PL_main_start = proto_perl->Imain_start;
e977893f 8675 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
8676 PL_eval_start = proto_perl->Ieval_start;
8677
8678 /* runtime control stuff */
8679 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
8680 PL_copline = proto_perl->Icopline;
8681
8682 PL_filemode = proto_perl->Ifilemode;
8683 PL_lastfd = proto_perl->Ilastfd;
8684 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
8685 PL_Argv = NULL;
8686 PL_Cmd = Nullch;
8687 PL_gensym = proto_perl->Igensym;
8688 PL_preambled = proto_perl->Ipreambled;
8689 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav);
8690 PL_laststatval = proto_perl->Ilaststatval;
8691 PL_laststype = proto_perl->Ilaststype;
8692 PL_mess_sv = Nullsv;
8693
7889fe52 8694 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv);
1d7c1841
GS
8695 PL_ofmt = SAVEPV(proto_perl->Iofmt);
8696
8697 /* interpreter atexit processing */
8698 PL_exitlistlen = proto_perl->Iexitlistlen;
8699 if (PL_exitlistlen) {
8700 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
8701 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
8702 }
8703 else
8704 PL_exitlist = (PerlExitListEntry*)NULL;
8705 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal);
8706
8707 PL_profiledata = NULL;
8708 PL_rsfp = fp_dup(proto_perl->Irsfp, '<');
8709 /* PL_rsfp_filters entries have fake IoDIRP() */
8710 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters);
8711
8712 PL_compcv = cv_dup(proto_perl->Icompcv);
8713 PL_comppad = av_dup(proto_perl->Icomppad);
8714 PL_comppad_name = av_dup(proto_perl->Icomppad_name);
8715 PL_comppad_name_fill = proto_perl->Icomppad_name_fill;
8716 PL_comppad_name_floor = proto_perl->Icomppad_name_floor;
8717 PL_curpad = (SV**)ptr_table_fetch(PL_ptr_table,
8718 proto_perl->Tcurpad);
8719
8720#ifdef HAVE_INTERP_INTERN
8721 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
8722#endif
8723
8724 /* more statics moved here */
8725 PL_generation = proto_perl->Igeneration;
8726 PL_DBcv = cv_dup(proto_perl->IDBcv);
1d7c1841
GS
8727
8728 PL_in_clean_objs = proto_perl->Iin_clean_objs;
8729 PL_in_clean_all = proto_perl->Iin_clean_all;
8730
8731 PL_uid = proto_perl->Iuid;
8732 PL_euid = proto_perl->Ieuid;
8733 PL_gid = proto_perl->Igid;
8734 PL_egid = proto_perl->Iegid;
8735 PL_nomemok = proto_perl->Inomemok;
8736 PL_an = proto_perl->Ian;
8737 PL_cop_seqmax = proto_perl->Icop_seqmax;
8738 PL_op_seqmax = proto_perl->Iop_seqmax;
8739 PL_evalseq = proto_perl->Ievalseq;
8740 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
8741 PL_origalen = proto_perl->Iorigalen;
8742 PL_pidstatus = newHV(); /* XXX flag for cloning? */
8743 PL_osname = SAVEPV(proto_perl->Iosname);
8744 PL_sh_path = SAVEPV(proto_perl->Ish_path);
8745 PL_sighandlerp = proto_perl->Isighandlerp;
8746
8747
8748 PL_runops = proto_perl->Irunops;
8749
8750 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
8751
8752#ifdef CSH
8753 PL_cshlen = proto_perl->Icshlen;
8754 PL_cshname = SAVEPVN(proto_perl->Icshname, PL_cshlen);
8755#endif
8756
8757 PL_lex_state = proto_perl->Ilex_state;
8758 PL_lex_defer = proto_perl->Ilex_defer;
8759 PL_lex_expect = proto_perl->Ilex_expect;
8760 PL_lex_formbrack = proto_perl->Ilex_formbrack;
8761 PL_lex_dojoin = proto_perl->Ilex_dojoin;
8762 PL_lex_starts = proto_perl->Ilex_starts;
8763 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff);
8764 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl);
8765 PL_lex_op = proto_perl->Ilex_op;
8766 PL_lex_inpat = proto_perl->Ilex_inpat;
8767 PL_lex_inwhat = proto_perl->Ilex_inwhat;
8768 PL_lex_brackets = proto_perl->Ilex_brackets;
8769 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
8770 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
8771 PL_lex_casemods = proto_perl->Ilex_casemods;
8772 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
8773 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
8774
8775 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
8776 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
8777 PL_nexttoke = proto_perl->Inexttoke;
8778
8779 PL_linestr = sv_dup_inc(proto_perl->Ilinestr);
8780 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
8781 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8782 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
8783 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8784 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
8785 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8786 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
8787 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
8788 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8789 PL_pending_ident = proto_perl->Ipending_ident;
8790 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
8791
8792 PL_expect = proto_perl->Iexpect;
8793
8794 PL_multi_start = proto_perl->Imulti_start;
8795 PL_multi_end = proto_perl->Imulti_end;
8796 PL_multi_open = proto_perl->Imulti_open;
8797 PL_multi_close = proto_perl->Imulti_close;
8798
8799 PL_error_count = proto_perl->Ierror_count;
8800 PL_subline = proto_perl->Isubline;
8801 PL_subname = sv_dup_inc(proto_perl->Isubname);
8802
8803 PL_min_intro_pending = proto_perl->Imin_intro_pending;
8804 PL_max_intro_pending = proto_perl->Imax_intro_pending;
8805 PL_padix = proto_perl->Ipadix;
8806 PL_padix_floor = proto_perl->Ipadix_floor;
8807 PL_pad_reset_pending = proto_perl->Ipad_reset_pending;
8808
8809 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
8810 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8811 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
8812 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8813 PL_last_lop_op = proto_perl->Ilast_lop_op;
8814 PL_in_my = proto_perl->Iin_my;
8815 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash);
8816#ifdef FCRYPT
8817 PL_cryptseen = proto_perl->Icryptseen;
8818#endif
8819
8820 PL_hints = proto_perl->Ihints;
8821
8822 PL_amagic_generation = proto_perl->Iamagic_generation;
8823
8824#ifdef USE_LOCALE_COLLATE
8825 PL_collation_ix = proto_perl->Icollation_ix;
8826 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
8827 PL_collation_standard = proto_perl->Icollation_standard;
8828 PL_collxfrm_base = proto_perl->Icollxfrm_base;
8829 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
8830#endif /* USE_LOCALE_COLLATE */
8831
8832#ifdef USE_LOCALE_NUMERIC
8833 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
8834 PL_numeric_standard = proto_perl->Inumeric_standard;
8835 PL_numeric_local = proto_perl->Inumeric_local;
8836 PL_numeric_radix = proto_perl->Inumeric_radix;
8837#endif /* !USE_LOCALE_NUMERIC */
8838
8839 /* utf8 character classes */
8840 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum);
8841 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc);
8842 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii);
8843 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha);
8844 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space);
8845 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl);
8846 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph);
8847 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit);
8848 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper);
8849 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower);
8850 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print);
8851 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct);
8852 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit);
8853 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark);
8854 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper);
8855 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle);
8856 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower);
8857
8858 /* swatch cache */
8859 PL_last_swash_hv = Nullhv; /* reinits on demand */
8860 PL_last_swash_klen = 0;
8861 PL_last_swash_key[0]= '\0';
8862 PL_last_swash_tmps = (U8*)NULL;
8863 PL_last_swash_slen = 0;
8864
8865 /* perly.c globals */
8866 PL_yydebug = proto_perl->Iyydebug;
8867 PL_yynerrs = proto_perl->Iyynerrs;
8868 PL_yyerrflag = proto_perl->Iyyerrflag;
8869 PL_yychar = proto_perl->Iyychar;
8870 PL_yyval = proto_perl->Iyyval;
8871 PL_yylval = proto_perl->Iyylval;
8872
8873 PL_glob_index = proto_perl->Iglob_index;
8874 PL_srand_called = proto_perl->Isrand_called;
8875 PL_uudmap['M'] = 0; /* reinits on demand */
8876 PL_bitcount = Nullch; /* reinits on demand */
8877
66fe0623
NIS
8878 if (proto_perl->Ipsig_pend) {
8879 Newz(0, PL_psig_pend, SIG_SIZE, int);
9dd79c3f 8880 }
66fe0623
NIS
8881 else {
8882 PL_psig_pend = (int*)NULL;
8883 }
8884
1d7c1841 8885 if (proto_perl->Ipsig_ptr) {
76d3c696
JH
8886 Newz(0, PL_psig_ptr, SIG_SIZE, SV*);
8887 Newz(0, PL_psig_name, SIG_SIZE, SV*);
76d3c696
JH
8888 for (i = 1; i < SIG_SIZE; i++) {
8889 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i]);
1d7c1841
GS
8890 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i]);
8891 }
8892 }
8893 else {
8894 PL_psig_ptr = (SV**)NULL;
8895 PL_psig_name = (SV**)NULL;
8896 }
8897
8898 /* thrdvar.h stuff */
8899
8900 if (flags & 1) {
8901 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
8902 PL_tmps_ix = proto_perl->Ttmps_ix;
8903 PL_tmps_max = proto_perl->Ttmps_max;
8904 PL_tmps_floor = proto_perl->Ttmps_floor;
8905 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
8906 i = 0;
8907 while (i <= PL_tmps_ix) {
8908 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i]);
8909 ++i;
8910 }
8911
8912 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
8913 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
8914 Newz(54, PL_markstack, i, I32);
8915 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
8916 - proto_perl->Tmarkstack);
8917 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
8918 - proto_perl->Tmarkstack);
8919 Copy(proto_perl->Tmarkstack, PL_markstack,
8920 PL_markstack_ptr - PL_markstack + 1, I32);
8921
8922 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
8923 * NOTE: unlike the others! */
8924 PL_scopestack_ix = proto_perl->Tscopestack_ix;
8925 PL_scopestack_max = proto_perl->Tscopestack_max;
8926 Newz(54, PL_scopestack, PL_scopestack_max, I32);
8927 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
8928
8929 /* next push_return() sets PL_retstack[PL_retstack_ix]
8930 * NOTE: unlike the others! */
8931 PL_retstack_ix = proto_perl->Tretstack_ix;
8932 PL_retstack_max = proto_perl->Tretstack_max;
8933 Newz(54, PL_retstack, PL_retstack_max, OP*);
8934 Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, I32);
8935
8936 /* NOTE: si_dup() looks at PL_markstack */
8937 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo);
8938
8939 /* PL_curstack = PL_curstackinfo->si_stack; */
8940 PL_curstack = av_dup(proto_perl->Tcurstack);
8941 PL_mainstack = av_dup(proto_perl->Tmainstack);
8942
8943 /* next PUSHs() etc. set *(PL_stack_sp+1) */
8944 PL_stack_base = AvARRAY(PL_curstack);
8945 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
8946 - proto_perl->Tstack_base);
8947 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
8948
8949 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
8950 * NOTE: unlike the others! */
8951 PL_savestack_ix = proto_perl->Tsavestack_ix;
8952 PL_savestack_max = proto_perl->Tsavestack_max;
8953 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
8954 PL_savestack = ss_dup(proto_perl);
8955 }
8956 else {
8957 init_stacks();
985e7056 8958 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
8959 }
8960
8961 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
8962 PL_top_env = &PL_start_env;
8963
8964 PL_op = proto_perl->Top;
8965
8966 PL_Sv = Nullsv;
8967 PL_Xpv = (XPV*)NULL;
8968 PL_na = proto_perl->Tna;
8969
8970 PL_statbuf = proto_perl->Tstatbuf;
8971 PL_statcache = proto_perl->Tstatcache;
8972 PL_statgv = gv_dup(proto_perl->Tstatgv);
8973 PL_statname = sv_dup_inc(proto_perl->Tstatname);
8974#ifdef HAS_TIMES
8975 PL_timesbuf = proto_perl->Ttimesbuf;
8976#endif
8977
8978 PL_tainted = proto_perl->Ttainted;
8979 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
8980 PL_nrs = sv_dup_inc(proto_perl->Tnrs);
8981 PL_rs = sv_dup_inc(proto_perl->Trs);
8982 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv);
7889fe52 8983 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv);
1d7c1841
GS
8984 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv);
8985 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
8986 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget);
8987 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget);
8988 PL_formtarget = sv_dup(proto_perl->Tformtarget);
8989
8990 PL_restartop = proto_perl->Trestartop;
8991 PL_in_eval = proto_perl->Tin_eval;
8992 PL_delaymagic = proto_perl->Tdelaymagic;
8993 PL_dirty = proto_perl->Tdirty;
8994 PL_localizing = proto_perl->Tlocalizing;
8995
14dd3ad8 8996#ifdef PERL_FLEXIBLE_EXCEPTIONS
1d7c1841 8997 PL_protect = proto_perl->Tprotect;
14dd3ad8 8998#endif
1d7c1841
GS
8999 PL_errors = sv_dup_inc(proto_perl->Terrors);
9000 PL_av_fetch_sv = Nullsv;
9001 PL_hv_fetch_sv = Nullsv;
9002 Zero(&PL_hv_fetch_ent_mh, 1, HE); /* XXX */
9003 PL_modcount = proto_perl->Tmodcount;
9004 PL_lastgotoprobe = Nullop;
9005 PL_dumpindent = proto_perl->Tdumpindent;
9006
9007 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
9008 PL_sortstash = hv_dup(proto_perl->Tsortstash);
9009 PL_firstgv = gv_dup(proto_perl->Tfirstgv);
9010 PL_secondgv = gv_dup(proto_perl->Tsecondgv);
9011 PL_sortcxix = proto_perl->Tsortcxix;
9012 PL_efloatbuf = Nullch; /* reinits on demand */
9013 PL_efloatsize = 0; /* reinits on demand */
9014
9015 /* regex stuff */
9016
9017 PL_screamfirst = NULL;
9018 PL_screamnext = NULL;
9019 PL_maxscream = -1; /* reinits on demand */
9020 PL_lastscream = Nullsv;
9021
9022 PL_watchaddr = NULL;
9023 PL_watchok = Nullch;
9024
9025 PL_regdummy = proto_perl->Tregdummy;
9026 PL_regcomp_parse = Nullch;
9027 PL_regxend = Nullch;
9028 PL_regcode = (regnode*)NULL;
9029 PL_regnaughty = 0;
9030 PL_regsawback = 0;
9031 PL_regprecomp = Nullch;
9032 PL_regnpar = 0;
9033 PL_regsize = 0;
9034 PL_regflags = 0;
9035 PL_regseen = 0;
9036 PL_seen_zerolen = 0;
9037 PL_seen_evals = 0;
9038 PL_regcomp_rx = (regexp*)NULL;
9039 PL_extralen = 0;
9040 PL_colorset = 0; /* reinits PL_colors[] */
9041 /*PL_colors[6] = {0,0,0,0,0,0};*/
9042 PL_reg_whilem_seen = 0;
9043 PL_reginput = Nullch;
9044 PL_regbol = Nullch;
9045 PL_regeol = Nullch;
9046 PL_regstartp = (I32*)NULL;
9047 PL_regendp = (I32*)NULL;
9048 PL_reglastparen = (U32*)NULL;
9049 PL_regtill = Nullch;
9050 PL_regprev = '\n';
9051 PL_reg_start_tmp = (char**)NULL;
9052 PL_reg_start_tmpl = 0;
9053 PL_regdata = (struct reg_data*)NULL;
9054 PL_bostr = Nullch;
9055 PL_reg_flags = 0;
9056 PL_reg_eval_set = 0;
9057 PL_regnarrate = 0;
9058 PL_regprogram = (regnode*)NULL;
9059 PL_regindent = 0;
9060 PL_regcc = (CURCUR*)NULL;
9061 PL_reg_call_cc = (struct re_cc_state*)NULL;
9062 PL_reg_re = (regexp*)NULL;
9063 PL_reg_ganch = Nullch;
9064 PL_reg_sv = Nullsv;
9065 PL_reg_magic = (MAGIC*)NULL;
9066 PL_reg_oldpos = 0;
9067 PL_reg_oldcurpm = (PMOP*)NULL;
9068 PL_reg_curpm = (PMOP*)NULL;
9069 PL_reg_oldsaved = Nullch;
9070 PL_reg_oldsavedlen = 0;
9071 PL_reg_maxiter = 0;
9072 PL_reg_leftiter = 0;
9073 PL_reg_poscache = Nullch;
9074 PL_reg_poscache_size= 0;
9075
9076 /* RE engine - function pointers */
9077 PL_regcompp = proto_perl->Tregcompp;
9078 PL_regexecp = proto_perl->Tregexecp;
9079 PL_regint_start = proto_perl->Tregint_start;
9080 PL_regint_string = proto_perl->Tregint_string;
9081 PL_regfree = proto_perl->Tregfree;
9082
9083 PL_reginterp_cnt = 0;
9084 PL_reg_starttry = 0;
9085
9086#ifdef PERL_OBJECT
9087 return (PerlInterpreter*)pPerl;
9088#else
9089 return my_perl;
9090#endif
9091}
9092
9093#else /* !USE_ITHREADS */
51371543
GS
9094
9095#ifdef PERL_OBJECT
51371543
GS
9096#include "XSUB.h"
9097#endif
9098
1d7c1841
GS
9099#endif /* USE_ITHREADS */
9100
51371543
GS
9101static void
9102do_report_used(pTHXo_ SV *sv)
9103{
9104 if (SvTYPE(sv) != SVTYPEMASK) {
bf49b057 9105 PerlIO_printf(Perl_debug_log, "****\n");
51371543
GS
9106 sv_dump(sv);
9107 }
9108}
9109
9110static void
9111do_clean_objs(pTHXo_ SV *sv)
9112{
9113 SV* rv;
9114
9115 if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
9116 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv));)
8b6e653b
HS
9117 if (SvWEAKREF(sv)) {
9118 sv_del_backref(sv);
9119 SvWEAKREF_off(sv);
9120 SvRV(sv) = 0;
9121 } else {
9122 SvROK_off(sv);
9123 SvRV(sv) = 0;
9124 SvREFCNT_dec(rv);
9125 }
51371543
GS
9126 }
9127
9128 /* XXX Might want to check arrays, etc. */
9129}
9130
9131#ifndef DISABLE_DESTRUCTOR_KLUDGE
9132static void
9133do_clean_named_objs(pTHXo_ SV *sv)
9134{
f472eb5c 9135 if (SvTYPE(sv) == SVt_PVGV && GvGP(sv)) {
51371543 9136 if ( SvOBJECT(GvSV(sv)) ||
155aba94
GS
9137 (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
9138 (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
9139 (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
9140 (GvCV(sv) && SvOBJECT(GvCV(sv))) )
51371543
GS
9141 {
9142 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv));)
9143 SvREFCNT_dec(sv);
9144 }
9145 }
9146}
9147#endif
9148
9149static void
9150do_clean_all(pTHXo_ SV *sv)
9151{
1d7c1841 9152 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) );)
51371543
GS
9153 SvFLAGS(sv) |= SVf_BREAK;
9154 SvREFCNT_dec(sv);
9155}
8af02333 9156