diff options
author | nagachika <nagachika@ruby-lang.org> | 2022-03-13 15:16:29 +0900 |
---|---|---|
committer | nagachika <nagachika@ruby-lang.org> | 2022-03-13 15:16:29 +0900 |
commit | 0bd3e436e27c048933133bc19f863c954ed3e3a6 (patch) | |
tree | 17536144433b3ab682b38a768ca937e37def0268 /test/ruby/test_exception.rb | |
parent | f4f0c793f6eb427b0a85445bff49fdc6b73447ae (diff) |
merge revision(s) c79d2e54748f52c5023b0a1ee441561df9826c17: [Backport #18562]
Fix TAG_THROW through require [Bug #18562]
Previously this was being incorrectly swapped with TAG_RAISE in the next
line. This would end up checking the T_IMEMO throw_data to the exception
handling (which calls Module#===). This happened to not break existing
tests because Module#=== returned false when klass is NULL.
This commit handles throw from require correctly by jumping to the tag
retaining the TAG_THROW state.
---
load.c | 2 +-
test/ruby/test_exception.rb | 21 +++++++++++++++++++++
2 files changed, 22 insertions(+), 1 deletion(-)
Diffstat (limited to 'test/ruby/test_exception.rb')
-rw-r--r-- | test/ruby/test_exception.rb | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb index 0f3e11b566..6ab72e7954 100644 --- a/test/ruby/test_exception.rb +++ b/test/ruby/test_exception.rb @@ -181,6 +181,27 @@ class TestException < Test::Unit::TestCase } end + def test_catch_throw_in_require_cant_be_rescued + bug18562 = '[ruby-core:107403]' + Tempfile.create(["dep", ".rb"]) {|t| + t.puts("throw :extdep, 42") + t.close + + rescue_all = Class.new(Exception) + def rescue_all.===(_) + raise "should not reach here" + end + + v = assert_throw(:extdep, bug18562) do + require t.path + rescue rescue_all => e + assert(false, "should not reach here") + end + + assert_equal(42, v, bug18562) + } + end + def test_throw_false bug12743 = '[ruby-core:77229] [Bug #12743]' Thread.start { |