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