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