[前][次][番号順一覧][スレッド一覧]

ruby-changes:74483

From: Takashi <ko1@a...>
Date: Mon, 14 Nov 2022 14:15:29 +0900 (JST)
Subject: [ruby-changes:74483] 96d29dff66 (master): Fix invokebuiltin in Ruby MJIT

https://git.ruby-lang.org/ruby.git/commit/?id=96d29dff66

From 96d29dff66a0d2e045d09ce6bb7bb3b382c59c2c Mon Sep 17 00:00:00 2001
From: Takashi Kokubun <takashikkbn@g...>
Date: Sun, 13 Nov 2022 21:14:46 -0800
Subject: Fix invokebuiltin in Ruby MJIT

https://github.com/ruby/ruby/blob/45fe7f757522ed7d1d3ec754da59d41d45dd6bab/tool/ruby_vm/views/_mjit_compile_invokebuiltin.erb#L21
has not been ported correctly.
---
 lib/mjit/compiler.rb   |  3 ++-
 test/ruby/test_mjit.rb | 12 +++++++++---
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/lib/mjit/compiler.rb b/lib/mjit/compiler.rb
index 9e6ea0a119..db8327b863 100644
--- a/lib/mjit/compiler.rb
+++ b/lib/mjit/compiler.rb
@@ -446,9 +446,10 @@ module RubyVM::MJIT https://github.com/ruby/ruby/blob/trunk/lib/mjit/compiler.rb#L446
     def compile_invokebuiltin(f, insn, stack_size, sp_inc, body, operands)
       bf = C.RB_BUILTIN.new(operands[0])
       if bf.compiler > 0
+        index = (insn.name == :invokebuiltin ? -1 : operands[1])
         C.fprintf(f, "{\n")
         C.fprintf(f, "    VALUE val;\n")
-        C.builtin_compiler(f, bf, operands[1], stack_size, body.builtin_inline_p)
+        C.builtin_compiler(f, bf, index, stack_size, body.builtin_inline_p)
         C.fprintf(f, "    stack[#{stack_size + sp_inc - 1}] = val;\n")
         C.fprintf(f, "}\n")
         return true
diff --git a/test/ruby/test_mjit.rb b/test/ruby/test_mjit.rb
index 4c6cc6f39f..2fc878154b 100644
--- a/test/ruby/test_mjit.rb
+++ b/test/ruby/test_mjit.rb
@@ -24,9 +24,6 @@ class TestMJIT < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_mjit.rb#L24
     # not supported yet
     :defineclass,
 
-    # to be tested
-    :invokebuiltin,
-
     # never used
     :opt_invokebuiltin_delegate,
   ].each do |insn|
@@ -600,6 +597,15 @@ class TestMJIT < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_mjit.rb#L597
     assert_compile_once("'true' =~ /true/", result_inspect: '0', insns: %i[opt_regexpmatch2])
   end
 
+  def test_compile_insn_invokebuiltin
+    iseq = eval(EnvUtil.invoke_ruby(['-e', <<~'EOS'], '', true).first)
+      p RubyVM::InstructionSequence.of([].method(:sample)).to_a
+    EOS
+    insns = collect_insns(iseq)
+    mark_tested_insn(:invokebuiltin, used_insns: insns)
+    assert_eval_with_jit('print [].sample(1)', stdout: '[]', success_count: 1)
+  end
+
   def test_compile_insn_opt_invokebuiltin_delegate_leave
     iseq = eval(EnvUtil.invoke_ruby(['-e', <<~'EOS'], '', true).first)
       p RubyVM::InstructionSequence.of("\x00".method(:unpack)).to_a
-- 
cgit v1.2.3


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]