From a7c6d24429ab2b6db54575a3bdc62c7ed9f881cf Mon Sep 17 00:00:00 2001 From: Nick Ing-Simmons Date: Sat, 14 Aug 1999 09:20:58 +0000 Subject: 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 --- perl.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'perl.c') 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; -- cgit v1.2.1