summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-03-03 13:31:29 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-03-03 13:31:29 +0900
commit369c6c3649b5abbca290589585d9a7d365b3e9db (patch)
treebd1dd45582a2e911f0050b5e4de7f589837766d9 /src
parent933f8013e0d2ef1b228ca8607e05c85b15b09d58 (diff)
downloadmruby-369c6c3649b5abbca290589585d9a7d365b3e9db.tar.gz
mruby-369c6c3649b5abbca290589585d9a7d365b3e9db.zip
Kernel#send does not use mrb_funcall anymore for most cases; ref #1680
Diffstat (limited to 'src')
-rw-r--r--src/vm.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/vm.c b/src/vm.c
index a99379e15..c1ff4a68c 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -451,7 +451,8 @@ mrb_f_send(mrb_state *mrb, mrb_value self)
c = mrb_class(mrb, self);
p = mrb_method_search_vm(mrb, &c, name);
- if (!p || MRB_PROC_CFUNC_P(p)) {
+
+ if (!p) { /* call method_mising */
return mrb_funcall_with_block(mrb, self, name, argc, argv, block);
}
@@ -470,6 +471,11 @@ mrb_f_send(mrb_state *mrb, mrb_value self)
else { /* variable length arguments */
mrb_ary_shift(mrb, regs[0]);
}
+
+ if (MRB_PROC_CFUNC_P(p)) {
+ return p->body.func(mrb, self);
+ }
+
cipush(mrb);
ci = mrb->c->ci;
ci->target_class = 0;