summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2019-04-23 15:30:10 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2019-04-23 15:30:10 +0900
commite9f3902ab5544de31fc91459e1846650aa228142 (patch)
treebd11a001f6d5f24f4c799e5f8ebdbba51e278efc
parent7cf1bc39a7184e92b0fe534e610b288accc61e5a (diff)
downloadmruby-e9f3902ab5544de31fc91459e1846650aa228142.tar.gz
mruby-e9f3902ab5544de31fc91459e1846650aa228142.zip
Fixed the condition in `mrb_funcall_with_block`; fix #4389
-rw-r--r--src/vm.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/src/vm.c b/src/vm.c
index 9c07b8caa..8dc6623d1 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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;