diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-04-01 15:40:25 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2020-04-01 15:40:25 +0900 |
| commit | d22b72a7cc63fd4d806b0312422cdc100696fd5b (patch) | |
| tree | a4c766a52009905ecd6367c26e24b27eaa55b402 | |
| parent | 5acd802d2be19872b703d6c9876aa61a262c6c8c (diff) | |
| parent | 15dec8383228e5b2762665ebb4422900d88e4e92 (diff) | |
| download | mruby-d22b72a7cc63fd4d806b0312422cdc100696fd5b.tar.gz mruby-d22b72a7cc63fd4d806b0312422cdc100696fd5b.zip | |
Merge pull request #4957 from dearblue/excessive-arena
Fix `mrb_funcall_with_block()` uses more GC arena
| -rw-r--r-- | src/vm.c | 5 |
1 files changed, 2 insertions, 3 deletions
@@ -430,6 +430,7 @@ MRB_API mrb_value mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc, const mrb_value *argv, mrb_value blk) { mrb_value val; + int ai = mrb_gc_arena_save(mrb); if (!mrb->jmp) { struct mrb_jmpbuf c_jmp; @@ -518,19 +519,17 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc mrb->c->stack[argc+1] = blk; if (MRB_METHOD_CFUNC_P(m)) { - int ai = mrb_gc_arena_save(mrb); - ci->acc = CI_ACC_DIRECT; val = MRB_METHOD_CFUNC(m)(mrb, self); mrb->c->stack = mrb->c->ci->stackent; cipop(mrb); - mrb_gc_arena_restore(mrb, ai); } else { ci->acc = CI_ACC_SKIP; val = mrb_run(mrb, MRB_METHOD_PROC(m), self); } } + mrb_gc_arena_restore(mrb, ai); mrb_gc_protect(mrb, val); return val; } |
