From 71fee9bc720ba7a117062bf3f78b6086527b656c Mon Sep 17 00:00:00 2001
From: Koichi Sasada <ko1@atdot.net>
Date: Fri, 15 Nov 2019 17:49:49 +0900
Subject: vm_invoke_builtin_delegate with start index.

opt_invokebuiltin_delegate and opt_invokebuiltin_delegate_leave
invokes builtin functions with same parameters of the method.
This technique eliminate stack push operations. However, delegation
parameters should be completely same as given parameters.
(e.g. `def foo(a, b, c) __builtin_foo(a, b, c)` is okay, but
__builtin_foo(b, c) is not allowed)

This patch relaxes this restriction. ISeq has a local variables
table which includes parameters. For example, the method defined
as `def foo(a, b, c) x=y=nil`, then local variables table contains
[a, b, c, x, y]. If calling builtin-function with arguments which
are sub-array of the lvar table, use opt_invokebuiltin_delegate
instruction with start index. For example, `__builtin_foo(b, c)`,
`__builtin_bar(c, x, y)` is okay, and so on.
---
 insns.def | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

(limited to 'insns.def')

diff --git a/insns.def b/insns.def
index df505808ce..0388a364da 100644
--- a/insns.def
+++ b/insns.def
@@ -1492,26 +1492,26 @@ invokebuiltin
 /* call specific function with args (same parameters) */
 DEFINE_INSN
 opt_invokebuiltin_delegate
-(RB_BUILTIN bf)
+(RB_BUILTIN bf, rb_num_t index)
 ()
 (VALUE ret)
 // attr bool leaf = false; /* anything can happen inside */
 {
-    ret = vm_invoke_builtin_delegate(ec, reg_cfp, bf);
+    ret = vm_invoke_builtin_delegate(ec, reg_cfp, bf, index);
 }
 
 /* call specific function with args (same parameters) and leave */
 DEFINE_INSN
 opt_invokebuiltin_delegate_leave
-(RB_BUILTIN bf)
+(RB_BUILTIN bf, rb_num_t index)
 ()
 (VALUE val)
 // attr bool leaf = false; /* anything can happen inside */
 {
-    val = vm_invoke_builtin_delegate(ec, reg_cfp, bf);
+    val = vm_invoke_builtin_delegate(ec, reg_cfp, bf, index);
 
     /* leave fastpath */
-    /* TracePoint/return should fallback this insn to invokecfuncwparam */
+    /* TracePoint/return should fallback this insn to opt_invokebuiltin_delegate */
     if (vm_pop_frame(ec, GET_CFP(), GET_EP())) {
 #if OPT_CALL_THREADED_CODE
         rb_ec_thread_ptr(ec)->retval = val;
-- 
cgit v1.2.3

