avoid coredump on C<sort { my $c; return $a cmp $b } ...>
[p5sagit/p5-mst-13.2.git] / scope.c
1 /*    scope.c
2  *
3  *    Copyright (c) 1991-1999, Larry Wall
4  *
5  *    You may distribute under the terms of either the GNU General Public
6  *    License or the Artistic License, as specified in the README file.
7  *
8  */
9
10 /*
11  * "For the fashion of Minas Tirith was such that it was built on seven
12  * levels..."
13  */
14
15 #include "EXTERN.h"
16 #define PERL_IN_SCOPE_C
17 #include "perl.h"
18
19 void *
20 Perl_default_protect(pTHX_ volatile JMPENV *pcur_env, int *excpt,
21                      protect_body_t body, ...)
22 {
23     void *ret;
24     va_list args;
25     va_start(args, body);
26     ret = vdefault_protect(pcur_env, excpt, body, &args);
27     va_end(args);
28     return ret;
29 }
30
31 void *
32 Perl_vdefault_protect(pTHX_ volatile JMPENV *pcur_env, int *excpt,
33                       protect_body_t body, va_list *args)
34 {
35     dTHR;
36     int ex;
37     void *ret;
38
39     DEBUG_l(Perl_deb(aTHX_ "Setting up local jumplevel %p, was %p\n",
40                 pcur_env, PL_top_env));
41     JMPENV_PUSH(ex);
42     if (ex)
43         ret = NULL;
44     else
45         ret = CALL_FPTR(body)(aTHX_ *args);
46     *excpt = ex;
47     JMPENV_POP;
48     return ret;
49 }
50
51 SV**
52 Perl_stack_grow(pTHX_ SV **sp, SV **p, int n)
53 {
54     dTHR;
55 #if defined(DEBUGGING) && !defined(USE_THREADS)
56     static int growing = 0;
57     if (growing++)
58       abort();
59 #endif
60     PL_stack_sp = sp;
61 #ifndef STRESS_REALLOC
62     av_extend(PL_curstack, (p - PL_stack_base) + (n) + 128);
63 #else
64     av_extend(PL_curstack, (p - PL_stack_base) + (n) + 1);
65 #endif
66 #if defined(DEBUGGING) && !defined(USE_THREADS)
67     growing--;
68 #endif
69     return PL_stack_sp;
70 }
71
72 #ifndef STRESS_REALLOC
73 #define GROW(old) ((old) * 3 / 2)
74 #else
75 #define GROW(old) ((old) + 1)
76 #endif
77
78 PERL_SI *
79 Perl_new_stackinfo(pTHX_ I32 stitems, I32 cxitems)
80 {
81     PERL_SI *si;
82     PERL_CONTEXT *cxt;
83     New(56, si, 1, PERL_SI);
84     si->si_stack = newAV();
85     AvREAL_off(si->si_stack);
86     av_extend(si->si_stack, stitems > 0 ? stitems-1 : 0);
87     AvALLOC(si->si_stack)[0] = &PL_sv_undef;
88     AvFILLp(si->si_stack) = 0;
89     si->si_prev = 0;
90     si->si_next = 0;
91     si->si_cxmax = cxitems - 1;
92     si->si_cxix = -1;
93     si->si_type = PERLSI_UNDEF;
94     New(56, si->si_cxstack, cxitems, PERL_CONTEXT);
95     return si;
96 }
97
98 I32
99 Perl_cxinc(pTHX)
100 {
101     dTHR;
102     cxstack_max = GROW(cxstack_max);
103     Renew(cxstack, cxstack_max + 1, PERL_CONTEXT);      /* XXX should fix CXINC macro */
104     return cxstack_ix + 1;
105 }
106
107 void
108 Perl_push_return(pTHX_ OP *retop)
109 {
110     dTHR;
111     if (PL_retstack_ix == PL_retstack_max) {
112         PL_retstack_max = GROW(PL_retstack_max);
113         Renew(PL_retstack, PL_retstack_max, OP*);
114     }
115     PL_retstack[PL_retstack_ix++] = retop;
116 }
117
118 OP *
119 Perl_pop_return(pTHX)
120 {
121     dTHR;
122     if (PL_retstack_ix > 0)
123         return PL_retstack[--PL_retstack_ix];
124     else
125         return Nullop;
126 }
127
128 void
129 Perl_push_scope(pTHX)
130 {
131     dTHR;
132     if (PL_scopestack_ix == PL_scopestack_max) {
133         PL_scopestack_max = GROW(PL_scopestack_max);
134         Renew(PL_scopestack, PL_scopestack_max, I32);
135     }
136     PL_scopestack[PL_scopestack_ix++] = PL_savestack_ix;
137
138 }
139
140 void
141 Perl_pop_scope(pTHX)
142 {
143     dTHR;
144     I32 oldsave = PL_scopestack[--PL_scopestack_ix];
145     LEAVE_SCOPE(oldsave);
146 }
147
148 void
149 Perl_markstack_grow(pTHX)
150 {
151     dTHR;
152     I32 oldmax = PL_markstack_max - PL_markstack;
153     I32 newmax = GROW(oldmax);
154
155     Renew(PL_markstack, newmax, I32);
156     PL_markstack_ptr = PL_markstack + oldmax;
157     PL_markstack_max = PL_markstack + newmax;
158 }
159
160 void
161 Perl_savestack_grow(pTHX)
162 {
163     dTHR;
164     PL_savestack_max = GROW(PL_savestack_max) + 4; 
165     Renew(PL_savestack, PL_savestack_max, ANY);
166 }
167
168 #undef GROW
169
170 void
171 Perl_tmps_grow(pTHX_ I32 n)
172 {
173     dTHR;
174 #ifndef STRESS_REALLOC
175     if (n < 128)
176         n = (PL_tmps_max < 512) ? 128 : 512;
177 #endif
178     PL_tmps_max = PL_tmps_ix + n + 1;
179     Renew(PL_tmps_stack, PL_tmps_max, SV*);
180 }
181
182
183 void
184 Perl_free_tmps(pTHX)
185 {
186     dTHR;
187     /* XXX should tmps_floor live in cxstack? */
188     I32 myfloor = PL_tmps_floor;
189     while (PL_tmps_ix > myfloor) {      /* clean up after last statement */
190         SV* sv = PL_tmps_stack[PL_tmps_ix];
191         PL_tmps_stack[PL_tmps_ix--] = Nullsv;
192         if (sv) {
193             SvTEMP_off(sv);
194             SvREFCNT_dec(sv);           /* note, can modify tmps_ix!!! */
195         }
196     }
197 }
198
199 STATIC SV *
200 S_save_scalar_at(pTHX_ SV **sptr)
201 {
202     dTHR;
203     register SV *sv;
204     SV *osv = *sptr;
205
206     sv = *sptr = NEWSV(0,0);
207     if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(osv) && SvTYPE(osv) != SVt_PVGV) {
208         sv_upgrade(sv, SvTYPE(osv));
209         if (SvGMAGICAL(osv)) {
210             MAGIC* mg;
211             bool oldtainted = PL_tainted;
212             mg_get(osv);
213             if (PL_tainting && PL_tainted && (mg = mg_find(osv, 't'))) {
214                 SAVESPTR(mg->mg_obj);
215                 mg->mg_obj = osv;
216             }
217             SvFLAGS(osv) |= (SvFLAGS(osv) &
218                 (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
219             PL_tainted = oldtainted;
220         }
221         SvMAGIC(sv) = SvMAGIC(osv);
222         SvFLAGS(sv) |= SvMAGICAL(osv);
223         PL_localizing = 1;
224         SvSETMAGIC(sv);
225         PL_localizing = 0;
226     }
227     return sv;
228 }
229
230 SV *
231 Perl_save_scalar(pTHX_ GV *gv)
232 {
233     dTHR;
234     SV **sptr = &GvSV(gv);
235     SSCHECK(3);
236     SSPUSHPTR(SvREFCNT_inc(gv));
237     SSPUSHPTR(SvREFCNT_inc(*sptr));
238     SSPUSHINT(SAVEt_SV);
239     return save_scalar_at(sptr);
240 }
241
242 SV*
243 Perl_save_svref(pTHX_ SV **sptr)
244 {
245     dTHR;
246     SSCHECK(3);
247     SSPUSHPTR(sptr);
248     SSPUSHPTR(SvREFCNT_inc(*sptr));
249     SSPUSHINT(SAVEt_SVREF);
250     return save_scalar_at(sptr);
251 }
252
253 /* Like save_svref(), but doesn't deal with magic.  Can be used to
254  * restore a global SV to its prior contents, freeing new value. */
255 void
256 Perl_save_generic_svref(pTHX_ SV **sptr)
257 {
258     dTHR;
259     SSCHECK(3);
260     SSPUSHPTR(sptr);
261     SSPUSHPTR(SvREFCNT_inc(*sptr));
262     SSPUSHINT(SAVEt_GENERIC_SVREF);
263 }
264
265 void
266 Perl_save_gp(pTHX_ GV *gv, I32 empty)
267 {
268     dTHR;
269     SSCHECK(6);
270     SSPUSHIV((IV)SvLEN(gv));
271     SvLEN(gv) = 0; /* forget that anything was allocated here */
272     SSPUSHIV((IV)SvCUR(gv));
273     SSPUSHPTR(SvPVX(gv));
274     SvPOK_off(gv);
275     SSPUSHPTR(SvREFCNT_inc(gv));
276     SSPUSHPTR(GvGP(gv));
277     SSPUSHINT(SAVEt_GP);
278
279     if (empty) {
280         register GP *gp;
281
282         if (GvCVu(gv))
283             PL_sub_generation++;        /* taking a method out of circulation */
284         Newz(602, gp, 1, GP);
285         GvGP(gv) = gp_ref(gp);
286         GvSV(gv) = NEWSV(72,0);
287         GvLINE(gv) = PL_curcop->cop_line;
288         GvEGV(gv) = gv;
289     }
290     else {
291         gp_ref(GvGP(gv));
292         GvINTRO_on(gv);
293     }
294 }
295
296 AV *
297 Perl_save_ary(pTHX_ GV *gv)
298 {
299     dTHR;
300     AV *oav = GvAVn(gv);
301     AV *av;
302
303     if (!AvREAL(oav) && AvREIFY(oav))
304         av_reify(oav);
305     SSCHECK(3);
306     SSPUSHPTR(gv);
307     SSPUSHPTR(oav);
308     SSPUSHINT(SAVEt_AV);
309
310     GvAV(gv) = Null(AV*);
311     av = GvAVn(gv);
312     if (SvMAGIC(oav)) {
313         SvMAGIC(av) = SvMAGIC(oav);
314         SvFLAGS(av) |= SvMAGICAL(oav);
315         SvMAGICAL_off(oav);
316         SvMAGIC(oav) = 0;
317         PL_localizing = 1;
318         SvSETMAGIC((SV*)av);
319         PL_localizing = 0;
320     }
321     return av;
322 }
323
324 HV *
325 Perl_save_hash(pTHX_ GV *gv)
326 {
327     dTHR;
328     HV *ohv, *hv;
329
330     SSCHECK(3);
331     SSPUSHPTR(gv);
332     SSPUSHPTR(ohv = GvHVn(gv));
333     SSPUSHINT(SAVEt_HV);
334
335     GvHV(gv) = Null(HV*);
336     hv = GvHVn(gv);
337     if (SvMAGIC(ohv)) {
338         SvMAGIC(hv) = SvMAGIC(ohv);
339         SvFLAGS(hv) |= SvMAGICAL(ohv);
340         SvMAGICAL_off(ohv);
341         SvMAGIC(ohv) = 0;
342         PL_localizing = 1;
343         SvSETMAGIC((SV*)hv);
344         PL_localizing = 0;
345     }
346     return hv;
347 }
348
349 void
350 Perl_save_item(pTHX_ register SV *item)
351 {
352     dTHR;
353     register SV *sv = NEWSV(0,0);
354
355     sv_setsv(sv,item);
356     SSCHECK(3);
357     SSPUSHPTR(item);            /* remember the pointer */
358     SSPUSHPTR(sv);              /* remember the value */
359     SSPUSHINT(SAVEt_ITEM);
360 }
361
362 void
363 Perl_save_int(pTHX_ int *intp)
364 {
365     dTHR;
366     SSCHECK(3);
367     SSPUSHINT(*intp);
368     SSPUSHPTR(intp);
369     SSPUSHINT(SAVEt_INT);
370 }
371
372 void
373 Perl_save_long(pTHX_ long int *longp)
374 {
375     dTHR;
376     SSCHECK(3);
377     SSPUSHLONG(*longp);
378     SSPUSHPTR(longp);
379     SSPUSHINT(SAVEt_LONG);
380 }
381
382 void
383 Perl_save_I32(pTHX_ I32 *intp)
384 {
385     dTHR;
386     SSCHECK(3);
387     SSPUSHINT(*intp);
388     SSPUSHPTR(intp);
389     SSPUSHINT(SAVEt_I32);
390 }
391
392 void
393 Perl_save_I16(pTHX_ I16 *intp)
394 {
395     dTHR;
396     SSCHECK(3);
397     SSPUSHINT(*intp);
398     SSPUSHPTR(intp);
399     SSPUSHINT(SAVEt_I16);
400 }
401
402 void
403 Perl_save_iv(pTHX_ IV *ivp)
404 {
405     dTHR;
406     SSCHECK(3);
407     SSPUSHIV(*ivp);
408     SSPUSHPTR(ivp);
409     SSPUSHINT(SAVEt_IV);
410 }
411
412 /* Cannot use save_sptr() to store a char* since the SV** cast will
413  * force word-alignment and we'll miss the pointer.
414  */
415 void
416 Perl_save_pptr(pTHX_ char **pptr)
417 {
418     dTHR;
419     SSCHECK(3);
420     SSPUSHPTR(*pptr);
421     SSPUSHPTR(pptr);
422     SSPUSHINT(SAVEt_PPTR);
423 }
424
425 void
426 Perl_save_sptr(pTHX_ SV **sptr)
427 {
428     dTHR;
429     SSCHECK(3);
430     SSPUSHPTR(*sptr);
431     SSPUSHPTR(sptr);
432     SSPUSHINT(SAVEt_SPTR);
433 }
434
435 SV **
436 Perl_save_threadsv(pTHX_ PADOFFSET i)
437 {
438 #ifdef USE_THREADS
439     dTHR;
440     SV **svp = &THREADSV(i);    /* XXX Change to save by offset */
441     DEBUG_S(PerlIO_printf(Perl_debug_log, "save_threadsv %u: %p %p:%s\n",
442                           i, svp, *svp, SvPEEK(*svp)));
443     save_svref(svp);
444     return svp;
445 #else
446     Perl_croak(aTHX_ "panic: save_threadsv called in non-threaded perl");
447     return 0;
448 #endif /* USE_THREADS */
449 }
450
451 void
452 Perl_save_nogv(pTHX_ GV *gv)
453 {
454     dTHR;
455     SSCHECK(2);
456     SSPUSHPTR(gv);
457     SSPUSHINT(SAVEt_NSTAB);
458 }
459
460 void
461 Perl_save_hptr(pTHX_ HV **hptr)
462 {
463     dTHR;
464     SSCHECK(3);
465     SSPUSHPTR(*hptr);
466     SSPUSHPTR(hptr);
467     SSPUSHINT(SAVEt_HPTR);
468 }
469
470 void
471 Perl_save_aptr(pTHX_ AV **aptr)
472 {
473     dTHR;
474     SSCHECK(3);
475     SSPUSHPTR(*aptr);
476     SSPUSHPTR(aptr);
477     SSPUSHINT(SAVEt_APTR);
478 }
479
480 void
481 Perl_save_freesv(pTHX_ SV *sv)
482 {
483     dTHR;
484     SSCHECK(2);
485     SSPUSHPTR(sv);
486     SSPUSHINT(SAVEt_FREESV);
487 }
488
489 void
490 Perl_save_freeop(pTHX_ OP *o)
491 {
492     dTHR;
493     SSCHECK(2);
494     SSPUSHPTR(o);
495     SSPUSHINT(SAVEt_FREEOP);
496 }
497
498 void
499 Perl_save_freepv(pTHX_ char *pv)
500 {
501     dTHR;
502     SSCHECK(2);
503     SSPUSHPTR(pv);
504     SSPUSHINT(SAVEt_FREEPV);
505 }
506
507 void
508 Perl_save_clearsv(pTHX_ SV **svp)
509 {
510     dTHR;
511     SSCHECK(2);
512     SSPUSHLONG((long)(svp-PL_curpad));
513     SSPUSHINT(SAVEt_CLEARSV);
514 }
515
516 void
517 Perl_save_delete(pTHX_ HV *hv, char *key, I32 klen)
518 {
519     dTHR;
520     SSCHECK(4);
521     SSPUSHINT(klen);
522     SSPUSHPTR(key);
523     SSPUSHPTR(SvREFCNT_inc(hv));
524     SSPUSHINT(SAVEt_DELETE);
525 }
526
527 void
528 Perl_save_list(pTHX_ register SV **sarg, I32 maxsarg)
529 {
530     dTHR;
531     register SV *sv;
532     register I32 i;
533
534     for (i = 1; i <= maxsarg; i++) {
535         sv = NEWSV(0,0);
536         sv_setsv(sv,sarg[i]);
537         SSCHECK(3);
538         SSPUSHPTR(sarg[i]);             /* remember the pointer */
539         SSPUSHPTR(sv);                  /* remember the value */
540         SSPUSHINT(SAVEt_ITEM);
541     }
542 }
543
544 void
545 Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p)
546 {
547     dTHR;
548     SSCHECK(3);
549     SSPUSHDPTR(f);
550     SSPUSHPTR(p);
551     SSPUSHINT(SAVEt_DESTRUCTOR);
552 }
553
554 void
555 Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p)
556 {
557     dTHR;
558     SSCHECK(3);
559     SSPUSHDXPTR(f);
560     SSPUSHPTR(p);
561     SSPUSHINT(SAVEt_DESTRUCTOR_X);
562 }
563
564 void
565 Perl_save_aelem(pTHX_ AV *av, I32 idx, SV **sptr)
566 {
567     dTHR;
568     SSCHECK(4);
569     SSPUSHPTR(SvREFCNT_inc(av));
570     SSPUSHINT(idx);
571     SSPUSHPTR(SvREFCNT_inc(*sptr));
572     SSPUSHINT(SAVEt_AELEM);
573     save_scalar_at(sptr);
574 }
575
576 void
577 Perl_save_helem(pTHX_ HV *hv, SV *key, SV **sptr)
578 {
579     dTHR;
580     SSCHECK(4);
581     SSPUSHPTR(SvREFCNT_inc(hv));
582     SSPUSHPTR(SvREFCNT_inc(key));
583     SSPUSHPTR(SvREFCNT_inc(*sptr));
584     SSPUSHINT(SAVEt_HELEM);
585     save_scalar_at(sptr);
586 }
587
588 void
589 Perl_save_op(pTHX)
590 {
591     dTHR;
592     SSCHECK(2);
593     SSPUSHPTR(PL_op);
594     SSPUSHINT(SAVEt_OP);
595 }
596
597 I32
598 Perl_save_alloc(pTHX_ I32 size, I32 pad)
599 {
600     dTHR;
601     register I32 start = pad + ((char*)&PL_savestack[PL_savestack_ix]
602                                 - (char*)PL_savestack);
603     register I32 elems = 1 + ((size + pad - 1) / sizeof(*PL_savestack));
604
605     /* SSCHECK may not be good enough */
606     while (PL_savestack_ix + elems + 2 > PL_savestack_max)
607         savestack_grow();
608
609     PL_savestack_ix += elems;
610     SSPUSHINT(elems);
611     SSPUSHINT(SAVEt_ALLOC);
612     return start;
613 }
614
615 void
616 Perl_leave_scope(pTHX_ I32 base)
617 {
618     dTHR;
619     register SV *sv;
620     register SV *value;
621     register GV *gv;
622     register AV *av;
623     register HV *hv;
624     register void* ptr;
625     I32 i;
626
627     if (base < -1)
628         Perl_croak(aTHX_ "panic: corrupt saved stack index");
629     while (PL_savestack_ix > base) {
630         switch (SSPOPINT) {
631         case SAVEt_ITEM:                        /* normal string */
632             value = (SV*)SSPOPPTR;
633             sv = (SV*)SSPOPPTR;
634             sv_replace(sv,value);
635             PL_localizing = 2;
636             SvSETMAGIC(sv);
637             PL_localizing = 0;
638             break;
639         case SAVEt_SV:                          /* scalar reference */
640             value = (SV*)SSPOPPTR;
641             gv = (GV*)SSPOPPTR;
642             ptr = &GvSV(gv);
643             SvREFCNT_dec(gv);
644             goto restore_sv;
645         case SAVEt_GENERIC_SVREF:               /* generic sv */
646             value = (SV*)SSPOPPTR;
647             ptr = SSPOPPTR;
648             if (ptr) {
649                 sv = *(SV**)ptr;
650                 *(SV**)ptr = value;
651                 SvREFCNT_dec(sv);
652             }
653             SvREFCNT_dec(value);
654             break;
655         case SAVEt_SVREF:                       /* scalar reference */
656             value = (SV*)SSPOPPTR;
657             ptr = SSPOPPTR;
658         restore_sv:
659             sv = *(SV**)ptr;
660             DEBUG_S(PerlIO_printf(Perl_debug_log,
661                                   "restore svref: %p %p:%s -> %p:%s\n",
662                                   ptr, sv, SvPEEK(sv), value, SvPEEK(value)));
663             if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv) &&
664                 SvTYPE(sv) != SVt_PVGV)
665             {
666                 (void)SvUPGRADE(value, SvTYPE(sv));
667                 SvMAGIC(value) = SvMAGIC(sv);
668                 SvFLAGS(value) |= SvMAGICAL(sv);
669                 SvMAGICAL_off(sv);
670                 SvMAGIC(sv) = 0;
671             }
672             else if (SvTYPE(value) >= SVt_PVMG && SvMAGIC(value) &&
673                      SvTYPE(value) != SVt_PVGV)
674             {
675                 SvFLAGS(value) |= (SvFLAGS(value) &
676                                    (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
677                 SvMAGICAL_off(value);
678                 SvMAGIC(value) = 0;
679             }
680             SvREFCNT_dec(sv);
681             *(SV**)ptr = value;
682             PL_localizing = 2;
683             SvSETMAGIC(value);
684             PL_localizing = 0;
685             SvREFCNT_dec(value);
686             break;
687         case SAVEt_AV:                          /* array reference */
688             av = (AV*)SSPOPPTR;
689             gv = (GV*)SSPOPPTR;
690             if (GvAV(gv)) {
691                 AV *goner = GvAV(gv);
692                 SvMAGIC(av) = SvMAGIC(goner);
693                 SvFLAGS(av) |= SvMAGICAL(goner);
694                 SvMAGICAL_off(goner);
695                 SvMAGIC(goner) = 0;
696                 SvREFCNT_dec(goner);
697             }
698             GvAV(gv) = av;
699             if (SvMAGICAL(av)) {
700                 PL_localizing = 2;
701                 SvSETMAGIC((SV*)av);
702                 PL_localizing = 0;
703             }
704             break;
705         case SAVEt_HV:                          /* hash reference */
706             hv = (HV*)SSPOPPTR;
707             gv = (GV*)SSPOPPTR;
708             if (GvHV(gv)) {
709                 HV *goner = GvHV(gv);
710                 SvMAGIC(hv) = SvMAGIC(goner);
711                 SvFLAGS(hv) |= SvMAGICAL(goner);
712                 SvMAGICAL_off(goner);
713                 SvMAGIC(goner) = 0;
714                 SvREFCNT_dec(goner);
715             }
716             GvHV(gv) = hv;
717             if (SvMAGICAL(hv)) {
718                 PL_localizing = 2;
719                 SvSETMAGIC((SV*)hv);
720                 PL_localizing = 0;
721             }
722             break;
723         case SAVEt_INT:                         /* int reference */
724             ptr = SSPOPPTR;
725             *(int*)ptr = (int)SSPOPINT;
726             break;
727         case SAVEt_LONG:                        /* long reference */
728             ptr = SSPOPPTR;
729             *(long*)ptr = (long)SSPOPLONG;
730             break;
731         case SAVEt_I32:                         /* I32 reference */
732             ptr = SSPOPPTR;
733             *(I32*)ptr = (I32)SSPOPINT;
734             break;
735         case SAVEt_I16:                         /* I16 reference */
736             ptr = SSPOPPTR;
737             *(I16*)ptr = (I16)SSPOPINT;
738             break;
739         case SAVEt_IV:                          /* IV reference */
740             ptr = SSPOPPTR;
741             *(IV*)ptr = (IV)SSPOPIV;
742             break;
743         case SAVEt_SPTR:                        /* SV* reference */
744             ptr = SSPOPPTR;
745             *(SV**)ptr = (SV*)SSPOPPTR;
746             break;
747         case SAVEt_PPTR:                        /* char* reference */
748             ptr = SSPOPPTR;
749             *(char**)ptr = (char*)SSPOPPTR;
750             break;
751         case SAVEt_HPTR:                        /* HV* reference */
752             ptr = SSPOPPTR;
753             *(HV**)ptr = (HV*)SSPOPPTR;
754             break;
755         case SAVEt_APTR:                        /* AV* reference */
756             ptr = SSPOPPTR;
757             *(AV**)ptr = (AV*)SSPOPPTR;
758             break;
759         case SAVEt_NSTAB:
760             gv = (GV*)SSPOPPTR;
761             (void)sv_clear((SV*)gv);
762             break;
763         case SAVEt_GP:                          /* scalar reference */
764             ptr = SSPOPPTR;
765             gv = (GV*)SSPOPPTR;
766             if (SvPVX(gv) && SvLEN(gv) > 0) {
767                 Safefree(SvPVX(gv));
768             }
769             SvPVX(gv) = (char *)SSPOPPTR;
770             SvCUR(gv) = (STRLEN)SSPOPIV;
771             SvLEN(gv) = (STRLEN)SSPOPIV;
772             gp_free(gv);
773             GvGP(gv) = (GP*)ptr;
774             if (GvCVu(gv))
775                 PL_sub_generation++;  /* putting a method back into circulation */
776             SvREFCNT_dec(gv);
777             break;
778         case SAVEt_FREESV:
779             ptr = SSPOPPTR;
780             SvREFCNT_dec((SV*)ptr);
781             break;
782         case SAVEt_FREEOP:
783             ptr = SSPOPPTR;
784             if (PL_comppad)
785                 PL_curpad = AvARRAY(PL_comppad);
786             op_free((OP*)ptr);
787             break;
788         case SAVEt_FREEPV:
789             ptr = SSPOPPTR;
790             Safefree((char*)ptr);
791             break;
792         case SAVEt_CLEARSV:
793             ptr = (void*)&PL_curpad[SSPOPLONG];
794             sv = *(SV**)ptr;
795             /* Can clear pad variable in place? */
796             if (SvREFCNT(sv) <= 1 && !SvOBJECT(sv)) {
797                 if (SvTHINKFIRST(sv))
798                     sv_force_normal(sv);
799                 if (SvMAGICAL(sv))
800                     mg_free(sv);
801
802                 switch (SvTYPE(sv)) {
803                 case SVt_NULL:
804                     break;
805                 case SVt_PVAV:
806                     av_clear((AV*)sv);
807                     break;
808                 case SVt_PVHV:
809                     hv_clear((HV*)sv);
810                     break;
811                 case SVt_PVCV:
812                     Perl_croak(aTHX_ "panic: leave_scope pad code");
813                 case SVt_RV:
814                 case SVt_IV:
815                 case SVt_NV:
816                     (void)SvOK_off(sv);
817                     break;
818                 default:
819                     (void)SvOK_off(sv);
820                     (void)SvOOK_off(sv);
821                     break;
822                 }
823             }
824             else {      /* Someone has a claim on this, so abandon it. */
825                 U32 padflags = SvFLAGS(sv) & (SVs_PADBUSY|SVs_PADMY|SVs_PADTMP);
826                 switch (SvTYPE(sv)) {   /* Console ourselves with a new value */
827                 case SVt_PVAV:  *(SV**)ptr = (SV*)newAV();      break;
828                 case SVt_PVHV:  *(SV**)ptr = (SV*)newHV();      break;
829                 default:        *(SV**)ptr = NEWSV(0,0);        break;
830                 }
831                 SvREFCNT_dec(sv);       /* Cast current value to the winds. */
832                 SvFLAGS(*(SV**)ptr) |= padflags; /* preserve pad nature */
833             }
834             break;
835         case SAVEt_DELETE:
836             ptr = SSPOPPTR;
837             hv = (HV*)ptr;
838             ptr = SSPOPPTR;
839             (void)hv_delete(hv, (char*)ptr, (U32)SSPOPINT, G_DISCARD);
840             SvREFCNT_dec(hv);
841             Safefree(ptr);
842             break;
843         case SAVEt_DESTRUCTOR:
844             ptr = SSPOPPTR;
845             (*SSPOPDPTR)(ptr);
846             break;
847         case SAVEt_DESTRUCTOR_X:
848             ptr = SSPOPPTR;
849             (*SSPOPDXPTR)(aTHXo_ ptr);
850             break;
851         case SAVEt_REGCONTEXT:
852         case SAVEt_ALLOC:
853             i = SSPOPINT;
854             PL_savestack_ix -= i;       /* regexp must have croaked */
855             break;
856         case SAVEt_STACK_POS:           /* Position on Perl stack */
857             i = SSPOPINT;
858             PL_stack_sp = PL_stack_base + i;
859             break;
860         case SAVEt_AELEM:               /* array element */
861             value = (SV*)SSPOPPTR;
862             i = SSPOPINT;
863             av = (AV*)SSPOPPTR;
864             ptr = av_fetch(av,i,1);
865             if (ptr) {
866                 sv = *(SV**)ptr;
867                 if (sv && sv != &PL_sv_undef) {
868                     if (SvTIED_mg((SV*)av, 'P'))
869                         (void)SvREFCNT_inc(sv);
870                     SvREFCNT_dec(av);
871                     goto restore_sv;
872                 }
873             }
874             SvREFCNT_dec(av);
875             SvREFCNT_dec(value);
876             break;
877         case SAVEt_HELEM:               /* hash element */
878             value = (SV*)SSPOPPTR;
879             sv = (SV*)SSPOPPTR;
880             hv = (HV*)SSPOPPTR;
881             ptr = hv_fetch_ent(hv, sv, 1, 0);
882             if (ptr) {
883                 SV *oval = HeVAL((HE*)ptr);
884                 if (oval && oval != &PL_sv_undef) {
885                     ptr = &HeVAL((HE*)ptr);
886                     if (SvTIED_mg((SV*)hv, 'P'))
887                         (void)SvREFCNT_inc(*(SV**)ptr);
888                     SvREFCNT_dec(hv);
889                     SvREFCNT_dec(sv);
890                     goto restore_sv;
891                 }
892             }
893             SvREFCNT_dec(hv);
894             SvREFCNT_dec(sv);
895             SvREFCNT_dec(value);
896             break;
897         case SAVEt_OP:
898             PL_op = (OP*)SSPOPPTR;
899             break;
900         case SAVEt_HINTS:
901             if (GvHV(PL_hintgv)) {
902                 SvREFCNT_dec((SV*)GvHV(PL_hintgv));
903                 GvHV(PL_hintgv) = NULL;
904             }
905             *(I32*)&PL_hints = (I32)SSPOPINT;
906             break;
907         default:
908             Perl_croak(aTHX_ "panic: leave_scope inconsistency");
909         }
910     }
911 }
912
913 void
914 Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
915 {
916 #ifdef DEBUGGING
917     dTHR;
918     PerlIO_printf(Perl_debug_log, "CX %ld = %s\n", (long)(cx - cxstack), PL_block_type[CxTYPE(cx)]);
919     if (CxTYPE(cx) != CXt_SUBST) {
920         PerlIO_printf(Perl_debug_log, "BLK_OLDSP = %ld\n", (long)cx->blk_oldsp);
921         PerlIO_printf(Perl_debug_log, "BLK_OLDCOP = 0x%lx\n", (long)cx->blk_oldcop);
922         PerlIO_printf(Perl_debug_log, "BLK_OLDMARKSP = %ld\n", (long)cx->blk_oldmarksp);
923         PerlIO_printf(Perl_debug_log, "BLK_OLDSCOPESP = %ld\n", (long)cx->blk_oldscopesp);
924         PerlIO_printf(Perl_debug_log, "BLK_OLDRETSP = %ld\n", (long)cx->blk_oldretsp);
925         PerlIO_printf(Perl_debug_log, "BLK_OLDPM = 0x%lx\n", (long)cx->blk_oldpm);
926         PerlIO_printf(Perl_debug_log, "BLK_GIMME = %s\n", cx->blk_gimme ? "LIST" : "SCALAR");
927     }
928     switch (CxTYPE(cx)) {
929     case CXt_NULL:
930     case CXt_BLOCK:
931         break;
932     case CXt_SUB:
933         PerlIO_printf(Perl_debug_log, "BLK_SUB.CV = 0x%lx\n",
934                 (long)cx->blk_sub.cv);
935         PerlIO_printf(Perl_debug_log, "BLK_SUB.GV = 0x%lx\n",
936                 (long)cx->blk_sub.gv);
937         PerlIO_printf(Perl_debug_log, "BLK_SUB.DFOUTGV = 0x%lx\n",
938                 (long)cx->blk_sub.dfoutgv);
939         PerlIO_printf(Perl_debug_log, "BLK_SUB.OLDDEPTH = %ld\n",
940                 (long)cx->blk_sub.olddepth);
941         PerlIO_printf(Perl_debug_log, "BLK_SUB.HASARGS = %d\n",
942                 (int)cx->blk_sub.hasargs);
943         break;
944     case CXt_EVAL:
945         PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_IN_EVAL = %ld\n",
946                 (long)cx->blk_eval.old_in_eval);
947         PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_OP_TYPE = %s (%s)\n",
948                 PL_op_name[cx->blk_eval.old_op_type],
949                 PL_op_desc[cx->blk_eval.old_op_type]);
950         PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_NAME = %s\n",
951                 cx->blk_eval.old_name);
952         PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_EVAL_ROOT = 0x%lx\n",
953                 (long)cx->blk_eval.old_eval_root);
954         break;
955
956     case CXt_LOOP:
957         PerlIO_printf(Perl_debug_log, "BLK_LOOP.LABEL = %s\n",
958                 cx->blk_loop.label);
959         PerlIO_printf(Perl_debug_log, "BLK_LOOP.RESETSP = %ld\n",
960                 (long)cx->blk_loop.resetsp);
961         PerlIO_printf(Perl_debug_log, "BLK_LOOP.REDO_OP = 0x%lx\n",
962                 (long)cx->blk_loop.redo_op);
963         PerlIO_printf(Perl_debug_log, "BLK_LOOP.NEXT_OP = 0x%lx\n",
964                 (long)cx->blk_loop.next_op);
965         PerlIO_printf(Perl_debug_log, "BLK_LOOP.LAST_OP = 0x%lx\n",
966                 (long)cx->blk_loop.last_op);
967         PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERIX = %ld\n",
968                 (long)cx->blk_loop.iterix);
969         PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERARY = 0x%lx\n",
970                 (long)cx->blk_loop.iterary);
971         PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERVAR = 0x%lx\n",
972                 (long)cx->blk_loop.itervar);
973         if (cx->blk_loop.itervar)
974             PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERSAVE = 0x%lx\n",
975                 (long)cx->blk_loop.itersave);
976         PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERLVAL = 0x%lx\n",
977                 (long)cx->blk_loop.iterlval);
978         break;
979
980     case CXt_SUBST:
981         PerlIO_printf(Perl_debug_log, "SB_ITERS = %ld\n",
982                 (long)cx->sb_iters);
983         PerlIO_printf(Perl_debug_log, "SB_MAXITERS = %ld\n",
984                 (long)cx->sb_maxiters);
985         PerlIO_printf(Perl_debug_log, "SB_RFLAGS = %ld\n",
986                 (long)cx->sb_rflags);
987         PerlIO_printf(Perl_debug_log, "SB_ONCE = %ld\n",
988                 (long)cx->sb_once);
989         PerlIO_printf(Perl_debug_log, "SB_ORIG = %s\n",
990                 cx->sb_orig);
991         PerlIO_printf(Perl_debug_log, "SB_DSTR = 0x%lx\n",
992                 (long)cx->sb_dstr);
993         PerlIO_printf(Perl_debug_log, "SB_TARG = 0x%lx\n",
994                 (long)cx->sb_targ);
995         PerlIO_printf(Perl_debug_log, "SB_S = 0x%lx\n",
996                 (long)cx->sb_s);
997         PerlIO_printf(Perl_debug_log, "SB_M = 0x%lx\n",
998                 (long)cx->sb_m);
999         PerlIO_printf(Perl_debug_log, "SB_STREND = 0x%lx\n",
1000                 (long)cx->sb_strend);
1001         PerlIO_printf(Perl_debug_log, "SB_RXRES = 0x%lx\n",
1002                 (long)cx->sb_rxres);
1003         break;
1004     }
1005 #endif  /* DEBUGGING */
1006 }