Protect from exceptions raised outside of `mrb_vm_run()`.
It can happen if signals are used (e.g. from `mruby-alarm` gem).
#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;
@@ -556,7 +560,6 @@ main(int argc, char **argv)
#endif
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
