summaryrefslogtreecommitdiff
path: root/vm_insnhelper.c
diff options
context:
space:
mode:
author卜部昌平 <shyouhei@ruby-lang.org>2020-05-26 11:24:15 +0900
committer卜部昌平 <shyouhei@ruby-lang.org>2020-06-03 16:13:47 +0900
commit973883aaa16bde8ba41caceb56569b52adb4c74f (patch)
treea8108e6367acf9937ecedc26fd1ff6e63917a54f /vm_insnhelper.c
parent796f9edae0a48c2949345febd8189809fbfdb192 (diff)
vm_invoke_block: force indirect jump
This changeset slightly speeds up on my machine. Calculating ------------------------------------- before after Optcarrot Lan_Master.nes 38.33488426546287 40.89825082589147 fps 40.91288557922081 41.48687465359386 40.96591995270991 41.98499064664184 41.20461943032173 43.67314690779162 42.38344888176518 44.02777536251875 43.43563728880915 44.88695892714136 43.88082889062643 45.11226186242523
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3152
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r--vm_insnhelper.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 2d9b96b5e7..baf682ba85 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -3472,18 +3472,18 @@ vm_invoke_block(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp,
struct rb_calling_info *calling, const struct rb_callinfo *ci,
bool is_lambda, VALUE block_handler)
{
+ auto VALUE (*func)(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp,
+ struct rb_calling_info *calling, const struct rb_callinfo *ci,
+ bool is_lambda, VALUE block_handler);
+
switch (vm_block_handler_type(block_handler)) {
- case block_handler_type_iseq:
- return vm_invoke_iseq_block(ec, reg_cfp, calling, ci, is_lambda, block_handler);
- case block_handler_type_ifunc:
- return vm_invoke_ifunc_block(ec, reg_cfp, calling, ci, is_lambda, block_handler);
- case block_handler_type_proc:
- return vm_invoke_proc_block(ec, reg_cfp, calling, ci, is_lambda, block_handler);
- case block_handler_type_symbol:
- return vm_invoke_symbol_block(ec, reg_cfp, calling, ci, is_lambda, block_handler);
- }
- VM_UNREACHABLE(vm_invoke_block: unreachable);
- return Qnil;
+ case block_handler_type_iseq: func = vm_invoke_iseq_block; break;
+ case block_handler_type_ifunc: func = vm_invoke_ifunc_block; break;
+ case block_handler_type_proc: func = vm_invoke_proc_block; break;
+ case block_handler_type_symbol: func = vm_invoke_symbol_block; break;
+ }
+
+ return func(ec, reg_cfp, calling, ci, is_lambda, block_handler);
}
static VALUE