diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-03-29 17:11:21 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-03-29 17:11:21 +0900 |
| commit | 76e4de74862b95030f782be692ff307d88ac1492 (patch) | |
| tree | f42c2d89ef5ecb78fe3559990ade0b3f690ef791 | |
| parent | a5244b02c5cd5031d59bc59e7182e69f00cbfade (diff) | |
| parent | 6c097c7113d178fb6559e7690d2ab1513279a82f (diff) | |
| download | mruby-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.c | 19 |
1 files changed, 18 insertions, 1 deletions
@@ -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); |
