summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core/parse.y
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-04-12 10:02:40 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-04-12 10:23:34 +0900
commit326e043a64b37a6c0859ced234689f1dff8d6bee (patch)
tree152de1c855f877c96f464f5617be98e01a6b4d1d /mrbgems/mruby-compiler/core/parse.y
parent918e7bb18746db6879f8e501391606d6c26a051f (diff)
downloadmruby-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.y26
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");