diff options
-rw-r--r-- | cop.h | 4 | ||||
-rw-r--r-- | perl.c | 6 | ||||
-rw-r--r-- | pp_ctl.c | 4 |
3 files changed, 10 insertions, 4 deletions
@@ -357,6 +357,8 @@ typedef struct stackinfo PERL_SI; #define POPSTACK_TO(s) \ STMT_START { \ - while (curstack != s) \ + while (curstack != s) { \ + dounwind(-1); \ POPSTACK(); \ + } \ } STMT_END @@ -327,6 +327,7 @@ perl_destruct(register PerlInterpreter *sv_interp) op_free(main_root); main_root = Nullop; } + curcop = &compiling; main_start = Nullop; SvREFCNT_dec(main_cv); main_cv = Nullcv; @@ -2491,7 +2492,7 @@ nuke_stacks(void) curstackinfo = curstackinfo->si_next; while (curstackinfo) { PERL_SI *p = curstackinfo->si_prev; - SvREFCNT_dec(curstackinfo->si_stack); + /* curstackinfo->si_stack got nuked by sv_free_arenas() */ Safefree(curstackinfo->si_cxstack); Safefree(curstackinfo); curstackinfo = p; @@ -2978,7 +2979,7 @@ my_failure_exit(void) static void my_exit_jump(void) { - dTHR; + dSP; register PERL_CONTEXT *cx; I32 gimme; SV **newsp; @@ -2993,6 +2994,7 @@ my_exit_jump(void) e_tmpname = Nullch; } + POPSTACK_TO(mainstack); if (cxstack_ix >= 0) { if (cxstack_ix > 0) dounwind(0); @@ -1059,8 +1059,10 @@ die_where(char *message) else sv_setpv(ERRSV, message); - while ((cxix = dopoptoeval(cxstack_ix)) < 0 && curstackinfo->si_prev) + while ((cxix = dopoptoeval(cxstack_ix)) < 0 && curstackinfo->si_prev) { + dounwind(-1); POPSTACK(); + } if (cxix >= 0) { I32 optype; |