From 0d2346f9a1bec6824863404cb371492336c673e4 Mon Sep 17 00:00:00 2001 From: ko1 Date: Fri, 5 Jan 2018 17:51:10 +0000 Subject: Speedup `Proc#call` [Feature #14318] * vm_insnhelper.c (vm_call_opt_call): do same process of `yield` instead of invoking `Proc`. * vm_insnhelper.c (vm_invoke_block): invoke given block handler instead of using a block handler in the current frame. Also do not check blcok handler here (caller should check it). * insns.def (invokeblock): catch up this fix. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61624 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- insns.def | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'insns.def') diff --git a/insns.def b/insns.def index 37fa5ec853..bab9d14488 100644 --- a/insns.def +++ b/insns.def @@ -947,11 +947,18 @@ invokeblock (VALUE val) // inc += 1 - ci->orig_argc; { struct rb_calling_info calling; + VALUE block_handler; + calling.argc = ci->orig_argc; calling.block_handler = VM_BLOCK_HANDLER_NONE; calling.recv = Qundef; /* should not be used */ - val = vm_invoke_block(ec, GET_CFP(), &calling, ci); + block_handler = VM_CF_BLOCK_HANDLER(GET_CFP()); + if (block_handler == VM_BLOCK_HANDLER_NONE) { + rb_vm_localjump_error("no block given (yield)", Qnil, 0); + } + + val = vm_invoke_block(ec, GET_CFP(), &calling, ci, block_handler); if (val == Qundef) { RESTORE_REGS(); NEXT_INSN(); -- cgit v1.2.3