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