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

ruby-changes:50189

From: k0kubun <ko1@a...>
Date: Thu, 8 Feb 2018 21:40:39 +0900 (JST)
Subject: [ruby-changes:50189] k0kubun:r62307 (trunk): test_jit.rb: try to test JIT again

k0kubun	2018-02-08 21:40:33 +0900 (Thu, 08 Feb 2018)

  New Revision: 62307

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=62307

  Log:
    test_jit.rb: try to test JIT again
    
    This commit reverts r62297, revising the check if JIT is supported or
    not.

  Added files:
    trunk/test/ruby/test_jit.rb
Index: test/ruby/test_jit.rb
===================================================================
--- test/ruby/test_jit.rb	(nonexistent)
+++ test/ruby/test_jit.rb	(revision 62307)
@@ -0,0 +1,68 @@ https://github.com/ruby/ruby/blob/trunk/test/ruby/test_jit.rb#L1
+# frozen_string_literal: true
+require 'test/unit'
+require 'shellwords'
+
+# Test for --jit option
+class TestJIT < Test::Unit::TestCase
+  JIT_TIMEOUT = 600 # 10min for each...
+  JIT_SUCCESS_PREFIX = 'JIT success \(\d+\.\dms\)'
+  SUPPORTED_COMPILERS = [
+    'gcc',
+    'clang',
+  ]
+
+  def test_jit
+    assert_eval_with_jit('print proc { 1 + 1 }.call', stdout: '2', success_count: 1)
+  end
+
+  def test_jit_output
+    skip unless jit_supported?
+
+    out, err = eval_with_jit('5.times { puts "MJIT" }', verbose: 1, min_calls: 5)
+    assert_equal("MJIT\n" * 5, out)
+    assert_match(/^#{JIT_SUCCESS_PREFIX}: block in <main>@-e:1 -> .+_ruby_mjit_p\d+u\d+\.c$/, err)
+    assert_match(/^Successful MJIT finish$/, err)
+  end
+
+  private
+
+  # Shorthand for normal test cases
+  def assert_eval_with_jit(script, stdout: nil, success_count:)
+    out, err = eval_with_jit(script, verbose: 1, min_calls: 1)
+    if jit_supported?
+      actual = err.scan(/^#{JIT_SUCCESS_PREFIX}:/).size
+      assert_equal(
+        success_count, actual,
+        "Expected #{success_count} times of JIT success, but succeeded #{actual} times.\n\n"\
+        "script:\n#{code_block(script)}\nstderr:\n#{code_block(err)}",
+      )
+    end
+    if stdout
+      assert_match(stdout, out, "Expected stderr #{out.inspect} to match #{stdout.inspect} with script:\n#{code_block(script)}")
+    end
+  end
+
+  # Run Ruby script with --jit-wait (Synchronous JIT compilation).
+  # Returns [stdout, stderr]
+  def eval_with_jit(script, verbose: 0, min_calls: 5)
+    stdout, stderr, status = EnvUtil.invoke_ruby(
+      ['--disable-gems', '--jit-wait', "--jit-verbose=#{verbose}", "--jit-min-calls=#{min_calls}", '-e', script],
+      '', true, true, timeout: JIT_TIMEOUT,
+    )
+    assert_equal(true, status.success?, "Failed to run script with JIT:\n#{code_block(script)}")
+    [stdout, stderr]
+  end
+
+  def code_block(code)
+    "```\n#{code}\n```\n\n"
+  end
+
+  # If this is false, tests which require JIT should be skipped.
+  # When this is not checked, probably the test expects Ruby to behave in the same way even if JIT is not supported.
+  def jit_supported?
+    return @jit_supported if defined?(@jit_supported)
+
+    out = IO.popen("#{RbConfig::CONFIG['CC']} --version", err: [:child, :out], &:read)
+    @jit_supported = $?.success? && SUPPORTED_COMPILERS.any? { |cc| out.match(/\b#{Regexp.escape(cc)}\b/) }
+  end
+end

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

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