From 0d2346f9a1bec6824863404cb371492336c673e4 Mon Sep 17 00:00:00 2001
From: ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
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

