thread.c: set cause by Thread#raise

* thread.c (rb_threadptr_raise): set cause from the called thread,
  but not from the thread to be interrupted.
  [ruby-core:77222] [Bug #12741]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56125 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2016-09-09 08:59:48 +00:00
parent b5f3a113f5
commit 646c53895f
4 changed files with 66 additions and 0 deletions

View file

@ -698,6 +698,52 @@ end.join
assert_nil(e.cause.cause)
end
def test_cause_thread_no_cause
bug12741 = '[ruby-core:77222] [Bug #12741]'
x = Thread.current
a = false
y = Thread.start do
Thread.pass until a
x.raise "stop"
end
begin
raise bug12741
rescue
e = assert_raise_with_message(RuntimeError, "stop") do
a = true
sleep 1
end
end
assert_nil(e.cause)
end
def test_cause_thread_with_cause
bug12741 = '[ruby-core:77222] [Bug #12741]'
x = Thread.current
a = false
y = Thread.start do
Thread.pass until a
begin
raise "caller's cause"
rescue
x.raise "stop"
end
end
begin
raise bug12741
rescue
e = assert_raise_with_message(RuntimeError, "stop") do
a = true
sleep 1
end
end
assert_equal("caller's cause", e.cause.message)
end
def test_unknown_option
bug = '[ruby-core:63203] [Feature #8257] should pass unknown options'