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