summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-03-29 17:11:21 +0900
committerGitHub <[email protected]>2021-03-29 17:11:21 +0900
commit76e4de74862b95030f782be692ff307d88ac1492 (patch)
treef42c2d89ef5ecb78fe3559990ade0b3f690ef791
parenta5244b02c5cd5031d59bc59e7182e69f00cbfade (diff)
parent6c097c7113d178fb6559e7690d2ab1513279a82f (diff)
downloadmruby-76e4de74862b95030f782be692ff307d88ac1492.tar.gz
mruby-76e4de74862b95030f782be692ff307d88ac1492.zip
Merge pull request #5391 from dearblue/throw
Fix `SIGSEGV` with mruby-method + mruby-catch
-rw-r--r--src/vm.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/vm.c b/src/vm.c
index bb1047a30..945bbe40b 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -780,8 +780,25 @@ mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value
mrb->c->ci->stack[argc+1] = mrb_nil_value();
if (MRB_PROC_CFUNC_P(p)) {
- val = MRB_PROC_CFUNC(p)(mrb, self);
+ struct mrb_jmpbuf *prev_jmp = mrb->jmp;
+ struct mrb_jmpbuf c_jmp;
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_bool exc = FALSE;
+
+ MRB_TRY(&c_jmp) {
+ mrb->jmp = &c_jmp;
+ ci->acc = CI_ACC_DIRECT;
+ val = MRB_PROC_CFUNC(p)(mrb, self);
+ }
+ MRB_CATCH(&c_jmp) {
+ exc = TRUE;
+ }
+ MRB_END_EXC(&c_jmp);
+
+ mrb->jmp = prev_jmp;
+ mrb_gc_arena_restore(mrb, ai);
cipop(mrb);
+ if (exc) MRB_THROW(mrb->jmp);
}
else {
val = mrb_run(mrb, p, self);