diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-03-03 13:31:29 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-03-03 13:31:29 +0900 |
| commit | 369c6c3649b5abbca290589585d9a7d365b3e9db (patch) | |
| tree | bd1dd45582a2e911f0050b5e4de7f589837766d9 /src | |
| parent | 933f8013e0d2ef1b228ca8607e05c85b15b09d58 (diff) | |
| download | mruby-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.c | 8 |
1 files changed, 7 insertions, 1 deletions
@@ -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; |
