This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Test cases for #8385 (from Simon's "torture.pl")
[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. */
1570 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_2inuv_non '%s', IV=0x%"UVxf" NV=%g inttype=%X\n", SvPVX(sv), SvIVX(sv), nv, numtype));
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;
1628 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_2niuv_non UV? '%s', UV=0x%"UVxf" NV=%g U_V(NV)=0x%"UVxf" inttype=%X\n", SvPVX(sv), SvIVX(sv), nv, nv_as_uv, numtype));
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{
1651 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_2iuv_non '%s', IV=0x%"UVxf" NV=%g inttype=%X\n", SvPVX(sv), SvIVX(sv), SvNVX(sv), numtype));
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
NIS
2959 STRLEN len;
2960 if (SvREADONLY(sv) && SvFAKE(sv)) {
8a818333
NIS
2961 sv_force_normal(sv);
2962 s = SvPVX(sv);
2963 }
2964 len = SvCUR(sv) + 1; /* Plus the \0 */
00df9076 2965 SvPVX(sv) = (char*)bytes_to_utf8((U8*)s, &len);
841d7a39 2966 SvCUR(sv) = len - 1;
511c2ff0
NIS
2967 if (SvLEN(sv) != 0)
2968 Safefree(s); /* No longer using what was there before. */
841d7a39 2969 SvLEN(sv) = len; /* No longer know the real size. */
560a288e
GS
2970 SvUTF8_on(sv);
2971 }
2972}
2973
c461cf8f
JH
2974/*
2975=for apidoc sv_utf8_downgrade
2976
2977Attempt to convert the PV of an SV from UTF8-encoded to byte encoding.
2978This may not be possible if the PV contains non-byte encoding characters;
2979if this is the case, either returns false or, if C<fail_ok> is not
2980true, croaks.
2981
2982=cut
2983*/
2984
560a288e
GS
2985bool
2986Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
2987{
2988 if (SvPOK(sv) && SvUTF8(sv)) {
fa301091
JH
2989 if (SvCUR(sv)) {
2990 char *c = SvPVX(sv);
2991 STRLEN len = SvCUR(sv);
2992
2993 if (!utf8_to_bytes((U8*)c, &len)) {
2994 if (fail_ok)
2995 return FALSE;
2996 else {
2997 if (PL_op)
2998 Perl_croak(aTHX_ "Wide character in %s",
2999 PL_op_desc[PL_op->op_type]);
3000 else
3001 Perl_croak(aTHX_ "Wide character");
3002 }
4b3603a4 3003 }
fa301091 3004 SvCUR(sv) = len;
67e989fb 3005 }
9f9ab905 3006 SvUTF8_off(sv);
560a288e 3007 }
fa301091 3008
560a288e
GS
3009 return TRUE;
3010}
3011
c461cf8f
JH
3012/*
3013=for apidoc sv_utf8_encode
3014
3015Convert the PV of an SV to UTF8-encoded, but then turn off the C<SvUTF8>
1c846c1f 3016flag so that it looks like bytes again. Nothing calls this.
c461cf8f
JH
3017
3018=cut
3019*/
3020
560a288e
GS
3021void
3022Perl_sv_utf8_encode(pTHX_ register SV *sv)
3023{
3024 sv_utf8_upgrade(sv);
3025 SvUTF8_off(sv);
3026}
3027
3028bool
3029Perl_sv_utf8_decode(pTHX_ register SV *sv)
3030{
3031 if (SvPOK(sv)) {
3032 char *c;
511c2ff0 3033 char *e;
560a288e
GS
3034 bool has_utf = FALSE;
3035 if (!sv_utf8_downgrade(sv, TRUE))
3036 return FALSE;
3037
3038 /* it is actually just a matter of turning the utf8 flag on, but
3039 * we want to make sure everything inside is valid utf8 first.
3040 */
3041 c = SvPVX(sv);
00df9076 3042 if (!is_utf8_string((U8*)c, SvCUR(sv)+1))
67e989fb 3043 return FALSE;
511c2ff0
NIS
3044 e = SvEND(sv);
3045 while (c < e) {
fd400ab9 3046 if (UTF8_IS_CONTINUED(*c++)) {
67e989fb
JH
3047 SvUTF8_on(sv);
3048 break;
3049 }
560a288e 3050 }
560a288e
GS
3051 }
3052 return TRUE;
3053}
3054
3055
79072805 3056/* Note: sv_setsv() should not be called with a source string that needs
463ee0b2 3057 * to be reused, since it may destroy the source string if it is marked
79072805
LW
3058 * as temporary.
3059 */
3060
954c1994
GS
3061/*
3062=for apidoc sv_setsv
3063
3064Copies the contents of the source SV C<ssv> into the destination SV C<dsv>.
3065The source SV may be destroyed if it is mortal. Does not handle 'set'
3066magic. See the macro forms C<SvSetSV>, C<SvSetSV_nosteal> and
3067C<sv_setsv_mg>.
3068
3069=cut
3070*/
3071
79072805 3072void
864dbfa3 3073Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
79072805 3074{
8990e307
LW
3075 register U32 sflags;
3076 register int dtype;
3077 register int stype;
463ee0b2 3078
79072805
LW
3079 if (sstr == dstr)
3080 return;
2213622d 3081 SV_CHECK_THINKFIRST(dstr);
79072805 3082 if (!sstr)
3280af22 3083 sstr = &PL_sv_undef;
8990e307
LW
3084 stype = SvTYPE(sstr);
3085 dtype = SvTYPE(dstr);
79072805 3086
a0d0e21e 3087 SvAMAGIC_off(dstr);
9e7bc3e8 3088
463ee0b2 3089 /* There's a lot of redundancy below but we're going for speed here */
79072805 3090
8990e307 3091 switch (stype) {
79072805 3092 case SVt_NULL:
aece5585 3093 undef_sstr:
20408e3c
GS
3094 if (dtype != SVt_PVGV) {
3095 (void)SvOK_off(dstr);
3096 return;
3097 }
3098 break;
463ee0b2 3099 case SVt_IV:
aece5585
GA
3100 if (SvIOK(sstr)) {
3101 switch (dtype) {
3102 case SVt_NULL:
8990e307 3103 sv_upgrade(dstr, SVt_IV);
aece5585
GA
3104 break;
3105 case SVt_NV:
8990e307 3106 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
3107 break;
3108 case SVt_RV:
3109 case SVt_PV:
a0d0e21e 3110 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
3111 break;
3112 }
3113 (void)SvIOK_only(dstr);
3114 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
3115 if (SvIsUV(sstr))
3116 SvIsUV_on(dstr);
27c9684d
AP
3117 if (SvTAINTED(sstr))
3118 SvTAINT(dstr);
aece5585 3119 return;
8990e307 3120 }
aece5585
GA
3121 goto undef_sstr;
3122
463ee0b2 3123 case SVt_NV:
aece5585
GA
3124 if (SvNOK(sstr)) {
3125 switch (dtype) {
3126 case SVt_NULL:
3127 case SVt_IV:
8990e307 3128 sv_upgrade(dstr, SVt_NV);
aece5585
GA
3129 break;
3130 case SVt_RV:
3131 case SVt_PV:
3132 case SVt_PVIV:
a0d0e21e 3133 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
3134 break;
3135 }
3136 SvNVX(dstr) = SvNVX(sstr);
3137 (void)SvNOK_only(dstr);
27c9684d
AP
3138 if (SvTAINTED(sstr))
3139 SvTAINT(dstr);
aece5585 3140 return;
8990e307 3141 }
aece5585
GA
3142 goto undef_sstr;
3143
ed6116ce 3144 case SVt_RV:
8990e307 3145 if (dtype < SVt_RV)
ed6116ce 3146 sv_upgrade(dstr, SVt_RV);
c07a80fd 3147 else if (dtype == SVt_PVGV &&
3148 SvTYPE(SvRV(sstr)) == SVt_PVGV) {
3149 sstr = SvRV(sstr);
a5f75d66 3150 if (sstr == dstr) {
1d7c1841
GS
3151 if (GvIMPORTED(dstr) != GVf_IMPORTED
3152 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3153 {
a5f75d66 3154 GvIMPORTED_on(dstr);
1d7c1841 3155 }
a5f75d66
AD
3156 GvMULTI_on(dstr);
3157 return;
3158 }
c07a80fd 3159 goto glob_assign;
3160 }
ed6116ce 3161 break;
463ee0b2 3162 case SVt_PV:
fc36a67e 3163 case SVt_PVFM:
8990e307 3164 if (dtype < SVt_PV)
463ee0b2 3165 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
3166 break;
3167 case SVt_PVIV:
8990e307 3168 if (dtype < SVt_PVIV)
463ee0b2 3169 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
3170 break;
3171 case SVt_PVNV:
8990e307 3172 if (dtype < SVt_PVNV)
463ee0b2 3173 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 3174 break;
4633a7c4
LW
3175 case SVt_PVAV:
3176 case SVt_PVHV:
3177 case SVt_PVCV:
4633a7c4 3178 case SVt_PVIO:
533c011a 3179 if (PL_op)
cea2e8a9 3180 Perl_croak(aTHX_ "Bizarre copy of %s in %s", sv_reftype(sstr, 0),
22c35a8c 3181 PL_op_name[PL_op->op_type]);
4633a7c4 3182 else
cea2e8a9 3183 Perl_croak(aTHX_ "Bizarre copy of %s", sv_reftype(sstr, 0));
4633a7c4
LW
3184 break;
3185
79072805 3186 case SVt_PVGV:
8990e307 3187 if (dtype <= SVt_PVGV) {
c07a80fd 3188 glob_assign:
a5f75d66 3189 if (dtype != SVt_PVGV) {
a0d0e21e
LW
3190 char *name = GvNAME(sstr);
3191 STRLEN len = GvNAMELEN(sstr);
463ee0b2 3192 sv_upgrade(dstr, SVt_PVGV);
6662521e 3193 sv_magic(dstr, dstr, '*', Nullch, 0);
85aff577 3194 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
3195 GvNAME(dstr) = savepvn(name, len);
3196 GvNAMELEN(dstr) = len;
3197 SvFAKE_on(dstr); /* can coerce to non-glob */
3198 }
7bac28a0 3199 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
3200 else if (PL_curstackinfo->si_type == PERLSI_SORT
3201 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
cea2e8a9 3202 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
7bac28a0 3203 GvNAME(dstr));
a0d0e21e 3204 (void)SvOK_off(dstr);
a5f75d66 3205 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 3206 gp_free((GV*)dstr);
79072805 3207 GvGP(dstr) = gp_ref(GvGP(sstr));
27c9684d
AP
3208 if (SvTAINTED(sstr))
3209 SvTAINT(dstr);
1d7c1841
GS
3210 if (GvIMPORTED(dstr) != GVf_IMPORTED
3211 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3212 {
a5f75d66 3213 GvIMPORTED_on(dstr);
1d7c1841 3214 }
a5f75d66 3215 GvMULTI_on(dstr);
79072805
LW
3216 return;
3217 }
3218 /* FALL THROUGH */
3219
3220 default:
973f89ab
CS
3221 if (SvGMAGICAL(sstr)) {
3222 mg_get(sstr);
3223 if (SvTYPE(sstr) != stype) {
3224 stype = SvTYPE(sstr);
3225 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
3226 goto glob_assign;
3227 }
3228 }
ded42b9f 3229 if (stype == SVt_PVLV)
6fc92669 3230 (void)SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 3231 else
6fc92669 3232 (void)SvUPGRADE(dstr, stype);
79072805
LW
3233 }
3234
8990e307
LW
3235 sflags = SvFLAGS(sstr);
3236
3237 if (sflags & SVf_ROK) {
3238 if (dtype >= SVt_PV) {
3239 if (dtype == SVt_PVGV) {
3240 SV *sref = SvREFCNT_inc(SvRV(sstr));
3241 SV *dref = 0;
a5f75d66 3242 int intro = GvINTRO(dstr);
a0d0e21e
LW
3243
3244 if (intro) {
3245 GP *gp;
1d7c1841 3246 gp_free((GV*)dstr);
a5f75d66 3247 GvINTRO_off(dstr); /* one-shot flag */
a0d0e21e 3248 Newz(602,gp, 1, GP);
44a8e56a 3249 GvGP(dstr) = gp_ref(gp);
a0d0e21e 3250 GvSV(dstr) = NEWSV(72,0);
1d7c1841 3251 GvLINE(dstr) = CopLINE(PL_curcop);
1edc1566 3252 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 3253 }
a5f75d66 3254 GvMULTI_on(dstr);
8990e307
LW
3255 switch (SvTYPE(sref)) {
3256 case SVt_PVAV:
a0d0e21e
LW
3257 if (intro)
3258 SAVESPTR(GvAV(dstr));
3259 else
3260 dref = (SV*)GvAV(dstr);
8990e307 3261 GvAV(dstr) = (AV*)sref;
39bac7f7 3262 if (!GvIMPORTED_AV(dstr)
1d7c1841
GS
3263 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3264 {
a5f75d66 3265 GvIMPORTED_AV_on(dstr);
1d7c1841 3266 }
8990e307
LW
3267 break;
3268 case SVt_PVHV:
a0d0e21e
LW
3269 if (intro)
3270 SAVESPTR(GvHV(dstr));
3271 else
3272 dref = (SV*)GvHV(dstr);
8990e307 3273 GvHV(dstr) = (HV*)sref;
39bac7f7 3274 if (!GvIMPORTED_HV(dstr)
1d7c1841
GS
3275 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3276 {
a5f75d66 3277 GvIMPORTED_HV_on(dstr);
1d7c1841 3278 }
8990e307
LW
3279 break;
3280 case SVt_PVCV:
8ebc5c01 3281 if (intro) {
3282 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
3283 SvREFCNT_dec(GvCV(dstr));
3284 GvCV(dstr) = Nullcv;
68dc0745 3285 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 3286 PL_sub_generation++;
8ebc5c01 3287 }
a0d0e21e 3288 SAVESPTR(GvCV(dstr));
8ebc5c01 3289 }
68dc0745 3290 else
3291 dref = (SV*)GvCV(dstr);
3292 if (GvCV(dstr) != (CV*)sref) {
748a9306 3293 CV* cv = GvCV(dstr);
4633a7c4 3294 if (cv) {
68dc0745 3295 if (!GvCVGEN((GV*)dstr) &&
3296 (CvROOT(cv) || CvXSUB(cv)))
3297 {
beab0874 3298 SV *const_sv;
7bac28a0 3299 /* ahem, death to those who redefine
3300 * active sort subs */
3280af22
NIS
3301 if (PL_curstackinfo->si_type == PERLSI_SORT &&
3302 PL_sortcop == CvSTART(cv))
1c846c1f 3303 Perl_croak(aTHX_
7bac28a0 3304 "Can't redefine active sort subroutine %s",
3305 GvENAME((GV*)dstr));
beab0874
JT
3306 /* Redefining a sub - warning is mandatory if
3307 it was a const and its value changed. */
3308 if (ckWARN(WARN_REDEFINE)
3309 || (CvCONST(cv)
3310 && (!CvCONST((CV*)sref)
3311 || sv_cmp(cv_const_sv(cv),
3312 cv_const_sv((CV*)sref)))))
3313 {
3314 Perl_warner(aTHX_ WARN_REDEFINE,
3315 CvCONST(cv)
3316 ? "Constant subroutine %s redefined"
47deb5e7 3317 : "Subroutine %s redefined",
beab0874
JT
3318 GvENAME((GV*)dstr));
3319 }
9607fc9c 3320 }
3fe9a6f1 3321 cv_ckproto(cv, (GV*)dstr,
3322 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 3323 }
a5f75d66 3324 GvCV(dstr) = (CV*)sref;
7a4c00b4 3325 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 3326 GvASSUMECV_on(dstr);
3280af22 3327 PL_sub_generation++;
a5f75d66 3328 }
39bac7f7 3329 if (!GvIMPORTED_CV(dstr)
1d7c1841
GS
3330 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3331 {
a5f75d66 3332 GvIMPORTED_CV_on(dstr);
1d7c1841 3333 }
8990e307 3334 break;
91bba347
LW
3335 case SVt_PVIO:
3336 if (intro)
3337 SAVESPTR(GvIOp(dstr));
3338 else
3339 dref = (SV*)GvIOp(dstr);
3340 GvIOp(dstr) = (IO*)sref;
3341 break;
f4d13ee9
JH
3342 case SVt_PVFM:
3343 if (intro)
3344 SAVESPTR(GvFORM(dstr));
3345 else
3346 dref = (SV*)GvFORM(dstr);
3347 GvFORM(dstr) = (CV*)sref;
3348 break;
8990e307 3349 default:
a0d0e21e
LW
3350 if (intro)
3351 SAVESPTR(GvSV(dstr));
3352 else
3353 dref = (SV*)GvSV(dstr);
8990e307 3354 GvSV(dstr) = sref;
39bac7f7 3355 if (!GvIMPORTED_SV(dstr)
1d7c1841
GS
3356 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3357 {
a5f75d66 3358 GvIMPORTED_SV_on(dstr);
1d7c1841 3359 }
8990e307
LW
3360 break;
3361 }
3362 if (dref)
3363 SvREFCNT_dec(dref);
a0d0e21e
LW
3364 if (intro)
3365 SAVEFREESV(sref);
27c9684d
AP
3366 if (SvTAINTED(sstr))
3367 SvTAINT(dstr);
8990e307
LW
3368 return;
3369 }
a0d0e21e 3370 if (SvPVX(dstr)) {
760ac839 3371 (void)SvOOK_off(dstr); /* backoff */
50483b2c
JD
3372 if (SvLEN(dstr))
3373 Safefree(SvPVX(dstr));
a0d0e21e
LW
3374 SvLEN(dstr)=SvCUR(dstr)=0;
3375 }
8990e307 3376 }
a0d0e21e 3377 (void)SvOK_off(dstr);
8990e307 3378 SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
ed6116ce 3379 SvROK_on(dstr);
8990e307 3380 if (sflags & SVp_NOK) {
ed6116ce
LW
3381 SvNOK_on(dstr);
3382 SvNVX(dstr) = SvNVX(sstr);
3383 }
8990e307 3384 if (sflags & SVp_IOK) {
a0d0e21e 3385 (void)SvIOK_on(dstr);
ed6116ce 3386 SvIVX(dstr) = SvIVX(sstr);
2b1c7e3e 3387 if (sflags & SVf_IVisUV)
25da4f38 3388 SvIsUV_on(dstr);
ed6116ce 3389 }
a0d0e21e
LW
3390 if (SvAMAGIC(sstr)) {
3391 SvAMAGIC_on(dstr);
3392 }
ed6116ce 3393 }
8990e307 3394 else if (sflags & SVp_POK) {
79072805
LW
3395
3396 /*
3397 * Check to see if we can just swipe the string. If so, it's a
3398 * possible small lose on short strings, but a big win on long ones.
463ee0b2
LW
3399 * It might even be a win on short strings if SvPVX(dstr)
3400 * has to be allocated and SvPVX(sstr) has to be freed.
79072805
LW
3401 */
3402
ff68c719 3403 if (SvTEMP(sstr) && /* slated for free anyway? */
01b73108 3404 SvREFCNT(sstr) == 1 && /* and no other references to it? */
1c846c1f 3405 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
4c8f17b9
BH
3406 SvLEN(sstr) && /* and really is a string */
3407 !(PL_op && PL_op->op_type == OP_AASSIGN)) /* and won't be needed again, potentially */
a5f75d66 3408 {
adbc6bb1 3409 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
3410 if (SvOOK(dstr)) {
3411 SvFLAGS(dstr) &= ~SVf_OOK;
3412 Safefree(SvPVX(dstr) - SvIVX(dstr));
3413 }
50483b2c 3414 else if (SvLEN(dstr))
a5f75d66 3415 Safefree(SvPVX(dstr));
79072805 3416 }
a5f75d66 3417 (void)SvPOK_only(dstr);
463ee0b2 3418 SvPV_set(dstr, SvPVX(sstr));
79072805
LW
3419 SvLEN_set(dstr, SvLEN(sstr));
3420 SvCUR_set(dstr, SvCUR(sstr));
f4e86e0f 3421
79072805 3422 SvTEMP_off(dstr);
2b1c7e3e 3423 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
79072805
LW
3424 SvPV_set(sstr, Nullch);
3425 SvLEN_set(sstr, 0);
a5f75d66
AD
3426 SvCUR_set(sstr, 0);
3427 SvTEMP_off(sstr);
79072805
LW
3428 }
3429 else { /* have to copy actual string */
8990e307
LW
3430 STRLEN len = SvCUR(sstr);
3431
3432 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3433 Move(SvPVX(sstr),SvPVX(dstr),len,char);
3434 SvCUR_set(dstr, len);
3435 *SvEND(dstr) = '\0';
a0d0e21e 3436 (void)SvPOK_only(dstr);
79072805 3437 }
3aa33fe5 3438 if ((sflags & SVf_UTF8) && !IN_BYTE)
a7cb1f99 3439 SvUTF8_on(dstr);
79072805 3440 /*SUPPRESS 560*/
8990e307 3441 if (sflags & SVp_NOK) {
79072805 3442 SvNOK_on(dstr);
463ee0b2 3443 SvNVX(dstr) = SvNVX(sstr);
79072805 3444 }
8990e307 3445 if (sflags & SVp_IOK) {
a0d0e21e 3446 (void)SvIOK_on(dstr);
463ee0b2 3447 SvIVX(dstr) = SvIVX(sstr);
2b1c7e3e 3448 if (sflags & SVf_IVisUV)
25da4f38 3449 SvIsUV_on(dstr);
79072805
LW
3450 }
3451 }
8990e307 3452 else if (sflags & SVp_NOK) {
463ee0b2 3453 SvNVX(dstr) = SvNVX(sstr);
a0d0e21e 3454 (void)SvNOK_only(dstr);
2b1c7e3e 3455 if (sflags & SVf_IOK) {
a0d0e21e 3456 (void)SvIOK_on(dstr);
463ee0b2 3457 SvIVX(dstr) = SvIVX(sstr);
25da4f38 3458 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2b1c7e3e 3459 if (sflags & SVf_IVisUV)
25da4f38 3460 SvIsUV_on(dstr);
79072805
LW
3461 }
3462 }
8990e307 3463 else if (sflags & SVp_IOK) {
a0d0e21e 3464 (void)SvIOK_only(dstr);
463ee0b2 3465 SvIVX(dstr) = SvIVX(sstr);
2b1c7e3e 3466 if (sflags & SVf_IVisUV)
25da4f38 3467 SvIsUV_on(dstr);
79072805
LW
3468 }
3469 else {
20408e3c 3470 if (dtype == SVt_PVGV) {
e476b1b5
GS
3471 if (ckWARN(WARN_MISC))
3472 Perl_warner(aTHX_ WARN_MISC, "Undefined value assigned to typeglob");
20408e3c
GS
3473 }
3474 else
3475 (void)SvOK_off(dstr);
a0d0e21e 3476 }
27c9684d
AP
3477 if (SvTAINTED(sstr))
3478 SvTAINT(dstr);
79072805
LW
3479}
3480
954c1994
GS
3481/*
3482=for apidoc sv_setsv_mg
3483
3484Like C<sv_setsv>, but also handles 'set' magic.
3485
3486=cut
3487*/
3488
79072805 3489void
864dbfa3 3490Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
3491{
3492 sv_setsv(dstr,sstr);
3493 SvSETMAGIC(dstr);
3494}
3495
954c1994
GS
3496/*
3497=for apidoc sv_setpvn
3498
3499Copies a string into an SV. The C<len> parameter indicates the number of
3500bytes to be copied. Does not handle 'set' magic. See C<sv_setpvn_mg>.
3501
3502=cut
3503*/
3504
ef50df4b 3505void
864dbfa3 3506Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 3507{
c6f8c383 3508 register char *dptr;
793db0cb
JH
3509 {
3510 /* len is STRLEN which is unsigned, need to copy to signed */
3511 IV iv = len;
3512 assert(iv >= 0);
3513 }
2213622d 3514 SV_CHECK_THINKFIRST(sv);
463ee0b2 3515 if (!ptr) {
a0d0e21e 3516 (void)SvOK_off(sv);
463ee0b2
LW
3517 return;
3518 }
6fc92669 3519 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 3520
79072805 3521 SvGROW(sv, len + 1);
c6f8c383
GA
3522 dptr = SvPVX(sv);
3523 Move(ptr,dptr,len,char);
3524 dptr[len] = '\0';
79072805 3525 SvCUR_set(sv, len);
1aa99e6b 3526 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3527 SvTAINT(sv);
79072805
LW
3528}
3529
954c1994
GS
3530/*
3531=for apidoc sv_setpvn_mg
3532
3533Like C<sv_setpvn>, but also handles 'set' magic.
3534
3535=cut
3536*/
3537
79072805 3538void
864dbfa3 3539Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
3540{
3541 sv_setpvn(sv,ptr,len);
3542 SvSETMAGIC(sv);
3543}
3544
954c1994
GS
3545/*
3546=for apidoc sv_setpv
3547
3548Copies a string into an SV. The string must be null-terminated. Does not
3549handle 'set' magic. See C<sv_setpv_mg>.
3550
3551=cut
3552*/
3553
ef50df4b 3554void
864dbfa3 3555Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
3556{
3557 register STRLEN len;
3558
2213622d 3559 SV_CHECK_THINKFIRST(sv);
463ee0b2 3560 if (!ptr) {
a0d0e21e 3561 (void)SvOK_off(sv);
463ee0b2
LW
3562 return;
3563 }
79072805 3564 len = strlen(ptr);
6fc92669 3565 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 3566
79072805 3567 SvGROW(sv, len + 1);
463ee0b2 3568 Move(ptr,SvPVX(sv),len+1,char);
79072805 3569 SvCUR_set(sv, len);
1aa99e6b 3570 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
3571 SvTAINT(sv);
3572}
3573
954c1994
GS
3574/*
3575=for apidoc sv_setpv_mg
3576
3577Like C<sv_setpv>, but also handles 'set' magic.
3578
3579=cut
3580*/
3581
463ee0b2 3582void
864dbfa3 3583Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
3584{
3585 sv_setpv(sv,ptr);
3586 SvSETMAGIC(sv);
3587}
3588
954c1994
GS
3589/*
3590=for apidoc sv_usepvn
3591
3592Tells an SV to use C<ptr> to find its string value. Normally the string is
1c846c1f 3593stored inside the SV but sv_usepvn allows the SV to use an outside string.
954c1994
GS
3594The C<ptr> should point to memory that was allocated by C<malloc>. The
3595string length, C<len>, must be supplied. This function will realloc the
3596memory pointed to by C<ptr>, so that pointer should not be freed or used by
3597the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
3598See C<sv_usepvn_mg>.
3599
3600=cut
3601*/
3602
ef50df4b 3603void
864dbfa3 3604Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 3605{
2213622d 3606 SV_CHECK_THINKFIRST(sv);
c6f8c383 3607 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 3608 if (!ptr) {
a0d0e21e 3609 (void)SvOK_off(sv);
463ee0b2
LW
3610 return;
3611 }
a0ed51b3 3612 (void)SvOOK_off(sv);
50483b2c 3613 if (SvPVX(sv) && SvLEN(sv))
463ee0b2
LW
3614 Safefree(SvPVX(sv));
3615 Renew(ptr, len+1, char);
3616 SvPVX(sv) = ptr;
3617 SvCUR_set(sv, len);
3618 SvLEN_set(sv, len+1);
3619 *SvEND(sv) = '\0';
1aa99e6b 3620 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3621 SvTAINT(sv);
79072805
LW
3622}
3623
954c1994
GS
3624/*
3625=for apidoc sv_usepvn_mg
3626
3627Like C<sv_usepvn>, but also handles 'set' magic.
3628
3629=cut
3630*/
3631
ef50df4b 3632void
864dbfa3 3633Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
ef50df4b 3634{
51c1089b 3635 sv_usepvn(sv,ptr,len);
ef50df4b
GS
3636 SvSETMAGIC(sv);
3637}
3638
6fc92669 3639void
840a7b70 3640Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 3641{
2213622d 3642 if (SvREADONLY(sv)) {
1c846c1f
NIS
3643 if (SvFAKE(sv)) {
3644 char *pvx = SvPVX(sv);
3645 STRLEN len = SvCUR(sv);
3646 U32 hash = SvUVX(sv);
3647 SvGROW(sv, len + 1);
3648 Move(pvx,SvPVX(sv),len,char);
3649 *SvEND(sv) = '\0';
3650 SvFAKE_off(sv);
3651 SvREADONLY_off(sv);
c3654f1a 3652 unsharepvn(pvx,SvUTF8(sv)?-len:len,hash);
1c846c1f
NIS
3653 }
3654 else if (PL_curcop != &PL_compiling)
cea2e8a9 3655 Perl_croak(aTHX_ PL_no_modify);
0f15f207 3656 }
2213622d 3657 if (SvROK(sv))
840a7b70 3658 sv_unref_flags(sv, flags);
6fc92669
GS
3659 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
3660 sv_unglob(sv);
0f15f207 3661}
1c846c1f 3662
840a7b70
IZ
3663void
3664Perl_sv_force_normal(pTHX_ register SV *sv)
3665{
3666 sv_force_normal_flags(sv, 0);
3667}
3668
954c1994
GS
3669/*
3670=for apidoc sv_chop
3671
1c846c1f 3672Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
3673SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
3674the string buffer. The C<ptr> becomes the first character of the adjusted
3675string.
3676
3677=cut
3678*/
3679
79072805 3680void
864dbfa3 3681Perl_sv_chop(pTHX_ register SV *sv, register char *ptr) /* like set but assuming ptr is in sv */
1c846c1f
NIS
3682
3683
79072805
LW
3684{
3685 register STRLEN delta;
3686
a0d0e21e 3687 if (!ptr || !SvPOKp(sv))
79072805 3688 return;
2213622d 3689 SV_CHECK_THINKFIRST(sv);
79072805
LW
3690 if (SvTYPE(sv) < SVt_PVIV)
3691 sv_upgrade(sv,SVt_PVIV);
3692
3693 if (!SvOOK(sv)) {
50483b2c
JD
3694 if (!SvLEN(sv)) { /* make copy of shared string */
3695 char *pvx = SvPVX(sv);
3696 STRLEN len = SvCUR(sv);
3697 SvGROW(sv, len + 1);
3698 Move(pvx,SvPVX(sv),len,char);
3699 *SvEND(sv) = '\0';
3700 }
463ee0b2 3701 SvIVX(sv) = 0;
79072805
LW
3702 SvFLAGS(sv) |= SVf_OOK;
3703 }
25da4f38 3704 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK|SVf_IVisUV);
463ee0b2 3705 delta = ptr - SvPVX(sv);
79072805
LW
3706 SvLEN(sv) -= delta;
3707 SvCUR(sv) -= delta;
463ee0b2
LW
3708 SvPVX(sv) += delta;
3709 SvIVX(sv) += delta;
79072805
LW
3710}
3711
954c1994
GS
3712/*
3713=for apidoc sv_catpvn
3714
3715Concatenates the string onto the end of the string which is in the SV. The
3716C<len> indicates number of bytes to copy. Handles 'get' magic, but not
3717'set' magic. See C<sv_catpvn_mg>.
3718
3719=cut
3720*/
3721
79072805 3722void
864dbfa3 3723Perl_sv_catpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 3724{
463ee0b2 3725 STRLEN tlen;
748a9306 3726 char *junk;
a0d0e21e 3727
748a9306 3728 junk = SvPV_force(sv, tlen);
463ee0b2 3729 SvGROW(sv, tlen + len + 1);
4633a7c4
LW
3730 if (ptr == junk)
3731 ptr = SvPVX(sv);
463ee0b2 3732 Move(ptr,SvPVX(sv)+tlen,len,char);
79072805
LW
3733 SvCUR(sv) += len;
3734 *SvEND(sv) = '\0';
d41ff1b8 3735 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3736 SvTAINT(sv);
79072805
LW
3737}
3738
954c1994
GS
3739/*
3740=for apidoc sv_catpvn_mg
3741
3742Like C<sv_catpvn>, but also handles 'set' magic.
3743
3744=cut
3745*/
3746
79072805 3747void
864dbfa3 3748Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
3749{
3750 sv_catpvn(sv,ptr,len);
3751 SvSETMAGIC(sv);
3752}
3753
954c1994
GS
3754/*
3755=for apidoc sv_catsv
3756
13e8c8e3
JH
3757Concatenates the string from SV C<ssv> onto the end of the string in
3758SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
3759not 'set' magic. See C<sv_catsv_mg>.
954c1994 3760
13e8c8e3 3761=cut */
954c1994 3762
ef50df4b 3763void
46199a12 3764Perl_sv_catsv(pTHX_ SV *dsv, register SV *ssv)
79072805 3765{
13e8c8e3
JH
3766 char *spv;
3767 STRLEN slen;
46199a12 3768 if (!ssv)
79072805 3769 return;
46199a12
JH
3770 if ((spv = SvPV(ssv, slen))) {
3771 bool dutf8 = DO_UTF8(dsv);
3772 bool sutf8 = DO_UTF8(ssv);
13e8c8e3
JH
3773
3774 if (dutf8 == sutf8)
46199a12 3775 sv_catpvn(dsv,spv,slen);
13e8c8e3
JH
3776 else {
3777 if (dutf8) {
46199a12
JH
3778 /* Not modifying source SV, so taking a temporary copy. */
3779 SV* csv = sv_2mortal(newSVsv(ssv));
13e8c8e3
JH
3780 char *cpv;
3781 STRLEN clen;
3782
46199a12
JH
3783 sv_utf8_upgrade(csv);
3784 cpv = SvPV(csv,clen);
3785 sv_catpvn(dsv,cpv,clen);
13e8c8e3
JH
3786 }
3787 else {
46199a12
JH
3788 sv_utf8_upgrade(dsv);
3789 sv_catpvn(dsv,spv,slen);
3790 SvUTF8_on(dsv); /* If dsv has no wide characters. */
13e8c8e3 3791 }
e84ff256 3792 }
560a288e 3793 }
79072805
LW
3794}
3795
954c1994
GS
3796/*
3797=for apidoc sv_catsv_mg
3798
3799Like C<sv_catsv>, but also handles 'set' magic.
3800
3801=cut
3802*/
3803
79072805 3804void
46199a12 3805Perl_sv_catsv_mg(pTHX_ SV *dsv, register SV *ssv)
ef50df4b 3806{
46199a12
JH
3807 sv_catsv(dsv,ssv);
3808 SvSETMAGIC(dsv);
ef50df4b
GS
3809}
3810
954c1994
GS
3811/*
3812=for apidoc sv_catpv
3813
3814Concatenates the string onto the end of the string which is in the SV.
3815Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
3816
3817=cut
3818*/
3819
ef50df4b 3820void
0c981600 3821Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
3822{
3823 register STRLEN len;
463ee0b2 3824 STRLEN tlen;
748a9306 3825 char *junk;
79072805 3826
0c981600 3827 if (!ptr)
79072805 3828 return;
748a9306 3829 junk = SvPV_force(sv, tlen);
0c981600 3830 len = strlen(ptr);
463ee0b2 3831 SvGROW(sv, tlen + len + 1);
0c981600
JH
3832 if (ptr == junk)
3833 ptr = SvPVX(sv);
3834 Move(ptr,SvPVX(sv)+tlen,len+1,char);
79072805 3835 SvCUR(sv) += len;
d41ff1b8 3836 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3837 SvTAINT(sv);
79072805
LW
3838}
3839
954c1994
GS
3840/*
3841=for apidoc sv_catpv_mg
3842
3843Like C<sv_catpv>, but also handles 'set' magic.
3844
3845=cut
3846*/
3847
ef50df4b 3848void
0c981600 3849Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 3850{
0c981600 3851 sv_catpv(sv,ptr);
ef50df4b
GS
3852 SvSETMAGIC(sv);
3853}
3854
79072805 3855SV *
864dbfa3 3856Perl_newSV(pTHX_ STRLEN len)
79072805
LW
3857{
3858 register SV *sv;
1c846c1f 3859
4561caa4 3860 new_SV(sv);
79072805
LW
3861 if (len) {
3862 sv_upgrade(sv, SVt_PV);
3863 SvGROW(sv, len + 1);
3864 }
3865 return sv;
3866}
3867
1edc1566 3868/* name is assumed to contain an SV* if (name && namelen == HEf_SVKEY) */
3869
954c1994
GS
3870/*
3871=for apidoc sv_magic
3872
3873Adds magic to an SV.
3874
3875=cut
3876*/
3877
79072805 3878void
864dbfa3 3879Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
79072805
LW
3880{
3881 MAGIC* mg;
1c846c1f 3882
0f15f207 3883 if (SvREADONLY(sv)) {
3280af22 3884 if (PL_curcop != &PL_compiling && !strchr("gBf", how))
cea2e8a9 3885 Perl_croak(aTHX_ PL_no_modify);
0f15f207 3886 }
4633a7c4 3887 if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
748a9306
LW
3888 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
3889 if (how == 't')
565764a8 3890 mg->mg_len |= 1;
463ee0b2 3891 return;
748a9306 3892 }
463ee0b2
LW
3893 }
3894 else {
c6f8c383 3895 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 3896 }
79072805
LW
3897 Newz(702,mg, 1, MAGIC);
3898 mg->mg_moremagic = SvMAGIC(sv);
463ee0b2 3899
79072805 3900 SvMAGIC(sv) = mg;
c277df42 3901 if (!obj || obj == sv || how == '#' || how == 'r')
8990e307 3902 mg->mg_obj = obj;
85e6fe83 3903 else {
8990e307 3904 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
3905 mg->mg_flags |= MGf_REFCOUNTED;
3906 }
79072805 3907 mg->mg_type = how;
565764a8 3908 mg->mg_len = namlen;
1edc1566 3909 if (name)
3910 if (namlen >= 0)
3911 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 3912 else if (namlen == HEf_SVKEY)
1edc1566 3913 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
1c846c1f 3914
79072805
LW
3915 switch (how) {
3916 case 0:
22c35a8c 3917 mg->mg_virtual = &PL_vtbl_sv;
79072805 3918 break;
a0d0e21e 3919 case 'A':
22c35a8c 3920 mg->mg_virtual = &PL_vtbl_amagic;
a0d0e21e
LW
3921 break;
3922 case 'a':
22c35a8c 3923 mg->mg_virtual = &PL_vtbl_amagicelem;
a0d0e21e
LW
3924 break;
3925 case 'c':
d460ef45 3926 mg->mg_virtual = &PL_vtbl_ovrld;
a0d0e21e 3927 break;
79072805 3928 case 'B':
22c35a8c 3929 mg->mg_virtual = &PL_vtbl_bm;
79072805 3930 break;
6cef1e77 3931 case 'D':
22c35a8c 3932 mg->mg_virtual = &PL_vtbl_regdata;
6cef1e77
IZ
3933 break;
3934 case 'd':
22c35a8c 3935 mg->mg_virtual = &PL_vtbl_regdatum;
6cef1e77 3936 break;
79072805 3937 case 'E':
22c35a8c 3938 mg->mg_virtual = &PL_vtbl_env;
79072805 3939 break;
55497cff 3940 case 'f':
22c35a8c 3941 mg->mg_virtual = &PL_vtbl_fm;
55497cff 3942 break;
79072805 3943 case 'e':
22c35a8c 3944 mg->mg_virtual = &PL_vtbl_envelem;
79072805 3945 break;
93a17b20 3946 case 'g':
22c35a8c 3947 mg->mg_virtual = &PL_vtbl_mglob;
93a17b20 3948 break;
463ee0b2 3949 case 'I':
22c35a8c 3950 mg->mg_virtual = &PL_vtbl_isa;
463ee0b2
LW
3951 break;
3952 case 'i':
22c35a8c 3953 mg->mg_virtual = &PL_vtbl_isaelem;
463ee0b2 3954 break;
16660edb 3955 case 'k':
22c35a8c 3956 mg->mg_virtual = &PL_vtbl_nkeys;
16660edb 3957 break;
79072805 3958 case 'L':
a0d0e21e 3959 SvRMAGICAL_on(sv);
93a17b20
LW
3960 mg->mg_virtual = 0;
3961 break;
3962 case 'l':
22c35a8c 3963 mg->mg_virtual = &PL_vtbl_dbline;
79072805 3964 break;
f93b4edd
MB
3965#ifdef USE_THREADS
3966 case 'm':
22c35a8c 3967 mg->mg_virtual = &PL_vtbl_mutex;
f93b4edd
MB
3968 break;
3969#endif /* USE_THREADS */
36477c24 3970#ifdef USE_LOCALE_COLLATE
bbce6d69 3971 case 'o':
22c35a8c 3972 mg->mg_virtual = &PL_vtbl_collxfrm;
bbce6d69 3973 break;
36477c24 3974#endif /* USE_LOCALE_COLLATE */
463ee0b2 3975 case 'P':
22c35a8c 3976 mg->mg_virtual = &PL_vtbl_pack;
463ee0b2
LW
3977 break;
3978 case 'p':
a0d0e21e 3979 case 'q':
22c35a8c 3980 mg->mg_virtual = &PL_vtbl_packelem;
463ee0b2 3981 break;
c277df42 3982 case 'r':
22c35a8c 3983 mg->mg_virtual = &PL_vtbl_regexp;
c277df42 3984 break;
79072805 3985 case 'S':
22c35a8c 3986 mg->mg_virtual = &PL_vtbl_sig;
79072805
LW
3987 break;
3988 case 's':
22c35a8c 3989 mg->mg_virtual = &PL_vtbl_sigelem;
79072805 3990 break;
463ee0b2 3991 case 't':
22c35a8c 3992 mg->mg_virtual = &PL_vtbl_taint;
565764a8 3993 mg->mg_len = 1;
463ee0b2 3994 break;
79072805 3995 case 'U':
22c35a8c 3996 mg->mg_virtual = &PL_vtbl_uvar;
79072805
LW
3997 break;
3998 case 'v':
22c35a8c 3999 mg->mg_virtual = &PL_vtbl_vec;
79072805
LW
4000 break;
4001 case 'x':
22c35a8c 4002 mg->mg_virtual = &PL_vtbl_substr;
79072805 4003 break;
5f05dabc 4004 case 'y':
22c35a8c 4005 mg->mg_virtual = &PL_vtbl_defelem;
5f05dabc 4006 break;
79072805 4007 case '*':
22c35a8c 4008 mg->mg_virtual = &PL_vtbl_glob;
79072805
LW
4009 break;
4010 case '#':
22c35a8c 4011 mg->mg_virtual = &PL_vtbl_arylen;
79072805 4012 break;
a0d0e21e 4013 case '.':
22c35a8c 4014 mg->mg_virtual = &PL_vtbl_pos;
a0d0e21e 4015 break;
810b8aa5
GS
4016 case '<':
4017 mg->mg_virtual = &PL_vtbl_backref;
4018 break;
4633a7c4
LW
4019 case '~': /* Reserved for use by extensions not perl internals. */
4020 /* Useful for attaching extension internal data to perl vars. */
4021 /* Note that multiple extensions may clash if magical scalars */
4022 /* etc holding private data from one are passed to another. */
4023 SvRMAGICAL_on(sv);
a0d0e21e 4024 break;
79072805 4025 default:
cea2e8a9 4026 Perl_croak(aTHX_ "Don't know how to handle magic of type '%c'", how);
463ee0b2 4027 }
8990e307
LW
4028 mg_magical(sv);
4029 if (SvGMAGICAL(sv))
4030 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
463ee0b2
LW
4031}
4032
c461cf8f
JH
4033/*
4034=for apidoc sv_unmagic
4035
4036Removes magic from an SV.
4037
4038=cut
4039*/
4040
463ee0b2 4041int
864dbfa3 4042Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
4043{
4044 MAGIC* mg;
4045 MAGIC** mgp;
91bba347 4046 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
4047 return 0;
4048 mgp = &SvMAGIC(sv);
4049 for (mg = *mgp; mg; mg = *mgp) {
4050 if (mg->mg_type == type) {
4051 MGVTBL* vtbl = mg->mg_virtual;
4052 *mgp = mg->mg_moremagic;
1d7c1841 4053 if (vtbl && vtbl->svt_free)
fc0dc3b3 4054 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
463ee0b2 4055 if (mg->mg_ptr && mg->mg_type != 'g')
565764a8 4056 if (mg->mg_len >= 0)
1edc1566 4057 Safefree(mg->mg_ptr);
565764a8 4058 else if (mg->mg_len == HEf_SVKEY)
1edc1566 4059 SvREFCNT_dec((SV*)mg->mg_ptr);
a0d0e21e
LW
4060 if (mg->mg_flags & MGf_REFCOUNTED)
4061 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
4062 Safefree(mg);
4063 }
4064 else
4065 mgp = &mg->mg_moremagic;
79072805 4066 }
91bba347 4067 if (!SvMAGIC(sv)) {
463ee0b2 4068 SvMAGICAL_off(sv);
8990e307 4069 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
4070 }
4071
4072 return 0;
79072805
LW
4073}
4074
c461cf8f
JH
4075/*
4076=for apidoc sv_rvweaken
4077
4078Weaken a reference.
4079
4080=cut
4081*/
4082
810b8aa5 4083SV *
864dbfa3 4084Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
4085{
4086 SV *tsv;
4087 if (!SvOK(sv)) /* let undefs pass */
4088 return sv;
4089 if (!SvROK(sv))
cea2e8a9 4090 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 4091 else if (SvWEAKREF(sv)) {
810b8aa5 4092 if (ckWARN(WARN_MISC))
cea2e8a9 4093 Perl_warner(aTHX_ WARN_MISC, "Reference is already weak");
810b8aa5
GS
4094 return sv;
4095 }
4096 tsv = SvRV(sv);
4097 sv_add_backref(tsv, sv);
4098 SvWEAKREF_on(sv);
1c846c1f 4099 SvREFCNT_dec(tsv);
810b8aa5
GS
4100 return sv;
4101}
4102
4103STATIC void
cea2e8a9 4104S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5
GS
4105{
4106 AV *av;
4107 MAGIC *mg;
4108 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, '<')))
4109 av = (AV*)mg->mg_obj;
4110 else {
4111 av = newAV();
4112 sv_magic(tsv, (SV*)av, '<', NULL, 0);
4113 SvREFCNT_dec(av); /* for sv_magic */
4114 }
4115 av_push(av,sv);
4116}
4117
1c846c1f 4118STATIC void
cea2e8a9 4119S_sv_del_backref(pTHX_ SV *sv)
810b8aa5
GS
4120{
4121 AV *av;
4122 SV **svp;
4123 I32 i;
4124 SV *tsv = SvRV(sv);
4125 MAGIC *mg;
4126 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, '<')))
cea2e8a9 4127 Perl_croak(aTHX_ "panic: del_backref");
810b8aa5
GS
4128 av = (AV *)mg->mg_obj;
4129 svp = AvARRAY(av);
4130 i = AvFILLp(av);
4131 while (i >= 0) {
4132 if (svp[i] == sv) {
4133 svp[i] = &PL_sv_undef; /* XXX */
4134 }
4135 i--;
4136 }
4137}
4138
954c1994
GS
4139/*
4140=for apidoc sv_insert
4141
4142Inserts a string at the specified offset/length within the SV. Similar to
4143the Perl substr() function.
4144
4145=cut
4146*/
4147
79072805 4148void
864dbfa3 4149Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
79072805
LW
4150{
4151 register char *big;
4152 register char *mid;
4153 register char *midend;
4154 register char *bigend;
4155 register I32 i;
6ff81951 4156 STRLEN curlen;
1c846c1f 4157
79072805 4158
8990e307 4159 if (!bigstr)
cea2e8a9 4160 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 4161 SvPV_force(bigstr, curlen);
60fa28ff 4162 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
4163 if (offset + len > curlen) {
4164 SvGROW(bigstr, offset+len+1);
4165 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
4166 SvCUR_set(bigstr, offset+len);
4167 }
79072805 4168
69b47968 4169 SvTAINT(bigstr);
79072805
LW
4170 i = littlelen - len;
4171 if (i > 0) { /* string might grow */
a0d0e21e 4172 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
4173 mid = big + offset + len;
4174 midend = bigend = big + SvCUR(bigstr);
4175 bigend += i;
4176 *bigend = '\0';
4177 while (midend > mid) /* shove everything down */
4178 *--bigend = *--midend;
4179 Move(little,big+offset,littlelen,char);
4180 SvCUR(bigstr) += i;
4181 SvSETMAGIC(bigstr);
4182 return;
4183 }
4184 else if (i == 0) {
463ee0b2 4185 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
4186 SvSETMAGIC(bigstr);
4187 return;
4188 }
4189
463ee0b2 4190 big = SvPVX(bigstr);
79072805
LW
4191 mid = big + offset;
4192 midend = mid + len;
4193 bigend = big + SvCUR(bigstr);
4194
4195 if (midend > bigend)
cea2e8a9 4196 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
4197
4198 if (mid - big > bigend - midend) { /* faster to shorten from end */
4199 if (littlelen) {
4200 Move(little, mid, littlelen,char);
4201 mid += littlelen;
4202 }
4203 i = bigend - midend;
4204 if (i > 0) {
4205 Move(midend, mid, i,char);
4206 mid += i;
4207 }
4208 *mid = '\0';
4209 SvCUR_set(bigstr, mid - big);
4210 }
4211 /*SUPPRESS 560*/
155aba94 4212 else if ((i = mid - big)) { /* faster from front */
79072805
LW
4213 midend -= littlelen;
4214 mid = midend;
4215 sv_chop(bigstr,midend-i);
4216 big += i;
4217 while (i--)
4218 *--midend = *--big;
4219 if (littlelen)
4220 Move(little, mid, littlelen,char);
4221 }
4222 else if (littlelen) {
4223 midend -= littlelen;
4224 sv_chop(bigstr,midend);
4225 Move(little,midend,littlelen,char);
4226 }
4227 else {
4228 sv_chop(bigstr,midend);
4229 }
4230 SvSETMAGIC(bigstr);
4231}
4232
c461cf8f
JH
4233/*
4234=for apidoc sv_replace
4235
4236Make the first argument a copy of the second, then delete the original.
4237
4238=cut
4239*/
79072805
LW
4240
4241void
864dbfa3 4242Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805
LW
4243{
4244 U32 refcnt = SvREFCNT(sv);
2213622d 4245 SV_CHECK_THINKFIRST(sv);
0453d815
PM
4246 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
4247 Perl_warner(aTHX_ WARN_INTERNAL, "Reference miscount in sv_replace()");
93a17b20 4248 if (SvMAGICAL(sv)) {
a0d0e21e
LW
4249 if (SvMAGICAL(nsv))
4250 mg_free(nsv);
4251 else
4252 sv_upgrade(nsv, SVt_PVMG);
93a17b20 4253 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 4254 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
4255 SvMAGICAL_off(sv);
4256 SvMAGIC(sv) = 0;
4257 }
79072805
LW
4258 SvREFCNT(sv) = 0;
4259 sv_clear(sv);
477f5d66 4260 assert(!SvREFCNT(sv));
79072805
LW
4261 StructCopy(nsv,sv,SV);
4262 SvREFCNT(sv) = refcnt;
1edc1566 4263 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
463ee0b2 4264 del_SV(nsv);
79072805
LW
4265}
4266
c461cf8f
JH
4267/*
4268=for apidoc sv_clear
4269
4270Clear an SV, making it empty. Does not free the memory used by the SV
4271itself.
4272
4273=cut
4274*/
4275
79072805 4276void
864dbfa3 4277Perl_sv_clear(pTHX_ register SV *sv)
79072805 4278{
ec12f114 4279 HV* stash;
79072805
LW
4280 assert(sv);
4281 assert(SvREFCNT(sv) == 0);
4282
ed6116ce 4283 if (SvOBJECT(sv)) {
3280af22 4284 if (PL_defstash) { /* Still have a symbol table? */
4e35701f 4285 djSP;
32251b26 4286 CV* destructor;
837485b6 4287 SV tmpref;
a0d0e21e 4288
837485b6
GS
4289 Zero(&tmpref, 1, SV);
4290 sv_upgrade(&tmpref, SVt_RV);
4291 SvROK_on(&tmpref);
4292 SvREADONLY_on(&tmpref); /* DESTROY() could be naughty */
4293 SvREFCNT(&tmpref) = 1;
8ebc5c01 4294
d460ef45 4295 do {
4e8e7886 4296 stash = SvSTASH(sv);
32251b26 4297 destructor = StashHANDLER(stash,DESTROY);
4e8e7886
GS
4298 if (destructor) {
4299 ENTER;
e788e7d3 4300 PUSHSTACKi(PERLSI_DESTROY);
837485b6 4301 SvRV(&tmpref) = SvREFCNT_inc(sv);
4e8e7886
GS
4302 EXTEND(SP, 2);
4303 PUSHMARK(SP);
837485b6 4304 PUSHs(&tmpref);
4e8e7886 4305 PUTBACK;
32251b26 4306 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR);
4e8e7886 4307 SvREFCNT(sv)--;
d3acc0f7 4308 POPSTACK;
3095d977 4309 SPAGAIN;
4e8e7886
GS
4310 LEAVE;
4311 }
4312 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 4313
837485b6 4314 del_XRV(SvANY(&tmpref));
6f44e0a4
JP
4315
4316 if (SvREFCNT(sv)) {
4317 if (PL_in_clean_objs)
cea2e8a9 4318 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
6f44e0a4
JP
4319 HvNAME(stash));
4320 /* DESTROY gave object new lease on life */
4321 return;
4322 }
a0d0e21e 4323 }
4e8e7886 4324
a0d0e21e 4325 if (SvOBJECT(sv)) {
4e8e7886 4326 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
4327 SvOBJECT_off(sv); /* Curse the object. */
4328 if (SvTYPE(sv) != SVt_PVIO)
3280af22 4329 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 4330 }
463ee0b2 4331 }
c07a80fd 4332 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
a0d0e21e 4333 mg_free(sv);
ec12f114 4334 stash = NULL;
79072805 4335 switch (SvTYPE(sv)) {
8990e307 4336 case SVt_PVIO:
df0bd2f4
GS
4337 if (IoIFP(sv) &&
4338 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 4339 IoIFP(sv) != PerlIO_stdout() &&
4340 IoIFP(sv) != PerlIO_stderr())
93578b34 4341 {
f2b5be74 4342 io_close((IO*)sv, FALSE);
93578b34 4343 }
1d7c1841 4344 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 4345 PerlDir_close(IoDIRP(sv));
1d7c1841 4346 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
4347 Safefree(IoTOP_NAME(sv));
4348 Safefree(IoFMT_NAME(sv));
4349 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 4350 /* FALL THROUGH */
79072805 4351 case SVt_PVBM:
a0d0e21e 4352 goto freescalar;
79072805 4353 case SVt_PVCV:
748a9306 4354 case SVt_PVFM:
85e6fe83 4355 cv_undef((CV*)sv);
a0d0e21e 4356 goto freescalar;
79072805 4357 case SVt_PVHV:
85e6fe83 4358 hv_undef((HV*)sv);
a0d0e21e 4359 break;
79072805 4360 case SVt_PVAV:
85e6fe83 4361 av_undef((AV*)sv);
a0d0e21e 4362 break;
02270b4e
GS
4363 case SVt_PVLV:
4364 SvREFCNT_dec(LvTARG(sv));
4365 goto freescalar;
a0d0e21e 4366 case SVt_PVGV:
1edc1566 4367 gp_free((GV*)sv);
a0d0e21e 4368 Safefree(GvNAME(sv));
ec12f114
JPC
4369 /* cannot decrease stash refcount yet, as we might recursively delete
4370 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
4371 of stash until current sv is completely gone.
4372 -- JohnPC, 27 Mar 1998 */
4373 stash = GvSTASH(sv);
a0d0e21e 4374 /* FALL THROUGH */
79072805 4375 case SVt_PVMG:
79072805
LW
4376 case SVt_PVNV:
4377 case SVt_PVIV:
a0d0e21e
LW
4378 freescalar:
4379 (void)SvOOK_off(sv);
79072805
LW
4380 /* FALL THROUGH */
4381 case SVt_PV:
a0d0e21e 4382 case SVt_RV:
810b8aa5
GS
4383 if (SvROK(sv)) {
4384 if (SvWEAKREF(sv))
4385 sv_del_backref(sv);
4386 else
4387 SvREFCNT_dec(SvRV(sv));
4388 }
1edc1566 4389 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 4390 Safefree(SvPVX(sv));
1c846c1f 4391 else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
c3654f1a 4392 unsharepvn(SvPVX(sv),SvUTF8(sv)?-SvCUR(sv):SvCUR(sv),SvUVX(sv));
1c846c1f
NIS
4393 SvFAKE_off(sv);
4394 }
79072805 4395 break;
a0d0e21e 4396/*
79072805 4397 case SVt_NV:
79072805 4398 case SVt_IV:
79072805
LW
4399 case SVt_NULL:
4400 break;
a0d0e21e 4401*/
79072805
LW
4402 }
4403
4404 switch (SvTYPE(sv)) {
4405 case SVt_NULL:
4406 break;
79072805
LW
4407 case SVt_IV:
4408 del_XIV(SvANY(sv));
4409 break;
4410 case SVt_NV:
4411 del_XNV(SvANY(sv));
4412 break;
ed6116ce
LW
4413 case SVt_RV:
4414 del_XRV(SvANY(sv));
4415 break;
79072805
LW
4416 case SVt_PV:
4417 del_XPV(SvANY(sv));
4418 break;
4419 case SVt_PVIV:
4420 del_XPVIV(SvANY(sv));
4421 break;
4422 case SVt_PVNV:
4423 del_XPVNV(SvANY(sv));
4424 break;
4425 case SVt_PVMG:
4426 del_XPVMG(SvANY(sv));
4427 break;
4428 case SVt_PVLV:
4429 del_XPVLV(SvANY(sv));
4430 break;
4431 case SVt_PVAV:
4432 del_XPVAV(SvANY(sv));
4433 break;
4434 case SVt_PVHV:
4435 del_XPVHV(SvANY(sv));
4436 break;
4437 case SVt_PVCV:
4438 del_XPVCV(SvANY(sv));
4439 break;
4440 case SVt_PVGV:
4441 del_XPVGV(SvANY(sv));
ec12f114
JPC
4442 /* code duplication for increased performance. */
4443 SvFLAGS(sv) &= SVf_BREAK;
4444 SvFLAGS(sv) |= SVTYPEMASK;
4445 /* decrease refcount of the stash that owns this GV, if any */
4446 if (stash)
4447 SvREFCNT_dec(stash);
4448 return; /* not break, SvFLAGS reset already happened */
79072805
LW
4449 case SVt_PVBM:
4450 del_XPVBM(SvANY(sv));
4451 break;
4452 case SVt_PVFM:
4453 del_XPVFM(SvANY(sv));
4454 break;
8990e307
LW
4455 case SVt_PVIO:
4456 del_XPVIO(SvANY(sv));
4457 break;
79072805 4458 }
a0d0e21e 4459 SvFLAGS(sv) &= SVf_BREAK;
8990e307 4460 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
4461}
4462
4463SV *
864dbfa3 4464Perl_sv_newref(pTHX_ SV *sv)
79072805 4465{
463ee0b2 4466 if (sv)
dce16143 4467 ATOMIC_INC(SvREFCNT(sv));
79072805
LW
4468 return sv;
4469}
4470
c461cf8f
JH
4471/*
4472=for apidoc sv_free
4473
4474Free the memory used by an SV.
4475
4476=cut
4477*/
4478
79072805 4479void
864dbfa3 4480Perl_sv_free(pTHX_ SV *sv)
79072805 4481{
dce16143
MB
4482 int refcount_is_zero;
4483
79072805
LW
4484 if (!sv)
4485 return;
a0d0e21e
LW
4486 if (SvREFCNT(sv) == 0) {
4487 if (SvFLAGS(sv) & SVf_BREAK)
4488 return;
3280af22 4489 if (PL_in_clean_all) /* All is fair */
1edc1566 4490 return;
d689ffdd
JP
4491 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
4492 /* make sure SvREFCNT(sv)==0 happens very seldom */
4493 SvREFCNT(sv) = (~(U32)0)/2;
4494 return;
4495 }
0453d815
PM
4496 if (ckWARN_d(WARN_INTERNAL))
4497 Perl_warner(aTHX_ WARN_INTERNAL, "Attempt to free unreferenced scalar");
79072805
LW
4498 return;
4499 }
dce16143
MB
4500 ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
4501 if (!refcount_is_zero)
8990e307 4502 return;
463ee0b2
LW
4503#ifdef DEBUGGING
4504 if (SvTEMP(sv)) {
0453d815 4505 if (ckWARN_d(WARN_DEBUGGING))
f248d071 4506 Perl_warner(aTHX_ WARN_DEBUGGING,
1d7c1841
GS
4507 "Attempt to free temp prematurely: SV 0x%"UVxf,
4508 PTR2UV(sv));
79072805 4509 return;
79072805 4510 }
463ee0b2 4511#endif
d689ffdd
JP
4512 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
4513 /* make sure SvREFCNT(sv)==0 happens very seldom */
4514 SvREFCNT(sv) = (~(U32)0)/2;
4515 return;
4516 }
79072805 4517 sv_clear(sv);
477f5d66
CS
4518 if (! SvREFCNT(sv))
4519 del_SV(sv);
79072805
LW
4520}
4521
954c1994
GS
4522/*
4523=for apidoc sv_len
4524
4525Returns the length of the string in the SV. See also C<SvCUR>.
4526
4527=cut
4528*/
4529
79072805 4530STRLEN
864dbfa3 4531Perl_sv_len(pTHX_ register SV *sv)
79072805 4532{
748a9306 4533 char *junk;
463ee0b2 4534 STRLEN len;
79072805
LW
4535
4536 if (!sv)
4537 return 0;
4538
8990e307 4539 if (SvGMAGICAL(sv))
565764a8 4540 len = mg_length(sv);
8990e307 4541 else
748a9306 4542 junk = SvPV(sv, len);
463ee0b2 4543 return len;
79072805
LW
4544}
4545
c461cf8f
JH
4546/*
4547=for apidoc sv_len_utf8
4548
4549Returns the number of characters in the string in an SV, counting wide
4550UTF8 bytes as a single character.
4551
4552=cut
4553*/
4554
a0ed51b3 4555STRLEN
864dbfa3 4556Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 4557{
a0ed51b3
LW
4558 if (!sv)
4559 return 0;
4560
a0ed51b3 4561 if (SvGMAGICAL(sv))
b76347f2 4562 return mg_length(sv);
a0ed51b3 4563 else
b76347f2
JH
4564 {
4565 STRLEN len;
4566 U8 *s = (U8*)SvPV(sv, len);
4567
d6efbbad 4568 return Perl_utf8_length(aTHX_ s, s + len);
a0ed51b3 4569 }
a0ed51b3
LW
4570}
4571
4572void
864dbfa3 4573Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 4574{
dfe13c55
GS
4575 U8 *start;
4576 U8 *s;
4577 U8 *send;
a0ed51b3
LW
4578 I32 uoffset = *offsetp;
4579 STRLEN len;
4580
4581 if (!sv)
4582 return;
4583
dfe13c55 4584 start = s = (U8*)SvPV(sv, len);
a0ed51b3
LW
4585 send = s + len;
4586 while (s < send && uoffset--)
4587 s += UTF8SKIP(s);
bb40f870
GA
4588 if (s >= send)
4589 s = send;
a0ed51b3
LW
4590 *offsetp = s - start;
4591 if (lenp) {
4592 I32 ulen = *lenp;
4593 start = s;
4594 while (s < send && ulen--)
4595 s += UTF8SKIP(s);
bb40f870
GA
4596 if (s >= send)
4597 s = send;
a0ed51b3
LW
4598 *lenp = s - start;
4599 }
4600 return;
4601}
4602
4603void
864dbfa3 4604Perl_sv_pos_b2u(pTHX_ register SV *sv, I32* offsetp)
a0ed51b3 4605{
dfe13c55
GS
4606 U8 *s;
4607 U8 *send;
a0ed51b3
LW
4608 STRLEN len;
4609
4610 if (!sv)
4611 return;
4612
dfe13c55 4613 s = (U8*)SvPV(sv, len);
a0ed51b3 4614 if (len < *offsetp)
a0dbb045 4615 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
a0ed51b3
LW
4616 send = s + *offsetp;
4617 len = 0;
4618 while (s < send) {
a0dbb045
JH
4619 STRLEN n;
4620
4621 if (utf8_to_uv(s, UTF8SKIP(s), &n, 0)) {
4622 s += n;
4623 len++;
4624 }
4625 else
4626 break;
a0ed51b3
LW
4627 }
4628 *offsetp = len;
4629 return;
4630}
4631
954c1994
GS
4632/*
4633=for apidoc sv_eq
4634
4635Returns a boolean indicating whether the strings in the two SVs are
4636identical.
4637
4638=cut
4639*/
4640
79072805 4641I32
e01b9e88 4642Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805
LW
4643{
4644 char *pv1;
463ee0b2 4645 STRLEN cur1;
79072805 4646 char *pv2;
463ee0b2 4647 STRLEN cur2;
e01b9e88
SC
4648 I32 eq = 0;
4649 bool pv1tmp = FALSE;
4650 bool pv2tmp = FALSE;
79072805 4651
e01b9e88 4652 if (!sv1) {
79072805
LW
4653 pv1 = "";
4654 cur1 = 0;
4655 }
463ee0b2 4656 else
e01b9e88 4657 pv1 = SvPV(sv1, cur1);
79072805 4658
e01b9e88
SC
4659 if (!sv2){
4660 pv2 = "";
4661 cur2 = 0;
92d29cee 4662 }
e01b9e88
SC
4663 else
4664 pv2 = SvPV(sv2, cur2);
79072805 4665
e01b9e88 4666 /* do not utf8ize the comparands as a side-effect */
7bbb0251 4667 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTE) {
1aa99e6b
IH
4668 if (PL_hints & HINT_UTF8_DISTINCT)
4669 return FALSE;
4670
e01b9e88 4671 if (SvUTF8(sv1)) {
1aa99e6b 4672 (void)utf8_to_bytes((U8*)(pv1 = savepvn(pv1, cur1)), &cur1);
a9df0fa1
CB
4673 {
4674 IV scur1 = cur1;
4675 if (scur1 < 0) {
4676 Safefree(pv1);
4677 return 0;
4678 }
1aa99e6b
IH
4679 }
4680 pv1tmp = TRUE;
e01b9e88
SC
4681 }
4682 else {
1aa99e6b 4683 (void)utf8_to_bytes((U8*)(pv2 = savepvn(pv2, cur2)), &cur2);
a9df0fa1
CB
4684 {
4685 IV scur2 = cur2;
4686 if (scur2 < 0) {
4687 Safefree(pv2);
4688 return 0;
4689 }
1aa99e6b
IH
4690 }
4691 pv2tmp = TRUE;
e01b9e88
SC
4692 }
4693 }
79072805 4694
e01b9e88
SC
4695 if (cur1 == cur2)
4696 eq = memEQ(pv1, pv2, cur1);
4697
4698 if (pv1tmp)
4699 Safefree(pv1);
4700 if (pv2tmp)
4701 Safefree(pv2);
4702
4703 return eq;
79072805
LW
4704}
4705
954c1994
GS
4706/*
4707=for apidoc sv_cmp
4708
4709Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
4710string in C<sv1> is less than, equal to, or greater than the string in
4711C<sv2>.
4712
4713=cut
4714*/
4715
79072805 4716I32
e01b9e88 4717Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 4718{
560a288e
GS
4719 STRLEN cur1, cur2;
4720 char *pv1, *pv2;
1c846c1f 4721 I32 cmp;
e01b9e88
SC
4722 bool pv1tmp = FALSE;
4723 bool pv2tmp = FALSE;
560a288e 4724
e01b9e88
SC
4725 if (!sv1) {
4726 pv1 = "";
560a288e
GS
4727 cur1 = 0;
4728 }
e01b9e88
SC
4729 else
4730 pv1 = SvPV(sv1, cur1);
560a288e 4731
e01b9e88
SC
4732 if (!sv2){
4733 pv2 = "";
560a288e
GS
4734 cur2 = 0;
4735 }
e01b9e88
SC
4736 else
4737 pv2 = SvPV(sv2, cur2);
79072805 4738
e01b9e88
SC
4739 /* do not utf8ize the comparands as a side-effect */
4740 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTE) {
1aa99e6b
IH
4741 if (PL_hints & HINT_UTF8_DISTINCT)
4742 return SvUTF8(sv1) ? 1 : -1;
4743
e01b9e88
SC
4744 if (SvUTF8(sv1)) {
4745 pv2 = (char*)bytes_to_utf8((U8*)pv2, &cur2);
4746 pv2tmp = TRUE;
4747 }
4748 else {
4749 pv1 = (char*)bytes_to_utf8((U8*)pv1, &cur1);
4750 pv1tmp = TRUE;
4751 }
4752 }
79072805 4753
e01b9e88
SC
4754 if (!cur1) {
4755 cmp = cur2 ? -1 : 0;
4756 } else if (!cur2) {
4757 cmp = 1;
4758 } else {
4759 I32 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
4760
4761 if (retval) {
4762 cmp = retval < 0 ? -1 : 1;
4763 } else if (cur1 == cur2) {
4764 cmp = 0;
4765 } else {
4766 cmp = cur1 < cur2 ? -1 : 1;
4767 }
4768 }
16660edb 4769
e01b9e88
SC
4770 if (pv1tmp)
4771 Safefree(pv1);
4772 if (pv2tmp)
4773 Safefree(pv2);
16660edb 4774
e01b9e88 4775 return cmp;
bbce6d69 4776}
16660edb 4777
c461cf8f
JH
4778/*
4779=for apidoc sv_cmp_locale
4780
4781Compares the strings in two SVs in a locale-aware manner. See
4782L</sv_cmp_locale>
4783
4784=cut
4785*/
4786
bbce6d69 4787I32
864dbfa3 4788Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 4789{
36477c24 4790#ifdef USE_LOCALE_COLLATE
16660edb 4791
bbce6d69 4792 char *pv1, *pv2;
4793 STRLEN len1, len2;
4794 I32 retval;
16660edb 4795
3280af22 4796 if (PL_collation_standard)
bbce6d69 4797 goto raw_compare;
16660edb 4798
bbce6d69 4799 len1 = 0;
8ac85365 4800 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 4801 len2 = 0;
8ac85365 4802 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 4803
bbce6d69 4804 if (!pv1 || !len1) {
4805 if (pv2 && len2)
4806 return -1;
4807 else
4808 goto raw_compare;
4809 }
4810 else {
4811 if (!pv2 || !len2)
4812 return 1;
4813 }
16660edb 4814
bbce6d69 4815 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 4816
bbce6d69 4817 if (retval)
16660edb 4818 return retval < 0 ? -1 : 1;
4819
bbce6d69 4820 /*
4821 * When the result of collation is equality, that doesn't mean
4822 * that there are no differences -- some locales exclude some
4823 * characters from consideration. So to avoid false equalities,
4824 * we use the raw string as a tiebreaker.
4825 */
16660edb 4826
bbce6d69 4827 raw_compare:
4828 /* FALL THROUGH */
16660edb 4829
36477c24 4830#endif /* USE_LOCALE_COLLATE */
16660edb 4831
bbce6d69 4832 return sv_cmp(sv1, sv2);
4833}
79072805 4834
36477c24 4835#ifdef USE_LOCALE_COLLATE
7a4c00b4 4836/*
4837 * Any scalar variable may carry an 'o' magic that contains the
4838 * scalar data of the variable transformed to such a format that
4839 * a normal memory comparison can be used to compare the data
4840 * according to the locale settings.
4841 */
bbce6d69 4842char *
864dbfa3 4843Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 4844{
7a4c00b4 4845 MAGIC *mg;
16660edb 4846
8ac85365 4847 mg = SvMAGICAL(sv) ? mg_find(sv, 'o') : (MAGIC *) NULL;
3280af22 4848 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 4849 char *s, *xf;
4850 STRLEN len, xlen;
4851
7a4c00b4 4852 if (mg)
4853 Safefree(mg->mg_ptr);
bbce6d69 4854 s = SvPV(sv, len);
4855 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 4856 if (SvREADONLY(sv)) {
4857 SAVEFREEPV(xf);
4858 *nxp = xlen;
3280af22 4859 return xf + sizeof(PL_collation_ix);
ff0cee69 4860 }
7a4c00b4 4861 if (! mg) {
4862 sv_magic(sv, 0, 'o', 0, 0);
4863 mg = mg_find(sv, 'o');
4864 assert(mg);
bbce6d69 4865 }
7a4c00b4 4866 mg->mg_ptr = xf;
565764a8 4867 mg->mg_len = xlen;
7a4c00b4 4868 }
4869 else {
ff0cee69 4870 if (mg) {
4871 mg->mg_ptr = NULL;
565764a8 4872 mg->mg_len = -1;
ff0cee69 4873 }
bbce6d69 4874 }
4875 }
7a4c00b4 4876 if (mg && mg->mg_ptr) {
565764a8 4877 *nxp = mg->mg_len;
3280af22 4878 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 4879 }
4880 else {
4881 *nxp = 0;
4882 return NULL;
16660edb 4883 }
79072805
LW
4884}
4885
36477c24 4886#endif /* USE_LOCALE_COLLATE */
bbce6d69 4887
c461cf8f
JH
4888/*
4889=for apidoc sv_gets
4890
4891Get a line from the filehandle and store it into the SV, optionally
4892appending to the currently-stored string.
4893
4894=cut
4895*/
4896
79072805 4897char *
864dbfa3 4898Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 4899{
c07a80fd 4900 char *rsptr;
4901 STRLEN rslen;
4902 register STDCHAR rslast;
4903 register STDCHAR *bp;
4904 register I32 cnt;
4905 I32 i;
4906
2213622d 4907 SV_CHECK_THINKFIRST(sv);
6fc92669 4908 (void)SvUPGRADE(sv, SVt_PV);
99491443 4909
ff68c719 4910 SvSCREAM_off(sv);
c07a80fd 4911
3280af22 4912 if (RsSNARF(PL_rs)) {
c07a80fd 4913 rsptr = NULL;
4914 rslen = 0;
4915 }
3280af22 4916 else if (RsRECORD(PL_rs)) {
5b2b9c68
HM
4917 I32 recsize, bytesread;
4918 char *buffer;
4919
4920 /* Grab the size of the record we're getting */
3280af22 4921 recsize = SvIV(SvRV(PL_rs));
5b2b9c68 4922 (void)SvPOK_only(sv); /* Validate pointer */
e670df4e 4923 buffer = SvGROW(sv, recsize + 1);
5b2b9c68
HM
4924 /* Go yank in */
4925#ifdef VMS
4926 /* VMS wants read instead of fread, because fread doesn't respect */
4927 /* RMS record boundaries. This is not necessarily a good thing to be */
4928 /* doing, but we've got no other real choice */
4929 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
4930#else
4931 bytesread = PerlIO_read(fp, buffer, recsize);
4932#endif
4933 SvCUR_set(sv, bytesread);
e670df4e 4934 buffer[bytesread] = '\0';
7d59b7e4
NIS
4935 if (PerlIO_isutf8(fp))
4936 SvUTF8_on(sv);
4937 else
4938 SvUTF8_off(sv);
5b2b9c68
HM
4939 return(SvCUR(sv) ? SvPVX(sv) : Nullch);
4940 }
3280af22 4941 else if (RsPARA(PL_rs)) {
c07a80fd 4942 rsptr = "\n\n";
4943 rslen = 2;
4944 }
7d59b7e4
NIS
4945 else {
4946 /* Get $/ i.e. PL_rs into same encoding as stream wants */
4947 if (PerlIO_isutf8(fp)) {
4948 rsptr = SvPVutf8(PL_rs, rslen);
4949 }
4950 else {
4951 if (SvUTF8(PL_rs)) {
4952 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
4953 Perl_croak(aTHX_ "Wide character in $/");
4954 }
4955 }
4956 rsptr = SvPV(PL_rs, rslen);
4957 }
4958 }
4959
c07a80fd 4960 rslast = rslen ? rsptr[rslen - 1] : '\0';
4961
3280af22 4962 if (RsPARA(PL_rs)) { /* have to do this both before and after */
79072805 4963 do { /* to make sure file boundaries work right */
760ac839 4964 if (PerlIO_eof(fp))
a0d0e21e 4965 return 0;
760ac839 4966 i = PerlIO_getc(fp);
79072805 4967 if (i != '\n') {
a0d0e21e
LW
4968 if (i == -1)
4969 return 0;
760ac839 4970 PerlIO_ungetc(fp,i);
79072805
LW
4971 break;
4972 }
4973 } while (i != EOF);
4974 }
c07a80fd 4975
760ac839
LW
4976 /* See if we know enough about I/O mechanism to cheat it ! */
4977
4978 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 4979 of abstracting out stdio interface. One call should be cheap
760ac839
LW
4980 enough here - and may even be a macro allowing compile
4981 time optimization.
4982 */
4983
4984 if (PerlIO_fast_gets(fp)) {
4985
4986 /*
4987 * We're going to steal some values from the stdio struct
4988 * and put EVERYTHING in the innermost loop into registers.
4989 */
4990 register STDCHAR *ptr;
4991 STRLEN bpx;
4992 I32 shortbuffered;
4993
16660edb 4994#if defined(VMS) && defined(PERLIO_IS_STDIO)
4995 /* An ungetc()d char is handled separately from the regular
4996 * buffer, so we getc() it back out and stuff it in the buffer.
4997 */
4998 i = PerlIO_getc(fp);
4999 if (i == EOF) return 0;
5000 *(--((*fp)->_ptr)) = (unsigned char) i;
5001 (*fp)->_cnt++;
5002#endif
c07a80fd 5003
c2960299 5004 /* Here is some breathtakingly efficient cheating */
c07a80fd 5005
a20bf0c3 5006 cnt = PerlIO_get_cnt(fp); /* get count into register */
a0d0e21e 5007 (void)SvPOK_only(sv); /* validate pointer */
79072805
LW
5008 if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
5009 if (cnt > 80 && SvLEN(sv) > append) {
5010 shortbuffered = cnt - SvLEN(sv) + append + 1;
5011 cnt -= shortbuffered;
5012 }
5013 else {
5014 shortbuffered = 0;
bbce6d69 5015 /* remember that cnt can be negative */
5016 SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
79072805
LW
5017 }
5018 }
5019 else
5020 shortbuffered = 0;
c07a80fd 5021 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
a20bf0c3 5022 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 5023 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5024 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 5025 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5026 "Screamer: entering: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5027 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5028 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
5029 for (;;) {
5030 screamer:
93a17b20 5031 if (cnt > 0) {
c07a80fd 5032 if (rslen) {
760ac839
LW
5033 while (cnt > 0) { /* this | eat */
5034 cnt--;
c07a80fd 5035 if ((*bp++ = *ptr++) == rslast) /* really | dust */
5036 goto thats_all_folks; /* screams | sed :-) */
5037 }
5038 }
5039 else {
1c846c1f
NIS
5040 Copy(ptr, bp, cnt, char); /* this | eat */
5041 bp += cnt; /* screams | dust */
c07a80fd 5042 ptr += cnt; /* louder | sed :-) */
a5f75d66 5043 cnt = 0;
93a17b20 5044 }
79072805
LW
5045 }
5046
748a9306 5047 if (shortbuffered) { /* oh well, must extend */
79072805
LW
5048 cnt = shortbuffered;
5049 shortbuffered = 0;
c07a80fd 5050 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
5051 SvCUR_set(sv, bpx);
5052 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 5053 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
5054 continue;
5055 }
5056
16660edb 5057 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
5058 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
5059 PTR2UV(ptr),(long)cnt));
a20bf0c3 5060 PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
16660edb 5061 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5062 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5063 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5064 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
1c846c1f 5065 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 5066 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
5067 another abstraction. */
760ac839 5068 i = PerlIO_getc(fp); /* get more characters */
16660edb 5069 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5070 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5071 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5072 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
a20bf0c3
JH
5073 cnt = PerlIO_get_cnt(fp);
5074 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 5075 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5076 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 5077
748a9306
LW
5078 if (i == EOF) /* all done for ever? */
5079 goto thats_really_all_folks;
5080
c07a80fd 5081 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
5082 SvCUR_set(sv, bpx);
5083 SvGROW(sv, bpx + cnt + 2);
c07a80fd 5084 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
5085
760ac839 5086 *bp++ = i; /* store character from PerlIO_getc */
79072805 5087
c07a80fd 5088 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 5089 goto thats_all_folks;
79072805
LW
5090 }
5091
5092thats_all_folks:
c07a80fd 5093 if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
36477c24 5094 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 5095 goto screamer; /* go back to the fray */
79072805
LW
5096thats_really_all_folks:
5097 if (shortbuffered)
5098 cnt += shortbuffered;
16660edb 5099 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5100 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
a20bf0c3 5101 PerlIO_set_ptrcnt(fp, ptr, cnt); /* put these back or we're in trouble */
16660edb 5102 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 5103 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 5104 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 5105 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 5106 *bp = '\0';
760ac839 5107 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 5108 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 5109 "Screamer: done, len=%ld, string=|%.*s|\n",
5110 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
5111 }
5112 else
79072805 5113 {
4d2c4e07 5114#ifndef EPOC
760ac839 5115 /*The big, slow, and stupid way */
c07a80fd 5116 STDCHAR buf[8192];
4d2c4e07
OF
5117#else
5118 /* Need to work around EPOC SDK features */
5119 /* On WINS: MS VC5 generates calls to _chkstk, */
5120 /* if a `large' stack frame is allocated */
5121 /* gcc on MARM does not generate calls like these */
5122 STDCHAR buf[1024];
5123#endif
79072805 5124
760ac839 5125screamer2:
c07a80fd 5126 if (rslen) {
760ac839
LW
5127 register STDCHAR *bpe = buf + sizeof(buf);
5128 bp = buf;
5129 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = i) != rslast && bp < bpe)
5130 ; /* keep reading */
5131 cnt = bp - buf;
c07a80fd 5132 }
5133 else {
760ac839 5134 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 5135 /* Accomodate broken VAXC compiler, which applies U8 cast to
5136 * both args of ?: operator, causing EOF to change into 255
5137 */
5138 if (cnt) { i = (U8)buf[cnt - 1]; } else { i = EOF; }
c07a80fd 5139 }
79072805
LW
5140
5141 if (append)
760ac839 5142 sv_catpvn(sv, (char *) buf, cnt);
79072805 5143 else
760ac839 5144 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 5145
5146 if (i != EOF && /* joy */
5147 (!rslen ||
5148 SvCUR(sv) < rslen ||
36477c24 5149 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
5150 {
5151 append = -1;
63e4d877
CS
5152 /*
5153 * If we're reading from a TTY and we get a short read,
5154 * indicating that the user hit his EOF character, we need
5155 * to notice it now, because if we try to read from the TTY
5156 * again, the EOF condition will disappear.
5157 *
5158 * The comparison of cnt to sizeof(buf) is an optimization
5159 * that prevents unnecessary calls to feof().
5160 *
5161 * - jik 9/25/96
5162 */
5163 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
5164 goto screamer2;
79072805
LW
5165 }
5166 }
5167
1c846c1f 5168 if (RsPARA(PL_rs)) { /* have to do this both before and after */
c07a80fd 5169 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 5170 i = PerlIO_getc(fp);
79072805 5171 if (i != '\n') {
760ac839 5172 PerlIO_ungetc(fp,i);
79072805
LW
5173 break;
5174 }
5175 }
5176 }
c07a80fd 5177
7d59b7e4
NIS
5178 if (PerlIO_isutf8(fp))
5179 SvUTF8_on(sv);
5180 else
5181 SvUTF8_off(sv);
5182
c07a80fd 5183 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
5184}
5185
760ac839 5186
954c1994
GS
5187/*
5188=for apidoc sv_inc
5189
5190Auto-increment of the value in the SV.
5191
5192=cut
5193*/
5194
79072805 5195void
864dbfa3 5196Perl_sv_inc(pTHX_ register SV *sv)
79072805
LW
5197{
5198 register char *d;
463ee0b2 5199 int flags;
79072805
LW
5200
5201 if (!sv)
5202 return;
b23a5f78
GB
5203 if (SvGMAGICAL(sv))
5204 mg_get(sv);
ed6116ce 5205 if (SvTHINKFIRST(sv)) {
0f15f207 5206 if (SvREADONLY(sv)) {
3280af22 5207 if (PL_curcop != &PL_compiling)
cea2e8a9 5208 Perl_croak(aTHX_ PL_no_modify);
0f15f207 5209 }
a0d0e21e 5210 if (SvROK(sv)) {
b5be31e9 5211 IV i;
9e7bc3e8
JD
5212 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
5213 return;
56431972 5214 i = PTR2IV(SvRV(sv));
b5be31e9
SM
5215 sv_unref(sv);
5216 sv_setiv(sv, i);
a0d0e21e 5217 }
ed6116ce 5218 }
8990e307 5219 flags = SvFLAGS(sv);
28e5dec8
JH
5220 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
5221 /* It's (privately or publicly) a float, but not tested as an
5222 integer, so test it to see. */
d460ef45 5223 (void) SvIV(sv);
28e5dec8
JH
5224 flags = SvFLAGS(sv);
5225 }
5226 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
5227 /* It's publicly an integer, or privately an integer-not-float */
5228 oops_its_int:
25da4f38
IZ
5229 if (SvIsUV(sv)) {
5230 if (SvUVX(sv) == UV_MAX)
65202027 5231 sv_setnv(sv, (NV)UV_MAX + 1.0);
25da4f38
IZ
5232 else
5233 (void)SvIOK_only_UV(sv);
5234 ++SvUVX(sv);
5235 } else {
5236 if (SvIVX(sv) == IV_MAX)
28e5dec8 5237 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
5238 else {
5239 (void)SvIOK_only(sv);
5240 ++SvIVX(sv);
1c846c1f 5241 }
55497cff 5242 }
79072805
LW
5243 return;
5244 }
28e5dec8
JH
5245 if (flags & SVp_NOK) {
5246 (void)SvNOK_only(sv);
5247 SvNVX(sv) += 1.0;
5248 return;
5249 }
5250
8990e307 5251 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
28e5dec8
JH
5252 if ((flags & SVTYPEMASK) < SVt_PVIV)
5253 sv_upgrade(sv, SVt_IV);
5254 (void)SvIOK_only(sv);
5255 SvIVX(sv) = 1;
79072805
LW
5256 return;
5257 }
463ee0b2 5258 d = SvPVX(sv);
79072805
LW
5259 while (isALPHA(*d)) d++;
5260 while (isDIGIT(*d)) d++;
5261 if (*d) {
28e5dec8
JH
5262#ifdef PERL_PRESERVE_IVUV
5263 /* Got to punt this an an integer if needs be, but we don't issue
5264 warnings. Probably ought to make the sv_iv_please() that does
5265 the conversion if possible, and silently. */
5266 I32 numtype = looks_like_number(sv);
5267 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
5268 /* Need to try really hard to see if it's an integer.
5269 9.22337203685478e+18 is an integer.
5270 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
5271 so $a="9.22337203685478e+18"; $a+0; $a++
5272 needs to be the same as $a="9.22337203685478e+18"; $a++
5273 or we go insane. */
d460ef45 5274
28e5dec8
JH
5275 (void) sv_2iv(sv);
5276 if (SvIOK(sv))
5277 goto oops_its_int;
5278
5279 /* sv_2iv *should* have made this an NV */
5280 if (flags & SVp_NOK) {
5281 (void)SvNOK_only(sv);
5282 SvNVX(sv) += 1.0;
5283 return;
5284 }
5285 /* I don't think we can get here. Maybe I should assert this
5286 And if we do get here I suspect that sv_setnv will croak. NWC
5287 Fall through. */
5288#if defined(USE_LONG_DOUBLE)
5289 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",
5290 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
5291#else
5292 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%g\n",
5293 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
5294#endif
5295 }
5296#endif /* PERL_PRESERVE_IVUV */
5297 sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
79072805
LW
5298 return;
5299 }
5300 d--;
463ee0b2 5301 while (d >= SvPVX(sv)) {
79072805
LW
5302 if (isDIGIT(*d)) {
5303 if (++*d <= '9')
5304 return;
5305 *(d--) = '0';
5306 }
5307 else {
9d116dd7
JH
5308#ifdef EBCDIC
5309 /* MKS: The original code here died if letters weren't consecutive.
5310 * at least it didn't have to worry about non-C locales. The
5311 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 5312 * arranged in order (although not consecutively) and that only
9d116dd7
JH
5313 * [A-Za-z] are accepted by isALPHA in the C locale.
5314 */
5315 if (*d != 'z' && *d != 'Z') {
5316 do { ++*d; } while (!isALPHA(*d));
5317 return;
5318 }
5319 *(d--) -= 'z' - 'a';
5320#else
79072805
LW
5321 ++*d;
5322 if (isALPHA(*d))
5323 return;
5324 *(d--) -= 'z' - 'a' + 1;
9d116dd7 5325#endif
79072805
LW
5326 }
5327 }
5328 /* oh,oh, the number grew */
5329 SvGROW(sv, SvCUR(sv) + 2);
5330 SvCUR(sv)++;
463ee0b2 5331 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
5332 *d = d[-1];
5333 if (isDIGIT(d[1]))
5334 *d = '1';
5335 else
5336 *d = d[1];
5337}
5338
954c1994
GS
5339/*
5340=for apidoc sv_dec
5341
5342Auto-decrement of the value in the SV.
5343
5344=cut
5345*/
5346
79072805 5347void
864dbfa3 5348Perl_sv_dec(pTHX_ register SV *sv)
79072805 5349{
463ee0b2
LW
5350 int flags;
5351
79072805
LW
5352 if (!sv)
5353 return;
b23a5f78
GB
5354 if (SvGMAGICAL(sv))
5355 mg_get(sv);
ed6116ce 5356 if (SvTHINKFIRST(sv)) {
0f15f207 5357 if (SvREADONLY(sv)) {
3280af22 5358 if (PL_curcop != &PL_compiling)
cea2e8a9 5359 Perl_croak(aTHX_ PL_no_modify);
0f15f207 5360 }
a0d0e21e 5361 if (SvROK(sv)) {
b5be31e9 5362 IV i;
9e7bc3e8
JD
5363 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
5364 return;
56431972 5365 i = PTR2IV(SvRV(sv));
b5be31e9
SM
5366 sv_unref(sv);
5367 sv_setiv(sv, i);
a0d0e21e 5368 }
ed6116ce 5369 }
28e5dec8
JH
5370 /* Unlike sv_inc we don't have to worry about string-never-numbers
5371 and keeping them magic. But we mustn't warn on punting */
8990e307 5372 flags = SvFLAGS(sv);
28e5dec8
JH
5373 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
5374 /* It's publicly an integer, or privately an integer-not-float */
5375 oops_its_int:
25da4f38
IZ
5376 if (SvIsUV(sv)) {
5377 if (SvUVX(sv) == 0) {
5378 (void)SvIOK_only(sv);
5379 SvIVX(sv) = -1;
5380 }
5381 else {
5382 (void)SvIOK_only_UV(sv);
5383 --SvUVX(sv);
1c846c1f 5384 }
25da4f38
IZ
5385 } else {
5386 if (SvIVX(sv) == IV_MIN)
65202027 5387 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
5388 else {
5389 (void)SvIOK_only(sv);
5390 --SvIVX(sv);
1c846c1f 5391 }
55497cff 5392 }
5393 return;
5394 }
28e5dec8
JH
5395 if (flags & SVp_NOK) {
5396 SvNVX(sv) -= 1.0;
5397 (void)SvNOK_only(sv);
5398 return;
5399 }
8990e307 5400 if (!(flags & SVp_POK)) {
4633a7c4
LW
5401 if ((flags & SVTYPEMASK) < SVt_PVNV)
5402 sv_upgrade(sv, SVt_NV);
463ee0b2 5403 SvNVX(sv) = -1.0;
a0d0e21e 5404 (void)SvNOK_only(sv);
79072805
LW
5405 return;
5406 }
28e5dec8
JH
5407#ifdef PERL_PRESERVE_IVUV
5408 {
5409 I32 numtype = looks_like_number(sv);
5410 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
5411 /* Need to try really hard to see if it's an integer.
5412 9.22337203685478e+18 is an integer.
5413 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
5414 so $a="9.22337203685478e+18"; $a+0; $a--
5415 needs to be the same as $a="9.22337203685478e+18"; $a--
5416 or we go insane. */
d460ef45 5417
28e5dec8
JH
5418 (void) sv_2iv(sv);
5419 if (SvIOK(sv))
5420 goto oops_its_int;
5421
5422 /* sv_2iv *should* have made this an NV */
5423 if (flags & SVp_NOK) {
5424 (void)SvNOK_only(sv);
5425 SvNVX(sv) -= 1.0;
5426 return;
5427 }
5428 /* I don't think we can get here. Maybe I should assert this
5429 And if we do get here I suspect that sv_setnv will croak. NWC
5430 Fall through. */
5431#if defined(USE_LONG_DOUBLE)
5432 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",
5433 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
5434#else
5435 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%g\n",
5436 SvPVX(sv), SvIVX(sv), SvNVX(sv)));
5437#endif
5438 }
5439 }
5440#endif /* PERL_PRESERVE_IVUV */
097ee67d 5441 sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
5442}
5443
954c1994
GS
5444/*
5445=for apidoc sv_mortalcopy
5446
5447Creates a new SV which is a copy of the original SV. The new SV is marked
5448as mortal.
5449
5450=cut
5451*/
5452
79072805
LW
5453/* Make a string that will exist for the duration of the expression
5454 * evaluation. Actually, it may have to last longer than that, but
5455 * hopefully we won't free it until it has been assigned to a
5456 * permanent location. */
5457
5458SV *
864dbfa3 5459Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 5460{
463ee0b2 5461 register SV *sv;
79072805 5462
4561caa4 5463 new_SV(sv);
79072805 5464 sv_setsv(sv,oldstr);
677b06e3
GS
5465 EXTEND_MORTAL(1);
5466 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
5467 SvTEMP_on(sv);
5468 return sv;
5469}
5470
954c1994
GS
5471/*
5472=for apidoc sv_newmortal
5473
5474Creates a new SV which is mortal. The reference count of the SV is set to 1.
5475
5476=cut
5477*/
5478
8990e307 5479SV *
864dbfa3 5480Perl_sv_newmortal(pTHX)
8990e307
LW
5481{
5482 register SV *sv;
5483
4561caa4 5484 new_SV(sv);
8990e307 5485 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
5486 EXTEND_MORTAL(1);
5487 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
5488 return sv;
5489}
5490
954c1994
GS
5491/*
5492=for apidoc sv_2mortal
5493
5494Marks an SV as mortal. The SV will be destroyed when the current context
5495ends.
5496
5497=cut
5498*/
5499
79072805
LW
5500/* same thing without the copying */
5501
5502SV *
864dbfa3 5503Perl_sv_2mortal(pTHX_ register SV *sv)
79072805
LW
5504{
5505 if (!sv)
5506 return sv;
d689ffdd 5507 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 5508 return sv;
677b06e3
GS
5509 EXTEND_MORTAL(1);
5510 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 5511 SvTEMP_on(sv);
79072805
LW
5512 return sv;
5513}
5514
954c1994
GS
5515/*
5516=for apidoc newSVpv
5517
5518Creates a new SV and copies a string into it. The reference count for the
5519SV is set to 1. If C<len> is zero, Perl will compute the length using
5520strlen(). For efficiency, consider using C<newSVpvn> instead.
5521
5522=cut
5523*/
5524
79072805 5525SV *
864dbfa3 5526Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 5527{
463ee0b2 5528 register SV *sv;
79072805 5529
4561caa4 5530 new_SV(sv);
79072805
LW
5531 if (!len)
5532 len = strlen(s);
5533 sv_setpvn(sv,s,len);
5534 return sv;
5535}
5536
954c1994
GS
5537/*
5538=for apidoc newSVpvn
5539
5540Creates a new SV and copies a string into it. The reference count for the
1c846c1f 5541SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994
GS
5542string. You are responsible for ensuring that the source string is at least
5543C<len> bytes long.
5544
5545=cut
5546*/
5547
9da1e3b5 5548SV *
864dbfa3 5549Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5
MUN
5550{
5551 register SV *sv;
5552
5553 new_SV(sv);
9da1e3b5
MUN
5554 sv_setpvn(sv,s,len);
5555 return sv;
5556}
5557
1c846c1f
NIS
5558/*
5559=for apidoc newSVpvn_share
5560
5561Creates a new SV and populates it with a string from
5562the string table. Turns on READONLY and FAKE.
5563The idea here is that as string table is used for shared hash
5564keys these strings will have SvPVX == HeKEY and hash lookup
5565will avoid string compare.
5566
5567=cut
5568*/
5569
5570SV *
c3654f1a 5571Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f
NIS
5572{
5573 register SV *sv;
c3654f1a
IH
5574 bool is_utf8 = FALSE;
5575 if (len < 0) {
5576 len = -len;
5577 is_utf8 = TRUE;
5578 }
1c846c1f
NIS
5579 if (!hash)
5580 PERL_HASH(hash, src, len);
5581 new_SV(sv);
5582 sv_upgrade(sv, SVt_PVIV);
c3654f1a 5583 SvPVX(sv) = sharepvn(src, is_utf8?-len:len, hash);
1c846c1f
NIS
5584 SvCUR(sv) = len;
5585 SvUVX(sv) = hash;
5586 SvLEN(sv) = 0;
5587 SvREADONLY_on(sv);
5588 SvFAKE_on(sv);
5589 SvPOK_on(sv);
c3654f1a
IH
5590 if (is_utf8)
5591 SvUTF8_on(sv);
1c846c1f
NIS
5592 return sv;
5593}
5594
cea2e8a9 5595#if defined(PERL_IMPLICIT_CONTEXT)
46fc3d4c 5596SV *
cea2e8a9 5597Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 5598{
cea2e8a9 5599 dTHX;
46fc3d4c 5600 register SV *sv;
5601 va_list args;
46fc3d4c 5602 va_start(args, pat);
c5be433b 5603 sv = vnewSVpvf(pat, &args);
46fc3d4c 5604 va_end(args);
5605 return sv;
5606}
cea2e8a9 5607#endif
46fc3d4c 5608
954c1994
GS
5609/*
5610=for apidoc newSVpvf
5611
5612Creates a new SV an initialize it with the string formatted like
5613C<sprintf>.
5614
5615=cut
5616*/
5617
cea2e8a9
GS
5618SV *
5619Perl_newSVpvf(pTHX_ const char* pat, ...)
5620{
5621 register SV *sv;
5622 va_list args;
cea2e8a9 5623 va_start(args, pat);
c5be433b 5624 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
5625 va_end(args);
5626 return sv;
5627}
46fc3d4c 5628
79072805 5629SV *
c5be433b
GS
5630Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
5631{
5632 register SV *sv;
5633 new_SV(sv);
5634 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
5635 return sv;
5636}
5637
954c1994
GS
5638/*
5639=for apidoc newSVnv
5640
5641Creates a new SV and copies a floating point value into it.
5642The reference count for the SV is set to 1.
5643
5644=cut
5645*/
5646
c5be433b 5647SV *
65202027 5648Perl_newSVnv(pTHX_ NV n)
79072805 5649{
463ee0b2 5650 register SV *sv;
79072805 5651
4561caa4 5652 new_SV(sv);
79072805
LW
5653 sv_setnv(sv,n);
5654 return sv;
5655}
5656
954c1994
GS
5657/*
5658=for apidoc newSViv
5659
5660Creates a new SV and copies an integer into it. The reference count for the
5661SV is set to 1.
5662
5663=cut
5664*/
5665
79072805 5666SV *
864dbfa3 5667Perl_newSViv(pTHX_ IV i)
79072805 5668{
463ee0b2 5669 register SV *sv;
79072805 5670
4561caa4 5671 new_SV(sv);
79072805
LW
5672 sv_setiv(sv,i);
5673 return sv;
5674}
5675
954c1994 5676/*
1a3327fb
JH
5677=for apidoc newSVuv
5678
5679Creates a new SV and copies an unsigned integer into it.
5680The reference count for the SV is set to 1.
5681
5682=cut
5683*/
5684
5685SV *
5686Perl_newSVuv(pTHX_ UV u)
5687{
5688 register SV *sv;
5689
5690 new_SV(sv);
5691 sv_setuv(sv,u);
5692 return sv;
5693}
5694
5695/*
954c1994
GS
5696=for apidoc newRV_noinc
5697
5698Creates an RV wrapper for an SV. The reference count for the original
5699SV is B<not> incremented.
5700
5701=cut
5702*/
5703
2304df62 5704SV *
864dbfa3 5705Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62
AD
5706{
5707 register SV *sv;
5708
4561caa4 5709 new_SV(sv);
2304df62 5710 sv_upgrade(sv, SVt_RV);
76e3520e 5711 SvTEMP_off(tmpRef);
d689ffdd 5712 SvRV(sv) = tmpRef;
2304df62 5713 SvROK_on(sv);
2304df62
AD
5714 return sv;
5715}
5716
954c1994 5717/* newRV_inc is #defined to newRV in sv.h */
5f05dabc 5718SV *
864dbfa3 5719Perl_newRV(pTHX_ SV *tmpRef)
5f05dabc 5720{
5f6447b6 5721 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 5722}
5f05dabc 5723
954c1994
GS
5724/*
5725=for apidoc newSVsv
5726
5727Creates a new SV which is an exact duplicate of the original SV.
5728
5729=cut
5730*/
5731
79072805
LW
5732/* make an exact duplicate of old */
5733
5734SV *
864dbfa3 5735Perl_newSVsv(pTHX_ register SV *old)
79072805 5736{
463ee0b2 5737 register SV *sv;
79072805
LW
5738
5739 if (!old)
5740 return Nullsv;
8990e307 5741 if (SvTYPE(old) == SVTYPEMASK) {
0453d815
PM
5742 if (ckWARN_d(WARN_INTERNAL))
5743 Perl_warner(aTHX_ WARN_INTERNAL, "semi-panic: attempt to dup freed string");
79072805
LW
5744 return Nullsv;
5745 }
4561caa4 5746 new_SV(sv);
ff68c719 5747 if (SvTEMP(old)) {
5748 SvTEMP_off(old);
463ee0b2 5749 sv_setsv(sv,old);
ff68c719 5750 SvTEMP_on(old);
79072805
LW
5751 }
5752 else
463ee0b2
LW
5753 sv_setsv(sv,old);
5754 return sv;
79072805
LW
5755}
5756
5757void
864dbfa3 5758Perl_sv_reset(pTHX_ register char *s, HV *stash)
79072805
LW
5759{
5760 register HE *entry;
5761 register GV *gv;
5762 register SV *sv;
5763 register I32 i;
5764 register PMOP *pm;
5765 register I32 max;
4802d5d7 5766 char todo[PERL_UCHAR_MAX+1];
79072805 5767
49d8d3a1
MB
5768 if (!stash)
5769 return;
5770
79072805
LW
5771 if (!*s) { /* reset ?? searches */
5772 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
48c036b1 5773 pm->op_pmdynflags &= ~PMdf_USED;
79072805
LW
5774 }
5775 return;
5776 }
5777
5778 /* reset variables */
5779
5780 if (!HvARRAY(stash))
5781 return;
463ee0b2
LW
5782
5783 Zero(todo, 256, char);
79072805 5784 while (*s) {
4802d5d7 5785 i = (unsigned char)*s;
79072805
LW
5786 if (s[1] == '-') {
5787 s += 2;
5788 }
4802d5d7 5789 max = (unsigned char)*s++;
79072805 5790 for ( ; i <= max; i++) {
463ee0b2
LW
5791 todo[i] = 1;
5792 }
a0d0e21e 5793 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 5794 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
5795 entry;
5796 entry = HeNEXT(entry))
5797 {
1edc1566 5798 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 5799 continue;
1edc1566 5800 gv = (GV*)HeVAL(entry);
79072805 5801 sv = GvSV(gv);
9e35f4b3
GS
5802 if (SvTHINKFIRST(sv)) {
5803 if (!SvREADONLY(sv) && SvROK(sv))
5804 sv_unref(sv);
5805 continue;
5806 }
a0d0e21e 5807 (void)SvOK_off(sv);
79072805
LW
5808 if (SvTYPE(sv) >= SVt_PV) {
5809 SvCUR_set(sv, 0);
463ee0b2
LW
5810 if (SvPVX(sv) != Nullch)
5811 *SvPVX(sv) = '\0';
44a8e56a 5812 SvTAINT(sv);
79072805
LW
5813 }
5814 if (GvAV(gv)) {
5815 av_clear(GvAV(gv));
5816 }
44a8e56a 5817 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
463ee0b2 5818 hv_clear(GvHV(gv));
fa6a1c44 5819#ifdef USE_ENVIRON_ARRAY
3280af22 5820 if (gv == PL_envgv)
79072805 5821 environ[0] = Nullch;
a0d0e21e 5822#endif
79072805
LW
5823 }
5824 }
5825 }
5826 }
5827}
5828
46fc3d4c 5829IO*
864dbfa3 5830Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 5831{
5832 IO* io;
5833 GV* gv;
2d8e6c8d 5834 STRLEN n_a;
46fc3d4c 5835
5836 switch (SvTYPE(sv)) {
5837 case SVt_PVIO:
5838 io = (IO*)sv;
5839 break;
5840 case SVt_PVGV:
5841 gv = (GV*)sv;
5842 io = GvIO(gv);
5843 if (!io)
cea2e8a9 5844 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 5845 break;
5846 default:
5847 if (!SvOK(sv))
cea2e8a9 5848 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 5849 if (SvROK(sv))
5850 return sv_2io(SvRV(sv));
2d8e6c8d 5851 gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
46fc3d4c 5852 if (gv)
5853 io = GvIO(gv);
5854 else
5855 io = 0;
5856 if (!io)
cea2e8a9 5857 Perl_croak(aTHX_ "Bad filehandle: %s", SvPV(sv,n_a));
46fc3d4c 5858 break;
5859 }
5860 return io;
5861}
5862
79072805 5863CV *
864dbfa3 5864Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805
LW
5865{
5866 GV *gv;
5867 CV *cv;
2d8e6c8d 5868 STRLEN n_a;
79072805
LW
5869
5870 if (!sv)
93a17b20 5871 return *gvp = Nullgv, Nullcv;
79072805 5872 switch (SvTYPE(sv)) {
79072805
LW
5873 case SVt_PVCV:
5874 *st = CvSTASH(sv);
5875 *gvp = Nullgv;
5876 return (CV*)sv;
5877 case SVt_PVHV:
5878 case SVt_PVAV:
5879 *gvp = Nullgv;
5880 return Nullcv;
8990e307
LW
5881 case SVt_PVGV:
5882 gv = (GV*)sv;
a0d0e21e 5883 *gvp = gv;
8990e307
LW
5884 *st = GvESTASH(gv);
5885 goto fix_gv;
5886
79072805 5887 default:
a0d0e21e
LW
5888 if (SvGMAGICAL(sv))
5889 mg_get(sv);
5890 if (SvROK(sv)) {
f5284f61
IZ
5891 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
5892 tryAMAGICunDEREF(to_cv);
5893
62f274bf
GS
5894 sv = SvRV(sv);
5895 if (SvTYPE(sv) == SVt_PVCV) {
5896 cv = (CV*)sv;
5897 *gvp = Nullgv;
5898 *st = CvSTASH(cv);
5899 return cv;
5900 }
5901 else if(isGV(sv))
5902 gv = (GV*)sv;
5903 else
cea2e8a9 5904 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 5905 }
62f274bf 5906 else if (isGV(sv))
79072805
LW
5907 gv = (GV*)sv;
5908 else
2d8e6c8d 5909 gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
79072805
LW
5910 *gvp = gv;
5911 if (!gv)
5912 return Nullcv;
5913 *st = GvESTASH(gv);
8990e307 5914 fix_gv:
8ebc5c01 5915 if (lref && !GvCVu(gv)) {
4633a7c4 5916 SV *tmpsv;
748a9306 5917 ENTER;
4633a7c4 5918 tmpsv = NEWSV(704,0);
16660edb 5919 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
5920 /* XXX this is probably not what they think they're getting.
5921 * It has the same effect as "sub name;", i.e. just a forward
5922 * declaration! */
774d564b 5923 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
5924 newSVOP(OP_CONST, 0, tmpsv),
5925 Nullop,
8990e307 5926 Nullop);
748a9306 5927 LEAVE;
8ebc5c01 5928 if (!GvCVu(gv))
cea2e8a9 5929 Perl_croak(aTHX_ "Unable to create sub named \"%s\"", SvPV(sv,n_a));
8990e307 5930 }
8ebc5c01 5931 return GvCVu(gv);
79072805
LW
5932 }
5933}
5934
c461cf8f
JH
5935/*
5936=for apidoc sv_true
5937
5938Returns true if the SV has a true value by Perl's rules.
5939
5940=cut
5941*/
5942
79072805 5943I32
864dbfa3 5944Perl_sv_true(pTHX_ register SV *sv)
79072805 5945{
8990e307
LW
5946 if (!sv)
5947 return 0;
79072805 5948 if (SvPOK(sv)) {
4e35701f
NIS
5949 register XPV* tXpv;
5950 if ((tXpv = (XPV*)SvANY(sv)) &&
c2f1de04 5951 (tXpv->xpv_cur > 1 ||
4e35701f 5952 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
79072805
LW
5953 return 1;
5954 else
5955 return 0;
5956 }
5957 else {
5958 if (SvIOK(sv))
463ee0b2 5959 return SvIVX(sv) != 0;
79072805
LW
5960 else {
5961 if (SvNOK(sv))
463ee0b2 5962 return SvNVX(sv) != 0.0;
79072805 5963 else
463ee0b2 5964 return sv_2bool(sv);
79072805
LW
5965 }
5966 }
5967}
79072805 5968
ff68c719 5969IV
864dbfa3 5970Perl_sv_iv(pTHX_ register SV *sv)
85e6fe83 5971{
25da4f38
IZ
5972 if (SvIOK(sv)) {
5973 if (SvIsUV(sv))
5974 return (IV)SvUVX(sv);
ff68c719 5975 return SvIVX(sv);
25da4f38 5976 }
ff68c719 5977 return sv_2iv(sv);
85e6fe83 5978}
85e6fe83 5979
ff68c719 5980UV
864dbfa3 5981Perl_sv_uv(pTHX_ register SV *sv)
ff68c719 5982{
25da4f38
IZ
5983 if (SvIOK(sv)) {
5984 if (SvIsUV(sv))
5985 return SvUVX(sv);
5986 return (UV)SvIVX(sv);
5987 }
ff68c719 5988 return sv_2uv(sv);
5989}
85e6fe83 5990
65202027 5991NV
864dbfa3 5992Perl_sv_nv(pTHX_ register SV *sv)
79072805 5993{
ff68c719 5994 if (SvNOK(sv))
5995 return SvNVX(sv);
5996 return sv_2nv(sv);
79072805 5997}
79072805 5998
79072805 5999char *
864dbfa3 6000Perl_sv_pv(pTHX_ SV *sv)
1fa8b10d
JD
6001{
6002 STRLEN n_a;
6003
6004 if (SvPOK(sv))
6005 return SvPVX(sv);
6006
6007 return sv_2pv(sv, &n_a);
6008}
6009
6010char *
864dbfa3 6011Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
79072805 6012{
85e6fe83
LW
6013 if (SvPOK(sv)) {
6014 *lp = SvCUR(sv);
a0d0e21e 6015 return SvPVX(sv);
85e6fe83 6016 }
463ee0b2 6017 return sv_2pv(sv, lp);
79072805 6018}
79072805 6019
c461cf8f
JH
6020/*
6021=for apidoc sv_pvn_force
6022
6023Get a sensible string out of the SV somehow.
6024
6025=cut
6026*/
6027
a0d0e21e 6028char *
864dbfa3 6029Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
a0d0e21e
LW
6030{
6031 char *s;
6032
6fc92669
GS
6033 if (SvTHINKFIRST(sv) && !SvROK(sv))
6034 sv_force_normal(sv);
1c846c1f 6035
a0d0e21e
LW
6036 if (SvPOK(sv)) {
6037 *lp = SvCUR(sv);
6038 }
6039 else {
748a9306 6040 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
cea2e8a9 6041 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
6fc92669 6042 PL_op_name[PL_op->op_type]);
a0d0e21e 6043 }
4633a7c4
LW
6044 else
6045 s = sv_2pv(sv, lp);
a0d0e21e
LW
6046 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
6047 STRLEN len = *lp;
1c846c1f 6048
a0d0e21e
LW
6049 if (SvROK(sv))
6050 sv_unref(sv);
6051 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
6052 SvGROW(sv, len + 1);
6053 Move(s,SvPVX(sv),len,char);
6054 SvCUR_set(sv, len);
6055 *SvEND(sv) = '\0';
6056 }
6057 if (!SvPOK(sv)) {
6058 SvPOK_on(sv); /* validate pointer */
6059 SvTAINT(sv);
1d7c1841
GS
6060 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
6061 PTR2UV(sv),SvPVX(sv)));
a0d0e21e
LW
6062 }
6063 }
6064 return SvPVX(sv);
6065}
6066
6067char *
7340a771
GS
6068Perl_sv_pvbyte(pTHX_ SV *sv)
6069{
6070 return sv_pv(sv);
6071}
6072
6073char *
6074Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
6075{
6076 return sv_pvn(sv,lp);
6077}
6078
6079char *
6080Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
6081{
6082 return sv_pvn_force(sv,lp);
6083}
6084
6085char *
6086Perl_sv_pvutf8(pTHX_ SV *sv)
6087{
560a288e 6088 sv_utf8_upgrade(sv);
7340a771
GS
6089 return sv_pv(sv);
6090}
6091
6092char *
6093Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
6094{
560a288e 6095 sv_utf8_upgrade(sv);
7340a771
GS
6096 return sv_pvn(sv,lp);
6097}
6098
c461cf8f
JH
6099/*
6100=for apidoc sv_pvutf8n_force
6101
6102Get a sensible UTF8-encoded string out of the SV somehow. See
6103L</sv_pvn_force>.
6104
6105=cut
6106*/
6107
7340a771
GS
6108char *
6109Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
6110{
560a288e 6111 sv_utf8_upgrade(sv);
7340a771
GS
6112 return sv_pvn_force(sv,lp);
6113}
6114
c461cf8f
JH
6115/*
6116=for apidoc sv_reftype
6117
6118Returns a string describing what the SV is a reference to.
6119
6120=cut
6121*/
6122
7340a771 6123char *
864dbfa3 6124Perl_sv_reftype(pTHX_ SV *sv, int ob)
a0d0e21e
LW
6125{
6126 if (ob && SvOBJECT(sv))
6127 return HvNAME(SvSTASH(sv));
6128 else {
6129 switch (SvTYPE(sv)) {
6130 case SVt_NULL:
6131 case SVt_IV:
6132 case SVt_NV:
6133 case SVt_RV:
6134 case SVt_PV:
6135 case SVt_PVIV:
6136 case SVt_PVNV:
6137 case SVt_PVMG:
6138 case SVt_PVBM:
6139 if (SvROK(sv))
6140 return "REF";
6141 else
6142 return "SCALAR";
6143 case SVt_PVLV: return "LVALUE";
6144 case SVt_PVAV: return "ARRAY";
6145 case SVt_PVHV: return "HASH";
6146 case SVt_PVCV: return "CODE";
6147 case SVt_PVGV: return "GLOB";
1d2dff63 6148 case SVt_PVFM: return "FORMAT";
27f9d8f3 6149 case SVt_PVIO: return "IO";
a0d0e21e
LW
6150 default: return "UNKNOWN";
6151 }
6152 }
6153}
6154
954c1994
GS
6155/*
6156=for apidoc sv_isobject
6157
6158Returns a boolean indicating whether the SV is an RV pointing to a blessed
6159object. If the SV is not an RV, or if the object is not blessed, then this
6160will return false.
6161
6162=cut
6163*/
6164
463ee0b2 6165int
864dbfa3 6166Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 6167{
68dc0745 6168 if (!sv)
6169 return 0;
6170 if (SvGMAGICAL(sv))
6171 mg_get(sv);
85e6fe83
LW
6172 if (!SvROK(sv))
6173 return 0;
6174 sv = (SV*)SvRV(sv);
6175 if (!SvOBJECT(sv))
6176 return 0;
6177 return 1;
6178}
6179
954c1994
GS
6180/*
6181=for apidoc sv_isa
6182
6183Returns a boolean indicating whether the SV is blessed into the specified
6184class. This does not check for subtypes; use C<sv_derived_from> to verify
6185an inheritance relationship.
6186
6187=cut
6188*/
6189
85e6fe83 6190int
864dbfa3 6191Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 6192{
68dc0745 6193 if (!sv)
6194 return 0;
6195 if (SvGMAGICAL(sv))
6196 mg_get(sv);
ed6116ce 6197 if (!SvROK(sv))
463ee0b2 6198 return 0;
ed6116ce
LW
6199 sv = (SV*)SvRV(sv);
6200 if (!SvOBJECT(sv))
463ee0b2
LW
6201 return 0;
6202
6203 return strEQ(HvNAME(SvSTASH(sv)), name);
6204}
6205
954c1994
GS
6206/*
6207=for apidoc newSVrv
6208
6209Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
6210it will be upgraded to one. If C<classname> is non-null then the new SV will
6211be blessed in the specified package. The new SV is returned and its
6212reference count is 1.
6213
6214=cut
6215*/
6216
463ee0b2 6217SV*
864dbfa3 6218Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 6219{
463ee0b2
LW
6220 SV *sv;
6221
4561caa4 6222 new_SV(sv);
51cf62d8 6223
2213622d 6224 SV_CHECK_THINKFIRST(rv);
51cf62d8 6225 SvAMAGIC_off(rv);
51cf62d8 6226
0199fce9
JD
6227 if (SvTYPE(rv) >= SVt_PVMG) {
6228 U32 refcnt = SvREFCNT(rv);
6229 SvREFCNT(rv) = 0;
6230 sv_clear(rv);
6231 SvFLAGS(rv) = 0;
6232 SvREFCNT(rv) = refcnt;
6233 }
6234
51cf62d8 6235 if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
6236 sv_upgrade(rv, SVt_RV);
6237 else if (SvTYPE(rv) > SVt_RV) {
6238 (void)SvOOK_off(rv);
6239 if (SvPVX(rv) && SvLEN(rv))
6240 Safefree(SvPVX(rv));
6241 SvCUR_set(rv, 0);
6242 SvLEN_set(rv, 0);
6243 }
51cf62d8
OT
6244
6245 (void)SvOK_off(rv);
053fc874 6246 SvRV(rv) = sv;
ed6116ce 6247 SvROK_on(rv);
463ee0b2 6248
a0d0e21e
LW
6249 if (classname) {
6250 HV* stash = gv_stashpv(classname, TRUE);
6251 (void)sv_bless(rv, stash);
6252 }
6253 return sv;
6254}
6255
954c1994
GS
6256/*
6257=for apidoc sv_setref_pv
6258
6259Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
6260argument will be upgraded to an RV. That RV will be modified to point to
6261the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
6262into the SV. The C<classname> argument indicates the package for the
6263blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
6264will be returned and will have a reference count of 1.
6265
6266Do not use with other Perl types such as HV, AV, SV, CV, because those
6267objects will become corrupted by the pointer copy process.
6268
6269Note that C<sv_setref_pvn> copies the string while this copies the pointer.
6270
6271=cut
6272*/
6273
a0d0e21e 6274SV*
864dbfa3 6275Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 6276{
189b2af5 6277 if (!pv) {
3280af22 6278 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
6279 SvSETMAGIC(rv);
6280 }
a0d0e21e 6281 else
56431972 6282 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
6283 return rv;
6284}
6285
954c1994
GS
6286/*
6287=for apidoc sv_setref_iv
6288
6289Copies an integer into a new SV, optionally blessing the SV. The C<rv>
6290argument will be upgraded to an RV. That RV will be modified to point to
6291the new SV. The C<classname> argument indicates the package for the
6292blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
6293will be returned and will have a reference count of 1.
6294
6295=cut
6296*/
6297
a0d0e21e 6298SV*
864dbfa3 6299Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
6300{
6301 sv_setiv(newSVrv(rv,classname), iv);
6302 return rv;
6303}
6304
954c1994
GS
6305/*
6306=for apidoc sv_setref_nv
6307
6308Copies a double into a new SV, optionally blessing the SV. The C<rv>
6309argument will be upgraded to an RV. That RV will be modified to point to
6310the new SV. The C<classname> argument indicates the package for the
6311blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
6312will be returned and will have a reference count of 1.
6313
6314=cut
6315*/
6316
a0d0e21e 6317SV*
65202027 6318Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
6319{
6320 sv_setnv(newSVrv(rv,classname), nv);
6321 return rv;
6322}
463ee0b2 6323
954c1994
GS
6324/*
6325=for apidoc sv_setref_pvn
6326
6327Copies a string into a new SV, optionally blessing the SV. The length of the
6328string must be specified with C<n>. The C<rv> argument will be upgraded to
6329an RV. That RV will be modified to point to the new SV. The C<classname>
6330argument indicates the package for the blessing. Set C<classname> to
6331C<Nullch> to avoid the blessing. The new SV will be returned and will have
6332a reference count of 1.
6333
6334Note that C<sv_setref_pv> copies the pointer while this copies the string.
6335
6336=cut
6337*/
6338
a0d0e21e 6339SV*
864dbfa3 6340Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
6341{
6342 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
6343 return rv;
6344}
6345
954c1994
GS
6346/*
6347=for apidoc sv_bless
6348
6349Blesses an SV into a specified package. The SV must be an RV. The package
6350must be designated by its stash (see C<gv_stashpv()>). The reference count
6351of the SV is unaffected.
6352
6353=cut
6354*/
6355
a0d0e21e 6356SV*
864dbfa3 6357Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 6358{
76e3520e 6359 SV *tmpRef;
a0d0e21e 6360 if (!SvROK(sv))
cea2e8a9 6361 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
6362 tmpRef = SvRV(sv);
6363 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
6364 if (SvREADONLY(tmpRef))
cea2e8a9 6365 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
6366 if (SvOBJECT(tmpRef)) {
6367 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 6368 --PL_sv_objcount;
76e3520e 6369 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 6370 }
a0d0e21e 6371 }
76e3520e
GS
6372 SvOBJECT_on(tmpRef);
6373 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 6374 ++PL_sv_objcount;
76e3520e
GS
6375 (void)SvUPGRADE(tmpRef, SVt_PVMG);
6376 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
a0d0e21e 6377
2e3febc6
CS
6378 if (Gv_AMG(stash))
6379 SvAMAGIC_on(sv);
6380 else
6381 SvAMAGIC_off(sv);
a0d0e21e
LW
6382
6383 return sv;
6384}
6385
76e3520e 6386STATIC void
cea2e8a9 6387S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 6388{
850fabdf
GS
6389 void *xpvmg;
6390
a0d0e21e
LW
6391 assert(SvTYPE(sv) == SVt_PVGV);
6392 SvFAKE_off(sv);
6393 if (GvGP(sv))
1edc1566 6394 gp_free((GV*)sv);
e826b3c7
GS
6395 if (GvSTASH(sv)) {
6396 SvREFCNT_dec(GvSTASH(sv));
6397 GvSTASH(sv) = Nullhv;
6398 }
a0d0e21e
LW
6399 sv_unmagic(sv, '*');
6400 Safefree(GvNAME(sv));
a5f75d66 6401 GvMULTI_off(sv);
850fabdf
GS
6402
6403 /* need to keep SvANY(sv) in the right arena */
6404 xpvmg = new_XPVMG();
6405 StructCopy(SvANY(sv), xpvmg, XPVMG);
6406 del_XPVGV(SvANY(sv));
6407 SvANY(sv) = xpvmg;
6408
a0d0e21e
LW
6409 SvFLAGS(sv) &= ~SVTYPEMASK;
6410 SvFLAGS(sv) |= SVt_PVMG;
6411}
6412
954c1994 6413/*
840a7b70 6414=for apidoc sv_unref_flags
954c1994
GS
6415
6416Unsets the RV status of the SV, and decrements the reference count of
6417whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
6418as a reversal of C<newSVrv>. The C<cflags> argument can contain
6419C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
6420(otherwise the decrementing is conditional on the reference count being
6421different from one or the reference being a readonly SV).
7889fe52 6422See C<SvROK_off>.
954c1994
GS
6423
6424=cut
6425*/
6426
ed6116ce 6427void
840a7b70 6428Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
ed6116ce 6429{
a0d0e21e 6430 SV* rv = SvRV(sv);
810b8aa5
GS
6431
6432 if (SvWEAKREF(sv)) {
6433 sv_del_backref(sv);
6434 SvWEAKREF_off(sv);
6435 SvRV(sv) = 0;
6436 return;
6437 }
ed6116ce
LW
6438 SvRV(sv) = 0;
6439 SvROK_off(sv);
840a7b70 6440 if (SvREFCNT(rv) != 1 || SvREADONLY(rv) || flags) /* SV_IMMEDIATE_UNREF */
4633a7c4 6441 SvREFCNT_dec(rv);
840a7b70 6442 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
4633a7c4 6443 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 6444}
8990e307 6445
840a7b70
IZ
6446/*
6447=for apidoc sv_unref
6448
6449Unsets the RV status of the SV, and decrements the reference count of
6450whatever was being referenced by the RV. This can almost be thought of
6451as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
7889fe52 6452being zero. See C<SvROK_off>.
840a7b70
IZ
6453
6454=cut
6455*/
6456
6457void
6458Perl_sv_unref(pTHX_ SV *sv)
6459{
6460 sv_unref_flags(sv, 0);
6461}
6462
bbce6d69 6463void
864dbfa3 6464Perl_sv_taint(pTHX_ SV *sv)
bbce6d69 6465{
6466 sv_magic((sv), Nullsv, 't', Nullch, 0);
6467}
6468
6469void
864dbfa3 6470Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 6471{
13f57bf8 6472 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
36477c24 6473 MAGIC *mg = mg_find(sv, 't');
6474 if (mg)
565764a8 6475 mg->mg_len &= ~1;
36477c24 6476 }
bbce6d69 6477}
6478
6479bool
864dbfa3 6480Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 6481{
13f57bf8 6482 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
36477c24 6483 MAGIC *mg = mg_find(sv, 't');
155aba94 6484 if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
36477c24 6485 return TRUE;
6486 }
6487 return FALSE;
bbce6d69 6488}
6489
954c1994
GS
6490/*
6491=for apidoc sv_setpviv
6492
6493Copies an integer into the given SV, also updating its string value.
6494Does not handle 'set' magic. See C<sv_setpviv_mg>.
6495
6496=cut
6497*/
6498
84902520 6499void
864dbfa3 6500Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
84902520 6501{
25da4f38
IZ
6502 char buf[TYPE_CHARS(UV)];
6503 char *ebuf;
6504 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
84902520 6505
25da4f38 6506 sv_setpvn(sv, ptr, ebuf - ptr);
84902520
TB
6507}
6508
ef50df4b 6509
954c1994
GS
6510/*
6511=for apidoc sv_setpviv_mg
6512
6513Like C<sv_setpviv>, but also handles 'set' magic.
6514
6515=cut
6516*/
6517
ef50df4b 6518void
864dbfa3 6519Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
ef50df4b 6520{
25da4f38
IZ
6521 char buf[TYPE_CHARS(UV)];
6522 char *ebuf;
6523 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
6524
6525 sv_setpvn(sv, ptr, ebuf - ptr);
ef50df4b
GS
6526 SvSETMAGIC(sv);
6527}
6528
cea2e8a9
GS
6529#if defined(PERL_IMPLICIT_CONTEXT)
6530void
6531Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
6532{
6533 dTHX;
6534 va_list args;
6535 va_start(args, pat);
c5be433b 6536 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
6537 va_end(args);
6538}
6539
6540
6541void
6542Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
6543{
6544 dTHX;
6545 va_list args;
6546 va_start(args, pat);
c5be433b 6547 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 6548 va_end(args);
cea2e8a9
GS
6549}
6550#endif
6551
954c1994
GS
6552/*
6553=for apidoc sv_setpvf
6554
6555Processes its arguments like C<sprintf> and sets an SV to the formatted
6556output. Does not handle 'set' magic. See C<sv_setpvf_mg>.
6557
6558=cut
6559*/
6560
46fc3d4c 6561void
864dbfa3 6562Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 6563{
6564 va_list args;
46fc3d4c 6565 va_start(args, pat);
c5be433b 6566 sv_vsetpvf(sv, pat, &args);
46fc3d4c 6567 va_end(args);
6568}
6569
c5be433b
GS
6570void
6571Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
6572{
6573 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
6574}
ef50df4b 6575
954c1994
GS
6576/*
6577=for apidoc sv_setpvf_mg
6578
6579Like C<sv_setpvf>, but also handles 'set' magic.
6580
6581=cut
6582*/
6583
ef50df4b 6584void
864dbfa3 6585Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
6586{
6587 va_list args;
ef50df4b 6588 va_start(args, pat);
c5be433b 6589 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 6590 va_end(args);
c5be433b
GS
6591}
6592
6593void
6594Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
6595{
6596 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
6597 SvSETMAGIC(sv);
6598}
6599
cea2e8a9
GS
6600#if defined(PERL_IMPLICIT_CONTEXT)
6601void
6602Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
6603{
6604 dTHX;
6605 va_list args;
6606 va_start(args, pat);
c5be433b 6607 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
6608 va_end(args);
6609}
6610
6611void
6612Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
6613{
6614 dTHX;
6615 va_list args;
6616 va_start(args, pat);
c5be433b 6617 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 6618 va_end(args);
cea2e8a9
GS
6619}
6620#endif
6621
954c1994
GS
6622/*
6623=for apidoc sv_catpvf
6624
6625Processes its arguments like C<sprintf> and appends the formatted output
6626to an SV. Handles 'get' magic, but not 'set' magic. C<SvSETMAGIC()> must
6627typically be called after calling this function to handle 'set' magic.
6628
6629=cut
6630*/
6631
46fc3d4c 6632void
864dbfa3 6633Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 6634{
6635 va_list args;
46fc3d4c 6636 va_start(args, pat);
c5be433b 6637 sv_vcatpvf(sv, pat, &args);
46fc3d4c 6638 va_end(args);
6639}
6640
ef50df4b 6641void
c5be433b
GS
6642Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
6643{
6644 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
6645}
6646
954c1994
GS
6647/*
6648=for apidoc sv_catpvf_mg
6649
6650Like C<sv_catpvf>, but also handles 'set' magic.
6651
6652=cut
6653*/
6654
c5be433b 6655void
864dbfa3 6656Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
6657{
6658 va_list args;
ef50df4b 6659 va_start(args, pat);
c5be433b 6660 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 6661 va_end(args);
c5be433b
GS
6662}
6663
6664void
6665Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
6666{
6667 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
ef50df4b
GS
6668 SvSETMAGIC(sv);
6669}
6670
954c1994
GS
6671/*
6672=for apidoc sv_vsetpvfn
6673
6674Works like C<vcatpvfn> but copies the text into the SV instead of
6675appending it.
6676
6677=cut
6678*/
6679
46fc3d4c 6680void
7d5ea4e7 6681Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 6682{
6683 sv_setpvn(sv, "", 0);
7d5ea4e7 6684 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 6685}
6686
954c1994
GS
6687/*
6688=for apidoc sv_vcatpvfn
6689
6690Processes its arguments like C<vsprintf> and appends the formatted output
6691to an SV. Uses an array of SVs if the C style variable argument list is
6692missing (NULL). When running with taint checks enabled, indicates via
6693C<maybe_tainted> if results are untrustworthy (often due to the use of
6694locales).
6695
6696=cut
6697*/
6698
46fc3d4c 6699void
7d5ea4e7 6700Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 6701{
6702 char *p;
6703 char *q;
6704 char *patend;
fc36a67e 6705 STRLEN origlen;
46fc3d4c 6706 I32 svix = 0;
c635e13b 6707 static char nullstr[] = "(null)";
7e2040f0 6708 SV *argsv;
46fc3d4c 6709
6710 /* no matter what, this is a string now */
fc36a67e 6711 (void)SvPV_force(sv, origlen);
46fc3d4c 6712
fc36a67e 6713 /* special-case "", "%s", and "%_" */
46fc3d4c 6714 if (patlen == 0)
6715 return;
fc36a67e 6716 if (patlen == 2 && pat[0] == '%') {
6717 switch (pat[1]) {
6718 case 's':
c635e13b 6719 if (args) {
6720 char *s = va_arg(*args, char*);
6721 sv_catpv(sv, s ? s : nullstr);
6722 }
7e2040f0 6723 else if (svix < svmax) {
fc36a67e 6724 sv_catsv(sv, *svargs);
7e2040f0
GS
6725 if (DO_UTF8(*svargs))
6726 SvUTF8_on(sv);
6727 }
fc36a67e 6728 return;
6729 case '_':
6730 if (args) {
7e2040f0
GS
6731 argsv = va_arg(*args, SV*);
6732 sv_catsv(sv, argsv);
6733 if (DO_UTF8(argsv))
6734 SvUTF8_on(sv);
fc36a67e 6735 return;
6736 }
6737 /* See comment on '_' below */
6738 break;
6739 }
46fc3d4c 6740 }
6741
6742 patend = (char*)pat + patlen;
6743 for (p = (char*)pat; p < patend; p = q) {
6744 bool alt = FALSE;
6745 bool left = FALSE;
b22c7a20
GS
6746 bool vectorize = FALSE;
6747 bool utf = FALSE;
46fc3d4c 6748 char fill = ' ';
6749 char plus = 0;
6750 char intsize = 0;
6751 STRLEN width = 0;
fc36a67e 6752 STRLEN zeros = 0;
46fc3d4c 6753 bool has_precis = FALSE;
6754 STRLEN precis = 0;
7e2040f0 6755 bool is_utf = FALSE;
eb3fce90 6756
46fc3d4c 6757 char esignbuf[4];
ad391ad9 6758 U8 utf8buf[UTF8_MAXLEN+1];
46fc3d4c 6759 STRLEN esignlen = 0;
6760
6761 char *eptr = Nullch;
fc36a67e 6762 STRLEN elen = 0;
089c015b
JH
6763 /* Times 4: a decimal digit takes more than 3 binary digits.
6764 * NV_DIG: mantissa takes than many decimal digits.
6765 * Plus 32: Playing safe. */
6766 char ebuf[IV_DIG * 4 + NV_DIG + 32];
2d4389e4
JH
6767 /* large enough for "%#.#f" --chip */
6768 /* what about long double NVs? --jhi */
b22c7a20
GS
6769
6770 SV *vecsv;
a05b299f 6771 U8 *vecstr = Null(U8*);
b22c7a20 6772 STRLEN veclen = 0;
46fc3d4c 6773 char c;
6774 int i;
6775 unsigned base;
6776 IV iv;
6777 UV uv;
65202027 6778 NV nv;
46fc3d4c 6779 STRLEN have;
6780 STRLEN need;
6781 STRLEN gap;
b22c7a20
GS
6782 char *dotstr = ".";
6783 STRLEN dotstrlen = 1;
eb3fce90
JH
6784 I32 epix = 0; /* explicit parameter index */
6785 I32 ewix = 0; /* explicit width index */
6786 bool asterisk = FALSE;
46fc3d4c 6787
6788 for (q = p; q < patend && *q != '%'; ++q) ;
6789 if (q > p) {
6790 sv_catpvn(sv, p, q - p);
6791 p = q;
6792 }
6793 if (q++ >= patend)
6794 break;
6795
fc36a67e 6796 /* FLAGS */
6797
46fc3d4c 6798 while (*q) {
6799 switch (*q) {
6800 case ' ':
6801 case '+':
6802 plus = *q++;
6803 continue;
6804
6805 case '-':
6806 left = TRUE;
6807 q++;
6808 continue;
6809
6810 case '0':
6811 fill = *q++;
6812 continue;
6813
6814 case '#':
6815 alt = TRUE;
6816 q++;
6817 continue;
6818
b22c7a20
GS
6819 case '*': /* printf("%*vX",":",$ipv6addr) */
6820 if (q[1] != 'v')
6821 break;
6822 q++;
6823 if (args)
6824 vecsv = va_arg(*args, SV*);
6825 else if (svix < svmax)
6826 vecsv = svargs[svix++];
9c3dd3fe
GS
6827 else
6828 continue;
b22c7a20
GS
6829 dotstr = SvPVx(vecsv,dotstrlen);
6830 if (DO_UTF8(vecsv))
6831 is_utf = TRUE;
6832 /* FALL THROUGH */
6833
6834 case 'v':
6835 vectorize = TRUE;
6836 q++;
b22c7a20
GS
6837 continue;
6838
fc36a67e 6839 default:
6840 break;
6841 }
6842 break;
6843 }
46fc3d4c 6844
fc36a67e 6845 /* WIDTH */
6846
eb3fce90
JH
6847 scanwidth:
6848
6849 if (*q == '*') {
6850 if (asterisk)
6851 goto unknown;
6852 asterisk = TRUE;
6853 q++;
6854 }
6855
fc36a67e 6856 switch (*q) {
6857 case '1': case '2': case '3':
6858 case '4': case '5': case '6':
6859 case '7': case '8': case '9':
6860 width = 0;
6861 while (isDIGIT(*q))
6862 width = width * 10 + (*q++ - '0');
eb3fce90
JH
6863 if (*q == '$') {
6864 if (asterisk && ewix == 0) {
6865 ewix = width;
6866 width = 0;
6867 q++;
6868 goto scanwidth;
6869 } else if (epix == 0) {
6870 epix = width;
6871 width = 0;
6872 q++;
6873 goto scanwidth;
6874 } else
6875 goto unknown;
6876 }
6877 }
fc36a67e 6878
eb3fce90 6879 if (asterisk) {
fc36a67e 6880 if (args)
6881 i = va_arg(*args, int);
6882 else
eb3fce90
JH
6883 i = (ewix ? ewix <= svmax : svix < svmax) ?
6884 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 6885 left |= (i < 0);
6886 width = (i < 0) ? -i : i;
fc36a67e 6887 }
6888
6889 /* PRECISION */
46fc3d4c 6890
fc36a67e 6891 if (*q == '.') {
6892 q++;
6893 if (*q == '*') {
46fc3d4c 6894 if (args)
6895 i = va_arg(*args, int);
6896 else
eb3fce90
JH
6897 i = (ewix ? ewix <= svmax : svix < svmax)
6898 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 6899 precis = (i < 0) ? 0 : i;
46fc3d4c 6900 q++;
fc36a67e 6901 }
6902 else {
6903 precis = 0;
6904 while (isDIGIT(*q))
6905 precis = precis * 10 + (*q++ - '0');
6906 }
6907 has_precis = TRUE;
6908 }
46fc3d4c 6909
bb2899ba
GS
6910 if (vectorize) {
6911 if (args) {
6912 vecsv = va_arg(*args, SV*);
6913 vecstr = (U8*)SvPVx(vecsv,veclen);
6914 utf = DO_UTF8(vecsv);
6915 }
eb3fce90
JH
6916 else if (epix ? epix <= svmax : svix < svmax) {
6917 vecsv = svargs[epix ? epix-1 : svix++];
bb2899ba
GS
6918 vecstr = (U8*)SvPVx(vecsv,veclen);
6919 utf = DO_UTF8(vecsv);
6920 }
6921 else {
6922 vecstr = (U8*)"";
6923 veclen = 0;
6924 }
6925 }
6926
fc36a67e 6927 /* SIZE */
46fc3d4c 6928
fc36a67e 6929 switch (*q) {
e5c81feb 6930#if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
6f9bb7fd 6931 case 'L': /* Ld */
e5c81feb
JH
6932 /* FALL THROUGH */
6933#endif
6934#ifdef HAS_QUAD
6f9bb7fd
GS
6935 case 'q': /* qd */
6936 intsize = 'q';
6937 q++;
6938 break;
6939#endif
fc36a67e 6940 case 'l':
e5c81feb
JH
6941#if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
6942 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 6943 intsize = 'q';
6944 q += 2;
46fc3d4c 6945 break;
cf2093f6 6946 }
fc36a67e 6947#endif
6f9bb7fd 6948 /* FALL THROUGH */
fc36a67e 6949 case 'h':
cf2093f6 6950 /* FALL THROUGH */
fc36a67e 6951 case 'V':
6952 intsize = *q++;
46fc3d4c 6953 break;
6954 }
6955
fc36a67e 6956 /* CONVERSION */
6957
46fc3d4c 6958 switch (c = *q++) {
6959
6960 /* STRINGS */
6961
6962 case '%':
6963 eptr = q - 1;
6964 elen = 1;
6965 goto string;
6966
6967 case 'c':
7e2040f0
GS
6968 if (args)
6969 uv = va_arg(*args, int);
6970 else
eb3fce90
JH
6971 uv = (epix ? epix <= svmax : svix < svmax) ?
6972 SvIVx(svargs[epix ? epix-1 : svix++]) : 0;
3969a896 6973 if ((uv > 255 || (uv > 127 && SvUTF8(sv))) && !IN_BYTE) {
dfe13c55
GS
6974 eptr = (char*)utf8buf;
6975 elen = uv_to_utf8((U8*)eptr, uv) - utf8buf;
7e2040f0
GS
6976 is_utf = TRUE;
6977 }
6978 else {
6979 c = (char)uv;
6980 eptr = &c;
6981 elen = 1;
a0ed51b3 6982 }
46fc3d4c 6983 goto string;
6984
46fc3d4c 6985 case 's':
6986 if (args) {
fc36a67e 6987 eptr = va_arg(*args, char*);
c635e13b 6988 if (eptr)
1d7c1841
GS
6989#ifdef MACOS_TRADITIONAL
6990 /* On MacOS, %#s format is used for Pascal strings */
6991 if (alt)
6992 elen = *eptr++;
6993 else
6994#endif
c635e13b 6995 elen = strlen(eptr);
6996 else {
6997 eptr = nullstr;
6998 elen = sizeof nullstr - 1;
6999 }
46fc3d4c 7000 }
eb3fce90
JH
7001 else if (epix ? epix <= svmax : svix < svmax) {
7002 argsv = svargs[epix ? epix-1 : svix++];
7e2040f0
GS
7003 eptr = SvPVx(argsv, elen);
7004 if (DO_UTF8(argsv)) {
a0ed51b3
LW
7005 if (has_precis && precis < elen) {
7006 I32 p = precis;
7e2040f0 7007 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
7008 precis = p;
7009 }
7010 if (width) { /* fudge width (can't fudge elen) */
7e2040f0 7011 width += elen - sv_len_utf8(argsv);
a0ed51b3 7012 }
7e2040f0 7013 is_utf = TRUE;
a0ed51b3
LW
7014 }
7015 }
46fc3d4c 7016 goto string;
7017
fc36a67e 7018 case '_':
7019 /*
7020 * The "%_" hack might have to be changed someday,
7021 * if ISO or ANSI decide to use '_' for something.
7022 * So we keep it hidden from users' code.
7023 */
7024 if (!args)
7025 goto unknown;
7e2040f0
GS
7026 argsv = va_arg(*args,SV*);
7027 eptr = SvPVx(argsv, elen);
7028 if (DO_UTF8(argsv))
7029 is_utf = TRUE;
fc36a67e 7030
46fc3d4c 7031 string:
b22c7a20 7032 vectorize = FALSE;
46fc3d4c 7033 if (has_precis && elen > precis)
7034 elen = precis;
7035 break;
7036
7037 /* INTEGERS */
7038
fc36a67e 7039 case 'p':
c2e66d9e
GS
7040 if (alt)
7041 goto unknown;
fc36a67e 7042 if (args)
56431972 7043 uv = PTR2UV(va_arg(*args, void*));
fc36a67e 7044 else
eb3fce90
JH
7045 uv = (epix ? epix <= svmax : svix < svmax) ?
7046 PTR2UV(svargs[epix ? epix-1 : svix++]) : 0;
fc36a67e 7047 base = 16;
7048 goto integer;
7049
46fc3d4c 7050 case 'D':
29fe7a80 7051#ifdef IV_IS_QUAD
22f3ae8c 7052 intsize = 'q';
29fe7a80 7053#else
46fc3d4c 7054 intsize = 'l';
29fe7a80 7055#endif
46fc3d4c 7056 /* FALL THROUGH */
7057 case 'd':
7058 case 'i':
b22c7a20 7059 if (vectorize) {
ba210ebe 7060 STRLEN ulen;
b22c7a20
GS
7061 if (!veclen) {
7062 vectorize = FALSE;
7063 break;
7064 }
7065 if (utf)
dcad2880 7066 iv = (IV)utf8_to_uv(vecstr, veclen, &ulen, 0);
b22c7a20 7067 else {
a05b299f 7068 iv = *vecstr;
b22c7a20
GS
7069 ulen = 1;
7070 }
7071 vecstr += ulen;
7072 veclen -= ulen;
7073 }
7074 else if (args) {
46fc3d4c 7075 switch (intsize) {
7076 case 'h': iv = (short)va_arg(*args, int); break;
7077 default: iv = va_arg(*args, int); break;
7078 case 'l': iv = va_arg(*args, long); break;
fc36a67e 7079 case 'V': iv = va_arg(*args, IV); break;
cf2093f6
JH
7080#ifdef HAS_QUAD
7081 case 'q': iv = va_arg(*args, Quad_t); break;
7082#endif
46fc3d4c 7083 }
7084 }
7085 else {
eb3fce90
JH
7086 iv = (epix ? epix <= svmax : svix < svmax) ?
7087 SvIVx(svargs[epix ? epix-1 : svix++]) : 0;
46fc3d4c 7088 switch (intsize) {
7089 case 'h': iv = (short)iv; break;
be28567c 7090 default: break;
46fc3d4c 7091 case 'l': iv = (long)iv; break;
fc36a67e 7092 case 'V': break;
cf2093f6
JH
7093#ifdef HAS_QUAD
7094 case 'q': iv = (Quad_t)iv; break;
7095#endif
46fc3d4c 7096 }
7097 }
7098 if (iv >= 0) {
7099 uv = iv;
7100 if (plus)
7101 esignbuf[esignlen++] = plus;
7102 }
7103 else {
7104 uv = -iv;
7105 esignbuf[esignlen++] = '-';
7106 }
7107 base = 10;
7108 goto integer;
7109
fc36a67e 7110 case 'U':
29fe7a80 7111#ifdef IV_IS_QUAD
22f3ae8c 7112 intsize = 'q';
29fe7a80 7113#else
fc36a67e 7114 intsize = 'l';
29fe7a80 7115#endif
fc36a67e 7116 /* FALL THROUGH */
7117 case 'u':
7118 base = 10;
7119 goto uns_integer;
7120
4f19785b
WSI
7121 case 'b':
7122 base = 2;
7123 goto uns_integer;
7124
46fc3d4c 7125 case 'O':
29fe7a80 7126#ifdef IV_IS_QUAD
22f3ae8c 7127 intsize = 'q';
29fe7a80 7128#else
46fc3d4c 7129 intsize = 'l';
29fe7a80 7130#endif
46fc3d4c 7131 /* FALL THROUGH */
7132 case 'o':
7133 base = 8;
7134 goto uns_integer;
7135
7136 case 'X':
46fc3d4c 7137 case 'x':
7138 base = 16;
46fc3d4c 7139
7140 uns_integer:
b22c7a20 7141 if (vectorize) {
ba210ebe 7142 STRLEN ulen;
b22c7a20
GS
7143 vector:
7144 if (!veclen) {
7145 vectorize = FALSE;
7146 break;
7147 }
7148 if (utf)
dcad2880 7149 uv = utf8_to_uv(vecstr, veclen, &ulen, 0);
b22c7a20 7150 else {
a05b299f 7151 uv = *vecstr;
b22c7a20
GS
7152 ulen = 1;
7153 }
7154 vecstr += ulen;
7155 veclen -= ulen;
7156 }
7157 else if (args) {
46fc3d4c 7158 switch (intsize) {
7159 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
7160 default: uv = va_arg(*args, unsigned); break;
7161 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 7162 case 'V': uv = va_arg(*args, UV); break;
cf2093f6
JH
7163#ifdef HAS_QUAD
7164 case 'q': uv = va_arg(*args, Quad_t); break;
7165#endif
46fc3d4c 7166 }
7167 }
7168 else {
eb3fce90
JH
7169 uv = (epix ? epix <= svmax : svix < svmax) ?
7170 SvUVx(svargs[epix ? epix-1 : svix++]) : 0;
46fc3d4c 7171 switch (intsize) {
7172 case 'h': uv = (unsigned short)uv; break;
be28567c 7173 default: break;
46fc3d4c 7174 case 'l': uv = (unsigned long)uv; break;
fc36a67e 7175 case 'V': break;
cf2093f6
JH
7176#ifdef HAS_QUAD
7177 case 'q': uv = (Quad_t)uv; break;
7178#endif
46fc3d4c 7179 }
7180 }
7181
7182 integer:
46fc3d4c 7183 eptr = ebuf + sizeof ebuf;
fc36a67e 7184 switch (base) {
7185 unsigned dig;
7186 case 16:
c10ed8b9
HS
7187 if (!uv)
7188 alt = FALSE;
1d7c1841
GS
7189 p = (char*)((c == 'X')
7190 ? "0123456789ABCDEF" : "0123456789abcdef");
fc36a67e 7191 do {
7192 dig = uv & 15;
7193 *--eptr = p[dig];
7194 } while (uv >>= 4);
7195 if (alt) {
46fc3d4c 7196 esignbuf[esignlen++] = '0';
fc36a67e 7197 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 7198 }
fc36a67e 7199 break;
7200 case 8:
7201 do {
7202 dig = uv & 7;
7203 *--eptr = '0' + dig;
7204 } while (uv >>= 3);
7205 if (alt && *eptr != '0')
7206 *--eptr = '0';
7207 break;
4f19785b
WSI
7208 case 2:
7209 do {
7210 dig = uv & 1;
7211 *--eptr = '0' + dig;
7212 } while (uv >>= 1);
eda88b6d
JH
7213 if (alt) {
7214 esignbuf[esignlen++] = '0';
7481bb52 7215 esignbuf[esignlen++] = 'b';
eda88b6d 7216 }
4f19785b 7217 break;
fc36a67e 7218 default: /* it had better be ten or less */
6bc102ca 7219#if defined(PERL_Y2KWARN)
e476b1b5 7220 if (ckWARN(WARN_Y2K)) {
6bc102ca
GS
7221 STRLEN n;
7222 char *s = SvPV(sv,n);
7223 if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
7224 && (n == 2 || !isDIGIT(s[n-3])))
7225 {
e476b1b5 7226 Perl_warner(aTHX_ WARN_Y2K,
6bc102ca
GS
7227 "Possible Y2K bug: %%%c %s",
7228 c, "format string following '19'");
7229 }
7230 }
7231#endif
fc36a67e 7232 do {
7233 dig = uv % base;
7234 *--eptr = '0' + dig;
7235 } while (uv /= base);
7236 break;
46fc3d4c 7237 }
7238 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
7239 if (has_precis) {
7240 if (precis > elen)
7241 zeros = precis - elen;
7242 else if (precis == 0 && elen == 1 && *eptr == '0')
7243 elen = 0;
7244 }
46fc3d4c 7245 break;
7246
7247 /* FLOATING POINT */
7248
fc36a67e 7249 case 'F':
7250 c = 'f'; /* maybe %F isn't supported here */
7251 /* FALL THROUGH */
46fc3d4c 7252 case 'e': case 'E':
fc36a67e 7253 case 'f':
46fc3d4c 7254 case 'g': case 'G':
7255
7256 /* This is evil, but floating point is even more evil */
7257
b22c7a20 7258 vectorize = FALSE;
fc36a67e 7259 if (args)
65202027 7260 nv = va_arg(*args, NV);
fc36a67e 7261 else
eb3fce90
JH
7262 nv = (epix ? epix <= svmax : svix < svmax) ?
7263 SvNVx(svargs[epix ? epix-1 : svix++]) : 0.0;
fc36a67e 7264
7265 need = 0;
7266 if (c != 'e' && c != 'E') {
7267 i = PERL_INT_MIN;
73b309ea 7268 (void)Perl_frexp(nv, &i);
fc36a67e 7269 if (i == PERL_INT_MIN)
cea2e8a9 7270 Perl_die(aTHX_ "panic: frexp");
c635e13b 7271 if (i > 0)
fc36a67e 7272 need = BIT_DIGITS(i);
7273 }
7274 need += has_precis ? precis : 6; /* known default */
7275 if (need < width)
7276 need = width;
7277
46fc3d4c 7278 need += 20; /* fudge factor */
80252599
GS
7279 if (PL_efloatsize < need) {
7280 Safefree(PL_efloatbuf);
7281 PL_efloatsize = need + 20; /* more fudge */
7282 New(906, PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 7283 PL_efloatbuf[0] = '\0';
46fc3d4c 7284 }
7285
7286 eptr = ebuf + sizeof ebuf;
7287 *--eptr = '\0';
7288 *--eptr = c;
e5c81feb 7289#if defined(USE_LONG_DOUBLE) && defined(PERL_PRIfldbl)
cf2093f6 7290 {
e5c81feb
JH
7291 /* Copy the one or more characters in a long double
7292 * format before the 'base' ([efgEFG]) character to
7293 * the format string. */
7294 static char const prifldbl[] = PERL_PRIfldbl;
7295 char const *p = prifldbl + sizeof(prifldbl) - 3;
7296 while (p >= prifldbl) { *--eptr = *p--; }
cf2093f6 7297 }
65202027 7298#endif
46fc3d4c 7299 if (has_precis) {
7300 base = precis;
7301 do { *--eptr = '0' + (base % 10); } while (base /= 10);
7302 *--eptr = '.';
7303 }
7304 if (width) {
7305 base = width;
7306 do { *--eptr = '0' + (base % 10); } while (base /= 10);
7307 }
7308 if (fill == '0')
7309 *--eptr = fill;
84902520
TB
7310 if (left)
7311 *--eptr = '-';
46fc3d4c 7312 if (plus)
7313 *--eptr = plus;
7314 if (alt)
7315 *--eptr = '#';
7316 *--eptr = '%';
7317
ff9121f8
JH
7318 /* No taint. Otherwise we are in the strange situation
7319 * where printf() taints but print($float) doesn't.
bda0f7a5 7320 * --jhi */
dd8482fc 7321 (void)sprintf(PL_efloatbuf, eptr, nv);
8af02333 7322
80252599
GS
7323 eptr = PL_efloatbuf;
7324 elen = strlen(PL_efloatbuf);
46fc3d4c 7325 break;
7326
fc36a67e 7327 /* SPECIAL */
7328
7329 case 'n':
b22c7a20 7330 vectorize = FALSE;
fc36a67e 7331 i = SvCUR(sv) - origlen;
7332 if (args) {
c635e13b 7333 switch (intsize) {
7334 case 'h': *(va_arg(*args, short*)) = i; break;
7335 default: *(va_arg(*args, int*)) = i; break;
7336 case 'l': *(va_arg(*args, long*)) = i; break;
7337 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
7338#ifdef HAS_QUAD
7339 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
7340#endif
c635e13b 7341 }
fc36a67e 7342 }
eb3fce90
JH
7343 else if (epix ? epix <= svmax : svix < svmax)
7344 sv_setuv_mg(svargs[epix ? epix-1 : svix++], (UV)i);
fc36a67e 7345 continue; /* not "break" */
7346
7347 /* UNKNOWN */
7348
46fc3d4c 7349 default:
fc36a67e 7350 unknown:
b22c7a20 7351 vectorize = FALSE;
599cee73 7352 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 7353 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 7354 SV *msg = sv_newmortal();
cea2e8a9 7355 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %s: ",
533c011a 7356 (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
0f4b6630 7357 if (c) {
0f4b6630 7358 if (isPRINT(c))
1c846c1f 7359 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
7360 "\"%%%c\"", c & 0xFF);
7361 else
7362 Perl_sv_catpvf(aTHX_ msg,
57def98f 7363 "\"%%\\%03"UVof"\"",
0f4b6630 7364 (UV)c & 0xFF);
0f4b6630 7365 } else
c635e13b 7366 sv_catpv(msg, "end of string");
894356b3 7367 Perl_warner(aTHX_ WARN_PRINTF, "%"SVf, msg); /* yes, this is reentrant */
c635e13b 7368 }
fb73857a 7369
7370 /* output mangled stuff ... */
7371 if (c == '\0')
7372 --q;
46fc3d4c 7373 eptr = p;
7374 elen = q - p;
fb73857a 7375
7376 /* ... right here, because formatting flags should not apply */
7377 SvGROW(sv, SvCUR(sv) + elen + 1);
7378 p = SvEND(sv);
7379 memcpy(p, eptr, elen);
7380 p += elen;
7381 *p = '\0';
7382 SvCUR(sv) = p - SvPVX(sv);
7383 continue; /* not "break" */
46fc3d4c 7384 }
7385
fc36a67e 7386 have = esignlen + zeros + elen;
46fc3d4c 7387 need = (have > width ? have : width);
7388 gap = need - have;
7389
b22c7a20 7390 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 7391 p = SvEND(sv);
7392 if (esignlen && fill == '0') {
7393 for (i = 0; i < esignlen; i++)
7394 *p++ = esignbuf[i];
7395 }
7396 if (gap && !left) {
7397 memset(p, fill, gap);
7398 p += gap;
7399 }
7400 if (esignlen && fill != '0') {
7401 for (i = 0; i < esignlen; i++)
7402 *p++ = esignbuf[i];
7403 }
fc36a67e 7404 if (zeros) {
7405 for (i = zeros; i; i--)
7406 *p++ = '0';
7407 }
46fc3d4c 7408 if (elen) {
7409 memcpy(p, eptr, elen);
7410 p += elen;
7411 }
7412 if (gap && left) {
7413 memset(p, ' ', gap);
7414 p += gap;
7415 }
b22c7a20
GS
7416 if (vectorize) {
7417 if (veclen) {
7418 memcpy(p, dotstr, dotstrlen);
7419 p += dotstrlen;
7420 }
7421 else
7422 vectorize = FALSE; /* done iterating over vecstr */
7423 }
7e2040f0
GS
7424 if (is_utf)
7425 SvUTF8_on(sv);
46fc3d4c 7426 *p = '\0';
7427 SvCUR(sv) = p - SvPVX(sv);
b22c7a20
GS
7428 if (vectorize) {
7429 esignlen = 0;
7430 goto vector;
7431 }
46fc3d4c 7432 }
7433}
51371543 7434
1d7c1841
GS
7435#if defined(USE_ITHREADS)
7436
7437#if defined(USE_THREADS)
7438# include "error: USE_THREADS and USE_ITHREADS are incompatible"
7439#endif
7440
1d7c1841
GS
7441#ifndef GpREFCNT_inc
7442# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
7443#endif
7444
7445
7446#define sv_dup_inc(s) SvREFCNT_inc(sv_dup(s))
7447#define av_dup(s) (AV*)sv_dup((SV*)s)
7448#define av_dup_inc(s) (AV*)SvREFCNT_inc(sv_dup((SV*)s))
7449#define hv_dup(s) (HV*)sv_dup((SV*)s)
7450#define hv_dup_inc(s) (HV*)SvREFCNT_inc(sv_dup((SV*)s))
7451#define cv_dup(s) (CV*)sv_dup((SV*)s)
7452#define cv_dup_inc(s) (CV*)SvREFCNT_inc(sv_dup((SV*)s))
7453#define io_dup(s) (IO*)sv_dup((SV*)s)
7454#define io_dup_inc(s) (IO*)SvREFCNT_inc(sv_dup((SV*)s))
7455#define gv_dup(s) (GV*)sv_dup((SV*)s)
7456#define gv_dup_inc(s) (GV*)SvREFCNT_inc(sv_dup((SV*)s))
7457#define SAVEPV(p) (p ? savepv(p) : Nullch)
7458#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
7459
7460REGEXP *
7461Perl_re_dup(pTHX_ REGEXP *r)
7462{
7463 /* XXX fix when pmop->op_pmregexp becomes shared */
7464 return ReREFCNT_inc(r);
7465}
7466
7467PerlIO *
7468Perl_fp_dup(pTHX_ PerlIO *fp, char type)
7469{
7470 PerlIO *ret;
7471 if (!fp)
7472 return (PerlIO*)NULL;
7473
7474 /* look for it in the table first */
7475 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
7476 if (ret)
7477 return ret;
7478
7479 /* create anew and remember what it is */
5f1a76d0 7480 ret = PerlIO_fdupopen(aTHX_ fp);
1d7c1841
GS
7481 ptr_table_store(PL_ptr_table, fp, ret);
7482 return ret;
7483}
7484
7485DIR *
7486Perl_dirp_dup(pTHX_ DIR *dp)
7487{
7488 if (!dp)
7489 return (DIR*)NULL;
7490 /* XXX TODO */
7491 return dp;
7492}
7493
7494GP *
7495Perl_gp_dup(pTHX_ GP *gp)
7496{
7497 GP *ret;
7498 if (!gp)
7499 return (GP*)NULL;
7500 /* look for it in the table first */
7501 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
7502 if (ret)
7503 return ret;
7504
7505 /* create anew and remember what it is */
7506 Newz(0, ret, 1, GP);
7507 ptr_table_store(PL_ptr_table, gp, ret);
7508
7509 /* clone */
7510 ret->gp_refcnt = 0; /* must be before any other dups! */
7511 ret->gp_sv = sv_dup_inc(gp->gp_sv);
7512 ret->gp_io = io_dup_inc(gp->gp_io);
7513 ret->gp_form = cv_dup_inc(gp->gp_form);
7514 ret->gp_av = av_dup_inc(gp->gp_av);
7515 ret->gp_hv = hv_dup_inc(gp->gp_hv);
7516 ret->gp_egv = gv_dup(gp->gp_egv); /* GvEGV is not refcounted */
7517 ret->gp_cv = cv_dup_inc(gp->gp_cv);
7518 ret->gp_cvgen = gp->gp_cvgen;
7519 ret->gp_flags = gp->gp_flags;
7520 ret->gp_line = gp->gp_line;
7521 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
7522 return ret;
7523}
7524
7525MAGIC *
7526Perl_mg_dup(pTHX_ MAGIC *mg)
7527{
7528 MAGIC *mgret = (MAGIC*)NULL;
7529 MAGIC *mgprev;
7530 if (!mg)
7531 return (MAGIC*)NULL;
7532 /* look for it in the table first */
7533 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
7534 if (mgret)
7535 return mgret;
7536
7537 for (; mg; mg = mg->mg_moremagic) {
7538 MAGIC *nmg;
7539 Newz(0, nmg, 1, MAGIC);
7540 if (!mgret)
7541 mgret = nmg;
7542 else
7543 mgprev->mg_moremagic = nmg;
7544 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
7545 nmg->mg_private = mg->mg_private;
7546 nmg->mg_type = mg->mg_type;
7547 nmg->mg_flags = mg->mg_flags;
7548 if (mg->mg_type == 'r') {
7549 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj);
7550 }
7551 else {
7552 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
7553 ? sv_dup_inc(mg->mg_obj)
7554 : sv_dup(mg->mg_obj);
7555 }
7556 nmg->mg_len = mg->mg_len;
7557 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
7558 if (mg->mg_ptr && mg->mg_type != 'g') {
7559 if (mg->mg_len >= 0) {
7560 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
7561 if (mg->mg_type == 'c' && AMT_AMAGIC((AMT*)mg->mg_ptr)) {
7562 AMT *amtp = (AMT*)mg->mg_ptr;
7563 AMT *namtp = (AMT*)nmg->mg_ptr;
7564 I32 i;
7565 for (i = 1; i < NofAMmeth; i++) {
7566 namtp->table[i] = cv_dup_inc(amtp->table[i]);
7567 }
7568 }
7569 }
7570 else if (mg->mg_len == HEf_SVKEY)
7571 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr);
7572 }
7573 mgprev = nmg;
7574 }
7575 return mgret;
7576}
7577
7578PTR_TBL_t *
7579Perl_ptr_table_new(pTHX)
7580{
7581 PTR_TBL_t *tbl;
7582 Newz(0, tbl, 1, PTR_TBL_t);
7583 tbl->tbl_max = 511;
7584 tbl->tbl_items = 0;
7585 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
7586 return tbl;
7587}
7588
7589void *
7590Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
7591{
7592 PTR_TBL_ENT_t *tblent;
d2a79402 7593 UV hash = PTR2UV(sv);
1d7c1841
GS
7594 assert(tbl);
7595 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
7596 for (; tblent; tblent = tblent->next) {
7597 if (tblent->oldval == sv)
7598 return tblent->newval;
7599 }
7600 return (void*)NULL;
7601}
7602
7603void
7604Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
7605{
7606 PTR_TBL_ENT_t *tblent, **otblent;
7607 /* XXX this may be pessimal on platforms where pointers aren't good
7608 * hash values e.g. if they grow faster in the most significant
7609 * bits */
d2a79402 7610 UV hash = PTR2UV(oldv);
1d7c1841
GS
7611 bool i = 1;
7612
7613 assert(tbl);
7614 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
7615 for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
7616 if (tblent->oldval == oldv) {
7617 tblent->newval = newv;
7618 tbl->tbl_items++;
7619 return;
7620 }
7621 }
7622 Newz(0, tblent, 1, PTR_TBL_ENT_t);
7623 tblent->oldval = oldv;
7624 tblent->newval = newv;
7625 tblent->next = *otblent;
7626 *otblent = tblent;
7627 tbl->tbl_items++;
7628 if (i && tbl->tbl_items > tbl->tbl_max)
7629 ptr_table_split(tbl);
7630}
7631
7632void
7633Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
7634{
7635 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
7636 UV oldsize = tbl->tbl_max + 1;
7637 UV newsize = oldsize * 2;
7638 UV i;
7639
7640 Renew(ary, newsize, PTR_TBL_ENT_t*);
7641 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
7642 tbl->tbl_max = --newsize;
7643 tbl->tbl_ary = ary;
7644 for (i=0; i < oldsize; i++, ary++) {
7645 PTR_TBL_ENT_t **curentp, **entp, *ent;
7646 if (!*ary)
7647 continue;
7648 curentp = ary + oldsize;
7649 for (entp = ary, ent = *ary; ent; ent = *entp) {
d2a79402 7650 if ((newsize & PTR2UV(ent->oldval)) != i) {
1d7c1841
GS
7651 *entp = ent->next;
7652 ent->next = *curentp;
7653 *curentp = ent;
7654 continue;
7655 }
7656 else
7657 entp = &ent->next;
7658 }
7659 }
7660}
7661
7662#ifdef DEBUGGING
7663char *PL_watch_pvx;
7664#endif
7665
7666SV *
7667Perl_sv_dup(pTHX_ SV *sstr)
7668{
1d7c1841
GS
7669 SV *dstr;
7670
7671 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
7672 return Nullsv;
7673 /* look for it in the table first */
7674 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
7675 if (dstr)
7676 return dstr;
7677
7678 /* create anew and remember what it is */
7679 new_SV(dstr);
7680 ptr_table_store(PL_ptr_table, sstr, dstr);
7681
7682 /* clone */
7683 SvFLAGS(dstr) = SvFLAGS(sstr);
7684 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
7685 SvREFCNT(dstr) = 0; /* must be before any other dups! */
7686
7687#ifdef DEBUGGING
7688 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
7689 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
7690 PL_watch_pvx, SvPVX(sstr));
7691#endif
7692
7693 switch (SvTYPE(sstr)) {
7694 case SVt_NULL:
7695 SvANY(dstr) = NULL;
7696 break;
7697 case SVt_IV:
7698 SvANY(dstr) = new_XIV();
7699 SvIVX(dstr) = SvIVX(sstr);
7700 break;
7701 case SVt_NV:
7702 SvANY(dstr) = new_XNV();
7703 SvNVX(dstr) = SvNVX(sstr);
7704 break;
7705 case SVt_RV:
7706 SvANY(dstr) = new_XRV();
7707 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7708 break;
7709 case SVt_PV:
7710 SvANY(dstr) = new_XPV();
7711 SvCUR(dstr) = SvCUR(sstr);
7712 SvLEN(dstr) = SvLEN(sstr);
7713 if (SvROK(sstr))
7714 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7715 else if (SvPVX(sstr) && SvLEN(sstr))
7716 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7717 else
7718 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7719 break;
7720 case SVt_PVIV:
7721 SvANY(dstr) = new_XPVIV();
7722 SvCUR(dstr) = SvCUR(sstr);
7723 SvLEN(dstr) = SvLEN(sstr);
7724 SvIVX(dstr) = SvIVX(sstr);
7725 if (SvROK(sstr))
7726 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7727 else if (SvPVX(sstr) && SvLEN(sstr))
7728 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7729 else
7730 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7731 break;
7732 case SVt_PVNV:
7733 SvANY(dstr) = new_XPVNV();
7734 SvCUR(dstr) = SvCUR(sstr);
7735 SvLEN(dstr) = SvLEN(sstr);
7736 SvIVX(dstr) = SvIVX(sstr);
7737 SvNVX(dstr) = SvNVX(sstr);
7738 if (SvROK(sstr))
7739 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7740 else if (SvPVX(sstr) && SvLEN(sstr))
7741 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7742 else
7743 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7744 break;
7745 case SVt_PVMG:
7746 SvANY(dstr) = new_XPVMG();
7747 SvCUR(dstr) = SvCUR(sstr);
7748 SvLEN(dstr) = SvLEN(sstr);
7749 SvIVX(dstr) = SvIVX(sstr);
7750 SvNVX(dstr) = SvNVX(sstr);
7751 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7752 SvSTASH(dstr) = hv_dup_inc(SvSTASH(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_PVBM:
7761 SvANY(dstr) = new_XPVBM();
7762 SvCUR(dstr) = SvCUR(sstr);
7763 SvLEN(dstr) = SvLEN(sstr);
7764 SvIVX(dstr) = SvIVX(sstr);
7765 SvNVX(dstr) = SvNVX(sstr);
7766 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7767 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
7768 if (SvROK(sstr))
7769 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7770 else if (SvPVX(sstr) && SvLEN(sstr))
7771 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7772 else
7773 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7774 BmRARE(dstr) = BmRARE(sstr);
7775 BmUSEFUL(dstr) = BmUSEFUL(sstr);
7776 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
7777 break;
7778 case SVt_PVLV:
7779 SvANY(dstr) = new_XPVLV();
7780 SvCUR(dstr) = SvCUR(sstr);
7781 SvLEN(dstr) = SvLEN(sstr);
7782 SvIVX(dstr) = SvIVX(sstr);
7783 SvNVX(dstr) = SvNVX(sstr);
7784 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7785 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
7786 if (SvROK(sstr))
7787 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7788 else if (SvPVX(sstr) && SvLEN(sstr))
7789 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7790 else
7791 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7792 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
7793 LvTARGLEN(dstr) = LvTARGLEN(sstr);
7794 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr));
7795 LvTYPE(dstr) = LvTYPE(sstr);
7796 break;
7797 case SVt_PVGV:
7798 SvANY(dstr) = new_XPVGV();
7799 SvCUR(dstr) = SvCUR(sstr);
7800 SvLEN(dstr) = SvLEN(sstr);
7801 SvIVX(dstr) = SvIVX(sstr);
7802 SvNVX(dstr) = SvNVX(sstr);
7803 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7804 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
7805 if (SvROK(sstr))
7806 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7807 else if (SvPVX(sstr) && SvLEN(sstr))
7808 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7809 else
7810 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7811 GvNAMELEN(dstr) = GvNAMELEN(sstr);
7812 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
7813 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr));
7814 GvFLAGS(dstr) = GvFLAGS(sstr);
7815 GvGP(dstr) = gp_dup(GvGP(sstr));
7816 (void)GpREFCNT_inc(GvGP(dstr));
7817 break;
7818 case SVt_PVIO:
7819 SvANY(dstr) = new_XPVIO();
7820 SvCUR(dstr) = SvCUR(sstr);
7821 SvLEN(dstr) = SvLEN(sstr);
7822 SvIVX(dstr) = SvIVX(sstr);
7823 SvNVX(dstr) = SvNVX(sstr);
7824 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7825 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
7826 if (SvROK(sstr))
7827 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
7828 else if (SvPVX(sstr) && SvLEN(sstr))
7829 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7830 else
7831 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7832 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr));
7833 if (IoOFP(sstr) == IoIFP(sstr))
7834 IoOFP(dstr) = IoIFP(dstr);
7835 else
7836 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr));
7837 /* PL_rsfp_filters entries have fake IoDIRP() */
7838 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
7839 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
7840 else
7841 IoDIRP(dstr) = IoDIRP(sstr);
7842 IoLINES(dstr) = IoLINES(sstr);
7843 IoPAGE(dstr) = IoPAGE(sstr);
7844 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
7845 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
7846 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
7847 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr));
7848 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
7849 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr));
7850 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
7851 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr));
7852 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
7853 IoTYPE(dstr) = IoTYPE(sstr);
7854 IoFLAGS(dstr) = IoFLAGS(sstr);
7855 break;
7856 case SVt_PVAV:
7857 SvANY(dstr) = new_XPVAV();
7858 SvCUR(dstr) = SvCUR(sstr);
7859 SvLEN(dstr) = SvLEN(sstr);
7860 SvIVX(dstr) = SvIVX(sstr);
7861 SvNVX(dstr) = SvNVX(sstr);
7862 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7863 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
7864 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr));
7865 AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
7866 if (AvARRAY((AV*)sstr)) {
7867 SV **dst_ary, **src_ary;
7868 SSize_t items = AvFILLp((AV*)sstr) + 1;
7869
7870 src_ary = AvARRAY((AV*)sstr);
7871 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
7872 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
7873 SvPVX(dstr) = (char*)dst_ary;
7874 AvALLOC((AV*)dstr) = dst_ary;
7875 if (AvREAL((AV*)sstr)) {
7876 while (items-- > 0)
7877 *dst_ary++ = sv_dup_inc(*src_ary++);
7878 }
7879 else {
7880 while (items-- > 0)
7881 *dst_ary++ = sv_dup(*src_ary++);
7882 }
7883 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
7884 while (items-- > 0) {
7885 *dst_ary++ = &PL_sv_undef;
7886 }
7887 }
7888 else {
7889 SvPVX(dstr) = Nullch;
7890 AvALLOC((AV*)dstr) = (SV**)NULL;
7891 }
7892 break;
7893 case SVt_PVHV:
7894 SvANY(dstr) = new_XPVHV();
7895 SvCUR(dstr) = SvCUR(sstr);
7896 SvLEN(dstr) = SvLEN(sstr);
7897 SvIVX(dstr) = SvIVX(sstr);
7898 SvNVX(dstr) = SvNVX(sstr);
7899 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7900 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
7901 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
7902 if (HvARRAY((HV*)sstr)) {
1d7c1841
GS
7903 STRLEN i = 0;
7904 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
7905 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
7906 Newz(0, dxhv->xhv_array,
7907 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
7908 while (i <= sxhv->xhv_max) {
7909 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
7910 !!HvSHAREKEYS(sstr));
7911 ++i;
7912 }
7913 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter, !!HvSHAREKEYS(sstr));
7914 }
7915 else {
7916 SvPVX(dstr) = Nullch;
7917 HvEITER((HV*)dstr) = (HE*)NULL;
7918 }
7919 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
7920 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
7921 break;
7922 case SVt_PVFM:
7923 SvANY(dstr) = new_XPVFM();
7924 FmLINES(dstr) = FmLINES(sstr);
7925 goto dup_pvcv;
7926 /* NOTREACHED */
7927 case SVt_PVCV:
7928 SvANY(dstr) = new_XPVCV();
7929dup_pvcv:
7930 SvCUR(dstr) = SvCUR(sstr);
7931 SvLEN(dstr) = SvLEN(sstr);
7932 SvIVX(dstr) = SvIVX(sstr);
7933 SvNVX(dstr) = SvNVX(sstr);
7934 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
7935 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
7936 if (SvPVX(sstr) && SvLEN(sstr))
7937 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7938 else
7939 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
7940 CvSTASH(dstr) = hv_dup(CvSTASH(sstr));/* NOTE: not refcounted */
7941 CvSTART(dstr) = CvSTART(sstr);
7942 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
7943 CvXSUB(dstr) = CvXSUB(sstr);
7944 CvXSUBANY(dstr) = CvXSUBANY(sstr);
7945 CvGV(dstr) = gv_dup_inc(CvGV(sstr));
7946 CvDEPTH(dstr) = CvDEPTH(sstr);
7947 if (CvPADLIST(sstr) && !AvREAL(CvPADLIST(sstr))) {
7948 /* XXX padlists are real, but pretend to be not */
7949 AvREAL_on(CvPADLIST(sstr));
7950 CvPADLIST(dstr) = av_dup_inc(CvPADLIST(sstr));
7951 AvREAL_off(CvPADLIST(sstr));
7952 AvREAL_off(CvPADLIST(dstr));
7953 }
7954 else
7955 CvPADLIST(dstr) = av_dup_inc(CvPADLIST(sstr));
7956 CvOUTSIDE(dstr) = cv_dup_inc(CvOUTSIDE(sstr));
7957 CvFLAGS(dstr) = CvFLAGS(sstr);
7958 break;
7959 default:
7960 Perl_croak(aTHX_ "Bizarre SvTYPE [%d]", SvTYPE(sstr));
7961 break;
7962 }
7963
7964 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
7965 ++PL_sv_objcount;
7966
7967 return dstr;
7968}
7969
7970PERL_CONTEXT *
7971Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max)
7972{
7973 PERL_CONTEXT *ncxs;
7974
7975 if (!cxs)
7976 return (PERL_CONTEXT*)NULL;
7977
7978 /* look for it in the table first */
7979 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
7980 if (ncxs)
7981 return ncxs;
7982
7983 /* create anew and remember what it is */
7984 Newz(56, ncxs, max + 1, PERL_CONTEXT);
7985 ptr_table_store(PL_ptr_table, cxs, ncxs);
7986
7987 while (ix >= 0) {
7988 PERL_CONTEXT *cx = &cxs[ix];
7989 PERL_CONTEXT *ncx = &ncxs[ix];
7990 ncx->cx_type = cx->cx_type;
7991 if (CxTYPE(cx) == CXt_SUBST) {
7992 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
7993 }
7994 else {
7995 ncx->blk_oldsp = cx->blk_oldsp;
7996 ncx->blk_oldcop = cx->blk_oldcop;
7997 ncx->blk_oldretsp = cx->blk_oldretsp;
7998 ncx->blk_oldmarksp = cx->blk_oldmarksp;
7999 ncx->blk_oldscopesp = cx->blk_oldscopesp;
8000 ncx->blk_oldpm = cx->blk_oldpm;
8001 ncx->blk_gimme = cx->blk_gimme;
8002 switch (CxTYPE(cx)) {
8003 case CXt_SUB:
8004 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
8005 ? cv_dup_inc(cx->blk_sub.cv)
8006 : cv_dup(cx->blk_sub.cv));
8007 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
8008 ? av_dup_inc(cx->blk_sub.argarray)
8009 : Nullav);
8010 ncx->blk_sub.savearray = av_dup(cx->blk_sub.savearray);
8011 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
8012 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
8013 ncx->blk_sub.lval = cx->blk_sub.lval;
8014 break;
8015 case CXt_EVAL:
8016 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
8017 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
0f79a09d 8018 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv);
1d7c1841
GS
8019 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
8020 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text);
8021 break;
8022 case CXt_LOOP:
8023 ncx->blk_loop.label = cx->blk_loop.label;
8024 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
8025 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
8026 ncx->blk_loop.next_op = cx->blk_loop.next_op;
8027 ncx->blk_loop.last_op = cx->blk_loop.last_op;
8028 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
8029 ? cx->blk_loop.iterdata
8030 : gv_dup((GV*)cx->blk_loop.iterdata));
a4b82a6f
GS
8031 ncx->blk_loop.oldcurpad
8032 = (SV**)ptr_table_fetch(PL_ptr_table,
8033 cx->blk_loop.oldcurpad);
1d7c1841
GS
8034 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave);
8035 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval);
8036 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary);
8037 ncx->blk_loop.iterix = cx->blk_loop.iterix;
8038 ncx->blk_loop.itermax = cx->blk_loop.itermax;
8039 break;
8040 case CXt_FORMAT:
8041 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv);
8042 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv);
8043 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv);
8044 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
8045 break;
8046 case CXt_BLOCK:
8047 case CXt_NULL:
8048 break;
8049 }
8050 }
8051 --ix;
8052 }
8053 return ncxs;
8054}
8055
8056PERL_SI *
8057Perl_si_dup(pTHX_ PERL_SI *si)
8058{
8059 PERL_SI *nsi;
8060
8061 if (!si)
8062 return (PERL_SI*)NULL;
8063
8064 /* look for it in the table first */
8065 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
8066 if (nsi)
8067 return nsi;
8068
8069 /* create anew and remember what it is */
8070 Newz(56, nsi, 1, PERL_SI);
8071 ptr_table_store(PL_ptr_table, si, nsi);
8072
8073 nsi->si_stack = av_dup_inc(si->si_stack);
8074 nsi->si_cxix = si->si_cxix;
8075 nsi->si_cxmax = si->si_cxmax;
8076 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax);
8077 nsi->si_type = si->si_type;
8078 nsi->si_prev = si_dup(si->si_prev);
8079 nsi->si_next = si_dup(si->si_next);
8080 nsi->si_markoff = si->si_markoff;
8081
8082 return nsi;
8083}
8084
8085#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
8086#define TOPINT(ss,ix) ((ss)[ix].any_i32)
8087#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
8088#define TOPLONG(ss,ix) ((ss)[ix].any_long)
8089#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
8090#define TOPIV(ss,ix) ((ss)[ix].any_iv)
8091#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
8092#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
8093#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
8094#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
8095#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
8096#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
8097
8098/* XXXXX todo */
8099#define pv_dup_inc(p) SAVEPV(p)
8100#define pv_dup(p) SAVEPV(p)
8101#define svp_dup_inc(p,pp) any_dup(p,pp)
8102
8103void *
8104Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
8105{
8106 void *ret;
8107
8108 if (!v)
8109 return (void*)NULL;
8110
8111 /* look for it in the table first */
8112 ret = ptr_table_fetch(PL_ptr_table, v);
8113 if (ret)
8114 return ret;
8115
8116 /* see if it is part of the interpreter structure */
8117 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
8118 ret = (void*)(((char*)aTHXo) + (((char*)v) - (char*)proto_perl));
8119 else
8120 ret = v;
8121
8122 return ret;
8123}
8124
8125ANY *
8126Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl)
8127{
8128 ANY *ss = proto_perl->Tsavestack;
8129 I32 ix = proto_perl->Tsavestack_ix;
8130 I32 max = proto_perl->Tsavestack_max;
8131 ANY *nss;
8132 SV *sv;
8133 GV *gv;
8134 AV *av;
8135 HV *hv;
8136 void* ptr;
8137 int intval;
8138 long longval;
8139 GP *gp;
8140 IV iv;
8141 I32 i;
8142 char *c;
8143 void (*dptr) (void*);
8144 void (*dxptr) (pTHXo_ void*);
e977893f 8145 OP *o;
1d7c1841
GS
8146
8147 Newz(54, nss, max, ANY);
8148
8149 while (ix > 0) {
8150 i = POPINT(ss,ix);
8151 TOPINT(nss,ix) = i;
8152 switch (i) {
8153 case SAVEt_ITEM: /* normal string */
8154 sv = (SV*)POPPTR(ss,ix);
8155 TOPPTR(nss,ix) = sv_dup_inc(sv);
8156 sv = (SV*)POPPTR(ss,ix);
8157 TOPPTR(nss,ix) = sv_dup_inc(sv);
8158 break;
8159 case SAVEt_SV: /* scalar reference */
8160 sv = (SV*)POPPTR(ss,ix);
8161 TOPPTR(nss,ix) = sv_dup_inc(sv);
8162 gv = (GV*)POPPTR(ss,ix);
8163 TOPPTR(nss,ix) = gv_dup_inc(gv);
8164 break;
f4dd75d9
GS
8165 case SAVEt_GENERIC_PVREF: /* generic char* */
8166 c = (char*)POPPTR(ss,ix);
8167 TOPPTR(nss,ix) = pv_dup(c);
8168 ptr = POPPTR(ss,ix);
8169 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8170 break;
1d7c1841
GS
8171 case SAVEt_GENERIC_SVREF: /* generic sv */
8172 case SAVEt_SVREF: /* scalar reference */
8173 sv = (SV*)POPPTR(ss,ix);
8174 TOPPTR(nss,ix) = sv_dup_inc(sv);
8175 ptr = POPPTR(ss,ix);
8176 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
8177 break;
8178 case SAVEt_AV: /* array reference */
8179 av = (AV*)POPPTR(ss,ix);
8180 TOPPTR(nss,ix) = av_dup_inc(av);
8181 gv = (GV*)POPPTR(ss,ix);
8182 TOPPTR(nss,ix) = gv_dup(gv);
8183 break;
8184 case SAVEt_HV: /* hash reference */
8185 hv = (HV*)POPPTR(ss,ix);
8186 TOPPTR(nss,ix) = hv_dup_inc(hv);
8187 gv = (GV*)POPPTR(ss,ix);
8188 TOPPTR(nss,ix) = gv_dup(gv);
8189 break;
8190 case SAVEt_INT: /* int reference */
8191 ptr = POPPTR(ss,ix);
8192 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8193 intval = (int)POPINT(ss,ix);
8194 TOPINT(nss,ix) = intval;
8195 break;
8196 case SAVEt_LONG: /* long reference */
8197 ptr = POPPTR(ss,ix);
8198 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8199 longval = (long)POPLONG(ss,ix);
8200 TOPLONG(nss,ix) = longval;
8201 break;
8202 case SAVEt_I32: /* I32 reference */
8203 case SAVEt_I16: /* I16 reference */
8204 case SAVEt_I8: /* I8 reference */
8205 ptr = POPPTR(ss,ix);
8206 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8207 i = POPINT(ss,ix);
8208 TOPINT(nss,ix) = i;
8209 break;
8210 case SAVEt_IV: /* IV reference */
8211 ptr = POPPTR(ss,ix);
8212 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8213 iv = POPIV(ss,ix);
8214 TOPIV(nss,ix) = iv;
8215 break;
8216 case SAVEt_SPTR: /* SV* reference */
8217 ptr = POPPTR(ss,ix);
8218 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8219 sv = (SV*)POPPTR(ss,ix);
8220 TOPPTR(nss,ix) = sv_dup(sv);
8221 break;
8222 case SAVEt_VPTR: /* random* reference */
8223 ptr = POPPTR(ss,ix);
8224 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8225 ptr = POPPTR(ss,ix);
8226 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8227 break;
8228 case SAVEt_PPTR: /* char* reference */
8229 ptr = POPPTR(ss,ix);
8230 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8231 c = (char*)POPPTR(ss,ix);
8232 TOPPTR(nss,ix) = pv_dup(c);
8233 break;
8234 case SAVEt_HPTR: /* HV* reference */
8235 ptr = POPPTR(ss,ix);
8236 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8237 hv = (HV*)POPPTR(ss,ix);
8238 TOPPTR(nss,ix) = hv_dup(hv);
8239 break;
8240 case SAVEt_APTR: /* AV* reference */
8241 ptr = POPPTR(ss,ix);
8242 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8243 av = (AV*)POPPTR(ss,ix);
8244 TOPPTR(nss,ix) = av_dup(av);
8245 break;
8246 case SAVEt_NSTAB:
8247 gv = (GV*)POPPTR(ss,ix);
8248 TOPPTR(nss,ix) = gv_dup(gv);
8249 break;
8250 case SAVEt_GP: /* scalar reference */
8251 gp = (GP*)POPPTR(ss,ix);
8252 TOPPTR(nss,ix) = gp = gp_dup(gp);
8253 (void)GpREFCNT_inc(gp);
8254 gv = (GV*)POPPTR(ss,ix);
8255 TOPPTR(nss,ix) = gv_dup_inc(c);
8256 c = (char*)POPPTR(ss,ix);
8257 TOPPTR(nss,ix) = pv_dup(c);
8258 iv = POPIV(ss,ix);
8259 TOPIV(nss,ix) = iv;
8260 iv = POPIV(ss,ix);
8261 TOPIV(nss,ix) = iv;
8262 break;
8263 case SAVEt_FREESV:
8264 sv = (SV*)POPPTR(ss,ix);
8265 TOPPTR(nss,ix) = sv_dup_inc(sv);
8266 break;
8267 case SAVEt_FREEOP:
8268 ptr = POPPTR(ss,ix);
8269 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
8270 /* these are assumed to be refcounted properly */
8271 switch (((OP*)ptr)->op_type) {
8272 case OP_LEAVESUB:
8273 case OP_LEAVESUBLV:
8274 case OP_LEAVEEVAL:
8275 case OP_LEAVE:
8276 case OP_SCOPE:
8277 case OP_LEAVEWRITE:
e977893f
GS
8278 TOPPTR(nss,ix) = ptr;
8279 o = (OP*)ptr;
8280 OpREFCNT_inc(o);
1d7c1841
GS
8281 break;
8282 default:
8283 TOPPTR(nss,ix) = Nullop;
8284 break;
8285 }
8286 }
8287 else
8288 TOPPTR(nss,ix) = Nullop;
8289 break;
8290 case SAVEt_FREEPV:
8291 c = (char*)POPPTR(ss,ix);
8292 TOPPTR(nss,ix) = pv_dup_inc(c);
8293 break;
8294 case SAVEt_CLEARSV:
8295 longval = POPLONG(ss,ix);
8296 TOPLONG(nss,ix) = longval;
8297 break;
8298 case SAVEt_DELETE:
8299 hv = (HV*)POPPTR(ss,ix);
8300 TOPPTR(nss,ix) = hv_dup_inc(hv);
8301 c = (char*)POPPTR(ss,ix);
8302 TOPPTR(nss,ix) = pv_dup_inc(c);
8303 i = POPINT(ss,ix);
8304 TOPINT(nss,ix) = i;
8305 break;
8306 case SAVEt_DESTRUCTOR:
8307 ptr = POPPTR(ss,ix);
8308 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
8309 dptr = POPDPTR(ss,ix);
ef75a179 8310 TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
1d7c1841
GS
8311 break;
8312 case SAVEt_DESTRUCTOR_X:
8313 ptr = POPPTR(ss,ix);
8314 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
8315 dxptr = POPDXPTR(ss,ix);
ef75a179 8316 TOPDXPTR(nss,ix) = (void (*)(pTHXo_ void*))any_dup((void *)dxptr, proto_perl);
1d7c1841
GS
8317 break;
8318 case SAVEt_REGCONTEXT:
8319 case SAVEt_ALLOC:
8320 i = POPINT(ss,ix);
8321 TOPINT(nss,ix) = i;
8322 ix -= i;
8323 break;
8324 case SAVEt_STACK_POS: /* Position on Perl stack */
8325 i = POPINT(ss,ix);
8326 TOPINT(nss,ix) = i;
8327 break;
8328 case SAVEt_AELEM: /* array element */
8329 sv = (SV*)POPPTR(ss,ix);
8330 TOPPTR(nss,ix) = sv_dup_inc(sv);
8331 i = POPINT(ss,ix);
8332 TOPINT(nss,ix) = i;
8333 av = (AV*)POPPTR(ss,ix);
8334 TOPPTR(nss,ix) = av_dup_inc(av);
8335 break;
8336 case SAVEt_HELEM: /* hash element */
8337 sv = (SV*)POPPTR(ss,ix);
8338 TOPPTR(nss,ix) = sv_dup_inc(sv);
8339 sv = (SV*)POPPTR(ss,ix);
8340 TOPPTR(nss,ix) = sv_dup_inc(sv);
8341 hv = (HV*)POPPTR(ss,ix);
8342 TOPPTR(nss,ix) = hv_dup_inc(hv);
8343 break;
8344 case SAVEt_OP:
8345 ptr = POPPTR(ss,ix);
8346 TOPPTR(nss,ix) = ptr;
8347 break;
8348 case SAVEt_HINTS:
8349 i = POPINT(ss,ix);
8350 TOPINT(nss,ix) = i;
8351 break;
c4410b1b
GS
8352 case SAVEt_COMPPAD:
8353 av = (AV*)POPPTR(ss,ix);
8354 TOPPTR(nss,ix) = av_dup(av);
8355 break;
c3564e5c
GS
8356 case SAVEt_PADSV:
8357 longval = (long)POPLONG(ss,ix);
8358 TOPLONG(nss,ix) = longval;
8359 ptr = POPPTR(ss,ix);
8360 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
8361 sv = (SV*)POPPTR(ss,ix);
8362 TOPPTR(nss,ix) = sv_dup(sv);
8363 break;
1d7c1841
GS
8364 default:
8365 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
8366 }
8367 }
8368
8369 return nss;
8370}
8371
8372#ifdef PERL_OBJECT
8373#include "XSUB.h"
8374#endif
8375
8376PerlInterpreter *
8377perl_clone(PerlInterpreter *proto_perl, UV flags)
8378{
8379#ifdef PERL_OBJECT
8380 CPerlObj *pPerl = (CPerlObj*)proto_perl;
8381#endif
8382
8383#ifdef PERL_IMPLICIT_SYS
8384 return perl_clone_using(proto_perl, flags,
8385 proto_perl->IMem,
8386 proto_perl->IMemShared,
8387 proto_perl->IMemParse,
8388 proto_perl->IEnv,
8389 proto_perl->IStdIO,
8390 proto_perl->ILIO,
8391 proto_perl->IDir,
8392 proto_perl->ISock,
8393 proto_perl->IProc);
8394}
8395
8396PerlInterpreter *
8397perl_clone_using(PerlInterpreter *proto_perl, UV flags,
8398 struct IPerlMem* ipM, struct IPerlMem* ipMS,
8399 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
8400 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
8401 struct IPerlDir* ipD, struct IPerlSock* ipS,
8402 struct IPerlProc* ipP)
8403{
8404 /* XXX many of the string copies here can be optimized if they're
8405 * constants; they need to be allocated as common memory and just
8406 * their pointers copied. */
8407
8408 IV i;
1d7c1841
GS
8409# ifdef PERL_OBJECT
8410 CPerlObj *pPerl = new(ipM) CPerlObj(ipM, ipMS, ipMP, ipE, ipStd, ipLIO,
8411 ipD, ipS, ipP);
ba869deb 8412 PERL_SET_THX(pPerl);
1d7c1841
GS
8413# else /* !PERL_OBJECT */
8414 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
ba869deb 8415 PERL_SET_THX(my_perl);
1d7c1841
GS
8416
8417# ifdef DEBUGGING
8418 memset(my_perl, 0xab, sizeof(PerlInterpreter));
8419 PL_markstack = 0;
8420 PL_scopestack = 0;
8421 PL_savestack = 0;
8422 PL_retstack = 0;
8423# else /* !DEBUGGING */
8424 Zero(my_perl, 1, PerlInterpreter);
8425# endif /* DEBUGGING */
8426
8427 /* host pointers */
8428 PL_Mem = ipM;
8429 PL_MemShared = ipMS;
8430 PL_MemParse = ipMP;
8431 PL_Env = ipE;
8432 PL_StdIO = ipStd;
8433 PL_LIO = ipLIO;
8434 PL_Dir = ipD;
8435 PL_Sock = ipS;
8436 PL_Proc = ipP;
8437# endif /* PERL_OBJECT */
8438#else /* !PERL_IMPLICIT_SYS */
8439 IV i;
1d7c1841 8440 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
ba869deb 8441 PERL_SET_THX(my_perl);
1d7c1841
GS
8442
8443# ifdef DEBUGGING
8444 memset(my_perl, 0xab, sizeof(PerlInterpreter));
8445 PL_markstack = 0;
8446 PL_scopestack = 0;
8447 PL_savestack = 0;
8448 PL_retstack = 0;
8449# else /* !DEBUGGING */
8450 Zero(my_perl, 1, PerlInterpreter);
8451# endif /* DEBUGGING */
8452#endif /* PERL_IMPLICIT_SYS */
8453
8454 /* arena roots */
8455 PL_xiv_arenaroot = NULL;
8456 PL_xiv_root = NULL;
612f20c3 8457 PL_xnv_arenaroot = NULL;
1d7c1841 8458 PL_xnv_root = NULL;
612f20c3 8459 PL_xrv_arenaroot = NULL;
1d7c1841 8460 PL_xrv_root = NULL;
612f20c3 8461 PL_xpv_arenaroot = NULL;
1d7c1841 8462 PL_xpv_root = NULL;
612f20c3 8463 PL_xpviv_arenaroot = NULL;
1d7c1841 8464 PL_xpviv_root = NULL;
612f20c3 8465 PL_xpvnv_arenaroot = NULL;
1d7c1841 8466 PL_xpvnv_root = NULL;
612f20c3 8467 PL_xpvcv_arenaroot = NULL;
1d7c1841 8468 PL_xpvcv_root = NULL;
612f20c3 8469 PL_xpvav_arenaroot = NULL;
1d7c1841 8470 PL_xpvav_root = NULL;
612f20c3 8471 PL_xpvhv_arenaroot = NULL;
1d7c1841 8472 PL_xpvhv_root = NULL;
612f20c3 8473 PL_xpvmg_arenaroot = NULL;
1d7c1841 8474 PL_xpvmg_root = NULL;
612f20c3 8475 PL_xpvlv_arenaroot = NULL;
1d7c1841 8476 PL_xpvlv_root = NULL;
612f20c3 8477 PL_xpvbm_arenaroot = NULL;
1d7c1841 8478 PL_xpvbm_root = NULL;
612f20c3 8479 PL_he_arenaroot = NULL;
1d7c1841
GS
8480 PL_he_root = NULL;
8481 PL_nice_chunk = NULL;
8482 PL_nice_chunk_size = 0;
8483 PL_sv_count = 0;
8484 PL_sv_objcount = 0;
8485 PL_sv_root = Nullsv;
8486 PL_sv_arenaroot = Nullsv;
8487
8488 PL_debug = proto_perl->Idebug;
8489
8490 /* create SV map for pointer relocation */
8491 PL_ptr_table = ptr_table_new();
8492
8493 /* initialize these special pointers as early as possible */
8494 SvANY(&PL_sv_undef) = NULL;
8495 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
8496 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
8497 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
8498
8499#ifdef PERL_OBJECT
8500 SvUPGRADE(&PL_sv_no, SVt_PVNV);
8501#else
8502 SvANY(&PL_sv_no) = new_XPVNV();
8503#endif
8504 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
8505 SvFLAGS(&PL_sv_no) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
8506 SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
8507 SvCUR(&PL_sv_no) = 0;
8508 SvLEN(&PL_sv_no) = 1;
8509 SvNVX(&PL_sv_no) = 0;
8510 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
8511
8512#ifdef PERL_OBJECT
8513 SvUPGRADE(&PL_sv_yes, SVt_PVNV);
8514#else
8515 SvANY(&PL_sv_yes) = new_XPVNV();
8516#endif
8517 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
8518 SvFLAGS(&PL_sv_yes) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
8519 SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
8520 SvCUR(&PL_sv_yes) = 1;
8521 SvLEN(&PL_sv_yes) = 2;
8522 SvNVX(&PL_sv_yes) = 1;
8523 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
8524
8525 /* create shared string table */
8526 PL_strtab = newHV();
8527 HvSHAREKEYS_off(PL_strtab);
8528 hv_ksplit(PL_strtab, 512);
8529 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
8530
8531 PL_compiling = proto_perl->Icompiling;
8532 PL_compiling.cop_stashpv = SAVEPV(PL_compiling.cop_stashpv);
8533 PL_compiling.cop_file = SAVEPV(PL_compiling.cop_file);
8534 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
8535 if (!specialWARN(PL_compiling.cop_warnings))
8536 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings);
ac27b0f5
NIS
8537 if (!specialCopIO(PL_compiling.cop_io))
8538 PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io);
1d7c1841
GS
8539 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
8540
8541 /* pseudo environmental stuff */
8542 PL_origargc = proto_perl->Iorigargc;
8543 i = PL_origargc;
8544 New(0, PL_origargv, i+1, char*);
8545 PL_origargv[i] = '\0';
8546 while (i-- > 0) {
8547 PL_origargv[i] = SAVEPV(proto_perl->Iorigargv[i]);
8548 }
8549 PL_envgv = gv_dup(proto_perl->Ienvgv);
8550 PL_incgv = gv_dup(proto_perl->Iincgv);
8551 PL_hintgv = gv_dup(proto_perl->Ihintgv);
8552 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
8553 PL_diehook = sv_dup_inc(proto_perl->Idiehook);
8554 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook);
8555
8556 /* switches */
8557 PL_minus_c = proto_perl->Iminus_c;
a7cb1f99 8558 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel);
1d7c1841
GS
8559 PL_localpatches = proto_perl->Ilocalpatches;
8560 PL_splitstr = proto_perl->Isplitstr;
8561 PL_preprocess = proto_perl->Ipreprocess;
8562 PL_minus_n = proto_perl->Iminus_n;
8563 PL_minus_p = proto_perl->Iminus_p;
8564 PL_minus_l = proto_perl->Iminus_l;
8565 PL_minus_a = proto_perl->Iminus_a;
8566 PL_minus_F = proto_perl->Iminus_F;
8567 PL_doswitches = proto_perl->Idoswitches;
8568 PL_dowarn = proto_perl->Idowarn;
8569 PL_doextract = proto_perl->Idoextract;
8570 PL_sawampersand = proto_perl->Isawampersand;
8571 PL_unsafe = proto_perl->Iunsafe;
8572 PL_inplace = SAVEPV(proto_perl->Iinplace);
8573 PL_e_script = sv_dup_inc(proto_perl->Ie_script);
8574 PL_perldb = proto_perl->Iperldb;
8575 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
8576
8577 /* magical thingies */
8578 /* XXX time(&PL_basetime) when asked for? */
8579 PL_basetime = proto_perl->Ibasetime;
8580 PL_formfeed = sv_dup(proto_perl->Iformfeed);
8581
8582 PL_maxsysfd = proto_perl->Imaxsysfd;
8583 PL_multiline = proto_perl->Imultiline;
8584 PL_statusvalue = proto_perl->Istatusvalue;
8585#ifdef VMS
8586 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
8587#endif
8588
8589 /* shortcuts to various I/O objects */
8590 PL_stdingv = gv_dup(proto_perl->Istdingv);
8591 PL_stderrgv = gv_dup(proto_perl->Istderrgv);
8592 PL_defgv = gv_dup(proto_perl->Idefgv);
8593 PL_argvgv = gv_dup(proto_perl->Iargvgv);
8594 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv);
8595 PL_argvout_stack = av_dup(proto_perl->Iargvout_stack);
8596
8597 /* shortcuts to regexp stuff */
8598 PL_replgv = gv_dup(proto_perl->Ireplgv);
8599
8600 /* shortcuts to misc objects */
8601 PL_errgv = gv_dup(proto_perl->Ierrgv);
8602
8603 /* shortcuts to debugging objects */
8604 PL_DBgv = gv_dup(proto_perl->IDBgv);
8605 PL_DBline = gv_dup(proto_perl->IDBline);
8606 PL_DBsub = gv_dup(proto_perl->IDBsub);
8607 PL_DBsingle = sv_dup(proto_perl->IDBsingle);
8608 PL_DBtrace = sv_dup(proto_perl->IDBtrace);
8609 PL_DBsignal = sv_dup(proto_perl->IDBsignal);
8610 PL_lineary = av_dup(proto_perl->Ilineary);
8611 PL_dbargs = av_dup(proto_perl->Idbargs);
8612
8613 /* symbol tables */
8614 PL_defstash = hv_dup_inc(proto_perl->Tdefstash);
8615 PL_curstash = hv_dup(proto_perl->Tcurstash);
8616 PL_debstash = hv_dup(proto_perl->Idebstash);
8617 PL_globalstash = hv_dup(proto_perl->Iglobalstash);
8618 PL_curstname = sv_dup_inc(proto_perl->Icurstname);
8619
8620 PL_beginav = av_dup_inc(proto_perl->Ibeginav);
8621 PL_endav = av_dup_inc(proto_perl->Iendav);
7d30b5c4 8622 PL_checkav = av_dup_inc(proto_perl->Icheckav);
1d7c1841
GS
8623 PL_initav = av_dup_inc(proto_perl->Iinitav);
8624
8625 PL_sub_generation = proto_perl->Isub_generation;
8626
8627 /* funky return mechanisms */
8628 PL_forkprocess = proto_perl->Iforkprocess;
8629
8630 /* subprocess state */
8631 PL_fdpid = av_dup_inc(proto_perl->Ifdpid);
8632
8633 /* internal state */
8634 PL_tainting = proto_perl->Itainting;
8635 PL_maxo = proto_perl->Imaxo;
8636 if (proto_perl->Iop_mask)
8637 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
8638 else
8639 PL_op_mask = Nullch;
8640
8641 /* current interpreter roots */
8642 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv);
8643 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
8644 PL_main_start = proto_perl->Imain_start;
e977893f 8645 PL_eval_root = proto_perl->Ieval_root;
1d7c1841
GS
8646 PL_eval_start = proto_perl->Ieval_start;
8647
8648 /* runtime control stuff */
8649 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
8650 PL_copline = proto_perl->Icopline;
8651
8652 PL_filemode = proto_perl->Ifilemode;
8653 PL_lastfd = proto_perl->Ilastfd;
8654 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
8655 PL_Argv = NULL;
8656 PL_Cmd = Nullch;
8657 PL_gensym = proto_perl->Igensym;
8658 PL_preambled = proto_perl->Ipreambled;
8659 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav);
8660 PL_laststatval = proto_perl->Ilaststatval;
8661 PL_laststype = proto_perl->Ilaststype;
8662 PL_mess_sv = Nullsv;
8663
7889fe52 8664 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv);
1d7c1841
GS
8665 PL_ofmt = SAVEPV(proto_perl->Iofmt);
8666
8667 /* interpreter atexit processing */
8668 PL_exitlistlen = proto_perl->Iexitlistlen;
8669 if (PL_exitlistlen) {
8670 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
8671 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
8672 }
8673 else
8674 PL_exitlist = (PerlExitListEntry*)NULL;
8675 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal);
8676
8677 PL_profiledata = NULL;
8678 PL_rsfp = fp_dup(proto_perl->Irsfp, '<');
8679 /* PL_rsfp_filters entries have fake IoDIRP() */
8680 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters);
8681
8682 PL_compcv = cv_dup(proto_perl->Icompcv);
8683 PL_comppad = av_dup(proto_perl->Icomppad);
8684 PL_comppad_name = av_dup(proto_perl->Icomppad_name);
8685 PL_comppad_name_fill = proto_perl->Icomppad_name_fill;
8686 PL_comppad_name_floor = proto_perl->Icomppad_name_floor;
8687 PL_curpad = (SV**)ptr_table_fetch(PL_ptr_table,
8688 proto_perl->Tcurpad);
8689
8690#ifdef HAVE_INTERP_INTERN
8691 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
8692#endif
8693
8694 /* more statics moved here */
8695 PL_generation = proto_perl->Igeneration;
8696 PL_DBcv = cv_dup(proto_perl->IDBcv);
1d7c1841
GS
8697
8698 PL_in_clean_objs = proto_perl->Iin_clean_objs;
8699 PL_in_clean_all = proto_perl->Iin_clean_all;
8700
8701 PL_uid = proto_perl->Iuid;
8702 PL_euid = proto_perl->Ieuid;
8703 PL_gid = proto_perl->Igid;
8704 PL_egid = proto_perl->Iegid;
8705 PL_nomemok = proto_perl->Inomemok;
8706 PL_an = proto_perl->Ian;
8707 PL_cop_seqmax = proto_perl->Icop_seqmax;
8708 PL_op_seqmax = proto_perl->Iop_seqmax;
8709 PL_evalseq = proto_perl->Ievalseq;
8710 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
8711 PL_origalen = proto_perl->Iorigalen;
8712 PL_pidstatus = newHV(); /* XXX flag for cloning? */
8713 PL_osname = SAVEPV(proto_perl->Iosname);
8714 PL_sh_path = SAVEPV(proto_perl->Ish_path);
8715 PL_sighandlerp = proto_perl->Isighandlerp;
8716
8717
8718 PL_runops = proto_perl->Irunops;
8719
8720 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
8721
8722#ifdef CSH
8723 PL_cshlen = proto_perl->Icshlen;
8724 PL_cshname = SAVEPVN(proto_perl->Icshname, PL_cshlen);
8725#endif
8726
8727 PL_lex_state = proto_perl->Ilex_state;
8728 PL_lex_defer = proto_perl->Ilex_defer;
8729 PL_lex_expect = proto_perl->Ilex_expect;
8730 PL_lex_formbrack = proto_perl->Ilex_formbrack;
8731 PL_lex_dojoin = proto_perl->Ilex_dojoin;
8732 PL_lex_starts = proto_perl->Ilex_starts;
8733 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff);
8734 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl);
8735 PL_lex_op = proto_perl->Ilex_op;
8736 PL_lex_inpat = proto_perl->Ilex_inpat;
8737 PL_lex_inwhat = proto_perl->Ilex_inwhat;
8738 PL_lex_brackets = proto_perl->Ilex_brackets;
8739 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
8740 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
8741 PL_lex_casemods = proto_perl->Ilex_casemods;
8742 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
8743 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
8744
8745 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
8746 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
8747 PL_nexttoke = proto_perl->Inexttoke;
8748
8749 PL_linestr = sv_dup_inc(proto_perl->Ilinestr);
8750 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
8751 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8752 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
8753 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8754 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
8755 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8756 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
8757 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
8758 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8759 PL_pending_ident = proto_perl->Ipending_ident;
8760 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
8761
8762 PL_expect = proto_perl->Iexpect;
8763
8764 PL_multi_start = proto_perl->Imulti_start;
8765 PL_multi_end = proto_perl->Imulti_end;
8766 PL_multi_open = proto_perl->Imulti_open;
8767 PL_multi_close = proto_perl->Imulti_close;
8768
8769 PL_error_count = proto_perl->Ierror_count;
8770 PL_subline = proto_perl->Isubline;
8771 PL_subname = sv_dup_inc(proto_perl->Isubname);
8772
8773 PL_min_intro_pending = proto_perl->Imin_intro_pending;
8774 PL_max_intro_pending = proto_perl->Imax_intro_pending;
8775 PL_padix = proto_perl->Ipadix;
8776 PL_padix_floor = proto_perl->Ipadix_floor;
8777 PL_pad_reset_pending = proto_perl->Ipad_reset_pending;
8778
8779 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
8780 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8781 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
8782 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8783 PL_last_lop_op = proto_perl->Ilast_lop_op;
8784 PL_in_my = proto_perl->Iin_my;
8785 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash);
8786#ifdef FCRYPT
8787 PL_cryptseen = proto_perl->Icryptseen;
8788#endif
8789
8790 PL_hints = proto_perl->Ihints;
8791
8792 PL_amagic_generation = proto_perl->Iamagic_generation;
8793
8794#ifdef USE_LOCALE_COLLATE
8795 PL_collation_ix = proto_perl->Icollation_ix;
8796 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
8797 PL_collation_standard = proto_perl->Icollation_standard;
8798 PL_collxfrm_base = proto_perl->Icollxfrm_base;
8799 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
8800#endif /* USE_LOCALE_COLLATE */
8801
8802#ifdef USE_LOCALE_NUMERIC
8803 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
8804 PL_numeric_standard = proto_perl->Inumeric_standard;
8805 PL_numeric_local = proto_perl->Inumeric_local;
8806 PL_numeric_radix = proto_perl->Inumeric_radix;
8807#endif /* !USE_LOCALE_NUMERIC */
8808
8809 /* utf8 character classes */
8810 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum);
8811 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc);
8812 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii);
8813 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha);
8814 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space);
8815 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl);
8816 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph);
8817 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit);
8818 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper);
8819 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower);
8820 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print);
8821 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct);
8822 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit);
8823 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark);
8824 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper);
8825 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle);
8826 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower);
8827
8828 /* swatch cache */
8829 PL_last_swash_hv = Nullhv; /* reinits on demand */
8830 PL_last_swash_klen = 0;
8831 PL_last_swash_key[0]= '\0';
8832 PL_last_swash_tmps = (U8*)NULL;
8833 PL_last_swash_slen = 0;
8834
8835 /* perly.c globals */
8836 PL_yydebug = proto_perl->Iyydebug;
8837 PL_yynerrs = proto_perl->Iyynerrs;
8838 PL_yyerrflag = proto_perl->Iyyerrflag;
8839 PL_yychar = proto_perl->Iyychar;
8840 PL_yyval = proto_perl->Iyyval;
8841 PL_yylval = proto_perl->Iyylval;
8842
8843 PL_glob_index = proto_perl->Iglob_index;
8844 PL_srand_called = proto_perl->Isrand_called;
8845 PL_uudmap['M'] = 0; /* reinits on demand */
8846 PL_bitcount = Nullch; /* reinits on demand */
8847
8848 if (proto_perl->Ipsig_ptr) {
8849 int sig_num[] = { SIG_NUM };
8850 Newz(0, PL_psig_ptr, sizeof(sig_num)/sizeof(*sig_num), SV*);
8851 Newz(0, PL_psig_name, sizeof(sig_num)/sizeof(*sig_num), SV*);
8852 for (i = 1; PL_sig_name[i]; i++) {
8853 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i]);
8854 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i]);
8855 }
8856 }
8857 else {
8858 PL_psig_ptr = (SV**)NULL;
8859 PL_psig_name = (SV**)NULL;
8860 }
8861
8862 /* thrdvar.h stuff */
8863
8864 if (flags & 1) {
8865 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
8866 PL_tmps_ix = proto_perl->Ttmps_ix;
8867 PL_tmps_max = proto_perl->Ttmps_max;
8868 PL_tmps_floor = proto_perl->Ttmps_floor;
8869 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
8870 i = 0;
8871 while (i <= PL_tmps_ix) {
8872 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i]);
8873 ++i;
8874 }
8875
8876 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
8877 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
8878 Newz(54, PL_markstack, i, I32);
8879 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
8880 - proto_perl->Tmarkstack);
8881 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
8882 - proto_perl->Tmarkstack);
8883 Copy(proto_perl->Tmarkstack, PL_markstack,
8884 PL_markstack_ptr - PL_markstack + 1, I32);
8885
8886 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
8887 * NOTE: unlike the others! */
8888 PL_scopestack_ix = proto_perl->Tscopestack_ix;
8889 PL_scopestack_max = proto_perl->Tscopestack_max;
8890 Newz(54, PL_scopestack, PL_scopestack_max, I32);
8891 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
8892
8893 /* next push_return() sets PL_retstack[PL_retstack_ix]
8894 * NOTE: unlike the others! */
8895 PL_retstack_ix = proto_perl->Tretstack_ix;
8896 PL_retstack_max = proto_perl->Tretstack_max;
8897 Newz(54, PL_retstack, PL_retstack_max, OP*);
8898 Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, I32);
8899
8900 /* NOTE: si_dup() looks at PL_markstack */
8901 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo);
8902
8903 /* PL_curstack = PL_curstackinfo->si_stack; */
8904 PL_curstack = av_dup(proto_perl->Tcurstack);
8905 PL_mainstack = av_dup(proto_perl->Tmainstack);
8906
8907 /* next PUSHs() etc. set *(PL_stack_sp+1) */
8908 PL_stack_base = AvARRAY(PL_curstack);
8909 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
8910 - proto_perl->Tstack_base);
8911 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
8912
8913 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
8914 * NOTE: unlike the others! */
8915 PL_savestack_ix = proto_perl->Tsavestack_ix;
8916 PL_savestack_max = proto_perl->Tsavestack_max;
8917 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
8918 PL_savestack = ss_dup(proto_perl);
8919 }
8920 else {
8921 init_stacks();
985e7056 8922 ENTER; /* perl_destruct() wants to LEAVE; */
1d7c1841
GS
8923 }
8924
8925 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
8926 PL_top_env = &PL_start_env;
8927
8928 PL_op = proto_perl->Top;
8929
8930 PL_Sv = Nullsv;
8931 PL_Xpv = (XPV*)NULL;
8932 PL_na = proto_perl->Tna;
8933
8934 PL_statbuf = proto_perl->Tstatbuf;
8935 PL_statcache = proto_perl->Tstatcache;
8936 PL_statgv = gv_dup(proto_perl->Tstatgv);
8937 PL_statname = sv_dup_inc(proto_perl->Tstatname);
8938#ifdef HAS_TIMES
8939 PL_timesbuf = proto_perl->Ttimesbuf;
8940#endif
8941
8942 PL_tainted = proto_perl->Ttainted;
8943 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
8944 PL_nrs = sv_dup_inc(proto_perl->Tnrs);
8945 PL_rs = sv_dup_inc(proto_perl->Trs);
8946 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv);
7889fe52 8947 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv);
1d7c1841
GS
8948 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv);
8949 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
8950 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget);
8951 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget);
8952 PL_formtarget = sv_dup(proto_perl->Tformtarget);
8953
8954 PL_restartop = proto_perl->Trestartop;
8955 PL_in_eval = proto_perl->Tin_eval;
8956 PL_delaymagic = proto_perl->Tdelaymagic;
8957 PL_dirty = proto_perl->Tdirty;
8958 PL_localizing = proto_perl->Tlocalizing;
8959
14dd3ad8 8960#ifdef PERL_FLEXIBLE_EXCEPTIONS
1d7c1841 8961 PL_protect = proto_perl->Tprotect;
14dd3ad8 8962#endif
1d7c1841
GS
8963 PL_errors = sv_dup_inc(proto_perl->Terrors);
8964 PL_av_fetch_sv = Nullsv;
8965 PL_hv_fetch_sv = Nullsv;
8966 Zero(&PL_hv_fetch_ent_mh, 1, HE); /* XXX */
8967 PL_modcount = proto_perl->Tmodcount;
8968 PL_lastgotoprobe = Nullop;
8969 PL_dumpindent = proto_perl->Tdumpindent;
8970
8971 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
8972 PL_sortstash = hv_dup(proto_perl->Tsortstash);
8973 PL_firstgv = gv_dup(proto_perl->Tfirstgv);
8974 PL_secondgv = gv_dup(proto_perl->Tsecondgv);
8975 PL_sortcxix = proto_perl->Tsortcxix;
8976 PL_efloatbuf = Nullch; /* reinits on demand */
8977 PL_efloatsize = 0; /* reinits on demand */
8978
8979 /* regex stuff */
8980
8981 PL_screamfirst = NULL;
8982 PL_screamnext = NULL;
8983 PL_maxscream = -1; /* reinits on demand */
8984 PL_lastscream = Nullsv;
8985
8986 PL_watchaddr = NULL;
8987 PL_watchok = Nullch;
8988
8989 PL_regdummy = proto_perl->Tregdummy;
8990 PL_regcomp_parse = Nullch;
8991 PL_regxend = Nullch;
8992 PL_regcode = (regnode*)NULL;
8993 PL_regnaughty = 0;
8994 PL_regsawback = 0;
8995 PL_regprecomp = Nullch;
8996 PL_regnpar = 0;
8997 PL_regsize = 0;
8998 PL_regflags = 0;
8999 PL_regseen = 0;
9000 PL_seen_zerolen = 0;
9001 PL_seen_evals = 0;
9002 PL_regcomp_rx = (regexp*)NULL;
9003 PL_extralen = 0;
9004 PL_colorset = 0; /* reinits PL_colors[] */
9005 /*PL_colors[6] = {0,0,0,0,0,0};*/
9006 PL_reg_whilem_seen = 0;
9007 PL_reginput = Nullch;
9008 PL_regbol = Nullch;
9009 PL_regeol = Nullch;
9010 PL_regstartp = (I32*)NULL;
9011 PL_regendp = (I32*)NULL;
9012 PL_reglastparen = (U32*)NULL;
9013 PL_regtill = Nullch;
9014 PL_regprev = '\n';
9015 PL_reg_start_tmp = (char**)NULL;
9016 PL_reg_start_tmpl = 0;
9017 PL_regdata = (struct reg_data*)NULL;
9018 PL_bostr = Nullch;
9019 PL_reg_flags = 0;
9020 PL_reg_eval_set = 0;
9021 PL_regnarrate = 0;
9022 PL_regprogram = (regnode*)NULL;
9023 PL_regindent = 0;
9024 PL_regcc = (CURCUR*)NULL;
9025 PL_reg_call_cc = (struct re_cc_state*)NULL;
9026 PL_reg_re = (regexp*)NULL;
9027 PL_reg_ganch = Nullch;
9028 PL_reg_sv = Nullsv;
9029 PL_reg_magic = (MAGIC*)NULL;
9030 PL_reg_oldpos = 0;
9031 PL_reg_oldcurpm = (PMOP*)NULL;
9032 PL_reg_curpm = (PMOP*)NULL;
9033 PL_reg_oldsaved = Nullch;
9034 PL_reg_oldsavedlen = 0;
9035 PL_reg_maxiter = 0;
9036 PL_reg_leftiter = 0;
9037 PL_reg_poscache = Nullch;
9038 PL_reg_poscache_size= 0;
9039
9040 /* RE engine - function pointers */
9041 PL_regcompp = proto_perl->Tregcompp;
9042 PL_regexecp = proto_perl->Tregexecp;
9043 PL_regint_start = proto_perl->Tregint_start;
9044 PL_regint_string = proto_perl->Tregint_string;
9045 PL_regfree = proto_perl->Tregfree;
9046
9047 PL_reginterp_cnt = 0;
9048 PL_reg_starttry = 0;
9049
9050#ifdef PERL_OBJECT
9051 return (PerlInterpreter*)pPerl;
9052#else
9053 return my_perl;
9054#endif
9055}
9056
9057#else /* !USE_ITHREADS */
51371543
GS
9058
9059#ifdef PERL_OBJECT
51371543
GS
9060#include "XSUB.h"
9061#endif
9062
1d7c1841
GS
9063#endif /* USE_ITHREADS */
9064
51371543
GS
9065static void
9066do_report_used(pTHXo_ SV *sv)
9067{
9068 if (SvTYPE(sv) != SVTYPEMASK) {
bf49b057 9069 PerlIO_printf(Perl_debug_log, "****\n");
51371543
GS
9070 sv_dump(sv);
9071 }
9072}
9073
9074static void
9075do_clean_objs(pTHXo_ SV *sv)
9076{
9077 SV* rv;
9078
9079 if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
9080 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv));)
8b6e653b
HS
9081 if (SvWEAKREF(sv)) {
9082 sv_del_backref(sv);
9083 SvWEAKREF_off(sv);
9084 SvRV(sv) = 0;
9085 } else {
9086 SvROK_off(sv);
9087 SvRV(sv) = 0;
9088 SvREFCNT_dec(rv);
9089 }
51371543
GS
9090 }
9091
9092 /* XXX Might want to check arrays, etc. */
9093}
9094
9095#ifndef DISABLE_DESTRUCTOR_KLUDGE
9096static void
9097do_clean_named_objs(pTHXo_ SV *sv)
9098{
f472eb5c 9099 if (SvTYPE(sv) == SVt_PVGV && GvGP(sv)) {
51371543 9100 if ( SvOBJECT(GvSV(sv)) ||
155aba94
GS
9101 (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
9102 (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
9103 (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
9104 (GvCV(sv) && SvOBJECT(GvCV(sv))) )
51371543
GS
9105 {
9106 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv));)
9107 SvREFCNT_dec(sv);
9108 }
9109 }
9110}
9111#endif
9112
9113static void
9114do_clean_all(pTHXo_ SV *sv)
9115{
1d7c1841 9116 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) );)
51371543
GS
9117 SvFLAGS(sv) |= SVf_BREAK;
9118 SvREFCNT_dec(sv);
9119}
8af02333 9120