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