diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-03-06 07:34:27 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-03-06 07:35:41 +0900 |
| commit | 8a15abdac2d05d70018f950d428abb0957d7ebd0 (patch) | |
| tree | 9a8fcd10e8c2c29a711a012aad95e0f4d6cda680 /src | |
| parent | d050694580e99bc5699da36640d8ce2b4e93c5d0 (diff) | |
| download | mruby-8a15abdac2d05d70018f950d428abb0957d7ebd0.tar.gz mruby-8a15abdac2d05d70018f950d428abb0957d7ebd0.zip | |
Avoid trampoline code if mrb_f_send is called from funcall; fix #3383
Diffstat (limited to 'src')
| -rw-r--r-- | src/vm.c | 8 |
1 files changed, 6 insertions, 2 deletions
@@ -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; |
