aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNAKAMURA Usaku <usa@ruby-lang.org>2022-03-19 22:45:51 +0900
committerNAKAMURA Usaku <usa@ruby-lang.org>2022-03-19 22:45:51 +0900
commit19fec939a6fed650135c6ce8b567fcb7b001b068 (patch)
tree082c359f3aa5eec0ac6c148e6c0bade6d8327460
parent7eaec9a6b355a685a3a9503a005b91f4b3cb4f39 (diff)
downloadruby-19fec939a6fed650135c6ce8b567fcb7b001b068.tar.gz
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(-)
-rw-r--r--load.c2
-rw-r--r--test/ruby/test_exception.rb21
-rw-r--r--version.h2
3 files changed, 23 insertions, 2 deletions
diff --git a/load.c b/load.c
index 2441acfded..51c21ee4f2 100644
--- a/load.c
+++ b/load.c
@@ -1076,7 +1076,7 @@ require_internal(rb_execution_context_t *ec, VALUE fname, int exception)
if (ftptr) load_unlock(RSTRING_PTR(path), !state);
if (state) {
- if (state == TAG_FATAL) {
+ if (state == TAG_FATAL || state == TAG_THROW) {
EC_JUMP_TAG(ec, state);
}
else if (exception) {
diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb
index 69bf7ebf0e..9efcfc76cf 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 {
diff --git a/version.h b/version.h
index 6fbb66953c..944a877c76 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 6
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 216
+#define RUBY_PATCHLEVEL 217
#define RUBY_RELEASE_YEAR 2022
#define RUBY_RELEASE_MONTH 3