summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-03-06 07:34:27 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-03-06 07:35:41 +0900
commit8a15abdac2d05d70018f950d428abb0957d7ebd0 (patch)
tree9a8fcd10e8c2c29a711a012aad95e0f4d6cda680 /src/vm.c
parentd050694580e99bc5699da36640d8ce2b4e93c5d0 (diff)
downloadmruby-8a15abdac2d05d70018f950d428abb0957d7ebd0.tar.gz
mruby-8a15abdac2d05d70018f950d428abb0957d7ebd0.zip
Avoid trampoline code if mrb_f_send is called from funcall; fix #3383
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/vm.c b/src/vm.c
index 54877df23..e9c8b81bc 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -521,15 +521,19 @@ mrb_f_send(mrb_state *mrb, mrb_value self)
mrb_callinfo *ci;
mrb_get_args(mrb, "n*&", &name, &argv, &argc, &block);
+ ci = mrb->c->ci;
+ if (ci->acc < 0) {
+ funcall:
+ return mrb_funcall_with_block(mrb, self, name, argc, argv, block);
+ }
c = mrb_class(mrb, self);
p = mrb_method_search_vm(mrb, &c, name);
if (!p) { /* call method_mising */
- return mrb_funcall_with_block(mrb, self, name, argc, argv, block);
+ goto funcall;
}
- ci = mrb->c->ci;
ci->mid = name;
ci->target_class = c;
regs = mrb->c->stack+1;