diff options
author | Gurusamy Sarathy <gsar@cpan.org> | 1998-04-04 20:31:56 +0000 |
---|---|---|
committer | Gurusamy Sarathy <gsar@cpan.org> | 1998-04-04 20:31:56 +0000 |
commit | bac4b2ad63e048350f82163026a348685ed8c235 (patch) | |
tree | bbb62f0fc426831b0e590d73406c99c8e6a19b0a | |
parent | a776945caf9d6bac6272042bcf015c29670a54e2 (diff) | |
download | perl-bac4b2ad63e048350f82163026a348685ed8c235.tar.gz |
[win32] fixes for various noises under PERL_DESTRUCT_LEVEL
p4raw-id: //depot/win32/perl@878
-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; |