This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re-work the regcomp.sym to remove use of hard tabs. No data change.
[perl5.git] / scope.c
... / ...
CommitLineData
1/* scope.c
2 *
3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
9 */
10
11/*
12 * For the fashion of Minas Tirith was such that it was built on seven
13 * levels...
14 *
15 * [p.751 of _The Lord of the Rings_, V/i: "Minas Tirith"]
16 */
17
18/* This file contains functions to manipulate several of Perl's stacks;
19 * in particular it contains code to push various types of things onto
20 * the savestack, then to pop them off and perform the correct restorative
21 * action for each one. This corresponds to the cleanup Perl does at
22 * each scope exit.
23 */
24
25#include "EXTERN.h"
26#define PERL_IN_SCOPE_C
27#include "perl.h"
28
29SV**
30Perl_stack_grow(pTHX_ SV **sp, SV **p, int n)
31{
32 dVAR;
33
34 PERL_ARGS_ASSERT_STACK_GROW;
35
36 PL_stack_sp = sp;
37#ifndef STRESS_REALLOC
38 av_extend(PL_curstack, (p - PL_stack_base) + (n) + 128);
39#else
40 av_extend(PL_curstack, (p - PL_stack_base) + (n) + 1);
41#endif
42 return PL_stack_sp;
43}
44
45#ifndef STRESS_REALLOC
46#define GROW(old) ((old) * 3 / 2)
47#else
48#define GROW(old) ((old) + 1)
49#endif
50
51PERL_SI *
52Perl_new_stackinfo(pTHX_ I32 stitems, I32 cxitems)
53{
54 dVAR;
55 PERL_SI *si;
56 Newx(si, 1, PERL_SI);
57 si->si_stack = newAV();
58 AvREAL_off(si->si_stack);
59 av_extend(si->si_stack, stitems > 0 ? stitems-1 : 0);
60 AvALLOC(si->si_stack)[0] = &PL_sv_undef;
61 AvFILLp(si->si_stack) = 0;
62 si->si_prev = 0;
63 si->si_next = 0;
64 si->si_cxmax = cxitems - 1;
65 si->si_cxix = -1;
66 si->si_type = PERLSI_UNDEF;
67 Newx(si->si_cxstack, cxitems, PERL_CONTEXT);
68 /* Without any kind of initialising PUSHSUBST()
69 * in pp_subst() will read uninitialised heap. */
70 PoisonNew(si->si_cxstack, cxitems, PERL_CONTEXT);
71 return si;
72}
73
74I32
75Perl_cxinc(pTHX)
76{
77 dVAR;
78 const IV old_max = cxstack_max;
79 cxstack_max = GROW(cxstack_max);
80 Renew(cxstack, cxstack_max + 1, PERL_CONTEXT); /* XXX should fix CXINC macro */
81 /* Without any kind of initialising deep enough recursion
82 * will end up reading uninitialised PERL_CONTEXTs. */
83 PoisonNew(cxstack + old_max + 1, cxstack_max - old_max, PERL_CONTEXT);
84 return cxstack_ix + 1;
85}
86
87void
88Perl_push_scope(pTHX)
89{
90 dVAR;
91 if (PL_scopestack_ix == PL_scopestack_max) {
92 PL_scopestack_max = GROW(PL_scopestack_max);
93 Renew(PL_scopestack, PL_scopestack_max, I32);
94#ifdef DEBUGGING
95 Renew(PL_scopestack_name, PL_scopestack_max, const char*);
96#endif
97 }
98#ifdef DEBUGGING
99 PL_scopestack_name[PL_scopestack_ix] = "unknown";
100#endif
101 PL_scopestack[PL_scopestack_ix++] = PL_savestack_ix;
102
103}
104
105void
106Perl_pop_scope(pTHX)
107{
108 dVAR;
109 const I32 oldsave = PL_scopestack[--PL_scopestack_ix];
110 LEAVE_SCOPE(oldsave);
111}
112
113void
114Perl_markstack_grow(pTHX)
115{
116 dVAR;
117 const I32 oldmax = PL_markstack_max - PL_markstack;
118 const I32 newmax = GROW(oldmax);
119
120 Renew(PL_markstack, newmax, I32);
121 PL_markstack_ptr = PL_markstack + oldmax;
122 PL_markstack_max = PL_markstack + newmax;
123}
124
125void
126Perl_savestack_grow(pTHX)
127{
128 dVAR;
129 PL_savestack_max = GROW(PL_savestack_max) + 4;
130 Renew(PL_savestack, PL_savestack_max, ANY);
131}
132
133void
134Perl_savestack_grow_cnt(pTHX_ I32 need)
135{
136 dVAR;
137 PL_savestack_max = PL_savestack_ix + need;
138 Renew(PL_savestack, PL_savestack_max, ANY);
139}
140
141#undef GROW
142
143void
144Perl_tmps_grow(pTHX_ I32 n)
145{
146 dVAR;
147#ifndef STRESS_REALLOC
148 if (n < 128)
149 n = (PL_tmps_max < 512) ? 128 : 512;
150#endif
151 PL_tmps_max = PL_tmps_ix + n + 1;
152 Renew(PL_tmps_stack, PL_tmps_max, SV*);
153}
154
155
156void
157Perl_free_tmps(pTHX)
158{
159 dVAR;
160 /* XXX should tmps_floor live in cxstack? */
161 const I32 myfloor = PL_tmps_floor;
162 while (PL_tmps_ix > myfloor) { /* clean up after last statement */
163 SV* const sv = PL_tmps_stack[PL_tmps_ix];
164 PL_tmps_stack[PL_tmps_ix--] = NULL;
165 if (sv && sv != &PL_sv_undef) {
166 SvTEMP_off(sv);
167 SvREFCNT_dec(sv); /* note, can modify tmps_ix!!! */
168 }
169 }
170}
171
172STATIC SV *
173S_save_scalar_at(pTHX_ SV **sptr, const U32 flags)
174{
175 dVAR;
176 SV * osv;
177 register SV *sv;
178
179 PERL_ARGS_ASSERT_SAVE_SCALAR_AT;
180
181 osv = *sptr;
182 sv = (flags & SAVEf_KEEPOLDELEM) ? osv : (*sptr = newSV(0));
183
184 if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(osv) && SvTYPE(osv) != SVt_PVGV) {
185 if (SvGMAGICAL(osv)) {
186 const bool oldtainted = PL_tainted;
187 SvFLAGS(osv) |= (SvFLAGS(osv) &
188 (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
189 PL_tainted = oldtainted;
190 }
191 if (!(flags & SAVEf_KEEPOLDELEM))
192 mg_localize(osv, sv, (flags & SAVEf_SETMAGIC) != 0);
193 }
194
195 return sv;
196}
197
198void
199Perl_save_pushptrptr(pTHX_ void *const ptr1, void *const ptr2, const int type)
200{
201 dVAR;
202 SSCHECK(3);
203 SSPUSHPTR(ptr1);
204 SSPUSHPTR(ptr2);
205 SSPUSHUV(type);
206}
207
208SV *
209Perl_save_scalar(pTHX_ GV *gv)
210{
211 dVAR;
212 SV ** const sptr = &GvSVn(gv);
213
214 PERL_ARGS_ASSERT_SAVE_SCALAR;
215
216 PL_localizing = 1;
217 SvGETMAGIC(*sptr);
218 PL_localizing = 0;
219 save_pushptrptr(SvREFCNT_inc_simple(gv), SvREFCNT_inc(*sptr), SAVEt_SV);
220 return save_scalar_at(sptr, SAVEf_SETMAGIC); /* XXX - FIXME - see #60360 */
221}
222
223/* Like save_sptr(), but also SvREFCNT_dec()s the new value. Can be used to
224 * restore a global SV to its prior contents, freeing new value. */
225void
226Perl_save_generic_svref(pTHX_ SV **sptr)
227{
228 dVAR;
229
230 PERL_ARGS_ASSERT_SAVE_GENERIC_SVREF;
231
232 save_pushptrptr(sptr, SvREFCNT_inc(*sptr), SAVEt_GENERIC_SVREF);
233}
234
235/* Like save_pptr(), but also Safefree()s the new value if it is different
236 * from the old one. Can be used to restore a global char* to its prior
237 * contents, freeing new value. */
238void
239Perl_save_generic_pvref(pTHX_ char **str)
240{
241 dVAR;
242
243 PERL_ARGS_ASSERT_SAVE_GENERIC_PVREF;
244
245 save_pushptrptr(*str, str, SAVEt_GENERIC_PVREF);
246}
247
248/* Like save_generic_pvref(), but uses PerlMemShared_free() rather than Safefree().
249 * Can be used to restore a shared global char* to its prior
250 * contents, freeing new value. */
251void
252Perl_save_shared_pvref(pTHX_ char **str)
253{
254 dVAR;
255
256 PERL_ARGS_ASSERT_SAVE_SHARED_PVREF;
257
258 save_pushptrptr(str, *str, SAVEt_SHARED_PVREF);
259}
260
261/* set the SvFLAGS specified by mask to the values in val */
262
263void
264Perl_save_set_svflags(pTHX_ SV* sv, U32 mask, U32 val)
265{
266 dVAR;
267
268 PERL_ARGS_ASSERT_SAVE_SET_SVFLAGS;
269
270 SSCHECK(4);
271 SSPUSHPTR(sv);
272 SSPUSHINT(mask);
273 SSPUSHINT(val);
274 SSPUSHUV(SAVEt_SET_SVFLAGS);
275}
276
277void
278Perl_save_gp(pTHX_ GV *gv, I32 empty)
279{
280 dVAR;
281
282 PERL_ARGS_ASSERT_SAVE_GP;
283
284 SSCHECK(4);
285 SSPUSHINT(SvFAKE(gv));
286 SSPUSHPTR(GvGP(gv));
287 SSPUSHPTR(SvREFCNT_inc(gv));
288 SSPUSHUV(SAVEt_GP);
289
290 /* Don't let the localized GV coerce into non-glob, otherwise we would
291 * not be able to restore GP upon leave from context if that happened */
292 SvFAKE_off(gv);
293
294 if (empty) {
295 GP *gp = Perl_newGP(aTHX_ gv);
296
297 if (GvCVu(gv))
298 mro_method_changed_in(GvSTASH(gv)); /* taking a method out of circulation ("local")*/
299 if (GvIOp(gv) && (IoFLAGS(GvIOp(gv)) & IOf_ARGV)) {
300 gp->gp_io = newIO();
301 IoFLAGS(gp->gp_io) |= IOf_ARGV|IOf_START;
302 }
303#ifdef PERL_DONT_CREATE_GVSV
304 if (gv == PL_errgv) {
305 /* We could scatter this logic everywhere by changing the
306 definition of ERRSV from GvSV() to GvSVn(), but it seems more
307 efficient to do this check once here. */
308 gp->gp_sv = newSV(0);
309 }
310#endif
311 GvGP(gv) = gp;
312 }
313 else {
314 gp_ref(GvGP(gv));
315 GvINTRO_on(gv);
316 }
317}
318
319AV *
320Perl_save_ary(pTHX_ GV *gv)
321{
322 dVAR;
323 AV * const oav = GvAVn(gv);
324 AV *av;
325
326 PERL_ARGS_ASSERT_SAVE_ARY;
327
328 if (!AvREAL(oav) && AvREIFY(oav))
329 av_reify(oav);
330 save_pushptrptr(gv, oav, SAVEt_AV);
331
332 GvAV(gv) = NULL;
333 av = GvAVn(gv);
334 if (SvMAGIC(oav))
335 mg_localize(MUTABLE_SV(oav), MUTABLE_SV(av), TRUE);
336 return av;
337}
338
339HV *
340Perl_save_hash(pTHX_ GV *gv)
341{
342 dVAR;
343 HV *ohv, *hv;
344
345 PERL_ARGS_ASSERT_SAVE_HASH;
346
347 save_pushptrptr(gv, (ohv = GvHVn(gv)), SAVEt_HV);
348
349 GvHV(gv) = NULL;
350 hv = GvHVn(gv);
351 if (SvMAGIC(ohv))
352 mg_localize(MUTABLE_SV(ohv), MUTABLE_SV(hv), TRUE);
353 return hv;
354}
355
356void
357Perl_save_item(pTHX_ register SV *item)
358{
359 dVAR;
360 register SV * const sv = newSVsv(item);
361
362 PERL_ARGS_ASSERT_SAVE_ITEM;
363
364 save_pushptrptr(item, /* remember the pointer */
365 sv, /* remember the value */
366 SAVEt_ITEM);
367}
368
369void
370Perl_save_bool(pTHX_ bool *boolp)
371{
372 dVAR;
373
374 PERL_ARGS_ASSERT_SAVE_BOOL;
375
376 SSCHECK(2);
377 SSPUSHPTR(boolp);
378 SSPUSHUV(SAVEt_BOOL | (*boolp << 8));
379}
380
381void
382Perl_save_pushi32ptr(pTHX_ const I32 i, void *const ptr, const int type)
383{
384 dVAR;
385 SSCHECK(3);
386 SSPUSHINT(i);
387 SSPUSHPTR(ptr);
388 SSPUSHUV(type);
389}
390
391void
392Perl_save_int(pTHX_ int *intp)
393{
394 dVAR;
395 const UV shifted = (UV)*intp << SAVE_TIGHT_SHIFT;
396
397 PERL_ARGS_ASSERT_SAVE_INT;
398
399 if ((int)(shifted >> SAVE_TIGHT_SHIFT) == *intp) {
400 SSCHECK(2);
401 SSPUSHPTR(intp);
402 SSPUSHUV(SAVEt_INT_SMALL | shifted);
403 } else
404 save_pushi32ptr(*intp, intp, SAVEt_INT);
405}
406
407void
408Perl_save_I8(pTHX_ I8 *bytep)
409{
410 dVAR;
411
412 PERL_ARGS_ASSERT_SAVE_I8;
413
414 SSCHECK(2);
415 SSPUSHPTR(bytep);
416 SSPUSHUV(SAVEt_I8 | ((UV)*bytep << 8));
417}
418
419void
420Perl_save_I16(pTHX_ I16 *intp)
421{
422 dVAR;
423
424 PERL_ARGS_ASSERT_SAVE_I16;
425
426 SSCHECK(2);
427 SSPUSHPTR(intp);
428 SSPUSHUV(SAVEt_I16 | ((UV)*intp << 8));
429}
430
431void
432Perl_save_I32(pTHX_ I32 *intp)
433{
434 dVAR;
435 const UV shifted = (UV)*intp << SAVE_TIGHT_SHIFT;
436
437 PERL_ARGS_ASSERT_SAVE_I32;
438
439 if ((I32)(shifted >> SAVE_TIGHT_SHIFT) == *intp) {
440 SSCHECK(2);
441 SSPUSHPTR(intp);
442 SSPUSHUV(SAVEt_I32_SMALL | shifted);
443 } else
444 save_pushi32ptr(*intp, intp, SAVEt_I32);
445}
446
447/* Cannot use save_sptr() to store a char* since the SV** cast will
448 * force word-alignment and we'll miss the pointer.
449 */
450void
451Perl_save_pptr(pTHX_ char **pptr)
452{
453 dVAR;
454
455 PERL_ARGS_ASSERT_SAVE_PPTR;
456
457 save_pushptrptr(*pptr, pptr, SAVEt_PPTR);
458}
459
460void
461Perl_save_vptr(pTHX_ void *ptr)
462{
463 dVAR;
464
465 PERL_ARGS_ASSERT_SAVE_VPTR;
466
467 save_pushptrptr(*(char**)ptr, ptr, SAVEt_VPTR);
468}
469
470void
471Perl_save_sptr(pTHX_ SV **sptr)
472{
473 dVAR;
474
475 PERL_ARGS_ASSERT_SAVE_SPTR;
476
477 save_pushptrptr(*sptr, sptr, SAVEt_SPTR);
478}
479
480void
481Perl_save_padsv_and_mortalize(pTHX_ PADOFFSET off)
482{
483 dVAR;
484 SSCHECK(4);
485 ASSERT_CURPAD_ACTIVE("save_padsv");
486 SSPUSHPTR(SvREFCNT_inc_simple_NN(PL_curpad[off]));
487 SSPUSHPTR(PL_comppad);
488 SSPUSHLONG((long)off);
489 SSPUSHUV(SAVEt_PADSV_AND_MORTALIZE);
490}
491
492void
493Perl_save_hptr(pTHX_ HV **hptr)
494{
495 dVAR;
496
497 PERL_ARGS_ASSERT_SAVE_HPTR;
498
499 save_pushptrptr(*hptr, hptr, SAVEt_HPTR);
500}
501
502void
503Perl_save_aptr(pTHX_ AV **aptr)
504{
505 dVAR;
506
507 PERL_ARGS_ASSERT_SAVE_APTR;
508
509 save_pushptrptr(*aptr, aptr, SAVEt_APTR);
510}
511
512void
513Perl_save_pushptr(pTHX_ void *const ptr, const int type)
514{
515 dVAR;
516 SSCHECK(2);
517 SSPUSHPTR(ptr);
518 SSPUSHUV(type);
519}
520
521void
522Perl_save_clearsv(pTHX_ SV **svp)
523{
524 dVAR;
525 const UV offset = svp - PL_curpad;
526 const UV offset_shifted = offset << SAVE_TIGHT_SHIFT;
527
528 PERL_ARGS_ASSERT_SAVE_CLEARSV;
529
530 ASSERT_CURPAD_ACTIVE("save_clearsv");
531 if ((offset_shifted >> SAVE_TIGHT_SHIFT) != offset)
532 Perl_croak(aTHX_ "panic: pad offset %"UVuf" out of range (%p-%p)",
533 offset, svp, PL_curpad);
534
535 SSCHECK(1);
536 SSPUSHUV(offset_shifted | SAVEt_CLEARSV);
537 SvPADSTALE_off(*svp); /* mark lexical as active */
538}
539
540void
541Perl_save_delete(pTHX_ HV *hv, char *key, I32 klen)
542{
543 dVAR;
544
545 PERL_ARGS_ASSERT_SAVE_DELETE;
546
547 save_pushptri32ptr(key, klen, SvREFCNT_inc_simple(hv), SAVEt_DELETE);
548}
549
550void
551Perl_save_hdelete(pTHX_ HV *hv, SV *keysv)
552{
553 STRLEN len;
554 I32 klen;
555 const char *key;
556
557 PERL_ARGS_ASSERT_SAVE_HDELETE;
558
559 key = SvPV_const(keysv, len);
560 klen = SvUTF8(keysv) ? -(I32)len : (I32)len;
561 SvREFCNT_inc_simple_void_NN(hv);
562 save_pushptri32ptr(savepvn(key, len), klen, hv, SAVEt_DELETE);
563}
564
565void
566Perl_save_adelete(pTHX_ AV *av, I32 key)
567{
568 dVAR;
569
570 PERL_ARGS_ASSERT_SAVE_ADELETE;
571
572 SvREFCNT_inc_void(av);
573 save_pushi32ptr(key, av, SAVEt_ADELETE);
574}
575
576void
577Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p)
578{
579 dVAR;
580
581 PERL_ARGS_ASSERT_SAVE_DESTRUCTOR;
582
583 SSCHECK(3);
584 SSPUSHDPTR(f);
585 SSPUSHPTR(p);
586 SSPUSHUV(SAVEt_DESTRUCTOR);
587}
588
589void
590Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p)
591{
592 dVAR;
593 SSCHECK(3);
594 SSPUSHDXPTR(f);
595 SSPUSHPTR(p);
596 SSPUSHUV(SAVEt_DESTRUCTOR_X);
597}
598
599void
600Perl_save_hints(pTHX)
601{
602 dVAR;
603 if (PL_compiling.cop_hints_hash) {
604 HINTS_REFCNT_LOCK;
605 PL_compiling.cop_hints_hash->refcounted_he_refcnt++;
606 HINTS_REFCNT_UNLOCK;
607 }
608 if (PL_hints & HINT_LOCALIZE_HH) {
609 save_pushptri32ptr(GvHV(PL_hintgv), PL_hints,
610 PL_compiling.cop_hints_hash, SAVEt_HINTS);
611 GvHV(PL_hintgv) = Perl_hv_copy_hints_hv(aTHX_ GvHV(PL_hintgv));
612 } else {
613 save_pushi32ptr(PL_hints, PL_compiling.cop_hints_hash, SAVEt_HINTS);
614 }
615}
616
617static void
618S_save_pushptri32ptr(pTHX_ void *const ptr1, const I32 i, void *const ptr2,
619 const int type)
620{
621 SSCHECK(4);
622 SSPUSHPTR(ptr1);
623 SSPUSHINT(i);
624 SSPUSHPTR(ptr2);
625 SSPUSHUV(type);
626}
627
628void
629Perl_save_aelem_flags(pTHX_ AV *av, I32 idx, SV **sptr, const U32 flags)
630{
631 dVAR;
632 SV *sv;
633
634 PERL_ARGS_ASSERT_SAVE_AELEM_FLAGS;
635
636 SvGETMAGIC(*sptr);
637 save_pushptri32ptr(SvREFCNT_inc_simple(av), idx, SvREFCNT_inc(*sptr),
638 SAVEt_AELEM);
639 /* if it gets reified later, the restore will have the wrong refcnt */
640 if (!AvREAL(av) && AvREIFY(av))
641 SvREFCNT_inc_void(*sptr);
642 save_scalar_at(sptr, flags); /* XXX - FIXME - see #60360 */
643 if (flags & SAVEf_KEEPOLDELEM)
644 return;
645 sv = *sptr;
646 /* If we're localizing a tied array element, this new sv
647 * won't actually be stored in the array - so it won't get
648 * reaped when the localize ends. Ensure it gets reaped by
649 * mortifying it instead. DAPM */
650 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
651 sv_2mortal(sv);
652}
653
654void
655Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags)
656{
657 dVAR;
658 SV *sv;
659
660 PERL_ARGS_ASSERT_SAVE_HELEM_FLAGS;
661
662 SvGETMAGIC(*sptr);
663 SSCHECK(4);
664 SSPUSHPTR(SvREFCNT_inc_simple(hv));
665 SSPUSHPTR(newSVsv(key));
666 SSPUSHPTR(SvREFCNT_inc(*sptr));
667 SSPUSHUV(SAVEt_HELEM);
668 save_scalar_at(sptr, flags);
669 if (flags & SAVEf_KEEPOLDELEM)
670 return;
671 sv = *sptr;
672 /* If we're localizing a tied hash element, this new sv
673 * won't actually be stored in the hash - so it won't get
674 * reaped when the localize ends. Ensure it gets reaped by
675 * mortifying it instead. DAPM */
676 if (SvTIED_mg((const SV *)hv, PERL_MAGIC_tied))
677 sv_2mortal(sv);
678}
679
680SV*
681Perl_save_svref(pTHX_ SV **sptr)
682{
683 dVAR;
684
685 PERL_ARGS_ASSERT_SAVE_SVREF;
686
687 SvGETMAGIC(*sptr);
688 save_pushptrptr(sptr, SvREFCNT_inc(*sptr), SAVEt_SVREF);
689 return save_scalar_at(sptr, SAVEf_SETMAGIC); /* XXX - FIXME - see #60360 */
690}
691
692I32
693Perl_save_alloc(pTHX_ I32 size, I32 pad)
694{
695 dVAR;
696 register const I32 start = pad + ((char*)&PL_savestack[PL_savestack_ix]
697 - (char*)PL_savestack);
698 const UV elems = 1 + ((size + pad - 1) / sizeof(*PL_savestack));
699 const UV elems_shifted = elems << SAVE_TIGHT_SHIFT;
700
701 if ((elems_shifted >> SAVE_TIGHT_SHIFT) != elems)
702 Perl_croak(aTHX_ "panic: save_alloc elems %"UVuf" out of range (%ld-%ld)",
703 elems, size, pad);
704
705 SSGROW(elems + 1);
706
707 PL_savestack_ix += elems;
708 SSPUSHUV(SAVEt_ALLOC | elems_shifted);
709 return start;
710}
711
712void
713Perl_leave_scope(pTHX_ I32 base)
714{
715 dVAR;
716 register SV *sv;
717 register SV *value;
718 register GV *gv;
719 register AV *av;
720 register HV *hv;
721 void* ptr;
722 register char* str;
723 I32 i;
724 /* Localise the effects of the TAINT_NOT inside the loop. */
725 const bool was = PL_tainted;
726
727 if (base < -1)
728 Perl_croak(aTHX_ "panic: corrupt saved stack index");
729 DEBUG_l(Perl_deb(aTHX_ "savestack: releasing items %ld -> %ld\n",
730 (long)PL_savestack_ix, (long)base));
731 while (PL_savestack_ix > base) {
732 UV uv = SSPOPUV;
733 const U8 type = (U8)uv & SAVE_MASK;
734 TAINT_NOT;
735
736 switch (type) {
737 case SAVEt_ITEM: /* normal string */
738 value = MUTABLE_SV(SSPOPPTR);
739 sv = MUTABLE_SV(SSPOPPTR);
740 sv_replace(sv,value);
741 PL_localizing = 2;
742 SvSETMAGIC(sv);
743 PL_localizing = 0;
744 break;
745 case SAVEt_SV: /* scalar reference */
746 value = MUTABLE_SV(SSPOPPTR);
747 gv = MUTABLE_GV(SSPOPPTR);
748 ptr = &GvSV(gv);
749 av = MUTABLE_AV(gv); /* what to refcnt_dec */
750 restore_sv:
751 sv = *(SV**)ptr;
752 *(SV**)ptr = value;
753 SvREFCNT_dec(sv);
754 PL_localizing = 2;
755 SvSETMAGIC(value);
756 PL_localizing = 0;
757 SvREFCNT_dec(value);
758 if (av) /* actually an av, hv or gv */
759 SvREFCNT_dec(av);
760 break;
761 case SAVEt_GENERIC_PVREF: /* generic pv */
762 ptr = SSPOPPTR;
763 str = (char*)SSPOPPTR;
764 if (*(char**)ptr != str) {
765 Safefree(*(char**)ptr);
766 *(char**)ptr = str;
767 }
768 break;
769 case SAVEt_SHARED_PVREF: /* shared pv */
770 str = (char*)SSPOPPTR;
771 ptr = SSPOPPTR;
772 if (*(char**)ptr != str) {
773#ifdef NETWARE
774 PerlMem_free(*(char**)ptr);
775#else
776 PerlMemShared_free(*(char**)ptr);
777#endif
778 *(char**)ptr = str;
779 }
780 break;
781 case SAVEt_GENERIC_SVREF: /* generic sv */
782 value = MUTABLE_SV(SSPOPPTR);
783 ptr = SSPOPPTR;
784 sv = *(SV**)ptr;
785 *(SV**)ptr = value;
786 SvREFCNT_dec(sv);
787 SvREFCNT_dec(value);
788 break;
789 case SAVEt_AV: /* array reference */
790 av = MUTABLE_AV(SSPOPPTR);
791 gv = MUTABLE_GV(SSPOPPTR);
792 SvREFCNT_dec(GvAV(gv));
793 GvAV(gv) = av;
794 if (SvMAGICAL(av)) {
795 PL_localizing = 2;
796 SvSETMAGIC(MUTABLE_SV(av));
797 PL_localizing = 0;
798 }
799 break;
800 case SAVEt_HV: /* hash reference */
801 hv = MUTABLE_HV(SSPOPPTR);
802 gv = MUTABLE_GV(SSPOPPTR);
803 SvREFCNT_dec(GvHV(gv));
804 GvHV(gv) = hv;
805 if (SvMAGICAL(hv)) {
806 PL_localizing = 2;
807 SvSETMAGIC(MUTABLE_SV(hv));
808 PL_localizing = 0;
809 }
810 break;
811 case SAVEt_INT_SMALL:
812 ptr = SSPOPPTR;
813 *(int*)ptr = (int)(uv >> SAVE_TIGHT_SHIFT);
814 break;
815 case SAVEt_INT: /* int reference */
816 ptr = SSPOPPTR;
817 *(int*)ptr = (int)SSPOPINT;
818 break;
819 case SAVEt_BOOL: /* bool reference */
820 ptr = SSPOPPTR;
821 *(bool*)ptr = cBOOL(uv >> 8);
822 break;
823 case SAVEt_I32_SMALL:
824 ptr = SSPOPPTR;
825 *(I32*)ptr = (I32)(uv >> SAVE_TIGHT_SHIFT);
826 break;
827 case SAVEt_I32: /* I32 reference */
828 ptr = SSPOPPTR;
829#ifdef PERL_DEBUG_READONLY_OPS
830 {
831 const I32 val = SSPOPINT;
832 if (*(I32*)ptr != val)
833 *(I32*)ptr = val;
834 }
835#else
836 *(I32*)ptr = (I32)SSPOPINT;
837#endif
838 break;
839 case SAVEt_SPTR: /* SV* reference */
840 ptr = SSPOPPTR;
841 *(SV**)ptr = MUTABLE_SV(SSPOPPTR);
842 break;
843 case SAVEt_VPTR: /* random* reference */
844 case SAVEt_PPTR: /* char* reference */
845 ptr = SSPOPPTR;
846 *(char**)ptr = (char*)SSPOPPTR;
847 break;
848 case SAVEt_HPTR: /* HV* reference */
849 ptr = SSPOPPTR;
850 *(HV**)ptr = MUTABLE_HV(SSPOPPTR);
851 break;
852 case SAVEt_APTR: /* AV* reference */
853 ptr = SSPOPPTR;
854 *(AV**)ptr = MUTABLE_AV(SSPOPPTR);
855 break;
856 case SAVEt_GP: /* scalar reference */
857 gv = MUTABLE_GV(SSPOPPTR);
858 gp_free(gv);
859 GvGP(gv) = (GP*)SSPOPPTR;
860 if (SSPOPINT)
861 SvFAKE_on(gv);
862 /* putting a method back into circulation ("local")*/
863 if (GvCVu(gv) && (hv=GvSTASH(gv)) && HvNAME_get(hv))
864 mro_method_changed_in(hv);
865 SvREFCNT_dec(gv);
866 break;
867 case SAVEt_FREESV:
868 ptr = SSPOPPTR;
869 SvREFCNT_dec(MUTABLE_SV(ptr));
870 break;
871 case SAVEt_MORTALIZESV:
872 ptr = SSPOPPTR;
873 sv_2mortal(MUTABLE_SV(ptr));
874 break;
875 case SAVEt_FREEOP:
876 ptr = SSPOPPTR;
877 ASSERT_CURPAD_LEGAL("SAVEt_FREEOP"); /* XXX DAPM tmp */
878 op_free((OP*)ptr);
879 break;
880 case SAVEt_FREEPV:
881 ptr = SSPOPPTR;
882 Safefree(ptr);
883 break;
884 case SAVEt_CLEARSV:
885 ptr = (void*)&PL_curpad[uv >> SAVE_TIGHT_SHIFT];
886 sv = *(SV**)ptr;
887
888 DEBUG_Xv(PerlIO_printf(Perl_debug_log,
889 "Pad 0x%"UVxf"[0x%"UVxf"] clearsv: %ld sv=0x%"UVxf"<%"IVdf"> %s\n",
890 PTR2UV(PL_comppad), PTR2UV(PL_curpad),
891 (long)((SV **)ptr-PL_curpad), PTR2UV(sv), (IV)SvREFCNT(sv),
892 (SvREFCNT(sv) <= 1 && !SvOBJECT(sv)) ? "clear" : "abandon"
893 ));
894
895 /* Can clear pad variable in place? */
896 if (SvREFCNT(sv) <= 1 && !SvOBJECT(sv)) {
897 /*
898 * if a my variable that was made readonly is going out of
899 * scope, we want to remove the readonlyness so that it can
900 * go out of scope quietly
901 */
902 if (SvPADMY(sv) && !SvFAKE(sv))
903 SvREADONLY_off(sv);
904
905 if (SvTHINKFIRST(sv))
906 sv_force_normal_flags(sv, SV_IMMEDIATE_UNREF);
907 if (SvMAGICAL(sv))
908 mg_free(sv);
909
910 switch (SvTYPE(sv)) {
911 case SVt_NULL:
912 break;
913 case SVt_PVAV:
914 av_clear(MUTABLE_AV(sv));
915 break;
916 case SVt_PVHV:
917 hv_clear(MUTABLE_HV(sv));
918 break;
919 case SVt_PVCV:
920 Perl_croak(aTHX_ "panic: leave_scope pad code");
921 default:
922 SvOK_off(sv);
923 break;
924 }
925 SvPADSTALE_on(sv); /* mark as no longer live */
926 }
927 else { /* Someone has a claim on this, so abandon it. */
928 const U32 padflags = SvFLAGS(sv) & (SVs_PADMY|SVs_PADTMP);
929 switch (SvTYPE(sv)) { /* Console ourselves with a new value */
930 case SVt_PVAV: *(SV**)ptr = MUTABLE_SV(newAV()); break;
931 case SVt_PVHV: *(SV**)ptr = MUTABLE_SV(newHV()); break;
932 default: *(SV**)ptr = newSV(0); break;
933 }
934 SvREFCNT_dec(sv); /* Cast current value to the winds. */
935 /* preserve pad nature, but also mark as not live
936 * for any closure capturing */
937 SvFLAGS(*(SV**)ptr) |= padflags | SVs_PADSTALE;
938 }
939 break;
940 case SAVEt_DELETE:
941 ptr = SSPOPPTR;
942 hv = MUTABLE_HV(ptr);
943 i = SSPOPINT;
944 ptr = SSPOPPTR;
945 (void)hv_delete(hv, (char*)ptr, i, G_DISCARD);
946 SvREFCNT_dec(hv);
947 Safefree(ptr);
948 break;
949 case SAVEt_ADELETE:
950 ptr = SSPOPPTR;
951 av = MUTABLE_AV(ptr);
952 i = SSPOPINT;
953 (void)av_delete(av, i, G_DISCARD);
954 SvREFCNT_dec(av);
955 break;
956 case SAVEt_DESTRUCTOR_X:
957 ptr = SSPOPPTR;
958 (*SSPOPDXPTR)(aTHX_ ptr);
959 break;
960 case SAVEt_REGCONTEXT:
961 /* regexp must have croaked */
962 case SAVEt_ALLOC:
963 PL_savestack_ix -= uv >> SAVE_TIGHT_SHIFT;
964 break;
965 case SAVEt_STACK_POS: /* Position on Perl stack */
966 i = SSPOPINT;
967 PL_stack_sp = PL_stack_base + i;
968 break;
969 case SAVEt_STACK_CXPOS: /* blk_oldsp on context stack */
970 i = SSPOPINT;
971 cxstack[i].blk_oldsp = SSPOPINT;
972 break;
973 case SAVEt_AELEM: /* array element */
974 value = MUTABLE_SV(SSPOPPTR);
975 i = SSPOPINT;
976 av = MUTABLE_AV(SSPOPPTR);
977 ptr = av_fetch(av,i,1);
978 if (!AvREAL(av) && AvREIFY(av)) /* undo reify guard */
979 SvREFCNT_dec(value);
980 if (ptr) {
981 sv = *(SV**)ptr;
982 if (sv && sv != &PL_sv_undef) {
983 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
984 SvREFCNT_inc_void_NN(sv);
985 goto restore_sv;
986 }
987 }
988 SvREFCNT_dec(av);
989 SvREFCNT_dec(value);
990 break;
991 case SAVEt_HELEM: /* hash element */
992 value = MUTABLE_SV(SSPOPPTR);
993 sv = MUTABLE_SV(SSPOPPTR);
994 hv = MUTABLE_HV(SSPOPPTR);
995 ptr = hv_fetch_ent(hv, sv, 1, 0);
996 SvREFCNT_dec(sv);
997 if (ptr) {
998 const SV * const oval = HeVAL((HE*)ptr);
999 if (oval && oval != &PL_sv_undef) {
1000 ptr = &HeVAL((HE*)ptr);
1001 if (SvTIED_mg((const SV *)hv, PERL_MAGIC_tied))
1002 SvREFCNT_inc_void(*(SV**)ptr);
1003 av = MUTABLE_AV(hv); /* what to refcnt_dec */
1004 goto restore_sv;
1005 }
1006 }
1007 SvREFCNT_dec(hv);
1008 SvREFCNT_dec(value);
1009 break;
1010 case SAVEt_OP:
1011 PL_op = (OP*)SSPOPPTR;
1012 break;
1013 case SAVEt_HINTS:
1014 if ((PL_hints & HINT_LOCALIZE_HH) && GvHV(PL_hintgv)) {
1015 SvREFCNT_dec(MUTABLE_SV(GvHV(PL_hintgv)));
1016 GvHV(PL_hintgv) = NULL;
1017 }
1018 Perl_refcounted_he_free(aTHX_ PL_compiling.cop_hints_hash);
1019 PL_compiling.cop_hints_hash = (struct refcounted_he *) SSPOPPTR;
1020 *(I32*)&PL_hints = (I32)SSPOPINT;
1021 if (PL_hints & HINT_LOCALIZE_HH) {
1022 SvREFCNT_dec(MUTABLE_SV(GvHV(PL_hintgv)));
1023 GvHV(PL_hintgv) = MUTABLE_HV(SSPOPPTR);
1024 assert(GvHV(PL_hintgv));
1025 } else if (!GvHV(PL_hintgv)) {
1026 /* Need to add a new one manually, else gv_fetchpv() can
1027 add one in this code:
1028
1029 if (SvTYPE(gv) == SVt_PVGV) {
1030 if (add) {
1031 GvMULTI_on(gv);
1032 gv_init_sv(gv, sv_type);
1033 if (*name=='!' && sv_type == SVt_PVHV && len==1)
1034 require_errno(gv);
1035 }
1036 return gv;
1037 }
1038
1039 and it won't have the magic set. */
1040
1041 HV *const hv = newHV();
1042 hv_magic(hv, NULL, PERL_MAGIC_hints);
1043 GvHV(PL_hintgv) = hv;
1044 }
1045 assert(GvHV(PL_hintgv));
1046 break;
1047 case SAVEt_COMPPAD:
1048 PL_comppad = (PAD*)SSPOPPTR;
1049 if (PL_comppad)
1050 PL_curpad = AvARRAY(PL_comppad);
1051 else
1052 PL_curpad = NULL;
1053 break;
1054 case SAVEt_PADSV_AND_MORTALIZE:
1055 {
1056 const PADOFFSET off = (PADOFFSET)SSPOPLONG;
1057 SV **svp;
1058 ptr = SSPOPPTR;
1059 assert (ptr);
1060 svp = AvARRAY((PAD*)ptr) + off;
1061 /* This mortalizing used to be done by POPLOOP() via itersave.
1062 But as we have all the information here, we can do it here,
1063 save even having to have itersave in the struct. */
1064 sv_2mortal(*svp);
1065 *svp = MUTABLE_SV(SSPOPPTR);
1066 }
1067 break;
1068 case SAVEt_SAVESWITCHSTACK:
1069 {
1070 dSP;
1071 AV *const t = MUTABLE_AV(SSPOPPTR);
1072 AV *const f = MUTABLE_AV(SSPOPPTR);
1073 SWITCHSTACK(t,f);
1074 PL_curstackinfo->si_stack = f;
1075 }
1076 break;
1077 case SAVEt_SET_SVFLAGS:
1078 {
1079 const U32 val = (U32)SSPOPINT;
1080 const U32 mask = (U32)SSPOPINT;
1081 sv = MUTABLE_SV(SSPOPPTR);
1082 SvFLAGS(sv) &= ~mask;
1083 SvFLAGS(sv) |= val;
1084 }
1085 break;
1086
1087 /* This would be a mathom, but Perl_save_svref() calls a static
1088 function, S_save_scalar_at(), so has to stay in this file. */
1089 case SAVEt_SVREF: /* scalar reference */
1090 value = MUTABLE_SV(SSPOPPTR);
1091 ptr = SSPOPPTR;
1092 av = NULL; /* what to refcnt_dec */
1093 goto restore_sv;
1094
1095 /* These are only saved in mathoms.c */
1096 case SAVEt_NSTAB:
1097 gv = MUTABLE_GV(SSPOPPTR);
1098 (void)sv_clear(MUTABLE_SV(gv));
1099 break;
1100 case SAVEt_LONG: /* long reference */
1101 ptr = SSPOPPTR;
1102 *(long*)ptr = (long)SSPOPLONG;
1103 break;
1104 case SAVEt_IV: /* IV reference */
1105 ptr = SSPOPPTR;
1106 *(IV*)ptr = (IV)SSPOPIV;
1107 break;
1108
1109 case SAVEt_I16: /* I16 reference */
1110 ptr = SSPOPPTR;
1111 *(I16*)ptr = (I16)(uv >> 8);
1112 break;
1113 case SAVEt_I8: /* I8 reference */
1114 ptr = SSPOPPTR;
1115 *(I8*)ptr = (I8)(uv >> 8);
1116 break;
1117 case SAVEt_DESTRUCTOR:
1118 ptr = SSPOPPTR;
1119 (*SSPOPDPTR)(ptr);
1120 break;
1121 case SAVEt_COP_ARYBASE:
1122 ptr = SSPOPPTR;
1123 i = SSPOPINT;
1124 CopARYBASE_set((COP *)ptr, i);
1125 break;
1126 case SAVEt_COMPILE_WARNINGS:
1127 ptr = SSPOPPTR;
1128
1129 if (!specialWARN(PL_compiling.cop_warnings))
1130 PerlMemShared_free(PL_compiling.cop_warnings);
1131
1132 PL_compiling.cop_warnings = (STRLEN*)ptr;
1133 break;
1134 case SAVEt_RE_STATE:
1135 {
1136 const struct re_save_state *const state
1137 = (struct re_save_state *)
1138 (PL_savestack + PL_savestack_ix
1139 - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
1140 PL_savestack_ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
1141
1142 if (PL_reg_start_tmp != state->re_state_reg_start_tmp) {
1143 Safefree(PL_reg_start_tmp);
1144 }
1145 if (PL_reg_poscache != state->re_state_reg_poscache) {
1146 Safefree(PL_reg_poscache);
1147 }
1148 Copy(state, &PL_reg_state, 1, struct re_save_state);
1149 }
1150 break;
1151 case SAVEt_PARSER:
1152 ptr = SSPOPPTR;
1153 parser_free((yy_parser *) ptr);
1154 break;
1155 default:
1156 Perl_croak(aTHX_ "panic: leave_scope inconsistency");
1157 }
1158 }
1159
1160 PL_tainted = was;
1161
1162 PERL_ASYNC_CHECK();
1163}
1164
1165void
1166Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
1167{
1168 dVAR;
1169
1170 PERL_ARGS_ASSERT_CX_DUMP;
1171
1172#ifdef DEBUGGING
1173 PerlIO_printf(Perl_debug_log, "CX %ld = %s\n", (long)(cx - cxstack), PL_block_type[CxTYPE(cx)]);
1174 if (CxTYPE(cx) != CXt_SUBST) {
1175 PerlIO_printf(Perl_debug_log, "BLK_OLDSP = %ld\n", (long)cx->blk_oldsp);
1176 PerlIO_printf(Perl_debug_log, "BLK_OLDCOP = 0x%"UVxf"\n",
1177 PTR2UV(cx->blk_oldcop));
1178 PerlIO_printf(Perl_debug_log, "BLK_OLDMARKSP = %ld\n", (long)cx->blk_oldmarksp);
1179 PerlIO_printf(Perl_debug_log, "BLK_OLDSCOPESP = %ld\n", (long)cx->blk_oldscopesp);
1180 PerlIO_printf(Perl_debug_log, "BLK_OLDPM = 0x%"UVxf"\n",
1181 PTR2UV(cx->blk_oldpm));
1182 PerlIO_printf(Perl_debug_log, "BLK_GIMME = %s\n", cx->blk_gimme ? "LIST" : "SCALAR");
1183 }
1184 switch (CxTYPE(cx)) {
1185 case CXt_NULL:
1186 case CXt_BLOCK:
1187 break;
1188 case CXt_FORMAT:
1189 PerlIO_printf(Perl_debug_log, "BLK_FORMAT.CV = 0x%"UVxf"\n",
1190 PTR2UV(cx->blk_format.cv));
1191 PerlIO_printf(Perl_debug_log, "BLK_FORMAT.GV = 0x%"UVxf"\n",
1192 PTR2UV(cx->blk_format.gv));
1193 PerlIO_printf(Perl_debug_log, "BLK_FORMAT.DFOUTGV = 0x%"UVxf"\n",
1194 PTR2UV(cx->blk_format.dfoutgv));
1195 PerlIO_printf(Perl_debug_log, "BLK_FORMAT.HASARGS = %d\n",
1196 (int)CxHASARGS(cx));
1197 PerlIO_printf(Perl_debug_log, "BLK_FORMAT.RETOP = 0x%"UVxf"\n",
1198 PTR2UV(cx->blk_format.retop));
1199 break;
1200 case CXt_SUB:
1201 PerlIO_printf(Perl_debug_log, "BLK_SUB.CV = 0x%"UVxf"\n",
1202 PTR2UV(cx->blk_sub.cv));
1203 PerlIO_printf(Perl_debug_log, "BLK_SUB.OLDDEPTH = %ld\n",
1204 (long)cx->blk_sub.olddepth);
1205 PerlIO_printf(Perl_debug_log, "BLK_SUB.HASARGS = %d\n",
1206 (int)CxHASARGS(cx));
1207 PerlIO_printf(Perl_debug_log, "BLK_SUB.LVAL = %d\n", (int)CxLVAL(cx));
1208 PerlIO_printf(Perl_debug_log, "BLK_SUB.RETOP = 0x%"UVxf"\n",
1209 PTR2UV(cx->blk_sub.retop));
1210 break;
1211 case CXt_EVAL:
1212 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_IN_EVAL = %ld\n",
1213 (long)CxOLD_IN_EVAL(cx));
1214 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_OP_TYPE = %s (%s)\n",
1215 PL_op_name[CxOLD_OP_TYPE(cx)],
1216 PL_op_desc[CxOLD_OP_TYPE(cx)]);
1217 if (cx->blk_eval.old_namesv)
1218 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_NAME = %s\n",
1219 SvPVX_const(cx->blk_eval.old_namesv));
1220 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_EVAL_ROOT = 0x%"UVxf"\n",
1221 PTR2UV(cx->blk_eval.old_eval_root));
1222 PerlIO_printf(Perl_debug_log, "BLK_EVAL.RETOP = 0x%"UVxf"\n",
1223 PTR2UV(cx->blk_eval.retop));
1224 break;
1225
1226 case CXt_LOOP_LAZYIV:
1227 case CXt_LOOP_LAZYSV:
1228 case CXt_LOOP_FOR:
1229 case CXt_LOOP_PLAIN:
1230 PerlIO_printf(Perl_debug_log, "BLK_LOOP.LABEL = %s\n", CxLABEL(cx));
1231 PerlIO_printf(Perl_debug_log, "BLK_LOOP.RESETSP = %ld\n",
1232 (long)cx->blk_loop.resetsp);
1233 PerlIO_printf(Perl_debug_log, "BLK_LOOP.MY_OP = 0x%"UVxf"\n",
1234 PTR2UV(cx->blk_loop.my_op));
1235 PerlIO_printf(Perl_debug_log, "BLK_LOOP.NEXT_OP = 0x%"UVxf"\n",
1236 PTR2UV(CX_LOOP_NEXTOP_GET(cx)));
1237 /* XXX: not accurate for LAZYSV/IV */
1238 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERARY = 0x%"UVxf"\n",
1239 PTR2UV(cx->blk_loop.state_u.ary.ary));
1240 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERIX = %ld\n",
1241 (long)cx->blk_loop.state_u.ary.ix);
1242 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERVAR = 0x%"UVxf"\n",
1243 PTR2UV(CxITERVAR(cx)));
1244 break;
1245
1246 case CXt_SUBST:
1247 PerlIO_printf(Perl_debug_log, "SB_ITERS = %ld\n",
1248 (long)cx->sb_iters);
1249 PerlIO_printf(Perl_debug_log, "SB_MAXITERS = %ld\n",
1250 (long)cx->sb_maxiters);
1251 PerlIO_printf(Perl_debug_log, "SB_RFLAGS = %ld\n",
1252 (long)cx->sb_rflags);
1253 PerlIO_printf(Perl_debug_log, "SB_ONCE = %ld\n",
1254 (long)CxONCE(cx));
1255 PerlIO_printf(Perl_debug_log, "SB_ORIG = %s\n",
1256 cx->sb_orig);
1257 PerlIO_printf(Perl_debug_log, "SB_DSTR = 0x%"UVxf"\n",
1258 PTR2UV(cx->sb_dstr));
1259 PerlIO_printf(Perl_debug_log, "SB_TARG = 0x%"UVxf"\n",
1260 PTR2UV(cx->sb_targ));
1261 PerlIO_printf(Perl_debug_log, "SB_S = 0x%"UVxf"\n",
1262 PTR2UV(cx->sb_s));
1263 PerlIO_printf(Perl_debug_log, "SB_M = 0x%"UVxf"\n",
1264 PTR2UV(cx->sb_m));
1265 PerlIO_printf(Perl_debug_log, "SB_STREND = 0x%"UVxf"\n",
1266 PTR2UV(cx->sb_strend));
1267 PerlIO_printf(Perl_debug_log, "SB_RXRES = 0x%"UVxf"\n",
1268 PTR2UV(cx->sb_rxres));
1269 break;
1270 }
1271#else
1272 PERL_UNUSED_CONTEXT;
1273 PERL_UNUSED_ARG(cx);
1274#endif /* DEBUGGING */
1275}
1276
1277/*
1278 * Local variables:
1279 * c-indentation-style: bsd
1280 * c-basic-offset: 4
1281 * indent-tabs-mode: t
1282 * End:
1283 *
1284 * ex: set ts=8 sts=4 sw=4 noet:
1285 */