From: George Greer Date: Sat, 10 Jul 2010 23:18:12 +0000 (-0400) Subject: Fix for RT#2353: catch yyparse() exceptions in (?{...}) X-Git-Tag: accepted/trunk/20130322.191538~8498 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=634d6919699655c843f8d8c3ea64922d0403c499;p=platform%2Fupstream%2Fperl.git Fix for RT#2353: catch yyparse() exceptions in (?{...}) Ticket is entitled: "panic: top_env when localizing a lexical variable in qr{(?{...})}" but a better description would be: "(?{...}) does not catch yyparse() exceptions in regex compilation" Changes Perl_sv_compile_2op() to tell doeval() that it must use S_try_yyparse() to catch any exception that yyparse() may throw. --- diff --git a/pp_ctl.c b/pp_ctl.c index 1bac360..a93d6dc 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -2914,6 +2914,7 @@ Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, const char *code, PAD** padp) int runtime; CV* runcv = NULL; /* initialise to avoid compiler warnings */ STRLEN len; + bool need_catch; PERL_ARGS_ASSERT_SV_COMPILE_2OP; @@ -2965,11 +2966,14 @@ Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, const char *code, PAD** padp) PL_op->op_flags = 0; /* Avoid uninit warning. */ PUSHBLOCK(cx, CXt_EVAL|(IN_PERL_COMPILETIME ? 0 : CXp_REAL), SP); PUSHEVAL(cx, 0); + need_catch = CATCH_GET; + CATCH_SET(TRUE); if (runtime) (void) doeval(G_SCALAR, startop, runcv, PL_curcop->cop_seq); else (void) doeval(G_SCALAR, startop, PL_compcv, PL_cop_seqmax); + CATCH_SET(need_catch); POPBLOCK(cx,PL_curpm); POPEVAL(cx);