From 326e043a64b37a6c0859ced234689f1dff8d6bee Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 12 Apr 2017 10:02:40 +0900 Subject: Exceptions may be raised in yyparse(); fix #3600 --- mrbgems/mruby-compiler/core/parse.y | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'mrbgems/mruby-compiler/core') diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 226701b52..3e4e146f0 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -5514,10 +5514,11 @@ void mrb_parser_dump(mrb_state *mrb, node *tree, int offset); MRB_API void mrb_parser_parse(parser_state *p, mrbc_context *c) { - struct mrb_jmpbuf buf; - p->jmp = &buf; + struct mrb_jmpbuf buf1; + p->jmp = &buf1; MRB_TRY(p->jmp) { + int n; p->cmd_start = TRUE; p->in_def = p->in_single = 0; @@ -5525,7 +5526,25 @@ mrb_parser_parse(parser_state *p, mrbc_context *c) p->lex_strterm = NULL; parser_init_cxt(p, c); - if (yyparse(p) != 0 || p->nerr > 0) { + + if (p->mrb->jmp) { + n = yyparse(p); + } + else { + struct mrb_jmpbuf buf2; + + p->mrb->jmp = &buf2; + MRB_TRY(p->mrb->jmp) { + n = yyparse(p); + } + MRB_CATCH(p->mrb->jmp) { + p->nerr++; + mrb_p(p->mrb, mrb_obj_value(p->mrb->exc)); + } + MRB_END_EXC(p->mrb->jmp); + p->mrb->jmp = 0; + } + if (n != 0 || p->nerr > 0) { p->tree = 0; return; } @@ -5536,7 +5555,6 @@ mrb_parser_parse(parser_state *p, mrbc_context *c) if (c && c->dump_result) { mrb_parser_dump(p->mrb, p->tree, 0); } - } MRB_CATCH(p->jmp) { yyerror(p, "memory allocation error"); -- cgit v1.2.3