Fix for RT#2353: catch yyparse() exceptions in (?{...})
authorGeorge Greer <perl@greerga.m-l.org>
Sat, 10 Jul 2010 23:18:12 +0000 (19:18 -0400)
committerRafael Garcia-Suarez <rgs@consttype.org>
Mon, 12 Jul 2010 11:53:33 +0000 (13:53 +0200)
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.

pp_ctl.c

index 1bac360..a93d6dc 100644 (file)
--- 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);