diff --git a/test/lib/jit_support.rb b/test/lib/jit_support.rb new file mode 100644 index 0000000000..a6c22165be --- /dev/null +++ b/test/lib/jit_support.rb @@ -0,0 +1,33 @@ +module JITSupport + JIT_TIMEOUT = 600 # 10min for each... + JIT_SUCCESS_PREFIX = 'JIT success \(\d+\.\dms\)' + SUPPORTED_COMPILERS = [ + 'gcc', + 'clang', + ] + + module_function + def eval_with_jit(script, verbose: 0, min_calls: 5, timeout: JIT_TIMEOUT) + EnvUtil.invoke_ruby( + ['--disable-gems', '--jit-wait', "--jit-verbose=#{verbose}", "--jit-min-calls=#{min_calls}", '-e', script], + '', true, true, timeout: timeout, + ) + end + + def supported? + # Experimental. If you want to ensure JIT is working with this test, please set this for now. + if ENV.key?('RUBY_FORCE_TEST_JIT') + return true + end + + # Very pessimistic check. With this check, we can't ensure JIT is working. + begin + _, err = JITSupport.eval_with_jit('proc {}.call', verbose: 1, min_calls: 1, timeout: 10) + rescue Timeout::Error + $stderr.puts "TestJIT: #jit_supported? check timed out" + false + else + err.match?(JIT_SUCCESS_PREFIX) + end + end +end diff --git a/test/ruby/test_jit.rb b/test/ruby/test_jit.rb index 481e1754bf..7d12b7c130 100644 --- a/test/ruby/test_jit.rb +++ b/test/ruby/test_jit.rb @@ -1,48 +1,15 @@ # frozen_string_literal: true require 'test/unit' - -module TestJITSupport - JIT_TIMEOUT = 600 # 10min for each... - JIT_SUCCESS_PREFIX = 'JIT success \(\d+\.\dms\)' - SUPPORTED_COMPILERS = [ - 'gcc', - 'clang', - ] - - module_function - def eval_with_jit(script, verbose: 0, min_calls: 5, timeout: JIT_TIMEOUT) - EnvUtil.invoke_ruby( - ['--disable-gems', '--jit-wait', "--jit-verbose=#{verbose}", "--jit-min-calls=#{min_calls}", '-e', script], - '', true, true, timeout: timeout, - ) - end - - def supported? - # Experimental. If you want to ensure JIT is working with this test, please set this for now. - if ENV.key?('RUBY_FORCE_TEST_JIT') - return true - end - - # Very pessimistic check. With this check, we can't ensure JIT is working. - begin - _, err = TestJITSupport.eval_with_jit('proc {}.call', verbose: 1, min_calls: 1, timeout: 10) - rescue Timeout::Error - $stderr.puts "TestJIT: #jit_supported? check timed out" - false - else - err.match?(JIT_SUCCESS_PREFIX) - end - end -end +require_relative '../lib/jit_support' # Test for --jit option class TestJIT < Test::Unit::TestCase - include TestJITSupport + include JITSupport # Ensure all supported insns can be compiled. Only basic tests are included. # TODO: ensure --dump=insns includes the expected insn def setup - unless TestJITSupport.supported? + unless JITSupport.supported? skip 'JIT seems not supported on this platform' end end diff --git a/test/ruby/test_rubyoptions.rb b/test/ruby/test_rubyoptions.rb index 038d0c2db2..3a7c28afd3 100644 --- a/test/ruby/test_rubyoptions.rb +++ b/test/ruby/test_rubyoptions.rb @@ -3,6 +3,7 @@ require 'test/unit' require 'tmpdir' require 'tempfile' +require_relative '../lib/jit_support' class TestRubyOptions < Test::Unit::TestCase def write_file(filename, content) @@ -171,14 +172,16 @@ class TestRubyOptions < Test::Unit::TestCase end assert_equal([], e) end - assert_in_out_err(%w(--version --jit)) do |r, e| - assert_match(VERSION_PATTERN_WITH_JIT, r[0]) - if RubyVM::MJIT.enabled? - assert_equal(RUBY_DESCRIPTION, r[0]) - else - assert_equal(EnvUtil.invoke_ruby(['--jit', '-e', 'print RUBY_DESCRIPTION'], '', true).first, r[0]) + if JITSupport.supported? + assert_in_out_err(%w(--version --jit)) do |r, e| + assert_match(VERSION_PATTERN_WITH_JIT, r[0]) + if RubyVM::MJIT.enabled? + assert_equal(RUBY_DESCRIPTION, r[0]) + else + assert_equal(EnvUtil.invoke_ruby(['--jit', '-e', 'print RUBY_DESCRIPTION'], '', true).first, r[0]) + end + assert_equal([], e) end - assert_equal([], e) end end