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