From 973883aaa16bde8ba41caceb56569b52adb4c74f Mon Sep 17 00:00:00 2001 From: 卜部昌平 Date: Tue, 26 May 2020 11:24:15 +0900 Subject: 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 --- vm_insnhelper.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'vm_insnhelper.c') 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 -- cgit v1.2.3