summaryrefslogtreecommitdiff
path: root/perl.c
diff options
context:
space:
mode:
authorNick Ing-Simmons <nik@tiuk.ti.com>1999-08-14 09:20:58 +0000
committerNick Ing-Simmons <nik@tiuk.ti.com>1999-08-14 09:20:58 +0000
commita7c6d24429ab2b6db54575a3bdc62c7ed9f881cf (patch)
tree7d35f0d7ea024de4150a892601d0a84bcd7d1c59 /perl.c
parent7e291ef107a151a0b630a8ce85d6a562438da741 (diff)
downloadperl-a7c6d24429ab2b6db54575a3bdc62c7ed9f881cf.tar.gz
New lightweight Carp has a require. If Carp is used in a __DIE__ handler
this causes a POPSTACK panic. The problem seems to be that although die_where() has unwound the tail of perl_vdie() top_env setjmp has been set to resume execution there. Avoiding setting CATCH_SET(TRUE) in call_sv() avoids this. So invent a new G_NOCATCH flag to disable messing with CATCH_SET() in call_sv, use it in perl_vdie(). Add test to op/eval.t which will fail (panic) if bug comes back. >>> I AM NOT CONVINCED THIS IS CORRECT LONG TERM FIX <<< p4raw-id: //depot/perl@3988
Diffstat (limited to 'perl.c')
-rw-r--r--perl.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/perl.c b/perl.c
index d81187989f..8c8b84c387 100644
--- a/perl.c
+++ b/perl.c
@@ -1225,10 +1225,16 @@ Perl_call_sv(pTHX_ SV *sv, I32 flags)
PL_op->op_private |= OPpENTERSUB_DB;
if (!(flags & G_EVAL)) {
- CATCH_SET(TRUE);
+ /* G_NOCATCH is a hack for perl_vdie using this path to call
+ a __DIE__ handler */
+ if (!(flags & G_NOCATCH)) {
+ CATCH_SET(TRUE);
+ }
call_xbody((OP*)&myop, FALSE);
retval = PL_stack_sp - (PL_stack_base + oldmark);
- CATCH_SET(FALSE);
+ if (!(flags & G_NOCATCH)) {
+ CATCH_SET(FALSE);
+ }
}
else {
cLOGOP->op_other = PL_op;