diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-12 10:02:40 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-12 10:23:34 +0900 |
| commit | 326e043a64b37a6c0859ced234689f1dff8d6bee (patch) | |
| tree | 152de1c855f877c96f464f5617be98e01a6b4d1d /mrbgems/mruby-compiler/core/parse.y | |
| parent | 918e7bb18746db6879f8e501391606d6c26a051f (diff) | |
| download | mruby-326e043a64b37a6c0859ced234689f1dff8d6bee.tar.gz mruby-326e043a64b37a6c0859ced234689f1dff8d6bee.zip | |
Exceptions may be raised in yyparse(); fix #3600
Diffstat (limited to 'mrbgems/mruby-compiler/core/parse.y')
| -rw-r--r-- | mrbgems/mruby-compiler/core/parse.y | 26 |
1 files changed, 22 insertions, 4 deletions
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"); |
