summaryrefslogtreecommitdiff
path: root/test/ruby
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-05-18 15:54:39 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-05-18 15:54:39 +0000
commit161d6bfe2289596d064693c05402d6ba58932c06 (patch)
treef9a13e035d2b72e1ba5b05d5d2fb918c0662b383 /test/ruby
parent4e71ea3a1ae284b6ba2d0ef210666c491f24e1c9 (diff)
merge revision(s) r45553,r45554,r45557,r45558,r45561,r45566,r45567: [Backport #9718]
* array.c (rb_ary_modify): remember shared array owner if a shared array owner is promoted and a shared array is not promoted. Now, shared array is WB-unprotected so that shared arrays are not promoted. All objects referred from shared array should be marked correctly. [ruby-core:61919] [ruby-trunk - Bug #9718] * test/ruby/test_array.rb: add a test for above. * test/ruby/test_array.rb: remove useless `assert'. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@46006 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/ruby')
-rw-r--r--test/ruby/envutil.rb6
-rw-r--r--test/ruby/test_array.rb26
2 files changed, 30 insertions, 2 deletions
diff --git a/test/ruby/envutil.rb b/test/ruby/envutil.rb
index dc136918e9..618905a75a 100644
--- a/test/ruby/envutil.rb
+++ b/test/ruby/envutil.rb
@@ -30,7 +30,9 @@ module EnvUtil
LANG_ENVS = %w"LANG LC_ALL LC_CTYPE"
def invoke_ruby(args, stdin_data = "", capture_stdout = false, capture_stderr = false,
- encoding: nil, timeout: 10, reprieve: 1, **opt)
+ encoding: nil, timeout: 10, reprieve: 1,
+ stdout_filter: nil, stderr_filter: nil,
+ **opt)
in_c, in_p = IO.pipe
out_p, out_c = IO.pipe if capture_stdout
err_p, err_c = IO.pipe if capture_stderr && capture_stderr != :merge_to_stdout
@@ -84,6 +86,8 @@ module EnvUtil
err_p.close if capture_stderr && capture_stderr != :merge_to_stdout
Process.wait pid
status = $?
+ stdout = stdout_filter.call(stdout) if stdout_filter
+ stderr = stderr_filter.call(stderr) if stderr_filter
return stdout, stderr, status
end
ensure
diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb
index 6ff304acb2..3a76889e23 100644
--- a/test/ruby/test_array.rb
+++ b/test/ruby/test_array.rb
@@ -2389,7 +2389,7 @@ class TestArray < Test::Unit::TestCase
assert_equal([], a.rotate!(13))
assert_equal([], a.rotate!(-13))
a = [].freeze
- assert_raise_with_message(RuntimeError, /can't modify frozen/) {a.rotate!}
+ assert_raise_with_message(RuntimeError, /can\'t modify frozen/) {a.rotate!}
a = [1,2,3]
assert_raise(ArgumentError) { a.rotate!(1, 1) }
end
@@ -2428,4 +2428,28 @@ class TestArray < Test::Unit::TestCase
assert_include([4, 7], a.bsearch {|x| (2**100).coerce((1 - x / 4) * (2**100)).first })
end
+
+ def test_shared_marking
+ reduce = proc do |s|
+ s.gsub(/(verify_internal_consistency_reachable_i:\sWB\smiss\s\S+\s\(T_ARRAY\)\s->\s)\S+\s\((proc|T_NONE)\)\n
+ \K(?:\1\S+\s\(\2\)\n)*/x) do
+ "...(snip #{$&.count("\n")} lines)...\n"
+ end
+ end
+ begin
+ assert_normal_exit(<<-EOS, '[Bug #9718]', timeout: 5, stdout_filter: reduce)
+ queue = []
+ 50.times do
+ 10_000.times do
+ queue << lambda{}
+ end
+ GC.start(full_mark: false, immediate_sweep: true)
+ GC.verify_internal_consistency
+ queue.shift.call
+ end
+ EOS
+ rescue Timeout::Error => e
+ skip e.message
+ end
+ end
end