diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-04-23 15:30:10 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-04-23 15:30:10 +0900 |
| commit | e9f3902ab5544de31fc91459e1846650aa228142 (patch) | |
| tree | bd11a001f6d5f24f4c799e5f8ebdbba51e278efc /src | |
| parent | 7cf1bc39a7184e92b0fe534e610b288accc61e5a (diff) | |
| download | mruby-e9f3902ab5544de31fc91459e1846650aa228142.tar.gz mruby-e9f3902ab5544de31fc91459e1846650aa228142.zip | |
Fixed the condition in `mrb_funcall_with_block`; fix #4389
Diffstat (limited to 'src')
| -rw-r--r-- | src/vm.c | 13 |
1 files changed, 6 insertions, 7 deletions
@@ -490,22 +490,21 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc if (mrb->c->stbase <= argv && argv < mrb->c->stend) { voff = argv - mrb->c->stbase; } - if (MRB_METHOD_CFUNC_P(m)) { - mrb_stack_extend(mrb, argc + 2); - } - else if (argc >= CALL_MAXARGS) { + if (argc >= CALL_MAXARGS) { mrb_value args = mrb_ary_new_from_values(mrb, argc, argv); - mrb_stack_extend(mrb, 3); mrb->c->stack[1] = args; ci->argc = -1; argc = 1; } - else if (MRB_METHOD_PROC_P(m)) { + mrb_stack_extend(mrb, argc + 2); + if (MRB_METHOD_PROC_P(m)) { struct RProc *p = MRB_METHOD_PROC(m); ci->proc = p; - mrb_stack_extend(mrb, p->body.irep->nregs + argc); + if (!MRB_PROC_CFUNC_P(p)) { + mrb_stack_extend(mrb, p->body.irep->nregs + argc); + } } if (voff >= 0) { argv = mrb->c->stbase + voff; |
