summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-11-21 12:08:51 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2018-11-25 06:05:07 +0900
commite2e6554b569648bca8bf26ffcb951737e07c6888 (patch)
tree7d60898a6eeb1a08055a1a4f58eddee3ea5cec21
parent91bf55bbe5c837531f5785309eb0983e7ce78633 (diff)
downloadmruby-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.c12
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