diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-11-21 12:08:51 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-11-25 06:05:07 +0900 |
| commit | e2e6554b569648bca8bf26ffcb951737e07c6888 (patch) | |
| tree | 7d60898a6eeb1a08055a1a4f58eddee3ea5cec21 | |
| parent | 91bf55bbe5c837531f5785309eb0983e7ce78633 (diff) | |
| download | mruby-e2e6554b569648bca8bf26ffcb951737e07c6888.tar.gz mruby-e2e6554b569648bca8bf26ffcb951737e07c6888.zip | |
Protect from exceptions raised outside of `mrb_vm_run()`.
It can happen if signals are used (e.g. from `mruby-alarm` gem).
| -rw-r--r-- | mrbgems/mruby-bin-mirb/tools/mirb/mirb.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c index 19f533acd..8d7c719d8 100644 --- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c @@ -56,6 +56,7 @@ #include <mruby/dump.h> #include <mruby/string.h> #include <mruby/variable.h> +#include <mruby/throw.h> #ifdef ENABLE_READLINE @@ -491,7 +492,10 @@ main(int argc, char **argv) while (TRUE) { char *utf8; + struct mrb_jmpbuf c_jmp; + MRB_TRY(&c_jmp); + mrb->jmp = &c_jmp; if (args.rfp) { if (fgets(last_code_line, sizeof(last_code_line)-1, args.rfp) != NULL) goto done; @@ -555,8 +559,7 @@ main(int argc, char **argv) MIRB_LINE_FREE(line); #endif -done: - + done: if (code_block_open) { if (strlen(ruby_code)+strlen(last_code_line) > sizeof(ruby_code)-1) { fputs("concatenated input string too long\n", stderr); @@ -648,6 +651,11 @@ done: } mrb_parser_free(parser); cxt->lineno++; + MRB_CATCH(&c_jmp) { + p(mrb, mrb_obj_value(mrb->exc), 0); + mrb->exc = 0; + } + MRB_END_EXC(&c_jmp); } #ifdef ENABLE_READLINE |
