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)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 2 Sep 2011 15:42:42 +0000 (08:42 -0700)
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.
(cherry picked from commit 634d6919699655c843f8d8c3ea64922d0403c499)

pp_ctl.c

index b9bcc28..a31444e 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -2924,6 +2924,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;
 
@@ -2975,11 +2976,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);