diff options
| author | take_cheeze <[email protected]> | 2014-02-25 18:47:28 +0900 |
|---|---|---|
| committer | take_cheeze <[email protected]> | 2014-03-01 20:05:29 +0900 |
| commit | 78915f96017a12e8c3c40a4a2714543c10d0d070 (patch) | |
| tree | 9db022c63ebd09aec5d1164141a0bdb85cc93d3f /src/parse.y | |
| parent | 5ff9c1d2861609fc98f03ec2d768e0b4f1559a09 (diff) | |
| download | mruby-78915f96017a12e8c3c40a4a2714543c10d0d070.tar.gz mruby-78915f96017a12e8c3c40a4a2714543c10d0d070.zip | |
support c++ exception
Diffstat (limited to 'src/parse.y')
| -rw-r--r-- | src/parse.y | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/parse.y b/src/parse.y index 43dfc57fc..53b271496 100644 --- a/src/parse.y +++ b/src/parse.y @@ -25,6 +25,7 @@ #include "mruby/compile.h" #include "mruby/proc.h" #include "node.h" +#include "mrb_throw.h" #define YYLEX_PARAM p @@ -103,7 +104,7 @@ parser_palloc(parser_state *p, size_t size) void *m = mrb_pool_alloc(p->pool, size); if (!m) { - longjmp(p->jmp, 1); + MRB_THROW(p->jmp); } return m; } @@ -5189,12 +5190,10 @@ void mrb_parser_dump(mrb_state *mrb, node *tree, int offset); void mrb_parser_parse(parser_state *p, mrbc_context *c) { - if (setjmp(p->jmp) != 0) { - yyerror(p, "memory allocation error"); - p->nerr++; - p->tree = 0; - return; - } + struct mrb_jmpbuf buf; + p->jmp = &buf; + + MRB_TRY(p->jmp) { p->cmd_start = TRUE; p->in_def = p->in_single = 0; @@ -5210,6 +5209,15 @@ 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"); + p->nerr++; + p->tree = 0; + return; + } + MRB_END_EXC(p->jmp); } parser_state* @@ -5316,7 +5324,7 @@ mrb_parser_set_filename(struct mrb_parser_state *p, const char *f) p->current_filename_index = p->filename_table_length++; - new_table = parser_palloc(p, sizeof(mrb_sym) * p->filename_table_length); + new_table = (mrb_sym*)parser_palloc(p, sizeof(mrb_sym) * p->filename_table_length); if (p->filename_table) { memcpy(new_table, p->filename_table, sizeof(mrb_sym) * p->filename_table_length); } |
