This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
update size after Renew
[perl5.git] / scope.c
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
29 SV**
30 Perl_stack_grow(pTHX_ SV **sp, SV **p, SSize_t n)
31 {
32     SSize_t extra;
33     SSize_t current = (p - PL_stack_base);
34
35     PERL_ARGS_ASSERT_STACK_GROW;
36
37     if (UNLIKELY(n < 0))
38         Perl_croak(aTHX_
39             "panic: stack_grow() negative count (%" IVdf ")", (IV)n);
40
41     PL_stack_sp = sp;
42     extra =
43 #ifdef STRESS_REALLOC
44         1;
45 #else
46         128;
47 #endif
48     /* If the total might wrap, panic instead. This is really testing
49      * that (current + n + extra < SSize_t_MAX), but done in a way that
50      * can't wrap */
51     if (UNLIKELY(   current         > SSize_t_MAX - extra
52                  || current + extra > SSize_t_MAX - n
53     ))
54         /* diag_listed_as: Out of memory during %s extend */
55         Perl_croak(aTHX_ "Out of memory during stack extend");
56
57     av_extend(PL_curstack, current + n + extra);
58     return PL_stack_sp;
59 }
60
61 #ifndef STRESS_REALLOC
62 #define GROW(old) ((old) * 3 / 2)
63 #else
64 #define GROW(old) ((old) + 1)
65 #endif
66
67 PERL_SI *
68 Perl_new_stackinfo(pTHX_ I32 stitems, I32 cxitems)
69 {
70     PERL_SI *si;
71     Newx(si, 1, PERL_SI);
72     si->si_stack = newAV();
73     AvREAL_off(si->si_stack);
74     av_extend(si->si_stack, stitems > 0 ? stitems-1 : 0);
75     AvALLOC(si->si_stack)[0] = &PL_sv_undef;
76     AvFILLp(si->si_stack) = 0;
77     si->si_prev = 0;
78     si->si_next = 0;
79     si->si_cxmax = cxitems - 1;
80     si->si_cxix = -1;
81     si->si_type = PERLSI_UNDEF;
82     Newx(si->si_cxstack, cxitems, PERL_CONTEXT);
83     /* Without any kind of initialising CX_PUSHSUBST()
84      * in pp_subst() will read uninitialised heap. */
85     PoisonNew(si->si_cxstack, cxitems, PERL_CONTEXT);
86     return si;
87 }
88
89 I32
90 Perl_cxinc(pTHX)
91 {
92     const IV old_max = cxstack_max;
93     const IV new_max = GROW(cxstack_max);
94     Renew(cxstack, new_max + 1, PERL_CONTEXT);
95     cxstack_max = new_max;
96     /* Without any kind of initialising deep enough recursion
97      * will end up reading uninitialised PERL_CONTEXTs. */
98     PoisonNew(cxstack + old_max + 1, new_max - old_max, PERL_CONTEXT);
99     return cxstack_ix + 1;
100 }
101
102 void
103 Perl_push_scope(pTHX)
104 {
105     if (UNLIKELY(PL_scopestack_ix == PL_scopestack_max)) {
106         const IV new_max = GROW(PL_scopestack_max);
107         Renew(PL_scopestack, new_max, I32);
108 #ifdef DEBUGGING
109         Renew(PL_scopestack_name, new_max, const char*);
110 #endif
111         PL_scopestack_max = new_max;
112     }
113 #ifdef DEBUGGING
114     PL_scopestack_name[PL_scopestack_ix] = "unknown";
115 #endif
116     PL_scopestack[PL_scopestack_ix++] = PL_savestack_ix;
117
118 }
119
120 void
121 Perl_pop_scope(pTHX)
122 {
123     const I32 oldsave = PL_scopestack[--PL_scopestack_ix];
124     LEAVE_SCOPE(oldsave);
125 }
126
127 I32 *
128 Perl_markstack_grow(pTHX)
129 {
130     const I32 oldmax = PL_markstack_max - PL_markstack;
131     const I32 newmax = GROW(oldmax);
132
133     Renew(PL_markstack, newmax, I32);
134     PL_markstack_max = PL_markstack + newmax;
135     PL_markstack_ptr = PL_markstack + oldmax;
136     DEBUG_s(DEBUG_v(PerlIO_printf(Perl_debug_log,
137             "MARK grow %p %" IVdf " by %" IVdf "\n",
138             PL_markstack_ptr, (IV)*PL_markstack_ptr, (IV)oldmax)));
139     return PL_markstack_ptr;
140 }
141
142 void
143 Perl_savestack_grow(pTHX)
144 {
145     IV new_max;
146 #ifdef STRESS_REALLOC
147     new_max = PL_savestack_max + SS_MAXPUSH;
148 #else
149     new_max = GROW(PL_savestack_max);
150 #endif
151     /* Note that we allocate SS_MAXPUSH slots higher than ss_max
152      * so that SS_ADD_END(), SSGROW() etc can do a simper check */
153     Renew(PL_savestack, new_max + SS_MAXPUSH, ANY);
154     PL_savestack_max = new_max;
155 }
156
157 void
158 Perl_savestack_grow_cnt(pTHX_ I32 need)
159 {
160     const IV new_max = PL_savestack_ix + need;
161     /* Note that we allocate SS_MAXPUSH slots higher than ss_max
162      * so that SS_ADD_END(), SSGROW() etc can do a simper check */
163     Renew(PL_savestack, new_max + SS_MAXPUSH, ANY);
164     PL_savestack_max = new_max;
165 }
166
167 #undef GROW
168
169 /*  The original function was called Perl_tmps_grow and was removed from public
170     API, Perl_tmps_grow_p is the replacement and it used in public macros but
171     isn't public itself.
172
173     Perl_tmps_grow_p takes a proposed ix. A proposed ix is PL_tmps_ix + extend_by,
174     where the result of (PL_tmps_ix + extend_by) is >= PL_tmps_max
175     Upon return, PL_tmps_stack[ix] will be a valid address. For machine code
176     optimization and register usage reasons, the proposed ix passed into
177     tmps_grow is returned to the caller which the caller can then use to write
178     an SV * to PL_tmps_stack[ix]. If the caller was using tmps_grow in
179     pre-extend mode (EXTEND_MORTAL macro), then it ignores the return value of
180     tmps_grow. Note, tmps_grow DOES NOT write ix to PL_tmps_ix, the caller
181     must assign ix or ret val of tmps_grow to PL_temps_ix themselves if that is
182     appropriate. The assignment to PL_temps_ix can happen before or after
183     tmps_grow call since tmps_grow doesn't look at PL_tmps_ix.
184  */
185
186 SSize_t
187 Perl_tmps_grow_p(pTHX_ SSize_t ix)
188 {
189     SSize_t extend_to = ix;
190 #ifndef STRESS_REALLOC
191     if (ix - PL_tmps_max < 128)
192         extend_to += (PL_tmps_max < 512) ? 128 : 512;
193 #endif
194     Renew(PL_tmps_stack, extend_to + 1, SV*);
195     PL_tmps_max = extend_to + 1;
196     return ix;
197 }
198
199
200 void
201 Perl_free_tmps(pTHX)
202 {
203     /* XXX should tmps_floor live in cxstack? */
204     const SSize_t myfloor = PL_tmps_floor;
205     while (PL_tmps_ix > myfloor) {      /* clean up after last statement */
206         SV* const sv = PL_tmps_stack[PL_tmps_ix--];
207 #ifdef PERL_POISON
208         PoisonWith(PL_tmps_stack + PL_tmps_ix + 1, 1, SV *, 0xAB);
209 #endif
210         if (LIKELY(sv)) {
211             SvTEMP_off(sv);
212             SvREFCNT_dec_NN(sv);                /* note, can modify tmps_ix!!! */
213         }
214     }
215 }
216
217 STATIC SV *
218 S_save_scalar_at(pTHX_ SV **sptr, const U32 flags)
219 {
220     SV * osv;
221     SV *sv;
222
223     PERL_ARGS_ASSERT_SAVE_SCALAR_AT;
224
225     osv = *sptr;
226     if (flags & SAVEf_KEEPOLDELEM)
227         sv = osv;
228     else {
229         sv  = (*sptr = newSV(0));
230         if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(osv))
231             mg_localize(osv, sv, cBOOL(flags & SAVEf_SETMAGIC));
232     }
233
234     return sv;
235 }
236
237 void
238 Perl_save_pushptrptr(pTHX_ void *const ptr1, void *const ptr2, const int type)
239 {
240     dSS_ADD;
241     SS_ADD_PTR(ptr1);
242     SS_ADD_PTR(ptr2);
243     SS_ADD_UV(type);
244     SS_ADD_END(3);
245 }
246
247 SV *
248 Perl_save_scalar(pTHX_ GV *gv)
249 {
250     SV ** const sptr = &GvSVn(gv);
251
252     PERL_ARGS_ASSERT_SAVE_SCALAR;
253
254     if (UNLIKELY(SvGMAGICAL(*sptr))) {
255         PL_localizing = 1;
256         (void)mg_get(*sptr);
257         PL_localizing = 0;
258     }
259     save_pushptrptr(SvREFCNT_inc_simple(gv), SvREFCNT_inc(*sptr), SAVEt_SV);
260     return save_scalar_at(sptr, SAVEf_SETMAGIC); /* XXX - FIXME - see #60360 */
261 }
262
263 /* Like save_sptr(), but also SvREFCNT_dec()s the new value.  Can be used to
264  * restore a global SV to its prior contents, freeing new value. */
265 void
266 Perl_save_generic_svref(pTHX_ SV **sptr)
267 {
268     PERL_ARGS_ASSERT_SAVE_GENERIC_SVREF;
269
270     save_pushptrptr(sptr, SvREFCNT_inc(*sptr), SAVEt_GENERIC_SVREF);
271 }
272
273 /* Like save_pptr(), but also Safefree()s the new value if it is different
274  * from the old one.  Can be used to restore a global char* to its prior
275  * contents, freeing new value. */
276 void
277 Perl_save_generic_pvref(pTHX_ char **str)
278 {
279     PERL_ARGS_ASSERT_SAVE_GENERIC_PVREF;
280
281     save_pushptrptr(*str, str, SAVEt_GENERIC_PVREF);
282 }
283
284 /* Like save_generic_pvref(), but uses PerlMemShared_free() rather than Safefree().
285  * Can be used to restore a shared global char* to its prior
286  * contents, freeing new value. */
287 void
288 Perl_save_shared_pvref(pTHX_ char **str)
289 {
290     PERL_ARGS_ASSERT_SAVE_SHARED_PVREF;
291
292     save_pushptrptr(str, *str, SAVEt_SHARED_PVREF);
293 }
294
295 /* set the SvFLAGS specified by mask to the values in val */
296
297 void
298 Perl_save_set_svflags(pTHX_ SV* sv, U32 mask, U32 val)
299 {
300     dSS_ADD;
301
302     PERL_ARGS_ASSERT_SAVE_SET_SVFLAGS;
303
304     SS_ADD_PTR(sv);
305     SS_ADD_INT(mask);
306     SS_ADD_INT(val);
307     SS_ADD_UV(SAVEt_SET_SVFLAGS);
308     SS_ADD_END(4);
309 }
310
311 /*
312 =for apidoc save_gp
313
314 Saves the current GP of gv on the save stack to be restored on scope exit.
315
316 If empty is true, replace the GP with a new GP.
317
318 If empty is false, mark gv with GVf_INTRO so the next reference
319 assigned is localized, which is how C< local *foo = $someref; > works.
320
321 =cut
322 */
323
324 void
325 Perl_save_gp(pTHX_ GV *gv, I32 empty)
326 {
327     PERL_ARGS_ASSERT_SAVE_GP;
328
329     save_pushptrptr(SvREFCNT_inc(gv), GvGP(gv), SAVEt_GP);
330
331     if (empty) {
332         GP *gp = Perl_newGP(aTHX_ gv);
333         HV * const stash = GvSTASH(gv);
334         bool isa_changed = 0;
335
336         if (stash && HvENAME(stash)) {
337             if (GvNAMELEN(gv) == 3 && strnEQ(GvNAME(gv), "ISA", 3))
338                 isa_changed = TRUE;
339             else if (GvCVu(gv))
340                 /* taking a method out of circulation ("local")*/
341                 mro_method_changed_in(stash);
342         }
343         if (GvIOp(gv) && (IoFLAGS(GvIOp(gv)) & IOf_ARGV)) {
344             gp->gp_io = newIO();
345             IoFLAGS(gp->gp_io) |= IOf_ARGV|IOf_START;
346         }
347         GvGP_set(gv,gp);
348         if (isa_changed) mro_isa_changed_in(stash);
349     }
350     else {
351         gp_ref(GvGP(gv));
352         GvINTRO_on(gv);
353     }
354 }
355
356 AV *
357 Perl_save_ary(pTHX_ GV *gv)
358 {
359     AV * const oav = GvAVn(gv);
360     AV *av;
361
362     PERL_ARGS_ASSERT_SAVE_ARY;
363
364     if (UNLIKELY(!AvREAL(oav) && AvREIFY(oav)))
365         av_reify(oav);
366     save_pushptrptr(SvREFCNT_inc_simple_NN(gv), oav, SAVEt_AV);
367
368     GvAV(gv) = NULL;
369     av = GvAVn(gv);
370     if (UNLIKELY(SvMAGIC(oav)))
371         mg_localize(MUTABLE_SV(oav), MUTABLE_SV(av), TRUE);
372     return av;
373 }
374
375 HV *
376 Perl_save_hash(pTHX_ GV *gv)
377 {
378     HV *ohv, *hv;
379
380     PERL_ARGS_ASSERT_SAVE_HASH;
381
382     save_pushptrptr(
383         SvREFCNT_inc_simple_NN(gv), (ohv = GvHVn(gv)), SAVEt_HV
384     );
385
386     GvHV(gv) = NULL;
387     hv = GvHVn(gv);
388     if (UNLIKELY(SvMAGIC(ohv)))
389         mg_localize(MUTABLE_SV(ohv), MUTABLE_SV(hv), TRUE);
390     return hv;
391 }
392
393 void
394 Perl_save_item(pTHX_ SV *item)
395 {
396     SV * const sv = newSVsv(item);
397
398     PERL_ARGS_ASSERT_SAVE_ITEM;
399
400     save_pushptrptr(item, /* remember the pointer */
401                     sv,   /* remember the value */
402                     SAVEt_ITEM);
403 }
404
405 void
406 Perl_save_bool(pTHX_ bool *boolp)
407 {
408     dSS_ADD;
409
410     PERL_ARGS_ASSERT_SAVE_BOOL;
411
412     SS_ADD_PTR(boolp);
413     SS_ADD_UV(SAVEt_BOOL | (*boolp << 8));
414     SS_ADD_END(2);
415 }
416
417 void
418 Perl_save_pushi32ptr(pTHX_ const I32 i, void *const ptr, const int type)
419 {
420     dSS_ADD;
421
422     SS_ADD_INT(i);
423     SS_ADD_PTR(ptr);
424     SS_ADD_UV(type);
425     SS_ADD_END(3);
426 }
427
428 void
429 Perl_save_int(pTHX_ int *intp)
430 {
431     const int i = *intp;
432     UV type = ((UV)((UV)i << SAVE_TIGHT_SHIFT) | SAVEt_INT_SMALL);
433     int size = 2;
434     dSS_ADD;
435
436     PERL_ARGS_ASSERT_SAVE_INT;
437
438     if (UNLIKELY((int)(type >> SAVE_TIGHT_SHIFT) != i)) {
439         SS_ADD_INT(i);
440         type = SAVEt_INT;
441         size++;
442     }
443     SS_ADD_PTR(intp);
444     SS_ADD_UV(type);
445     SS_ADD_END(size);
446 }
447
448 void
449 Perl_save_I8(pTHX_ I8 *bytep)
450 {
451     dSS_ADD;
452
453     PERL_ARGS_ASSERT_SAVE_I8;
454
455     SS_ADD_PTR(bytep);
456     SS_ADD_UV(SAVEt_I8 | ((UV)*bytep << 8));
457     SS_ADD_END(2);
458 }
459
460 void
461 Perl_save_I16(pTHX_ I16 *intp)
462 {
463     dSS_ADD;
464
465     PERL_ARGS_ASSERT_SAVE_I16;
466
467     SS_ADD_PTR(intp);
468     SS_ADD_UV(SAVEt_I16 | ((UV)*intp << 8));
469     SS_ADD_END(2);
470 }
471
472 void
473 Perl_save_I32(pTHX_ I32 *intp)
474 {
475     const I32 i = *intp;
476     UV type = ((I32)((U32)i << SAVE_TIGHT_SHIFT) | SAVEt_I32_SMALL);
477     int size = 2;
478     dSS_ADD;
479
480     PERL_ARGS_ASSERT_SAVE_I32;
481
482     if (UNLIKELY((I32)(type >> SAVE_TIGHT_SHIFT) != i)) {
483         SS_ADD_INT(i);
484         type = SAVEt_I32;
485         size++;
486     }
487     SS_ADD_PTR(intp);
488     SS_ADD_UV(type);
489     SS_ADD_END(size);
490 }
491
492 void
493 Perl_save_strlen(pTHX_ STRLEN *ptr)
494 {
495     dSS_ADD;
496
497     PERL_ARGS_ASSERT_SAVE_STRLEN;
498
499     SS_ADD_IV(*ptr);
500     SS_ADD_PTR(ptr);
501     SS_ADD_UV(SAVEt_STRLEN);
502     SS_ADD_END(3);
503 }
504
505 void
506 Perl_save_iv(pTHX_ IV *ivp)
507 {
508     PERL_ARGS_ASSERT_SAVE_IV;
509
510     SSCHECK(3);
511     SSPUSHIV(*ivp);
512     SSPUSHPTR(ivp);
513     SSPUSHUV(SAVEt_IV);
514 }
515
516 /* Cannot use save_sptr() to store a char* since the SV** cast will
517  * force word-alignment and we'll miss the pointer.
518  */
519 void
520 Perl_save_pptr(pTHX_ char **pptr)
521 {
522     PERL_ARGS_ASSERT_SAVE_PPTR;
523
524     save_pushptrptr(*pptr, pptr, SAVEt_PPTR);
525 }
526
527 void
528 Perl_save_vptr(pTHX_ void *ptr)
529 {
530     PERL_ARGS_ASSERT_SAVE_VPTR;
531
532     save_pushptrptr(*(char**)ptr, ptr, SAVEt_VPTR);
533 }
534
535 void
536 Perl_save_sptr(pTHX_ SV **sptr)
537 {
538     PERL_ARGS_ASSERT_SAVE_SPTR;
539
540     save_pushptrptr(*sptr, sptr, SAVEt_SPTR);
541 }
542
543 void
544 Perl_save_padsv_and_mortalize(pTHX_ PADOFFSET off)
545 {
546     dSS_ADD;
547
548     ASSERT_CURPAD_ACTIVE("save_padsv");
549     SS_ADD_PTR(SvREFCNT_inc_simple_NN(PL_curpad[off]));
550     SS_ADD_PTR(PL_comppad);
551     SS_ADD_UV((UV)off);
552     SS_ADD_UV(SAVEt_PADSV_AND_MORTALIZE);
553     SS_ADD_END(4);
554 }
555
556 void
557 Perl_save_hptr(pTHX_ HV **hptr)
558 {
559     PERL_ARGS_ASSERT_SAVE_HPTR;
560
561     save_pushptrptr(*hptr, hptr, SAVEt_HPTR);
562 }
563
564 void
565 Perl_save_aptr(pTHX_ AV **aptr)
566 {
567     PERL_ARGS_ASSERT_SAVE_APTR;
568
569     save_pushptrptr(*aptr, aptr, SAVEt_APTR);
570 }
571
572 void
573 Perl_save_pushptr(pTHX_ void *const ptr, const int type)
574 {
575     dSS_ADD;
576     SS_ADD_PTR(ptr);
577     SS_ADD_UV(type);
578     SS_ADD_END(2);
579 }
580
581 void
582 Perl_save_clearsv(pTHX_ SV **svp)
583 {
584     const UV offset = svp - PL_curpad;
585     const UV offset_shifted = offset << SAVE_TIGHT_SHIFT;
586
587     PERL_ARGS_ASSERT_SAVE_CLEARSV;
588
589     ASSERT_CURPAD_ACTIVE("save_clearsv");
590     SvPADSTALE_off(*svp); /* mark lexical as active */
591     if (UNLIKELY((offset_shifted >> SAVE_TIGHT_SHIFT) != offset)) {
592         Perl_croak(aTHX_ "panic: pad offset %" UVuf " out of range (%p-%p)",
593                    offset, svp, PL_curpad);
594     }
595
596     {
597         dSS_ADD;
598         SS_ADD_UV(offset_shifted | SAVEt_CLEARSV);
599         SS_ADD_END(1);
600     }
601 }
602
603 void
604 Perl_save_delete(pTHX_ HV *hv, char *key, I32 klen)
605 {
606     PERL_ARGS_ASSERT_SAVE_DELETE;
607
608     save_pushptri32ptr(key, klen, SvREFCNT_inc_simple(hv), SAVEt_DELETE);
609 }
610
611 void
612 Perl_save_hdelete(pTHX_ HV *hv, SV *keysv)
613 {
614     STRLEN len;
615     I32 klen;
616     const char *key;
617
618     PERL_ARGS_ASSERT_SAVE_HDELETE;
619
620     key  = SvPV_const(keysv, len);
621     klen = SvUTF8(keysv) ? -(I32)len : (I32)len;
622     SvREFCNT_inc_simple_void_NN(hv);
623     save_pushptri32ptr(savepvn(key, len), klen, hv, SAVEt_DELETE);
624 }
625
626 void
627 Perl_save_adelete(pTHX_ AV *av, SSize_t key)
628 {
629     dSS_ADD;
630
631     PERL_ARGS_ASSERT_SAVE_ADELETE;
632
633     SvREFCNT_inc_void(av);
634     SS_ADD_UV(key);
635     SS_ADD_PTR(av);
636     SS_ADD_IV(SAVEt_ADELETE);
637     SS_ADD_END(3);
638 }
639
640 void
641 Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p)
642 {
643     dSS_ADD;
644     PERL_ARGS_ASSERT_SAVE_DESTRUCTOR;
645
646     SS_ADD_DPTR(f);
647     SS_ADD_PTR(p);
648     SS_ADD_UV(SAVEt_DESTRUCTOR);
649     SS_ADD_END(3);
650 }
651
652 void
653 Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p)
654 {
655     dSS_ADD;
656
657     SS_ADD_DXPTR(f);
658     SS_ADD_PTR(p);
659     SS_ADD_UV(SAVEt_DESTRUCTOR_X);
660     SS_ADD_END(3);
661 }
662
663 void
664 Perl_save_hints(pTHX)
665 {
666     COPHH *save_cophh = cophh_copy(CopHINTHASH_get(&PL_compiling));
667     if (PL_hints & HINT_LOCALIZE_HH) {
668         HV *oldhh = GvHV(PL_hintgv);
669         save_pushptri32ptr(oldhh, PL_hints, save_cophh, SAVEt_HINTS);
670         GvHV(PL_hintgv) = NULL; /* in case copying dies */
671         GvHV(PL_hintgv) = hv_copy_hints_hv(oldhh);
672     } else {
673         save_pushi32ptr(PL_hints, save_cophh, SAVEt_HINTS);
674     }
675 }
676
677 static void
678 S_save_pushptri32ptr(pTHX_ void *const ptr1, const I32 i, void *const ptr2,
679                         const int type)
680 {
681     dSS_ADD;
682     SS_ADD_PTR(ptr1);
683     SS_ADD_INT(i);
684     SS_ADD_PTR(ptr2);
685     SS_ADD_UV(type);
686     SS_ADD_END(4);
687 }
688
689 void
690 Perl_save_aelem_flags(pTHX_ AV *av, SSize_t idx, SV **sptr,
691                             const U32 flags)
692 {
693     dSS_ADD;
694     SV *sv;
695
696     PERL_ARGS_ASSERT_SAVE_AELEM_FLAGS;
697
698     SvGETMAGIC(*sptr);
699     SS_ADD_PTR(SvREFCNT_inc_simple(av));
700     SS_ADD_IV(idx);
701     SS_ADD_PTR(SvREFCNT_inc(*sptr));
702     SS_ADD_UV(SAVEt_AELEM);
703     SS_ADD_END(4);
704     /* The array needs to hold a reference count on its new element, so it
705        must be AvREAL. */
706     if (UNLIKELY(!AvREAL(av) && AvREIFY(av)))
707         av_reify(av);
708     save_scalar_at(sptr, flags); /* XXX - FIXME - see #60360 */
709     if (flags & SAVEf_KEEPOLDELEM)
710         return;
711     sv = *sptr;
712     /* If we're localizing a tied array element, this new sv
713      * won't actually be stored in the array - so it won't get
714      * reaped when the localize ends. Ensure it gets reaped by
715      * mortifying it instead. DAPM */
716     if (UNLIKELY(SvTIED_mg((const SV *)av, PERL_MAGIC_tied)))
717         sv_2mortal(sv);
718 }
719
720 void
721 Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags)
722 {
723     SV *sv;
724
725     PERL_ARGS_ASSERT_SAVE_HELEM_FLAGS;
726
727     SvGETMAGIC(*sptr);
728     {
729         dSS_ADD;
730         SS_ADD_PTR(SvREFCNT_inc_simple(hv));
731         SS_ADD_PTR(newSVsv(key));
732         SS_ADD_PTR(SvREFCNT_inc(*sptr));
733         SS_ADD_UV(SAVEt_HELEM);
734         SS_ADD_END(4);
735     }
736     save_scalar_at(sptr, flags);
737     if (flags & SAVEf_KEEPOLDELEM)
738         return;
739     sv = *sptr;
740     /* If we're localizing a tied hash element, this new sv
741      * won't actually be stored in the hash - so it won't get
742      * reaped when the localize ends. Ensure it gets reaped by
743      * mortifying it instead. DAPM */
744     if (UNLIKELY(SvTIED_mg((const SV *)hv, PERL_MAGIC_tied)))
745         sv_2mortal(sv);
746 }
747
748 SV*
749 Perl_save_svref(pTHX_ SV **sptr)
750 {
751     PERL_ARGS_ASSERT_SAVE_SVREF;
752
753     SvGETMAGIC(*sptr);
754     save_pushptrptr(sptr, SvREFCNT_inc(*sptr), SAVEt_SVREF);
755     return save_scalar_at(sptr, SAVEf_SETMAGIC); /* XXX - FIXME - see #60360 */
756 }
757
758
759 void
760 Perl_savetmps(pTHX)
761 {
762     dSS_ADD;
763     SS_ADD_IV(PL_tmps_floor);
764     PL_tmps_floor = PL_tmps_ix;
765     SS_ADD_UV(SAVEt_TMPSFLOOR);
766     SS_ADD_END(2);
767 }
768
769
770 I32
771 Perl_save_alloc(pTHX_ I32 size, I32 pad)
772 {
773     const I32 start = pad + ((char*)&PL_savestack[PL_savestack_ix]
774                           - (char*)PL_savestack);
775     const UV elems = 1 + ((size + pad - 1) / sizeof(*PL_savestack));
776     const UV elems_shifted = elems << SAVE_TIGHT_SHIFT;
777
778     if (UNLIKELY((elems_shifted >> SAVE_TIGHT_SHIFT) != elems))
779         Perl_croak(aTHX_
780             "panic: save_alloc elems %" UVuf " out of range (%" IVdf "-%" IVdf ")",
781                    elems, (IV)size, (IV)pad);
782
783     SSGROW(elems + 1);
784
785     PL_savestack_ix += elems;
786     SSPUSHUV(SAVEt_ALLOC | elems_shifted);
787     return start;
788 }
789
790
791 static U8 arg_counts[] = {
792     0, /* SAVEt_ALLOC              */
793     0, /* SAVEt_CLEARPADRANGE      */
794     0, /* SAVEt_CLEARSV            */
795     0, /* SAVEt_REGCONTEXT         */
796     1, /* SAVEt_TMPSFLOOR          */
797     1, /* SAVEt_BOOL               */
798     1, /* SAVEt_COMPILE_WARNINGS   */
799     1, /* SAVEt_COMPPAD            */
800     1, /* SAVEt_FREECOPHH          */
801     1, /* SAVEt_FREEOP             */
802     1, /* SAVEt_FREEPV             */
803     1, /* SAVEt_FREESV             */
804     1, /* SAVEt_I16                */
805     1, /* SAVEt_I32_SMALL          */
806     1, /* SAVEt_I8                 */
807     1, /* SAVEt_INT_SMALL          */
808     1, /* SAVEt_MORTALIZESV        */
809     1, /* SAVEt_NSTAB              */
810     1, /* SAVEt_OP                 */
811     1, /* SAVEt_PARSER             */
812     1, /* SAVEt_STACK_POS          */
813     1, /* SAVEt_READONLY_OFF       */
814     1, /* SAVEt_FREEPADNAME        */
815     2, /* SAVEt_AV                 */
816     2, /* SAVEt_DESTRUCTOR         */
817     2, /* SAVEt_DESTRUCTOR_X       */
818     2, /* SAVEt_GENERIC_PVREF      */
819     2, /* SAVEt_GENERIC_SVREF      */
820     2, /* SAVEt_GP                 */
821     2, /* SAVEt_GVSV               */
822     2, /* SAVEt_HINTS              */
823     2, /* SAVEt_HPTR               */
824     2, /* SAVEt_HV                 */
825     2, /* SAVEt_I32                */
826     2, /* SAVEt_INT                */
827     2, /* SAVEt_ITEM               */
828     2, /* SAVEt_IV                 */
829     2, /* SAVEt_LONG               */
830     2, /* SAVEt_PPTR               */
831     2, /* SAVEt_SAVESWITCHSTACK    */
832     2, /* SAVEt_SHARED_PVREF       */
833     2, /* SAVEt_SPTR               */
834     2, /* SAVEt_STRLEN             */
835     2, /* SAVEt_SV                 */
836     2, /* SAVEt_SVREF              */
837     2, /* SAVEt_VPTR               */
838     2, /* SAVEt_ADELETE            */
839     2, /* SAVEt_APTR               */
840     3, /* SAVEt_HELEM              */
841     3, /* SAVEt_PADSV_AND_MORTALIZE*/
842     3, /* SAVEt_SET_SVFLAGS        */
843     3, /* SAVEt_GVSLOT             */
844     3, /* SAVEt_AELEM              */
845     3  /* SAVEt_DELETE             */
846 };
847
848
849 void
850 Perl_leave_scope(pTHX_ I32 base)
851 {
852     /* Localise the effects of the TAINT_NOT inside the loop.  */
853     bool was = TAINT_get;
854
855     if (UNLIKELY(base < -1))
856         Perl_croak(aTHX_ "panic: corrupt saved stack index %ld", (long) base);
857     DEBUG_l(Perl_deb(aTHX_ "savestack: releasing items %ld -> %ld\n",
858                         (long)PL_savestack_ix, (long)base));
859     while (PL_savestack_ix > base) {
860         UV uv;
861         U8 type;
862         ANY *ap; /* arg pointer */
863         ANY a0, a1, a2; /* up to 3 args */
864
865         TAINT_NOT;
866
867         {
868             U8  argcount;
869             I32 ix = PL_savestack_ix - 1;
870
871             ap = &PL_savestack[ix];
872             uv = ap->any_uv;
873             type = (U8)uv & SAVE_MASK;
874             argcount = arg_counts[type];
875             PL_savestack_ix = ix - argcount;
876             ap -= argcount;
877         }
878
879         switch (type) {
880         case SAVEt_ITEM:                        /* normal string */
881             a0 = ap[0]; a1 = ap[1];
882             sv_replace(a0.any_sv, a1.any_sv);
883             if (UNLIKELY(SvSMAGICAL(a0.any_sv))) {
884                 PL_localizing = 2;
885                 mg_set(a0.any_sv);
886                 PL_localizing = 0;
887             }
888             break;
889
890             /* This would be a mathom, but Perl_save_svref() calls a static
891                function, S_save_scalar_at(), so has to stay in this file.  */
892         case SAVEt_SVREF:                       /* scalar reference */
893             a0 = ap[0]; a1 = ap[1];
894             a2.any_svp = a0.any_svp;
895             a0.any_sv = NULL; /* what to refcnt_dec */
896             goto restore_sv;
897
898         case SAVEt_SV:                          /* scalar reference */
899             a0 = ap[0]; a1 = ap[1];
900             a2.any_svp = &GvSV(a0.any_gv);
901         restore_sv:
902         {
903             /* do *a2.any_svp = a1 and free a0 */
904             SV * const sv = *a2.any_svp;
905             *a2.any_svp = a1.any_sv;
906             SvREFCNT_dec(sv);
907             if (UNLIKELY(SvSMAGICAL(a1.any_sv))) {
908                 /* mg_set could die, skipping the freeing of a0 and
909                  * a1; Ensure that they're always freed in that case */
910                 dSS_ADD;
911                 SS_ADD_PTR(a1.any_sv);
912                 SS_ADD_UV(SAVEt_FREESV);
913                 SS_ADD_PTR(a0.any_sv);
914                 SS_ADD_UV(SAVEt_FREESV);
915                 SS_ADD_END(4);
916                 PL_localizing = 2;
917                 mg_set(a1.any_sv);
918                 PL_localizing = 0;
919                 break;
920             }
921             SvREFCNT_dec_NN(a1.any_sv);
922             SvREFCNT_dec(a0.any_sv);
923             break;
924         }
925
926         case SAVEt_GENERIC_PVREF:               /* generic pv */
927             a0 = ap[0]; a1 = ap[1];
928             if (*a1.any_pvp != a0.any_pv) {
929                 Safefree(*a1.any_pvp);
930                 *a1.any_pvp = a0.any_pv;
931             }
932             break;
933
934         case SAVEt_SHARED_PVREF:                /* shared pv */
935             a0 = ap[0]; a1 = ap[1];
936             if (*a0.any_pvp != a1.any_pv) {
937 #ifdef NETWARE
938                 PerlMem_free(*a0.any_pvp);
939 #else
940                 PerlMemShared_free(*a0.any_pvp);
941 #endif
942                 *a0.any_pvp = a1.any_pv;
943             }
944             break;
945
946         case SAVEt_GVSV:                        /* scalar slot in GV */
947             a0 = ap[0]; a1 = ap[1];
948             a0.any_svp = &GvSV(a0.any_gv);
949             goto restore_svp;
950
951         case SAVEt_GENERIC_SVREF:               /* generic sv */
952             a0 = ap[0]; a1 = ap[1];
953         restore_svp:
954         {
955             /* do *a0.any_svp = a1 */
956             SV * const sv = *a0.any_svp;
957             *a0.any_svp = a1.any_sv;
958             SvREFCNT_dec(sv);
959             SvREFCNT_dec(a1.any_sv);
960             break;
961         }
962
963         case SAVEt_GVSLOT:                      /* any slot in GV */
964         {
965             HV * hv;
966             a0 = ap[0]; a1 = ap[1]; a2 = ap[2];
967             hv = GvSTASH(a0.any_gv);
968             if (hv && HvENAME(hv) && (
969                     (a2.any_sv && SvTYPE(a2.any_sv) == SVt_PVCV)
970                  || (*a1.any_svp && SvTYPE(*a1.any_svp) == SVt_PVCV)
971                ))
972             {
973                 if ((char *)a1.any_svp < (char *)GvGP(a0.any_gv)
974                  || (char *)a1.any_svp > (char *)GvGP(a0.any_gv) + sizeof(struct gp)
975                  || GvREFCNT(a0.any_gv) > 2) /* "> 2" to ignore savestack's ref */
976                     PL_sub_generation++;
977                 else mro_method_changed_in(hv);
978             }
979             a0.any_svp = a1.any_svp;
980             a1.any_sv  = a2.any_sv;
981             goto restore_svp;
982         }
983
984         case SAVEt_AV:                          /* array reference */
985             a0 = ap[0]; a1 = ap[1];
986             SvREFCNT_dec(GvAV(a0.any_gv));
987             GvAV(a0.any_gv) = a1.any_av;
988           avhv_common:
989             if (UNLIKELY(SvSMAGICAL(a1.any_sv))) {
990                 /* mg_set might die, so make sure a0 isn't leaked */
991                 dSS_ADD;
992                 SS_ADD_PTR(a0.any_sv);
993                 SS_ADD_UV(SAVEt_FREESV);
994                 SS_ADD_END(2);
995                 PL_localizing = 2;
996                 mg_set(a1.any_sv);
997                 PL_localizing = 0;
998                 break;
999             }
1000             SvREFCNT_dec_NN(a0.any_sv);
1001             break;
1002
1003         case SAVEt_HV:                          /* hash reference */
1004             a0 = ap[0]; a1 = ap[1];
1005             SvREFCNT_dec(GvHV(a0.any_gv));
1006             GvHV(a0.any_gv) = a1.any_hv;
1007             goto avhv_common;
1008
1009         case SAVEt_INT_SMALL:
1010             a0 = ap[0];
1011             *(int*)a0.any_ptr = (int)(uv >> SAVE_TIGHT_SHIFT);
1012             break;
1013
1014         case SAVEt_INT:                         /* int reference */
1015             a0 = ap[0]; a1 = ap[1];
1016             *(int*)a1.any_ptr = (int)a0.any_i32;
1017             break;
1018
1019         case SAVEt_STRLEN:                      /* STRLEN/size_t ref */
1020             a0 = ap[0]; a1 = ap[1];
1021             *(STRLEN*)a1.any_ptr = (STRLEN)a0.any_iv;
1022             break;
1023
1024         case SAVEt_TMPSFLOOR:                   /* restore PL_tmps_floor */
1025             a0 = ap[0];
1026             PL_tmps_floor = (SSize_t)a0.any_iv;
1027             break;
1028
1029         case SAVEt_BOOL:                        /* bool reference */
1030             a0 = ap[0];
1031             *(bool*)a0.any_ptr = cBOOL(uv >> 8);
1032 #ifdef NO_TAINT_SUPPORT
1033             PERL_UNUSED_VAR(was);
1034 #else
1035             if (UNLIKELY(a0.any_ptr == &(TAINT_get))) {
1036                 /* If we don't update <was>, to reflect what was saved on the
1037                  * stack for PL_tainted, then we will overwrite this attempt to
1038                  * restore it when we exit this routine.  Note that this won't
1039                  * work if this value was saved in a wider-than necessary type,
1040                  * such as I32 */
1041                 was = *(bool*)a0.any_ptr;
1042             }
1043 #endif
1044             break;
1045
1046         case SAVEt_I32_SMALL:
1047             a0 = ap[0];
1048             *(I32*)a0.any_ptr = (I32)(uv >> SAVE_TIGHT_SHIFT);
1049             break;
1050
1051         case SAVEt_I32:                         /* I32 reference */
1052             a0 = ap[0]; a1 = ap[1];
1053 #ifdef PERL_DEBUG_READONLY_OPS
1054             if (*(I32*)a1.any_ptr != a0.any_i32)
1055 #endif
1056                 *(I32*)a1.any_ptr = a0.any_i32;
1057             break;
1058
1059         case SAVEt_SPTR:                        /* SV* reference */
1060         case SAVEt_VPTR:                        /* random* reference */
1061         case SAVEt_PPTR:                        /* char* reference */
1062         case SAVEt_HPTR:                        /* HV* reference */
1063         case SAVEt_APTR:                        /* AV* reference */
1064             a0 = ap[0]; a1 = ap[1];
1065             *a1.any_svp= a0.any_sv;
1066             break;
1067
1068         case SAVEt_GP:                          /* scalar reference */
1069         {
1070             HV *hv;
1071             bool had_method;
1072
1073             a0 = ap[0]; a1 = ap[1];
1074             /* possibly taking a method out of circulation */   
1075             had_method = !!GvCVu(a0.any_gv);
1076             gp_free(a0.any_gv);
1077             GvGP_set(a0.any_gv, (GP*)a1.any_ptr);
1078             if ((hv=GvSTASH(a0.any_gv)) && HvENAME_get(hv)) {
1079                 if (   GvNAMELEN(a0.any_gv) == 3
1080                     && strnEQ(GvNAME(a0.any_gv), "ISA", 3)
1081                 )
1082                     mro_isa_changed_in(hv);
1083                 else if (had_method || GvCVu(a0.any_gv))
1084                     /* putting a method back into circulation ("local")*/       
1085                     gv_method_changed(a0.any_gv);
1086             }
1087             SvREFCNT_dec_NN(a0.any_gv);
1088             break;
1089         }
1090
1091         case SAVEt_FREESV:
1092             a0 = ap[0];
1093             SvREFCNT_dec(a0.any_sv);
1094             break;
1095
1096         case SAVEt_FREEPADNAME:
1097             a0 = ap[0];
1098             PadnameREFCNT_dec((PADNAME *)a0.any_ptr);
1099             break;
1100
1101         case SAVEt_FREECOPHH:
1102             a0 = ap[0];
1103             cophh_free((COPHH *)a0.any_ptr);
1104             break;
1105
1106         case SAVEt_MORTALIZESV:
1107             a0 = ap[0];
1108             sv_2mortal(a0.any_sv);
1109             break;
1110
1111         case SAVEt_FREEOP:
1112             a0 = ap[0];
1113             ASSERT_CURPAD_LEGAL("SAVEt_FREEOP");
1114             op_free(a0.any_op);
1115             break;
1116
1117         case SAVEt_FREEPV:
1118             a0 = ap[0];
1119             Safefree(a0.any_ptr);
1120             break;
1121
1122         case SAVEt_CLEARPADRANGE:
1123         {
1124             I32 i;
1125             SV **svp;
1126             i = (I32)((uv >> SAVE_TIGHT_SHIFT) & OPpPADRANGE_COUNTMASK);
1127             svp = &PL_curpad[uv >>
1128                     (OPpPADRANGE_COUNTSHIFT + SAVE_TIGHT_SHIFT)] + i - 1;
1129             goto clearsv;
1130         case SAVEt_CLEARSV:
1131             svp = &PL_curpad[uv >> SAVE_TIGHT_SHIFT];
1132             i = 1;
1133           clearsv:
1134             for (; i; i--, svp--) {
1135                 SV *sv = *svp;
1136
1137                 DEBUG_Xv(PerlIO_printf(Perl_debug_log,
1138              "Pad 0x%" UVxf "[0x%" UVxf "] clearsv: %ld sv=0x%" UVxf "<%" IVdf "> %s\n",
1139                     PTR2UV(PL_comppad), PTR2UV(PL_curpad),
1140                     (long)(svp-PL_curpad), PTR2UV(sv), (IV)SvREFCNT(sv),
1141                     (SvREFCNT(sv) <= 1 && !SvOBJECT(sv)) ? "clear" : "abandon"
1142                 ));
1143
1144                 /* Can clear pad variable in place? */
1145                 if (SvREFCNT(sv) == 1 && !SvOBJECT(sv)) {
1146
1147                     /* these flags are the union of all the relevant flags
1148                      * in the individual conditions within */
1149                     if (UNLIKELY(SvFLAGS(sv) & (
1150                             SVf_READONLY|SVf_PROTECT /*for SvREADONLY_off*/
1151                           | (SVs_GMG|SVs_SMG|SVs_RMG) /* SvMAGICAL() */
1152                           | SVf_OOK
1153                           | SVf_THINKFIRST)))
1154                     {
1155                         /* if a my variable that was made readonly is
1156                          * going out of scope, we want to remove the
1157                          * readonlyness so that it can go out of scope
1158                          * quietly
1159                          */
1160                         if (SvREADONLY(sv))
1161                             SvREADONLY_off(sv);
1162
1163                         if (SvOOK(sv)) { /* OOK or HvAUX */
1164                             if (SvTYPE(sv) == SVt_PVHV)
1165                                 Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
1166                             else
1167                                 sv_backoff(sv);
1168                         }
1169
1170                         if (SvMAGICAL(sv)) {
1171                             /* note that backrefs (either in HvAUX or magic)
1172                              * must be removed before other magic */
1173                             sv_unmagic(sv, PERL_MAGIC_backref);
1174                             if (SvTYPE(sv) != SVt_PVCV)
1175                                 mg_free(sv);
1176                         }
1177                         if (SvTHINKFIRST(sv))
1178                             sv_force_normal_flags(sv, SV_IMMEDIATE_UNREF
1179                                                      |SV_COW_DROP_PV);
1180
1181                     }
1182                     switch (SvTYPE(sv)) {
1183                     case SVt_NULL:
1184                         break;
1185                     case SVt_PVAV:
1186                         av_clear(MUTABLE_AV(sv));
1187                         break;
1188                     case SVt_PVHV:
1189                         hv_clear(MUTABLE_HV(sv));
1190                         break;
1191                     case SVt_PVCV:
1192                     {
1193                         HEK *hek =
1194                               CvNAMED(sv)
1195                                 ? CvNAME_HEK((CV *)sv)
1196                                 : GvNAME_HEK(CvGV(sv));
1197                         assert(hek);
1198                         (void)share_hek_hek(hek);
1199                         cv_undef((CV *)sv);
1200                         CvNAME_HEK_set(sv, hek);
1201                         CvLEXICAL_on(sv);
1202                         break;
1203                     }
1204                     default:
1205                         /* This looks odd, but these two macros are for use in
1206                            expressions and finish with a trailing comma, so
1207                            adding a ; after them would be wrong. */
1208                         assert_not_ROK(sv)
1209                         assert_not_glob(sv)
1210                         SvFLAGS(sv) &=~ (SVf_OK|SVf_IVisUV|SVf_UTF8);
1211                         break;
1212                     }
1213                     SvPADTMP_off(sv);
1214                     SvPADSTALE_on(sv); /* mark as no longer live */
1215                 }
1216                 else {  /* Someone has a claim on this, so abandon it. */
1217                     switch (SvTYPE(sv)) {       /* Console ourselves with a new value */
1218                     case SVt_PVAV:      *svp = MUTABLE_SV(newAV());     break;
1219                     case SVt_PVHV:      *svp = MUTABLE_SV(newHV());     break;
1220                     case SVt_PVCV:
1221                     {
1222                         HEK * const hek = CvNAMED(sv)
1223                                              ? CvNAME_HEK((CV *)sv)
1224                                              : GvNAME_HEK(CvGV(sv));
1225
1226                         /* Create a stub */
1227                         *svp = newSV_type(SVt_PVCV);
1228
1229                         /* Share name */
1230                         CvNAME_HEK_set(*svp,
1231                                        share_hek_hek(hek));
1232                         CvLEXICAL_on(*svp);
1233                         break;
1234                     }
1235                     default:    *svp = newSV(0);                break;
1236                     }
1237                     SvREFCNT_dec_NN(sv); /* Cast current value to the winds. */
1238                     /* preserve pad nature, but also mark as not live
1239                      * for any closure capturing */
1240                     SvFLAGS(*svp) |= SVs_PADSTALE;
1241                 }
1242             }
1243             break;
1244         }
1245
1246         case SAVEt_DELETE:
1247             a0 = ap[0]; a1 = ap[1]; a2 = ap[2];
1248             (void)hv_delete(a2.any_hv, a0.any_pv, a1.any_i32, G_DISCARD);
1249             SvREFCNT_dec(a2.any_hv);
1250             Safefree(a0.any_ptr);
1251             break;
1252
1253         case SAVEt_ADELETE:
1254             a0 = ap[0]; a1 = ap[1];
1255             (void)av_delete(a1.any_av, a0.any_iv, G_DISCARD);
1256             SvREFCNT_dec(a1.any_av);
1257             break;
1258
1259         case SAVEt_DESTRUCTOR_X:
1260             a0 = ap[0]; a1 = ap[1];
1261             (*a0.any_dxptr)(aTHX_ a1.any_ptr);
1262             break;
1263
1264         case SAVEt_REGCONTEXT:
1265             /* regexp must have croaked */
1266         case SAVEt_ALLOC:
1267             PL_savestack_ix -= uv >> SAVE_TIGHT_SHIFT;
1268             break;
1269
1270         case SAVEt_STACK_POS:           /* Position on Perl stack */
1271             a0 = ap[0];
1272             PL_stack_sp = PL_stack_base + a0.any_i32;
1273             break;
1274
1275         case SAVEt_AELEM:               /* array element */
1276         {
1277             SV **svp;
1278             a0 = ap[0]; a1 = ap[1]; a2 = ap[2];
1279             svp = av_fetch(a0.any_av, a1.any_iv, 1);
1280             if (UNLIKELY(!AvREAL(a0.any_av) && AvREIFY(a0.any_av))) /* undo reify guard */
1281                 SvREFCNT_dec(a2.any_sv);
1282             if (LIKELY(svp)) {
1283                 SV * const sv = *svp;
1284                 if (LIKELY(sv && sv != &PL_sv_undef)) {
1285                     if (UNLIKELY(SvTIED_mg((const SV *)a0.any_av, PERL_MAGIC_tied)))
1286                         SvREFCNT_inc_void_NN(sv);
1287                     a1.any_sv  = a2.any_sv;
1288                     a2.any_svp = svp;
1289                     goto restore_sv;
1290                 }
1291             }
1292             SvREFCNT_dec(a0.any_av);
1293             SvREFCNT_dec(a2.any_sv);
1294             break;
1295         }
1296
1297         case SAVEt_HELEM:               /* hash element */
1298         {
1299             HE *he;
1300
1301             a0 = ap[0]; a1 = ap[1]; a2 = ap[2];
1302             he = hv_fetch_ent(a0.any_hv, a1.any_sv, 1, 0);
1303             SvREFCNT_dec(a1.any_sv);
1304             if (LIKELY(he)) {
1305                 const SV * const oval = HeVAL(he);
1306                 if (LIKELY(oval && oval != &PL_sv_undef)) {
1307                     SV **svp = &HeVAL(he);
1308                     if (UNLIKELY(SvTIED_mg((const SV *)a0.any_hv, PERL_MAGIC_tied)))
1309                         SvREFCNT_inc_void(*svp);
1310                     a1.any_sv  = a2.any_sv;
1311                     a2.any_svp = svp;
1312                     goto restore_sv;
1313                 }
1314             }
1315             SvREFCNT_dec(a0.any_hv);
1316             SvREFCNT_dec(a2.any_sv);
1317             break;
1318         }
1319
1320         case SAVEt_OP:
1321             a0 = ap[0];
1322             PL_op = (OP*)a0.any_ptr;
1323             break;
1324
1325         case SAVEt_HINTS:
1326             a0 = ap[0]; a1 = ap[1];
1327             if ((PL_hints & HINT_LOCALIZE_HH)) {
1328               while (GvHV(PL_hintgv)) {
1329                 HV *hv = GvHV(PL_hintgv);
1330                 GvHV(PL_hintgv) = NULL;
1331                 SvREFCNT_dec(MUTABLE_SV(hv));
1332               }
1333             }
1334             cophh_free(CopHINTHASH_get(&PL_compiling));
1335             CopHINTHASH_set(&PL_compiling, (COPHH*)a1.any_ptr);
1336             *(I32*)&PL_hints = a0.any_i32;
1337             if (PL_hints & HINT_LOCALIZE_HH) {
1338                 SvREFCNT_dec(MUTABLE_SV(GvHV(PL_hintgv)));
1339                 GvHV(PL_hintgv) = MUTABLE_HV(SSPOPPTR);
1340             }
1341             if (!GvHV(PL_hintgv)) {
1342                 /* Need to add a new one manually, else rv2hv can
1343                    add one via GvHVn and it won't have the magic set.  */
1344                 HV *const hv = newHV();
1345                 hv_magic(hv, NULL, PERL_MAGIC_hints);
1346                 GvHV(PL_hintgv) = hv;
1347             }
1348             assert(GvHV(PL_hintgv));
1349             break;
1350
1351         case SAVEt_COMPPAD:
1352             a0 = ap[0];
1353             PL_comppad = (PAD*)a0.any_ptr;
1354             if (LIKELY(PL_comppad))
1355                 PL_curpad = AvARRAY(PL_comppad);
1356             else
1357                 PL_curpad = NULL;
1358             break;
1359
1360         case SAVEt_PADSV_AND_MORTALIZE:
1361             {
1362                 SV **svp;
1363
1364                 a0 = ap[0]; a1 = ap[1]; a2 = ap[2];
1365                 assert (a1.any_ptr);
1366                 svp = AvARRAY((PAD*)a1.any_ptr) + (PADOFFSET)a2.any_uv;
1367                 /* This mortalizing used to be done by CX_POOPLOOP() via
1368                    itersave.  But as we have all the information here, we
1369                    can do it here, save even having to have itersave in
1370                    the struct.
1371                    */
1372                 sv_2mortal(*svp);
1373                 *svp = a0.any_sv;
1374             }
1375             break;
1376
1377         case SAVEt_SAVESWITCHSTACK:
1378             {
1379                 dSP;
1380
1381                 a0 = ap[0]; a1 = ap[1];
1382                 SWITCHSTACK(a1.any_av, a0.any_av);
1383                 PL_curstackinfo->si_stack = a0.any_av;
1384             }
1385             break;
1386
1387         case SAVEt_SET_SVFLAGS:
1388             a0 = ap[0]; a1 = ap[1]; a2 = ap[2];
1389             SvFLAGS(a0.any_sv) &= ~(a1.any_u32);
1390             SvFLAGS(a0.any_sv) |= a2.any_u32;
1391             break;
1392
1393             /* These are only saved in mathoms.c */
1394         case SAVEt_NSTAB:
1395             a0 = ap[0];
1396             (void)sv_clear(a0.any_sv);
1397             break;
1398
1399         case SAVEt_LONG:                        /* long reference */
1400             a0 = ap[0]; a1 = ap[1];
1401             *(long*)a1.any_ptr = a0.any_long;
1402             break;
1403
1404         case SAVEt_IV:                          /* IV reference */
1405             a0 = ap[0]; a1 = ap[1];
1406             *(IV*)a1.any_ptr = a0.any_iv;
1407             break;
1408
1409         case SAVEt_I16:                         /* I16 reference */
1410             a0 = ap[0];
1411             *(I16*)a0.any_ptr = (I16)(uv >> 8);
1412             break;
1413
1414         case SAVEt_I8:                          /* I8 reference */
1415             a0 = ap[0];
1416             *(I8*)a0.any_ptr = (I8)(uv >> 8);
1417             break;
1418
1419         case SAVEt_DESTRUCTOR:
1420             a0 = ap[0]; a1 = ap[1];
1421             (*a0.any_dptr)(a1.any_ptr);
1422             break;
1423
1424         case SAVEt_COMPILE_WARNINGS:
1425             a0 = ap[0];
1426             if (!specialWARN(PL_compiling.cop_warnings))
1427                 PerlMemShared_free(PL_compiling.cop_warnings);
1428             PL_compiling.cop_warnings = (STRLEN*)a0.any_ptr;
1429             break;
1430
1431         case SAVEt_PARSER:
1432             a0 = ap[0];
1433             parser_free((yy_parser *)a0.any_ptr);
1434             break;
1435
1436         case SAVEt_READONLY_OFF:
1437             a0 = ap[0];
1438             SvREADONLY_off(a0.any_sv);
1439             break;
1440
1441         default:
1442             Perl_croak(aTHX_ "panic: leave_scope inconsistency %u",
1443                     (U8)uv & SAVE_MASK);
1444         }
1445     }
1446
1447     TAINT_set(was);
1448 }
1449
1450 void
1451 Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
1452 {
1453     PERL_ARGS_ASSERT_CX_DUMP;
1454
1455 #ifdef DEBUGGING
1456     PerlIO_printf(Perl_debug_log, "CX %ld = %s\n", (long)(cx - cxstack), PL_block_type[CxTYPE(cx)]);
1457     if (CxTYPE(cx) != CXt_SUBST) {
1458         const char *gimme_text;
1459         PerlIO_printf(Perl_debug_log, "BLK_OLDSP = %ld\n", (long)cx->blk_oldsp);
1460         PerlIO_printf(Perl_debug_log, "BLK_OLDCOP = 0x%" UVxf "\n",
1461                       PTR2UV(cx->blk_oldcop));
1462         PerlIO_printf(Perl_debug_log, "BLK_OLDMARKSP = %ld\n", (long)cx->blk_oldmarksp);
1463         PerlIO_printf(Perl_debug_log, "BLK_OLDSCOPESP = %ld\n", (long)cx->blk_oldscopesp);
1464         PerlIO_printf(Perl_debug_log, "BLK_OLDSAVEIX = %ld\n", (long)cx->blk_oldsaveix);
1465         PerlIO_printf(Perl_debug_log, "BLK_OLDPM = 0x%" UVxf "\n",
1466                       PTR2UV(cx->blk_oldpm));
1467         switch (cx->blk_gimme) {
1468             case G_VOID:
1469                 gimme_text = "VOID";
1470                 break;
1471             case G_SCALAR:
1472                 gimme_text = "SCALAR";
1473                 break;
1474             case G_ARRAY:
1475                 gimme_text = "LIST";
1476                 break;
1477             default:
1478                 gimme_text = "UNKNOWN";
1479                 break;
1480         }
1481         PerlIO_printf(Perl_debug_log, "BLK_GIMME = %s\n", gimme_text);
1482     }
1483     switch (CxTYPE(cx)) {
1484     case CXt_NULL:
1485     case CXt_BLOCK:
1486         break;
1487     case CXt_FORMAT:
1488         PerlIO_printf(Perl_debug_log, "BLK_FORMAT.CV = 0x%" UVxf "\n",
1489                 PTR2UV(cx->blk_format.cv));
1490         PerlIO_printf(Perl_debug_log, "BLK_FORMAT.GV = 0x%" UVxf "\n",
1491                 PTR2UV(cx->blk_format.gv));
1492         PerlIO_printf(Perl_debug_log, "BLK_FORMAT.DFOUTGV = 0x%" UVxf "\n",
1493                 PTR2UV(cx->blk_format.dfoutgv));
1494         PerlIO_printf(Perl_debug_log, "BLK_FORMAT.HASARGS = %d\n",
1495                       (int)CxHASARGS(cx));
1496         PerlIO_printf(Perl_debug_log, "BLK_FORMAT.RETOP = 0x%" UVxf "\n",
1497                 PTR2UV(cx->blk_format.retop));
1498         break;
1499     case CXt_SUB:
1500         PerlIO_printf(Perl_debug_log, "BLK_SUB.CV = 0x%" UVxf "\n",
1501                 PTR2UV(cx->blk_sub.cv));
1502         PerlIO_printf(Perl_debug_log, "BLK_SUB.OLDDEPTH = %ld\n",
1503                 (long)cx->blk_sub.olddepth);
1504         PerlIO_printf(Perl_debug_log, "BLK_SUB.HASARGS = %d\n",
1505                 (int)CxHASARGS(cx));
1506         PerlIO_printf(Perl_debug_log, "BLK_SUB.LVAL = %d\n", (int)CxLVAL(cx));
1507         PerlIO_printf(Perl_debug_log, "BLK_SUB.RETOP = 0x%" UVxf "\n",
1508                 PTR2UV(cx->blk_sub.retop));
1509         break;
1510     case CXt_EVAL:
1511         PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_IN_EVAL = %ld\n",
1512                 (long)CxOLD_IN_EVAL(cx));
1513         PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_OP_TYPE = %s (%s)\n",
1514                 PL_op_name[CxOLD_OP_TYPE(cx)],
1515                 PL_op_desc[CxOLD_OP_TYPE(cx)]);
1516         if (cx->blk_eval.old_namesv)
1517             PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_NAME = %s\n",
1518                           SvPVX_const(cx->blk_eval.old_namesv));
1519         PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_EVAL_ROOT = 0x%" UVxf "\n",
1520                 PTR2UV(cx->blk_eval.old_eval_root));
1521         PerlIO_printf(Perl_debug_log, "BLK_EVAL.RETOP = 0x%" UVxf "\n",
1522                 PTR2UV(cx->blk_eval.retop));
1523         break;
1524
1525     case CXt_LOOP_PLAIN:
1526     case CXt_LOOP_LAZYIV:
1527     case CXt_LOOP_LAZYSV:
1528     case CXt_LOOP_LIST:
1529     case CXt_LOOP_ARY:
1530         PerlIO_printf(Perl_debug_log, "BLK_LOOP.LABEL = %s\n", CxLABEL(cx));
1531         PerlIO_printf(Perl_debug_log, "BLK_LOOP.MY_OP = 0x%" UVxf "\n",
1532                 PTR2UV(cx->blk_loop.my_op));
1533         if (CxTYPE(cx) != CXt_LOOP_PLAIN) {
1534             PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERVAR = 0x%" UVxf "\n",
1535                     PTR2UV(CxITERVAR(cx)));
1536             PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERSAVE = 0x%" UVxf "\n",
1537                     PTR2UV(cx->blk_loop.itersave));
1538             /* XXX: not accurate for LAZYSV/IV/LIST */
1539             PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERARY = 0x%" UVxf "\n",
1540                     PTR2UV(cx->blk_loop.state_u.ary.ary));
1541             PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERIX = %ld\n",
1542                     (long)cx->blk_loop.state_u.ary.ix);
1543         }
1544         break;
1545
1546     case CXt_SUBST:
1547         PerlIO_printf(Perl_debug_log, "SB_ITERS = %ld\n",
1548                 (long)cx->sb_iters);
1549         PerlIO_printf(Perl_debug_log, "SB_MAXITERS = %ld\n",
1550                 (long)cx->sb_maxiters);
1551         PerlIO_printf(Perl_debug_log, "SB_RFLAGS = %ld\n",
1552                 (long)cx->sb_rflags);
1553         PerlIO_printf(Perl_debug_log, "SB_ONCE = %ld\n",
1554                 (long)CxONCE(cx));
1555         PerlIO_printf(Perl_debug_log, "SB_ORIG = %s\n",
1556                 cx->sb_orig);
1557         PerlIO_printf(Perl_debug_log, "SB_DSTR = 0x%" UVxf "\n",
1558                 PTR2UV(cx->sb_dstr));
1559         PerlIO_printf(Perl_debug_log, "SB_TARG = 0x%" UVxf "\n",
1560                 PTR2UV(cx->sb_targ));
1561         PerlIO_printf(Perl_debug_log, "SB_S = 0x%" UVxf "\n",
1562                 PTR2UV(cx->sb_s));
1563         PerlIO_printf(Perl_debug_log, "SB_M = 0x%" UVxf "\n",
1564                 PTR2UV(cx->sb_m));
1565         PerlIO_printf(Perl_debug_log, "SB_STREND = 0x%" UVxf "\n",
1566                 PTR2UV(cx->sb_strend));
1567         PerlIO_printf(Perl_debug_log, "SB_RXRES = 0x%" UVxf "\n",
1568                 PTR2UV(cx->sb_rxres));
1569         break;
1570     }
1571 #else
1572     PERL_UNUSED_CONTEXT;
1573     PERL_UNUSED_ARG(cx);
1574 #endif  /* DEBUGGING */
1575 }
1576
1577 /*
1578  * ex: set ts=8 sts=4 sw=4 et:
1579  */